From bf75ecdcf78cedae944fb430cdf6d1ac11301590 Mon Sep 17 00:00:00 2001 From: Tim Ledbetter Date: Fri, 6 Oct 2023 18:32:44 +0100 Subject: [PATCH] Tests/AK: Add FuzzyMatch tests --- Tests/AK/CMakeLists.txt | 1 + Tests/AK/TestFuzzyMatch.cpp | 70 +++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 Tests/AK/TestFuzzyMatch.cpp diff --git a/Tests/AK/CMakeLists.txt b/Tests/AK/CMakeLists.txt index 258acdc2ac..177fd6cf7b 100644 --- a/Tests/AK/CMakeLists.txt +++ b/Tests/AK/CMakeLists.txt @@ -32,6 +32,7 @@ set(AK_TEST_SOURCES TestFloatingPointParsing.cpp TestFlyString.cpp TestFormat.cpp + TestFuzzyMatch.cpp TestGenericLexer.cpp TestHashFunctions.cpp TestHashMap.cpp diff --git a/Tests/AK/TestFuzzyMatch.cpp b/Tests/AK/TestFuzzyMatch.cpp new file mode 100644 index 0000000000..388a35765f --- /dev/null +++ b/Tests/AK/TestFuzzyMatch.cpp @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2023, Tim Ledbetter + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include + +#include + +TEST_CASE(is_leading_letter_penalty_correctly_applied) +{ + // Leading penalty is -5 points for each initial unmatched letter up to a maximum of -15. + EXPECT_EQ(fuzzy_match("b"sv, "ab"sv).score, 94); + EXPECT_EQ(fuzzy_match("c"sv, "abc"sv).score, 88); + EXPECT_EQ(fuzzy_match("d"sv, "abcd"sv).score, 82); + EXPECT_EQ(fuzzy_match("e"sv, "abcde"sv).score, 81); +} + +TEST_CASE(is_first_letter_bonus_applied_correctly) +{ + // First letter bonus is +15 if the first letter matches. + EXPECT_EQ(fuzzy_match("a"sv, "a"sv).score, 115); + EXPECT_EQ(fuzzy_match("a"sv, "A"sv).score, 115); + EXPECT_EQ(fuzzy_match(" "sv, " "sv).score, 115); +} + +TEST_CASE(is_sequential_bonus_applied_correctly) +{ + // Sequential bonus is +15 for each sequential match. + EXPECT_EQ(fuzzy_match("bc"sv, "abc"sv).score, 109); + EXPECT_EQ(fuzzy_match("bcd"sv, "ab-cd"sv).score, 108); + EXPECT_EQ(fuzzy_match("bcd"sv, "abcd"sv).score, 124); + EXPECT_EQ(fuzzy_match("bcde"sv, "ab-cde"sv).score, 123); + EXPECT_EQ(fuzzy_match("bcde"sv, "abcde"sv).score, 139); + EXPECT_EQ(fuzzy_match("bcde"sv, "abcdef"sv).score, 138); +} + +TEST_CASE(is_camel_case_bonus_applied_correctly) +{ + // Camel case bonus is +30 if the matching character is uppercase and the preceding character is lowercase. + // These cases get no camel case bonus. + EXPECT_EQ(fuzzy_match("b"sv, "Ab"sv).score, 94); + EXPECT_EQ(fuzzy_match("abc"sv, "ABc"sv).score, 145); + EXPECT_EQ(fuzzy_match("abc"sv, "ABC"sv).score, 145); + EXPECT_EQ(fuzzy_match("abc"sv, "Abc"sv).score, 145); + EXPECT_EQ(fuzzy_match("abcd"sv, "abcd"sv).score, 160); + + // These cases get a camel case bonus. + EXPECT_EQ(fuzzy_match("b"sv, "aB"sv).score, 124); + EXPECT_EQ(fuzzy_match("abc"sv, "aBc"sv).score, 175); + EXPECT_EQ(fuzzy_match("abc"sv, "aBC"sv).score, 175); + EXPECT_EQ(fuzzy_match("abc"sv, "aBC-"sv).score, 174); + EXPECT_EQ(fuzzy_match("abcd"sv, "aBcD"sv).score, 220); + EXPECT_EQ(fuzzy_match("abcd"sv, "aBcD-"sv).score, 219); +} + +TEST_CASE(is_separator_bonus_applied_correctly) +{ + // Separator bonus is +30 if the character preceding the matching character is a space or an underscore. + EXPECT_EQ(fuzzy_match("b"sv, "a b"sv).score, 118); + EXPECT_EQ(fuzzy_match("bc"sv, "a b c"sv).score, 147); + EXPECT_EQ(fuzzy_match("ab cd"sv, "ab cd"sv).score, 205); + EXPECT_EQ(fuzzy_match("ab_cd"sv, "ab_cd"sv).score, 205); + EXPECT_EQ(fuzzy_match("abcd"sv, "a b c d"sv).score, 202); + EXPECT_EQ(fuzzy_match("abcd"sv, "a_b_c_d"sv).score, 202); + EXPECT_EQ(fuzzy_match("b c"sv, "ab cd"sv).score, 153); + EXPECT_EQ(fuzzy_match("b_c"sv, "ab_cd"sv).score, 153); + EXPECT_EQ(fuzzy_match("bc"sv, "ab cd"sv).score, 122); +}