Skip to content
Snippets Groups Projects
trimTest.cpp 4.76 KiB
Newer Older
  • Learn to ignore specific revisions
  • #include <list>
    #include "trimTest.h"
    
    #include "label/StringLabel.h"
    #include "label/IntegerLabel.h"
    #include "label/Label.h"
    #include "alphabet/LabeledSymbol.h"
    
    #include "trim/automaton/TrimFSM.h"
    #include "trim/grammar/TrimCFG.h"
    
    #include "automaton/FSM/DFA.h"
    #include "grammar/Regular/RightRG.h"
    
    #define CPPUNIT_IMPLY(x, y) CPPUNIT_ASSERT(!(x) || (y))
    
    CPPUNIT_TEST_SUITE_REGISTRATION( trimTest );
    
    void trimTest::setUp() {
    }
    
    void trimTest::tearDown() {
    }
    
    void trimTest::testTrimAutomaton() {
      automaton::DFA automaton(automaton::State(label::Label(label::IntegerLabel(1))));
    
      automaton.addState(automaton::State(label::Label(label::IntegerLabel(1))));
      automaton.addState(automaton::State(label::Label(label::IntegerLabel(2))));
      automaton.addState(automaton::State(label::Label(label::IntegerLabel(3))));
      automaton.addInputSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))));
      automaton.addInputSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))));
      
      automaton.addTransition(automaton::State(label::Label(label::IntegerLabel(1))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))), automaton::State(label::Label(label::IntegerLabel(2))));
      automaton.addTransition(automaton::State(label::Label(label::IntegerLabel(2))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))), automaton::State(label::Label(label::IntegerLabel(1))));
      automaton.addTransition(automaton::State(label::Label(label::IntegerLabel(3))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))), automaton::State(label::Label(label::IntegerLabel(1))));
    
      automaton.addFinalState(automaton::State(label::Label(label::IntegerLabel(1))));
      
      automaton::DFA trimed = trim::TrimFSM::trim(automaton);
    
      CPPUNIT_ASSERT(trimed.getStates().size() == 2);
    }
    
    void trimTest::testTrimGrammar() {
      grammar::RightRG rrGrammar(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(1)))));
    
      rrGrammar.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(1)))));
      rrGrammar.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2)))));
      rrGrammar.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3)))));
      rrGrammar.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(4)))));
      rrGrammar.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(5)))));
      rrGrammar.addNonterminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(6)))));
      rrGrammar.addTerminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))));
      rrGrammar.addTerminalSymbol(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))));
      
      rrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(1)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2))))));
      rrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3))))));
      rrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(3)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))));
    
      rrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(4)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(5))))));
      rrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(5)))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("a")))));
      rrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(5)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(2))))));
      rrGrammar.addRule(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(6)))), std::make_pair(alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::StringLabel("b")))), alphabet::Symbol(alphabet::LabeledSymbol(label::Label(label::IntegerLabel(6))))));
    
      grammar::RightRG trimed = trim::TrimCFG::trim(rrGrammar);
    
      CPPUNIT_ASSERT(trimed.getNonterminalAlphabet().size() == 3);
    }