Skip to content
Snippets Groups Projects
RegExpTest.cpp 3.77 KiB
Newer Older
  • Learn to ignore specific revisions
  • #include <list>
    #include "RegExpTest.h"
    
    #include "sax/SaxParseInterface.h"
    #include "sax/SaxComposeInterface.h"
    
    #include "regexp/unbounded/UnboundedRegExp.h"
    #include "regexp/RegExpFromStringParser.h"
    
    #include "regexp/GlushkovTraversal.h"
    
    
    #include <factory/StringDataFactory.hpp>
    
    
    #define CPPUNIT_IMPLY(x, y) CPPUNIT_ASSERT(!(x) || (y))
    #define CPPUNIT_EXCLUSIVE_OR(x, y) CPPUNIT_ASSERT((!(x) && (y)) || ((x) && !(y)))
    
    
    CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( RegExpTest, "regexp" );
    
    CPPUNIT_TEST_SUITE_REGISTRATION( RegExpTest );
    
    void RegExpTest::setUp() {
    }
    
    void RegExpTest::tearDown() {
    }
    
    void RegExpTest::testFirst() {
    	{
    		std::string input = "#E* #0*";
    
    		regexp::UnboundedRegExp regexp( static_cast<const regexp::UnboundedRegExp &>( alib::StringDataFactory::fromString<regexp::RegExp>(input).getData() ) );
    
    
    		std::set<regexp::GlushkovSymbol> first = regexp::GlushkovTraversal::first(regexp);
    
    		CPPUNIT_ASSERT(first.size() == 0);
    	}
    	{
    		std::string input = "#E* a";
    
    		regexp::UnboundedRegExp regexp( static_cast<const regexp::UnboundedRegExp &>( alib::StringDataFactory::fromString<regexp::RegExp>(input).getData() ) );
    
    
    		std::set<regexp::GlushkovSymbol> first = regexp::GlushkovTraversal::first(regexp);
    
    		CPPUNIT_ASSERT(first.size() == 1);
    	}
    
    }
    
    void RegExpTest::testLast() {
    	{
    		std::string input = "a+a";
    
    		regexp::UnboundedRegExp regexp( static_cast<const regexp::UnboundedRegExp &>( alib::StringDataFactory::fromString<regexp::RegExp>(input).getData() ) );
    
    
    		std::set<regexp::GlushkovSymbol> last = regexp::GlushkovTraversal::last(regexp);
    
    		CPPUNIT_ASSERT(last.size() == 2);
    	}
    	{
    		std::string input = "(a+a)b";
    
    		regexp::UnboundedRegExp regexp( static_cast<const regexp::UnboundedRegExp &>( alib::StringDataFactory::fromString<regexp::RegExp>(input).getData() ) );
    
    
    		std::set<regexp::GlushkovSymbol> last = regexp::GlushkovTraversal::last(regexp);
    
    		CPPUNIT_ASSERT(last.size() == 1);
    	}
    }
    
    void RegExpTest::testFollow() {
    	{
    		std::string input = "(a+a)b";
    
    		regexp::UnboundedRegExp regexp( static_cast<const regexp::UnboundedRegExp &>( alib::StringDataFactory::fromString<regexp::RegExp>(input).getData() ) );
    
    
    		std::set<regexp::GlushkovSymbol> symbols = regexp::GlushkovTraversal::getSymbols(regexp);
    		auto symbolsIter = symbols.begin();
    
    		std::set<regexp::GlushkovSymbol> follow1 = regexp::GlushkovTraversal::follow(regexp, *symbolsIter);
    
    		CPPUNIT_ASSERT(follow1.size() == 1);
    
    		symbolsIter++;
    		std::set<regexp::GlushkovSymbol> follow2 = regexp::GlushkovTraversal::follow(regexp, *symbolsIter);
    
    		CPPUNIT_ASSERT(follow2.size() == 1);
    
    		symbolsIter++;
    		std::set<regexp::GlushkovSymbol> follow3 = regexp::GlushkovTraversal::follow(regexp, *symbolsIter);
    
    		CPPUNIT_ASSERT(follow3.size() == 0);
    	}
    	{
    		std::string input = "a+a* (b+a)* c";
    
    		regexp::UnboundedRegExp regexp( static_cast<const regexp::UnboundedRegExp &>( alib::StringDataFactory::fromString<regexp::RegExp>(input).getData() ) );
    
    
    		std::set<regexp::GlushkovSymbol> symbols = regexp::GlushkovTraversal::getSymbols(regexp);
    		auto symbolsIter = symbols.begin();
    
    		std::set<regexp::GlushkovSymbol> follow1 = regexp::GlushkovTraversal::follow(regexp, *symbolsIter);
    
    		CPPUNIT_ASSERT(follow1.size() == 0);
    
    		symbolsIter++;
    		std::set<regexp::GlushkovSymbol> follow2 = regexp::GlushkovTraversal::follow(regexp, *symbolsIter);
    
    		CPPUNIT_ASSERT(follow2.size() == 4);
    
    		symbolsIter++;
    		std::set<regexp::GlushkovSymbol> follow3 = regexp::GlushkovTraversal::follow(regexp, *symbolsIter);
    
    		CPPUNIT_ASSERT(follow3.size() == 3);
    
    		symbolsIter++;
    		std::set<regexp::GlushkovSymbol> follow4 = regexp::GlushkovTraversal::follow(regexp, *symbolsIter);
    
    		CPPUNIT_ASSERT(follow4.size() == 3);
    
    		symbolsIter++;
    		std::set<regexp::GlushkovSymbol> follow5 = regexp::GlushkovTraversal::follow(regexp, *symbolsIter);
    
    		CPPUNIT_ASSERT(follow5.size() == 0);
    	}
    
    }