regex-engine/tests/integration_tests.c
Camden Dixie O'Brien 34fee99232 Fix bug in construct_nfa
Intermediate final states were being left in by add_fsa(); we always
want to mark the added FSA's final state as non-final.
2024-11-02 23:12:23 +00:00

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();
}