View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.scxml2.model;
18  
19  import java.util.HashMap;
20  import java.util.Map;
21  import java.util.Set;
22  
23  import org.apache.commons.scxml2.SCXMLExecutor;
24  import org.apache.commons.scxml2.SCXMLTestHelper;
25  import org.apache.commons.scxml2.TriggerEvent;
26  import org.junit.Assert;
27  import org.junit.Test;
28  /**
29   * Unit tests {@link org.apache.commons.scxml2.SCXMLExecutor}.
30   */
31  public class DatamodelTest {
32  
33      /**
34       * Test the stateless model, simultaneous executions
35       */    
36      @Test
37      public void testDatamodelSimultaneousJexl() throws Exception {
38          SCXMLExecutor exec01 = SCXMLTestHelper.getExecutor("org/apache/commons/scxml2/env/jexl/datamodel-01.xml");
39          exec01.go();
40          SCXMLExecutor exec02 = SCXMLTestHelper.getExecutor("org/apache/commons/scxml2/env/jexl/datamodel-01.xml");
41          exec02.go();
42          Assert.assertFalse(exec01 == exec02);
43          runtest(exec01, exec02);
44      }
45      
46      @Test
47      public void testDatamodelNamespacePrefixedXPaths() throws Exception {
48          SCXMLExecutor exec01 = SCXMLTestHelper.getExecutor("org/apache/commons/scxml2/env/jexl/datamodel-02.xml");
49          exec01.go();
50          SCXMLExecutor exec02 = SCXMLTestHelper.getExecutor("org/apache/commons/scxml2/env/jexl/datamodel-02.xml");
51          exec02.go();
52          Assert.assertFalse(exec01 == exec02);
53          runtest(exec01, exec02);
54      }
55      
56      @Test
57      public void testDatamodel04Jexl() throws Exception {
58          SCXMLExecutor exec01 = SCXMLTestHelper.getExecutor("org/apache/commons/scxml2/env/jexl/datamodel-04.xml");
59          exec01.go();
60          Set<EnterableState> currentStates = exec01.getStatus().getStates();
61          Assert.assertEquals(1, currentStates.size());
62          Assert.assertEquals("ten", currentStates.iterator().next().getId());
63          Map<String, Object> payload = new HashMap<String, Object>();
64          payload.put("one", "1");
65          payload.put("two", "2");
66          TriggerEvent te = new TriggerEvent("done.state.ten", TriggerEvent.SIGNAL_EVENT, payload);
67          SCXMLTestHelper.fireEvent(exec01, te);
68          currentStates = exec01.getStatus().getStates();
69          Assert.assertEquals(1, currentStates.size());
70          Assert.assertEquals("twenty", currentStates.iterator().next().getId());
71          SCXMLTestHelper.fireEvent(exec01, "done.state.twenty");
72          currentStates = exec01.getStatus().getStates();
73          Assert.assertEquals(1, currentStates.size());
74          Assert.assertEquals("thirty", currentStates.iterator().next().getId());
75      }
76      
77      @Test
78      public void testDatamodel05Jexl() throws Exception {
79          SCXMLExecutor exec01 = SCXMLTestHelper.getExecutor("org/apache/commons/scxml2/env/jexl/datamodel-05.xml");
80          exec01.go();
81          SCXMLTestHelper.assertState(exec01, "end");
82      }
83  
84      private void runtest(SCXMLExecutor exec01, SCXMLExecutor exec02) throws Exception {
85          //// Interleaved
86          // exec01
87          Set<EnterableState> currentStates = exec01.getStatus().getStates();
88          Assert.assertEquals(1, currentStates.size());
89          Assert.assertEquals("ten", currentStates.iterator().next().getId());
90          exec01 = SCXMLTestHelper.testInstanceSerializability(exec01);
91          currentStates = fireEvent("done.state.ten", exec01);
92          Assert.assertEquals(1, currentStates.size());
93          Assert.assertEquals("twenty", currentStates.iterator().next().getId());
94          // exec02
95          currentStates = exec02.getStatus().getStates();
96          Assert.assertEquals(1, currentStates.size());
97          Assert.assertEquals("ten", currentStates.iterator().next().getId());
98          // exec01
99          currentStates = fireEvent("done.state.twenty", exec01);
100         Assert.assertEquals(1, currentStates.size());
101         Assert.assertEquals("thirty", currentStates.iterator().next().getId());
102         exec01 = SCXMLTestHelper.testInstanceSerializability(exec01);
103         // exec02
104         currentStates = fireEvent("done.state.ten", exec02);
105         Assert.assertEquals(1, currentStates.size());
106         Assert.assertEquals("twenty", currentStates.iterator().next().getId());
107         exec02 = SCXMLTestHelper.testInstanceSerializability(exec02);
108         currentStates = fireEvent("done.state.twenty", exec02);
109         Assert.assertEquals(1, currentStates.size());
110         Assert.assertEquals("thirty", currentStates.iterator().next().getId());
111         currentStates = fireEvent("done.state.thirty", exec02);
112         Assert.assertEquals(1, currentStates.size());
113         Assert.assertEquals("forty", currentStates.iterator().next().getId());
114         // exec01
115         currentStates = fireEvent("done.state.thirty", exec01);
116         Assert.assertEquals(1, currentStates.size());
117         Assert.assertEquals("forty", currentStates.iterator().next().getId());
118     }
119 
120     private Set<EnterableState> fireEvent(String name, SCXMLExecutor exec) throws Exception {
121         TriggerEvent[] evts = {new TriggerEvent(name,
122                 TriggerEvent.SIGNAL_EVENT, null)};
123         exec.triggerEvents(evts);
124         return exec.getStatus().getStates();
125     }
126 }
127