101 lines
2.4 KiB
C
101 lines
2.4 KiB
C
/*
|
|
* Copyright (c) Camden Dixie O'Brien
|
|
* SPDX-License-Identifier: AGPL-3.0-only
|
|
*/
|
|
|
|
#include "compile.h"
|
|
#include "testing.h"
|
|
|
|
static void test_foo_or_bar_regex(void)
|
|
{
|
|
fsa_t dfa;
|
|
const char *regex = "foo|bar";
|
|
const bool success = compile(regex, strlen(regex), &dfa);
|
|
ASSERT_TRUE(success);
|
|
ASSERT_ACCEPTS(&dfa, "foo");
|
|
ASSERT_ACCEPTS(&dfa, "bar");
|
|
ASSERT_REJECTS(&dfa, "baz");
|
|
fsa_free(&dfa);
|
|
}
|
|
|
|
static void test_even_number_of_Is_regex(void)
|
|
{
|
|
fsa_t dfa;
|
|
const char *regex = "(II)*";
|
|
const bool success = compile(regex, strlen(regex), &dfa);
|
|
ASSERT_TRUE(success);
|
|
ASSERT_ACCEPTS(&dfa, "");
|
|
ASSERT_ACCEPTS(&dfa, "II");
|
|
ASSERT_ACCEPTS(&dfa, "IIII");
|
|
ASSERT_ACCEPTS(&dfa, "IIIIIIIIII");
|
|
ASSERT_REJECTS(&dfa, "III");
|
|
ASSERT_REJECTS(&dfa, "IIIII");
|
|
ASSERT_REJECTS(&dfa, "IIIIIIIII");
|
|
fsa_free(&dfa);
|
|
}
|
|
|
|
static void test_arbitrary_regex_1(void)
|
|
{
|
|
fsa_t dfa;
|
|
const char *regex = "(abc!?)*|dd+";
|
|
const bool success = compile(regex, strlen(regex), &dfa);
|
|
ASSERT_TRUE(success);
|
|
ASSERT_ACCEPTS(&dfa, "abc!abcabc");
|
|
ASSERT_ACCEPTS(&dfa, "dddddddd");
|
|
ASSERT_REJECTS(&dfa, "d");
|
|
ASSERT_REJECTS(&dfa, "abcd");
|
|
fsa_free(&dfa);
|
|
}
|
|
|
|
static void test_arbitrary_regex_2(void)
|
|
{
|
|
fsa_t dfa;
|
|
const char *regex = "(l|wh)?[aeiou]+";
|
|
const bool success = compile(regex, strlen(regex), &dfa);
|
|
ASSERT_TRUE(success);
|
|
ASSERT_ACCEPTS(&dfa, "laaaa");
|
|
ASSERT_ACCEPTS(&dfa, "eeeee");
|
|
ASSERT_ACCEPTS(&dfa, "iii");
|
|
ASSERT_ACCEPTS(&dfa, "whooo");
|
|
ASSERT_ACCEPTS(&dfa, "u");
|
|
ASSERT_REJECTS(&dfa, "wh");
|
|
ASSERT_REJECTS(&dfa, "lxxx");
|
|
fsa_free(&dfa);
|
|
}
|
|
|
|
static void test_system_header_include_regex(void)
|
|
{
|
|
fsa_t dfa;
|
|
const char *regex = "#include <[abcdefghijklmnopqrstuvwxyz]+\\.h>";
|
|
const bool success = compile(regex, strlen(regex), &dfa);
|
|
ASSERT_TRUE(success);
|
|
ASSERT_ACCEPTS(&dfa, "#include <stdio.h>");
|
|
ASSERT_REJECTS(&dfa, "#include \"foo.h\"");
|
|
fsa_free(&dfa);
|
|
}
|
|
|
|
static void test_quoted_string_regex(void)
|
|
{
|
|
fsa_t dfa;
|
|
const char *regex = "'(\\\\'|[^'])*'";
|
|
const bool success = compile(regex, strlen(regex), &dfa);
|
|
ASSERT_TRUE(success);
|
|
ASSERT_ACCEPTS(&dfa, "''");
|
|
ASSERT_ACCEPTS(&dfa, "'foo bar baz'");
|
|
ASSERT_ACCEPTS(&dfa, "'foo \\'bar\\' baz'");
|
|
ASSERT_REJECTS(&dfa, "'foo 'bar' baz'");
|
|
fsa_free(&dfa);
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
TESTING_BEGIN();
|
|
test_foo_or_bar_regex();
|
|
test_even_number_of_Is_regex();
|
|
test_arbitrary_regex_1();
|
|
test_arbitrary_regex_2();
|
|
test_system_header_include_regex();
|
|
test_quoted_string_regex();
|
|
return TESTING_END();
|
|
}
|