package esl.cuenet.source.selection;
import esl.cuenet.source.selection.impl.NFATImpl;
import org.junit.Test;
public class StringNFATest {
@Test
public void doTest() {
State[] states = NFATImpl.constructStates(new String[]{"q0", "q1", "q2", "q3", "q4"});
NFATImpl nfa = new NFATImpl(states);
nfa.addTransition(states[0], states[1], 'a');
nfa.addTransition(states[1], states[2], 'b');
nfa.addTransition(states[2], states[4], 'c');
nfa.addTransition(states[4], states[0], 'd');
nfa.addTransition(states[2], states[3], NFATImpl.EPSILON);
nfa.markAsStartState(states[0]);
nfa.markAsFinalState(states[3]);
//FALSE
test("abcdab", nfa);
test("ab", nfa);
//TRUE
test("abc", nfa);
}
public void test(String test, NFAT nfa) {
System.out.println(test + " " + nfa.match(test));
}
@Test
public void doTest2() {
State[] states = NFATImpl.constructStates(new String[]{"q0", "q1", "q2", "q3", "q4", "q5"});
NFATImpl nfa = new NFATImpl(states);
nfa.addTransition(states[0], states[1], 'a');
nfa.addTransition(states[0], states[2], 'a');
nfa.addTransition(states[1], states[3], 'b');
nfa.addTransition(states[3], states[4], 'a');
nfa.addTransition(states[4], states[1], 'b');
nfa.addTransition(states[2], states[5], 'b');
nfa.addTransition(states[5], states[2], 'a');
nfa.markAsStartState(states[0]);
nfa.markAsFinalState(states[1]);
nfa.markAsFinalState(states[2]);
//TRUE
test("a", nfa);
test("abab", nfa);
test("ababa", nfa);
test("abababa", nfa);
//FALSE
test("aaa", nfa);
test("abb", nfa);
}
@Test
public void testEpsilons() {
State[] states = NFATImpl.constructStates(new String[]{"q0", "q1", "q2", "q3", "q4", "q5"});
NFATImpl nfa = new NFATImpl(states);
nfa.addTransition(states[0], states[1], NFATImpl.EPSILON);
nfa.addTransition(states[0], states[2], NFATImpl.EPSILON);
nfa.addTransition(states[1], states[3], 'a');
nfa.addTransition(states[3], states[1], 'b');
nfa.addTransition(states[2], states[4], 'a');
nfa.addTransition(states[4], states[5], 'b');
nfa.addTransition(states[5], states[2], 'a');
nfa.markAsStartState(states[0]);
nfa.markAsFinalState(states[1]);
nfa.markAsFinalState(states[2]);
//TRUE
test("ab", nfa);
test("aba", nfa);
test("abab", nfa);
test("abaabaaba", nfa);
//FALSE
test("aa", nfa);
test("abaab", nfa);
}
@Test
public void testLoops() {
State[] states = NFATImpl.constructStates(new String[]{"q0", "q1", "q2", "q3", "q4"});
NFATImpl nfa = new NFATImpl(states);
nfa.addTransition(states[0], states[1], NFATImpl.EPSILON);
nfa.addTransition(states[0], states[2], NFATImpl.EPSILON);
nfa.addTransition(states[0], states[3], NFATImpl.EPSILON);
nfa.addTransition(states[0], states[4], NFATImpl.EPSILON);
nfa.addTransition(states[1], states[1], 'b');
nfa.addTransition(states[1], states[1], 'c');
nfa.addTransition(states[1], states[1], 'd');
nfa.addTransition(states[2], states[2], 'a');
nfa.addTransition(states[2], states[2], 'c');
nfa.addTransition(states[2], states[2], 'd');
nfa.addTransition(states[3], states[3], 'a');
nfa.addTransition(states[3], states[3], 'b');
nfa.addTransition(states[3], states[3], 'd');
nfa.addTransition(states[4], states[4], 'a');
nfa.addTransition(states[4], states[4], 'b');
nfa.addTransition(states[4], states[4], 'c');
nfa.markAsStartState(states[0]);
nfa.markAsFinalState(states[1]);
nfa.markAsFinalState(states[2]);
nfa.markAsFinalState(states[3]);
nfa.markAsFinalState(states[4]);
//TRUE
test("bcd", nfa);
test("acd", nfa);
test("abd", nfa);
test("abc", nfa);
test("abcabccbabca", nfa);
test("abadbadbadbabdbbdabdba", nfa);
test("dcbdcdcdbbcbbdbcdbcbdcb", nfa);
test("acbcbcbcabababbababcbb", nfa);
//FALSE
test("abcd", nfa);
}
}