Compiler Construction/TestState.java
From Wikibooks, open books for an open world
// TestState.java /* Copyright 2005 Takuya Murata This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ import java.util.*; public final class TestState extends junit.framework.TestCase { private void assertSame (State x[], State y[]) { assertEquals (x.length, y.length); Set<State> set = new HashSet<State> (); set.addAll (Arrays.asList (x)); set.removeAll (Arrays.asList (y)); assertTrue (set.isEmpty ()); } private void assertSame (String message, State x[], State y[]) { assertEquals (message, x.length, y.length); Set<State> set = new HashSet<State> (); set.addAll (Arrays.asList (x)); set.removeAll (Arrays.asList (y)); assertTrue (message, set.isEmpty ()); } private State s0, s1, s2, s3; public void setUp () { // This automaton recognizes (a|b)*abb s0 = new State ("s0"); s1 = new State ("s1"); s2 = new State ("s2"); s3 = new State ("s3"); s0.setTransition ('a', s0); s0.setTransition ('b', s0); s0.setTransition ('a', s1); s1.setTransition ('b', s2); s2.setTransition ('b', s3); } public void test_closure () { State s4 = new State ("s4"); s4.setTransition (State.EMPTY, s0); State s5 = new State ("s5"); s5.setTransition (State.EMPTY, s4); assertSame (new State[] { s0 }, s0.closure ()); assertSame (new State[] { s1 }, s1.closure ()); assertSame (new State[] { s2 }, s2.closure ()); assertSame (new State[] { s0, s4 }, s4.closure ()); assertSame (Arrays.asList (s5.closure ()).toString (), new State[] { s0, s4, s5 }, s5.closure ()); assertSame (new State[] { s0, s1, }, s5.move ('a')); } public void test_move () { assertTrue (Arrays.asList (s0.move ("abb")).contains (s3)); assertTrue (Arrays.asList (s0.move ("babb")).contains (s3)); assertTrue (!Arrays.asList (s0.move ("babba")).contains (s3)); } public void test_toDFA () { State s0 = this.s0.toDFA (); //s0.prettyPrint (System.err); State q3 = s0.moveDFA ("abb"); // this is the only way to get 'q3'. assertSame (q3, s0.moveDFA ("abb")); assertSame (q3, s0.moveDFA ("babb")); assertNotSame (q3, s0.moveDFA ("babba")); } public void test_moveDFA () { State s0 = this.s0.toDFA (); assertEquals (1, s0.move ("abb").length); //s0.prettyPrint (System.err); assertSame (s0.moveDFA ("abb"), s0.move ("abb")[0]); } public void test_stringSequence () { State if_s[] = State.stringSequence ("if"); assertTrue (Arrays.asList (if_s[0].move ("if")).contains (if_s[1])); assertTrue (!Arrays.asList (if_s[0].move ("abc")).contains (if_s[1])); assertTrue (!Arrays.asList (if_s[0].move ("iF")).contains (if_s[1])); State int_s[] = State.stringSequence ("int"); State s = new State ("s"); s.setTransition (State.EMPTY, if_s[0]); s.setTransition (State.EMPTY, int_s[0]); s = s.toDFA (); // s.prettyPrint (System.err); State acc_if = s.moveDFA ("if"), acc_int = s.moveDFA ("int"); assertSame (acc_if, s.moveDFA ("if")); assertSame (acc_int, s.moveDFA ("int")); } public void test_stringSequence_ignoreCase () { State if_s[] = State.stringSequenceIgnoreCase ("if"); assertTrue (Arrays.asList (if_s[0].move ("IF")).contains (if_s[1])); assertTrue (!Arrays.asList (if_s[0].move ("abc")).contains (if_s[1])); assertTrue (Arrays.asList (if_s[0].move ("iF")).contains (if_s[1])); State int_s[] = State.stringSequenceIgnoreCase ("int"); State s = new State ("s"); s.setTransition (State.EMPTY, if_s[0]); s.setTransition (State.EMPTY, int_s[0]); s = s.toDFA (); //s.prettyPrint (System.err); State acc_if = s.moveDFA ("If"), acc_int = s.moveDFA ("iNt"); assertSame (acc_if, s.moveDFA ("if")); assertSame (acc_int, s.moveDFA ("int")); } }
This page may need to be