#include "lib/self_test.h"

#include "lib/regex.h"

class TestRegex : public CxxTest::TestSuite 
{
public:
    void test_regex()
    {
        TS_ASSERT_EQUALS(match_wildcard("", ""), 1);
        TS_ASSERT_EQUALS(match_wildcard("a", 0), 1);    // NULL matches everything

        TS_ASSERT_EQUALS(match_wildcard("abc", "abc")     , 1); // direct match
        TS_ASSERT_EQUALS(match_wildcard("abc", "???")     , 1); // only ?
        TS_ASSERT_EQUALS(match_wildcard("abc", "*"  )     , 1); // only *

        TS_ASSERT_EQUALS(match_wildcard("ab" , "a?" )     , 1); // trailing ?
        TS_ASSERT_EQUALS(match_wildcard("abc", "a?c")     , 1); // middle ?
        TS_ASSERT_EQUALS(match_wildcard("abc", "?bc")     , 1); // leading ?

        TS_ASSERT_EQUALS(match_wildcard("abc", "a*" )     , 1); // trailing *
        TS_ASSERT_EQUALS(match_wildcard("abcdef", "ab*ef"), 1); // middle *
        TS_ASSERT_EQUALS(match_wildcard("abcdef", "*f"   ), 1); // leading *

        TS_ASSERT_EQUALS(match_wildcard("abcdef", "a?cd*"), 1); // ? and *
        TS_ASSERT_EQUALS(match_wildcard("abcdef", "a*d?f"), 1); // * and ?
        TS_ASSERT_EQUALS(match_wildcard("abcdef", "a*d*" ), 1); // multiple *

        // unicode test pasted from the above; keep in sync!

        TS_ASSERT_EQUALS(match_wildcardw(L"", L""), 1);
        TS_ASSERT_EQUALS(match_wildcardw(L"a", 0), 1);  // NULL matches everything

        TS_ASSERT_EQUALS(match_wildcardw(L"abc", L"abc")     , 1);  // direct match
        TS_ASSERT_EQUALS(match_wildcardw(L"abc", L"???")     , 1);  // only ?
        TS_ASSERT_EQUALS(match_wildcardw(L"abc", L"*"  )     , 1);  // only *

        TS_ASSERT_EQUALS(match_wildcardw(L"ab" , L"a?" )     , 1);  // trailing ?
        TS_ASSERT_EQUALS(match_wildcardw(L"abc", L"a?c")     , 1);  // middle ?
        TS_ASSERT_EQUALS(match_wildcardw(L"abc", L"?bc")     , 1);  // leading ?

        TS_ASSERT_EQUALS(match_wildcardw(L"abc", L"a*" )     , 1);  // trailing *
        TS_ASSERT_EQUALS(match_wildcardw(L"abcdef", L"ab*ef"), 1);  // middle *
        TS_ASSERT_EQUALS(match_wildcardw(L"abcdef", L"*f"   ), 1);  // leading *

        TS_ASSERT_EQUALS(match_wildcardw(L"abcdef", L"a?cd*"), 1);  // ? and *
        TS_ASSERT_EQUALS(match_wildcardw(L"abcdef", L"a*d?f"), 1);  // * and ?
        TS_ASSERT_EQUALS(match_wildcardw(L"abcdef", L"a*d*" ), 1);  // multiple *
    }
};