Intermediate final states were being left in by add_fsa(); we always want to mark the added FSA's final state as non-final.
75 lines
1.7 KiB
C
75 lines
1.7 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);
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
TESTING_BEGIN();
|
|
test_foo_or_bar_regex();
|
|
test_even_number_of_Is_regex();
|
|
test_arbitrary_regex_1();
|
|
test_arbitrary_regex_2();
|
|
return TESTING_END();
|
|
}
|