package pl.edu.amu.wmi.daut.base; import java.util.HashSet; import java.util.Arrays; import junit.framework.TestCase; /** * Test klasy AutomatonStack. */ public class TestAutomatonByStack extends TestCase { /** * Test Kamil Sieron.. */ public final void testEmptyWordOrTwoOrThreeA() { final AutomatonSpecification spec = new NaiveAutomatonSpecification(); State q0a = spec.addState(); State q1a = spec.addState(); State q2a = spec.addState(); State q3a = spec.addState(); spec.addTransition(q0a, q1a, new CharTransitionLabel('a')); spec.addTransition(q1a, q2a, new CharTransitionLabel('a')); spec.addTransition(q2a, q3a, new CharTransitionLabel('a')); spec.markAsInitial(q0a); spec.markAsFinal(q0a); spec.markAsFinal(q2a); spec.markAsFinal(q3a); final AutomatonByStack automaton = new AutomatonByStack(spec); assertTrue(automaton.accepts("")); assertTrue(automaton.accepts("aa")); assertTrue(automaton.accepts("aaa")); assertFalse(automaton.accepts("a")); assertFalse(automaton.accepts("aaaa")); assertFalse(automaton.accepts("aaaaaaaaaaaa")); } /** * Pierwszy test. */ public final void test1() { final AutomatonSpecification spec = new NaiveAutomatonSpecification(); State q0a = spec.addState(); State q1a = spec.addState(); State q2a = spec.addState(); State q3a = spec.addState(); State q4a = spec.addState(); State q5a = spec.addState(); spec.addTransition(q0a, q1a, new CharTransitionLabel('a')); spec.addLoop(q0a, new CharTransitionLabel('a')); spec.addLoop(q0a, new CharTransitionLabel('b')); spec.addLoop(q0a, new CharTransitionLabel('c')); spec.addTransition(q1a, q3a, new CharTransitionLabel('b')); spec.addLoop(q1a, new CharTransitionLabel('a')); spec.addLoop(q1a, new CharTransitionLabel('b')); spec.addLoop(q1a, new CharTransitionLabel('c')); spec.addTransition(q0a, q2a, new CharTransitionLabel('c')); spec.addTransition(q2a, q4a, new CharTransitionLabel('a')); spec.addTransition(q2a, q4a, new CharTransitionLabel('b')); spec.addTransition(q2a, q4a, new CharTransitionLabel('c')); spec.addTransition(q4a, q5a, new CharTransitionLabel('a')); spec.addLoop(q4a, new CharTransitionLabel('a')); spec.addLoop(q4a, new CharTransitionLabel('b')); spec.addLoop(q4a, new CharTransitionLabel('c')); spec.markAsInitial(q0a); spec.markAsFinal(q3a); spec.markAsFinal(q5a); final AutomatonByStack automaton = new AutomatonByStack(spec); assertTrue(automaton.accepts("aaaaaaaaaabbbbbbb")); assertTrue(automaton.accepts("ccccccabbbbb")); assertTrue(automaton.accepts("ccccccccccccccccccccccccccccaba")); assertTrue(automaton.accepts("bbbbbbbcabbbbbbba")); assertFalse(automaton.accepts("bbbbbbbbaaaaac")); assertFalse(automaton.accepts("cccccccccabbbbbbc")); assertFalse(automaton.accepts("aaaaaaacbaaaaabc")); assertFalse(automaton.accepts("bbbbbbccbbbbbbc")); } /** *Drugi test. */ public final void test2() { final AutomatonSpecification spec = new NaiveAutomatonSpecification(); State q0a = spec.addState(); State q1a = spec.addState(); State q2a = spec.addState(); State q3a = spec.addState(); State q4a = spec.addState(); spec.addTransition(q0a, q1a, new CharTransitionLabel('a')); spec.addTransition(q0a, q1a, new CharTransitionLabel('b')); spec.addTransition(q1a, q3a, new CharTransitionLabel('a')); spec.addTransition(q1a, q3a, new CharTransitionLabel('c')); spec.addTransition(q0a, q2a, new CharTransitionLabel('c')); spec.addTransition(q1a, q2a, new CharTransitionLabel('b')); spec.addTransition(q3a, q2a, new CharTransitionLabel('b')); spec.addTransition(q2a, q4a, new CharTransitionLabel('a')); spec.addTransition(q2a, q4a, new CharTransitionLabel('b')); spec.addLoop(q0a, new CharTransitionLabel('a')); spec.addLoop(q1a, new CharTransitionLabel('c')); spec.addLoop(q1a, new CharTransitionLabel('b')); spec.addLoop(q3a, new CharTransitionLabel('a')); spec.addLoop(q3a, new CharTransitionLabel('b')); spec.addLoop(q2a, new CharTransitionLabel('a')); spec.addLoop(q2a, new CharTransitionLabel('b')); spec.addLoop(q2a, new CharTransitionLabel('c')); spec.markAsInitial(q0a); spec.markAsFinal(q4a); final AutomatonByStack automaton = new AutomatonByStack(spec); assertTrue(automaton.accepts("aaaabcccbcbcbababababbcccca")); assertTrue(automaton.accepts("aaaaabccccbbbcbcbcbccbabababcbca")); assertTrue(automaton.accepts("aaaaaaaaacabcabcabcabcabccccccb")); assertTrue(automaton.accepts("aaaaaaaaaaaaaabbbbbbbbbbbbbb")); assertFalse(automaton.accepts("bbacbaccbbaabccabc")); assertFalse(automaton.accepts("aaabcbcbcbbccbabcabccc")); assertFalse(automaton.accepts("aaacacbcbaabc")); assertFalse(automaton.accepts("cccccccccccccccccccccccc")); } /** *Test trzeci. */ public final void test3() { final AutomatonSpecification spec = new NaiveAutomatonSpecification(); State q0a = spec.addState(); State q1a = spec.addState(); State q2a = spec.addState(); State q3a = spec.addState(); State q4a = spec.addState(); State q5a = spec.addState(); State q6a = spec.addState(); State q7a = spec.addState(); State q8a = spec.addState(); spec.addTransition(q0a, q1a, new CharTransitionLabel('a')); spec.addTransition(q0a, q1a, new CharTransitionLabel('e')); spec.addTransition(q0a, q2a, new CharTransitionLabel('b')); spec.addTransition(q0a, q2a, new CharTransitionLabel('c')); spec.addTransition(q0a, q3a, new CharTransitionLabel('c')); spec.addTransition(q0a, q3a, new CharTransitionLabel('d')); spec.addTransition(q1a, q4a, new CharTransitionLabel('e')); spec.addTransition(q3a, q4a, new CharTransitionLabel('c')); spec.addTransition(q4a, q5a, new CharTransitionLabel('e')); spec.addTransition(q4a, q6a, new CharTransitionLabel('d')); spec.addTransition(q4a, q7a, new CharTransitionLabel('c')); spec.addTransition(q4a, q7a, new CharTransitionLabel('a')); spec.addTransition(q6a, q7a, new CharTransitionLabel('e')); spec.addTransition(q7a, q6a, new CharTransitionLabel('b')); spec.addTransition(q7a, q8a, new CharTransitionLabel('a')); spec.addTransition(q7a, q8a, new CharTransitionLabel('d')); spec.addLoop(q0a, new CharTransitionLabel('c')); spec.addLoop(q0a, new CharTransitionLabel('d')); spec.addLoop(q0a, new CharTransitionLabel('e')); spec.addLoop(q1a, new CharTransitionLabel('b')); spec.addLoop(q3a, new CharTransitionLabel('d')); spec.addLoop(q3a, new CharTransitionLabel('a')); spec.addLoop(q4a, new CharTransitionLabel('a')); spec.addLoop(q4a, new CharTransitionLabel('b')); spec.addLoop(q4a, new CharTransitionLabel('e')); spec.addLoop(q6a, new CharTransitionLabel('a')); spec.addLoop(q6a, new CharTransitionLabel('e')); spec.addLoop(q6a, new CharTransitionLabel('c')); spec.addLoop(q7a, new CharTransitionLabel('b')); spec.addLoop(q7a, new CharTransitionLabel('a')); spec.markAsInitial(q0a); spec.markAsFinal(q2a); spec.markAsFinal(q5a); spec.markAsFinal(q8a); final AutomatonByStack automaton = new AutomatonByStack(spec); assertTrue(automaton.accepts("cdedceeddceabbbbbbbeabeebaebdaeeaecceceebababababbbbaad")); assertTrue(automaton.accepts("cdeeddceeeddcedecededececededcedecdecededceb")); assertTrue(automaton.accepts("edcecdedcedcedcedcedcedcecdddaaaadddaaadadadadacabbeaaaee")); assertTrue(automaton.accepts("edececdecececedceabbbbeaaaabbbeeaeaeacabbbababd")); assertFalse(automaton.accepts("cdecdecedececabbbbbeeaaac")); assertFalse(automaton.accepts("aaaabdcedbcadecbadecabdbbbdddaecbaecdbeacdbecaecb")); assertFalse(automaton.accepts("cdecdecedecccdadaadceebaababaeb")); assertFalse(automaton.accepts("dcddcececdabbbeababababdaeeeaccedbc")); } /** * Test czwarty. */ public final void test4() { final AutomatonSpecification spec = new NaiveAutomatonSpecification(); State q0a = spec.addState(); State q1a = spec.addState(); State q2a = spec.addState(); State q3a = spec.addState(); State q4a = spec.addState(); State q5a = spec.addState(); State q6a = spec.addState(); State q7a = spec.addState(); spec.addTransition(q0a, q1a, new CharTransitionLabel('c')); spec.addTransition(q0a, q2a, new CharTransitionLabel('a')); spec.addTransition(q0a, q2a, new CharTransitionLabel('b')); spec.addTransition(q2a, q3a, new CharTransitionLabel('c')); spec.addTransition(q2a, q4a, new CharTransitionLabel('a')); spec.addTransition(q4a, q5a, new CharTransitionLabel('b')); spec.addTransition(q4a, q6a, new CharTransitionLabel('a')); spec.addTransition(q6a, q7a, new CharTransitionLabel('a')); spec.addLoop(q0a, new CharTransitionLabel('a')); spec.addLoop(q0a, new CharTransitionLabel('b')); spec.addLoop(q0a, new CharTransitionLabel('c')); spec.addLoop(q2a, new CharTransitionLabel('a')); spec.addLoop(q2a, new CharTransitionLabel('b')); spec.addLoop(q2a, new CharTransitionLabel('c')); spec.addLoop(q4a, new CharTransitionLabel('a')); spec.addLoop(q6a, new CharTransitionLabel('c')); spec.markAsInitial(q0a); spec.markAsFinal(q1a); spec.markAsFinal(q3a); spec.markAsFinal(q5a); spec.markAsFinal(q7a); final AutomatonByStack automaton = new AutomatonByStack(spec); assertTrue(automaton.accepts("ababababababababababbc")); assertTrue(automaton.accepts("abccbacabcbabacabbaacacbc")); assertTrue(automaton.accepts("aaaaaaaaaaaaaaaaaaca")); assertTrue(automaton.accepts("bbbbbababababababababaaca")); assertFalse(automaton.accepts("abcabcabcaabcccbacaacb")); assertFalse(automaton.accepts("abcaaabbbcccaacb")); assertFalse(automaton.accepts("aaabccbcaabccbaaaaaaaacb")); assertFalse(automaton.accepts("abababababababababababababababacb")); } /** *Test piaty. */ public final void test5() { final AutomatonSpecification spec = new NaiveAutomatonSpecification(); State q0a = spec.addState(); State q1a = spec.addState(); State q2a = spec.addState(); State q3a = spec.addState(); State q4a = spec.addState(); State q5a = spec.addState(); State q6a = spec.addState(); State q7a = spec.addState(); State q8a = spec.addState(); State q9a = spec.addState(); State q10a = spec.addState(); State q11a = spec.addState(); State q12a = spec.addState(); State q13a = spec.addState(); State q14a = spec.addState(); State q15a = spec.addState(); spec.addTransition(q0a, q1a, new CharTransitionLabel('b')); spec.addTransition(q0a, q1a, new CharTransitionLabel('d')); spec.addLoop(q0a, new CharTransitionLabel('a')); spec.addLoop(q0a, new CharTransitionLabel('c')); spec.addTransition(q1a, q2a, new CharTransitionLabel('e')); spec.addTransition(q1a, q3a, new CharTransitionLabel('d')); spec.addLoop(q1a, new CharTransitionLabel('a')); spec.addLoop(q1a, new CharTransitionLabel('b')); spec.addLoop(q1a, new CharTransitionLabel('c')); spec.addTransition(q2a, q5a, new CharTransitionLabel('a')); spec.addTransition(q2a, q5a, new CharTransitionLabel('b')); spec.addLoop(q2a, new CharTransitionLabel('c')); spec.addTransition(q3a, q4a, new CharTransitionLabel('b')); spec.addTransition(q3a, q7a, new CharTransitionLabel('a')); spec.addLoop(q3a, new CharTransitionLabel('g')); spec.addLoop(q3a, new CharTransitionLabel('f')); spec.addTransition(q4a, q2a, new CharTransitionLabel('g')); spec.addLoop(q4a, new CharTransitionLabel('b')); spec.addLoop(q4a, new CharTransitionLabel('a')); spec.addTransition(q5a, q6a, new CharTransitionLabel('c')); spec.addTransition(q5a, q12a, new CharTransitionLabel('g')); spec.addLoop(q5a, new CharTransitionLabel('g')); spec.addLoop(q5a, new CharTransitionLabel('f')); spec.addTransition(q6a, q8a, new CharTransitionLabel('b')); spec.addTransition(q6a, q12a, new CharTransitionLabel('b')); spec.addTransition(q6a, q13a, new CharTransitionLabel('a')); spec.addLoop(q6a, new CharTransitionLabel('d')); spec.addLoop(q6a, new CharTransitionLabel('a')); spec.addTransition(q7a, q10a, new CharTransitionLabel('b')); spec.addTransition(q7a, q8a, new CharTransitionLabel('d')); spec.addLoop(q7a, new CharTransitionLabel('b')); spec.addTransition(q8a, q9a, new CharTransitionLabel('d')); spec.addLoop(q8a, new CharTransitionLabel('a')); spec.addLoop(q8a, new CharTransitionLabel('f')); spec.addTransition(q9a, q11a, new CharTransitionLabel('a')); spec.addTransition(q9a, q13a, new CharTransitionLabel('b')); spec.addLoop(q9a, new CharTransitionLabel('a')); spec.addLoop(q9a, new CharTransitionLabel('b')); spec.addTransition(q12a, q14a, new CharTransitionLabel('g')); spec.addLoop(q12a, new CharTransitionLabel('c')); spec.addLoop(q12a, new CharTransitionLabel('d')); spec.addTransition(q13a, q15a, new CharTransitionLabel('f')); spec.addLoop(q13a, new CharTransitionLabel('f')); spec.addLoop(q13a, new CharTransitionLabel('d')); spec.markAsInitial(q0a); spec.markAsFinal(q10a); spec.markAsFinal(q11a); spec.markAsFinal(q15a); spec.markAsFinal(q14a); final AutomatonByStack automaton = new AutomatonByStack(spec); assertTrue(automaton.accepts("ccaacababccbadgffgfgabbbbb")); assertTrue(automaton.accepts("aaaabaaaaecccafggfcdadadadaddddff")); assertFalse(automaton.accepts("accacaccdccccbfggfcdaaaddabaffafaadaabbababa")); assertFalse(automaton.accepts("ccccccdccccbggggccccccg")); assertFalse(automaton.accepts("cacacacbbbbdggggabbbbc")); assertFalse(automaton.accepts("cacacacbabccbadfggfabbbbdaaffadaaaabababc")); assertFalse(automaton.accepts("cacacadccccabbagfgcddaadadfffa")); assertFalse(automaton.accepts("ccacacdddcccccccfadgdcabbcccfggfbaca")); } /** * Szosty test. */ public final void test6() { final AutomatonSpecification spec = new NaiveAutomatonSpecification(); State q0a = spec.addState(); State q1a = spec.addState(); State q2a = spec.addState(); State q3a = spec.addState(); spec.addTransition(q0a, q1a, new CharTransitionLabel('a')); spec.addTransition(q1a, q3a, new CharTransitionLabel('b')); spec.addTransition(q2a, q1a, new CharTransitionLabel('c')); spec.addTransition(q0a, q2a, new CharTransitionLabel('b')); spec.addTransition(q2a, q3a, new CharTransitionLabel('a')); spec.addLoop(q0a, new CharTransitionLabel('a')); spec.addLoop(q0a, new CharTransitionLabel('b')); spec.addLoop(q0a, new CharTransitionLabel('c')); spec.addLoop(q1a, new CharTransitionLabel('a')); spec.addLoop(q1a, new CharTransitionLabel('c')); spec.addLoop(q2a, new CharTransitionLabel('b')); spec.addLoop(q3a, new CharTransitionLabel('a')); spec.addLoop(q3a, new CharTransitionLabel('b')); spec.markAsInitial(q0a); spec.markAsFinal(q3a); final AutomatonByStack automaton = new AutomatonByStack(spec); assertTrue(automaton.accepts("ab")); assertTrue(automaton.accepts("ba")); assertTrue(automaton.accepts("bcb")); assertTrue(automaton.accepts("aabcbab")); assertFalse(automaton.accepts("")); assertFalse(automaton.accepts("aabcbabababc")); assertFalse(automaton.accepts("bcaca")); assertFalse(automaton.accepts("acca")); } /** * Siodmy test #362. */ public final void test7() { final AutomatonSpecification spec = new NaiveAutomatonSpecification(); HashSet<Character> separator = new HashSet<Character>(Arrays.asList('.', ':')); HashSet<Character> digit0to3 = new HashSet<Character>(Arrays.asList('0', '1', '2', '3')); HashSet<Character> digit0to5 = new HashSet<Character>(Arrays.asList('0', '1', '2', '3', '4', '5')); HashSet<Character> digit0to9 = new HashSet<Character>(Arrays.asList('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')); HashSet<Character> digit3to9 = new HashSet<Character>(Arrays.asList('3', '4', '5', '6', '7', '8', '9')); State q0 = spec.addState(); State q1 = spec.addState(); State q2 = spec.addState(); State q3 = spec.addState(); State q4 = spec.addState(); State q5 = spec.addState(); State q6 = spec.addState(); State q7 = spec.addState(); State q8 = spec.addState(); State q9 = spec.addState(); spec.addTransition(q0, q1, new CharTransitionLabel('0')); spec.addTransition(q0, q3, new CharTransitionLabel('1')); spec.addTransition(q0, q5, new CharTransitionLabel('2')); spec.addTransition(q1, q2, new CharSetTransitionLabel(separator)); spec.addTransition(q3, q2, new CharSetTransitionLabel(separator)); spec.addTransition(q4, q2, new CharSetTransitionLabel(separator)); spec.addTransition(q5, q2, new CharSetTransitionLabel(separator)); spec.addTransition(q6, q2, new CharSetTransitionLabel(separator)); spec.addTransition(q9, q2, new CharSetTransitionLabel(separator)); spec.addTransition(q5, q6, new CharSetTransitionLabel(digit0to3)); spec.addTransition(q2, q7, new CharSetTransitionLabel(digit0to5)); spec.addTransition(q3, q4, new CharSetTransitionLabel(digit0to9)); spec.addTransition(q7, q8, new CharSetTransitionLabel(digit0to9)); spec.addTransition(q0, q9, new CharSetTransitionLabel(digit3to9)); spec.markAsInitial(q0); spec.markAsFinal(q8); final AutomatonByStack automaton = new AutomatonByStack(spec); assertTrue(automaton.accepts("0:00")); assertTrue(automaton.accepts("5:01")); assertTrue(automaton.accepts("2:01")); assertTrue(automaton.accepts("1.11")); assertTrue(automaton.accepts("12:59")); assertTrue(automaton.accepts("23:08")); assertTrue(automaton.accepts("0.59")); assertFalse(automaton.accepts("03:22")); assertFalse(automaton.accepts("24:13")); assertFalse(automaton.accepts("1:69")); assertFalse(automaton.accepts("23:591")); assertFalse(automaton.accepts("")); assertFalse(automaton.accepts("1")); assertFalse(automaton.accepts("1:1")); assertFalse(automaton.accepts("00:00")); } }