1 #include <limits.h> 2 #include <stddef.h> 3 #include <wchar.h> 4 5 #include <minitest/minitest.h> 6 7 namespace { 8 9 const char* to_cstr(const wchar_t* wcs) { 10 static char buffer[256]; 11 size_t n; 12 for (n = 0; n + 1U < sizeof(buffer); ++n) { 13 wchar_t ch = wcs[n]; 14 if (!ch) 15 break; 16 buffer[n] = (ch < 128) ? ch : '@'; 17 } 18 buffer[n] = '\0'; 19 return buffer; 20 } 21 22 #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) 23 24 } 25 26 TEST(wchar, wchar_limits) { 27 ASSERT_EQ(sizeof(__WCHAR_TYPE__), sizeof(wchar_t)); 28 ASSERT_EQ(sizeof(int), sizeof(wint_t)); 29 #ifdef __arm__ 30 ASSERT_GT(wchar_t(0), wchar_t(-1)); 31 ASSERT_EQ(wchar_t(0), WCHAR_MIN); 32 ASSERT_EQ(wchar_t(0xffffffff), WCHAR_MAX); 33 #else 34 ASSERT_LT(wchar_t(0), wchar_t(-1)); 35 ASSERT_EQ(wchar_t(0x80000000), WCHAR_MIN); 36 ASSERT_EQ(wchar_t(0x7fffffff), WCHAR_MAX); 37 #endif 38 } 39 40 TEST(wchar, wcschr) { 41 static const wchar_t kString[] = L"abcda"; 42 EXPECT_EQ(kString + 0, wcschr(kString, L'a')); 43 EXPECT_EQ(kString + 1, wcschr(kString, L'b')); 44 EXPECT_EQ(kString + 2, wcschr(kString, L'c')); 45 EXPECT_EQ(kString + 3, wcschr(kString, L'd')); 46 EXPECT_FALSE(wcschr(kString, L'e')); 47 EXPECT_EQ(kString + 5, wcschr(kString, L'\0')); 48 } 49 50 TEST(wchar, wcsrchr) { 51 static const wchar_t kString[] = L"abcda"; 52 EXPECT_EQ(kString + 4, wcsrchr(kString, L'a')); 53 EXPECT_EQ(kString + 1, wcsrchr(kString, L'b')); 54 EXPECT_EQ(kString + 2, wcsrchr(kString, L'c')); 55 EXPECT_EQ(kString + 3, wcsrchr(kString, L'd')); 56 EXPECT_FALSE(wcsrchr(kString, L'e')); 57 EXPECT_EQ(kString + 5, wcsrchr(kString, L'\0')); 58 } 59 60 TEST(wchar, wcstof) { 61 static const struct { 62 const wchar_t* input; 63 float expected; 64 int expected_len; 65 } kData[] = { 66 { L"123", 123., 3 }, 67 { L"123#", 123., 3 }, 68 { L" 123 45", 123., 6 }, 69 { L"0.2", 0.2, 3 }, 70 { L"-0.2", -0.2, 4 }, 71 { L"-3.1415926535", -3.1415926535, 13 }, 72 { L"+1e+100", 1e100, 7 }, 73 { L"0x10000.80", 65536.50, 10 }, 74 }; 75 for (size_t n = 0; n < ARRAY_SIZE(kData); ++n) { 76 const char* text = to_cstr(kData[n].input); 77 wchar_t* end; 78 TEST_TEXT << text; 79 EXPECT_EQ(kData[n].expected, wcstof(kData[n].input, &end)); 80 TEST_TEXT << text; 81 EXPECT_EQ(kData[n].expected_len, (int)(end - kData[n].input)); 82 } 83 } 84 85 TEST(wchar, wcstod) { 86 static const struct { 87 const wchar_t* input; 88 double expected; 89 int expected_len; 90 } kData[] = { 91 { L"123", 123., 3 }, 92 { L"123#", 123., 3 }, 93 { L" 123 45", 123., 6 }, 94 { L"0.2", 0.2, 3 }, 95 { L"-0.2", -0.2, 4 }, 96 { L"-3.1415926535", -3.1415926535, 13 }, 97 { L"+1e+100", 1e100, 7 }, 98 { L"0x10000.80", 65536.50, 10 }, 99 { L"1.e60", 1e60, 5 }, 100 }; 101 for (size_t n = 0; n < ARRAY_SIZE(kData); ++n) { 102 const char* text = to_cstr(kData[n].input); 103 wchar_t* end; 104 TEST_TEXT << text; 105 EXPECT_EQ(kData[n].expected, wcstod(kData[n].input, &end)); 106 TEST_TEXT << text; 107 EXPECT_EQ(kData[n].expected_len, (int)(end - kData[n].input)); 108 } 109 } 110 111 TEST(wchar, wcstold) { 112 static const struct { 113 const wchar_t* input; 114 long double expected; 115 int expected_len; 116 } kData[] = { 117 { L"123", 123., 3 }, 118 { L"123#", 123., 3 }, 119 { L" 123 45", 123., 6 }, 120 { L"0.2", 0.2L, 3 }, 121 { L"-0.2", -0.2L, 4 }, 122 { L"-3.1415926535", -3.1415926535L, 13 }, 123 { L"+1e+100", 1e100L, 7 }, 124 { L"0x10000.80", 65536.50L, 10 }, 125 { L"+1.e+100", 1e100L, 8 }, 126 }; 127 for (size_t n = 0; n < ARRAY_SIZE(kData); ++n) { 128 const char* text = to_cstr(kData[n].input); 129 wchar_t* end; 130 TEST_TEXT << text; 131 EXPECT_EQ(kData[n].expected, wcstold(kData[n].input, &end)); 132 TEST_TEXT << text; 133 EXPECT_EQ(kData[n].expected_len, (int)(end - kData[n].input)); 134 } 135 } 136 137 TEST(wchar, wcstol) { 138 static const struct { 139 const wchar_t* input; 140 int base; 141 long expected; 142 int expected_len; 143 } kData[] = { 144 { L"123", 10, 123, 3 }, 145 { L"123#", 10, 123, 3 }, 146 { L"01000", 0, 512, 5 }, 147 { L" 123 45", 0, 123, 6 }, 148 { L" -123", 0, -123, 6 }, 149 { L"0x10000", 0, 65536, 7 }, 150 { L"12222222222222222222222222222222222", 10, LONG_MAX, 35 }, 151 { L"-12222222222222222222222222222222222", 10, LONG_MIN, 36 }, 152 }; 153 for (size_t n = 0; n < ARRAY_SIZE(kData); ++n) { 154 const char* text = to_cstr(kData[n].input); 155 wchar_t* end; 156 TEST_TEXT << text; 157 EXPECT_EQ(kData[n].expected, wcstol(kData[n].input, &end, kData[n].base)); 158 TEST_TEXT << text; 159 EXPECT_EQ(kData[n].expected_len, (int)(end - kData[n].input)); 160 } 161 } 162 163 TEST(wchar, wcstoul) { 164 static const struct { 165 const wchar_t* input; 166 int base; 167 unsigned long expected; 168 int expected_len; 169 } kData[] = { 170 { L"123", 10, 123, 3 }, 171 { L"123#", 10, 123, 3 }, 172 { L"01000", 0, 512, 5 }, 173 { L" 123 45", 0, 123, 6 }, 174 { L" -123", 0, ULONG_MAX - 123 + 1, 6 }, 175 { L"0x10000", 0, 65536, 7 }, 176 { L"12222222222222222222222222222222222", 10, ULONG_MAX, 35 }, 177 { L"-1", 10, ULONG_MAX, 2 }, 178 }; 179 for (size_t n = 0; n < ARRAY_SIZE(kData); ++n) { 180 const char* text = to_cstr(kData[n].input); 181 wchar_t* end; 182 TEST_TEXT << text; 183 EXPECT_EQ(kData[n].expected, wcstoul(kData[n].input, &end, kData[n].base)); 184 TEST_TEXT << text; 185 EXPECT_EQ(kData[n].expected_len, (int)(end - kData[n].input)); 186 } 187 } 188 189 TEST(wchar, wcstoll) { 190 static const struct { 191 const wchar_t* input; 192 int base; 193 long long expected; 194 int expected_len; 195 } kData[] = { 196 { L"123", 10, 123, 3 }, 197 { L"123#", 10, 123, 3 }, 198 { L"01000", 0, 512, 5 }, 199 { L" 123 45", 0, 123, 6 }, 200 { L" -123", 0, -123, 6 }, 201 { L"0x10000", 0, 65536, 7 }, 202 { L"12222222222222222222222222222222222", 10, LLONG_MAX, 35 }, 203 { L"-12222222222222222222222222222222222", 10, LLONG_MIN, 36 }, 204 }; 205 for (size_t n = 0; n < ARRAY_SIZE(kData); ++n) { 206 const char* text = to_cstr(kData[n].input); 207 wchar_t* end; 208 TEST_TEXT << text; 209 EXPECT_EQ(kData[n].expected, wcstoll(kData[n].input, &end, kData[n].base)); 210 TEST_TEXT << text; 211 EXPECT_EQ(kData[n].expected_len, (int)(end - kData[n].input)); 212 } 213 } 214 215 TEST(wchar, wcstoull) { 216 static const struct { 217 const wchar_t* input; 218 int base; 219 unsigned long long expected; 220 int expected_len; 221 } kData[] = { 222 { L"123", 10, 123, 3 }, 223 { L"123#", 10, 123, 3 }, 224 { L"01000", 0, 512, 5 }, 225 { L" 123 45", 0, 123, 6 }, 226 { L" -123", 0, ULLONG_MAX - 123 + 1, 6 }, 227 { L"0x10000", 0, 65536, 7 }, 228 { L"12222222222222222222222222222222222", 10, ULLONG_MAX, 35 }, 229 { L"-1", 10, ULLONG_MAX, 2 }, 230 }; 231 for (size_t n = 0; n < ARRAY_SIZE(kData); ++n) { 232 const char* text = to_cstr(kData[n].input); 233 wchar_t* end; 234 TEST_TEXT << text; 235 EXPECT_EQ(kData[n].expected, wcstoull(kData[n].input, &end, kData[n].base)); 236 TEST_TEXT << text; 237 EXPECT_EQ(kData[n].expected_len, (int)(end - kData[n].input)); 238 } 239 } 240