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 pl.edu.amu.wmi.daut.re.ConcatenationOperator.Factory; /** * Test klasy ConcatenationOperator. */ public class TestConcatenationOperator extends TestCase { /** * Pierwszy automat akceptuje wyrażenia mające co najmniej jedno "b". * Drugi akceptuje słowa z dokładnie dwoma "c" i dowolną ilością "a". * Powstały ma akceptować ich konkatenację. */ public final void testCreateAutomatonFromTwoAutomata() { AutomatonSpecification a1 = new NaiveAutomatonSpecification(); State q0 = a1.addState(); State q1 = a1.addState(); a1.addTransition(q0, q1, new CharTransitionLabel('b')); a1.addLoop(q0, new CharTransitionLabel('a')); a1.addLoop(q1, new CharTransitionLabel('b')); a1.addLoop(q1, new CharTransitionLabel('a')); a1.markAsInitial(q0); a1.markAsFinal(q1); AutomatonSpecification a2 = new NaiveAutomatonSpecification(); State q0c = a2.addState(); State q1c = a2.addState(); State q2c = a2.addState(); a2.addTransition(q0c, q1c, new CharTransitionLabel('c')); a2.addTransition(q1c, q2c, new CharTransitionLabel('c')); a2.addLoop(q0c, new CharTransitionLabel('a')); a2.addLoop(q1c, new CharTransitionLabel('a')); a2.addLoop(q2c, new CharTransitionLabel('a')); a2.markAsInitial(q0c); a2.markAsFinal(q2c); ConcatenationOperator con = new ConcatenationOperator(); NondeterministicAutomatonByThompsonApproach result = new NondeterministicAutomatonByThompsonApproach( con.createAutomatonFromTwoAutomata(a1, a2)); assertTrue(result.accepts("abbbaaaacc")); assertTrue(result.accepts("ababababcaaaaaac")); assertTrue(result.accepts("aaaaaaaaaaaabaaaaaacaaaaaacaaaaa")); assertTrue(result.accepts("bcc")); assertFalse(result.accepts("aabaaba")); assertFalse(result.accepts("abbca")); assertFalse(result.accepts("aaaacc")); assertFalse(result.accepts("")); assertFalse(result.accepts("cokolwiek")); assertFalse(result.accepts("bbaccab")); assertFalse(result.accepts("ccabba")); } /** * Test fabryki operatora. */ public final void testFactory() { Factory factory = new Factory(); ArrayList<String> params = new ArrayList<String>(); assertEquals(factory.createOperator(params).getClass(), new ConcatenationOperator().getClass()); } }