113 lines
2.2 KiB
C
113 lines
2.2 KiB
C
/*
|
|
* 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_not_final(void)
|
|
{
|
|
fsa_t fsa;
|
|
fsa_init(&fsa);
|
|
ASSERT_FALSE(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_not_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();
|
|
}
|