spree-state_machine 2.0.0.beta1
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.
- checksums.yaml +7 -0
- data/.gitignore +8 -0
- data/.travis.yml +12 -0
- data/.yardopts +5 -0
- data/CHANGELOG.md +502 -0
- data/Gemfile +3 -0
- data/LICENSE +20 -0
- data/README.md +1246 -0
- data/Rakefile +20 -0
- data/examples/AutoShop_state.png +0 -0
- data/examples/Car_state.png +0 -0
- data/examples/Gemfile +5 -0
- data/examples/Gemfile.lock +14 -0
- data/examples/TrafficLight_state.png +0 -0
- data/examples/Vehicle_state.png +0 -0
- data/examples/auto_shop.rb +13 -0
- data/examples/car.rb +21 -0
- data/examples/doc/AutoShop.html +2856 -0
- data/examples/doc/AutoShop_state.png +0 -0
- data/examples/doc/Car.html +919 -0
- data/examples/doc/Car_state.png +0 -0
- data/examples/doc/TrafficLight.html +2230 -0
- data/examples/doc/TrafficLight_state.png +0 -0
- data/examples/doc/Vehicle.html +7921 -0
- data/examples/doc/Vehicle_state.png +0 -0
- data/examples/doc/_index.html +136 -0
- data/examples/doc/class_list.html +47 -0
- data/examples/doc/css/common.css +1 -0
- data/examples/doc/css/full_list.css +55 -0
- data/examples/doc/css/style.css +322 -0
- data/examples/doc/file_list.html +46 -0
- data/examples/doc/frames.html +13 -0
- data/examples/doc/index.html +136 -0
- data/examples/doc/js/app.js +205 -0
- data/examples/doc/js/full_list.js +173 -0
- data/examples/doc/js/jquery.js +16 -0
- data/examples/doc/method_list.html +734 -0
- data/examples/doc/top-level-namespace.html +105 -0
- data/examples/merb-rest/controller.rb +51 -0
- data/examples/merb-rest/model.rb +28 -0
- data/examples/merb-rest/view_edit.html.erb +24 -0
- data/examples/merb-rest/view_index.html.erb +23 -0
- data/examples/merb-rest/view_new.html.erb +13 -0
- data/examples/merb-rest/view_show.html.erb +17 -0
- data/examples/rails-rest/controller.rb +43 -0
- data/examples/rails-rest/migration.rb +7 -0
- data/examples/rails-rest/model.rb +23 -0
- data/examples/rails-rest/view__form.html.erb +34 -0
- data/examples/rails-rest/view_edit.html.erb +6 -0
- data/examples/rails-rest/view_index.html.erb +25 -0
- data/examples/rails-rest/view_new.html.erb +5 -0
- data/examples/rails-rest/view_show.html.erb +19 -0
- data/examples/traffic_light.rb +9 -0
- data/examples/vehicle.rb +33 -0
- data/lib/state_machine/assertions.rb +36 -0
- data/lib/state_machine/branch.rb +225 -0
- data/lib/state_machine/callback.rb +236 -0
- data/lib/state_machine/core.rb +7 -0
- data/lib/state_machine/core_ext/class/state_machine.rb +5 -0
- data/lib/state_machine/core_ext.rb +2 -0
- data/lib/state_machine/error.rb +13 -0
- data/lib/state_machine/eval_helpers.rb +87 -0
- data/lib/state_machine/event.rb +257 -0
- data/lib/state_machine/event_collection.rb +141 -0
- data/lib/state_machine/extensions.rb +149 -0
- data/lib/state_machine/graph.rb +92 -0
- data/lib/state_machine/helper_module.rb +17 -0
- data/lib/state_machine/initializers/rails.rb +25 -0
- data/lib/state_machine/initializers.rb +4 -0
- data/lib/state_machine/integrations/active_model/locale.rb +11 -0
- data/lib/state_machine/integrations/active_model/observer.rb +33 -0
- data/lib/state_machine/integrations/active_model/observer_update.rb +42 -0
- data/lib/state_machine/integrations/active_model/versions.rb +31 -0
- data/lib/state_machine/integrations/active_model.rb +585 -0
- data/lib/state_machine/integrations/active_record/locale.rb +20 -0
- data/lib/state_machine/integrations/active_record/versions.rb +123 -0
- data/lib/state_machine/integrations/active_record.rb +525 -0
- data/lib/state_machine/integrations/base.rb +100 -0
- data/lib/state_machine/integrations.rb +121 -0
- data/lib/state_machine/machine.rb +2287 -0
- data/lib/state_machine/machine_collection.rb +74 -0
- data/lib/state_machine/macro_methods.rb +522 -0
- data/lib/state_machine/matcher.rb +123 -0
- data/lib/state_machine/matcher_helpers.rb +54 -0
- data/lib/state_machine/node_collection.rb +222 -0
- data/lib/state_machine/path.rb +120 -0
- data/lib/state_machine/path_collection.rb +90 -0
- data/lib/state_machine/state.rb +297 -0
- data/lib/state_machine/state_collection.rb +112 -0
- data/lib/state_machine/state_context.rb +138 -0
- data/lib/state_machine/transition.rb +470 -0
- data/lib/state_machine/transition_collection.rb +245 -0
- data/lib/state_machine/version.rb +3 -0
- data/lib/state_machine/yard/handlers/base.rb +32 -0
- data/lib/state_machine/yard/handlers/event.rb +25 -0
- data/lib/state_machine/yard/handlers/machine.rb +344 -0
- data/lib/state_machine/yard/handlers/state.rb +25 -0
- data/lib/state_machine/yard/handlers/transition.rb +47 -0
- data/lib/state_machine/yard/handlers.rb +12 -0
- data/lib/state_machine/yard/templates/default/class/html/setup.rb +30 -0
- data/lib/state_machine/yard/templates/default/class/html/state_machines.erb +12 -0
- data/lib/state_machine/yard/templates.rb +3 -0
- data/lib/state_machine/yard.rb +8 -0
- data/lib/state_machine.rb +8 -0
- data/lib/yard-state_machine.rb +2 -0
- data/state_machine.gemspec +22 -0
- data/test/files/en.yml +17 -0
- data/test/files/switch.rb +15 -0
- data/test/functional/state_machine_test.rb +1066 -0
- data/test/test_helper.rb +7 -0
- data/test/unit/assertions_test.rb +40 -0
- data/test/unit/branch_test.rb +969 -0
- data/test/unit/callback_test.rb +704 -0
- data/test/unit/error_test.rb +43 -0
- data/test/unit/eval_helpers_test.rb +270 -0
- data/test/unit/event_collection_test.rb +398 -0
- data/test/unit/event_test.rb +1196 -0
- data/test/unit/graph_test.rb +98 -0
- data/test/unit/helper_module_test.rb +17 -0
- data/test/unit/integrations/active_model_test.rb +1245 -0
- data/test/unit/integrations/active_record_test.rb +2551 -0
- data/test/unit/integrations/base_test.rb +104 -0
- data/test/unit/integrations_test.rb +71 -0
- data/test/unit/invalid_event_test.rb +20 -0
- data/test/unit/invalid_parallel_transition_test.rb +18 -0
- data/test/unit/invalid_transition_test.rb +115 -0
- data/test/unit/machine_collection_test.rb +603 -0
- data/test/unit/machine_test.rb +3395 -0
- data/test/unit/matcher_helpers_test.rb +37 -0
- data/test/unit/matcher_test.rb +155 -0
- data/test/unit/node_collection_test.rb +362 -0
- data/test/unit/path_collection_test.rb +266 -0
- data/test/unit/path_test.rb +485 -0
- data/test/unit/state_collection_test.rb +352 -0
- data/test/unit/state_context_test.rb +441 -0
- data/test/unit/state_machine_test.rb +31 -0
- data/test/unit/state_test.rb +1101 -0
- data/test/unit/transition_collection_test.rb +2168 -0
- data/test/unit/transition_test.rb +1558 -0
- metadata +264 -0
@@ -0,0 +1,266 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
2
|
+
|
3
|
+
class PathCollectionByDefaultTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@klass = Class.new
|
6
|
+
@machine = StateMachine::Machine.new(@klass)
|
7
|
+
@machine.state :parked
|
8
|
+
|
9
|
+
@object = @klass.new
|
10
|
+
@object.state = 'parked'
|
11
|
+
|
12
|
+
@paths = StateMachine::PathCollection.new(@object, @machine)
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_should_have_an_object
|
16
|
+
assert_equal @object, @paths.object
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_should_have_a_machine
|
20
|
+
assert_equal @machine, @paths.machine
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_should_have_a_from_name
|
24
|
+
assert_equal :parked, @paths.from_name
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_should_not_have_a_to_name
|
28
|
+
assert_nil @paths.to_name
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_should_have_no_from_states
|
32
|
+
assert_equal [], @paths.from_states
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_should_have_no_to_states
|
36
|
+
assert_equal [], @paths.to_states
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_should_have_no_events
|
40
|
+
assert_equal [], @paths.events
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_should_have_no_paths
|
44
|
+
assert @paths.empty?
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
class PathCollectionTest < Test::Unit::TestCase
|
49
|
+
def setup
|
50
|
+
@klass = Class.new
|
51
|
+
@machine = StateMachine::Machine.new(@klass)
|
52
|
+
@object = @klass.new
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_should_raise_exception_if_invalid_option_specified
|
56
|
+
exception = assert_raise(ArgumentError) {StateMachine::PathCollection.new(@object, @machine, :invalid => true)}
|
57
|
+
assert_equal 'Invalid key(s): invalid', exception.message
|
58
|
+
end
|
59
|
+
|
60
|
+
def test_should_raise_exception_if_invalid_from_state_specified
|
61
|
+
exception = assert_raise(IndexError) {StateMachine::PathCollection.new(@object, @machine, :from => :invalid)}
|
62
|
+
assert_equal ':invalid is an invalid name', exception.message
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_should_raise_exception_if_invalid_to_state_specified
|
66
|
+
exception = assert_raise(IndexError) {StateMachine::PathCollection.new(@object, @machine, :to => :invalid)}
|
67
|
+
assert_equal ':invalid is an invalid name', exception.message
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
class PathCollectionWithPathsTest < Test::Unit::TestCase
|
72
|
+
def setup
|
73
|
+
@klass = Class.new
|
74
|
+
@machine = StateMachine::Machine.new(@klass)
|
75
|
+
@machine.state :parked, :idling, :first_gear
|
76
|
+
@machine.event :ignite do
|
77
|
+
transition :parked => :idling
|
78
|
+
end
|
79
|
+
@machine.event :shift_up do
|
80
|
+
transition :idling => :first_gear
|
81
|
+
end
|
82
|
+
|
83
|
+
@object = @klass.new
|
84
|
+
@object.state = 'parked'
|
85
|
+
|
86
|
+
@paths = StateMachine::PathCollection.new(@object, @machine)
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_should_enumerate_paths
|
90
|
+
assert_equal [[
|
91
|
+
StateMachine::Transition.new(@object, @machine, :ignite, :parked, :idling),
|
92
|
+
StateMachine::Transition.new(@object, @machine, :shift_up, :idling, :first_gear)
|
93
|
+
]], @paths
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_should_have_a_from_name
|
97
|
+
assert_equal :parked, @paths.from_name
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_should_not_have_a_to_name
|
101
|
+
assert_nil @paths.to_name
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_should_have_from_states
|
105
|
+
assert_equal [:parked, :idling], @paths.from_states
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_should_have_to_states
|
109
|
+
assert_equal [:idling, :first_gear], @paths.to_states
|
110
|
+
end
|
111
|
+
|
112
|
+
def test_should_have_no_events
|
113
|
+
assert_equal [:ignite, :shift_up], @paths.events
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
class PathWithGuardedPathsTest < Test::Unit::TestCase
|
118
|
+
def setup
|
119
|
+
@klass = Class.new
|
120
|
+
@machine = StateMachine::Machine.new(@klass)
|
121
|
+
@machine.state :parked, :idling, :first_gear
|
122
|
+
@machine.event :ignite do
|
123
|
+
transition :parked => :idling, :if => lambda {false}
|
124
|
+
end
|
125
|
+
|
126
|
+
@object = @klass.new
|
127
|
+
@object.state = 'parked'
|
128
|
+
end
|
129
|
+
|
130
|
+
def test_should_not_enumerate_paths_if_guard_enabled
|
131
|
+
assert_equal [], StateMachine::PathCollection.new(@object, @machine)
|
132
|
+
end
|
133
|
+
|
134
|
+
def test_should_enumerate_paths_if_guard_disabled
|
135
|
+
paths = StateMachine::PathCollection.new(@object, @machine, :guard => false)
|
136
|
+
assert_equal [[
|
137
|
+
StateMachine::Transition.new(@object, @machine, :ignite, :parked, :idling)
|
138
|
+
]], paths
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
class PathCollectionWithDuplicateNodesTest < Test::Unit::TestCase
|
143
|
+
def setup
|
144
|
+
@klass = Class.new
|
145
|
+
@machine = StateMachine::Machine.new(@klass)
|
146
|
+
@machine.state :parked, :idling
|
147
|
+
@machine.event :shift_up do
|
148
|
+
transition :parked => :idling, :idling => :first_gear
|
149
|
+
end
|
150
|
+
@machine.event :park do
|
151
|
+
transition :first_gear => :idling
|
152
|
+
end
|
153
|
+
@object = @klass.new
|
154
|
+
@object.state = 'parked'
|
155
|
+
|
156
|
+
@paths = StateMachine::PathCollection.new(@object, @machine)
|
157
|
+
end
|
158
|
+
|
159
|
+
def test_should_not_include_duplicates_in_from_states
|
160
|
+
assert_equal [:parked, :idling, :first_gear], @paths.from_states
|
161
|
+
end
|
162
|
+
|
163
|
+
def test_should_not_include_duplicates_in_to_states
|
164
|
+
assert_equal [:idling, :first_gear], @paths.to_states
|
165
|
+
end
|
166
|
+
|
167
|
+
def test_should_not_include_duplicates_in_events
|
168
|
+
assert_equal [:shift_up, :park], @paths.events
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
class PathCollectionWithFromStateTest < Test::Unit::TestCase
|
173
|
+
def setup
|
174
|
+
@klass = Class.new
|
175
|
+
@machine = StateMachine::Machine.new(@klass)
|
176
|
+
@machine.state :parked, :idling, :first_gear
|
177
|
+
@machine.event :park do
|
178
|
+
transition :idling => :parked
|
179
|
+
end
|
180
|
+
|
181
|
+
@object = @klass.new
|
182
|
+
@object.state = 'parked'
|
183
|
+
|
184
|
+
@paths = StateMachine::PathCollection.new(@object, @machine, :from => :idling)
|
185
|
+
end
|
186
|
+
|
187
|
+
def test_should_generate_paths_from_custom_from_state
|
188
|
+
assert_equal [[
|
189
|
+
StateMachine::Transition.new(@object, @machine, :park, :idling, :parked)
|
190
|
+
]], @paths
|
191
|
+
end
|
192
|
+
|
193
|
+
def test_should_have_a_from_name
|
194
|
+
assert_equal :idling, @paths.from_name
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
class PathCollectionWithToStateTest < Test::Unit::TestCase
|
199
|
+
def setup
|
200
|
+
@klass = Class.new
|
201
|
+
@machine = StateMachine::Machine.new(@klass)
|
202
|
+
@machine.state :parked, :idling
|
203
|
+
@machine.event :ignite do
|
204
|
+
transition :parked => :idling
|
205
|
+
end
|
206
|
+
@machine.event :shift_up do
|
207
|
+
transition :parked => :idling, :idling => :first_gear
|
208
|
+
end
|
209
|
+
@machine.event :shift_down do
|
210
|
+
transition :first_gear => :idling
|
211
|
+
end
|
212
|
+
@object = @klass.new
|
213
|
+
@object.state = 'parked'
|
214
|
+
|
215
|
+
@paths = StateMachine::PathCollection.new(@object, @machine, :to => :idling)
|
216
|
+
end
|
217
|
+
|
218
|
+
def test_should_stop_paths_once_target_state_reached
|
219
|
+
assert_equal [
|
220
|
+
[StateMachine::Transition.new(@object, @machine, :ignite, :parked, :idling)],
|
221
|
+
[StateMachine::Transition.new(@object, @machine, :shift_up, :parked, :idling)]
|
222
|
+
], @paths
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
class PathCollectionWithDeepPathsTest < Test::Unit::TestCase
|
227
|
+
def setup
|
228
|
+
@klass = Class.new
|
229
|
+
@machine = StateMachine::Machine.new(@klass)
|
230
|
+
@machine.state :parked, :idling
|
231
|
+
@machine.event :ignite do
|
232
|
+
transition :parked => :idling
|
233
|
+
end
|
234
|
+
@machine.event :shift_up do
|
235
|
+
transition :parked => :idling, :idling => :first_gear
|
236
|
+
end
|
237
|
+
@machine.event :shift_down do
|
238
|
+
transition :first_gear => :idling
|
239
|
+
end
|
240
|
+
@object = @klass.new
|
241
|
+
@object.state = 'parked'
|
242
|
+
|
243
|
+
@paths = StateMachine::PathCollection.new(@object, @machine, :to => :idling, :deep => true)
|
244
|
+
end
|
245
|
+
|
246
|
+
def test_should_allow_target_to_be_reached_more_than_once_per_path
|
247
|
+
assert_equal [
|
248
|
+
[
|
249
|
+
StateMachine::Transition.new(@object, @machine, :ignite, :parked, :idling)
|
250
|
+
],
|
251
|
+
[
|
252
|
+
StateMachine::Transition.new(@object, @machine, :ignite, :parked, :idling),
|
253
|
+
StateMachine::Transition.new(@object, @machine, :shift_up, :idling, :first_gear),
|
254
|
+
StateMachine::Transition.new(@object, @machine, :shift_down, :first_gear, :idling)
|
255
|
+
],
|
256
|
+
[
|
257
|
+
StateMachine::Transition.new(@object, @machine, :shift_up, :parked, :idling)
|
258
|
+
],
|
259
|
+
[
|
260
|
+
StateMachine::Transition.new(@object, @machine, :shift_up, :parked, :idling),
|
261
|
+
StateMachine::Transition.new(@object, @machine, :shift_up, :idling, :first_gear),
|
262
|
+
StateMachine::Transition.new(@object, @machine, :shift_down, :first_gear, :idling)
|
263
|
+
]
|
264
|
+
], @paths
|
265
|
+
end
|
266
|
+
end
|