1 package org.sapia.soto.state; 2 3 import junit.framework.TestCase; 4 5 import org.sapia.soto.state.config.StateInterceptor; 6 7 import org.sapia.util.xml.confix.ConfigurationException; 8 9 10 18 public class StateMachineTest extends TestCase { 19 22 public StateMachineTest(String name) { 23 super(name); 24 } 25 26 public void testAddGetFlow() throws Exception { 27 StateMachine engine = new StateMachine(); 28 TestState main = new TestState(true); 29 main.setId("main"); 30 31 TestState err = new TestState(true); 32 err.setId("err"); 33 34 TestState succ = new TestState(true); 35 succ.setId("succ"); 36 37 TestState dupl = new TestState(true); 38 dupl.setId("main"); 39 engine.addState(main); 40 engine.addState(err); 41 engine.addState(succ); 42 43 try { 44 engine.addState(dupl); 45 throw new Exception ("Flow with duplicate ID should not have been added"); 46 } catch (ConfigurationException e) { 47 } 49 50 engine.init(); 51 super.assertEquals(3, engine.getStmContext()._states.size()); 52 53 super.assertTrue(engine.getState("main") != null); 54 super.assertTrue(engine.getState("foo") == null); 55 } 56 57 public void testExecuteSuccess() throws Exception { 58 StateMachine engine = new StateMachine(); 59 TestState main = new TestState(true); 60 main.setId("main"); 61 main.setSuccess("succ"); 62 main.setError("err"); 63 64 TestState err = new TestState(true); 65 err.setId("err"); 66 67 TestState succ = new TestState(true); 68 succ.setId("succ"); 69 engine.addState(main); 70 engine.addState(err); 71 engine.addState(succ); 72 engine.init(); 73 engine.execute("main", new ContextImpl()); 74 super.assertTrue(main.exec); 75 super.assertTrue(succ.exec); 76 super.assertTrue(!err.exec); 77 } 78 79 public void testExecuteFailure() throws Exception { 80 StateMachine engine = new StateMachine(); 81 TestState main = new TestState(false); 82 main.setId("main"); 83 main.setSuccess("succ"); 84 main.setError("err"); 85 86 TestState err = new TestState(true); 87 err.setId("err"); 88 89 TestState succ = new TestState(true); 90 succ.setId("succ"); 91 engine.addState(main); 92 engine.addState(err); 93 engine.addState(succ); 94 engine.init(); 95 engine.execute("main", new ContextImpl()); 96 super.assertTrue(main.exec); 97 super.assertTrue(!succ.exec); 98 super.assertTrue(err.exec); 99 } 100 101 public void testMerge() throws Exception { 102 StateMachine engine1 = new StateMachine(); 103 TestState f1 = new TestState(false); 104 f1.setId("main"); 105 engine1.addState(f1); 106 107 StateMachine engine2 = new StateMachine(); 108 TestState f2 = new TestState(false); 109 f2.setId("main"); 110 engine2.addState(f2); 111 112 try { 113 engine1.merge(engine2); 114 throw new Exception ("Duplicate should not have been merged"); 115 } catch (ConfigurationException e) { 116 } 118 119 engine2 = new StateMachine(); 120 f2 = new TestState(false); 121 f2.setId("second"); 122 engine2.addState(f2); 123 engine1.merge(engine2); 124 super.assertTrue(engine1.getState("main") != null); 125 super.assertTrue(engine1.getState("second") != null); 126 } 127 128 public void testError() throws Exception { 129 StateMachine engine = new StateMachine(); 130 engine.addState(new TestErrFlow("err", false)); 131 132 try { 133 engine.init(); 134 engine.execute("err", new ContextImpl()); 135 throw new Exception ("Engine should have thrown a FlowExecException"); 136 } catch (StateExecException e) { 137 } 139 140 engine = new StateMachine(); 141 engine.addState(new TestErrFlow("err", true)); 142 engine.init(); 143 engine.execute("err", new ContextImpl()); 144 } 145 146 public void testFlowListener() throws Exception { 147 StateMachine engine = new StateMachine(); 148 TestFlowListener listener = new TestFlowListener(); 149 engine.addStateExecListener(listener); 150 engine.addState(new TestErrFlow("err", true)); 151 engine.init(); 152 engine.execute("err", new ContextImpl()); 153 super.assertTrue(listener.pre); 154 super.assertTrue(listener.err); 155 super.assertTrue(!listener.post); 156 157 engine = new StateMachine(); 158 159 TestState tf = new TestState(true); 160 tf.setId("state"); 161 listener = new TestFlowListener(); 162 engine.addStateExecListener(listener); 163 engine.addState(tf); 164 engine.init(); 165 engine.execute("state", new ContextImpl()); 166 super.assertTrue(listener.pre); 167 super.assertTrue(!listener.err); 168 super.assertTrue(listener.post); 169 } 170 171 public void testStateDecorator() throws Exception { 172 StateMachine engine = new StateMachine(); 173 TestState pre1 = new TestState(true); 174 pre1.setId("pre1"); 175 176 TestState pre2 = new TestState(true); 177 pre2.setId("pre2"); 178 179 TestState post1 = new TestState(true); 180 post1.setId("post1"); 181 182 TestState post2 = new TestState(true); 183 post2.setId("post2"); 184 engine.addState(pre1); 185 engine.addState(pre2); 186 engine.addState(post1); 187 engine.addState(post2); 188 189 TestState main = new TestState(true); 190 main.setId("main"); 191 192 StateInterceptor dec = new StateInterceptor(); 193 dec.setPreExec("pre1, pre2"); 194 dec.setPostExec("post1, post2"); 195 dec.handleObject(null, main); 196 engine.addState(dec); 197 engine.init(); 198 engine.execute("main", new ContextImpl()); 199 super.assertTrue(pre1.exec); 200 super.assertTrue(pre2.exec); 201 super.assertTrue(main.exec); 202 super.assertTrue(post1.exec); 203 super.assertTrue(post2.exec); 204 } 205 206 public void testAddModule() throws Exception { 207 StateMachine stm = new StateMachine(); 208 Module someModule = new Module(); 209 StateMachine stm2 = new StateMachine(); 210 someModule.setStateMachine(stm2); 211 TestState someState = new TestState(true); 212 someState.setId("someState"); 213 stm2.addState(someState); 214 stm.addModule(someModule); 215 stm.init(); 216 stm.execute("someState", new ContextImpl()); 217 218 } 219 } 220 | Popular Tags |