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 FixedNumberOfOccurrencesOperator. */ public class TestFixedNumberOfOccurrencesOperator extends TestCase { /** * Test 1. 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); FixedNumberOfOccurrencesOperator oper = new FixedNumberOfOccurrencesOperator(4); NondeterministicAutomatonByThompsonApproach result = new NondeterministicAutomatonByThompsonApproach( oper.createAutomatonFromOneAutomaton(automaton)); assertTrue(result.accepts("aaaa")); assertFalse(result.accepts("")); assertFalse(result.accepts("a")); assertFalse(result.accepts("aa")); assertFalse(result.accepts("aaa")); assertFalse(result.accepts("aaaaa")); assertFalse(result.accepts("ManchesterUnited")); } /** * Test 2. Automat akceptuje słowa a(b^n)a(d^n)b oraz (a^n)c(d^n)b. */ public final void testExemplaryAutomaton() { 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(q1, q2, new CharTransitionLabel('a')); automaton.addTransition(q0, q3, new CharTransitionLabel('a')); automaton.addTransition(q3, q2, new CharTransitionLabel('c')); automaton.addTransition(q2, q4, new CharTransitionLabel('b')); automaton.addLoop(q1, new CharTransitionLabel('b')); automaton.addLoop(q2, new CharTransitionLabel('d')); automaton.addLoop(q3, new CharTransitionLabel('a')); automaton.markAsInitial(q0); automaton.markAsFinal(q4); FixedNumberOfOccurrencesOperator oper = new FixedNumberOfOccurrencesOperator(2); NondeterministicAutomatonByThompsonApproach result = new NondeterministicAutomatonByThompsonApproach( oper.createAutomatonFromOneAutomaton(automaton)); assertTrue(result.accepts("aacdbaacdb")); assertTrue(result.accepts("acbacb")); assertTrue(result.accepts("abbababbab")); assertFalse(result.accepts("aacbc")); assertFalse(result.accepts("aacdb")); assertFalse(result.accepts("acbacbacb")); assertFalse(result.accepts("false")); assertFalse(result.accepts("ManchesterUnited")); } /** * Test 3. Pusty automat. */ public final void testEmptyAutomaton() { AutomatonSpecification automaton = new NaiveAutomatonSpecification(); FixedNumberOfOccurrencesOperator oper = new FixedNumberOfOccurrencesOperator(666); NondeterministicAutomatonByThompsonApproach result = new NondeterministicAutomatonByThompsonApproach( oper.createAutomatonFromOneAutomaton(automaton)); assertFalse(result.accepts("ManchesterUnited")); } /** * Test 4. Automat z trzema stanami. Od początkowego stanu q0 wychodzą dwa * przejścia do stanu do stanu q1 poprzez 'a' i do stanu q2 poprzez 'b'. * Stany q1 i q1 są stanami akceptowalnymi. */ 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); FixedNumberOfOccurrencesOperator oper = new FixedNumberOfOccurrencesOperator(3); NondeterministicAutomatonByThompsonApproach result = new NondeterministicAutomatonByThompsonApproach( oper.createAutomatonFromOneAutomaton(automaton)); assertTrue(result.accepts("aaa")); assertTrue(result.accepts("bba")); assertTrue(result.accepts("aab")); assertFalse(result.accepts("aabb")); assertFalse(result.accepts("ab")); assertFalse(result.accepts("b")); assertFalse(result.accepts("LechPoznan")); } /** * Test 5. Mnożnik n=0. */ public final void testMultiplierEqualsZero() { AutomatonSpecification automaton = new NaiveAutomatonSpecification(); State q0 = automaton.addState(); State q1 = automaton.addState(); automaton.addTransition(q0, q1, new CharTransitionLabel('x')); automaton.markAsInitial(q0); automaton.markAsFinal(q1); FixedNumberOfOccurrencesOperator oper = new FixedNumberOfOccurrencesOperator(0); NondeterministicAutomatonByThompsonApproach result = new NondeterministicAutomatonByThompsonApproach( oper.createAutomatonFromOneAutomaton(automaton)); assertTrue(result.accepts("")); assertFalse(result.accepts("ManchesterUnited")); assertFalse(result.accepts("b")); assertFalse(result.accepts("bbbb")); } /** * Test fabryki. */ public void testFactory() { RegexpOperatorFactory factory = new FixedNumberOfOccurrencesOperator.Factory(); List<String> params = new ArrayList(); params.add("1"); RegexpOperator operator2 = factory.createOperator(params); int arity = operator2.arity(); assertEquals(arity, 1); } }