blob: 7b2a77e87b7d31ca4ae5a40f9fc671049423525b [file] [log] [blame]
#include <limits.h>
#include <stddef.h>
#include <wchar.h>
#include <minitest/minitest.h>
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));
}
}