#include <list> #include "AutomataCompactionTest.h" #include "automaton/transform/Compaction.h" #include <alphabet/Symbol.h> #include <automaton/FSM/DFA.h> #include <automaton/FSM/CompactNFA.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, std::vector <alphabet::Symbol > {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, std::vector < alphabet::Symbol > { a, b, a, b, a }, q5); m2.addTransition(q5, std::vector < alphabet::Symbol > { 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, std::vector < alphabet::Symbol > {a}, q1); m2.addTransition(q1, std::vector < alphabet::Symbol > {a, a}, q3); m2.addTransition(q3, std::vector < alphabet::Symbol > {a, a, a}, q3); m2.addTransition(q1, std::vector < alphabet::Symbol > {b}, q5); m2.addTransition(q5, std::vector < alphabet::Symbol > {b, a, a}, q1); m2.addFinalState(q3); m2.addFinalState(q5); automaton::CompactNFA < > c1 = automaton::transform::Compaction::convert(m1); CPPUNIT_ASSERT(c1 == m2); }