#include #include #include #include namespace { const char* to_cstr(const wchar_t* wcs) { static char buffer[256]; size_t n; for (n = 0; n + 1U < sizeof(buffer); ++n) { wchar_t ch = wcs[n]; if (!ch) break; buffer[n] = (ch < 128) ? ch : '@'; } buffer[n] = '\0'; return buffer; } #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) } TEST(wchar, wchar_limits) { ASSERT_EQ(sizeof(__WCHAR_TYPE__), sizeof(wchar_t)); ASSERT_EQ(sizeof(int), sizeof(wint_t)); #ifdef __arm__ ASSERT_GT(wchar_t(0), wchar_t(-1)); ASSERT_EQ(wchar_t(0), WCHAR_MIN); ASSERT_EQ(wchar_t(0xffffffff), WCHAR_MAX); #else ASSERT_LT(wchar_t(0), wchar_t(-1)); ASSERT_EQ(wchar_t(0x80000000), WCHAR_MIN); ASSERT_EQ(wchar_t(0x7fffffff), WCHAR_MAX); #endif } TEST(wchar, wcschr) { static const wchar_t kString[] = L"abcda"; EXPECT_EQ(kString + 0, wcschr(kString, L'a')); EXPECT_EQ(kString + 1, wcschr(kString, L'b')); EXPECT_EQ(kString + 2, wcschr(kString, L'c')); EXPECT_EQ(kString + 3, wcschr(kString, L'd')); EXPECT_FALSE(wcschr(kString, L'e')); EXPECT_EQ(kString + 5, wcschr(kString, L'\0')); } TEST(wchar, wcsrchr) { static const wchar_t kString[] = L"abcda"; EXPECT_EQ(kString + 4, wcsrchr(kString, L'a')); EXPECT_EQ(kString + 1, wcsrchr(kString, L'b')); EXPECT_EQ(kString + 2, wcsrchr(kString, L'c')); EXPECT_EQ(kString + 3, wcsrchr(kString, L'd')); EXPECT_FALSE(wcsrchr(kString, L'e')); EXPECT_EQ(kString + 5, wcsrchr(kString, L'\0')); } TEST(wchar, wcstof) { static const struct { const wchar_t* input; float expected; int expected_len; } kData[] = { { L"123", 123., 3 }, { L"123#", 123., 3 }, { L" 123 45", 123., 6 }, { L"0.2", 0.2, 3 }, { L"-0.2", -0.2, 4 }, { L"-3.1415926535", -3.1415926535, 13 }, { L"+1e+100", 1e100, 7 }, { L"0x10000.80", 65536.50, 10 }, }; for (size_t n = 0; n < ARRAY_SIZE(kData); ++n) { const char* text = to_cstr(kData[n].input); wchar_t* end; TEST_TEXT << text; EXPECT_EQ(kData[n].expected, wcstof(kData[n].input, &end)); TEST_TEXT << text; EXPECT_EQ(kData[n].expected_len, (int)(end - kData[n].input)); } } TEST(wchar, wcstod) { static const struct { const wchar_t* input; double expected; int expected_len; } kData[] = { { L"123", 123., 3 }, { L"123#", 123., 3 }, { L" 123 45", 123., 6 }, { L"0.2", 0.2, 3 }, { L"-0.2", -0.2, 4 }, { L"-3.1415926535", -3.1415926535, 13 }, { L"+1e+100", 1e100, 7 }, { L"0x10000.80", 65536.50, 10 }, { L"1.e60", 1e60, 5 }, }; for (size_t n = 0; n < ARRAY_SIZE(kData); ++n) { const char* text = to_cstr(kData[n].input); wchar_t* end; TEST_TEXT << text; EXPECT_EQ(kData[n].expected, wcstod(kData[n].input, &end)); TEST_TEXT << text; EXPECT_EQ(kData[n].expected_len, (int)(end - kData[n].input)); } } TEST(wchar, wcstold) { static const struct { const wchar_t* input; long double expected; int expected_len; } kData[] = { { L"123", 123., 3 }, { L"123#", 123., 3 }, { L" 123 45", 123., 6 }, { L"0.2", 0.2L, 3 }, { L"-0.2", -0.2L, 4 }, { L"-3.1415926535", -3.1415926535L, 13 }, { L"+1e+100", 1e100L, 7 }, { L"0x10000.80", 65536.50L, 10 }, { L"+1.e+100", 1e100L, 8 }, }; for (size_t n = 0; n < ARRAY_SIZE(kData); ++n) { const char* text = to_cstr(kData[n].input); wchar_t* end; TEST_TEXT << text; EXPECT_EQ(kData[n].expected, wcstold(kData[n].input, &end)); TEST_TEXT << text; EXPECT_EQ(kData[n].expected_len, (int)(end - kData[n].input)); } } TEST(wchar, wcstol) { static const struct { const wchar_t* input; int base; long expected; int expected_len; } kData[] = { { L"123", 10, 123, 3 }, { L"123#", 10, 123, 3 }, { L"01000", 0, 512, 5 }, { L" 123 45", 0, 123, 6 }, { L" -123", 0, -123, 6 }, { L"0x10000", 0, 65536, 7 }, { L"12222222222222222222222222222222222", 10, LONG_MAX, 35 }, { L"-12222222222222222222222222222222222", 10, LONG_MIN, 36 }, }; for (size_t n = 0; n < ARRAY_SIZE(kData); ++n) { const char* text = to_cstr(kData[n].input); wchar_t* end; TEST_TEXT << text; EXPECT_EQ(kData[n].expected, wcstol(kData[n].input, &end, kData[n].base)); TEST_TEXT << text; EXPECT_EQ(kData[n].expected_len, (int)(end - kData[n].input)); } } TEST(wchar, wcstoul) { static const struct { const wchar_t* input; int base; unsigned long expected; int expected_len; } kData[] = { { L"123", 10, 123, 3 }, { L"123#", 10, 123, 3 }, { L"01000", 0, 512, 5 }, { L" 123 45", 0, 123, 6 }, { L" -123", 0, ULONG_MAX - 123 + 1, 6 }, { L"0x10000", 0, 65536, 7 }, { L"12222222222222222222222222222222222", 10, ULONG_MAX, 35 }, { L"-1", 10, ULONG_MAX, 2 }, }; for (size_t n = 0; n < ARRAY_SIZE(kData); ++n) { const char* text = to_cstr(kData[n].input); wchar_t* end; TEST_TEXT << text; EXPECT_EQ(kData[n].expected, wcstoul(kData[n].input, &end, kData[n].base)); TEST_TEXT << text; EXPECT_EQ(kData[n].expected_len, (int)(end - kData[n].input)); } } TEST(wchar, wcstoll) { static const struct { const wchar_t* input; int base; long long expected; int expected_len; } kData[] = { { L"123", 10, 123, 3 }, { L"123#", 10, 123, 3 }, { L"01000", 0, 512, 5 }, { L" 123 45", 0, 123, 6 }, { L" -123", 0, -123, 6 }, { L"0x10000", 0, 65536, 7 }, { L"12222222222222222222222222222222222", 10, LLONG_MAX, 35 }, { L"-12222222222222222222222222222222222", 10, LLONG_MIN, 36 }, }; for (size_t n = 0; n < ARRAY_SIZE(kData); ++n) { const char* text = to_cstr(kData[n].input); wchar_t* end; TEST_TEXT << text; EXPECT_EQ(kData[n].expected, wcstoll(kData[n].input, &end, kData[n].base)); TEST_TEXT << text; EXPECT_EQ(kData[n].expected_len, (int)(end - kData[n].input)); } } TEST(wchar, wcstoull) { static const struct { const wchar_t* input; int base; unsigned long long expected; int expected_len; } kData[] = { { L"123", 10, 123, 3 }, { L"123#", 10, 123, 3 }, { L"01000", 0, 512, 5 }, { L" 123 45", 0, 123, 6 }, { L" -123", 0, ULLONG_MAX - 123 + 1, 6 }, { L"0x10000", 0, 65536, 7 }, { L"12222222222222222222222222222222222", 10, ULLONG_MAX, 35 }, { L"-1", 10, ULLONG_MAX, 2 }, }; for (size_t n = 0; n < ARRAY_SIZE(kData); ++n) { const char* text = to_cstr(kData[n].input); wchar_t* end; TEST_TEXT << text; EXPECT_EQ(kData[n].expected, wcstoull(kData[n].input, &end, kData[n].base)); TEST_TEXT << text; EXPECT_EQ(kData[n].expected_len, (int)(end - kData[n].input)); } }