2024-02-25 00:07:54 +00:00
|
|
|
|
/*
|
|
|
|
|
|
* Copyright (c) 2022 Ember
|
|
|
|
|
|
*
|
|
|
|
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
2024-12-30 23:45:04 +00:00
|
|
|
|
#include <shared/utility/UTF8.h>
|
|
|
|
|
|
#include <shared/utility/Utility.h>
|
2024-02-25 00:07:54 +00:00
|
|
|
|
#include <gtest/gtest.h>
|
|
|
|
|
|
#include <string>
|
|
|
|
|
|
|
|
|
|
|
|
using namespace ember;
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
* Most UTF8 test cases are adapted from:
|
|
|
|
|
|
* https://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
|
|
|
|
|
|
*
|
|
|
|
|
|
* Almost all of these are basic tests for whichever UTF8
|
|
|
|
|
|
* library is being used by the utilities rather than Ember's
|
|
|
|
|
|
* own code
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
TEST(TextUtilities, StringLength_ASCII) {
|
|
|
|
|
|
std::string str = "Pretty boring test text";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto len = utility::utf8::length(str);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(len, 23);
|
|
|
|
|
|
|
|
|
|
|
|
str = "";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
len = utility::utf8::length(str);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(len, 0);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST(TextUtilities, StringLength_UTF8) {
|
|
|
|
|
|
std::string str = "日本語テキスト";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto len = utility::utf8::length(str);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(len, 7);
|
|
|
|
|
|
|
|
|
|
|
|
str = "ŏϭեۛåȆɷςƐҕђǹǹǍ";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
len = utility::utf8::length(str);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(len, 14);
|
|
|
|
|
|
|
|
|
|
|
|
str = "翻译不好的文本";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
len = utility::utf8::length(str);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(len, 7);
|
|
|
|
|
|
|
|
|
|
|
|
str = "";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
len = utility::utf8::length(str);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(len, 0);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST(TextUtilities, DISABLED_NameFormat_ASCII) {
|
|
|
|
|
|
// Lower
|
|
|
|
|
|
std::string str = "bankalt";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto formatted = utility::utf8::name_format(str, std::locale());
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ("Bankalt", formatted);
|
|
|
|
|
|
|
|
|
|
|
|
// Upper
|
|
|
|
|
|
str = "CHAOSVEX";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
formatted = utility::utf8::name_format(str, std::locale());
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ("Chaosvex", formatted);
|
|
|
|
|
|
|
|
|
|
|
|
// Mixed
|
|
|
|
|
|
str = "cHaoSvEx";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
formatted = utility::utf8::name_format(str, std::locale());
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ("Chaosvex", formatted);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST(TextUtilities, IsValid_UTF8_MixedSequences) {
|
|
|
|
|
|
std::string text = "CHAOSVEX";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
bool res = utility::utf8::is_valid(text);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, true);
|
|
|
|
|
|
|
|
|
|
|
|
text = "日本語テキスト";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
res = utility::utf8::is_valid(text);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, true);
|
|
|
|
|
|
|
|
|
|
|
|
const char* bad_text = "\xf0\x28\x8c\x28";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
res = utility::utf8::is_valid(bad_text, 4);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST(TextUtilities, IsValid_UTF8_OverlongSequences) {
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xc0\xaf";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 2);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xe0\x80\xaf";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 3);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xf0\x80\x80\xaf";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 4);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xf8\x80\x80\x80\xaf";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 5);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xfc\x80\x80\x80\x80\xaf";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 6);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST(TextUtilities, IsValid_UTF8_UnexpectedContinuation) {
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\x80";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 1);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xbf";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 1);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST(TextUtilities, IsValid_UTF8_OverlongNul) {
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xc0\x80";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 2);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xe0\x80\x80";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 3);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xf0\x80\x80\x80";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 4);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xf8\x80\x80\x80\x80";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 5);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xfc\x80\x80\x80\x80\x80";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 6);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST(TextUtilities, IsValid_UTF8_SingleUTF16Surrogates) {
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xed\xa0\x80";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 3);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xed\xad\xbf";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 3);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xed\xae\x80";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 3);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xed\xaf\xbf";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 3);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xed\xb0\x80";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 3);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xed\xbe\x80";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 3);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xed\xbf\xbf";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 3);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST(TextUtilities, IsValid_UTF8_PairedUTF16Surrogates) {
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xed\xa0\x80\xed\xb0\x80";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 6);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xed\xa0\x80\xed\xbf\xbf";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 6);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xed\xad\xbf\xed\xb0\x80";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 6);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xed\xad\xbf\xed\xbf\xbf";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 6);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xed\xae\x80\xed\xb0\x80";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 6);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xed\xae\x80\xed\xbf\xbf";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 6);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xed\xaf\xbf\xed\xb0\x80";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 6);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xed\xaf\xbf\xed\xbf\xbf";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 6);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST(TextUtilities, IsValid_UTF8_MaxOverlongSequences) {
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xc1\xbf";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 2);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xe0\x9f\xbf";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 3);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xf0\x8f\xbf\xbf";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 4);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xf8\x87\xbf\xbf\xbf";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 5);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xfc\x83\xbf\xbf\xbf\xbf";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 6);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST(TextUtilities, IsValid_UTF8_ImpossibleBytes) {
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xfe\xfe\xff\xff";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 4);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xfe";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 1);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xff";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 1);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "\xff\xfe";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 2);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 5);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST(TextUtilities, IsValid_UTF8_Noncharacters) {
|
|
|
|
|
|
{
|
|
|
|
|
|
const char* bad_text = "";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::is_valid(bad_text, 32);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST(TextUtilities, ConsecutiveCheck_ASCII_Case_Insensitive) {
|
|
|
|
|
|
std::string text = "";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::max_consecutive(text);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, 0);
|
|
|
|
|
|
|
|
|
|
|
|
text = "f";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
res = utility::max_consecutive(text);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, 1);
|
|
|
|
|
|
|
|
|
|
|
|
text = "ff";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
res = utility::max_consecutive(text);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, 2);
|
|
|
|
|
|
|
|
|
|
|
|
text = "fff";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
res = utility::max_consecutive(text);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, 3);
|
|
|
|
|
|
|
|
|
|
|
|
text = "foo";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
res = utility::max_consecutive(text);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, 2);
|
|
|
|
|
|
|
|
|
|
|
|
text = "foofooof";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
res = utility::max_consecutive(text);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, 3);
|
|
|
|
|
|
|
|
|
|
|
|
text = "FOOBAAAR";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
res = utility::max_consecutive(text);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, 3);
|
|
|
|
|
|
|
|
|
|
|
|
text = "FOOBAaAR";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
res = utility::max_consecutive(text);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, 2);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST(TextUtilities, ConsecutiveCheck_ASCII_CaseSensitive) {
|
|
|
|
|
|
std::string text = "";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::max_consecutive(text, true);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, 0);
|
|
|
|
|
|
|
|
|
|
|
|
text = "Fff";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
res = utility::max_consecutive(text, true);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, 3);
|
|
|
|
|
|
|
|
|
|
|
|
text = "FffOooo";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
res = utility::max_consecutive(text, true);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, 4);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST(TextUtilities, DISABLED_ConsecutiveCheck_UTF8_CaseInsensitive) {
|
|
|
|
|
|
std::string text = "";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::max_consecutive(text, true);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, 0);
|
|
|
|
|
|
|
|
|
|
|
|
text = "Fff";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
res = utility::utf8::max_consecutive(text, true);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, 3);
|
|
|
|
|
|
|
|
|
|
|
|
text = "FffOooo";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
res = utility::utf8::max_consecutive(text, true);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, 4);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TEST(TextUtilities, ConsecutiveCheck_UTF8_CaseSensitive) {
|
|
|
|
|
|
std::string text = "";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
auto res = utility::utf8::max_consecutive(text);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, 0);
|
|
|
|
|
|
|
|
|
|
|
|
text = "テキスト";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
res = utility::utf8::max_consecutive(text);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, 1);
|
|
|
|
|
|
|
|
|
|
|
|
text = "テテキスト";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
res = utility::utf8::max_consecutive(text);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, 2);
|
|
|
|
|
|
|
|
|
|
|
|
text = "テテキススス";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
res = utility::utf8::max_consecutive(text);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, 3);
|
|
|
|
|
|
|
|
|
|
|
|
text = "テテキスススト";
|
2026-02-18 21:38:07 +00:00
|
|
|
|
res = utility::utf8::max_consecutive(text);
|
2024-02-25 00:07:54 +00:00
|
|
|
|
EXPECT_EQ(res, 3);
|
2022-04-18 22:03:18 +01:00
|
|
|
|
}
|