state_machine 0.7.1 → 0.7.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +7 -0
- data/Rakefile +1 -1
- data/lib/state_machine.rb +0 -4
- data/lib/state_machine/callback.rb +21 -19
- data/lib/state_machine/integrations/active_record.rb +32 -0
- data/lib/state_machine/integrations/data_mapper.rb +38 -0
- data/lib/state_machine/integrations/sequel.rb +35 -0
- data/lib/state_machine/machine.rb +33 -8
- data/lib/state_machine/transition.rb +4 -6
- data/test/active_record.log +9825 -0
- data/test/sequel.log +3276 -0
- data/test/unit/callback_test.rb +213 -41
- data/test/unit/machine_collection_test.rb +31 -46
- data/test/unit/machine_test.rb +2 -2
- data/test/unit/transition_test.rb +4 -21
- metadata +2 -2
data/test/unit/callback_test.rb
CHANGED
@@ -1,15 +1,23 @@
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
2
2
|
|
3
3
|
class CallbackTest < Test::Unit::TestCase
|
4
|
-
def
|
4
|
+
def test_should_raise_exception_if_no_methods_specified
|
5
5
|
exception = assert_raise(ArgumentError) { StateMachine::Callback.new }
|
6
|
-
assert_equal '
|
6
|
+
assert_equal 'Method(s) for callback must be specified', exception.message
|
7
7
|
end
|
8
8
|
|
9
|
-
def
|
9
|
+
def test_should_not_raise_exception_if_method_specified_in_do_option
|
10
10
|
assert_nothing_raised { StateMachine::Callback.new(:do => :run) }
|
11
11
|
end
|
12
12
|
|
13
|
+
def test_should_not_raise_exception_if_method_specified_as_argument
|
14
|
+
assert_nothing_raised { StateMachine::Callback.new(:run) }
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_should_not_raise_exception_if_method_specified_as_block
|
18
|
+
assert_nothing_raised { StateMachine::Callback.new(:run) {} }
|
19
|
+
end
|
20
|
+
|
13
21
|
def test_should_not_raise_exception_if_implicit_option_specified
|
14
22
|
assert_nothing_raised { StateMachine::Callback.new(:do => :run, :invalid => true) }
|
15
23
|
end
|
@@ -25,9 +33,7 @@ end
|
|
25
33
|
|
26
34
|
class CallbackByDefaultTest < Test::Unit::TestCase
|
27
35
|
def setup
|
28
|
-
@
|
29
|
-
@method = lambda {|*args| args.unshift(self)}
|
30
|
-
@callback = StateMachine::Callback.new(:do => @method)
|
36
|
+
@callback = StateMachine::Callback.new(:do => lambda {})
|
31
37
|
end
|
32
38
|
|
33
39
|
def test_should_not_have_a_terminator
|
@@ -40,30 +46,154 @@ class CallbackByDefaultTest < Test::Unit::TestCase
|
|
40
46
|
assert_equal StateMachine::AllMatcher.instance, @callback.guard.state_requirements.first[:to]
|
41
47
|
end
|
42
48
|
|
43
|
-
def test_should_not_bind_to_the_object
|
44
|
-
assert_equal [self, @object], @callback.call(@object)
|
45
|
-
end
|
46
|
-
|
47
49
|
def test_should_not_have_any_known_states
|
48
50
|
assert_equal [], @callback.known_states
|
49
51
|
end
|
50
52
|
end
|
51
53
|
|
52
|
-
class
|
54
|
+
class CallbackWithMethodArgumentTest < Test::Unit::TestCase
|
55
|
+
def setup
|
56
|
+
@callback = StateMachine::Callback.new(lambda {|*args| @args = args})
|
57
|
+
|
58
|
+
@object = Object.new
|
59
|
+
@result = @callback.call(@object)
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_should_be_successful
|
63
|
+
assert @result
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_should_call_with_empty_context
|
67
|
+
assert_equal [@object], @args
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
class CallbackWithMultipleMethodArgumentsTest < Test::Unit::TestCase
|
72
|
+
def setup
|
73
|
+
@callback = StateMachine::Callback.new(:run_1, :run_2)
|
74
|
+
|
75
|
+
class << @object = Object.new
|
76
|
+
attr_accessor :callbacks
|
77
|
+
|
78
|
+
def run_1
|
79
|
+
(@callbacks ||= []) << :run_1
|
80
|
+
end
|
81
|
+
|
82
|
+
def run_2
|
83
|
+
(@callbacks ||= []) << :run_2
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
@result = @callback.call(@object)
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_should_be_successful
|
91
|
+
assert @result
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_should_call_each_callback_in_order
|
95
|
+
assert_equal [:run_1, :run_2], @object.callbacks
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
class CallbackWithDoMethodTest < Test::Unit::TestCase
|
100
|
+
def setup
|
101
|
+
@callback = StateMachine::Callback.new(:do => lambda {|*args| @args = args})
|
102
|
+
|
103
|
+
@object = Object.new
|
104
|
+
@result = @callback.call(@object)
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_should_be_successful
|
108
|
+
assert @result
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_should_call_with_empty_context
|
112
|
+
assert_equal [@object], @args
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
class CallbackWithMultipleDoMethodsTest < Test::Unit::TestCase
|
117
|
+
def setup
|
118
|
+
@callback = StateMachine::Callback.new(:do => [:run_1, :run_2])
|
119
|
+
|
120
|
+
class << @object = Object.new
|
121
|
+
attr_accessor :callbacks
|
122
|
+
|
123
|
+
def run_1
|
124
|
+
(@callbacks ||= []) << :run_1
|
125
|
+
end
|
126
|
+
|
127
|
+
def run_2
|
128
|
+
(@callbacks ||= []) << :run_2
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
@result = @callback.call(@object)
|
133
|
+
end
|
134
|
+
|
135
|
+
def test_should_be_successful
|
136
|
+
assert @result
|
137
|
+
end
|
138
|
+
|
139
|
+
def test_should_call_each_callback_in_order
|
140
|
+
assert_equal [:run_1, :run_2], @object.callbacks
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
class CallbackWithBlockTest < Test::Unit::TestCase
|
53
145
|
def setup
|
146
|
+
@callback = StateMachine::Callback.new do |*args|
|
147
|
+
@args = args
|
148
|
+
end
|
149
|
+
|
54
150
|
@object = Object.new
|
55
|
-
@
|
151
|
+
@result = @callback.call(@object)
|
152
|
+
end
|
153
|
+
|
154
|
+
def test_should_be_successful
|
155
|
+
assert @result
|
56
156
|
end
|
57
157
|
|
58
158
|
def test_should_call_with_empty_context
|
59
|
-
|
159
|
+
assert_equal [@object], @args
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
class CallbackWithMixedMethodsTest < Test::Unit::TestCase
|
164
|
+
def setup
|
165
|
+
@callback = StateMachine::Callback.new(:run_argument, :do => :run_do) do |object|
|
166
|
+
object.callbacks << :block
|
167
|
+
end
|
168
|
+
|
169
|
+
class << @object = Object.new
|
170
|
+
attr_accessor :callbacks
|
171
|
+
|
172
|
+
def run_argument
|
173
|
+
(@callbacks ||= []) << :argument
|
174
|
+
end
|
175
|
+
|
176
|
+
def run_do
|
177
|
+
(@callbacks ||= []) << :do
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
@result = @callback.call(@object)
|
182
|
+
end
|
183
|
+
|
184
|
+
def test_should_be_successful
|
185
|
+
assert @result
|
186
|
+
end
|
187
|
+
|
188
|
+
def test_should_call_each_callback_in_order
|
189
|
+
assert_equal [:argument, :do, :block], @object.callbacks
|
60
190
|
end
|
61
191
|
end
|
62
192
|
|
63
193
|
class CallbackWithExplicitRequirementsTest < Test::Unit::TestCase
|
64
194
|
def setup
|
65
195
|
@object = Object.new
|
66
|
-
@callback = StateMachine::Callback.new(:from => :parked, :to => :idling, :on => :ignite, :do => lambda {
|
196
|
+
@callback = StateMachine::Callback.new(:from => :parked, :to => :idling, :on => :ignite, :do => lambda {})
|
67
197
|
end
|
68
198
|
|
69
199
|
def test_should_call_with_empty_context
|
@@ -94,7 +224,7 @@ end
|
|
94
224
|
class CallbackWithImplicitRequirementsTest < Test::Unit::TestCase
|
95
225
|
def setup
|
96
226
|
@object = Object.new
|
97
|
-
@callback = StateMachine::Callback.new(:parked => :idling, :on => :ignite, :do => lambda {
|
227
|
+
@callback = StateMachine::Callback.new(:parked => :idling, :on => :ignite, :do => lambda {})
|
98
228
|
end
|
99
229
|
|
100
230
|
def test_should_call_with_empty_context
|
@@ -128,12 +258,12 @@ class CallbackWithIfConditionTest < Test::Unit::TestCase
|
|
128
258
|
end
|
129
259
|
|
130
260
|
def test_should_call_if_true
|
131
|
-
callback = StateMachine::Callback.new(:if => lambda {true}, :do => lambda {
|
261
|
+
callback = StateMachine::Callback.new(:if => lambda {true}, :do => lambda {})
|
132
262
|
assert callback.call(@object)
|
133
263
|
end
|
134
264
|
|
135
265
|
def test_should_not_call_if_false
|
136
|
-
callback = StateMachine::Callback.new(:if => lambda {false}, :do => lambda {
|
266
|
+
callback = StateMachine::Callback.new(:if => lambda {false}, :do => lambda {})
|
137
267
|
assert !callback.call(@object)
|
138
268
|
end
|
139
269
|
end
|
@@ -144,12 +274,12 @@ class CallbackWithUnlessConditionTest < Test::Unit::TestCase
|
|
144
274
|
end
|
145
275
|
|
146
276
|
def test_should_call_if_false
|
147
|
-
callback = StateMachine::Callback.new(:unless => lambda {false}, :do => lambda {
|
277
|
+
callback = StateMachine::Callback.new(:unless => lambda {false}, :do => lambda {})
|
148
278
|
assert callback.call(@object)
|
149
279
|
end
|
150
280
|
|
151
281
|
def test_should_not_call_if_true
|
152
|
-
callback = StateMachine::Callback.new(:unless => lambda {true}, :do => lambda {
|
282
|
+
callback = StateMachine::Callback.new(:unless => lambda {true}, :do => lambda {})
|
153
283
|
assert !callback.call(@object)
|
154
284
|
end
|
155
285
|
end
|
@@ -171,73 +301,111 @@ class CallbackWithTerminatorTest < Test::Unit::TestCase
|
|
171
301
|
end
|
172
302
|
|
173
303
|
def test_should_not_halt_if_terminator_does_not_match
|
174
|
-
callback = StateMachine::Callback.new(:do => lambda {false}, :terminator => lambda {|result|
|
304
|
+
callback = StateMachine::Callback.new(:do => lambda {false}, :terminator => lambda {|result| result == true})
|
175
305
|
assert_nothing_thrown { callback.call(@object) }
|
176
306
|
end
|
177
307
|
|
178
308
|
def test_should_halt_if_terminator_matches
|
179
|
-
callback = StateMachine::Callback.new(:do => lambda {false}, :terminator => lambda {|result|
|
309
|
+
callback = StateMachine::Callback.new(:do => lambda {false}, :terminator => lambda {|result| result == false})
|
310
|
+
assert_throws(:halt) { callback.call(@object) }
|
311
|
+
end
|
312
|
+
|
313
|
+
def test_should_halt_if_terminator_matches_any_method
|
314
|
+
callback = StateMachine::Callback.new(:do => [lambda {true}, lambda {false}], :terminator => lambda {|result| result == false})
|
180
315
|
assert_throws(:halt) { callback.call(@object) }
|
181
316
|
end
|
182
317
|
end
|
183
318
|
|
184
319
|
class CallbackWithoutArgumentsTest < Test::Unit::TestCase
|
185
320
|
def setup
|
321
|
+
@callback = StateMachine::Callback.new(:do => lambda {|object| @arg = object})
|
322
|
+
|
186
323
|
@object = Object.new
|
187
|
-
@callback
|
324
|
+
@callback.call(@object, {}, 1, 2, 3)
|
188
325
|
end
|
189
326
|
|
190
327
|
def test_should_call_method_with_object_as_argument
|
191
|
-
assert_equal @object, @
|
328
|
+
assert_equal @object, @arg
|
192
329
|
end
|
193
330
|
end
|
194
331
|
|
195
332
|
class CallbackWithArgumentsTest < Test::Unit::TestCase
|
196
333
|
def setup
|
334
|
+
@callback = StateMachine::Callback.new(:do => lambda {|*args| @args = args})
|
335
|
+
|
197
336
|
@object = Object.new
|
198
|
-
@callback
|
337
|
+
@callback.call(@object, {}, 1, 2, 3)
|
199
338
|
end
|
200
339
|
|
201
340
|
def test_should_call_method_with_all_arguments
|
202
|
-
assert_equal [@object, 1, 2, 3], @
|
341
|
+
assert_equal [@object, 1, 2, 3], @args
|
203
342
|
end
|
204
343
|
end
|
205
344
|
|
206
|
-
class
|
345
|
+
class CallbackWithUnboundMethodTest < Test::Unit::TestCase
|
207
346
|
def setup
|
347
|
+
@callback = StateMachine::Callback.new(:do => lambda {|*args| @context = args.unshift(self)})
|
348
|
+
|
208
349
|
@object = Object.new
|
209
|
-
@callback
|
350
|
+
@callback.call(@object, {}, 1, 2, 3)
|
210
351
|
end
|
211
352
|
|
212
353
|
def test_should_call_method_outside_the_context_of_the_object
|
213
|
-
assert_equal [self, @object, 1, 2, 3], @
|
354
|
+
assert_equal [self, @object, 1, 2, 3], @context
|
214
355
|
end
|
215
356
|
end
|
216
357
|
|
217
|
-
class
|
358
|
+
class CallbackWithBoundMethodTest < Test::Unit::TestCase
|
218
359
|
def setup
|
219
360
|
@object = Object.new
|
220
|
-
@callback = StateMachine::Callback.new(:do => lambda {|*args| args.unshift(self)}, :bind_to_object => true)
|
221
361
|
end
|
222
362
|
|
223
|
-
def
|
224
|
-
|
363
|
+
def test_should_call_method_within_the_context_of_the_object_for_block_methods
|
364
|
+
context = nil
|
365
|
+
callback = StateMachine::Callback.new(:do => lambda {|*args| context = [self] + args}, :bind_to_object => true)
|
366
|
+
callback.call(@object, {}, 1, 2, 3)
|
367
|
+
|
368
|
+
assert_equal [@object, 1, 2, 3], context
|
225
369
|
end
|
226
370
|
|
227
|
-
def
|
371
|
+
def test_should_ignore_option_for_symbolic_methods
|
228
372
|
class << @object
|
373
|
+
attr_reader :context
|
374
|
+
|
229
375
|
def after_ignite(*args)
|
230
|
-
args
|
376
|
+
@context = args
|
231
377
|
end
|
232
378
|
end
|
233
379
|
|
234
|
-
|
235
|
-
|
380
|
+
callback = StateMachine::Callback.new(:do => :after_ignite, :bind_to_object => true)
|
381
|
+
callback.call(@object)
|
382
|
+
|
383
|
+
assert_equal [], @object.context
|
236
384
|
end
|
237
385
|
|
238
|
-
def
|
239
|
-
|
240
|
-
|
386
|
+
def test_should_ignore_option_for_string_methods
|
387
|
+
callback = StateMachine::Callback.new(:do => '[1, 2, 3]', :bind_to_object => true)
|
388
|
+
assert callback.call(@object)
|
389
|
+
end
|
390
|
+
end
|
391
|
+
|
392
|
+
class CallbackWithMultipleBoundMethodsTest < Test::Unit::TestCase
|
393
|
+
def setup
|
394
|
+
@object = Object.new
|
395
|
+
|
396
|
+
first_context = nil
|
397
|
+
second_context = nil
|
398
|
+
|
399
|
+
@callback = StateMachine::Callback.new(:do => [lambda {first_context = self}, lambda {second_context = self}], :bind_to_object => true)
|
400
|
+
@callback.call(@object)
|
401
|
+
|
402
|
+
@first_context = first_context
|
403
|
+
@second_context = second_context
|
404
|
+
end
|
405
|
+
|
406
|
+
def test_should_call_each_method_within_the_context_of_the_object
|
407
|
+
assert_equal @object, @first_context
|
408
|
+
assert_equal @object, @second_context
|
241
409
|
end
|
242
410
|
end
|
243
411
|
|
@@ -246,12 +414,16 @@ class CallbackWithApplicationBoundObjectTest < Test::Unit::TestCase
|
|
246
414
|
@original_bind_to_object = StateMachine::Callback.bind_to_object
|
247
415
|
StateMachine::Callback.bind_to_object = true
|
248
416
|
|
417
|
+
context = nil
|
418
|
+
@callback = StateMachine::Callback.new(:do => lambda {|*args| context = self})
|
419
|
+
|
249
420
|
@object = Object.new
|
250
|
-
@callback
|
421
|
+
@callback.call(@object)
|
422
|
+
@context = context
|
251
423
|
end
|
252
424
|
|
253
425
|
def test_should_call_method_within_the_context_of_the_object
|
254
|
-
assert_equal @object, @
|
426
|
+
assert_equal @object, @context
|
255
427
|
end
|
256
428
|
|
257
429
|
def teardown
|
@@ -319,10 +319,6 @@ class MachineCollectionFireImplicitWithInvalidEventTest < MachineCollectionFireI
|
|
319
319
|
def test_should_not_reset_event_attribute
|
320
320
|
assert_equal :invalid, @object.state_event
|
321
321
|
end
|
322
|
-
|
323
|
-
def test_should_not_have_event_transition
|
324
|
-
assert_nil @object.state_event_transition
|
325
|
-
end
|
326
322
|
end
|
327
323
|
|
328
324
|
class MachineCollectionFireImplicitWithoutTransitionTest < MachineCollectionFireImplicitTest
|
@@ -349,10 +345,6 @@ class MachineCollectionFireImplicitWithoutTransitionTest < MachineCollectionFire
|
|
349
345
|
def test_should_not_reset_event_attribute
|
350
346
|
assert_equal :ignite, @object.state_event
|
351
347
|
end
|
352
|
-
|
353
|
-
def test_should_not_have_event_transition
|
354
|
-
assert_nil @object.state_event_transition
|
355
|
-
end
|
356
348
|
end
|
357
349
|
|
358
350
|
class MachineCollectionFireImplicitWithTransitionTest < MachineCollectionFireImplicitTest
|
@@ -360,12 +352,10 @@ class MachineCollectionFireImplicitWithTransitionTest < MachineCollectionFireImp
|
|
360
352
|
super
|
361
353
|
|
362
354
|
@state_event = nil
|
363
|
-
@state_event_transition = nil
|
364
355
|
|
365
356
|
@object.state_event = 'ignite'
|
366
357
|
@result = @machines.fire_attribute_events(@object, :save) do
|
367
358
|
@state_event = @object.state_event
|
368
|
-
@state_event_transition = @object.state_event_transition
|
369
359
|
@saved = true
|
370
360
|
end
|
371
361
|
end
|
@@ -382,10 +372,6 @@ class MachineCollectionFireImplicitWithTransitionTest < MachineCollectionFireImp
|
|
382
372
|
assert_nil @state_event
|
383
373
|
end
|
384
374
|
|
385
|
-
def test_should_not_have_event_transition_while_running_action
|
386
|
-
assert_nil @state_event_transition
|
387
|
-
end
|
388
|
-
|
389
375
|
def test_should_transition_state
|
390
376
|
assert_equal 'idling', @object.state
|
391
377
|
end
|
@@ -394,8 +380,9 @@ class MachineCollectionFireImplicitWithTransitionTest < MachineCollectionFireImp
|
|
394
380
|
assert_nil @object.state_event
|
395
381
|
end
|
396
382
|
|
397
|
-
def
|
398
|
-
|
383
|
+
def test_should_not_be_successful_if_fired_again
|
384
|
+
@object.state_event = 'ignite'
|
385
|
+
assert !@machines.fire_attribute_events(@object, :save) { true }
|
399
386
|
end
|
400
387
|
end
|
401
388
|
|
@@ -418,10 +405,6 @@ class MachineCollectionFireImplicitWithActionFailureTest < MachineCollectionFire
|
|
418
405
|
def test_should_not_reset_event_attribute
|
419
406
|
assert_equal :ignite, @object.state_event
|
420
407
|
end
|
421
|
-
|
422
|
-
def test_should_not_have_event_transition
|
423
|
-
assert_nil @object.state_event_transition
|
424
|
-
end
|
425
408
|
end
|
426
409
|
|
427
410
|
class MachineCollectionFireImplicitWithActionErrorTest < MachineCollectionFireImplicitTest
|
@@ -439,10 +422,6 @@ class MachineCollectionFireImplicitWithActionErrorTest < MachineCollectionFireIm
|
|
439
422
|
def test_should_not_reset_event_attribute
|
440
423
|
assert_equal :ignite, @object.state_event
|
441
424
|
end
|
442
|
-
|
443
|
-
def test_should_not_have_event_transition
|
444
|
-
assert_nil @object.state_event_transition
|
445
|
-
end
|
446
425
|
end
|
447
426
|
|
448
427
|
class MachineCollectionFireImplicitPartialTest < MachineCollectionFireImplicitTest
|
@@ -455,12 +434,10 @@ class MachineCollectionFireImplicitPartialTest < MachineCollectionFireImplicitTe
|
|
455
434
|
@machine.after_transition { @ran_after_callback = true }
|
456
435
|
|
457
436
|
@state_event = nil
|
458
|
-
@state_event_transition = nil
|
459
437
|
|
460
438
|
@object.state_event = 'ignite'
|
461
439
|
@result = @machines.fire_attribute_events(@object, :save, false) do
|
462
440
|
@state_event = @object.state_event
|
463
|
-
@state_event_transition = @object.state_event_transition
|
464
441
|
true
|
465
442
|
end
|
466
443
|
end
|
@@ -481,10 +458,6 @@ class MachineCollectionFireImplicitPartialTest < MachineCollectionFireImplicitTe
|
|
481
458
|
assert_nil @state_event
|
482
459
|
end
|
483
460
|
|
484
|
-
def test_should_not_have_event_transition_while_running_action
|
485
|
-
assert_nil @state_event_transition
|
486
|
-
end
|
487
|
-
|
488
461
|
def test_should_transition_state
|
489
462
|
assert_equal 'idling', @object.state
|
490
463
|
end
|
@@ -493,29 +466,50 @@ class MachineCollectionFireImplicitPartialTest < MachineCollectionFireImplicitTe
|
|
493
466
|
assert_equal :ignite, @object.state_event
|
494
467
|
end
|
495
468
|
|
496
|
-
def test_should_have_event_transition
|
497
|
-
assert_not_nil @object.state_event_transition
|
498
|
-
end
|
499
|
-
|
500
469
|
def test_should_reset_event_attributes_after_next_fire_on_success
|
501
470
|
assert @machines.fire_attribute_events(@object, :save) { true }
|
502
471
|
assert_equal 'idling', @object.state
|
503
472
|
assert_nil @object.state_event
|
504
|
-
|
473
|
+
end
|
474
|
+
|
475
|
+
def test_should_guard_transition_after_next_fire_on_success
|
476
|
+
@machines.fire_attribute_events(@object, :save) { true }
|
477
|
+
|
478
|
+
@object.state = 'idling'
|
479
|
+
@object.state_event = 'ignite'
|
480
|
+
assert !@machines.fire_attribute_events(@object, :save) { true }
|
505
481
|
end
|
506
482
|
|
507
483
|
def test_should_rollback_all_attributes_after_next_fire_on_failure
|
508
484
|
assert !@machines.fire_attribute_events(@object, :save) { false }
|
509
485
|
assert_equal 'parked', @object.state
|
510
486
|
assert_equal :ignite, @object.state_event
|
511
|
-
|
487
|
+
|
488
|
+
@object.state = 'idling'
|
489
|
+
assert !@machines.fire_attribute_events(@object, :save) { false }
|
490
|
+
end
|
491
|
+
|
492
|
+
def test_should_guard_transition_after_next_fire_on_failure
|
493
|
+
@machines.fire_attribute_events(@object, :save) { false }
|
494
|
+
|
495
|
+
@object.state = 'idling'
|
496
|
+
assert !@machines.fire_attribute_events(@object, :save) { true }
|
512
497
|
end
|
513
498
|
|
514
499
|
def test_should_rollback_all_attributes_after_next_fire_on_error
|
515
500
|
assert_raise(ArgumentError) { @machines.fire_attribute_events(@object, :save) { raise ArgumentError } }
|
516
501
|
assert_equal 'parked', @object.state
|
517
502
|
assert_equal :ignite, @object.state_event
|
518
|
-
|
503
|
+
end
|
504
|
+
|
505
|
+
def test_should_guard_transition_after_next_fire_on_error
|
506
|
+
begin
|
507
|
+
@machines.fire_attribute_events(@object, :save) { raise ArgumentError }
|
508
|
+
rescue ArgumentError
|
509
|
+
end
|
510
|
+
|
511
|
+
@object.state = 'idling'
|
512
|
+
assert !@machines.fire_attribute_events(@object, :save) { true }
|
519
513
|
end
|
520
514
|
end
|
521
515
|
|
@@ -547,10 +541,6 @@ class MachineCollectionFireImplicitNestedPartialTest < MachineCollectionFireImpl
|
|
547
541
|
def test_should_reset_event_attribute
|
548
542
|
assert_nil @object.state_event
|
549
543
|
end
|
550
|
-
|
551
|
-
def test_should_not_have_event_transition
|
552
|
-
assert_nil @object.state_event_transition
|
553
|
-
end
|
554
544
|
end
|
555
545
|
|
556
546
|
class MachineCollectionFireImplicitWithDifferentActionsTest < MachineCollectionFireImplicitTest
|
@@ -613,11 +603,6 @@ class MachineCollectionFireImplicitWithSameActionsTest < MachineCollectionFireIm
|
|
613
603
|
assert_nil @object.state_event
|
614
604
|
assert_nil @object.alarm_state_event
|
615
605
|
end
|
616
|
-
|
617
|
-
def test_should_reset_all_event_transitions_for_action
|
618
|
-
assert_nil @object.state_event_transition
|
619
|
-
assert_nil @object.alarm_state_event_transition
|
620
|
-
end
|
621
606
|
end
|
622
607
|
|
623
608
|
class MachineCollectionFireImplicitWithValidationsTest < Test::Unit::TestCase
|