package pl.edu.amu.wmi.daut.base;
import junit.framework.TestCase;
/**
* Test klasy AutomatonByRecursion.
*/
public class TestAutomatonByRecursion extends TestCase {
/**
* Symulacja testu.
*/
public final void testLessComplicated() {
final AutomatonSpecification spec = new NaiveAutomatonSpecification();
State q0a = spec.addState();
State q1a = spec.addState();
State q2a = spec.addState();
spec.addTransition(q0a, q1a, new CharTransitionLabel('a'));
spec.addTransition(q1a, q2a, new CharTransitionLabel('b'));
spec.addTransition(q0a, q2a, new CharTransitionLabel('c'));
spec.markAsInitial(q0a);
spec.markAsFinal(q2a);
final AutomatonByRecursion automaton = new AutomatonByRecursion(spec);
assertFalse(automaton.accepts("a"));
assertTrue(automaton.accepts("ab"));
assertTrue(automaton.accepts("c"));
assertFalse(automaton.accepts("a"));
}
/**
* Trochę bardziej skomplikowany test.
*/
public final void testComplicated() {
final AutomatonSpecification specA = new NaiveAutomatonSpecification();
State q0A = specA.addState();
State q1A = specA.addState();
State q2A = specA.addState();
State q3A = specA.addState();
specA.addTransition(q0A, q1A, new CharTransitionLabel('a'));
specA.addTransition(q1A, q3A, new CharTransitionLabel('b'));
specA.addTransition(q1A, q2A, new CharTransitionLabel('b'));
specA.addTransition(q0A, q3A, new CharTransitionLabel('b'));
specA.markAsInitial(q0A);
specA.markAsFinal(q3A);
AutomatonByRecursion automatonA = new AutomatonByRecursion(specA);
assertTrue(automatonA.accepts("ab"));
assertFalse(automatonA.accepts("a"));
assertTrue(automatonA.accepts("b"));
assertFalse(automatonA.accepts("a"));
}
/**
* Najbardziej skomplikowany test.
*/
public final void testVeryComplicated() {
final AutomatonSpecification specB = new NaiveAutomatonSpecification();
State q0B = specB.addState();
State q1B = specB.addState();
State q2B = specB.addState();
State q3B = specB.addState();
State q4B = specB.addState();
State q5B = specB.addState();
State q6B = specB.addState();
State q7B = specB.addState();
State q8B = specB.addState();
State q9B = specB.addState();
State q10B = specB.addState();
State q11B = specB.addState();
State q12B = specB.addState();
specB.addTransition(q0B, q1B, new CharTransitionLabel('a'));
specB.addTransition(q1B, q2B, new CharTransitionLabel('b'));
specB.addTransition(q2B, q3B, new CharTransitionLabel('c'));
specB.addTransition(q3B, q4B, new CharTransitionLabel('d'));
specB.addTransition(q3B, q11B, new CharTransitionLabel('d'));
specB.addTransition(q4B, q5B, new CharTransitionLabel('e'));
specB.addTransition(q4B, q7B, new CharTransitionLabel('g'));
specB.addTransition(q4B, q12B, new CharTransitionLabel('z'));
specB.addLoop(q5B, new CharTransitionLabel('f'));
specB.addTransition(q3B, q6B, new CharTransitionLabel('d'));
specB.addTransition(q6B, q9B, new CharTransitionLabel('e'));
specB.addTransition(q7B, q8B, new EpsilonTransitionLabel());
specB.addTransition(q9B, q10B, new CharTransitionLabel('f'));
specB.addLoop(q10B, new CharTransitionLabel('g'));
specB.addTransition(q12B, q11B, new EpsilonTransitionLabel());
specB.addTransition(q8B, q9B, new CharTransitionLabel('g'));
specB.addTransition(q10B, q11B, new CharTransitionLabel('h'));
specB.markAsInitial(q0B);
specB.markAsFinal(q11B);
AutomatonByRecursion automatonB = new AutomatonByRecursion(specB);
assertTrue(automatonB.accepts("abcd"));
assertTrue(automatonB.accepts("abcdefgh"));
assertTrue(automatonB.accepts("abcdefgggh"));
assertFalse(automatonB.accepts("abcdggfh"));
assertTrue(automatonB.accepts("abcdefgh"));
assertFalse(automatonB.accepts("abcdg"));
assertTrue(automatonB.accepts("abcd"));
assertFalse(automatonB.accepts("abcdz"));
assertTrue(automatonB.accepts("abcd"));
assertFalse(automatonB.accepts("abcdggfh"));
}
/**
* Automat rozpoznający godziny I.
* Automat: automat deterministyczny (bądź niedeterministyczny)
* (ale bez epsilon-przejść) akceptujący napisy reprezentujące zapis
* godziny, gdzie dwukropek jest separatorem godziny i minuty, na
* początku napisu może występować '0', przykładowe napisy, które
* powinny być akceptowane: 11:11, 23:59, 0:00, 3:45, 03:45, 15:45, 12:00
*/
public final void testAutomatClock1() {
final AutomatonSpecification specClock1 = new NaiveAutomatonSpecification();
State q0 = specClock1.addState();
State q1A = specClock1.addState();
State q1B = specClock1.addState();
State q1C = specClock1.addState();
State q2 = specClock1.addState();
State q3 = specClock1.addState();
State q4 = specClock1.addState();
State q5 = specClock1.addState();
State qZ = specClock1.addState();
specClock1.addTransition(q0, q1A, new CharTransitionLabel('0'));
specClock1.addTransition(q0, q1B, new CharTransitionLabel('1'));
specClock1.addTransition(q0, q1C, new CharTransitionLabel('2'));
specClock1.addTransition(q0, q2, new CharTransitionLabel('3'));
specClock1.addTransition(q0, q2, new CharTransitionLabel('4'));
specClock1.addTransition(q0, q2, new CharTransitionLabel('5'));
specClock1.addTransition(q0, q2, new CharTransitionLabel('6'));
specClock1.addTransition(q0, q2, new CharTransitionLabel('7'));
specClock1.addTransition(q0, q2, new CharTransitionLabel('8'));
specClock1.addTransition(q0, q2, new CharTransitionLabel('9'));
specClock1.addTransition(q1A, q2, new CharTransitionLabel('0'));
specClock1.addTransition(q1A, q2, new CharTransitionLabel('1'));
specClock1.addTransition(q1A, q2, new CharTransitionLabel('2'));
specClock1.addTransition(q1A, q2, new CharTransitionLabel('3'));
specClock1.addTransition(q1A, q2, new CharTransitionLabel('4'));
specClock1.addTransition(q1A, q2, new CharTransitionLabel('5'));
specClock1.addTransition(q1A, q2, new CharTransitionLabel('6'));
specClock1.addTransition(q1A, q2, new CharTransitionLabel('7'));
specClock1.addTransition(q1A, q2, new CharTransitionLabel('8'));
specClock1.addTransition(q1A, q2, new CharTransitionLabel('9'));
specClock1.addTransition(q1B, q2, new CharTransitionLabel('0'));
specClock1.addTransition(q1B, q2, new CharTransitionLabel('1'));
specClock1.addTransition(q1B, q2, new CharTransitionLabel('2'));
specClock1.addTransition(q1B, q2, new CharTransitionLabel('3'));
specClock1.addTransition(q1B, q2, new CharTransitionLabel('4'));
specClock1.addTransition(q1B, q2, new CharTransitionLabel('5'));
specClock1.addTransition(q1B, q2, new CharTransitionLabel('6'));
specClock1.addTransition(q1B, q2, new CharTransitionLabel('7'));
specClock1.addTransition(q1B, q2, new CharTransitionLabel('8'));
specClock1.addTransition(q1B, q2, new CharTransitionLabel('9'));
specClock1.addTransition(q1C, q2, new CharTransitionLabel('0'));
specClock1.addTransition(q1C, q2, new CharTransitionLabel('1'));
specClock1.addTransition(q1C, q2, new CharTransitionLabel('2'));
specClock1.addTransition(q1C, q2, new CharTransitionLabel('3'));
specClock1.addTransition(q2, q3, new CharTransitionLabel(':'));
specClock1.addTransition(q1A, q3, new CharTransitionLabel(':'));
specClock1.addTransition(q1B, q3, new CharTransitionLabel(':'));
specClock1.addTransition(q1C, q3, new CharTransitionLabel(':'));
specClock1.addTransition(q3, q4, new CharTransitionLabel('0'));
specClock1.addTransition(q3, q4, new CharTransitionLabel('1'));
specClock1.addTransition(q3, q4, new CharTransitionLabel('2'));
specClock1.addTransition(q3, q4, new CharTransitionLabel('3'));
specClock1.addTransition(q3, q4, new CharTransitionLabel('4'));
specClock1.addTransition(q3, q4, new CharTransitionLabel('5'));
specClock1.addTransition(q4, q5, new CharTransitionLabel('0'));
specClock1.addTransition(q4, q5, new CharTransitionLabel('1'));
specClock1.addTransition(q4, q5, new CharTransitionLabel('2'));
specClock1.addTransition(q4, q5, new CharTransitionLabel('3'));
specClock1.addTransition(q4, q5, new CharTransitionLabel('4'));
specClock1.addTransition(q4, q5, new CharTransitionLabel('5'));
specClock1.addTransition(q4, q5, new CharTransitionLabel('6'));
specClock1.addTransition(q4, q5, new CharTransitionLabel('7'));
specClock1.addTransition(q4, q5, new CharTransitionLabel('8'));
specClock1.addTransition(q4, q5, new CharTransitionLabel('9'));
specClock1.markAsInitial(q0);
specClock1.markAsFinal(q5);
AutomatonByRecursion automatonClock = new AutomatonByRecursion(specClock1);
assertTrue(automatonClock.accepts("11:11"));
assertTrue(automatonClock.accepts("23:59"));
assertTrue(automatonClock.accepts("0:00"));
assertTrue(automatonClock.accepts("3:45"));
assertTrue(automatonClock.accepts("03:45"));
assertTrue(automatonClock.accepts("15:45"));
assertTrue(automatonClock.accepts("12:00"));
assertTrue(automatonClock.accepts("00:00"));
assertTrue(automatonClock.accepts("19:45"));
assertTrue(automatonClock.accepts("1:00"));
assertTrue(automatonClock.accepts("20:59"));
assertFalse(automatonClock.accepts("40:10"));
assertFalse(automatonClock.accepts("10:60"));
assertFalse(automatonClock.accepts("24:10"));
assertFalse(automatonClock.accepts("0:1:0"));
assertFalse(automatonClock.accepts(":3:10"));
assertFalse(automatonClock.accepts("1:10-"));
assertFalse(automatonClock.accepts("2,10"));
assertFalse(automatonClock.accepts("25:10"));
assertFalse(automatonClock.accepts(""));
assertFalse(automatonClock.accepts("\n"));
assertFalse(automatonClock.accepts(":::::"));
assertFalse(automatonClock.accepts("666666"));
assertFalse(automatonClock.accepts("true"));
}
/**
* Automat akceptujący napis pusty oraz napis "ćma".
*/
public final void testMoth() {
final AutomatonSpecification spec = new NaiveAutomatonSpecification();
State q0a = spec.addState();
State q1a = spec.addState();
State q2a = spec.addState();
spec.addTransition(q0a, q1a, new CharTransitionLabel('ć'));
spec.addTransition(q1a, q2a, new CharTransitionLabel('m'));
spec.addTransition(q2a, q0a, new CharTransitionLabel('a'));
spec.markAsInitial(q0a);
spec.markAsFinal(q0a);
final AutomatonByRecursion automaton = new AutomatonByRecursion(spec);
assertFalse(automaton.accepts("ć"));
assertFalse(automaton.accepts("ćm"));
assertFalse(automaton.accepts("ćć"));
assertTrue(automaton.accepts("ćma"));
assertTrue(automaton.accepts(""));
}
}