#include "fesa/core/ascii.h" #include #include #include #include #include TEST(Ascii, LowercasesOnlyAsciiUppercaseBytes) { EXPECT_EQ(fesa::AsciiLower('A'), 'a'); EXPECT_EQ(fesa::AsciiLower('Z'), 'z'); EXPECT_EQ(fesa::AsciiLower('a'), 'a'); EXPECT_EQ(fesa::AsciiLower('0'), '0'); const char non_ascii = static_cast(0xc0U); EXPECT_EQ(fesa::AsciiLower(non_ascii), non_ascii); } TEST(Ascii, ComparesNamesWithoutLocaleOrUnicodeFolding) { EXPECT_TRUE(fesa::AsciiCaseInsensitiveEquals("Beam-1", "bEaM-1")); EXPECT_FALSE(fesa::AsciiCaseInsensitiveEquals("Beam-1", "Beam-10")); const std::string uppercase_byte{static_cast(0xc0U)}; const std::string lowercase_byte{static_cast(0xe0U)}; EXPECT_FALSE( fesa::AsciiCaseInsensitiveEquals(uppercase_byte, lowercase_byte)); } TEST(Ascii, ParsesOnlyCompletePositiveBaseTenSourceLabels) { auto one = fesa::ParsePositiveSourceLabel("1"); auto leading_zeroes = fesa::ParsePositiveSourceLabel("00042"); auto maximum = fesa::ParsePositiveSourceLabel( std::to_string((std::numeric_limits::max)())); ASSERT_TRUE(one.HasValue()); EXPECT_EQ(one.Value(), 1); ASSERT_TRUE(leading_zeroes.HasValue()); EXPECT_EQ(leading_zeroes.Value(), 42); ASSERT_TRUE(maximum.HasValue()); EXPECT_EQ(maximum.Value(), (std::numeric_limits::max)()); const std::string overflow = std::to_string((std::numeric_limits::max)()) + "0"; const std::vector invalid_values{"", "0", "-1", "+", "+1", " 1", "1 ", "1x", overflow}; for (const std::string& invalid : invalid_values) { SCOPED_TRACE(invalid); auto result = fesa::ParsePositiveSourceLabel(invalid); ASSERT_FALSE(result.HasValue()); EXPECT_EQ(result.GetStatus().Category(), fesa::FailureCategory::kInput); ASSERT_EQ(result.GetStatus().Diagnostics().size(), 1U); EXPECT_EQ(result.GetStatus().Diagnostics()[0U].code, "invalid-source-label"); EXPECT_EQ(result.GetStatus().Diagnostics()[0U].entity_identity, invalid); } }