1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
<?xml version="1.0" encoding="UTF-8"?>
<!-- test that history states works correctly. The counter Var1 counts how many times
we have entered s0. The initial state is s012. We then transition to s1, which transitions
to s0's deep history state. entering.s012 should be raised, otherwise failure. Then we transition
to s02, which transitions to s0's shallow history state. That should have value s01, and its initial
state is s011, so we should get entering.s011, otherwise failure.-->
<scxml xmlns="http://www.w3.org/2005/07/scxml" xmlns:conf="http://www.w3.org/2005/scxml-conformance" version="1.0" initial="s012" datamodel="c89">
<datamodel>
<data id="Var1" expr="0"/>
</datamodel>
<state id="s0" initial="s01">
<onentry>
<assign location="Var1" expr="Var1 + 1"/>
</onentry>
<!-- the first time through, go to s1, setting a timer just in case something hangs -->
<transition event="entering.s012" cond="Var1==1" target="s1">
<send event="timeout" delay="2s"/>
</transition>
<!-- the second time, we should get entering.s012. If so, go to s2, otherwise fail -->
<transition event="entering.s012" cond="Var1==2" target="s2"/>
<transition event="entering" cond="Var1==2" target="fail"/>
<!-- the third time we should get entering-s011. If so, pass, otherwise fail -->
<transition event="entering.s011" cond="Var1==3" target="pass"/>
<transition event="entering" cond="Var1==3" target="fail"/>
<!-- if we timeout, the state machine is hung somewhere, so fail -->
<transition event="timeout" target="fail"/>
<history type="shallow" id="s0HistShallow">
<transition target="s02"/>
</history>
<history type="deep" id="s0HistDeep">
<transition target="s022"/>
</history>
<state id="s01" initial="s011">
<state id="s011">
<onentry>
<raise event="entering.s011"/>
</onentry>
</state>
<state id="s012">
<onentry>
<raise event="entering.s012"/>
</onentry>
</state>
</state>
<state id="s02" initial="s021">
<state id="s021">
<onentry>
<raise event="entering.s021"/>
</onentry>
</state>
<state id="s022">
<onentry>
<raise event="entering.s022"/>
</onentry>
</state>
</state>
</state>
<state id="s1">
<transition target="s0HistDeep"/>
</state>
<state id="s2">
<transition target="s0HistShallow"/>
</state>
<final id="pass">
<onentry>
<log label="Outcome" expr="&pass&"/>
</onentry>
</final>
<final id="fail">
<onentry>
<log label="Outcome" expr="&pass&"/>
</onentry>
</final>
</scxml>
|