#include #include "../src/nfc.hh" // for illegal_utf8 exception #include using namespace pEp; using std::string_view; namespace { struct TestEntry { string_view input; bool is_nfc; IsNFC quick; string_view nfc; }; typedef TestEntry TE; std::ostream& operator<<(std::ostream& o, const TestEntry& tt) { return o << "input=«" << tt.input << "», isNfc=" << tt.is_nfc << ", quick=" << tt.quick << ". "; } const char nullo[4] = { 0, 0, 0, 0 }; const std::vector testValues = { { "", true, IsNFC::Yes, "" }, // always start with the simple case ;-) { "123", true, IsNFC::Yes, "123" }, // some ASCII digits. Still easy. { "\n\\\b", true, IsNFC::Yes, "\n\\\b" }, // backslash escapes for ASCII and control chars { "ä", true, IsNFC::Yes, "ä" }, // small a with diaeresis { "\xc4\x85", true, IsNFC::Yes, "\xc4\x85" }, // small a with ogonek { "a\xcc\x88", false, IsNFC::Maybe, "ä" }, // a + combining diaresis { "a\xcc\xa8", false, IsNFC::Maybe, "\xc4\x85" }, // a + combining ogonek { "a\xcc\xa8\xcc\x88", false, IsNFC::Maybe, "\xc4\x85\xcc\x88" }, // a + + (ogonek + diaeresis) { "a\xcc\x88\xcc\xa8", false, IsNFC::Maybe, "\xc4\x85\xcc\x88" }, // a + + (diaeresis + ogonek) { "\xc4\x85\xcc\x88", true, IsNFC::Maybe, "\xc4\x85\xcc\x88" }, // small a with ogonek + combining diaeresis { "ä\xcc\xa8", false, IsNFC::Maybe, "\xc4\x85\xcc\x88" }, // a diaeresis + combining ogonek // Already implemented, because and have neither "No" nor "Maybe" NFC class: { "a\xcc\x85\xcc\xbc", false, IsNFC::No, "a\xcc\xbc\xcc\x85" }, // a + + (overline + seagull_below) { "a\xcc\xbc\xcc\x85", true, IsNFC::Yes, "a\xcc\xbc\xcc\x85" }, // a + + (seagull_below + overline) { string_view(nullo, 1), true, IsNFC::Yes, string_view(nullo, 1) }, // Yeah, 1 NUL byte { string_view(nullo, 4), true, IsNFC::Yes, string_view(nullo, 4) }, // Yeah, 4 NUL bytes { "EOF", true, IsNFC::Yes, "EOF" } }; } // namespace class NfcTest : public ::testing::TestWithParam { // intentionally left blank for now. }; INSTANTIATE_TEST_SUITE_P(NfcTestInstance, NfcTest, testing::ValuesIn(testValues)); TEST_P(NfcTest, Meh) { const auto& v = GetParam(); EXPECT_EQ(v.quick, UTF8::isNFC_quick_check(v.input)); EXPECT_EQ(v.is_nfc, UTF8::isNFC(v.input)); EXPECT_EQ(v.nfc, UTF8::toNFC(v.input)); if (v.is_nfc) { EXPECT_EQ(v.input, UTF8::toNFC(v.input)); } }