package pl.edu.amu.wmi.daut.re;
import java.util.ArrayList;
import pl.edu.amu.wmi.daut.base.AutomatonSpecification;
import pl.edu.amu.wmi.daut.base.NaiveAutomatonSpecification;
import pl.edu.amu.wmi.daut.base.NondeterministicAutomatonByThompsonApproach;
import pl.edu.amu.wmi.daut.base.State;
import pl.edu.amu.wmi.daut.base.CharTransitionLabel;
import junit.framework.TestCase;
import pl.edu.amu.wmi.daut.re.AlternativeOperator.Factory;
/**
* Test klasy AlternativeOperator.
*/
public class TestAlternativeOperator extends TestCase {
/**
* Test automatów:
* automaton1 - akceptującego wyraz składający się z liter "a" i "b",
* który zawiera przynajmniej jedno "a"
* automaton2 - akceptującego wyraz składający się z liter "a" i "b",
* który zawiera nieparzystą ilość "b".
*/
public final void testCreateAutomatonFromTwoAutomata1() {
AutomatonSpecification automaton1 = new NaiveAutomatonSpecification();
State q0 = automaton1.addState();
State q1 = automaton1.addState();
automaton1.addTransition(q0, q1, new CharTransitionLabel('a'));
automaton1.addLoop(q0, new CharTransitionLabel('b'));
automaton1.addLoop(q1, new CharTransitionLabel('a'));
automaton1.addLoop(q1, new CharTransitionLabel('b'));
automaton1.markAsInitial(q0);
automaton1.markAsFinal(q1);
AutomatonSpecification automaton2 = new NaiveAutomatonSpecification();
State q2 = automaton2.addState();
State q3 = automaton2.addState();
automaton2.addTransition(q2, q3, new CharTransitionLabel('b'));
automaton2.addTransition(q3, q2, new CharTransitionLabel('b'));
automaton2.addLoop(q2, new CharTransitionLabel('a'));
automaton2.addLoop(q3, new CharTransitionLabel('a'));
automaton2.markAsInitial(q2);
automaton2.markAsFinal(q3);
AlternativeOperator oper = new AlternativeOperator();
NondeterministicAutomatonByThompsonApproach result =
new NondeterministicAutomatonByThompsonApproach(
oper.createAutomatonFromTwoAutomata(automaton1, automaton2));
assertTrue(result.accepts("aaaa"));
assertTrue(result.accepts("bbaaaa"));
assertTrue(result.accepts("aaaaaaaaaaaabaaaaaa"));
assertTrue(result.accepts("bbb"));
assertTrue(result.accepts("baba"));
assertTrue(result.accepts("bababab"));
assertFalse(result.accepts(""));
assertFalse(result.accepts("jakasbzdura"));
assertFalse(result.accepts("bb"));
assertFalse(result.accepts("kabaczek"));
}
/**
* Test automatów:
* automaton1 - akceptującego wyraz składający się z liter "a" i "b",
* postaci {(ab)^n : n>0}
* automaton2 - automatu pustego.
*/
public final void testCreateAutomatonFromTwoAutomata2() {
AutomatonSpecification automaton1 = new NaiveAutomatonSpecification();
State q0 = automaton1.addState();
State q1 = automaton1.addState();
State q2 = automaton1.addState();
automaton1.addTransition(q0, q1, new CharTransitionLabel('a'));
automaton1.addTransition(q1, q2, new CharTransitionLabel('b'));
automaton1.addTransition(q2, q1, new CharTransitionLabel('a'));
automaton1.markAsInitial(q0);
automaton1.markAsFinal(q2);
AutomatonSpecification automaton2 = new NaiveAutomatonSpecification();
AlternativeOperator oper = new AlternativeOperator();
NondeterministicAutomatonByThompsonApproach result =
new NondeterministicAutomatonByThompsonApproach(
oper.createAutomatonFromTwoAutomata(automaton1, automaton2));
assertTrue(result.accepts("abab"));
assertTrue(result.accepts("ababababababab"));
assertFalse(result.accepts(""));
assertFalse(result.accepts("cosdziwnego"));
assertFalse(result.accepts("baaaaaaaaaa"));
assertFalse(result.accepts("abababababb"));
assertFalse(result.accepts("bababa"));
}
/**
* Test fabryki operatora.
*/
public final void testFactory() {
Factory factory = new Factory();
ArrayList<String> params = new ArrayList<String>();
assertEquals(factory.createOperator(params).getClass(),
new AlternativeOperator().getClass());
}
}