diff --git a/aconversions2/src/ConversionHandler.cpp b/aconversions2/src/ConversionHandler.cpp index 2ad49e893a4de2037ce4149cd15811645163ba1f..187f9b04d7426b8d9760378fc72cd999a3c7ab62 100644 --- a/aconversions2/src/ConversionHandler.cpp +++ b/aconversions2/src/ConversionHandler.cpp @@ -338,9 +338,8 @@ void ConversionHandler::convertLRGtoRRG( void ) switch( m_algorithm ) { default: - rg2rg::LeftToRightRegularGrammar conv( lrg ); - grammar::RightRG rrg = conv.convert(); - alib::DataFactory::toStdout(rrg); + rg2rg::LeftToRightRegularGrammar conv; + alib::DataFactory::toStdout(conv.convert(lrg)); break; } } @@ -352,9 +351,8 @@ void ConversionHandler::convertRRGtoLRG( void ) switch( m_algorithm ) { default: - rg2rg::RightToLeftRegularGrammar conv( rrg ); - grammar::LeftRG lrg = conv.convert(); - alib::DataFactory::toStdout(lrg); + rg2rg::RightToLeftRegularGrammar conv; + alib::DataFactory::toStdout(conv.convert(rrg)); break; } } diff --git a/alib2algo/test-src/conversions/playTest.cpp b/alib2algo/test-src/conversions/playTest.cpp new file mode 100644 index 0000000000000000000000000000000000000000..03a7af3387c5ee02b60d63767a15f99e83ba8932 --- /dev/null +++ b/alib2algo/test-src/conversions/playTest.cpp @@ -0,0 +1,105 @@ +#include "playTest.h" + +#include <iostream> +#include <cstdlib> +#include <ctime> + +#include "determinize/nfa/NFADeterminizer.h" +#include "minimize/dfa/MinimizeDFA.h" + +#include "generator/RandomAutomatonFactory.h" +#include "normalize/dfa/NormalizeDFA.h" +#include "trim/automaton/TrimFSM.h" +#include "epsilon/epsilonNfa/EpsilonNFAEpsilonRemover.h" +#include "minimize/dfa/MinimizeDFA.h" + +//#include "conversions/fa2re/StateElimination.h" +//#include "conversions/fa2re/BrzozowskiAlgebraic.h" +//#include "conversions/re2fa/Glushkov.h" +//#include "conversions/re2fa/Thompson.h" +//#include "conversions/re2fa/Brzozowski.h" +#include "conversions/fa2rg/fa2lrg/FAtoLRGConverter.h" +#include "conversions/fa2rg/fa2rrg/FAtoRRGConverter.h" +#include "conversions/rg2fa/lrg2fa/LRGtoFAConverter.h" +#include "conversions/rg2fa/rrg2fa/RRGtoFAConverter.h" +//#include "conversions/rg2re/rrg2re/RRGAlgebraic.h" +//#include "conversions/rg2re/lrg2re/LRGAlgebraic.h" +//#include "conversions/re2rg/re2rrg/GlushkovRRG.h" +//#include "conversions/re2rg/re2rrg/BrzozowskiDerivationRRG.h" +#include "conversions/rg2rg/lrg2rrg/LeftToRightRegularGrammar.h" +#include "conversions/rg2rg/rrg2lrg/RightToLeftRegularGrammar.h" + + +#define CPPUNIT_IMPLY(x, y) CPPUNIT_ASSERT(!(x) || (y)) + +#define TEST_ITERATIONS 100 +#define TEST_AUTOMATON_STATES_MAX 18 +#define TEST_AUTOMATON_DENSITY_MAX 2.5 +#define TEST_AUTOMATON_ALPHABET_MAX 4 + +CPPUNIT_TEST_SUITE_REGISTRATION( playTest ); + +void playTest::setUp() +{ + srand(time(NULL)); +} + +void playTest::tearDown(){} + +automaton::NFA playTest::randomNFA(void) const +{ + return generator::RandomAutomatonFactory::generateNFA( + rand() % TEST_AUTOMATON_STATES_MAX + 1, + rand() % TEST_AUTOMATON_ALPHABET_MAX + 1, + static_cast<double> (rand()) / (static_cast<double> (RAND_MAX/TEST_AUTOMATON_DENSITY_MAX)) + ); +} + +automaton::DFA playTest::mDFA(const automaton::NFA& automaton) const +{ + automaton::NFA nfa = epsilon::EpsilonNFAEpsilonRemover::remove(automaton); + nfa = trim::TrimFSM::trim(nfa); + automaton::DFA dfa = determinize::NFADeterminizer::determinize(nfa); + dfa = trim::TrimFSM::trim(dfa); + dfa = minimize::MinimizeDFA::minimize(dfa); + dfa = normalize::NormalizeDFA::normalize(dfa); + return dfa; +} + +/** + * Test case 1: + * - covers: FA -> LRG, FA -> RRG, RRG <-> LRG, RRG -> FA, LRG -> FA + * a. FA -> RRG -> LRG -> FA + * b. FA -> LRG -> RRG -> FA + */ +void playTest::testPlay1() +{ + for(int i = 0; i < TEST_ITERATIONS; i++) + this->case1a(); + for(int i = 0; i < TEST_ITERATIONS; i++) + this->case1b(); +} + +void playTest::case1a(void) const +{ + fa2rg::FAtoRRGConverter fa2rrg; + rg2rg::RightToLeftRegularGrammar rrg2lrg; + rg2fa::LRGtoFAConverter lrg2fa; + + automaton::NFA a1 = this->randomNFA(); + automaton::NFA a2 = lrg2fa.convert(rrg2lrg.convert(fa2rrg.convert(a1))); + + CPPUNIT_ASSERT(this->mDFA(a1) == this->mDFA(a2)); +} + +void playTest::case1b(void) const +{ + fa2rg::FAtoLRGConverter fa2lrg; + rg2rg::LeftToRightRegularGrammar lrg2rrg; + rg2fa::RRGtoFAConverter rrg2fa; + + automaton::NFA a1 = this->randomNFA(); + automaton::NFA a2 = rrg2fa.convert(lrg2rrg.convert(fa2lrg.convert(a1))); + + CPPUNIT_ASSERT(this->mDFA(a1) == this->mDFA(a2)); +} diff --git a/alib2algo/test-src/conversions/playTest.h b/alib2algo/test-src/conversions/playTest.h new file mode 100644 index 0000000000000000000000000000000000000000..45d8cdc9c1ff1f16b0c0ebab5ddae0eacfb95fb8 --- /dev/null +++ b/alib2algo/test-src/conversions/playTest.h @@ -0,0 +1,29 @@ +#ifndef PLAY_TEST_H_ +#define PLAY_TEST_H_ + +#include <cppunit/extensions/HelperMacros.h> + +#include <automaton/FSM/NFA.h> +#include <automaton/FSM/DFA.h> + +class playTest : public CppUnit::TestFixture +{ + CPPUNIT_TEST_SUITE( playTest ); + CPPUNIT_TEST( testPlay1 ); + CPPUNIT_TEST_SUITE_END(); + +public: + void setUp(); + void tearDown(); + + void testPlay1(); + +private: + automaton::NFA randomNFA(void) const; + automaton::DFA mDFA(const automaton::NFA& automaton) const; + + void case1a(void) const; + void case1b(void) const; +}; + +#endif // PLAY_TEST_H_ diff --git a/alib2algo/test-src/play/playTest.cpp b/alib2algo/test-src/play/playTest.cpp deleted file mode 100644 index 0fcfdacefbb966f06be5723be4d5d4ea3ac0377b..0000000000000000000000000000000000000000 --- a/alib2algo/test-src/play/playTest.cpp +++ /dev/null @@ -1,49 +0,0 @@ -#include <list> -#include "playTest.h" - -#include "conversions/re2fa/Glushkov.h" -#include "conversions/fa2re/BrzozowskiAlgebraic.h" -#include "determinize/nfa/NFADeterminizer.h" -#include "minimize/dfa/MinimizeDFA.h" - -#include "regexp/unbounded/UnboundedRegExp.h" -#include "regexp/RegExpFromStringParser.h" - -#include "automaton/FSM/NFA.h" - -#define CPPUNIT_IMPLY(x, y) CPPUNIT_ASSERT(!(x) || (y)) - -CPPUNIT_TEST_SUITE_REGISTRATION( playTest ); - -void playTest::setUp() { -} - -void playTest::tearDown() { -} - -void playTest::testPlay() { - { - std::string input = "a+a* b*"; - std::stringstream inputs(input); - - regexp::RegExpFromStringParser parser(inputs); - regexp::UnboundedRegExp regexp1( static_cast<const regexp::UnboundedRegExp &>( parser.parseValue().getData() ) ); - - re2fa::Glushkov glushkov1(regexp1); - automaton::NFA nfa1 = glushkov1.convert(); - - - regexp::UnboundedRegExp regexp2( static_cast<const regexp::UnboundedRegExp &>( fa2re::BrzozowskiAlgebraic::convert(nfa1) ) ); - - re2fa::Glushkov glushkov2(regexp2); - automaton::NFA nfa2 = glushkov2.convert(); - - automaton::DFA dfa1 = determinize::NFADeterminizer::determinize(nfa1); - automaton::DFA dfa2 = determinize::NFADeterminizer::determinize(nfa2); - - automaton::DFA mdfa1 = minimize::MinimizeDFA::minimize(dfa1); - automaton::DFA mdfa2 = minimize::MinimizeDFA::minimize(dfa2); - - CPPUNIT_ASSERT( mdfa1 == mdfa2); - } -} diff --git a/alib2algo/test-src/play/playTest.h b/alib2algo/test-src/play/playTest.h deleted file mode 100644 index b7bc794188284710d3d9d6b4f4f40486a44460da..0000000000000000000000000000000000000000 --- a/alib2algo/test-src/play/playTest.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifndef PLAY_TEST_H_ -#define PLAY_TEST_H_ - -#include <cppunit/extensions/HelperMacros.h> - -class playTest : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE( playTest ); - CPPUNIT_TEST( testPlay ); - CPPUNIT_TEST_SUITE_END(); - -public: - void setUp(); - void tearDown(); - - void testPlay(); -}; - -#endif // PLAY_TEST_H_