package pl.edu.amu.wmi.daut.re; import pl.edu.amu.wmi.daut.base.AutomatonSpecification; import pl.edu.amu.wmi.daut.base.NaiveAutomatonSpecification; import pl.edu.amu.wmi.daut.base.NondeterministicAutomatonByThompsonApproach; import pl.edu.amu.wmi.daut.base.State; import pl.edu.amu.wmi.daut.base.CharTransitionLabel; import junit.framework.TestCase; import java.util.ArrayList; import java.util.List; /** * Test klasy TestMinimumNumberOfOccurencesOperator. */ public class TestMinimumNumberOfOccurencesOperator extends TestCase { /** * Automat z jednym przejściem na dwóch stanach. */ public final void testTwoStatesOneTransitionLabel() { AutomatonSpecification automaton = new NaiveAutomatonSpecification(); State q0 = automaton.addState(); State q1 = automaton.addState(); automaton.addTransition(q0, q1, new CharTransitionLabel('a')); automaton.markAsInitial(q0); automaton.markAsFinal(q1); MinimumNumberOfOccurencesOperator oper = new MinimumNumberOfOccurencesOperator(3); NondeterministicAutomatonByThompsonApproach result = new NondeterministicAutomatonByThompsonApproach( oper.createAutomatonFromOneAutomaton(automaton)); assertTrue(result.accepts("aaa")); assertTrue(result.accepts("aaaa")); assertTrue(result.accepts("aaaaa")); assertTrue(result.accepts("aaaaaaaaaaaa")); assertFalse(result.accepts("aa")); assertFalse(result.accepts("a")); assertFalse(result.accepts("LeagueOfLegends")); } /** * Automat akceptuje słowa a(b^n)a. */ public final void testExemplaryAutomaton() { AutomatonSpecification automaton = new NaiveAutomatonSpecification(); State q0 = automaton.addState(); State q1 = automaton.addState(); State q2 = automaton.addState(); automaton.addTransition(q0, q1, new CharTransitionLabel('a')); automaton.addTransition(q1, q2, new CharTransitionLabel('a')); automaton.addLoop(q1, new CharTransitionLabel('b')); automaton.markAsInitial(q0); automaton.markAsFinal(q2); MinimumNumberOfOccurencesOperator oper = new MinimumNumberOfOccurencesOperator(2); NondeterministicAutomatonByThompsonApproach result = new NondeterministicAutomatonByThompsonApproach( oper.createAutomatonFromOneAutomaton(automaton)); assertTrue(result.accepts("aaaa")); assertTrue(result.accepts("abbaaba")); assertTrue(result.accepts("aaabaabba")); assertTrue(result.accepts("aaabaabbaabbbaabbbba")); assertFalse(result.accepts("abc")); assertFalse(result.accepts("aa")); assertFalse(result.accepts("LegueOfLegends")); } /** * Pusty automat. */ public final void testEmptyAutomaton() { AutomatonSpecification automaton = new NaiveAutomatonSpecification(); MinimumNumberOfOccurencesOperator oper = new MinimumNumberOfOccurencesOperator(10); NondeterministicAutomatonByThompsonApproach result = new NondeterministicAutomatonByThompsonApproach( oper.createAutomatonFromOneAutomaton(automaton)); assertFalse(result.accepts("aaaaaaaaaaaaaaaaaaaaaaaa")); assertFalse(result.accepts("")); assertFalse(result.accepts("a")); assertFalse(result.accepts("aaa")); assertFalse(result.accepts("Zonk")); } /** * Automat z trzema stanami od q0 wychodzą dwam przejścia do q1 i q2. * Stany te są stanami akceptującymi. */ public final void testThreeStatesTwoFinalStates() { AutomatonSpecification automaton = new NaiveAutomatonSpecification(); State q0 = automaton.addState(); State q1 = automaton.addState(); State q2 = automaton.addState(); automaton.addTransition(q0, q1, new CharTransitionLabel('a')); automaton.addTransition(q0, q2, new CharTransitionLabel('b')); automaton.markAsInitial(q0); automaton.markAsFinal(q1); automaton.markAsFinal(q2); MinimumNumberOfOccurencesOperator oper = new MinimumNumberOfOccurencesOperator(3); NondeterministicAutomatonByThompsonApproach result = new NondeterministicAutomatonByThompsonApproach( oper.createAutomatonFromOneAutomaton(automaton)); assertTrue(result.accepts("aaaa")); assertTrue(result.accepts("bbbbbb")); assertTrue(result.accepts("bbabab")); assertTrue(result.accepts("aababa")); assertFalse(result.accepts("ab")); assertFalse(result.accepts("aa")); assertFalse(result.accepts("a")); assertFalse(result.accepts("b")); assertFalse(result.accepts("")); assertFalse(result.accepts("ZlyTekst")); } /** * Test automatu akceptujący słowo puste. */ public final void testZeroRepeats() { AutomatonSpecification automaton = new NaiveAutomatonSpecification(); MinimumNumberOfOccurencesOperator oper = new MinimumNumberOfOccurencesOperator(0); NondeterministicAutomatonByThompsonApproach result = new NondeterministicAutomatonByThompsonApproach( oper.createAutomatonFromOneAutomaton(automaton)); assertTrue(result.accepts("")); assertFalse(result.accepts("a")); assertFalse(result.accepts("aaa")); assertFalse(result.accepts("Zonk")); } /** * Automat akceptuje słowo (ac^nb)||(bd^na). */ public final void testAlternativeLoops() { AutomatonSpecification automaton = new NaiveAutomatonSpecification(); State q0 = automaton.addState(); State q1 = automaton.addState(); State q2 = automaton.addState(); State q3 = automaton.addState(); State q4 = automaton.addState(); automaton.addTransition(q0, q1, new CharTransitionLabel('a')); automaton.addTransition(q0, q2, new CharTransitionLabel('b')); automaton.addTransition(q1, q3, new CharTransitionLabel('b')); automaton.addTransition(q2, q4, new CharTransitionLabel('a')); automaton.addLoop(q1, new CharTransitionLabel('c')); automaton.addLoop(q2, new CharTransitionLabel('d')); automaton.markAsInitial(q0); automaton.markAsFinal(q3); automaton.markAsFinal(q4); MinimumNumberOfOccurencesOperator oper = new MinimumNumberOfOccurencesOperator(3); NondeterministicAutomatonByThompsonApproach result = new NondeterministicAutomatonByThompsonApproach( oper.createAutomatonFromOneAutomaton(automaton)); assertTrue(result.accepts("acbbdabdda")); assertTrue(result.accepts("ababab")); assertTrue(result.accepts("abbaab")); assertTrue(result.accepts("accccccbbdddaab")); assertFalse(result.accepts("aaa")); assertFalse(result.accepts("abba")); assertFalse(result.accepts("Zonk")); } /** * Test fabryki. */ public void testFactory() { RegexpOperatorFactory factory = new MinimumNumberOfOccurencesOperator.Factory(); List<String> params = new ArrayList(); params.add("1"); RegexpOperator operator2 = factory.createOperator(params); int arity = operator2.arity(); assertEquals(arity, 1); } }