1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.mina.statemachine;
21
22 import static org.junit.Assert.assertEquals;
23 import static org.junit.Assert.assertNull;
24 import static org.junit.Assert.assertSame;
25 import static org.junit.Assert.fail;
26
27 import java.lang.reflect.Method;
28 import java.util.List;
29
30 import org.apache.mina.statemachine.annotation.Transition;
31 import org.apache.mina.statemachine.annotation.Transitions;
32 import org.apache.mina.statemachine.transition.MethodTransition;
33 import org.junit.Before;
34 import org.junit.Test;
35
36
37
38
39
40
41 public class StateMachineFactoryTest {
42 Method barInA;
43 Method error;
44 Method fooInA;
45 Method fooInB;
46 Method barInC;
47 Method fooOrBarInCOrFooInD;
48
49 @Before
50 public void setUp() throws Exception {
51 barInA = States.class.getDeclaredMethod("barInA", new Class[0]);
52 error = States.class.getDeclaredMethod("error", new Class[0]);
53 fooInA = States.class.getDeclaredMethod("fooInA", new Class[0]);
54 fooInB = States.class.getDeclaredMethod("fooInB", new Class[0]);
55 barInC = States.class.getDeclaredMethod("barInC", new Class[0]);
56 fooOrBarInCOrFooInD = States.class.getDeclaredMethod("fooOrBarInCOrFooInD", new Class[0]);
57 }
58
59 @Test
60 public void testCreate() throws Exception {
61 States states = new States();
62 StateMachine sm = StateMachineFactory.getInstance(Transition.class).create(States.A, states);
63
64 State a = sm.getState(States.A);
65 State b = sm.getState(States.B);
66 State c = sm.getState(States.C);
67 State d = sm.getState(States.D);
68
69 assertEquals(States.A, a.getId());
70 assertNull(a.getParent());
71 assertEquals(States.B, b.getId());
72 assertSame(a, b.getParent());
73 assertEquals(States.C, c.getId());
74 assertSame(b, c.getParent());
75 assertEquals(States.D, d.getId());
76 assertSame(a, d.getParent());
77
78 List<org.apache.mina.statemachine.transition.Transition> trans = null;
79
80 trans = a.getTransitions();
81 assertEquals(3, trans.size());
82 assertEquals(new MethodTransition("bar", barInA, states), trans.get(0));
83 assertEquals(new MethodTransition("*", error, states), trans.get(1));
84 assertEquals(new MethodTransition("foo", b, fooInA, states), trans.get(2));
85
86 trans = b.getTransitions();
87 assertEquals(1, trans.size());
88 assertEquals(new MethodTransition("foo", c, fooInB, states), trans.get(0));
89
90 trans = c.getTransitions();
91 assertEquals(3, trans.size());
92 assertEquals(new MethodTransition("bar", a, barInC, states), trans.get(0));
93 assertEquals(new MethodTransition("foo", d, fooOrBarInCOrFooInD, states), trans.get(1));
94 assertEquals(new MethodTransition("bar", d, fooOrBarInCOrFooInD, states), trans.get(2));
95
96 trans = d.getTransitions();
97 assertEquals(1, trans.size());
98 assertEquals(new MethodTransition("foo", fooOrBarInCOrFooInD, states), trans.get(0));
99 }
100
101 @Test
102 public void testCreateStates() throws Exception {
103 State[] states = StateMachineFactory.createStates(StateMachineFactory.getFields(States.class));
104 assertEquals(States.A, states[0].getId());
105 assertNull(states[0].getParent());
106 assertEquals(States.B, states[1].getId());
107 assertEquals(states[0], states[1].getParent());
108 assertEquals(States.C, states[2].getId());
109 assertEquals(states[1], states[2].getParent());
110 assertEquals(States.D, states[3].getId());
111 assertEquals(states[0], states[3].getParent());
112 }
113
114 @Test
115 public void testCreateStatesMissingParents() throws Exception {
116 try {
117 StateMachineFactory.createStates(StateMachineFactory.getFields(StatesWithMissingParents.class));
118 fail("Missing parents. FsmCreationException expected.");
119 } catch (StateMachineCreationException fce) {
120 }
121 }
122
123 public static class States {
124 @org.apache.mina.statemachine.annotation.State
125 protected static final String A = "a";
126 @org.apache.mina.statemachine.annotation.State(A)
127 protected static final String B = "b";
128 @org.apache.mina.statemachine.annotation.State(B)
129 protected static final String C = "c";
130 @org.apache.mina.statemachine.annotation.State(A)
131 protected static final String D = "d";
132
133 @Transition(on = "bar", in = A)
134 protected void barInA() {
135 }
136
137 @Transition(on = "bar", in = C, next = A)
138 protected void barInC() {
139 }
140
141 @Transition(in = A)
142 protected void error() {
143 }
144
145 @Transition(on = "foo", in = A, next = B)
146 protected void fooInA() {
147 }
148
149 @Transition(on = "foo", in = B, next = C)
150 protected void fooInB() {
151 }
152
153 @Transitions( { @Transition(on = { "foo", "bar" }, in = C, next = D), @Transition(on = "foo", in = D) })
154 protected void fooOrBarInCOrFooInD() {
155 }
156
157 }
158
159 public static class StatesWithMissingParents {
160 @org.apache.mina.statemachine.annotation.State("b")
161 public static final String A = "a";
162 @org.apache.mina.statemachine.annotation.State("c")
163 public static final String B = "b";
164 @org.apache.mina.statemachine.annotation.State("d")
165 public static final String C = "c";
166 @org.apache.mina.statemachine.annotation.State("e")
167 public static final String D = "d";
168 }
169 }