FSMTest.java revision 608:7e06bf1dcb09
1/*
2 * Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.  Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26package com.sun.corba.se.spi.orbutil.fsm ;
27
28import com.sun.corba.se.spi.orbutil.fsm.Input ;
29import com.sun.corba.se.spi.orbutil.fsm.Action ;
30import com.sun.corba.se.spi.orbutil.fsm.Guard ;
31import com.sun.corba.se.spi.orbutil.fsm.StateEngine ;
32import com.sun.corba.se.spi.orbutil.fsm.StateImpl ;
33import com.sun.corba.se.spi.orbutil.fsm.StateEngineFactory ;
34import com.sun.corba.se.spi.orbutil.fsm.FSM ;
35
36class TestInput {
37    TestInput( Input value, String msg )
38    {
39        this.value = value ;
40        this.msg = msg ;
41    }
42
43    public String toString()
44    {
45        return "Input " + value + " : " + msg ;
46    }
47
48    public Input getInput()
49    {
50        return value ;
51    }
52
53    Input value ;
54    String msg ;
55}
56
57class TestAction1 implements Action
58{
59    public void doIt( FSM fsm, Input in )
60    {
61        System.out.println( "TestAction1:" ) ;
62        System.out.println( "\tlabel    = " + label ) ;
63        System.out.println( "\toldState = " + oldState ) ;
64        System.out.println( "\tnewState = " + newState ) ;
65        if (label != in)
66            throw new Error( "Unexcepted Input " + in ) ;
67        if (oldState != fsm.getState())
68            throw new Error( "Unexpected old State " + fsm.getState() ) ;
69    }
70
71    public TestAction1( State oldState, Input label, State newState )
72    {
73        this.oldState = oldState ;
74        this.newState = newState ;
75        this.label = label ;
76    }
77
78    private State oldState ;
79    private Input label ;
80    private State newState ;
81}
82
83class TestAction2 implements Action
84{
85    private State oldState ;
86    private State newState ;
87
88    public void doIt( FSM fsm, Input in )
89    {
90        System.out.println( "TestAction2:" ) ;
91        System.out.println( "\toldState = " + oldState ) ;
92        System.out.println( "\tnewState = " + newState ) ;
93        System.out.println( "\tinput    = " + in ) ;
94        if (oldState != fsm.getState())
95            throw new Error( "Unexpected old State " + fsm.getState() ) ;
96    }
97
98    public TestAction2( State oldState, State newState )
99    {
100        this.oldState = oldState ;
101        this.newState = newState ;
102    }
103}
104
105class TestAction3 implements Action {
106    private State oldState ;
107    private Input label ;
108
109    public void doIt( FSM fsm, Input in )
110    {
111        System.out.println( "TestAction1:" ) ;
112        System.out.println( "\tlabel    = " + label ) ;
113        System.out.println( "\toldState = " + oldState ) ;
114        if (label != in)
115            throw new Error( "Unexcepted Input " + in ) ;
116    }
117
118    public TestAction3( State oldState, Input label )
119    {
120        this.oldState = oldState ;
121        this.label = label ;
122    }
123}
124
125class NegateGuard implements Guard {
126    Guard guard ;
127
128    public NegateGuard( Guard guard )
129    {
130        this.guard = guard ;
131    }
132
133    public Guard.Result evaluate( FSM fsm, Input in )
134    {
135        return guard.evaluate( fsm, in ).complement() ;
136    }
137}
138
139class MyFSM extends FSMImpl {
140    public MyFSM( StateEngine se )
141    {
142        super( se, FSMTest.STATE1 ) ;
143    }
144
145    public int counter = 0 ;
146}
147
148public class FSMTest {
149    public static final State   STATE1 = new StateImpl( "1" ) ;
150    public static final State   STATE2 = new StateImpl( "2" ) ;
151    public static final State   STATE3 = new StateImpl( "3" ) ;
152    public static final State   STATE4 = new StateImpl( "4" ) ;
153
154    public static final Input   INPUT1 = new InputImpl( "1" ) ;
155    public static final Input   INPUT2 = new InputImpl( "2" ) ;
156    public static final Input   INPUT3 = new InputImpl( "3" ) ;
157    public static final Input   INPUT4 = new InputImpl( "4" ) ;
158
159    private Guard counterGuard = new Guard() {
160        public Guard.Result evaluate( FSM fsm, Input in )
161        {
162            MyFSM mfsm = (MyFSM) fsm ;
163            return Guard.Result.convert( mfsm.counter < 3 ) ;
164        }
165    } ;
166
167    private static void add1( StateEngine se, State oldState, Input in, State newState )
168    {
169        se.add( oldState, in, new TestAction1( oldState, in, newState ), newState ) ;
170    }
171
172    private static void add2( StateEngine se, State oldState, State newState )
173    {
174        se.setDefault( oldState, new TestAction2( oldState, newState ), newState ) ;
175    }
176
177    public static void main( String[] args )
178    {
179        TestAction3 ta3 = new TestAction3( STATE3, INPUT1 ) ;
180
181        StateEngine se = StateEngineFactory.create() ;
182        add1( se, STATE1, INPUT1, STATE1 ) ;
183        add2( se, STATE1,         STATE2 ) ;
184
185        add1( se, STATE2, INPUT1, STATE2 ) ;
186        add1( se, STATE2, INPUT2, STATE2 ) ;
187        add1( se, STATE2, INPUT3, STATE1 ) ;
188        add1( se, STATE2, INPUT4, STATE3 ) ;
189
190        se.add(   STATE3, INPUT1, ta3,  STATE3 ) ;
191        se.add(   STATE3, INPUT1, ta3,  STATE4 ) ;
192        add1( se, STATE3, INPUT2, STATE1 ) ;
193        add1( se, STATE3, INPUT3, STATE2 ) ;
194        add1( se, STATE3, INPUT4, STATE2 ) ;
195
196        MyFSM fsm = new MyFSM( se ) ;
197        TestInput in11 = new TestInput( INPUT1, "1.1" ) ;
198        TestInput in12 = new TestInput( INPUT1, "1.2" ) ;
199        TestInput in21 = new TestInput( INPUT2, "2.1" ) ;
200        TestInput in22 = new TestInput( INPUT2, "2.2" ) ;
201        TestInput in31 = new TestInput( INPUT3, "3.1" ) ;
202        TestInput in32 = new TestInput( INPUT3, "3.2" ) ;
203        TestInput in33 = new TestInput( INPUT3, "3.3" ) ;
204        TestInput in41 = new TestInput( INPUT4, "4.1" ) ;
205
206        fsm.doIt( in11.getInput() ) ;
207        fsm.doIt( in12.getInput() ) ;
208        fsm.doIt( in41.getInput() ) ;
209        fsm.doIt( in11.getInput() ) ;
210        fsm.doIt( in22.getInput() ) ;
211        fsm.doIt( in31.getInput() ) ;
212        fsm.doIt( in33.getInput() ) ;
213        fsm.doIt( in41.getInput() ) ;
214        fsm.doIt( in41.getInput() ) ;
215        fsm.doIt( in41.getInput() ) ;
216        fsm.doIt( in22.getInput() ) ;
217        fsm.doIt( in32.getInput() ) ;
218        fsm.doIt( in41.getInput() ) ;
219        fsm.doIt( in11.getInput() ) ;
220        fsm.doIt( in12.getInput() ) ;
221        fsm.doIt( in11.getInput() ) ;
222        fsm.doIt( in11.getInput() ) ;
223        fsm.doIt( in11.getInput() ) ;
224        fsm.doIt( in11.getInput() ) ;
225        fsm.doIt( in11.getInput() ) ;
226    }
227}
228