package pl.edu.amu.wmi.daut.base;
import junit.framework.TestCase;
/**
* Klasa testujaca EpsilonTransitionLabel.
*/
public class TestMakeAutomatonFromString extends TestCase {
/**
* Test metody fromString() tworzacy pusty automat.
*/
public final void testFromString0EmptyLanguage() {
AutomatonSpecification pustyOjciec = new NaiveAutomatonSpecification();
String slowo = "Automaton:\n-States: q0\n-Transitions:\n"
+ "-Initial state: q0\n-Final states:";
try {
pustyOjciec.fromString(slowo);
} catch (Exception e) {
fail("fromString() zwrocil wyjatek dla poprawnego Stringa!");
}
AutomatonByRecursion pusteDziecko = new AutomatonByRecursion(pustyOjciec);
assertFalse(pusteDziecko.accepts("aaa"));
assertFalse(pusteDziecko.accepts("baba"));
assertFalse(pusteDziecko.accepts(""));
}
/**
* Test metody fromString() tworzący automat akceptujacy slowo puste.
*/
public final void testFromString1EmptyStringAutomaton() {
AutomatonSpecification dziwny = new NaiveAutomatonSpecification();
String slowo = "Automaton:\n-States: q0\n-Transitions:\n"
+ "-Initial state: q0\n-Final states: q0";
try {
dziwny.fromString(slowo);
} catch (Exception e) {
fail("fromString() zwrocil wyjatek dla poprawnego Stringa!");
}
AutomatonByRecursion wynik = new AutomatonByRecursion(dziwny);
assertFalse(wynik.accepts("aaa"));
assertFalse(wynik.accepts("baba"));
assertTrue(wynik.accepts(""));
}
/**
* Test metody fromString() tworzący automat akceptujacy nieparzyste
* potegi 'a'.
*/
public final void testFromString2OddPowersOfA() {
AutomatonSpecification masakra = new NaiveAutomatonSpecification();
String slowo = "Automaton:\n-States: q0 q1\n-Transitions:\n"
+ "q0 -a-> q1\nq1 -a-> q0\n-Initial state: q0\n-Final states: q1";
try {
masakra.fromString(slowo);
} catch (Exception e) {
fail("fromString() zwrocil wyjatek dla poprawnego Stringa!");
}
AutomatonByRecursion angle = new AutomatonByRecursion(masakra);
assertFalse(angle.accepts("aab"));
assertFalse(angle.accepts(""));
assertTrue(angle.accepts("aaa"));
}
/**
* Test metody fromString() tworzący automat z epsilonem.
*/
public final void testFromString3AutomatonWithEpsilonTransition() {
AutomatonSpecification epsilon = new NaiveAutomatonSpecification();
String slowo = "Automaton:\n-States: q0 q1 q2 q3\n-Transitions:\n"
+ "q0 -epsilon-> q1\nq1 -a-> q2\n-Initial state: q0\n"
+ "-Final states: q3";
try {
epsilon.fromString(slowo);
} catch (Exception e) {
fail("fromString() zwrocil wyjatek dla automatu z Epsilonem!");
}
boolean potworek = false;
for (int i = 0; i < 3; i++) {
if (!epsilon.allOutgoingTransitions(epsilon.allStates().get(i)).isEmpty()) {
if (epsilon.allOutgoingTransitions(epsilon.allStates().get(i))
.get(0).getTransitionLabel().canBeEpsilon()) {
potworek = true;
break;
}
}
}
assertTrue(potworek);
// Wykomentowane do czasu obsługiwania przez jakikolwiek automat przejść epsilonowych.
// AutomatonByRecursion ep = new AutomatonByRecursion(epsilon);
//
// assertTrue(ep.accepts("a"));
// assertTrue(ep.accepts("b"));
// assertFalse(ep.accepts(""));
// assertFalse(ep.accepts("ε"));
// assertFalse(ep.accepts("aa"));
// assertFalse(ep.accepts("ab"));
// assertFalse(ep.accepts("ba"));
// assertFalse(ep.accepts("bb"));
}
/**
* Test metody fromString() z bełkotem.
*/
public final void testFromString4Blubbering() {
AutomatonSpecification niepoprawny = new NaiveAutomatonSpecification();
String slowo = "niepoprawnywogolestring";
try {
niepoprawny.fromString(slowo);
fail();
} catch (Exception e) {
assertTrue(true);
}
slowo = "Magia: dwa trzy cztery piec";
try {
niepoprawny.fromString(slowo);
fail();
} catch (Exception e) {
assertTrue(true);
}
slowo = "Automaton:\n-Niestates: q0\n-Transitions: magia";
try {
niepoprawny.fromString(slowo);
fail();
} catch (Exception e) {
assertTrue(true);
}
}
/**
* Test metody fromString() z błędnymi opisami automatu.
* Błędy nazw stanów.
*/
public final void testFromString5WrongAutomatonStrings0States() {
AutomatonSpecification bledny = new NaiveAutomatonSpecification();
String nonCorrectStateName0 = "Automaton:\n-States: q\n-Transitions:\n a";
try {
bledny.fromString(nonCorrectStateName0);
fail();
} catch (Exception e) {
assertTrue(true);
}
String nonCorrectStateName1 = "Automaton:\n-States: a1\n-Transitions:\n a";
try {
bledny.fromString(nonCorrectStateName1);
fail();
} catch (Exception e) {
assertTrue(true);
}
String nonCorrectStateName2 = "Automaton:\n-States: q1.2\n-Transitions:\n a";
try {
bledny.fromString(nonCorrectStateName2);
fail();
} catch (Exception e) {
assertTrue(true);
}
String nonCorrectStateName3 = "Automaton:\n-States: qa\n-Transitions:\n a";
try {
bledny.fromString(nonCorrectStateName3);
fail();
} catch (Exception e) {
assertTrue(true);
}
}
/**
* Test metody fromString() z błędnymi opisami automatu.
* Błędy nazw przejść.
*/
public final void testFromString5WrongAutomatonStrings1Transitions() {
AutomatonSpecification bledny = new NaiveAutomatonSpecification();
String nonCorrectTransitionName0Label0 = "Automaton:\n-States: q0 q1\n-Transitions:\n"
+ "q0 --> q0";
try {
bledny.fromString(nonCorrectTransitionName0Label0);
fail();
} catch (Exception e) {
assertTrue(true);
}
String nonCorrectTransitionName0Label1 = "Automaton:\n-States: q0 q1\n-Transitions:\n"
+ "q0 .q-> q0";
try {
bledny.fromString(nonCorrectTransitionName0Label1);
fail();
} catch (Exception e) {
assertTrue(true);
}
String nonCorrectTransitionName0Label2 = "Automaton:\n-States: q0 q1\n-Transitions:\n"
+ "q0 --.> q0";
try {
bledny.fromString(nonCorrectTransitionName0Label2);
fail();
} catch (Exception e) {
assertTrue(true);
}
String nonCorrectTransitionName0Label3 = "Automaton:\n-States: q0 q1\n-Transitions:\n"
+ "q0 -\t-> q0";
try {
bledny.fromString(nonCorrectTransitionName0Label2);
fail();
} catch (Exception e) {
assertTrue(true);
}
String nonCorrectTransitionName1 = "Automaton:\n-States: q0 q1\n-Transitions:\n"
+ "qa -a-> q0";
try {
bledny.fromString(nonCorrectTransitionName1);
fail();
} catch (Exception e) {
assertTrue(true);
}
String nonCorrectTransitionName2 = "Automaton:\n-States: q0 q1\n-Transitions:\n"
+ "q0 -a-> qa";
try {
bledny.fromString(nonCorrectTransitionName2);
fail();
} catch (Exception e) {
assertTrue(true);
}
}
/**
* Test metody fromString() z błędnymi opisami automatu.
* Błędy nazw stanów specjalnych.
*/
public final void testFromString5WrongAutomatonStrings2SpecialStates() {
AutomatonSpecification bledny = new NaiveAutomatonSpecification();
String nonCorrectSpecialStates0 = "Automaton:\n-States: q0 q1\n-Transitions:\n"
+ "q0 -a-> q0\n-Initial error";
try {
bledny.fromString(nonCorrectSpecialStates0);
fail();
} catch (Exception e) {
assertTrue(true);
}
String nonCorrectSpecialStates1 = "Automaton:\n-States: q0 q1\n-Transitions:\n"
+ "q0 -a-> q0\n-Initial state: qa";
try {
bledny.fromString(nonCorrectSpecialStates1);
fail();
} catch (Exception e) {
assertTrue(true);
}
String nonCorrectSpecialStates2 = "Automaton:\n-States: q0 q1\n-Transitions:\n"
+ "q0 -a-> q0\n-Initial state: q0\nerror";
try {
bledny.fromString(nonCorrectSpecialStates2);
fail();
} catch (Exception e) {
assertTrue(true);
}
String nonCorrectSpecialStates3 = "Automaton:\n-States: q0 q1\n-Transitions:\n"
+ "q0 -a-> q0\n-Initial state: q0\n-Final error";
try {
bledny.fromString(nonCorrectSpecialStates3);
fail();
} catch (Exception e) {
assertTrue(true);
}
String nonCorrectSpecialStates4 = "Automaton:\n-States: q0 q1\n-Transitions:\n"
+ "q0 -a-> q0\n-Initial state: q0\n-Final states: qk";
try {
bledny.fromString(nonCorrectSpecialStates4);
fail();
} catch (Exception e) {
assertTrue(true);
}
}
/**
* Test metody fromString() tworzący automat z przejściem ANY.
*/
public final void testFromString6AutomatonWithAnyTransition() {
AutomatonSpecification anyone = new NaiveAutomatonSpecification();
String slowo = "Automaton:\n-States: q0 q1 q2\n-Transitions:\n"
+ "q0 -q-> q1\nq1 -ANY-> q2\n-Initial state: q0\n-Final states: q2";
try {
anyone.fromString(slowo);
} catch (Exception e) {
fail("fromString() zwrocil wyjatek dla automatu z przejściem dowolnym!");
}
AutomatonByRecursion ap = new AutomatonByRecursion(anyone);
assertTrue(ap.accepts("q0"));
assertTrue(ap.accepts("qε"));
assertFalse(ap.accepts(""));
assertFalse(ap.accepts("q"));
assertFalse(ap.accepts("q10"));
assertFalse(ap.accepts("aq0"));
assertFalse(ap.accepts("01"));
}
/**
* Test metody fromString() tworzący automat z przejściem po znaku z dopełnienia
* sumy przedziałów.
*/
public final void testFromString7AutomatonWithCCharClassTransition() {
AutomatonSpecification ccchar = new NaiveAutomatonSpecification();
String slowo = "Automaton:\n-States: q0 q1\n-Transitions:\n"
+ "q0 -[^ac-e]-> q1\n-Initial state: q0\n-Final states: q1";
try {
ccchar.fromString(slowo);
} catch (Exception e) {
fail("fromString() zwrocil wyjatek dla automatu z odwrotnością przejścia"
+ "z sumy przedziałów!");
}
AutomatonByRecursion cccp = new AutomatonByRecursion(ccchar);
assertFalse(cccp.accepts("^"));
assertFalse(cccp.accepts("a"));
assertFalse(cccp.accepts("c"));
assertFalse(cccp.accepts("d"));
assertFalse(cccp.accepts("e"));
assertFalse(cccp.accepts(""));
assertTrue(cccp.accepts("f"));
assertTrue(cccp.accepts("b"));
}
/**
* Test metody fromString() tworzący automat z przejściem po znaku ze zbioru.
*/
// public final void testFromString8AutomatonWithCharSetTransition() {
// AutomatonSpecification charSet = new NaiveAutomatonSpecification();
//
// String slowo = "Automaton:\n-States: q0 q1\n-Transitions:\n"
// + "q0 -{a,g,e}-> q1\n-Initial state: q0\n-Final states: q1";
//
// try {
// charSet.fromString(slowo);
// } catch (Exception e) {
// fail("fromString() zwrocil wyjatek dla automatu z przejściem po znaku ze zbioru!");
// }
//
// AutomatonByRecursion csp = new AutomatonByRecursion(charSet);
//
// assertTrue(csp.accepts("a"));
// assertTrue(csp.accepts("g"));
// assertTrue(csp.accepts("e"));
// assertFalse(csp.accepts(""));
// assertFalse(csp.accepts("b"));
// assertFalse(csp.accepts("f"));
// assertFalse(csp.accepts("A"));
// }
/**
* Test metody fromString() tworzący automat z przejściem po znaku z zakresu.
*/
// public final void testFromString8AutomatonWithCharSetTransition() {
// AutomatonSpecification charSet = new NaiveAutomatonSpecification();
//
// String slowo = "Automaton:\n-States: q0 q1\n-Transitions:\n"
// + "q0 -(a,m)-> q1\n-Initial state: q0\n-Final states: q1";
//
// try {
// charSet.fromString(slowo);
// } catch (Exception e) {
// fail("fromString() zwrocil wyjatek dla automatu z przejściem po znaku ze zbioru!");
// }
//
// AutomatonByRecursion csp = new AutomatonByRecursion(charSet);
//
// assertTrue(csp.accepts("a"));
// assertTrue(csp.accepts("g"));
// assertTrue(csp.accepts("m"));
// assertFalse(csp.accepts(""));
// assertFalse(csp.accepts("n"));
// assertFalse(csp.accepts("p"));
// assertFalse(csp.accepts("A"));
// assertFalse(csp.accepts("."));
// assertFalse(csp.accepts(","));
// }
}