diff options
author | John Hawthorn <john.hawthorn@gmail.com> | 2017-04-04 22:52:53 -0700 |
---|---|---|
committer | John Hawthorn <john.hawthorn@gmail.com> | 2017-04-04 23:40:21 -0700 |
commit | 2d17422a93d039b2745b117b6373abb6ee4c951d (patch) | |
tree | 26335a4392d83116abf635a37158345efc6f9e21 /test/test_match.c | |
parent | a47b34dc0797af82947e4608f5b8690aff62ec60 (diff) |
Move test suites into separate files
Diffstat (limited to 'test/test_match.c')
-rw-r--r-- | test/test_match.c | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/test/test_match.c b/test/test_match.c new file mode 100644 index 0000000..38c1d20 --- /dev/null +++ b/test/test_match.c @@ -0,0 +1,168 @@ +#include <stdlib.h> + +#include "../config.h" +#include "match.h" + +#include "greatest/greatest.h" + +TEST test_match() { + ASSERT(has_match("a", "a")); + ASSERT(has_match("a", "ab")); + ASSERT(has_match("a", "ba")); + ASSERT(has_match("abc", "a|b|c")); + + /* non-match */ + ASSERT(!has_match("a", "")); + ASSERT(!has_match("a", "b")); + ASSERT(!has_match("ass", "tags")); + + /* match when query is empty */ + ASSERT(has_match("", "")); + ASSERT(has_match("", "a")); + + PASS(); +} + +TEST test_relative_scores() { + /* App/Models/Order is better than App/MOdels/zRder */ + ASSERT(match("amor", "app/models/order") > match("amor", "app/models/zrder")); + + /* App/MOdels/foo is better than App/M/fOo */ + ASSERT(match("amo", "app/m/foo") < match("amo", "app/models/foo")); + + /* GEMFIle.Lock < GEMFILe */ + ASSERT(match("gemfil", "Gemfile.lock") < match("gemfil", "Gemfile")); + + /* GEMFIle.Lock < GEMFILe */ + ASSERT(match("gemfil", "Gemfile.lock") < match("gemfil", "Gemfile")); + + /* Prefer shorter matches */ + ASSERT(match("abce", "abcdef") > match("abce", "abc de")); + + /* Prefer shorter candidates */ + ASSERT(match("test", "tests") > match("test", "testing")); + + /* Scores first letter highly */ + ASSERT(match("test", "testing") > match("test", "/testing")); + + /* Prefer shorter matches */ + ASSERT(match("abc", " a b c ") > match("abc", " a b c ")); + ASSERT(match("abc", " a b c ") > match("abc", " a b c ")); + + PASS(); +} + +TEST test_exact_scores() { + /* Exact match is SCORE_MAX */ + ASSERT_EQ(SCORE_MAX, match("abc", "abc")); + ASSERT_EQ(SCORE_MAX, match("aBc", "abC")); + + /* Empty query always results in SCORE_MIN */ + ASSERT_EQ(SCORE_MIN, match("", "")); + ASSERT_EQ(SCORE_MIN, match("", "a")); + ASSERT_EQ(SCORE_MIN, match("", "bb")); + + /* Gaps */ + ASSERT_EQ(SCORE_GAP_LEADING, match("a", "*a")); + ASSERT_EQ(SCORE_GAP_LEADING*2, match("a", "*ba")); + ASSERT_EQ(SCORE_GAP_LEADING*2 + SCORE_GAP_TRAILING, match("a", "**a*")); + ASSERT_EQ(SCORE_GAP_LEADING*2 + SCORE_GAP_TRAILING*2, match("a", "**a**")); + ASSERT_EQ(SCORE_GAP_LEADING*2 + SCORE_MATCH_CONSECUTIVE + SCORE_GAP_TRAILING*2, match("aa", "**aa**")); + ASSERT_EQ(SCORE_GAP_LEADING + SCORE_GAP_LEADING + SCORE_GAP_INNER + SCORE_GAP_TRAILING + SCORE_GAP_TRAILING, match("aa", "**a*a**")); + + /* Consecutive */ + ASSERT_EQ(SCORE_GAP_LEADING + SCORE_MATCH_CONSECUTIVE, match("aa", "*aa")); + ASSERT_EQ(SCORE_GAP_LEADING + SCORE_MATCH_CONSECUTIVE*2, match("aaa", "*aaa")); + ASSERT_EQ(SCORE_GAP_LEADING + SCORE_GAP_INNER + SCORE_MATCH_CONSECUTIVE, match("aaa", "*a*aa")); + + /* Slash */ + ASSERT_EQ(SCORE_GAP_LEADING + SCORE_MATCH_SLASH, match("a", "/a")); + ASSERT_EQ(SCORE_GAP_LEADING*2 + SCORE_MATCH_SLASH, match("a", "*/a")); + ASSERT_EQ(SCORE_GAP_LEADING*2 + SCORE_MATCH_SLASH + SCORE_MATCH_CONSECUTIVE, match("aa", "a/aa")); + + /* Capital */ + ASSERT_EQ(SCORE_GAP_LEADING + SCORE_MATCH_CAPITAL, match("a", "bA")); + ASSERT_EQ(SCORE_GAP_LEADING*2 + SCORE_MATCH_CAPITAL, match("a", "baA")); + ASSERT_EQ(SCORE_GAP_LEADING*2 + SCORE_MATCH_CAPITAL + SCORE_MATCH_CONSECUTIVE, match("aa", "baAa")); + + /* Dot */ + ASSERT_EQ(SCORE_GAP_LEADING + SCORE_MATCH_DOT, match("a", ".a")); + ASSERT_EQ(SCORE_GAP_LEADING*3 + SCORE_MATCH_DOT, match("a", "*a.a")); + ASSERT_EQ(SCORE_GAP_LEADING + SCORE_GAP_INNER + SCORE_MATCH_DOT, match("a", "*a.a")); + + PASS(); +} + +TEST test_positions_1() { + size_t positions[3]; + match_positions("amo", "app/models/foo", positions); + ASSERT_EQ(0, positions[0]); + ASSERT_EQ(4, positions[1]); + ASSERT_EQ(5, positions[2]); + + PASS(); +} + +TEST test_positions_2() { + /* + * We should prefer matching the 'o' in order, since it's the beginning + * of a word. + */ + size_t positions[4]; + match_positions("amor", "app/models/order", positions); + ASSERT_EQ(0, positions[0]); + ASSERT_EQ(4, positions[1]); + ASSERT_EQ(11, positions[2]); + + PASS(); +} + +TEST test_positions_3() { + size_t positions[2]; + match_positions("as", "tags", positions); + ASSERT_EQ(1, positions[0]); + ASSERT_EQ(3, positions[1]); + + PASS(); +} + +TEST test_positions_4() { + size_t positions[2]; + match_positions("as", "examples.txt", positions); + ASSERT_EQ(2, positions[0]); + ASSERT_EQ(7, positions[1]); + + PASS(); +} + +TEST test_positions_5() { + size_t positions[3]; + match_positions("abc", "a/a/b/c/c", positions); + ASSERT_EQ(2, positions[0]); + ASSERT_EQ(4, positions[1]); + ASSERT_EQ(6, positions[2]); + + PASS(); +} + +TEST test_positions_exact() { + size_t positions[3]; + match_positions("foo", "foo", positions); + ASSERT_EQ(0, positions[0]); + ASSERT_EQ(1, positions[1]); + ASSERT_EQ(2, positions[2]); + + PASS(); +} + +SUITE(match_suite) { + RUN_TEST(test_match); + RUN_TEST(test_relative_scores); + RUN_TEST(test_exact_scores); + RUN_TEST(test_positions_1); + RUN_TEST(test_positions_2); + RUN_TEST(test_positions_3); + RUN_TEST(test_positions_4); + RUN_TEST(test_positions_5); + RUN_TEST(test_positions_exact); +} |