blob: 226ae64d9b483566e9095259b0fef2ed636b6f48 [file]
#include <chrono>
#include <random>
#include "CLucene/util/stringUtil.h"
#include "test.h"
std::string ranUtf8String(uint32_t i) {
if (!StringUtil::is_valid_codepoint(i)) {
return "";
}
std::string utf8_str;
if (i <= 0x7F) {
utf8_str.push_back(static_cast<char>(i));
} else if (i <= 0x7FF) {
utf8_str.push_back(static_cast<char>(0xC0 | (i >> 6)));
utf8_str.push_back(static_cast<char>(0x80 | (i & 0x3F)));
} else if (i <= 0xFFFF) {
utf8_str.push_back(static_cast<char>(0xE0 | (i >> 12)));
utf8_str.push_back(static_cast<char>(0x80 | ((i >> 6) & 0x3F)));
utf8_str.push_back(static_cast<char>(0x80 | (i & 0x3F)));
} else {
utf8_str.push_back(static_cast<char>(0xF0 | (i >> 18)));
utf8_str.push_back(static_cast<char>(0x80 | ((i >> 12) & 0x3F)));
utf8_str.push_back(static_cast<char>(0x80 | ((i >> 6) & 0x3F)));
utf8_str.push_back(static_cast<char>(0x80 | (i & 0x3F)));
}
return utf8_str;
}
static void testSingleUtf8(CuTest *tc) {
for (uint32_t i = 1; i <= 0x10FFFF; ++i) {
std::string s = ranUtf8String(i);
if (s.empty()) continue;
std::wstring ws = StringUtil::string_to_wstring(s);
CLUCENE_ASSERT(ws.size() == 1);
CLUCENE_ASSERT(ws.size() == wcslen(ws.c_str()));
}
}
// day
unsigned getSeed() {
auto now = std::chrono::system_clock::now();
auto now_time_t = std::chrono::system_clock::to_time_t(now);
std::tm now_tm = *std::localtime(&now_time_t);
now_tm.tm_hour = 0;
now_tm.tm_min = 0;
now_tm.tm_sec = 0;
auto today_time_t = std::mktime(&now_tm);
return static_cast<unsigned>(today_time_t);
}
static void testMultiUtf8(CuTest *tc) {
unsigned seed = getSeed();
std::mt19937 generator(seed);
for (int32_t i = 0; i < 10000; i++) {
std::string s;
int32_t k = 0;
for (int32_t j = 0; j < 3; j++) {
std::uniform_int_distribution<uint32_t> dis(1, 1114111);
uint32_t random_code_point = dis(generator);
std::string temp = ranUtf8String(random_code_point);
if (temp.empty()) continue;
s += temp;
k++;
}
std::wstring ws = StringUtil::string_to_wstring(s);
CLUCENE_ASSERT(ws.size() == k);
CLUCENE_ASSERT(ws.size() == wcslen(ws.c_str()));
}
}
string generateBlobString(int length) {
vector<char> data(length);
uint32_t seed = getSeed();
std::mt19937 generator(seed);
for (int i = 0; i < length; i++) {
std::uniform_int_distribution<uint32_t> dis(0, 256);
uint32_t code = dis(generator);
data[i] = (char)code;
}
return string(data.begin(), data.end());
}
static void testAll(CuTest *tc) {
for (int32_t i = 0; i < 10000; i++) {
string s = generateBlobString(100);
std::wstring ws = StringUtil::string_to_wstring(s);
}
}
CuSuite *testStrConvert(void) {
CuSuite *suite = CuSuiteNew(_T("CLucene str convert Test"));
SUITE_ADD_TEST(suite, testSingleUtf8);
SUITE_ADD_TEST(suite, testMultiUtf8);
SUITE_ADD_TEST(suite, testAll);
return suite;
}