Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
AutomataCompactionTest.cpp 3.84 KiB
#include <list>
#include "AutomataCompactionTest.h"

#include "automaton/transform/Compaction.h"
#include <alphabet/Symbol.h>
#include <automaton/FSM/DFA.h>
#include <automaton/FSM/CompactNFA.h>
#include <string/LinearString.h>

#define CPPUNIT_IMPLY(x, y) CPPUNIT_ASSERT(!(x) || (y))

CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( AutomataCompactionTest, "automaton" );
CPPUNIT_TEST_SUITE_REGISTRATION( AutomataCompactionTest );

void AutomataCompactionTest::setUp() {
}

void AutomataCompactionTest::tearDown() {
}

void AutomataCompactionTest::testAutomataCompaction1() {
	label::Label q0 = label::labelFrom("0");
	label::Label q1 = label::labelFrom("1");
	label::Label q2 = label::labelFrom("2");
	label::Label q3 = label::labelFrom("3");
	label::Label q4 = label::labelFrom("4");
	label::Label q5 = label::labelFrom("5");
	alphabet::Symbol a(alphabet::symbolFrom('a')), b(alphabet::symbolFrom('b'));

	automaton::DFA m1(q0);
	automaton::CompactNFA m2(q0);

	m1.setInputAlphabet({a, b});
	m1.setStates({q0, q1, q2, q3, q4, q5});
	m1.addTransition(q0, a, q1);
	m1.addTransition(q1, b, q2);
	m1.addTransition(q2, a, q3);
	m1.addTransition(q3, b, q4);
	m1.addTransition(q4, a, q5);
	m1.addFinalState(q5);

	m2.setInputAlphabet({a, b});
	m2.setStates({q0, q5});
	m2.addTransition(q0, string::LinearString{ { a, b }, {a, b, a, b, a} }, q5);
	m2.addFinalState(q5);

	automaton::CompactNFA c1 = automaton::transform::Compaction::convert(m1);

	CPPUNIT_ASSERT(c1 == m2);

}

void AutomataCompactionTest::testAutomataCompaction2() {
	label::Label q0 = label::labelFrom("0");
	label::Label q1 = label::labelFrom("1");
	label::Label q2 = label::labelFrom("2");
	label::Label q3 = label::labelFrom("3");
	label::Label q4 = label::labelFrom("4");
	label::Label q5 = label::labelFrom("5");
	alphabet::Symbol a(alphabet::symbolFrom('a')), b(alphabet::symbolFrom('b'));

	automaton::DFA m1(q0);
	automaton::CompactNFA m2(q0);

	m1.setInputAlphabet({a, b});
	m1.setStates({q0, q1, q2, q3, q4, q5});
	m1.addTransition(q0, a, q1);
	m1.addTransition(q1, b, q2);
	m1.addTransition(q2, a, q3);
	m1.addTransition(q3, b, q4);
	m1.addTransition(q4, a, q5);
	m1.addTransition(q5, a, q1);
	m1.addFinalState(q5);

	m2.setInputAlphabet({a, b});
	m2.setStates({q0, q5});
	m2.addTransition(q0, string::LinearString{ { a, b }, {a, b, a, b, a} }, q5);
	m2.addTransition(q5, string::LinearString{ { a, b }, {a, b, a, b, a} }, q5);
	m2.addFinalState(q5);

	automaton::CompactNFA c1 = automaton::transform::Compaction::convert(m1);

	CPPUNIT_ASSERT(c1 == m2);

}

void AutomataCompactionTest::testAutomataCompaction3() {
	label::Label q0 = label::labelFrom("0");
	label::Label q1 = label::labelFrom("1");
	label::Label q2 = label::labelFrom("2");
	label::Label q3 = label::labelFrom("3");
	label::Label q4 = label::labelFrom("4");
	label::Label q5 = label::labelFrom("5");
	label::Label q6 = label::labelFrom("6");
	alphabet::Symbol a(alphabet::symbolFrom('a')), b(alphabet::symbolFrom('b'));

	automaton::DFA m1(q0);
	automaton::CompactNFA m2(q0);

	m1.setInputAlphabet({a, b});
	m1.setStates({q0, q1, q2, q3, q4, q5, q6});
	m1.addTransition(q0, a, q1);
	m1.addTransition(q1, a, q2);
	m1.addTransition(q2, a, q3);
	m1.addTransition(q3, a, q4);
	m1.addTransition(q4, a, q2);
	m1.addTransition(q1, b, q5);
	m1.addTransition(q5, b, q6);
	m1.addTransition(q6, a, q0);
	m1.addFinalState(q3);
	m1.addFinalState(q5);

	m2.setInputAlphabet({a, b});
	m2.setStates({q0, q1, q3, q5});
	m2.addTransition(q0, string::LinearString{ { a, b }, {a} }, q1);
	m2.addTransition(q1, string::LinearString{ { a, b }, {a, a} }, q3);
	m2.addTransition(q3, string::LinearString{ { a, b }, {a, a, a} }, q3);
	m2.addTransition(q1, string::LinearString{ { a, b }, {b} }, q5);
	m2.addTransition(q5, string::LinearString{ { a, b }, {b, a, a} }, q1);
	m2.addFinalState(q3);
	m2.addFinalState(q5);

	automaton::CompactNFA c1 = automaton::transform::Compaction::convert(m1);

	CPPUNIT_ASSERT(c1 == m2);

}