/*
* (C) Copyright 2005 Arnaud Bailly (arnaud.oqube@gmail.com),
* Yves Roos (yroos@lifl.fr) and others.
*
* Licensed under the Apache License, Version 2.0 (the License);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an AS IS BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package rationals;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import junit.framework.TestCase;
/**
* @version $Id: AutomatonTest.java 2 2006-08-24 14:41:48Z oqube $
*/
public class AutomatonTest extends TestCase {
private Automaton<String, Transition<String>, TransitionBuilder<String>> automaton;
private State[] ss;
/**
* Constructor for AutomatonTest.
* @param arg0
*/
public AutomatonTest(String arg0) {
super(arg0);
}
protected void setUp() throws Exception {
super.setUp();
automaton = new Automaton<>();
/* states */
ss = new State[5];
ss[0] = automaton.addState(true,false);
ss[1] = automaton.addState(false,false);
ss[2] = automaton.addState(false,false);
ss[3] = automaton.addState(false,false);
ss[4] = automaton.addState(false,true);
/* transition */
automaton.addTransition(new Transition<>(ss[0],"a",ss[0]));
automaton.addTransition(new Transition<>(ss[0],"b",ss[1]));
automaton.addTransition(new Transition<>(ss[1],"b",ss[0]));
automaton.addTransition(new Transition<>(ss[1],"a",ss[2]));
automaton.addTransition(new Transition<>(ss[2],"b",ss[3]));
automaton.addTransition(new Transition<>(ss[2],"a",ss[1]));
automaton.addTransition(new Transition<>(ss[3],"a",ss[2]));
automaton.addTransition(new Transition<>(ss[3],"b",ss[4]));
automaton.addTransition(new Transition<>(ss[4],"b",ss[0]));
automaton.addTransition(new Transition<>(ss[4],"a",ss[4]));
}
public void testAddState() {
State s = automaton.addState(false,false);
assertTrue(automaton.states().contains(s));
assertTrue(!automaton.initials().contains(s));
assertTrue(!automaton.terminals().contains(s));
}
public void testAlphabet() throws NoSuchStateException {
Set<String> alph = new HashSet<>();
alph.add("a");
alph.add("b");
alph.add("c");
automaton.addTransition(new Transition<>(ss[0],"c",ss[3]));
assertTrue(automaton.alphabet().equals(alph));
}
public void testStates() {
State s = automaton.addState(false,false);
assertTrue(automaton.states().contains(s) && automaton.states().size() == 6);
}
public void testInitials() {
State s = automaton.addState(true,false);
assertTrue(automaton.states().contains(s));
assertTrue(automaton.initials().contains(s));
assertTrue(!automaton.terminals().contains(s));
}
public void testTerminals() {
State s = automaton.addState(false,true);
assertTrue(automaton.states().contains(s));
assertTrue(!automaton.initials().contains(s));
assertTrue(automaton.terminals().contains(s));
}
/*
* Class under test for Set accessibleStates()
*/
public void testAccessibleStates() throws NoSuchStateException {
State s5 = automaton.addState(false,false);
State s6 = automaton.addState(false,false);
automaton.addTransition(new Transition<>(ss[0],"c",s5));
automaton.addTransition(new Transition<>(s5,"c",s6));
automaton.addTransition(new Transition<>(s6,"a",s5));
Set<State> acc = automaton.accessibleStates();
assertTrue(acc.contains(s5) && acc.contains(s6));
}
/*
* Class under test for Set coAccessibleStates()
*/
public void testCoAccessibleStates() throws NoSuchStateException {
State s5 = automaton.addState(false,false);
State s6 = automaton.addState(false,false);
automaton.addTransition(new Transition<>(s5,"c",ss[4]));
automaton.addTransition(new Transition<>(s6,"c",s5));
automaton.addTransition(new Transition<>(s5,"a",s6));
Set<State> acc = automaton.coAccessibleStates();
assertTrue(acc.contains(s5) && acc.contains(s6));
}
public void testAccessibleAndCoAccessibleStates() throws NoSuchStateException {
Set<State> acc = automaton.accessibleAndCoAccessibleStates();
State s5 = automaton.addState(false,false);
State s6 = automaton.addState(false,false);
automaton.addTransition(new Transition<>(ss[0],"c",s5));
automaton.addTransition(new Transition<>(s5,"c",s6));
automaton.addTransition(new Transition<>(s6,"a",s5));
assertTrue(automaton.states().containsAll(acc));
assertTrue(!acc.contains(s5) && !acc.contains(s6));
}
/*
* Class under test for Set delta()
*/
public void testDelta() {
//TODO Implement delta().
}
public void testAddTransition() {
//TODO Implement addTransition().
}
public void testAcceptDFA() throws NoSuchStateException {
Automaton<String, Transition<String>, TransitionBuilder<String>> t = new Automaton<>();
State s1 = t.addState(true, true);
State s2 = t.addState(false, false);
State s3 = t.addState(false, false);
t.addTransition(new Transition<>(s1, "a", s2));
t.addTransition(new Transition<>(s2, "b", s3));
t.addTransition(new Transition<>(s3, "c", s1));
// check accept words
List<String> exp = Arrays.asList(new String[] { "a", "b","c", "a", "b", "c" });
assertTrue("Automaton does not accept 'abcabc'",t.accept(exp));
exp = Arrays.asList(new String[] { "a", "b","c", "b", "c" });
assertTrue("Automaton does accept 'abcbc'",!t.accept(exp));
}
public void testAcceptNFA1() throws NoSuchStateException {
Automaton<String, Transition<String>, TransitionBuilder<String>> t = new Automaton<>();
State s1 = t.addState(true, true);
State s2 = t.addState(false, false);
State s3 = t.addState(false, false);
State s4 = t.addState(false, false);
t.addTransition(new Transition<>(s1, "a", s2));
t.addTransition(new Transition<>(s2, "b", s3));
t.addTransition(new Transition<>(s3, "c", s4));
t.addTransition(new Transition<String>(s4, null, s1));
// check accept words
List<String> exp = Arrays.asList(new String[] { "a", "b","c", "a", "b", "c" });
assertTrue("Automaton does not accept 'abcabc'",t.accept(exp));
exp = Arrays.asList(new String[] { "a", "b","c", "b", "c" });
assertTrue("Automaton does accept 'abcbc'",!t.accept(exp));
}
}