1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.scxml.model;
18
19 import java.net.URL;
20 import java.util.HashMap;
21 import java.util.Map;
22 import java.util.Set;
23
24 import junit.framework.Test;
25 import junit.framework.TestCase;
26 import junit.framework.TestSuite;
27 import junit.textui.TestRunner;
28
29 import org.apache.commons.scxml.SCXMLExecutor;
30 import org.apache.commons.scxml.SCXMLTestHelper;
31 import org.apache.commons.scxml.TriggerEvent;
32 import org.apache.commons.scxml.env.jexl.JexlContext;
33 import org.apache.commons.scxml.env.jexl.JexlEvaluator;
34 import org.apache.commons.scxml.env.jsp.ELContext;
35 import org.apache.commons.scxml.env.jsp.ELEvaluator;
36 /***
37 * Unit tests {@link org.apache.commons.scxml.SCXMLExecutor}.
38 */
39 public class DatamodelTest extends TestCase {
40 /***
41 * Construct a new instance of SCXMLExecutorTest with
42 * the specified name
43 */
44 public DatamodelTest(String name) {
45 super(name);
46 }
47
48 public static Test suite() {
49 TestSuite suite = new TestSuite(DatamodelTest.class);
50 suite.setName("SCXML Executor Tests");
51 return suite;
52 }
53
54
55 private URL datamodel01jexl, datamodel02jexl, datamodel04jexl, datamodel01jsp, datamodel02jsp;
56 private SCXMLExecutor exec01, exec02;
57
58 /***
59 * Set up instance variables required by this test case.
60 */
61 public void setUp() {
62 datamodel01jexl = this.getClass().getClassLoader().
63 getResource("org/apache/commons/scxml/env/jexl/datamodel-01.xml");
64 datamodel02jexl = this.getClass().getClassLoader().
65 getResource("org/apache/commons/scxml/env/jexl/datamodel-02.xml");
66 datamodel04jexl = this.getClass().getClassLoader().
67 getResource("org/apache/commons/scxml/env/jexl/datamodel-04.xml");
68 datamodel01jsp = this.getClass().getClassLoader().
69 getResource("org/apache/commons/scxml/env/jsp/datamodel-01.xml");
70 datamodel02jsp = this.getClass().getClassLoader().
71 getResource("org/apache/commons/scxml/env/jsp/datamodel-02.xml");
72 }
73
74 /***
75 * Tear down instance variables required by this test case.
76 */
77 public void tearDown() {
78 datamodel01jexl = datamodel02jexl = datamodel01jsp = datamodel02jsp = null;
79 }
80
81 /***
82 * Test the stateless model, simultaneous executions
83 */
84 public void testDatamodelSimultaneousJexl() {
85 exec01 = SCXMLTestHelper.getExecutor(datamodel01jexl,
86 new JexlContext(), new JexlEvaluator());
87 assertNotNull(exec01);
88 exec02 = SCXMLTestHelper.getExecutor(datamodel01jexl,
89 new JexlContext(), new JexlEvaluator());
90 assertNotNull(exec02);
91 assertFalse(exec01 == exec02);
92 runtest();
93 }
94
95 public void testDatamodelSimultaneousJsp() {
96 exec01 = SCXMLTestHelper.getExecutor(datamodel01jsp,
97 new ELContext(), new ELEvaluator());
98 assertNotNull(exec01);
99 exec02 = SCXMLTestHelper.getExecutor(datamodel01jsp,
100 new ELContext(), new ELEvaluator());
101 assertNotNull(exec02);
102 assertFalse(exec01 == exec02);
103 runtest();
104 }
105
106 public void testDatamodelNamespacePrefixedXPaths() {
107 exec01 = SCXMLTestHelper.getExecutor(datamodel02jexl,
108 new JexlContext(), new JexlEvaluator());
109 assertNotNull(exec01);
110 exec02 = SCXMLTestHelper.getExecutor(datamodel02jsp,
111 new ELContext(), new ELEvaluator());
112 assertNotNull(exec02);
113 assertFalse(exec01 == exec02);
114 runtest();
115 }
116
117 public void testDatamodel04Jexl() {
118 exec01 = SCXMLTestHelper.getExecutor(datamodel04jexl,
119 new JexlContext(), new JexlEvaluator());
120 assertNotNull(exec01);
121 Set currentStates = exec01.getCurrentStatus().getStates();
122 assertEquals(1, currentStates.size());
123 assertEquals("ten", ((State)currentStates.iterator().
124 next()).getId());
125 Map payload = new HashMap();
126 payload.put("one", "1");
127 payload.put("two", "2");
128 TriggerEvent te = new TriggerEvent("ten.done", TriggerEvent.SIGNAL_EVENT, payload);
129 SCXMLTestHelper.fireEvent(exec01, te);
130 currentStates = exec01.getCurrentStatus().getStates();
131 assertEquals(1, currentStates.size());
132 assertEquals("twenty", ((State)currentStates.iterator().
133 next()).getId());
134 SCXMLTestHelper.fireEvent(exec01, "twenty.done");
135 currentStates = exec01.getCurrentStatus().getStates();
136 assertEquals(1, currentStates.size());
137 assertEquals("thirty", ((State)currentStates.iterator().
138 next()).getId());
139 }
140
141 private void runtest() {
142 try {
143
144
145 Set currentStates = exec01.getCurrentStatus().getStates();
146 assertEquals(1, currentStates.size());
147 assertEquals("ten", ((State)currentStates.iterator().
148 next()).getId());
149 exec01 = SCXMLTestHelper.testExecutorSerializability(exec01);
150 currentStates = fireEvent("ten.done", exec01);
151 assertEquals(1, currentStates.size());
152 assertEquals("twenty", ((State)currentStates.iterator().
153 next()).getId());
154
155 currentStates = exec02.getCurrentStatus().getStates();
156 assertEquals(1, currentStates.size());
157 assertEquals("ten", ((State)currentStates.iterator().
158 next()).getId());
159
160 currentStates = fireEvent("twenty.done", exec01);
161 assertEquals(1, currentStates.size());
162 assertEquals("thirty", ((State)currentStates.iterator().
163 next()).getId());
164 exec01 = SCXMLTestHelper.testExecutorSerializability(exec01);
165
166 currentStates = fireEvent("ten.done", exec02);
167 assertEquals(1, currentStates.size());
168 assertEquals("twenty", ((State)currentStates.iterator().
169 next()).getId());
170 exec02 = SCXMLTestHelper.testExecutorSerializability(exec02);
171 currentStates = fireEvent("twenty.done", exec02);
172 assertEquals(1, currentStates.size());
173 assertEquals("thirty", ((State)currentStates.iterator().
174 next()).getId());
175 currentStates = fireEvent("thirty.done", exec02);
176 assertEquals(1, currentStates.size());
177 assertEquals("forty", ((State)currentStates.iterator().
178 next()).getId());
179
180 currentStates = fireEvent("thirty.done", exec01);
181 assertEquals(1, currentStates.size());
182 assertEquals("forty", ((State)currentStates.iterator().
183 next()).getId());
184 } catch (Exception e) {
185 fail(e.getMessage());
186 }
187 }
188
189 private Set fireEvent(String name, SCXMLExecutor exec) {
190 TriggerEvent[] evts = {new TriggerEvent(name,
191 TriggerEvent.SIGNAL_EVENT, null)};
192 try {
193 exec.triggerEvents(evts);
194 } catch (Exception e) {
195 fail(e.getMessage());
196 }
197 return exec.getCurrentStatus().getStates();
198 }
199
200 public static void main(String args[]) {
201 TestRunner.run(suite());
202 }
203 }
204