state_machine 0.4.3 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG.rdoc +17 -0
- data/LICENSE +1 -1
- data/README.rdoc +54 -84
- data/Rakefile +1 -1
- data/examples/Car_state.png +0 -0
- data/examples/Vehicle_state.png +0 -0
- data/examples/auto_shop.rb +11 -0
- data/examples/car.rb +19 -0
- data/examples/traffic_light.rb +9 -0
- data/examples/vehicle.rb +35 -0
- data/lib/state_machine.rb +65 -52
- data/lib/state_machine/assertions.rb +1 -1
- data/lib/state_machine/callback.rb +13 -9
- data/lib/state_machine/eval_helpers.rb +4 -3
- data/lib/state_machine/event.rb +51 -33
- data/lib/state_machine/extensions.rb +2 -2
- data/lib/state_machine/guard.rb +47 -41
- data/lib/state_machine/integrations.rb +67 -0
- data/lib/state_machine/integrations/active_record.rb +62 -36
- data/lib/state_machine/integrations/active_record/observer.rb +41 -0
- data/lib/state_machine/integrations/data_mapper.rb +23 -37
- data/lib/state_machine/integrations/data_mapper/observer.rb +23 -9
- data/lib/state_machine/integrations/sequel.rb +23 -24
- data/lib/state_machine/machine.rb +380 -277
- data/lib/state_machine/node_collection.rb +142 -0
- data/lib/state_machine/state.rb +114 -69
- data/lib/state_machine/state_collection.rb +38 -0
- data/lib/state_machine/transition.rb +36 -17
- data/test/active_record.log +2940 -85664
- data/test/functional/state_machine_test.rb +49 -53
- data/test/sequel.log +747 -11990
- data/test/unit/assertions_test.rb +2 -1
- data/test/unit/callback_test.rb +14 -12
- data/test/unit/eval_helpers_test.rb +25 -6
- data/test/unit/event_test.rb +144 -124
- data/test/unit/guard_test.rb +118 -140
- data/test/unit/integrations/active_record_test.rb +102 -68
- data/test/unit/integrations/data_mapper_test.rb +48 -37
- data/test/unit/integrations/sequel_test.rb +34 -25
- data/test/unit/integrations_test.rb +42 -0
- data/test/unit/machine_test.rb +460 -531
- data/test/unit/node_collection_test.rb +208 -0
- data/test/unit/state_collection_test.rb +167 -0
- data/test/unit/state_machine_test.rb +1 -1
- data/test/unit/state_test.rb +223 -200
- data/test/unit/transition_test.rb +81 -46
- metadata +17 -3
- data/test/data_mapper.log +0 -30860
@@ -8,6 +8,7 @@ class AssertionsTest < Test::Unit::TestCase
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def test_should_raise_exception_if_key_is_invalid
|
11
|
-
assert_raise(ArgumentError) { assert_valid_keys({:name => 'foo', :value => 'bar', :invalid => true}, :name, :value, :force) }
|
11
|
+
exception = assert_raise(ArgumentError) { assert_valid_keys({:name => 'foo', :value => 'bar', :invalid => true}, :name, :value, :force) }
|
12
|
+
assert_match 'Invalid key(s): invalid', exception.message
|
12
13
|
end
|
13
14
|
end
|
data/test/unit/callback_test.rb
CHANGED
@@ -2,7 +2,8 @@ require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
|
2
2
|
|
3
3
|
class CallbackTest < Test::Unit::TestCase
|
4
4
|
def test_should_raise_exception_if_do_option_not_specified
|
5
|
-
assert_raise(ArgumentError) { StateMachine::Callback.new }
|
5
|
+
exception = assert_raise(ArgumentError) { StateMachine::Callback.new }
|
6
|
+
assert_match ':do callback must be specified', exception.message
|
6
7
|
end
|
7
8
|
|
8
9
|
def test_should_not_raise_exception_if_do_option_specified
|
@@ -10,7 +11,8 @@ class CallbackTest < Test::Unit::TestCase
|
|
10
11
|
end
|
11
12
|
|
12
13
|
def test_should_raise_exception_if_invalid_option_specified
|
13
|
-
assert_raise(ArgumentError) { StateMachine::Callback.new(:do => :run, :invalid => true) }
|
14
|
+
exception = assert_raise(ArgumentError) { StateMachine::Callback.new(:do => :run, :invalid => true) }
|
15
|
+
assert_match 'Invalid key(s): invalid', exception.message
|
14
16
|
end
|
15
17
|
|
16
18
|
def test_should_not_bind_to_objects
|
@@ -57,7 +59,7 @@ end
|
|
57
59
|
class CallbackWithRequirementsTest < Test::Unit::TestCase
|
58
60
|
def setup
|
59
61
|
@object = Object.new
|
60
|
-
@callback = StateMachine::Callback.new(:from =>
|
62
|
+
@callback = StateMachine::Callback.new(:from => :parked, :to => :idling, :on => :ignite, :do => lambda {true})
|
61
63
|
end
|
62
64
|
|
63
65
|
def test_should_call_with_empty_context
|
@@ -65,27 +67,27 @@ class CallbackWithRequirementsTest < Test::Unit::TestCase
|
|
65
67
|
end
|
66
68
|
|
67
69
|
def test_should_not_call_if_from_not_included
|
68
|
-
assert !@callback.call(@object, :from =>
|
70
|
+
assert !@callback.call(@object, :from => :idling)
|
69
71
|
end
|
70
72
|
|
71
73
|
def test_should_not_call_if_to_not_included
|
72
|
-
assert !@callback.call(@object, :to =>
|
74
|
+
assert !@callback.call(@object, :to => :parked)
|
73
75
|
end
|
74
76
|
|
75
77
|
def test_should_not_call_if_on_not_included
|
76
|
-
assert !@callback.call(@object, :on =>
|
78
|
+
assert !@callback.call(@object, :on => :park)
|
77
79
|
end
|
78
80
|
|
79
81
|
def test_should_call_if_all_requirements_met
|
80
|
-
assert @callback.call(@object, :from =>
|
82
|
+
assert @callback.call(@object, :from => :parked, :to => :idling, :on => :ignite)
|
81
83
|
end
|
82
84
|
|
83
85
|
def test_should_include_in_known_states
|
84
|
-
assert_equal
|
86
|
+
assert_equal [:parked, :idling], @callback.known_states
|
85
87
|
end
|
86
88
|
end
|
87
89
|
|
88
|
-
class
|
90
|
+
class CallbackWithIfConditionTest < Test::Unit::TestCase
|
89
91
|
def setup
|
90
92
|
@object = Object.new
|
91
93
|
end
|
@@ -101,7 +103,7 @@ class CallbackWithIfConditionalTest < Test::Unit::TestCase
|
|
101
103
|
end
|
102
104
|
end
|
103
105
|
|
104
|
-
class
|
106
|
+
class CallbackWithUnlessConditionTest < Test::Unit::TestCase
|
105
107
|
def setup
|
106
108
|
@object = Object.new
|
107
109
|
end
|
@@ -189,12 +191,12 @@ class CallbackWithBoundObjectTest < Test::Unit::TestCase
|
|
189
191
|
|
190
192
|
def test_should_ignore_option_for_symbolic_callbacks
|
191
193
|
class << @object
|
192
|
-
def
|
194
|
+
def after_ignite(*args)
|
193
195
|
args
|
194
196
|
end
|
195
197
|
end
|
196
198
|
|
197
|
-
@callback = StateMachine::Callback.new(:do => :
|
199
|
+
@callback = StateMachine::Callback.new(:do => :after_ignite, :bind_to_object => true)
|
198
200
|
assert_equal [], @callback.call(@object)
|
199
201
|
end
|
200
202
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
2
2
|
|
3
|
-
class
|
3
|
+
class EvalHelpersTest < Test::Unit::TestCase
|
4
4
|
include StateMachine::EvalHelpers
|
5
5
|
|
6
6
|
def setup
|
@@ -8,7 +8,8 @@ class EvalHelperTest < Test::Unit::TestCase
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def test_should_raise_exception_if_method_is_not_symbol_string_or_proc
|
11
|
-
|
11
|
+
exception = assert_raise(ArgumentError) { evaluate_method(@object, 1) }
|
12
|
+
assert_match /Methods must/, exception.message
|
12
13
|
end
|
13
14
|
end
|
14
15
|
|
@@ -28,7 +29,7 @@ class EvalHelpersSymbolTest < Test::Unit::TestCase
|
|
28
29
|
end
|
29
30
|
end
|
30
31
|
|
31
|
-
class
|
32
|
+
class EvalHelpersSymbolWithArgumentsTest < Test::Unit::TestCase
|
32
33
|
include StateMachine::EvalHelpers
|
33
34
|
|
34
35
|
def setup
|
@@ -44,7 +45,7 @@ class EvalHelperSymbolWithArgumentsTest < Test::Unit::TestCase
|
|
44
45
|
end
|
45
46
|
end
|
46
47
|
|
47
|
-
class
|
48
|
+
class EvalHelpersStringTest < Test::Unit::TestCase
|
48
49
|
include StateMachine::EvalHelpers
|
49
50
|
|
50
51
|
def setup
|
@@ -65,7 +66,7 @@ class EvalHelperStringTest < Test::Unit::TestCase
|
|
65
66
|
end
|
66
67
|
end
|
67
68
|
|
68
|
-
class
|
69
|
+
class EvalHelpersProcTest < Test::Unit::TestCase
|
69
70
|
include StateMachine::EvalHelpers
|
70
71
|
|
71
72
|
def setup
|
@@ -78,7 +79,25 @@ class EvalHelperProcTest < Test::Unit::TestCase
|
|
78
79
|
end
|
79
80
|
end
|
80
81
|
|
81
|
-
class
|
82
|
+
class EvalHelpersProcWithoutArgumentsTest < Test::Unit::TestCase
|
83
|
+
include StateMachine::EvalHelpers
|
84
|
+
|
85
|
+
def setup
|
86
|
+
@object = Object.new
|
87
|
+
@proc = lambda {|*args| args}
|
88
|
+
class << @proc
|
89
|
+
def arity
|
90
|
+
0
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_should_call_proc_with_no_arguments
|
96
|
+
assert_equal [], evaluate_method(@object, @proc, 1, 2, 3)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
class EvalHelpersProcWithArgumentsTest < Test::Unit::TestCase
|
82
101
|
include StateMachine::EvalHelpers
|
83
102
|
|
84
103
|
def setup
|
data/test/unit/event_test.rb
CHANGED
@@ -1,21 +1,10 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
2
2
|
|
3
|
-
class EventTest < Test::Unit::TestCase
|
4
|
-
def setup
|
5
|
-
@machine = StateMachine::Machine.new(Class.new)
|
6
|
-
@event = StateMachine::Event.new(@machine, 'turn_on')
|
7
|
-
end
|
8
|
-
|
9
|
-
def test_should_raise_exception_if_invalid_option_specified
|
10
|
-
assert_raise(ArgumentError) {StateMachine::Event.new(@machine, 'turn_on', :invalid => true)}
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
3
|
class EventByDefaultTest < Test::Unit::TestCase
|
15
4
|
def setup
|
16
5
|
@klass = Class.new
|
17
6
|
@machine = StateMachine::Machine.new(@klass)
|
18
|
-
@event = StateMachine::Event.new(@machine,
|
7
|
+
@event = StateMachine::Event.new(@machine, :ignite)
|
19
8
|
|
20
9
|
@object = @klass.new
|
21
10
|
end
|
@@ -25,7 +14,7 @@ class EventByDefaultTest < Test::Unit::TestCase
|
|
25
14
|
end
|
26
15
|
|
27
16
|
def test_should_have_a_name
|
28
|
-
assert_equal
|
17
|
+
assert_equal :ignite, @event.name
|
29
18
|
end
|
30
19
|
|
31
20
|
def test_should_not_have_any_guards
|
@@ -44,71 +33,113 @@ class EventByDefaultTest < Test::Unit::TestCase
|
|
44
33
|
assert_nil @event.next_transition(@object)
|
45
34
|
end
|
46
35
|
|
47
|
-
def
|
48
|
-
assert @object.respond_to?(:
|
36
|
+
def test_should_define_a_predicate
|
37
|
+
assert @object.respond_to?(:can_ignite?)
|
49
38
|
end
|
50
39
|
|
51
|
-
def
|
52
|
-
assert @object.respond_to?(:
|
40
|
+
def test_should_define_a_transition_accessor
|
41
|
+
assert @object.respond_to?(:next_ignite_transition)
|
53
42
|
end
|
54
43
|
|
55
|
-
def
|
56
|
-
assert @object.respond_to?(:
|
44
|
+
def test_should_define_an_action
|
45
|
+
assert @object.respond_to?(:ignite)
|
57
46
|
end
|
58
47
|
|
59
|
-
def
|
60
|
-
assert @object.respond_to?(:
|
48
|
+
def test_should_define_a_bang_action
|
49
|
+
assert @object.respond_to?(:ignite!)
|
61
50
|
end
|
62
51
|
end
|
63
52
|
|
64
|
-
class
|
53
|
+
class EventTest < Test::Unit::TestCase
|
65
54
|
def setup
|
66
55
|
@machine = StateMachine::Machine.new(Class.new)
|
67
|
-
@event = StateMachine::Event.new(@machine,
|
56
|
+
@event = StateMachine::Event.new(@machine, :ignite)
|
57
|
+
@event.transition :to => :idling, :from => :parked
|
68
58
|
end
|
69
59
|
|
70
|
-
def
|
71
|
-
|
60
|
+
def test_should_allow_changing_machine
|
61
|
+
new_machine = StateMachine::Machine.new(Class.new)
|
62
|
+
@event.machine = new_machine
|
63
|
+
assert_equal new_machine, @event.machine
|
72
64
|
end
|
73
65
|
|
74
|
-
def
|
75
|
-
|
66
|
+
def test_should_use_pretty_inspect
|
67
|
+
assert_match /#<StateMachine::Event name=:ignite transitions=\[\{.+\}\]>/, @event.inspect
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
class EventWithNamespaceTest < Test::Unit::TestCase
|
72
|
+
def setup
|
73
|
+
@klass = Class.new
|
74
|
+
@machine = StateMachine::Machine.new(@klass, :namespace => 'car')
|
75
|
+
@event = StateMachine::Event.new(@machine, :ignite)
|
76
|
+
@object = @klass.new
|
76
77
|
end
|
77
78
|
|
78
|
-
def
|
79
|
-
|
79
|
+
def test_should_namespace_predicate
|
80
|
+
assert @object.respond_to?(:can_ignite_car?)
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_should_namespace_transition_accessor
|
84
|
+
assert @object.respond_to?(:next_ignite_car_transition)
|
85
|
+
end
|
86
|
+
|
87
|
+
def test_should_namespace_action
|
88
|
+
assert @object.respond_to?(:ignite_car)
|
89
|
+
end
|
90
|
+
|
91
|
+
def test_should_namespace_bang_action
|
92
|
+
assert @object.respond_to?(:ignite_car!)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
class EventTransitionsTest < Test::Unit::TestCase
|
97
|
+
def setup
|
98
|
+
@machine = StateMachine::Machine.new(Class.new)
|
99
|
+
@event = StateMachine::Event.new(@machine, :ignite)
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_should_raise_exception_if_invalid_option_specified
|
103
|
+
assert_raise(ArgumentError) {@event.transition(:invalid => true)}
|
80
104
|
end
|
81
105
|
|
82
106
|
def test_should_not_allow_on_option
|
83
|
-
assert_raise(ArgumentError) {@event.transition(:on =>
|
107
|
+
exception = assert_raise(ArgumentError) {@event.transition(:on => :ignite)}
|
108
|
+
assert_equal 'Invalid key(s): on', exception.message
|
84
109
|
end
|
85
110
|
|
86
111
|
def test_should_not_allow_except_to_option
|
87
|
-
assert_raise(ArgumentError) {@event.transition(:except_to =>
|
112
|
+
exception = assert_raise(ArgumentError) {@event.transition(:except_to => :parked)}
|
113
|
+
assert_equal 'Invalid key(s): except_to', exception.message
|
88
114
|
end
|
89
115
|
|
90
116
|
def test_should_not_allow_except_on_option
|
91
|
-
assert_raise(ArgumentError) {@event.transition(:except_on =>
|
117
|
+
exception = assert_raise(ArgumentError) {@event.transition(:except_on => :ignite)}
|
118
|
+
assert_equal 'Invalid key(s): except_on', exception.message
|
119
|
+
end
|
120
|
+
|
121
|
+
def test_should_allow_transitioning_without_a_to_state
|
122
|
+
assert_nothing_raised {@event.transition(:from => :parked)}
|
92
123
|
end
|
93
124
|
|
94
125
|
def test_should_allow_transitioning_without_a_from_state
|
95
|
-
|
126
|
+
assert_nothing_raised {@event.transition(:to => :idling)}
|
96
127
|
end
|
97
128
|
|
98
|
-
def
|
99
|
-
|
129
|
+
def test_should_allow_except_from_option
|
130
|
+
assert_nothing_raised {@event.transition(:except_from => :idling)}
|
100
131
|
end
|
101
132
|
|
102
133
|
def test_should_allow_transitioning_from_a_single_state
|
103
|
-
assert @event.transition(:to =>
|
134
|
+
assert @event.transition(:to => :idling, :from => :parked)
|
104
135
|
end
|
105
136
|
|
106
137
|
def test_should_allow_transitioning_from_multiple_states
|
107
|
-
assert @event.transition(:to =>
|
138
|
+
assert @event.transition(:to => :idling, :from => [:parked, :idling])
|
108
139
|
end
|
109
140
|
|
110
141
|
def test_should_have_transitions
|
111
|
-
guard = @event.transition(:to =>
|
142
|
+
guard = @event.transition(:to => :idling)
|
112
143
|
assert_equal [guard], @event.guards
|
113
144
|
end
|
114
145
|
end
|
@@ -116,8 +147,7 @@ end
|
|
116
147
|
class EventAfterBeingCopiedTest < Test::Unit::TestCase
|
117
148
|
def setup
|
118
149
|
@machine = StateMachine::Machine.new(Class.new)
|
119
|
-
@event = StateMachine::Event.new(@machine,
|
120
|
-
@event.known_states # Call so that it's cached
|
150
|
+
@event = StateMachine::Event.new(@machine, :ignite)
|
121
151
|
@copied_event = @event.dup
|
122
152
|
end
|
123
153
|
|
@@ -134,7 +164,7 @@ class EventWithoutTransitionsTest < Test::Unit::TestCase
|
|
134
164
|
def setup
|
135
165
|
@klass = Class.new
|
136
166
|
@machine = StateMachine::Machine.new(@klass)
|
137
|
-
@event = StateMachine::Event.new(@machine,
|
167
|
+
@event = StateMachine::Event.new(@machine, :ignite)
|
138
168
|
@object = @klass.new
|
139
169
|
end
|
140
170
|
|
@@ -150,6 +180,11 @@ class EventWithoutTransitionsTest < Test::Unit::TestCase
|
|
150
180
|
assert !@event.fire(@object)
|
151
181
|
end
|
152
182
|
|
183
|
+
def test_should_raise_exception_on_fire!
|
184
|
+
exception = assert_raise(StateMachine::InvalidTransition) { @event.fire!(@object) }
|
185
|
+
assert_equal 'Cannot transition state via :ignite from nil', exception.message
|
186
|
+
end
|
187
|
+
|
153
188
|
def test_should_not_change_the_current_state
|
154
189
|
@event.fire(@object)
|
155
190
|
assert_nil @object.state
|
@@ -160,20 +195,20 @@ class EventWithTransitionsTest < Test::Unit::TestCase
|
|
160
195
|
def setup
|
161
196
|
@klass = Class.new
|
162
197
|
@machine = StateMachine::Machine.new(@klass)
|
163
|
-
@event = StateMachine::Event.new(@machine,
|
164
|
-
@event.transition(:to =>
|
165
|
-
@event.transition(:to =>
|
198
|
+
@event = StateMachine::Event.new(@machine, :ignite)
|
199
|
+
@event.transition(:to => :idling, :from => :parked)
|
200
|
+
@event.transition(:to => :idling, :except_from => :first_gear)
|
166
201
|
end
|
167
202
|
|
168
203
|
def test_should_include_all_transition_states_in_known_states
|
169
|
-
assert_equal
|
204
|
+
assert_equal [:parked, :idling, :first_gear], @event.known_states
|
170
205
|
end
|
171
206
|
|
172
207
|
def test_should_include_new_transition_states_after_calling_known_states
|
173
208
|
@event.known_states
|
174
|
-
@event.transition(:to =>
|
209
|
+
@event.transition(:to => :idling, :from => :stalled)
|
175
210
|
|
176
|
-
assert_equal
|
211
|
+
assert_equal [:parked, :idling, :first_gear, :stalled], @event.known_states
|
177
212
|
end
|
178
213
|
end
|
179
214
|
|
@@ -181,11 +216,13 @@ class EventWithoutMatchingTransitionsTest < Test::Unit::TestCase
|
|
181
216
|
def setup
|
182
217
|
@klass = Class.new
|
183
218
|
@machine = StateMachine::Machine.new(@klass)
|
184
|
-
@
|
185
|
-
|
219
|
+
@machine.state :parked, :idling
|
220
|
+
|
221
|
+
@event = StateMachine::Event.new(@machine, :ignite)
|
222
|
+
@event.transition(:to => :idling, :from => :parked)
|
186
223
|
|
187
224
|
@object = @klass.new
|
188
|
-
@object.state = '
|
225
|
+
@object.state = 'idling'
|
189
226
|
end
|
190
227
|
|
191
228
|
def test_should_not_be_able_to_fire
|
@@ -200,9 +237,14 @@ class EventWithoutMatchingTransitionsTest < Test::Unit::TestCase
|
|
200
237
|
assert !@event.fire(@object)
|
201
238
|
end
|
202
239
|
|
240
|
+
def test_should_raise_exception_on_fire!
|
241
|
+
exception = assert_raise(StateMachine::InvalidTransition) { @event.fire!(@object) }
|
242
|
+
assert_equal 'Cannot transition state via :ignite from :idling', exception.message
|
243
|
+
end
|
244
|
+
|
203
245
|
def test_should_not_change_the_current_state
|
204
246
|
@event.fire(@object)
|
205
|
-
assert_equal '
|
247
|
+
assert_equal 'idling', @object.state
|
206
248
|
end
|
207
249
|
end
|
208
250
|
|
@@ -210,11 +252,13 @@ class EventWithMatchingDisabledTransitionsTest < Test::Unit::TestCase
|
|
210
252
|
def setup
|
211
253
|
@klass = Class.new
|
212
254
|
@machine = StateMachine::Machine.new(@klass)
|
213
|
-
@
|
214
|
-
|
255
|
+
@machine.state :parked, :idling
|
256
|
+
|
257
|
+
@event = StateMachine::Event.new(@machine, :ignite)
|
258
|
+
@event.transition(:to => :idling, :from => :parked, :if => lambda {false})
|
215
259
|
|
216
260
|
@object = @klass.new
|
217
|
-
@object.state = '
|
261
|
+
@object.state = 'parked'
|
218
262
|
end
|
219
263
|
|
220
264
|
def test_should_not_be_able_to_fire
|
@@ -231,7 +275,7 @@ class EventWithMatchingDisabledTransitionsTest < Test::Unit::TestCase
|
|
231
275
|
|
232
276
|
def test_should_not_change_the_current_state
|
233
277
|
@event.fire(@object)
|
234
|
-
assert_equal '
|
278
|
+
assert_equal 'parked', @object.state
|
235
279
|
end
|
236
280
|
end
|
237
281
|
|
@@ -239,11 +283,13 @@ class EventWithMatchingEnabledTransitionsTest < Test::Unit::TestCase
|
|
239
283
|
def setup
|
240
284
|
@klass = Class.new
|
241
285
|
@machine = StateMachine::Machine.new(@klass)
|
242
|
-
@
|
243
|
-
|
286
|
+
@machine.state :parked, :idling
|
287
|
+
|
288
|
+
@event = StateMachine::Event.new(@machine, :ignite)
|
289
|
+
@event.transition(:to => :idling, :from => :parked)
|
244
290
|
|
245
291
|
@object = @klass.new
|
246
|
-
@object.state = '
|
292
|
+
@object.state = 'parked'
|
247
293
|
end
|
248
294
|
|
249
295
|
def test_should_be_able_to_fire
|
@@ -253,9 +299,9 @@ class EventWithMatchingEnabledTransitionsTest < Test::Unit::TestCase
|
|
253
299
|
def test_should_have_a_next_transition
|
254
300
|
transition = @event.next_transition(@object)
|
255
301
|
assert_not_nil transition
|
256
|
-
assert_equal '
|
257
|
-
assert_equal '
|
258
|
-
assert_equal
|
302
|
+
assert_equal 'parked', transition.from
|
303
|
+
assert_equal 'idling', transition.to
|
304
|
+
assert_equal :ignite, transition.event
|
259
305
|
end
|
260
306
|
|
261
307
|
def test_should_fire
|
@@ -264,7 +310,7 @@ class EventWithMatchingEnabledTransitionsTest < Test::Unit::TestCase
|
|
264
310
|
|
265
311
|
def test_should_change_the_current_state
|
266
312
|
@event.fire(@object)
|
267
|
-
assert_equal '
|
313
|
+
assert_equal 'idling', @object.state
|
268
314
|
end
|
269
315
|
end
|
270
316
|
|
@@ -272,11 +318,13 @@ class EventWithTransitionWithoutToStateTest < Test::Unit::TestCase
|
|
272
318
|
def setup
|
273
319
|
@klass = Class.new
|
274
320
|
@machine = StateMachine::Machine.new(@klass)
|
275
|
-
@
|
276
|
-
|
321
|
+
@machine.state :parked
|
322
|
+
|
323
|
+
@event = StateMachine::Event.new(@machine, :park)
|
324
|
+
@event.transition(:from => :parked)
|
277
325
|
|
278
326
|
@object = @klass.new
|
279
|
-
@object.state = '
|
327
|
+
@object.state = 'parked'
|
280
328
|
end
|
281
329
|
|
282
330
|
def test_should_be_able_to_fire
|
@@ -286,9 +334,9 @@ class EventWithTransitionWithoutToStateTest < Test::Unit::TestCase
|
|
286
334
|
def test_should_have_a_next_transition
|
287
335
|
transition = @event.next_transition(@object)
|
288
336
|
assert_not_nil transition
|
289
|
-
assert_equal '
|
290
|
-
assert_equal '
|
291
|
-
assert_equal
|
337
|
+
assert_equal 'parked', transition.from
|
338
|
+
assert_equal 'parked', transition.to
|
339
|
+
assert_equal :park, transition.event
|
292
340
|
end
|
293
341
|
|
294
342
|
def test_should_fire
|
@@ -297,7 +345,7 @@ class EventWithTransitionWithoutToStateTest < Test::Unit::TestCase
|
|
297
345
|
|
298
346
|
def test_should_not_change_the_current_state
|
299
347
|
@event.fire(@object)
|
300
|
-
assert_equal '
|
348
|
+
assert_equal 'parked', @object.state
|
301
349
|
end
|
302
350
|
end
|
303
351
|
|
@@ -305,11 +353,14 @@ class EventWithTransitionWithNilToStateTest < Test::Unit::TestCase
|
|
305
353
|
def setup
|
306
354
|
@klass = Class.new
|
307
355
|
@machine = StateMachine::Machine.new(@klass)
|
308
|
-
@
|
309
|
-
@
|
356
|
+
@machine.state :parked, :value => nil
|
357
|
+
@machine.state :idling
|
358
|
+
|
359
|
+
@event = StateMachine::Event.new(@machine, :park)
|
360
|
+
@event.transition(:from => :idling, :to => :parked)
|
310
361
|
|
311
362
|
@object = @klass.new
|
312
|
-
@object.state = '
|
363
|
+
@object.state = 'idling'
|
313
364
|
end
|
314
365
|
|
315
366
|
def test_should_be_able_to_fire
|
@@ -319,9 +370,9 @@ class EventWithTransitionWithNilToStateTest < Test::Unit::TestCase
|
|
319
370
|
def test_should_have_a_next_transition
|
320
371
|
transition = @event.next_transition(@object)
|
321
372
|
assert_not_nil transition
|
322
|
-
assert_equal '
|
373
|
+
assert_equal 'idling', transition.from
|
323
374
|
assert_equal nil, transition.to
|
324
|
-
assert_equal
|
375
|
+
assert_equal :park, transition.event
|
325
376
|
end
|
326
377
|
|
327
378
|
def test_should_fire
|
@@ -334,49 +385,18 @@ class EventWithTransitionWithNilToStateTest < Test::Unit::TestCase
|
|
334
385
|
end
|
335
386
|
end
|
336
387
|
|
337
|
-
class EventWithTransitionWithDynamicToStateTest < Test::Unit::TestCase
|
338
|
-
def setup
|
339
|
-
@klass = Class.new
|
340
|
-
@machine = StateMachine::Machine.new(@klass)
|
341
|
-
@event = StateMachine::Event.new(@machine, 'turn_on')
|
342
|
-
@event.transition(:to => lambda {'on'}, :from => 'off')
|
343
|
-
|
344
|
-
@object = @klass.new
|
345
|
-
@object.state = 'off'
|
346
|
-
end
|
347
|
-
|
348
|
-
def test_should_be_able_to_fire
|
349
|
-
assert @event.can_fire?(@object)
|
350
|
-
end
|
351
|
-
|
352
|
-
def test_should_have_a_next_transition
|
353
|
-
transition = @event.next_transition(@object)
|
354
|
-
assert_not_nil transition
|
355
|
-
assert_equal 'off', transition.from
|
356
|
-
assert_equal 'on', transition.to
|
357
|
-
assert_equal 'turn_on', transition.event
|
358
|
-
end
|
359
|
-
|
360
|
-
def test_should_fire
|
361
|
-
assert @event.fire(@object)
|
362
|
-
end
|
363
|
-
|
364
|
-
def test_should_change_the_current_state
|
365
|
-
@event.fire(@object)
|
366
|
-
assert_equal 'on', @object.state
|
367
|
-
end
|
368
|
-
end
|
369
|
-
|
370
388
|
class EventWithMultipleTransitionsTest < Test::Unit::TestCase
|
371
389
|
def setup
|
372
390
|
@klass = Class.new
|
373
391
|
@machine = StateMachine::Machine.new(@klass)
|
374
|
-
@
|
375
|
-
|
376
|
-
@event.
|
392
|
+
@machine.state :parked, :idling
|
393
|
+
|
394
|
+
@event = StateMachine::Event.new(@machine, :ignite)
|
395
|
+
@event.transition(:to => :idling, :from => :idling)
|
396
|
+
@event.transition(:to => :idling, :from => :parked) # This one should get used
|
377
397
|
|
378
398
|
@object = @klass.new
|
379
|
-
@object.state = '
|
399
|
+
@object.state = 'parked'
|
380
400
|
end
|
381
401
|
|
382
402
|
def test_should_be_able_to_fire
|
@@ -386,9 +406,9 @@ class EventWithMultipleTransitionsTest < Test::Unit::TestCase
|
|
386
406
|
def test_should_have_a_next_transition
|
387
407
|
transition = @event.next_transition(@object)
|
388
408
|
assert_not_nil transition
|
389
|
-
assert_equal '
|
390
|
-
assert_equal '
|
391
|
-
assert_equal
|
409
|
+
assert_equal 'parked', transition.from
|
410
|
+
assert_equal 'idling', transition.to
|
411
|
+
assert_equal :ignite, transition.event
|
392
412
|
end
|
393
413
|
|
394
414
|
def test_should_fire
|
@@ -397,7 +417,7 @@ class EventWithMultipleTransitionsTest < Test::Unit::TestCase
|
|
397
417
|
|
398
418
|
def test_should_change_the_current_state
|
399
419
|
@event.fire(@object)
|
400
|
-
assert_equal '
|
420
|
+
assert_equal 'idling', @object.state
|
401
421
|
end
|
402
422
|
end
|
403
423
|
|
@@ -408,18 +428,18 @@ begin
|
|
408
428
|
|
409
429
|
class EventDrawingTest < Test::Unit::TestCase
|
410
430
|
def setup
|
411
|
-
states =
|
431
|
+
states = [:parked, :idling, :first_gear]
|
412
432
|
|
413
|
-
@machine = StateMachine::Machine.new(Class.new, :initial =>
|
414
|
-
@machine.other_states(states)
|
433
|
+
@machine = StateMachine::Machine.new(Class.new, :initial => :parked)
|
434
|
+
@machine.other_states(*states)
|
415
435
|
|
416
436
|
graph = GraphViz.new('G')
|
417
|
-
states.each {|state| graph.add_node(state)}
|
437
|
+
states.each {|state| graph.add_node(state.to_s)}
|
418
438
|
|
419
|
-
@event = StateMachine::Event.new(@machine ,
|
420
|
-
@event.transition :from =>
|
421
|
-
@event.transition :from =>
|
422
|
-
@event.transition :except_from =>
|
439
|
+
@event = StateMachine::Event.new(@machine , :park)
|
440
|
+
@event.transition :from => :idling, :to => :parked
|
441
|
+
@event.transition :from => :first_gear, :to => :parked
|
442
|
+
@event.transition :except_from => :parked, :to => :parked
|
423
443
|
|
424
444
|
@edges = @event.draw(graph)
|
425
445
|
end
|
@@ -433,5 +453,5 @@ begin
|
|
433
453
|
end
|
434
454
|
end
|
435
455
|
rescue LoadError
|
436
|
-
$stderr.puts 'Skipping GraphViz StateMachine::
|
456
|
+
$stderr.puts 'Skipping GraphViz StateMachine::Event tests. `gem install ruby-graphviz` and try again.'
|
437
457
|
end
|