Skip to content
Snippets Groups Projects
AutomataCompactionTest.cpp 3.87 KiB
Newer Older
  • Learn to ignore specific revisions
  • Jan Trávníček's avatar
    Jan Trávníček committed
    #include <list>
    #include "AutomataCompactionTest.h"
    
    #include "automaton/transform/Compaction.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() {
    
    	DefaultStateType q0 = DefaultStateType("0");
    	DefaultStateType q1 = DefaultStateType("1");
    	DefaultStateType q2 = DefaultStateType("2");
    	DefaultStateType q3 = DefaultStateType("3");
    	DefaultStateType q4 = DefaultStateType("4");
    	DefaultStateType q5 = DefaultStateType("5");
    	DefaultSymbolType a(DefaultSymbolType('a')), b(DefaultSymbolType('b'));
    
    	automaton::DFA<> m1(q0);
    
    	automaton::CompactNFA < > m2(q0);
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    
    	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 <DefaultSymbolType > {a, b, a, b, a}, q5);
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    	m2.addFinalState(q5);
    
    
    	automaton::CompactNFA < > c1 = automaton::transform::Compaction::convert(m1);
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    
    	CPPUNIT_ASSERT(c1 == m2);
    
    }
    
    void AutomataCompactionTest::testAutomataCompaction2() {
    
    	DefaultStateType q0 = DefaultStateType("0");
    	DefaultStateType q1 = DefaultStateType("1");
    	DefaultStateType q2 = DefaultStateType("2");
    	DefaultStateType q3 = DefaultStateType("3");
    	DefaultStateType q4 = DefaultStateType("4");
    	DefaultStateType q5 = DefaultStateType("5");
    	DefaultSymbolType a(DefaultSymbolType('a')), b(DefaultSymbolType('b'));
    
    	automaton::DFA<> m1(q0);
    
    	automaton::CompactNFA < > m2(q0);
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    
    	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 < DefaultSymbolType > { a, b, a, b, a }, q5);
    	m2.addTransition(q5, std::vector < DefaultSymbolType > { a, b, a, b, a }, q5);
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    	m2.addFinalState(q5);
    
    
    	automaton::CompactNFA < > c1 = automaton::transform::Compaction::convert(m1);
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    
    	CPPUNIT_ASSERT(c1 == m2);
    
    }
    
    void AutomataCompactionTest::testAutomataCompaction3() {
    
    	DefaultStateType q0 = DefaultStateType("0");
    	DefaultStateType q1 = DefaultStateType("1");
    	DefaultStateType q2 = DefaultStateType("2");
    	DefaultStateType q3 = DefaultStateType("3");
    	DefaultStateType q4 = DefaultStateType("4");
    	DefaultStateType q5 = DefaultStateType("5");
    	DefaultStateType q6 = DefaultStateType("6");
    	DefaultSymbolType a(DefaultSymbolType('a')), b(DefaultSymbolType('b'));
    
    	automaton::DFA<> m1(q0);
    
    	automaton::CompactNFA < > m2(q0);
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    
    	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 < DefaultSymbolType > {a}, q1);
    	m2.addTransition(q1, std::vector < DefaultSymbolType > {a, a}, q3);
    	m2.addTransition(q3, std::vector < DefaultSymbolType > {a, a, a}, q3);
    	m2.addTransition(q1, std::vector < DefaultSymbolType > {b}, q5);
    	m2.addTransition(q5, std::vector < DefaultSymbolType > {b, a, a}, q1);
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    	m2.addFinalState(q3);
    	m2.addFinalState(q5);
    
    
    	automaton::CompactNFA < > c1 = automaton::transform::Compaction::convert(m1);
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    
    	CPPUNIT_ASSERT(c1 == m2);
    
    }