package pl.edu.amu.wmi.daut.base; import junit.framework.TestCase; /** * Test klasy Determinizer. */ public class TestDeterminizer extends TestCase { /** * Zestaw testow jakimi bedziemy poddawac zdeterminizowany automat. */ public final void setOfTests(AutomatonSpecification nfa, int numberOfStates, int numberOfTransitions, String acceptedWord, String notAcceptedWord) { Determinizer determinizer = new Determinizer(); DeterministicAutomatonSpecification ndfa = new NaiveDeterministicAutomatonSpecification(); determinizer.determinize(nfa, ndfa); if (ndfa.isEmpty()) { //assertFalse(ndfa.isNotEmpty()); //Uzycie tej metody powoduje //"zwieche" mvn przy testowaniu assertTrue(ndfa.isEmpty()); } else { assertTrue(ndfa.isDeterministic()); //assertTrue(ndfa.isNotEmpty()); //J.w. assertFalse(ndfa.isEmpty()); } DeterministicAutomaton dfa = new DeterministicAutomaton(ndfa); if (acceptedWord != null & notAcceptedWord != null) { assertTrue(dfa.accepts(acceptedWord)); assertFalse(dfa.accepts(notAcceptedWord)); } //assertFalse(ndfa.uselessStates()); //Metoda ma bledy -> listOutOfBound assertEquals(ndfa.countTransitions(), numberOfTransitions); assertEquals(ndfa.countStates(), numberOfStates); } /** * Na poczatek pusty automat. */ public final void test1() { AutomatonSpecification nfa = new NaiveAutomatonSpecification(); setOfTests(nfa, 0, 0, null, null); } /** * Deterministyczny automat do determinizacji. */ public final void test2() { AutomatonSpecification nfa = new NaiveAutomatonSpecification(); State q0 = nfa.addState(); State q1 = nfa.addState(); nfa.markAsInitial(q0); nfa.markAsFinal(q1); nfa.addTransition(q0, q1, new CharTransitionLabel('a')); nfa.addLoop(q1, new CharTransitionLabel('b')); setOfTests(nfa, 2, 2, "abbb", "aba"); } /** * Przykladowy nfa. */ public final void test3() { AutomatonSpecification nfa = new NaiveAutomatonSpecification(); State q0 = nfa.addState(); State q1 = nfa.addState(); State q2 = nfa.addState(); nfa.markAsInitial(q0); nfa.markAsFinal(q2); nfa.addLoop(q0, new CharTransitionLabel('0')); nfa.addLoop(q0, new CharTransitionLabel('1')); nfa.addTransition(q0, q1, new CharTransitionLabel('1')); nfa.addTransition(q1, q2, new CharTransitionLabel('0')); nfa.addTransition(q1, q2, new CharTransitionLabel('1')); setOfTests(nfa, 4, 8, "111010", "111101"); } /** * Przykladowy nfa. */ public final void test4() { AutomatonSpecification nfa = new NaiveAutomatonSpecification(); State q0 = nfa.addState(); State q1 = nfa.addState(); State q2 = nfa.addState(); nfa.markAsInitial(q0); nfa.markAsFinal(q2); nfa.addLoop(q0, new CharTransitionLabel('b')); nfa.addLoop(q0, new CharTransitionLabel('c')); nfa.addTransition(q0, q1, new CharTransitionLabel('a')); nfa.addTransition(q1, q2, new CharTransitionLabel('a')); nfa.addTransition(q2, q1, new CharTransitionLabel('b')); nfa.addTransition(q2, q1, new CharTransitionLabel('c')); nfa.addLoop(q2, new CharTransitionLabel('b')); nfa.addLoop(q2, new CharTransitionLabel('c')); setOfTests(nfa, 4, 9, "bccbbcaabccccbcbcbcbcccbcabc", "bcbcbcabcbcbcbcaaccbcbc"); } /** * Przykladowy nfa. */ public final void test5() { AutomatonSpecification nfa = new NaiveAutomatonSpecification(); State q0 = nfa.addState(); State q1 = nfa.addState(); State q2 = nfa.addState(); State q3 = nfa.addState(); nfa.markAsInitial(q0); nfa.markAsFinal(q3); nfa.addTransition(q0, q1, new CharTransitionLabel('a')); nfa.addTransition(q0, q3, new CharTransitionLabel('a')); nfa.addLoop(q1, new CharTransitionLabel('a')); nfa.addTransition(q1, q2, new CharTransitionLabel('b')); nfa.addTransition(q2, q1, new CharTransitionLabel('a')); nfa.addTransition(q2, q3, new CharTransitionLabel('c')); nfa.addLoop(q3, new CharTransitionLabel('c')); setOfTests(nfa, 5, 9, "aabaaaabc", "abbcc"); } /** * Test metody determinize. */ public final void testDeterminize() { test1(); test2(); test3(); test4(); test5(); } }