package pl.edu.amu.wmi.daut.base;
import junit.framework.TestCase;
import java.util.List;
/**
* Przykładowe testy przykładowej klasy NaiveAutomatonSpecification.
*/
public class TestNotNaiveAutomatonSpecification extends TestCase {
/**
* Tworzymy prosty 3 stanowy automat.
* Testujemy na nim wszystkie polecenia podobnie
* jak na NaiveAutomaton
*/
public final void testSimpleAutomaton() {
NotNaiveAutomatonSpecification spec = new NotNaiveAutomatonSpecification();
State s0 = spec.addState();
State s1 = spec.addState();
spec.addTransition(s0, s1, new CharTransitionLabel('a'));
State s2 = spec.addState();
spec.addTransition(s0, s2, new CharTransitionLabel('b'));
spec.addTransition(s1, s2, new CharTransitionLabel('c'));
spec.markAsInitial(s0);
spec.markAsFinal(s2);
State r0 = spec.getInitialState();
assertFalse(spec.isFinal(r0));
List<OutgoingTransition> r0Outs = spec.allOutgoingTransitions(r0);
assertEquals(r0Outs.size(), 2);
State r1;
State r2;
if (((CharTransitionLabel) r0Outs.get(0).getTransitionLabel()).getChar() == 'a') {
r1 = r0Outs.get(0).getTargetState();
r2 = r0Outs.get(1).getTargetState();
assertEquals(((CharTransitionLabel)
r0Outs.get(1).getTransitionLabel()).getChar(), 'b');
assertTrue(
((CharTransitionLabel)
r0Outs.get(1).getTransitionLabel()).canAcceptCharacter('b'));
assertFalse(
((CharTransitionLabel)
r0Outs.get(1).getTransitionLabel()).canAcceptCharacter('c'));
assertFalse(((CharTransitionLabel) r0Outs.get(1).getTransitionLabel()).canBeEpsilon());
} else {
r1 = r0Outs.get(1).getTargetState();
r2 = r0Outs.get(0).getTargetState();
assertEquals(((CharTransitionLabel) r0Outs.get(0).getTransitionLabel()).getChar(), 'b');
}
assertFalse(spec.isFinal(r1));
assertTrue(spec.isFinal(r2));
assertSame(r0, spec.getInitialState());
assertNotSame(r0, r1);
assertNotSame(r0, r2);
assertNotSame(r1, r2);
List<State> states = spec.allStates();
assertEquals(states.size(), 3);
State x0 = spec.getInitialState();
List<OutgoingTransition> x0Outs = spec.getOutReturnOutgoingTransitions(x0);
assertEquals(x0Outs.size(), 2);
}
/**
* Test metody dopełniającej automat na automacie, któremu brakuje jednego przejścia.
*/
public final void testMakeFullAlmostFull() {
NotNaiveAutomatonSpecification spec = new NotNaiveAutomatonSpecification();
State s0 = spec.addState();
State s1 = spec.addState();
State s2 = spec.addState();
spec.addTransition(s0, s1, new CharTransitionLabel('a'));
spec.addLoop(s1, new CharTransitionLabel('a'));
spec.addLoop(s1, new CharTransitionLabel('b'));
spec.addLoop(s2, new CharTransitionLabel('a'));
spec.addLoop(s2, new CharTransitionLabel('b'));
spec.makeFull("ab");
assertEquals(spec.countStates(), 4);
assertTrue(spec.isFull("ab"));
}
/**
* Test metody testUnmark.
*/
public final void testUnmark() {
final AutomatonSpecification spec = new NaiveAutomatonSpecification();
//Test 1
State q0a = spec.addState();
State q1a = spec.addState();
spec.addTransition(q1a, q0a, new CharTransitionLabel(' '));
spec.markAsFinal(q1a);
spec.markAsInitial(q0a);
spec.unmarkAsFinalState(q1a);
assertFalse(spec.isFinal(q1a));
//test 2
State q0b = spec.addState();
State q1b = spec.addState();
spec.addTransition(q1b, q0b, new CharTransitionLabel(' '));
spec.markAsFinal(q0b);
spec.markAsInitial(q1b);
spec.unmarkAsFinalState(q1b);
assertTrue(spec.isFinal(q0b));
//test 3
State q0c = spec.addState();
State q1c = spec.addState();
State q2c = spec.addState();
State q3c = spec.addState();
State q4c = spec.addState();
State q5c = spec.addState();
spec.addTransition(q0c, q2c, new CharTransitionLabel('a'));
spec.addTransition(q3c, q4c, new CharTransitionLabel('a'));
spec.addTransition(q1c, q5c, new CharTransitionLabel('a'));
spec.markAsFinal(q5c);
spec.markAsInitial(q0c);
spec.unmarkAsFinalState(q5c);
assertFalse(spec.isFinal(q0c));
spec.markAsFinal(q1c);
spec.markAsInitial(q3c);
spec.unmarkAsFinalState(q3c);
assertTrue(spec.isFinal(q1c));
}
}