icinga2/third-party/utf8cpp/tests/test_checked_api.h

199 lines
5.7 KiB
C
Raw Normal View History

Squashed 'third-party/utf8cpp/' changes from 82344d605..79835a5fa 79835a5fa Remove -Wsign-conversion from test builds. 53398ca70 Restructure tests. e3e57c811 Fix for issue #92: Clang 10 Compiler warnings d736c29d3 Fix -Wconversion warnings in tests when -funsigned-char option is used. 780bd57d6 Merge pull request #96 from Finkman/provide-ns-on-installed 73b347f31 Adds the following advantages: - utf8::cpp is available, even when installed - cmake is aware of the library version - compatible with previous usage: target utf8cpp available when installed 3ca904b21 Version 3.2.2 aa3b12c52 Added a couple of statis_casts to eliminate signed conversion warnings. ee90a4a52 Added compiler options to enable warnings. d8b92208f Merge pull request #87 from cschreib/patch-1 a92f85526 Add missing export() command b85efd66a Test string literals 4e1149766 Merge pull request #80 from RT222/master ec6747005 Fix the inclusion of both cpp11 and cpp17 headers on C++17 compilation ddd38b304 Version 3.2 2af93bd67 Documentation: C++ 17 support. b6cd18f92 test_utf32to8 tests string_view, not string 0991356b7 find_invalid(string_view) returns string_view::npos, not string::npos 4bed367c1 Update test docker image a7d530de5 C++ 17 support: add tests, remove duplicate utf8::append() 50361edbf Merge pull request #77 from RT222/master fe79d14ae Switching from gtest to ftest for unit-testing. 7d17aed95 Merge pull request #79 from fu7mu4/it-is-code 957e30052 Does it have syntax hilight d40e4948f Support for C++17 e39907b38 Version 3.1.2 3c85cd48f Add prefix to NOEXCEPT and OVERRIDE macros. 944ef0561 Merge pull request #55 from Flamefire/disable_tests_for_subproject dc2442c2e Merge pull request #61 from xenia-project/master 2b1521b48 Fix deprecated std::iterator usage (STL4015). bee3b1349 Enable tests, docu, install only when building as root project c3f9261eb Merge pull request #51 from AkiraMiyakoda/msvc_warning 7fb121130 Fix an MSVC warning about narrowing conversion. 170e2d11f Merge pull request #44 from tvanriper/patch-1 32ccbfb74 Removed utf8 path from #include. 2370b95a8 Compile negative test with C++ 98 89cfc3e38 Replace throw() with noexcept when using C++11 or later 687a59d88 Add override keyword when compiled with C++11 or later f26d39e8a Move C++ version detection to core.h b1002fd19 Introduce UTF_CPP_CPLUSPLUS macro. 088dd3ad7 Merge pull request #40 from xantares/patch-1 afc32b4c0 Always use GNU install layout except MSVC 82c674b7a Version 3.1 33516ff07 Test -fno-exceptions with unchecked api f16bdde67 Merge pull request #37 from nemtrif/unchecked_replace_invalid c52319302 unchecked::replace_invalid() a3fa4ee84 Merge pull request #36 from nemtrif/gtesturl 8fd51836a Submodule url for googletest is https ad27c7d5e Merge pull request #33 from nemtrif/optionalinstall 293f85d97 Installation is optional a540297fd Version 3.0.3 04d29d92a Add inline declarations to non-template functions in cpp11.h 741259277 Merge pull request #30 from nemtrif/ci 335a3ee6a Update docker to 3.0.1 d5e847d0a Update project version e6da1a36a Set up CircleCI 0b45681b6 Add Dockerfile 66804081d Introduce GTest a0a2d9d1e Fix for the cpp11.h header guard 7db72814a Merge pull request #24 from nemtrif/release_3_0 007f8e32c advance() can work in backward direction. 92158c9ce Minor whitespace fixes 236d61942 Update documentation for replace_invalid d8b09b301 Merge pull request #21 from glebm/fix-remove-invalid 3793703e7 Remove unused test data 080f1e6a3 Remove utf8reader sample 00d73e4a0 Remove deprecated functions 2b8596149 Support for C++11 f637e70c1 Merge pull request #22 from AkiraMiyakoda/fix-msvc2019-warning cfc351c86 Fix MSVC 2017-2019 warning about negative unsigned value. 026aed63d replace_invalid: Replace final incomplete sequence git-subtree-dir: third-party/utf8cpp git-subtree-split: 79835a5fa57271f07a90ed36123e30ae9741178e
2023-02-15 11:25:31 +01:00
#ifndef UTF8_FOR_CPP_TEST_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731
#define UTF8_FOR_CPP_TEST_CHECKED_H_2675DCD0_9480_4c0c_B92A_CC14C027B731
#include "utf8.h"
#include <string>
#include <vector>
using namespace utf8;
using namespace std;
TEST(CheckedAPITests, test_append)
{
unsigned char u[5] = {0,0,0,0,0};
append(0x0448, u);
EXPECT_EQ (u[0], 0xd1);
EXPECT_EQ (u[1], 0x88);
EXPECT_EQ (u[2], 0);
EXPECT_EQ (u[3], 0);
EXPECT_EQ (u[4], 0);
append(0x65e5, u);
EXPECT_EQ (u[0], 0xe6);
EXPECT_EQ (u[1], 0x97);
EXPECT_EQ (u[2], 0xa5);
EXPECT_EQ (u[3], 0);
EXPECT_EQ (u[4], 0);
append(0x3044, u);
EXPECT_EQ (u[0], 0xe3);
EXPECT_EQ (u[1], 0x81);
EXPECT_EQ (u[2], 0x84);
EXPECT_EQ (u[3], 0);
EXPECT_EQ (u[4], 0);
append(0x10346, u);
EXPECT_EQ (u[0], 0xf0);
EXPECT_EQ (u[1], 0x90);
EXPECT_EQ (u[2], 0x8d);
EXPECT_EQ (u[3], 0x86);
EXPECT_EQ (u[4], 0);
// Ensure no warnings with plain char
char c[2] = {0,0};
append('a', c);
EXPECT_EQ (c[0], 'a');
EXPECT_EQ (c[1], 0);
}
TEST(CheckedAPITests, test_next)
{
const char* twochars = "\xe6\x97\xa5\xd1\x88";
const char* w = twochars;
unsigned int cp = next(w, twochars + 6);
EXPECT_EQ (cp, 0x65e5);
EXPECT_EQ (w, twochars + 3);
const char* threechars = "\xf0\x90\x8d\x86\xe6\x97\xa5\xd1\x88";
w = threechars;
cp = next(w, threechars + 9);
EXPECT_EQ (cp, 0x10346);
EXPECT_EQ (w, threechars + 4);
cp = next(w, threechars + 9);
EXPECT_EQ (cp, 0x65e5);
EXPECT_EQ (w, threechars + 7);
cp = next(w, threechars + 9);
EXPECT_EQ (cp, 0x0448);
EXPECT_EQ (w, threechars + 9);
}
TEST(CheckedAPITests, test_peek_next)
{
const char* const cw = "\xe6\x97\xa5\xd1\x88";
unsigned int cp = peek_next(cw, cw + 6);
EXPECT_EQ (cp, 0x65e5);
}
TEST(CheckedAPITests, test_prior)
{
const char* twochars = "\xe6\x97\xa5\xd1\x88";
const char* w = twochars + 3;
unsigned int cp = prior (w, twochars);
EXPECT_EQ (cp, 0x65e5);
EXPECT_EQ (w, twochars);
const char* threechars = "\xf0\x90\x8d\x86\xe6\x97\xa5\xd1\x88";
w = threechars + 9;
cp = prior(w, threechars);
EXPECT_EQ (cp, 0x0448);
EXPECT_EQ (w, threechars + 7);
cp = prior(w, threechars);
EXPECT_EQ (cp, 0x65e5);
EXPECT_EQ (w, threechars + 4);
cp = prior(w, threechars);
EXPECT_EQ (cp, 0x10346);
EXPECT_EQ (w, threechars);
}
TEST(CheckedAPITests, test_advance)
{
const char* threechars = "\xf0\x90\x8d\x86\xe6\x97\xa5\xd1\x88";
const char* w = threechars;
advance(w, 2, threechars + 9);
EXPECT_EQ(w, threechars + 7);
advance(w, -2, threechars);
EXPECT_EQ(w, threechars);
advance(w, 3, threechars + 9);
EXPECT_EQ(w, threechars + 9);
advance(w, -2, threechars);
EXPECT_EQ(w, threechars + 4);
advance(w, -1, threechars);
EXPECT_EQ(w, threechars);
}
TEST(CheckedAPITests, test_distance)
{
const char* twochars = "\xe6\x97\xa5\xd1\x88";
size_t dist = static_cast<size_t>(utf8::distance(twochars, twochars + 5));
EXPECT_EQ (dist, 2);
}
TEST(CheckedAPITests, test_utf32to8)
{
unsigned int utf32string[] = {0x448, 0x65E5, 0x10346, 0};
string utf8result;
utf32to8(utf32string, utf32string + 3, back_inserter(utf8result));
EXPECT_EQ (utf8result.size(), 9);
}
TEST(CheckedAPITests, test_utf8to32)
{
const char* twochars = "\xe6\x97\xa5\xd1\x88";
vector<unsigned int> utf32result;
utf8to32(twochars, twochars + 5, back_inserter(utf32result));
EXPECT_EQ (utf32result.size(), 2);
}
TEST(CheckedAPITests, test_utf16to8)
{
unsigned short utf16string[] = {0x41, 0x0448, 0x65e5, 0xd834, 0xdd1e};
string utf8result;
utf16to8(utf16string, utf16string + 5, back_inserter(utf8result));
EXPECT_EQ (utf8result.size(), 10);
}
TEST(CheckedAPITests, test_utf8to16)
{
char utf8_with_surrogates[] = "\xe6\x97\xa5\xd1\x88\xf0\x9d\x84\x9e";
vector <unsigned short> utf16result;
utf8to16(utf8_with_surrogates, utf8_with_surrogates + 9, back_inserter(utf16result));
EXPECT_EQ (utf16result.size(), 4);
EXPECT_EQ (utf16result[2], 0xd834);
EXPECT_EQ (utf16result[3], 0xdd1e);
}
TEST(CheckedAPITests, test_replace_invalid)
{
char invalid_sequence[] = "a\x80\xe0\xa0\xc0\xaf\xed\xa0\x80z";
vector<char> replace_invalid_result;
replace_invalid (invalid_sequence, invalid_sequence + sizeof(invalid_sequence), std::back_inserter(replace_invalid_result), '?');
bool bvalid = is_valid(replace_invalid_result.begin(), replace_invalid_result.end());
EXPECT_TRUE (bvalid);
const char fixed_invalid_sequence[] = "a????z";
EXPECT_EQ (sizeof(fixed_invalid_sequence), replace_invalid_result.size());
EXPECT_TRUE (std::equal(replace_invalid_result.begin(), replace_invalid_result.begin() + sizeof(fixed_invalid_sequence), fixed_invalid_sequence));
}
TEST(CheckedAPITests, test_find_invalid)
{
char utf_invalid[] = "\xe6\x97\xa5\xd1\x88\xfa";
char* invalid = find_invalid(utf_invalid, utf_invalid + 6);
EXPECT_EQ (invalid, utf_invalid + 5);
}
TEST(CheckedAPITests, test_is_valid)
{
char utf_invalid[] = "\xe6\x97\xa5\xd1\x88\xfa";
bool bvalid = is_valid(utf_invalid, utf_invalid + 6);
EXPECT_FALSE (bvalid);
char utf8_with_surrogates[] = "\xe6\x97\xa5\xd1\x88\xf0\x9d\x84\x9e";
bvalid = is_valid(utf8_with_surrogates, utf8_with_surrogates + 9);
EXPECT_TRUE (bvalid);
}
TEST(CheckedAPITests, test_starts_with_bom)
{
unsigned char byte_order_mark[] = {0xef, 0xbb, 0xbf};
bool bbom = starts_with_bom(byte_order_mark, byte_order_mark + sizeof(byte_order_mark));
EXPECT_TRUE (bbom);
const char* threechars = "\xf0\x90\x8d\x86\xe6\x97\xa5\xd1\x88";
bool no_bbom = starts_with_bom(threechars, threechars + sizeof(threechars));
EXPECT_FALSE (no_bbom);
}
#endif