state_machine 1.0.3 → 1.1.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/.travis.yml +23 -7
- data/Appraisals +31 -25
- data/CHANGELOG.md +12 -0
- data/README.md +3 -1
- data/gemfiles/active_model-3.0.0.gemfile.lock +7 -5
- data/gemfiles/active_model-3.0.5.gemfile.lock +7 -5
- data/gemfiles/active_model-3.1.1.gemfile.lock +6 -4
- data/gemfiles/active_record-2.0.0.gemfile +1 -1
- data/gemfiles/active_record-2.0.0.gemfile.lock +7 -5
- data/gemfiles/active_record-2.0.5.gemfile +1 -1
- data/gemfiles/active_record-2.0.5.gemfile.lock +7 -5
- data/gemfiles/active_record-2.1.0.gemfile +1 -1
- data/gemfiles/active_record-2.1.0.gemfile.lock +7 -5
- data/gemfiles/active_record-2.1.2.gemfile +1 -1
- data/gemfiles/active_record-2.1.2.gemfile.lock +7 -5
- data/gemfiles/active_record-2.2.3.gemfile +1 -1
- data/gemfiles/active_record-2.2.3.gemfile.lock +7 -5
- data/gemfiles/active_record-2.3.12.gemfile +1 -1
- data/gemfiles/active_record-2.3.12.gemfile.lock +7 -5
- data/gemfiles/active_record-3.0.0.gemfile +1 -1
- data/gemfiles/active_record-3.0.0.gemfile.lock +8 -6
- data/gemfiles/active_record-3.0.5.gemfile +1 -1
- data/gemfiles/active_record-3.0.5.gemfile.lock +8 -6
- data/gemfiles/active_record-3.1.1.gemfile +1 -1
- data/gemfiles/active_record-3.1.1.gemfile.lock +7 -5
- data/gemfiles/data_mapper-0.10.2.gemfile +3 -3
- data/gemfiles/data_mapper-0.10.2.gemfile.lock +14 -5
- data/gemfiles/data_mapper-0.9.11.gemfile +3 -3
- data/gemfiles/data_mapper-0.9.11.gemfile.lock +7 -5
- data/gemfiles/data_mapper-0.9.4.gemfile +3 -3
- data/gemfiles/data_mapper-0.9.4.gemfile.lock +13 -13
- data/gemfiles/data_mapper-0.9.7.gemfile +3 -3
- data/gemfiles/data_mapper-0.9.7.gemfile.lock +13 -13
- data/gemfiles/data_mapper-1.0.0.gemfile +3 -3
- data/gemfiles/data_mapper-1.0.0.gemfile.lock +17 -8
- data/gemfiles/data_mapper-1.0.1.gemfile +3 -3
- data/gemfiles/data_mapper-1.0.1.gemfile.lock +17 -8
- data/gemfiles/data_mapper-1.0.2.gemfile +3 -3
- data/gemfiles/data_mapper-1.0.2.gemfile.lock +17 -8
- data/gemfiles/data_mapper-1.1.0.gemfile +3 -3
- data/gemfiles/data_mapper-1.1.0.gemfile.lock +17 -8
- data/gemfiles/data_mapper-1.2.0.gemfile +3 -3
- data/gemfiles/data_mapper-1.2.0.gemfile.lock +13 -4
- data/gemfiles/default.gemfile.lock +7 -5
- data/gemfiles/graphviz-0.9.0.gemfile.lock +6 -4
- data/gemfiles/graphviz-0.9.21.gemfile.lock +6 -4
- data/gemfiles/graphviz-1.0.0.gemfile.lock +6 -4
- data/gemfiles/mongo_mapper-0.10.0.gemfile.lock +6 -3
- data/gemfiles/mongo_mapper-0.5.5.gemfile +1 -1
- data/gemfiles/mongo_mapper-0.5.5.gemfile.lock +7 -5
- data/gemfiles/mongo_mapper-0.5.8.gemfile +1 -1
- data/gemfiles/mongo_mapper-0.5.8.gemfile.lock +7 -5
- data/gemfiles/mongo_mapper-0.6.0.gemfile +1 -1
- data/gemfiles/mongo_mapper-0.6.0.gemfile.lock +7 -5
- data/gemfiles/mongo_mapper-0.6.10.gemfile +1 -1
- data/gemfiles/mongo_mapper-0.6.10.gemfile.lock +7 -5
- data/gemfiles/mongo_mapper-0.7.0.gemfile +1 -1
- data/gemfiles/mongo_mapper-0.7.0.gemfile.lock +7 -5
- data/gemfiles/mongo_mapper-0.7.5.gemfile +1 -1
- data/gemfiles/mongo_mapper-0.7.5.gemfile.lock +7 -5
- data/gemfiles/mongo_mapper-0.8.0.gemfile +2 -2
- data/gemfiles/mongo_mapper-0.8.0.gemfile.lock +7 -5
- data/gemfiles/mongo_mapper-0.8.3.gemfile +2 -2
- data/gemfiles/mongo_mapper-0.8.3.gemfile.lock +7 -5
- data/gemfiles/mongo_mapper-0.8.4.gemfile +1 -1
- data/gemfiles/mongo_mapper-0.8.4.gemfile.lock +11 -8
- data/gemfiles/mongo_mapper-0.8.6.gemfile +1 -1
- data/gemfiles/mongo_mapper-0.8.6.gemfile.lock +11 -8
- data/gemfiles/mongo_mapper-0.9.0.gemfile.lock +14 -11
- data/gemfiles/mongoid-2.0.0.gemfile.lock +22 -17
- data/gemfiles/mongoid-2.1.4.gemfile.lock +21 -16
- data/gemfiles/mongoid-2.2.4.gemfile.lock +11 -8
- data/gemfiles/mongoid-2.3.3.gemfile.lock +11 -8
- data/gemfiles/sequel-2.11.0.gemfile.lock +7 -5
- data/gemfiles/sequel-2.12.0.gemfile.lock +7 -5
- data/gemfiles/sequel-2.8.0.gemfile.lock +7 -5
- data/gemfiles/sequel-3.0.0.gemfile.lock +7 -5
- data/gemfiles/sequel-3.13.0.gemfile.lock +7 -5
- data/gemfiles/sequel-3.14.0.gemfile.lock +7 -5
- data/gemfiles/sequel-3.23.0.gemfile.lock +7 -5
- data/gemfiles/sequel-3.24.0.gemfile.lock +7 -5
- data/gemfiles/sequel-3.29.0.gemfile.lock +5 -3
- data/lib/state_machine.rb +7 -1
- data/lib/state_machine/eval_helpers.rb +8 -9
- data/lib/state_machine/event.rb +10 -2
- data/lib/state_machine/integrations.rb +0 -1
- data/lib/state_machine/integrations/active_model.rb +46 -35
- data/lib/state_machine/integrations/active_record.rb +8 -0
- data/lib/state_machine/integrations/active_record/versions.rb +0 -20
- data/lib/state_machine/integrations/data_mapper.rb +22 -21
- data/lib/state_machine/integrations/data_mapper/versions.rb +0 -27
- data/lib/state_machine/integrations/mongo_mapper.rb +8 -0
- data/lib/state_machine/integrations/mongo_mapper/versions.rb +0 -4
- data/lib/state_machine/integrations/mongoid.rb +15 -2
- data/lib/state_machine/integrations/mongoid/versions.rb +0 -7
- data/lib/state_machine/integrations/sequel.rb +14 -0
- data/lib/state_machine/machine.rb +12 -0
- data/lib/state_machine/state.rb +4 -3
- data/lib/state_machine/state_context.rb +10 -9
- data/lib/state_machine/transition.rb +6 -1
- data/lib/state_machine/version.rb +1 -1
- data/state_machine.gemspec +1 -1
- data/test/functional/state_machine_test.rb +21 -1
- data/test/unit/event_test.rb +10 -0
- data/test/unit/integrations/active_model_test.rb +31 -29
- data/test/unit/integrations/active_record_test.rb +56 -26
- data/test/unit/integrations/data_mapper_test.rb +34 -57
- data/test/unit/integrations/mongo_mapper_test.rb +30 -24
- data/test/unit/integrations/mongoid_test.rb +114 -29
- data/test/unit/integrations/sequel_test.rb +36 -0
- data/test/unit/invalid_transition_test.rb +38 -0
- data/test/unit/machine_test.rb +38 -0
- data/test/unit/state_context_test.rb +29 -9
- data/test/unit/state_test.rb +21 -1
- data/test/unit/transition_collection_test.rb +72 -26
- data/test/unit/transition_test.rb +84 -73
- metadata +8 -8
|
@@ -75,3 +75,41 @@ class InvalidTransitionWithNamespaceTest < Test::Unit::TestCase
|
|
|
75
75
|
assert_equal :alarm_active, @invalid_transition.qualified_from_name
|
|
76
76
|
end
|
|
77
77
|
end
|
|
78
|
+
|
|
79
|
+
class InvalidTransitionWithIntegrationTest < Test::Unit::TestCase
|
|
80
|
+
def setup
|
|
81
|
+
StateMachine::Integrations.const_set('Custom', Module.new do
|
|
82
|
+
include StateMachine::Integrations::Base
|
|
83
|
+
|
|
84
|
+
def errors_for(object)
|
|
85
|
+
object.errors
|
|
86
|
+
end
|
|
87
|
+
end)
|
|
88
|
+
|
|
89
|
+
@klass = Class.new do
|
|
90
|
+
attr_accessor :errors
|
|
91
|
+
end
|
|
92
|
+
@machine = StateMachine::Machine.new(@klass, :integration => :custom)
|
|
93
|
+
@machine.state :parked
|
|
94
|
+
@machine.event :ignite
|
|
95
|
+
|
|
96
|
+
@object = @klass.new
|
|
97
|
+
@object.state = 'parked'
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def test_should_generate_a_message_without_reasons_if_empty
|
|
101
|
+
@object.errors = ''
|
|
102
|
+
invalid_transition = StateMachine::InvalidTransition.new(@object, @machine, :ignite)
|
|
103
|
+
assert_equal 'Cannot transition state via :ignite from :parked', invalid_transition.message
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def test_should_generate_a_message_with_error_reasons_if_errors_found
|
|
107
|
+
@object.errors = 'Id is invalid, Name is invalid'
|
|
108
|
+
invalid_transition = StateMachine::InvalidTransition.new(@object, @machine, :ignite)
|
|
109
|
+
assert_equal 'Cannot transition state via :ignite from :parked (Reason(s): Id is invalid, Name is invalid)', invalid_transition.message
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def teardown
|
|
113
|
+
StateMachine::Integrations.send(:remove_const, 'Custom')
|
|
114
|
+
end
|
|
115
|
+
end
|
data/test/unit/machine_test.rb
CHANGED
|
@@ -125,6 +125,10 @@ class MachineByDefaultTest < Test::Unit::TestCase
|
|
|
125
125
|
assert @object.respond_to?(:state_paths)
|
|
126
126
|
end
|
|
127
127
|
|
|
128
|
+
def test_should_define_an_event_runner_for_the_attribute
|
|
129
|
+
assert @object.respond_to?(:fire_state_event)
|
|
130
|
+
end
|
|
131
|
+
|
|
128
132
|
def test_should_not_define_an_event_attribute_reader
|
|
129
133
|
assert !@object.respond_to?(:state_event)
|
|
130
134
|
end
|
|
@@ -222,6 +226,10 @@ class MachineWithCustomNameTest < Test::Unit::TestCase
|
|
|
222
226
|
assert @object.respond_to?(:status_transitions)
|
|
223
227
|
end
|
|
224
228
|
|
|
229
|
+
def test_should_define_an_event_runner_for_the_attribute
|
|
230
|
+
assert @object.respond_to?(:fire_status_event)
|
|
231
|
+
end
|
|
232
|
+
|
|
225
233
|
def test_should_define_a_human_attribute_name_reader_for_the_attribute
|
|
226
234
|
assert @klass.respond_to?(:human_status_name)
|
|
227
235
|
end
|
|
@@ -492,6 +500,10 @@ class MachineWithoutIntegrationTest < Test::Unit::TestCase
|
|
|
492
500
|
def test_reset_should_do_nothing
|
|
493
501
|
assert_nil @machine.reset(@object)
|
|
494
502
|
end
|
|
503
|
+
|
|
504
|
+
def test_errors_for_should_be_empty
|
|
505
|
+
assert_equal '', @machine.errors_for(@object)
|
|
506
|
+
end
|
|
495
507
|
end
|
|
496
508
|
|
|
497
509
|
class MachineWithCustomIntegrationTest < Test::Unit::TestCase
|
|
@@ -1500,6 +1512,10 @@ class MachineWithConflictingHelpersBeforeDefinitionTest < Test::Unit::TestCase
|
|
|
1500
1512
|
def state_paths
|
|
1501
1513
|
[[{:parked => :idling}]]
|
|
1502
1514
|
end
|
|
1515
|
+
|
|
1516
|
+
def fire_state_event
|
|
1517
|
+
true
|
|
1518
|
+
end
|
|
1503
1519
|
end
|
|
1504
1520
|
@klass = Class.new(@superclass)
|
|
1505
1521
|
|
|
@@ -1578,10 +1594,15 @@ class MachineWithConflictingHelpersBeforeDefinitionTest < Test::Unit::TestCase
|
|
|
1578
1594
|
assert_equal [[{:parked => :idling}]], @object.state_paths
|
|
1579
1595
|
end
|
|
1580
1596
|
|
|
1597
|
+
def test_should_not_redefine_event_runner
|
|
1598
|
+
assert_equal true, @object.fire_state_event
|
|
1599
|
+
end
|
|
1600
|
+
|
|
1581
1601
|
def test_should_output_warning
|
|
1582
1602
|
expected = [
|
|
1583
1603
|
'Instance method "state_events"',
|
|
1584
1604
|
'Instance method "state_transitions"',
|
|
1605
|
+
'Instance method "fire_state_event"',
|
|
1585
1606
|
'Instance method "state_paths"',
|
|
1586
1607
|
'Class method "human_state_name"',
|
|
1587
1608
|
'Class method "human_state_event_name"',
|
|
@@ -1665,6 +1686,10 @@ class MachineWithConflictingHelpersAfterDefinitionTest < Test::Unit::TestCase
|
|
|
1665
1686
|
def state_paths
|
|
1666
1687
|
[[{:parked => :idling}]]
|
|
1667
1688
|
end
|
|
1689
|
+
|
|
1690
|
+
def fire_state_event
|
|
1691
|
+
true
|
|
1692
|
+
end
|
|
1668
1693
|
end
|
|
1669
1694
|
|
|
1670
1695
|
StateMachine::Integrations.const_set('Custom', Module.new do
|
|
@@ -1742,6 +1767,10 @@ class MachineWithConflictingHelpersAfterDefinitionTest < Test::Unit::TestCase
|
|
|
1742
1767
|
assert_equal [[{:parked => :idling}]], @object.state_paths
|
|
1743
1768
|
end
|
|
1744
1769
|
|
|
1770
|
+
def test_should_not_redefine_event_runner
|
|
1771
|
+
assert_equal true, @object.fire_state_event
|
|
1772
|
+
end
|
|
1773
|
+
|
|
1745
1774
|
def test_should_allow_super_chaining
|
|
1746
1775
|
@klass.class_eval do
|
|
1747
1776
|
def self.with_state(*states)
|
|
@@ -1801,6 +1830,10 @@ class MachineWithConflictingHelpersAfterDefinitionTest < Test::Unit::TestCase
|
|
|
1801
1830
|
def state_paths
|
|
1802
1831
|
super
|
|
1803
1832
|
end
|
|
1833
|
+
|
|
1834
|
+
def fire_state_event(event)
|
|
1835
|
+
super
|
|
1836
|
+
end
|
|
1804
1837
|
end
|
|
1805
1838
|
|
|
1806
1839
|
assert_equal [], @klass.with_state
|
|
@@ -1820,6 +1853,7 @@ class MachineWithConflictingHelpersAfterDefinitionTest < Test::Unit::TestCase
|
|
|
1820
1853
|
assert_equal [], @object.state_events
|
|
1821
1854
|
assert_equal [], @object.state_transitions
|
|
1822
1855
|
assert_equal [], @object.state_paths
|
|
1856
|
+
assert_equal false, @object.fire_state_event(:ignite)
|
|
1823
1857
|
end
|
|
1824
1858
|
|
|
1825
1859
|
def test_should_not_output_warning
|
|
@@ -2954,6 +2988,10 @@ class MachineWithCustomAttributeTest < Test::Unit::TestCase
|
|
|
2954
2988
|
assert @object.respond_to?(:state_paths)
|
|
2955
2989
|
end
|
|
2956
2990
|
|
|
2991
|
+
def test_should_define_an_event_runner_for_the_attribute
|
|
2992
|
+
assert @object.respond_to?(:fire_state_event)
|
|
2993
|
+
end
|
|
2994
|
+
|
|
2957
2995
|
def test_should_define_a_human_attribute_name_reader
|
|
2958
2996
|
assert @klass.respond_to?(:human_state_name)
|
|
2959
2997
|
end
|
|
@@ -41,11 +41,6 @@ class StateContextTransitionTest < Test::Unit::TestCase
|
|
|
41
41
|
assert_equal 'Invalid key(s): except_to', exception.message
|
|
42
42
|
end
|
|
43
43
|
|
|
44
|
-
def test_should_not_allow_from
|
|
45
|
-
exception = assert_raise(ArgumentError) { @state_context.transition(:from => :idling) }
|
|
46
|
-
assert_equal 'Invalid key(s): from', exception.message
|
|
47
|
-
end
|
|
48
|
-
|
|
49
44
|
def test_should_not_allow_except_from
|
|
50
45
|
exception = assert_raise(ArgumentError) { @state_context.transition(:except_from => :idling) }
|
|
51
46
|
assert_equal 'Invalid key(s): except_from', exception.message
|
|
@@ -63,15 +58,40 @@ class StateContextTransitionTest < Test::Unit::TestCase
|
|
|
63
58
|
|
|
64
59
|
def test_should_require_on_event
|
|
65
60
|
exception = assert_raise(ArgumentError) { @state_context.transition(:to => :idling) }
|
|
66
|
-
assert_equal 'Must specify :
|
|
61
|
+
assert_equal 'Must specify :on event', exception.message
|
|
67
62
|
end
|
|
68
63
|
|
|
69
|
-
def
|
|
64
|
+
def test_should_not_allow_missing_from_and_to
|
|
70
65
|
exception = assert_raise(ArgumentError) { @state_context.transition(:on => :ignite) }
|
|
71
|
-
assert_equal 'Must specify :to
|
|
66
|
+
assert_equal 'Must specify either :to or :from state', exception.message
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def test_should_not_allow_from_and_to
|
|
70
|
+
exception = assert_raise(ArgumentError) { @state_context.transition(:on => :ignite, :from => :parked, :to => :idling) }
|
|
71
|
+
assert_equal 'Must specify either :to or :from state', exception.message
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def test_should_allow_to_state_if_missing_from_state
|
|
75
|
+
assert_nothing_raised { @state_context.transition(:on => :park, :from => :parked) }
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def test_should_allow_from_state_if_missing_to_state
|
|
79
|
+
assert_nothing_raised { @state_context.transition(:on => :ignite, :to => :idling) }
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def test_should_automatically_set_to_option_with_from_state
|
|
83
|
+
branch = @state_context.transition(:from => :idling, :on => :park)
|
|
84
|
+
assert_instance_of StateMachine::Branch, branch
|
|
85
|
+
|
|
86
|
+
state_requirements = branch.state_requirements
|
|
87
|
+
assert_equal 1, state_requirements.length
|
|
88
|
+
|
|
89
|
+
from_requirement = state_requirements[0][:to]
|
|
90
|
+
assert_instance_of StateMachine::WhitelistMatcher, from_requirement
|
|
91
|
+
assert_equal [:parked], from_requirement.values
|
|
72
92
|
end
|
|
73
93
|
|
|
74
|
-
def
|
|
94
|
+
def test_should_automatically_set_from_option_with_to_state
|
|
75
95
|
branch = @state_context.transition(:to => :idling, :on => :ignite)
|
|
76
96
|
assert_instance_of StateMachine::Branch, branch
|
|
77
97
|
|
data/test/unit/state_test.rb
CHANGED
|
@@ -779,12 +779,32 @@ class StateWithInvalidMethodCallTest < Test::Unit::TestCase
|
|
|
779
779
|
end
|
|
780
780
|
end
|
|
781
781
|
|
|
782
|
-
class
|
|
782
|
+
class StateWithValidMethodCallForDifferentStateTest < Test::Unit::TestCase
|
|
783
783
|
def setup
|
|
784
784
|
@klass = Class.new
|
|
785
785
|
@machine = StateMachine::Machine.new(@klass)
|
|
786
786
|
@ancestors = @klass.ancestors
|
|
787
787
|
@machine.states << @state = StateMachine::State.new(@machine, :idling)
|
|
788
|
+
@state.context do
|
|
789
|
+
def speed
|
|
790
|
+
0
|
|
791
|
+
end
|
|
792
|
+
end
|
|
793
|
+
|
|
794
|
+
@object = @klass.new
|
|
795
|
+
end
|
|
796
|
+
|
|
797
|
+
def test_should_call_method_missing_arg
|
|
798
|
+
assert_equal 1, @state.call(@object, :speed, lambda {1})
|
|
799
|
+
end
|
|
800
|
+
end
|
|
801
|
+
|
|
802
|
+
class StateWithValidMethodCallForCurrentStaeTest < Test::Unit::TestCase
|
|
803
|
+
def setup
|
|
804
|
+
@klass = Class.new
|
|
805
|
+
@machine = StateMachine::Machine.new(@klass, :initial => :idling)
|
|
806
|
+
@ancestors = @klass.ancestors
|
|
807
|
+
@state = @machine.state(:idling)
|
|
788
808
|
@state.context do
|
|
789
809
|
def speed(arg = nil)
|
|
790
810
|
block_given? ? [arg, yield] : arg
|
|
@@ -1116,7 +1116,6 @@ class TransitionCollectionWithSkippedAfterCallbacksTest < Test::Unit::TestCase
|
|
|
1116
1116
|
@machine.state :idling
|
|
1117
1117
|
@machine.event :ignite
|
|
1118
1118
|
@machine.after_transition {@ran_after = true}
|
|
1119
|
-
@machine.around_transition {|block| @ran_around_before = true; block.call; @ran_around_after = true}
|
|
1120
1119
|
|
|
1121
1120
|
@object = @klass.new
|
|
1122
1121
|
|
|
@@ -1134,25 +1133,70 @@ class TransitionCollectionWithSkippedAfterCallbacksTest < Test::Unit::TestCase
|
|
|
1134
1133
|
assert !@ran_after
|
|
1135
1134
|
end
|
|
1136
1135
|
|
|
1137
|
-
def test_should_not_run_around_callbacks_after_yield
|
|
1138
|
-
assert !@ran_around_after
|
|
1139
|
-
end
|
|
1140
|
-
|
|
1141
1136
|
def test_should_run_after_callbacks_on_subsequent_perform
|
|
1142
1137
|
StateMachine::TransitionCollection.new([@transition]).perform
|
|
1143
1138
|
assert @ran_after
|
|
1144
1139
|
end
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1140
|
+
end
|
|
1141
|
+
|
|
1142
|
+
if RUBY_PLATFORM != 'java'
|
|
1143
|
+
class TransitionCollectionWithSkippedAfterCallbacksAndAroundCallbacksTest < Test::Unit::TestCase
|
|
1144
|
+
def setup
|
|
1145
|
+
@klass = Class.new
|
|
1146
|
+
|
|
1147
|
+
@machine = StateMachine::Machine.new(@klass, :initial => :parked)
|
|
1148
|
+
@machine.state :idling
|
|
1149
|
+
@machine.event :ignite
|
|
1150
|
+
@machine.around_transition {|block| @ran_around_before = true; block.call; @ran_around_after = true}
|
|
1151
|
+
|
|
1152
|
+
@object = @klass.new
|
|
1153
|
+
|
|
1154
|
+
@transitions = StateMachine::TransitionCollection.new([
|
|
1155
|
+
@transition = StateMachine::Transition.new(@object, @machine, :ignite, :parked, :idling)
|
|
1156
|
+
], :after => false)
|
|
1157
|
+
@result = @transitions.perform
|
|
1158
|
+
end
|
|
1159
|
+
|
|
1160
|
+
def test_should_succeed
|
|
1161
|
+
assert_equal true, @result
|
|
1162
|
+
end
|
|
1163
|
+
|
|
1164
|
+
def test_should_not_run_around_callbacks_after_yield
|
|
1165
|
+
assert !@ran_around_after
|
|
1166
|
+
end
|
|
1167
|
+
|
|
1168
|
+
def test_should_run_around_callbacks_after_yield_on_subsequent_perform
|
|
1169
|
+
StateMachine::TransitionCollection.new([@transition]).perform
|
|
1170
|
+
assert @ran_around_after
|
|
1171
|
+
end
|
|
1172
|
+
|
|
1173
|
+
def test_should_not_rerun_around_callbacks_before_yield_on_subsequent_perform
|
|
1174
|
+
@ran_around_before = false
|
|
1175
|
+
StateMachine::TransitionCollection.new([@transition]).perform
|
|
1176
|
+
|
|
1177
|
+
assert !@ran_around_before
|
|
1178
|
+
end
|
|
1149
1179
|
end
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1180
|
+
else
|
|
1181
|
+
class TransitionCollectionWithSkippedAfterCallbacksAndAroundCallbacksTest < Test::Unit::TestCase
|
|
1182
|
+
def setup
|
|
1183
|
+
@klass = Class.new
|
|
1184
|
+
|
|
1185
|
+
@machine = StateMachine::Machine.new(@klass, :initial => :parked)
|
|
1186
|
+
@machine.state :idling
|
|
1187
|
+
@machine.event :ignite
|
|
1188
|
+
@machine.around_transition {|block| @ran_around_before = true; block.call; @ran_around_after = true}
|
|
1189
|
+
|
|
1190
|
+
@object = @klass.new
|
|
1191
|
+
|
|
1192
|
+
@transitions = StateMachine::TransitionCollection.new([
|
|
1193
|
+
@transition = StateMachine::Transition.new(@object, @machine, :ignite, :parked, :idling)
|
|
1194
|
+
], :after => false)
|
|
1195
|
+
end
|
|
1154
1196
|
|
|
1155
|
-
|
|
1197
|
+
def test_should_raise_exception
|
|
1198
|
+
assert_raise(ArgumentError) { @transitions.perform }
|
|
1199
|
+
end
|
|
1156
1200
|
end
|
|
1157
1201
|
end
|
|
1158
1202
|
|
|
@@ -2073,19 +2117,21 @@ class AttributeTransitionCollectionMarshallingTest < Test::Unit::TestCase
|
|
|
2073
2117
|
end
|
|
2074
2118
|
end
|
|
2075
2119
|
|
|
2076
|
-
|
|
2077
|
-
|
|
2078
|
-
|
|
2079
|
-
|
|
2080
|
-
|
|
2120
|
+
if RUBY_PLATFORM != 'java'
|
|
2121
|
+
def test_should_marshal_during_around_callbacks_before_yield
|
|
2122
|
+
@machine.around_transition {|object, transition, block| Marshal.dump(object); block.call}
|
|
2123
|
+
assert_nothing_raised do
|
|
2124
|
+
transitions(:after => false).perform { true }
|
|
2125
|
+
transitions.perform { true }
|
|
2126
|
+
end
|
|
2081
2127
|
end
|
|
2082
|
-
|
|
2083
|
-
|
|
2084
|
-
|
|
2085
|
-
|
|
2086
|
-
|
|
2087
|
-
|
|
2088
|
-
|
|
2128
|
+
|
|
2129
|
+
def test_should_marshal_during_around_callbacks_after_yield
|
|
2130
|
+
@machine.around_transition {|object, transition, block| block.call; Marshal.dump(object)}
|
|
2131
|
+
assert_nothing_raised do
|
|
2132
|
+
transitions(:after => false).perform { true }
|
|
2133
|
+
transitions.perform { true }
|
|
2134
|
+
end
|
|
2089
2135
|
end
|
|
2090
2136
|
end
|
|
2091
2137
|
|
|
@@ -1209,13 +1209,6 @@ class TransitionWithAfterCallbacksSkippedTest < Test::Unit::TestCase
|
|
|
1209
1209
|
assert @run
|
|
1210
1210
|
end
|
|
1211
1211
|
|
|
1212
|
-
def test_should_run_around_callbacks_before_yield
|
|
1213
|
-
@machine.around_transition {|block| @run = true; block.call}
|
|
1214
|
-
|
|
1215
|
-
assert_equal true, @transition.run_callbacks(:after => false)
|
|
1216
|
-
assert @run
|
|
1217
|
-
end
|
|
1218
|
-
|
|
1219
1212
|
def test_should_not_run_after_callbacks
|
|
1220
1213
|
@machine.after_transition {@run = true}
|
|
1221
1214
|
|
|
@@ -1223,82 +1216,100 @@ class TransitionWithAfterCallbacksSkippedTest < Test::Unit::TestCase
|
|
|
1223
1216
|
assert !@run
|
|
1224
1217
|
end
|
|
1225
1218
|
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1233
|
-
def test_should_continue_around_transition_execution_on_second_call
|
|
1234
|
-
@callbacks = []
|
|
1235
|
-
@machine.around_transition {|block| @callbacks << :before_around_1; block.call; @callbacks << :after_around_1}
|
|
1236
|
-
@machine.around_transition {|block| @callbacks << :before_around_2; block.call; @callbacks << :after_around_2}
|
|
1237
|
-
@machine.after_transition {@callbacks << :after}
|
|
1238
|
-
|
|
1239
|
-
assert_equal true, @transition.run_callbacks(:after => false)
|
|
1240
|
-
assert_equal [:before_around_1, :before_around_2], @callbacks
|
|
1241
|
-
|
|
1242
|
-
assert_equal true, @transition.run_callbacks
|
|
1243
|
-
assert_equal [:before_around_1, :before_around_2, :after_around_2, :after_around_1, :after], @callbacks
|
|
1244
|
-
end
|
|
1245
|
-
|
|
1246
|
-
def test_should_not_run_further_callbacks_if_halted_during_continue_around_transition
|
|
1247
|
-
@callbacks = []
|
|
1248
|
-
@machine.around_transition {|block| @callbacks << :before_around_1; block.call; @callbacks << :after_around_1}
|
|
1249
|
-
@machine.around_transition {|block| @callbacks << :before_around_2; block.call; @callbacks << :after_around_2; throw :halt}
|
|
1250
|
-
@machine.after_transition {@callbacks << :after}
|
|
1251
|
-
|
|
1252
|
-
assert_equal true, @transition.run_callbacks(:after => false)
|
|
1253
|
-
assert_equal [:before_around_1, :before_around_2], @callbacks
|
|
1254
|
-
|
|
1255
|
-
assert_equal true, @transition.run_callbacks
|
|
1256
|
-
assert_equal [:before_around_1, :before_around_2, :after_around_2], @callbacks
|
|
1257
|
-
end
|
|
1258
|
-
|
|
1259
|
-
def test_should_not_be_able_to_continue_twice
|
|
1260
|
-
@count = 0
|
|
1261
|
-
@machine.around_transition {|block| block.call; @count += 1}
|
|
1262
|
-
@machine.after_transition {@count += 1}
|
|
1219
|
+
if RUBY_PLATFORM != 'java'
|
|
1220
|
+
def test_should_run_around_callbacks_before_yield
|
|
1221
|
+
@machine.around_transition {|block| @run = true; block.call}
|
|
1222
|
+
|
|
1223
|
+
assert_equal true, @transition.run_callbacks(:after => false)
|
|
1224
|
+
assert @run
|
|
1225
|
+
end
|
|
1263
1226
|
|
|
1264
|
-
|
|
1227
|
+
def test_should_not_run_around_callbacks_after_yield
|
|
1228
|
+
@machine.around_transition {|block| block.call; @run = true}
|
|
1229
|
+
|
|
1230
|
+
assert_equal true, @transition.run_callbacks(:after => false)
|
|
1231
|
+
assert !@run
|
|
1232
|
+
end
|
|
1265
1233
|
|
|
1266
|
-
|
|
1234
|
+
def test_should_continue_around_transition_execution_on_second_call
|
|
1235
|
+
@callbacks = []
|
|
1236
|
+
@machine.around_transition {|block| @callbacks << :before_around_1; block.call; @callbacks << :after_around_1}
|
|
1237
|
+
@machine.around_transition {|block| @callbacks << :before_around_2; block.call; @callbacks << :after_around_2}
|
|
1238
|
+
@machine.after_transition {@callbacks << :after}
|
|
1239
|
+
|
|
1240
|
+
assert_equal true, @transition.run_callbacks(:after => false)
|
|
1241
|
+
assert_equal [:before_around_1, :before_around_2], @callbacks
|
|
1242
|
+
|
|
1267
1243
|
assert_equal true, @transition.run_callbacks
|
|
1268
|
-
assert_equal
|
|
1244
|
+
assert_equal [:before_around_1, :before_around_2, :after_around_2, :after_around_1, :after], @callbacks
|
|
1269
1245
|
end
|
|
1270
|
-
end
|
|
1271
|
-
|
|
1272
|
-
def test_should_not_be_able_to_continue_again_after_halted
|
|
1273
|
-
@count = 0
|
|
1274
|
-
@machine.around_transition {|block| block.call; @count += 1; throw :halt}
|
|
1275
|
-
@machine.after_transition {@count += 1}
|
|
1276
|
-
|
|
1277
|
-
@transition.run_callbacks(:after => false)
|
|
1278
1246
|
|
|
1279
|
-
|
|
1247
|
+
def test_should_not_run_further_callbacks_if_halted_during_continue_around_transition
|
|
1248
|
+
@callbacks = []
|
|
1249
|
+
@machine.around_transition {|block| @callbacks << :before_around_1; block.call; @callbacks << :after_around_1}
|
|
1250
|
+
@machine.around_transition {|block| @callbacks << :before_around_2; block.call; @callbacks << :after_around_2; throw :halt}
|
|
1251
|
+
@machine.after_transition {@callbacks << :after}
|
|
1252
|
+
|
|
1253
|
+
assert_equal true, @transition.run_callbacks(:after => false)
|
|
1254
|
+
assert_equal [:before_around_1, :before_around_2], @callbacks
|
|
1255
|
+
|
|
1280
1256
|
assert_equal true, @transition.run_callbacks
|
|
1281
|
-
assert_equal
|
|
1257
|
+
assert_equal [:before_around_1, :before_around_2, :after_around_2], @callbacks
|
|
1282
1258
|
end
|
|
1283
|
-
end
|
|
1284
|
-
|
|
1285
|
-
def test_should_have_access_to_result_after_continued
|
|
1286
|
-
@machine.around_transition {|block| @around_before_result = @transition.result; block.call; @around_after_result = @transition.result}
|
|
1287
|
-
@machine.after_transition {@after_result = @transition.result}
|
|
1288
1259
|
|
|
1289
|
-
|
|
1290
|
-
|
|
1260
|
+
def test_should_not_be_able_to_continue_twice
|
|
1261
|
+
@count = 0
|
|
1262
|
+
@machine.around_transition {|block| block.call; @count += 1}
|
|
1263
|
+
@machine.after_transition {@count += 1}
|
|
1264
|
+
|
|
1265
|
+
@transition.run_callbacks(:after => false)
|
|
1266
|
+
|
|
1267
|
+
2.times do
|
|
1268
|
+
assert_equal true, @transition.run_callbacks
|
|
1269
|
+
assert_equal 2, @count
|
|
1270
|
+
end
|
|
1271
|
+
end
|
|
1291
1272
|
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1273
|
+
def test_should_not_be_able_to_continue_again_after_halted
|
|
1274
|
+
@count = 0
|
|
1275
|
+
@machine.around_transition {|block| block.call; @count += 1; throw :halt}
|
|
1276
|
+
@machine.after_transition {@count += 1}
|
|
1277
|
+
|
|
1278
|
+
@transition.run_callbacks(:after => false)
|
|
1279
|
+
|
|
1280
|
+
2.times do
|
|
1281
|
+
assert_equal true, @transition.run_callbacks
|
|
1282
|
+
assert_equal 1, @count
|
|
1283
|
+
end
|
|
1284
|
+
end
|
|
1299
1285
|
|
|
1300
|
-
|
|
1301
|
-
|
|
1286
|
+
def test_should_have_access_to_result_after_continued
|
|
1287
|
+
@machine.around_transition {|block| @around_before_result = @transition.result; block.call; @around_after_result = @transition.result}
|
|
1288
|
+
@machine.after_transition {@after_result = @transition.result}
|
|
1289
|
+
|
|
1290
|
+
@transition.run_callbacks(:after => false)
|
|
1291
|
+
@transition.run_callbacks {{:result => 1}}
|
|
1292
|
+
|
|
1293
|
+
assert_nil @around_before_result
|
|
1294
|
+
assert_equal 1, @around_after_result
|
|
1295
|
+
assert_equal 1, @after_result
|
|
1296
|
+
end
|
|
1297
|
+
|
|
1298
|
+
def test_should_raise_exceptions_during_around_callbacks_after_yield_in_second_execution
|
|
1299
|
+
@machine.around_transition {|block| block.call; raise ArgumentError}
|
|
1300
|
+
|
|
1301
|
+
assert_nothing_raised { @transition.run_callbacks(:after => false) }
|
|
1302
|
+
assert_raise(ArgumentError) { @transition.run_callbacks }
|
|
1303
|
+
end
|
|
1304
|
+
else
|
|
1305
|
+
def test_should_raise_exception_on_second_call
|
|
1306
|
+
@callbacks = []
|
|
1307
|
+
@machine.around_transition {|block| @callbacks << :before_around_1; block.call; @callbacks << :after_around_1}
|
|
1308
|
+
@machine.around_transition {|block| @callbacks << :before_around_2; block.call; @callbacks << :after_around_2}
|
|
1309
|
+
@machine.after_transition {@callbacks << :after}
|
|
1310
|
+
|
|
1311
|
+
assert_raise(ArgumentError) { @transition.run_callbacks(:after => false) }
|
|
1312
|
+
end
|
|
1302
1313
|
end
|
|
1303
1314
|
end
|
|
1304
1315
|
|