state_machine 0.6.3 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +31 -1
- data/README.rdoc +33 -21
- data/Rakefile +2 -2
- 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 +11 -0
- data/examples/rails-rest/model.rb +23 -0
- data/examples/rails-rest/view_edit.html.erb +25 -0
- data/examples/rails-rest/view_index.html.erb +23 -0
- data/examples/rails-rest/view_new.html.erb +14 -0
- data/examples/rails-rest/view_show.html.erb +17 -0
- data/lib/state_machine/assertions.rb +2 -2
- data/lib/state_machine/callback.rb +14 -8
- data/lib/state_machine/condition_proxy.rb +3 -3
- data/lib/state_machine/event.rb +19 -21
- data/lib/state_machine/event_collection.rb +114 -0
- data/lib/state_machine/extensions.rb +127 -11
- data/lib/state_machine/guard.rb +1 -1
- data/lib/state_machine/integrations/active_record/locale.rb +2 -1
- data/lib/state_machine/integrations/active_record.rb +117 -39
- data/lib/state_machine/integrations/data_mapper/observer.rb +20 -64
- data/lib/state_machine/integrations/data_mapper.rb +71 -26
- data/lib/state_machine/integrations/sequel.rb +69 -21
- data/lib/state_machine/machine.rb +267 -139
- data/lib/state_machine/machine_collection.rb +145 -0
- data/lib/state_machine/matcher.rb +2 -2
- data/lib/state_machine/node_collection.rb +9 -4
- data/lib/state_machine/state.rb +22 -32
- data/lib/state_machine/state_collection.rb +66 -17
- data/lib/state_machine/transition.rb +259 -28
- data/lib/state_machine.rb +121 -56
- data/tasks/state_machine.rake +1 -0
- data/tasks/state_machine.rb +26 -0
- data/test/active_record.log +116877 -0
- data/test/functional/state_machine_test.rb +118 -12
- data/test/sequel.log +28542 -0
- data/test/unit/callback_test.rb +46 -1
- data/test/unit/condition_proxy_test.rb +55 -28
- data/test/unit/event_collection_test.rb +228 -0
- data/test/unit/event_test.rb +51 -46
- data/test/unit/integrations/active_record_test.rb +128 -70
- data/test/unit/integrations/data_mapper_test.rb +150 -58
- data/test/unit/integrations/sequel_test.rb +63 -6
- data/test/unit/invalid_event_test.rb +7 -0
- data/test/unit/machine_collection_test.rb +678 -0
- data/test/unit/machine_test.rb +198 -91
- data/test/unit/node_collection_test.rb +33 -30
- data/test/unit/state_collection_test.rb +112 -5
- data/test/unit/state_test.rb +23 -3
- data/test/unit/transition_test.rb +750 -89
- metadata +28 -3
data/test/unit/machine_test.rb
CHANGED
@@ -39,6 +39,10 @@ class MachineByDefaultTest < Test::Unit::TestCase
|
|
39
39
|
assert_nil @machine.action
|
40
40
|
end
|
41
41
|
|
42
|
+
def test_should_use_tranactions
|
43
|
+
assert_equal true, @machine.use_transactions
|
44
|
+
end
|
45
|
+
|
42
46
|
def test_should_not_have_a_namespace
|
43
47
|
assert_nil @machine.namespace
|
44
48
|
end
|
@@ -79,6 +83,30 @@ class MachineByDefaultTest < Test::Unit::TestCase
|
|
79
83
|
assert @object.respond_to?(:state_name)
|
80
84
|
end
|
81
85
|
|
86
|
+
def test_should_define_an_event_reader_for_the_attribute
|
87
|
+
assert @object.respond_to?(:state_events)
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_should_define_a_transition_reader_for_the_attribute
|
91
|
+
assert @object.respond_to?(:state_transitions)
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_should_not_define_an_event_attribute_reader
|
95
|
+
assert !@object.respond_to?(:state_event)
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_should_not_define_an_event_attribute_writer
|
99
|
+
assert !@object.respond_to?(:state_event=)
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_should_not_define_an_event_transition_attribute_reader
|
103
|
+
assert !@object.respond_to?(:state_event_transition)
|
104
|
+
end
|
105
|
+
|
106
|
+
def test_should_not_define_an_event_transition_attribute_writer
|
107
|
+
assert !@object.respond_to?(:state_event_transition=)
|
108
|
+
end
|
109
|
+
|
82
110
|
def test_should_not_define_singular_with_scope
|
83
111
|
assert !@klass.respond_to?(:with_state)
|
84
112
|
end
|
@@ -135,6 +163,14 @@ class MachineWithCustomAttributeTest < Test::Unit::TestCase
|
|
135
163
|
def test_should_define_a_name_reader_for_the_attribute
|
136
164
|
assert @object.respond_to?(:status_name)
|
137
165
|
end
|
166
|
+
|
167
|
+
def test_should_define_an_event_reader_for_the_attribute
|
168
|
+
assert @object.respond_to?(:status_events)
|
169
|
+
end
|
170
|
+
|
171
|
+
def test_should_define_a_transition_reader_for_the_attribute
|
172
|
+
assert @object.respond_to?(:status_transitions)
|
173
|
+
end
|
138
174
|
end
|
139
175
|
|
140
176
|
class MachineWithStaticInitialStateTest < Test::Unit::TestCase
|
@@ -218,9 +254,8 @@ end
|
|
218
254
|
class MachineWithNilActionTest < Test::Unit::TestCase
|
219
255
|
def setup
|
220
256
|
integration = Module.new do
|
221
|
-
|
222
|
-
|
223
|
-
end
|
257
|
+
class << self; attr_reader :defaults; end
|
258
|
+
@defaults = {:action => :save}
|
224
259
|
end
|
225
260
|
StateMachine::Integrations.const_set('Custom', integration)
|
226
261
|
@machine = StateMachine::Machine.new(Class.new, :action => nil, :integration => :custom)
|
@@ -252,7 +287,7 @@ class MachineWithoutIntegrationTest < Test::Unit::TestCase
|
|
252
287
|
end
|
253
288
|
|
254
289
|
def test_invalidation_should_do_nothing
|
255
|
-
assert_nil @machine.invalidate(@object,
|
290
|
+
assert_nil @machine.invalidate(@object, :state, :invalid_transition, [[:event, :park]])
|
256
291
|
end
|
257
292
|
|
258
293
|
def test_reset_should_do_nothing
|
@@ -277,37 +312,37 @@ end
|
|
277
312
|
|
278
313
|
class MachineWithIntegrationTest < Test::Unit::TestCase
|
279
314
|
def setup
|
280
|
-
|
281
|
-
class << self;
|
282
|
-
@
|
283
|
-
|
284
|
-
|
315
|
+
StateMachine::Integrations.const_set('Custom', Module.new do
|
316
|
+
class << self; attr_reader :defaults; end
|
317
|
+
@defaults = {:action => :save, :use_transactions => false}
|
318
|
+
|
319
|
+
attr_reader :initialized, :with_scopes, :without_scopes, :ran_transaction
|
285
320
|
|
286
321
|
def after_initialize
|
287
|
-
|
288
|
-
end
|
289
|
-
|
290
|
-
def default_action
|
291
|
-
:save
|
322
|
+
@initialized = true
|
292
323
|
end
|
293
324
|
|
294
325
|
def create_with_scope(name)
|
295
|
-
|
326
|
+
(@with_scopes ||= []) << name
|
296
327
|
lambda {}
|
297
328
|
end
|
298
329
|
|
299
330
|
def create_without_scope(name)
|
300
|
-
|
331
|
+
(@without_scopes ||= []) << name
|
301
332
|
lambda {}
|
302
333
|
end
|
303
|
-
|
334
|
+
|
335
|
+
def transaction(object)
|
336
|
+
@ran_transaction = true
|
337
|
+
yield
|
338
|
+
end
|
339
|
+
end)
|
304
340
|
|
305
|
-
StateMachine::Integrations.const_set('Custom', @integration)
|
306
341
|
@machine = StateMachine::Machine.new(Class.new, :integration => :custom)
|
307
342
|
end
|
308
343
|
|
309
344
|
def test_should_call_after_initialize_hook
|
310
|
-
assert @
|
345
|
+
assert @machine.initialized
|
311
346
|
end
|
312
347
|
|
313
348
|
def test_should_use_the_default_action
|
@@ -319,12 +354,21 @@ class MachineWithIntegrationTest < Test::Unit::TestCase
|
|
319
354
|
assert_equal :save!, machine.action
|
320
355
|
end
|
321
356
|
|
357
|
+
def test_should_use_the_default_use_transactions
|
358
|
+
assert_equal false, @machine.use_transactions
|
359
|
+
end
|
360
|
+
|
361
|
+
def test_should_use_the_custom_use_transactions_if_specified
|
362
|
+
machine = StateMachine::Machine.new(Class.new, :integration => :custom, :use_transactions => true)
|
363
|
+
assert_equal true, machine.use_transactions
|
364
|
+
end
|
365
|
+
|
322
366
|
def test_should_define_a_singular_and_plural_with_scope
|
323
|
-
assert_equal %w(with_state with_states), @
|
367
|
+
assert_equal %w(with_state with_states), @machine.with_scopes
|
324
368
|
end
|
325
369
|
|
326
370
|
def test_should_define_a_singular_and_plural_without_scope
|
327
|
-
assert_equal %w(without_state without_states), @
|
371
|
+
assert_equal %w(without_state without_states), @machine.without_scopes
|
328
372
|
end
|
329
373
|
|
330
374
|
def teardown
|
@@ -332,6 +376,62 @@ class MachineWithIntegrationTest < Test::Unit::TestCase
|
|
332
376
|
end
|
333
377
|
end
|
334
378
|
|
379
|
+
class MachineWithActionTest < Test::Unit::TestCase
|
380
|
+
def setup
|
381
|
+
@klass = Class.new do
|
382
|
+
def save
|
383
|
+
end
|
384
|
+
end
|
385
|
+
|
386
|
+
@machine = StateMachine::Machine.new(@klass, :action => :save)
|
387
|
+
@object = @klass.new
|
388
|
+
end
|
389
|
+
|
390
|
+
def test_should_define_an_event_attribute_reader
|
391
|
+
assert @object.respond_to?(:state_event)
|
392
|
+
end
|
393
|
+
|
394
|
+
def test_should_define_an_event_attribute_writer
|
395
|
+
assert @object.respond_to?(:state_event=)
|
396
|
+
end
|
397
|
+
|
398
|
+
def test_should_define_an_event_transition_attribute_reader
|
399
|
+
assert @object.respond_to?(:state_event_transition)
|
400
|
+
end
|
401
|
+
|
402
|
+
def test_should_define_an_event_transition_attribute_writer
|
403
|
+
assert @object.respond_to?(:state_event_transition=)
|
404
|
+
end
|
405
|
+
end
|
406
|
+
|
407
|
+
class MachineWithActionUndefinedTest < Test::Unit::TestCase
|
408
|
+
def setup
|
409
|
+
@klass = Class.new
|
410
|
+
@machine = StateMachine::Machine.new(@klass, :action => :save)
|
411
|
+
@object = @klass.new
|
412
|
+
end
|
413
|
+
|
414
|
+
def test_should_define_an_event_attribute_reader
|
415
|
+
assert @object.respond_to?(:state_event)
|
416
|
+
end
|
417
|
+
|
418
|
+
def test_should_define_an_event_attribute_writer
|
419
|
+
assert @object.respond_to?(:state_event=)
|
420
|
+
end
|
421
|
+
|
422
|
+
def test_should_define_an_event_transition_attribute_reader
|
423
|
+
assert @object.respond_to?(:state_event_transition)
|
424
|
+
end
|
425
|
+
|
426
|
+
def test_should_define_an_event_transition_attribute_writer
|
427
|
+
assert @object.respond_to?(:state_event_transition=)
|
428
|
+
end
|
429
|
+
|
430
|
+
def test_should_not_define_action
|
431
|
+
assert !@object.respond_to?(:save)
|
432
|
+
end
|
433
|
+
end
|
434
|
+
|
335
435
|
class MachineWithCustomPluralTest < Test::Unit::TestCase
|
336
436
|
def setup
|
337
437
|
@integration = Module.new do
|
@@ -370,8 +470,8 @@ end
|
|
370
470
|
class MachineWithCustomInvalidationTest < Test::Unit::TestCase
|
371
471
|
def setup
|
372
472
|
@integration = Module.new do
|
373
|
-
def invalidate(object,
|
374
|
-
object.error =
|
473
|
+
def invalidate(object, attribute, message, values = [])
|
474
|
+
object.error = generate_message(message, values)
|
375
475
|
end
|
376
476
|
end
|
377
477
|
StateMachine::Integrations.const_set('Custom', @integration)
|
@@ -380,7 +480,7 @@ class MachineWithCustomInvalidationTest < Test::Unit::TestCase
|
|
380
480
|
attr_accessor :error
|
381
481
|
end
|
382
482
|
|
383
|
-
@machine = StateMachine::Machine.new(@klass, :integration => :custom, :
|
483
|
+
@machine = StateMachine::Machine.new(@klass, :integration => :custom, :messages => {:invalid_transition => 'cannot %s'})
|
384
484
|
@machine.state :parked
|
385
485
|
|
386
486
|
@object = @klass.new
|
@@ -388,8 +488,8 @@ class MachineWithCustomInvalidationTest < Test::Unit::TestCase
|
|
388
488
|
end
|
389
489
|
|
390
490
|
def test_use_custom_message
|
391
|
-
@machine.invalidate(@object,
|
392
|
-
assert_equal 'cannot park
|
491
|
+
@machine.invalidate(@object, :state, :invalid_transition, [[:event, :park]])
|
492
|
+
assert_equal 'cannot park', @object.error
|
393
493
|
end
|
394
494
|
|
395
495
|
def teardown
|
@@ -402,8 +502,8 @@ class MachineTest < Test::Unit::TestCase
|
|
402
502
|
assert_raise(ArgumentError) {StateMachine::Machine.new(Class.new, :invalid => true)}
|
403
503
|
end
|
404
504
|
|
405
|
-
def
|
406
|
-
assert_nothing_raised {StateMachine::Machine.new(Class.new, :
|
505
|
+
def test_should_not_raise_exception_if_custom_messages_specified
|
506
|
+
assert_nothing_raised {StateMachine::Machine.new(Class.new, :messages => {:invalid_transition => 'custom'})}
|
407
507
|
end
|
408
508
|
|
409
509
|
def test_should_evaluate_a_block_during_initialization
|
@@ -667,6 +767,14 @@ class MachineWithConflictingHelpersTest < Test::Unit::TestCase
|
|
667
767
|
def state_name
|
668
768
|
:parked
|
669
769
|
end
|
770
|
+
|
771
|
+
def state_events
|
772
|
+
[:ignite]
|
773
|
+
end
|
774
|
+
|
775
|
+
def state_transitions
|
776
|
+
[{:parked => :idling}]
|
777
|
+
end
|
670
778
|
end
|
671
779
|
|
672
780
|
StateMachine::Integrations.const_set('Custom', Module.new do
|
@@ -717,6 +825,14 @@ class MachineWithConflictingHelpersTest < Test::Unit::TestCase
|
|
717
825
|
assert_equal :parked, @object.state_name
|
718
826
|
end
|
719
827
|
|
828
|
+
def test_should_not_redefine_attribute_events_reader
|
829
|
+
assert_equal [:ignite], @object.state_events
|
830
|
+
end
|
831
|
+
|
832
|
+
def test_should_not_redefine_attribute_transitions_reader
|
833
|
+
assert_equal [{:parked => :idling}], @object.state_transitions
|
834
|
+
end
|
835
|
+
|
720
836
|
def test_should_allow_super_chaining
|
721
837
|
@klass.class_eval do
|
722
838
|
def self.with_state(*states)
|
@@ -753,6 +869,14 @@ class MachineWithConflictingHelpersTest < Test::Unit::TestCase
|
|
753
869
|
def state_name
|
754
870
|
super == :parked ? 1 : 0
|
755
871
|
end
|
872
|
+
|
873
|
+
def state_events
|
874
|
+
super == []
|
875
|
+
end
|
876
|
+
|
877
|
+
def state_transitions
|
878
|
+
super == []
|
879
|
+
end
|
756
880
|
end
|
757
881
|
|
758
882
|
assert_equal true, @klass.with_state
|
@@ -765,6 +889,8 @@ class MachineWithConflictingHelpersTest < Test::Unit::TestCase
|
|
765
889
|
assert_equal 'idling', @object.status
|
766
890
|
assert_equal 0, @object.state?(:parked)
|
767
891
|
assert_equal 0, @object.state_name
|
892
|
+
assert_equal true, @object.state_events
|
893
|
+
assert_equal true, @object.state_transitions
|
768
894
|
end
|
769
895
|
|
770
896
|
def teardown
|
@@ -860,6 +986,23 @@ class MachineWithCustomInitializeTest < Test::Unit::TestCase
|
|
860
986
|
end
|
861
987
|
end
|
862
988
|
|
989
|
+
class MachinePersistenceTest < Test::Unit::TestCase
|
990
|
+
def setup
|
991
|
+
@klass = Class.new
|
992
|
+
@machine = StateMachine::Machine.new(@klass, :initial => :parked)
|
993
|
+
@object = @klass.new
|
994
|
+
end
|
995
|
+
|
996
|
+
def test_should_allow_reading_state
|
997
|
+
assert_equal 'parked', @machine.read(@object)
|
998
|
+
end
|
999
|
+
|
1000
|
+
def test_should_allow_writing_state
|
1001
|
+
@machine.write(@object, 'idling')
|
1002
|
+
assert_equal 'idling', @object.state
|
1003
|
+
end
|
1004
|
+
end
|
1005
|
+
|
863
1006
|
class MachineWithStatesTest < Test::Unit::TestCase
|
864
1007
|
def setup
|
865
1008
|
@klass = Class.new
|
@@ -893,30 +1036,6 @@ class MachineWithStatesTest < Test::Unit::TestCase
|
|
893
1036
|
exception = assert_raise(ArgumentError) {@machine.state(:first_gear, :invalid => true)}
|
894
1037
|
assert_equal 'Invalid key(s): invalid', exception.message
|
895
1038
|
end
|
896
|
-
|
897
|
-
def test_should_not_be_in_state_if_value_does_not_match
|
898
|
-
assert !@machine.state?(@object, :parked)
|
899
|
-
assert !@machine.state?(@object, :idling)
|
900
|
-
end
|
901
|
-
|
902
|
-
def test_should_be_in_state_if_value_matches
|
903
|
-
assert @machine.state?(@object, nil)
|
904
|
-
end
|
905
|
-
|
906
|
-
def test_raise_exception_if_checking_invalid_state
|
907
|
-
assert_raise(ArgumentError) { @machine.state?(@object, :invalid) }
|
908
|
-
end
|
909
|
-
|
910
|
-
def test_should_find_state_for_object_if_value_is_known
|
911
|
-
@object.state = 'parked'
|
912
|
-
assert_equal @parked, @machine.state_for(@object)
|
913
|
-
end
|
914
|
-
|
915
|
-
def test_should_raise_exception_if_finding_state_for_object_with_unknown_value
|
916
|
-
@object.state = 'invalid'
|
917
|
-
exception = assert_raise(ArgumentError) { @machine.state_for(@object) }
|
918
|
-
assert_equal '"invalid" is not a known state value', exception.message
|
919
|
-
end
|
920
1039
|
end
|
921
1040
|
|
922
1041
|
class MachineWithStatesWithCustomValuesTest < Test::Unit::TestCase
|
@@ -936,19 +1055,6 @@ class MachineWithStatesWithCustomValuesTest < Test::Unit::TestCase
|
|
936
1055
|
def test_should_allow_lookup_by_custom_value
|
937
1056
|
assert_equal @state, @machine.states[1, :value]
|
938
1057
|
end
|
939
|
-
|
940
|
-
def test_should_be_in_state_if_value_matches
|
941
|
-
assert @machine.state?(@object, :parked)
|
942
|
-
end
|
943
|
-
|
944
|
-
def test_should_not_be_in_state_if_value_does_not_match
|
945
|
-
@object.state = 2
|
946
|
-
assert !@machine.state?(@object, :parked)
|
947
|
-
end
|
948
|
-
|
949
|
-
def test_should_find_state_for_object_if_value_is_known
|
950
|
-
assert_equal @state, @machine.state_for(@object)
|
951
|
-
end
|
952
1058
|
end
|
953
1059
|
|
954
1060
|
class MachineWithStateWithMatchersTest < Test::Unit::TestCase
|
@@ -966,19 +1072,6 @@ class MachineWithStateWithMatchersTest < Test::Unit::TestCase
|
|
966
1072
|
assert @state.matches?(1)
|
967
1073
|
assert !@state.matches?(nil)
|
968
1074
|
end
|
969
|
-
|
970
|
-
def test_should_be_in_state_if_value_matches
|
971
|
-
assert @machine.state?(@object, :parked)
|
972
|
-
end
|
973
|
-
|
974
|
-
def test_should_not_be_in_state_if_value_does_not_match
|
975
|
-
@object.state = nil
|
976
|
-
assert !@machine.state?(@object, :parked)
|
977
|
-
end
|
978
|
-
|
979
|
-
def test_should_find_state_for_object_if_value_is_known
|
980
|
-
assert_equal @state, @machine.state_for(@object)
|
981
|
-
end
|
982
1075
|
end
|
983
1076
|
|
984
1077
|
class MachineWithStatesWithBehaviorsTest < Test::Unit::TestCase
|
@@ -1050,7 +1143,8 @@ end
|
|
1050
1143
|
|
1051
1144
|
class MachineWithEventsTest < Test::Unit::TestCase
|
1052
1145
|
def setup
|
1053
|
-
@
|
1146
|
+
@klass = Class.new
|
1147
|
+
@machine = StateMachine::Machine.new(@klass)
|
1054
1148
|
end
|
1055
1149
|
|
1056
1150
|
def test_should_return_the_created_event
|
@@ -1309,44 +1403,44 @@ end
|
|
1309
1403
|
class MachineWithNamespaceTest < Test::Unit::TestCase
|
1310
1404
|
def setup
|
1311
1405
|
@klass = Class.new
|
1312
|
-
@machine = StateMachine::Machine.new(@klass, :namespace => '
|
1313
|
-
event :
|
1314
|
-
transition :
|
1406
|
+
@machine = StateMachine::Machine.new(@klass, :namespace => 'alarm', :initial => :active) do
|
1407
|
+
event :enable do
|
1408
|
+
transition :off => :active
|
1315
1409
|
end
|
1316
1410
|
|
1317
|
-
event :
|
1318
|
-
transition :
|
1411
|
+
event :disable do
|
1412
|
+
transition :active => :off
|
1319
1413
|
end
|
1320
1414
|
end
|
1321
1415
|
@object = @klass.new
|
1322
1416
|
end
|
1323
1417
|
|
1324
1418
|
def test_should_namespace_state_predicates
|
1325
|
-
[:
|
1419
|
+
[:alarm_active?, :alarm_off?].each do |name|
|
1326
1420
|
assert @object.respond_to?(name)
|
1327
1421
|
end
|
1328
1422
|
end
|
1329
1423
|
|
1330
1424
|
def test_should_namespace_event_checks
|
1331
|
-
[:
|
1425
|
+
[:can_enable_alarm?, :can_disable_alarm?].each do |name|
|
1332
1426
|
assert @object.respond_to?(name)
|
1333
1427
|
end
|
1334
1428
|
end
|
1335
1429
|
|
1336
1430
|
def test_should_namespace_event_transition_readers
|
1337
|
-
[:
|
1431
|
+
[:enable_alarm_transition, :disable_alarm_transition].each do |name|
|
1338
1432
|
assert @object.respond_to?(name)
|
1339
1433
|
end
|
1340
1434
|
end
|
1341
1435
|
|
1342
1436
|
def test_should_namespace_events
|
1343
|
-
[:
|
1437
|
+
[:enable_alarm, :disable_alarm].each do |name|
|
1344
1438
|
assert @object.respond_to?(name)
|
1345
1439
|
end
|
1346
1440
|
end
|
1347
1441
|
|
1348
1442
|
def test_should_namespace_bang_events
|
1349
|
-
[:
|
1443
|
+
[:enable_alarm!, :disable_alarm!].each do |name|
|
1350
1444
|
assert @object.respond_to?(name)
|
1351
1445
|
end
|
1352
1446
|
end
|
@@ -1413,7 +1507,7 @@ class MachineFinderWithExistingMachineOnSuperclassTest < Test::Unit::TestCase
|
|
1413
1507
|
@base_machine.after_transition(lambda {})
|
1414
1508
|
|
1415
1509
|
@klass = Class.new(@base_class)
|
1416
|
-
@machine = StateMachine::Machine.find_or_create(@klass, :status)
|
1510
|
+
@machine = StateMachine::Machine.find_or_create(@klass, :status) {}
|
1417
1511
|
end
|
1418
1512
|
|
1419
1513
|
def test_should_accept_a_block
|
@@ -1425,7 +1519,20 @@ class MachineFinderWithExistingMachineOnSuperclassTest < Test::Unit::TestCase
|
|
1425
1519
|
assert called
|
1426
1520
|
end
|
1427
1521
|
|
1428
|
-
def
|
1522
|
+
def test_should_not_create_a_new_machine_if_no_block_or_options
|
1523
|
+
machine = StateMachine::Machine.find_or_create(Class.new(@base_class), :status)
|
1524
|
+
|
1525
|
+
assert_same machine, @base_machine
|
1526
|
+
end
|
1527
|
+
|
1528
|
+
def test_should_create_a_new_machine_if_given_options
|
1529
|
+
machine = StateMachine::Machine.find_or_create(@klass, :status, :initial => :parked)
|
1530
|
+
|
1531
|
+
assert_not_nil machine
|
1532
|
+
assert_not_same machine, @base_machine
|
1533
|
+
end
|
1534
|
+
|
1535
|
+
def test_should_create_a_new_machine_if_given_block
|
1429
1536
|
assert_not_nil @machine
|
1430
1537
|
assert_not_same @machine, @base_machine
|
1431
1538
|
end
|