Define FSA data structure
This commit is contained in:
112
tests/fsa_tests.c
Normal file
112
tests/fsa_tests.c
Normal file
@@ -0,0 +1,112 @@
|
||||
/*
|
||||
* Copyright (c) Camden Dixie O'Brien
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
#include "fsa.h"
|
||||
#include "testing.h"
|
||||
|
||||
static void new_fsa_has_single_state_with_no_rules(void)
|
||||
{
|
||||
fsa_t fsa;
|
||||
fsa_init(&fsa);
|
||||
ASSERT_EQ(1, fsa.count);
|
||||
fsa_free(&fsa);
|
||||
}
|
||||
|
||||
static void new_fsa_has_initial_state_zero(void)
|
||||
{
|
||||
fsa_t fsa;
|
||||
fsa_init(&fsa);
|
||||
ASSERT_EQ(0, fsa.initial);
|
||||
fsa_free(&fsa);
|
||||
}
|
||||
|
||||
static void new_fsa_initial_state_has_no_rules(void)
|
||||
{
|
||||
fsa_t fsa;
|
||||
fsa_init(&fsa);
|
||||
ASSERT_EQ(0, fsa.states[fsa.initial].count);
|
||||
fsa_free(&fsa);
|
||||
}
|
||||
|
||||
static void new_fsa_initial_state_is_final(void)
|
||||
{
|
||||
fsa_t fsa;
|
||||
fsa_init(&fsa);
|
||||
ASSERT_TRUE(fsa.states[fsa.initial].final);
|
||||
fsa_free(&fsa);
|
||||
}
|
||||
|
||||
static void adding_state_increases_count(void)
|
||||
{
|
||||
fsa_t fsa;
|
||||
fsa_init(&fsa);
|
||||
fsa_add_state(&fsa);
|
||||
ASSERT_EQ(2, fsa.count);
|
||||
fsa_free(&fsa);
|
||||
}
|
||||
|
||||
static void added_state_is_not_final(void)
|
||||
{
|
||||
fsa_t fsa;
|
||||
fsa_init(&fsa);
|
||||
const int id = fsa_add_state(&fsa);
|
||||
ASSERT_FALSE(fsa.states[id].final);
|
||||
fsa_free(&fsa);
|
||||
}
|
||||
|
||||
static void added_state_has_no_rules(void)
|
||||
{
|
||||
fsa_t fsa;
|
||||
fsa_init(&fsa);
|
||||
const int id = fsa_add_state(&fsa);
|
||||
ASSERT_EQ(0, fsa.states[id].count);
|
||||
fsa_free(&fsa);
|
||||
}
|
||||
|
||||
static void adding_rule_increases_count_of_state(void)
|
||||
{
|
||||
fsa_t fsa;
|
||||
fsa_init(&fsa);
|
||||
const int id = fsa_add_state(&fsa);
|
||||
fsa_add_rule(&fsa, id, 0, 'a');
|
||||
ASSERT_EQ(1, fsa.states[id].count);
|
||||
fsa_free(&fsa);
|
||||
}
|
||||
|
||||
static void added_rule_has_correct_input(void)
|
||||
{
|
||||
fsa_t fsa;
|
||||
fsa_init(&fsa);
|
||||
const int id = fsa_add_state(&fsa);
|
||||
fsa_add_rule(&fsa, id, 0, 'a');
|
||||
ASSERT_EQ('a', fsa.states[id].rules[0].input);
|
||||
fsa_free(&fsa);
|
||||
}
|
||||
|
||||
static void added_rule_has_correct_next(void)
|
||||
{
|
||||
fsa_t fsa;
|
||||
fsa_init(&fsa);
|
||||
const int id = fsa_add_state(&fsa);
|
||||
fsa_add_rule(&fsa, id, 0, 'a');
|
||||
ASSERT_EQ(0, fsa.states[id].rules[0].next);
|
||||
fsa_free(&fsa);
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
TESTING_BEGIN();
|
||||
new_fsa_has_single_state_with_no_rules();
|
||||
new_fsa_has_initial_state_zero();
|
||||
new_fsa_initial_state_has_no_rules();
|
||||
new_fsa_initial_state_is_final();
|
||||
adding_state_increases_count();
|
||||
added_state_is_not_final();
|
||||
added_state_has_no_rules();
|
||||
adding_rule_increases_count_of_state();
|
||||
added_rule_has_correct_input();
|
||||
added_rule_has_correct_next();
|
||||
return TESTING_END();
|
||||
}
|
||||
Reference in New Issue
Block a user