state_machine 1.1.2 → 1.2.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/.gitignore +7 -11
- data/.travis.yml +49 -7
- data/Appraisals +255 -87
- data/CHANGELOG.md +30 -0
- data/README.md +142 -21
- data/Rakefile +1 -11
- data/examples/Gemfile +5 -0
- data/examples/Gemfile.lock +14 -0
- data/examples/auto_shop.rb +2 -0
- data/examples/car.rb +2 -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/rails-rest/migration.rb +1 -5
- data/examples/rails-rest/view__form.html.erb +34 -0
- data/examples/rails-rest/view_edit.html.erb +2 -21
- data/examples/rails-rest/view_index.html.erb +6 -4
- data/examples/rails-rest/view_new.html.erb +2 -11
- data/examples/rails-rest/view_show.html.erb +5 -3
- data/examples/traffic_light.rb +2 -0
- data/examples/vehicle.rb +2 -0
- data/gemfiles/active_model-3.0.0.gemfile.lock +9 -6
- data/gemfiles/active_model-3.0.5.gemfile.lock +10 -7
- data/gemfiles/active_model-3.1.1.gemfile.lock +12 -10
- data/gemfiles/{active_model-3.2.0.gemfile → active_model-3.2.1.gemfile} +1 -1
- data/gemfiles/{graphviz-0.9.0.gemfile → active_model-3.2.12.gemfile} +1 -1
- data/gemfiles/active_model-3.2.12.gemfile.lock +36 -0
- data/gemfiles/{active_record-3.2.0.gemfile → active_model-3.2.13.rc1.gemfile} +1 -2
- data/gemfiles/active_model-3.2.13.rc1.gemfile.lock +36 -0
- data/gemfiles/active_model-4.0.0.gemfile +9 -0
- data/gemfiles/active_model-4.0.0.gemfile.lock +78 -0
- data/gemfiles/active_record-2.0.0.gemfile +2 -1
- data/gemfiles/active_record-2.0.0.gemfile.lock +15 -6
- data/gemfiles/active_record-2.0.5.gemfile +2 -1
- data/gemfiles/active_record-2.0.5.gemfile.lock +15 -6
- data/gemfiles/active_record-2.1.0.gemfile +2 -1
- data/gemfiles/active_record-2.1.0.gemfile.lock +15 -6
- data/gemfiles/active_record-2.1.2.gemfile +2 -1
- data/gemfiles/active_record-2.1.2.gemfile.lock +15 -6
- data/gemfiles/active_record-2.2.3.gemfile +2 -1
- data/gemfiles/active_record-2.2.3.gemfile.lock +15 -6
- data/gemfiles/active_record-2.3.12.gemfile +2 -1
- data/gemfiles/active_record-2.3.12.gemfile.lock +15 -6
- data/gemfiles/active_record-2.3.5.gemfile +9 -0
- data/gemfiles/active_record-2.3.5.gemfile.lock +39 -0
- data/gemfiles/active_record-3.0.0.gemfile +2 -1
- data/gemfiles/active_record-3.0.0.gemfile.lock +18 -11
- data/gemfiles/active_record-3.0.5.gemfile +2 -1
- data/gemfiles/active_record-3.0.5.gemfile.lock +19 -12
- data/gemfiles/active_record-3.1.1.gemfile +2 -1
- data/gemfiles/active_record-3.1.1.gemfile.lock +22 -16
- data/gemfiles/active_record-3.2.12.gemfile +9 -0
- data/gemfiles/active_record-3.2.12.gemfile.lock +51 -0
- data/gemfiles/active_record-3.2.13.rc1.gemfile +9 -0
- data/gemfiles/active_record-3.2.13.rc1.gemfile.lock +51 -0
- data/gemfiles/active_record-4.0.0.gemfile +11 -0
- data/gemfiles/active_record-4.0.0.gemfile.lock +83 -0
- data/gemfiles/data_mapper-0.10.2.gemfile +1 -0
- data/gemfiles/data_mapper-0.10.2.gemfile.lock +13 -9
- data/gemfiles/data_mapper-0.9.11.gemfile +1 -0
- data/gemfiles/data_mapper-0.9.11.gemfile.lock +31 -7
- data/gemfiles/data_mapper-0.9.4.gemfile.lock +25 -14
- data/gemfiles/data_mapper-0.9.7.gemfile +1 -0
- data/gemfiles/data_mapper-0.9.7.gemfile.lock +27 -15
- data/gemfiles/data_mapper-1.0.0.gemfile.lock +20 -17
- data/gemfiles/data_mapper-1.0.1.gemfile.lock +20 -17
- data/gemfiles/data_mapper-1.0.2.gemfile.lock +20 -17
- data/gemfiles/data_mapper-1.1.0.gemfile.lock +19 -16
- data/gemfiles/data_mapper-1.2.0.gemfile.lock +19 -16
- data/gemfiles/default.gemfile.lock +8 -5
- data/gemfiles/graphviz-0.9.17.gemfile +7 -0
- data/gemfiles/graphviz-0.9.17.gemfile.lock +29 -0
- data/gemfiles/graphviz-0.9.21.gemfile.lock +7 -4
- data/gemfiles/graphviz-1.0.0.gemfile.lock +7 -4
- data/gemfiles/graphviz-1.0.3.gemfile +7 -0
- data/gemfiles/graphviz-1.0.3.gemfile.lock +29 -0
- data/gemfiles/graphviz-1.0.8.gemfile +7 -0
- data/gemfiles/graphviz-1.0.8.gemfile.lock +29 -0
- data/gemfiles/mongo_mapper-0.10.0.gemfile +1 -0
- data/gemfiles/mongo_mapper-0.10.0.gemfile.lock +14 -11
- data/gemfiles/mongo_mapper-0.11.1.gemfile +7 -0
- data/gemfiles/mongo_mapper-0.11.1.gemfile.lock +44 -0
- data/gemfiles/mongo_mapper-0.11.2.gemfile +9 -0
- data/gemfiles/mongo_mapper-0.11.2.gemfile.lock +48 -0
- data/gemfiles/mongo_mapper-0.12.0.gemfile +9 -0
- data/gemfiles/mongo_mapper-0.12.0.gemfile.lock +48 -0
- data/gemfiles/mongo_mapper-0.5.5.gemfile.lock +7 -4
- data/gemfiles/mongo_mapper-0.5.8.gemfile.lock +7 -4
- data/gemfiles/mongo_mapper-0.6.0.gemfile.lock +7 -4
- data/gemfiles/mongo_mapper-0.6.10.gemfile.lock +7 -4
- data/gemfiles/mongo_mapper-0.7.0.gemfile.lock +7 -4
- data/gemfiles/mongo_mapper-0.7.5.gemfile.lock +7 -4
- data/gemfiles/mongo_mapper-0.8.0.gemfile.lock +7 -4
- data/gemfiles/mongo_mapper-0.8.3.gemfile.lock +7 -4
- data/gemfiles/mongo_mapper-0.8.4.gemfile.lock +7 -4
- data/gemfiles/mongo_mapper-0.8.6.gemfile.lock +7 -4
- data/gemfiles/mongo_mapper-0.9.0.gemfile.lock +7 -4
- data/gemfiles/mongoid-2.0.0.gemfile +2 -0
- data/gemfiles/mongoid-2.0.0.gemfile.lock +22 -18
- data/gemfiles/mongoid-2.1.4.gemfile +2 -0
- data/gemfiles/mongoid-2.1.4.gemfile.lock +21 -17
- data/gemfiles/mongoid-2.2.4.gemfile +2 -0
- data/gemfiles/mongoid-2.2.4.gemfile.lock +21 -17
- data/gemfiles/mongoid-2.3.3.gemfile +2 -0
- data/gemfiles/mongoid-2.3.3.gemfile.lock +21 -17
- data/gemfiles/mongoid-2.4.0.gemfile +9 -0
- data/gemfiles/mongoid-2.4.0.gemfile.lock +47 -0
- data/gemfiles/mongoid-2.4.10.gemfile +9 -0
- data/gemfiles/mongoid-2.4.10.gemfile.lock +47 -0
- data/gemfiles/mongoid-2.5.2.gemfile +9 -0
- data/gemfiles/mongoid-2.5.2.gemfile.lock +47 -0
- data/gemfiles/mongoid-2.6.0.gemfile +9 -0
- data/gemfiles/mongoid-2.6.0.gemfile.lock +47 -0
- data/gemfiles/mongoid-3.0.0.gemfile +8 -0
- data/gemfiles/mongoid-3.0.0.gemfile.lock +45 -0
- data/gemfiles/mongoid-3.0.22.gemfile +8 -0
- data/gemfiles/mongoid-3.0.22.gemfile.lock +45 -0
- data/gemfiles/mongoid-3.1.0.gemfile +8 -0
- data/gemfiles/mongoid-3.1.0.gemfile.lock +45 -0
- data/gemfiles/sequel-2.11.0.gemfile +2 -1
- data/gemfiles/sequel-2.11.0.gemfile.lock +11 -6
- data/gemfiles/sequel-2.12.0.gemfile +2 -1
- data/gemfiles/sequel-2.12.0.gemfile.lock +11 -6
- data/gemfiles/sequel-2.8.0.gemfile +2 -1
- data/gemfiles/sequel-2.8.0.gemfile.lock +11 -6
- data/gemfiles/sequel-3.0.0.gemfile +2 -1
- data/gemfiles/sequel-3.0.0.gemfile.lock +11 -6
- data/gemfiles/sequel-3.10.0.gemfile +9 -0
- data/gemfiles/sequel-3.10.0.gemfile.lock +33 -0
- data/gemfiles/sequel-3.13.0.gemfile +2 -1
- data/gemfiles/sequel-3.13.0.gemfile.lock +11 -6
- data/gemfiles/sequel-3.14.0.gemfile +2 -1
- data/gemfiles/sequel-3.14.0.gemfile.lock +11 -6
- data/gemfiles/sequel-3.23.0.gemfile +2 -1
- data/gemfiles/sequel-3.23.0.gemfile.lock +11 -6
- data/gemfiles/sequel-3.24.0.gemfile +2 -1
- data/gemfiles/sequel-3.24.0.gemfile.lock +11 -6
- data/gemfiles/sequel-3.29.0.gemfile +2 -1
- data/gemfiles/sequel-3.29.0.gemfile.lock +11 -6
- data/gemfiles/sequel-3.34.0.gemfile +9 -0
- data/gemfiles/sequel-3.34.0.gemfile.lock +33 -0
- data/gemfiles/sequel-3.35.0.gemfile +9 -0
- data/gemfiles/sequel-3.35.0.gemfile.lock +33 -0
- data/gemfiles/sequel-3.4.0.gemfile +9 -0
- data/gemfiles/sequel-3.4.0.gemfile.lock +33 -0
- data/gemfiles/sequel-3.44.0.gemfile +9 -0
- data/gemfiles/sequel-3.44.0.gemfile.lock +33 -0
- data/lib/state_machine.rb +6 -0
- data/lib/state_machine/branch.rb +9 -8
- data/lib/state_machine/callback.rb +2 -2
- data/lib/state_machine/core.rb +10 -0
- data/lib/state_machine/core_ext.rb +1 -0
- data/lib/state_machine/eval_helpers.rb +5 -3
- data/lib/state_machine/event.rb +17 -6
- data/lib/state_machine/graph.rb +92 -0
- data/lib/state_machine/integrations.rb +13 -1
- data/lib/state_machine/integrations/active_model.rb +14 -20
- data/lib/state_machine/integrations/active_model/observer.rb +3 -3
- data/lib/state_machine/integrations/active_model/observer_update.rb +42 -0
- data/lib/state_machine/integrations/active_record.rb +52 -25
- data/lib/state_machine/integrations/active_record/locale.rb +1 -1
- data/lib/state_machine/integrations/active_record/versions.rb +1 -17
- data/lib/state_machine/integrations/base.rb +15 -6
- data/lib/state_machine/integrations/data_mapper.rb +98 -35
- data/lib/state_machine/integrations/data_mapper/versions.rb +46 -8
- data/lib/state_machine/integrations/mongo_mapper.rb +39 -12
- data/lib/state_machine/integrations/mongo_mapper/locale.rb +1 -1
- data/lib/state_machine/integrations/mongo_mapper/versions.rb +3 -20
- data/lib/state_machine/integrations/mongoid.rb +52 -14
- data/lib/state_machine/integrations/mongoid/locale.rb +1 -1
- data/lib/state_machine/integrations/mongoid/versions.rb +52 -26
- data/lib/state_machine/integrations/sequel.rb +82 -33
- data/lib/state_machine/integrations/sequel/versions.rb +19 -44
- data/lib/state_machine/machine.rb +99 -59
- data/lib/state_machine/machine_collection.rb +1 -2
- data/lib/state_machine/macro_methods.rb +29 -0
- data/lib/state_machine/node_collection.rb +1 -1
- data/lib/state_machine/state.rb +18 -10
- data/lib/state_machine/state_context.rb +2 -2
- data/lib/state_machine/transition.rb +8 -1
- data/lib/state_machine/transition_collection.rb +2 -1
- data/lib/state_machine/version.rb +1 -1
- data/lib/state_machine/yard.rb +8 -0
- data/lib/state_machine/yard/handlers.rb +12 -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/templates.rb +3 -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/tasks/state_machine.rb +2 -1
- data/lib/yard-state_machine.rb +2 -0
- data/state_machine.gemspec +4 -3
- data/test/files/switch.rb +4 -0
- data/test/test_helper.rb +5 -0
- data/test/unit/branch_test.rb +117 -36
- data/test/unit/callback_test.rb +5 -2
- data/test/unit/eval_helpers_test.rb +49 -1
- data/test/unit/event_collection_test.rb +3 -1
- data/test/unit/event_test.rb +182 -12
- data/test/unit/graph_test.rb +98 -0
- data/test/unit/integrations/active_model_test.rb +82 -12
- data/test/unit/integrations/active_record_test.rb +393 -37
- data/test/unit/integrations/base_test.rb +7 -2
- data/test/unit/integrations/data_mapper_test.rb +326 -72
- data/test/unit/integrations/mongo_mapper_test.rb +338 -44
- data/test/unit/integrations/mongoid_test.rb +606 -98
- data/test/unit/integrations/sequel_test.rb +429 -102
- data/test/unit/integrations_test.rb +28 -6
- data/test/unit/machine_collection_test.rb +6 -2
- data/test/unit/machine_test.rb +134 -82
- data/test/unit/node_collection_test.rb +2 -2
- data/test/unit/path_test.rb +1 -1
- data/test/unit/state_test.rb +65 -21
- data/test/unit/transition_collection_test.rb +43 -23
- data/test/unit/transition_test.rb +8 -2
- metadata +303 -221
- data/gemfiles/active_model-3.2.0.gemfile.lock +0 -32
- data/gemfiles/active_record-3.2.0.gemfile.lock +0 -43
- data/gemfiles/graphviz-0.9.0.gemfile.lock +0 -26
@@ -2,7 +2,10 @@ require File.expand_path(File.dirname(__FILE__) + '/../test_helper')
|
|
2
2
|
|
3
3
|
class IntegrationMatcherTest < Test::Unit::TestCase
|
4
4
|
def setup
|
5
|
-
|
5
|
+
superclass = Class.new
|
6
|
+
self.class.const_set('Vehicle', superclass)
|
7
|
+
|
8
|
+
@klass = Class.new(superclass)
|
6
9
|
end
|
7
10
|
|
8
11
|
def test_should_return_nil_if_no_match_found
|
@@ -13,20 +16,39 @@ class IntegrationMatcherTest < Test::Unit::TestCase
|
|
13
16
|
integration = Module.new do
|
14
17
|
include StateMachine::Integrations::Base
|
15
18
|
|
16
|
-
def self.
|
17
|
-
|
19
|
+
def self.matching_ancestors
|
20
|
+
['IntegrationMatcherTest::Vehicle']
|
18
21
|
end
|
22
|
+
end
|
23
|
+
StateMachine::Integrations.const_set('Custom', integration)
|
24
|
+
|
25
|
+
assert_equal integration, StateMachine::Integrations.match(@klass)
|
26
|
+
ensure
|
27
|
+
StateMachine::Integrations.send(:remove_const, 'Custom')
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_should_return_nil_if_no_match_found_with_ancestors
|
31
|
+
assert_nil StateMachine::Integrations.match_ancestors(['IntegrationMatcherTest::Fake'])
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_should_return_integration_class_if_match_found_with_ancestors
|
35
|
+
integration = Module.new do
|
36
|
+
include StateMachine::Integrations::Base
|
19
37
|
|
20
|
-
def self.
|
21
|
-
|
38
|
+
def self.matching_ancestors
|
39
|
+
['IntegrationMatcherTest::Vehicle']
|
22
40
|
end
|
23
41
|
end
|
24
42
|
StateMachine::Integrations.const_set('Custom', integration)
|
25
43
|
|
26
|
-
assert_equal integration, StateMachine::Integrations.
|
44
|
+
assert_equal integration, StateMachine::Integrations.match_ancestors(['IntegrationMatcherTest::Fake', 'IntegrationMatcherTest::Vehicle'])
|
27
45
|
ensure
|
28
46
|
StateMachine::Integrations.send(:remove_const, 'Custom')
|
29
47
|
end
|
48
|
+
|
49
|
+
def teardown
|
50
|
+
self.class.send(:remove_const, 'Vehicle')
|
51
|
+
end
|
30
52
|
end
|
31
53
|
|
32
54
|
class IntegrationFinderTest < Test::Unit::TestCase
|
@@ -67,10 +67,10 @@ class MachineCollectionStateInitializationTest < Test::Unit::TestCase
|
|
67
67
|
assert_equal 'active', @object.alarm_state
|
68
68
|
end
|
69
69
|
|
70
|
-
def
|
70
|
+
def test_should_not_initialize_existing_static_states_by_default
|
71
71
|
@object.state = 'idling'
|
72
72
|
@machines.initialize_states(@object)
|
73
|
-
assert_equal '
|
73
|
+
assert_equal 'idling', @object.state
|
74
74
|
end
|
75
75
|
|
76
76
|
def test_should_initialize_existing_static_states_if_forced
|
@@ -164,6 +164,8 @@ class MachineCollectionFireTest < Test::Unit::TestCase
|
|
164
164
|
end
|
165
165
|
|
166
166
|
def test_should_run_failure_callbacks_if_any_event_cannot_transition
|
167
|
+
@state_failure_run = @alarm_state_failure_run = false
|
168
|
+
|
167
169
|
@machines[:state].after_failure {@state_failure_run = true}
|
168
170
|
@machines[:alarm_state].after_failure {@alarm_state_failure_run = true}
|
169
171
|
|
@@ -246,6 +248,7 @@ class MachineCollectionFireWithTransactionsTest < Test::Unit::TestCase
|
|
246
248
|
|
247
249
|
def test_should_run_failure_callbacks_if_not_successful
|
248
250
|
@object.allow_save = false
|
251
|
+
@state_failure_run = @alarm_state_failure_run = false
|
249
252
|
|
250
253
|
@machines[:state].after_failure {@state_failure_run = true}
|
251
254
|
@machines[:alarm_state].after_failure {@alarm_state_failure_run = true}
|
@@ -313,6 +316,7 @@ class MachineCollectionFireWithValidationsTest < Test::Unit::TestCase
|
|
313
316
|
def test_should_run_failure_callbacks_if_no_transitions_exist
|
314
317
|
@object.state = 'idling'
|
315
318
|
@object.alarm_state = 'off'
|
319
|
+
@state_failure_run = @alarm_state_failure_run = false
|
316
320
|
|
317
321
|
@machines[:state].after_failure {@state_failure_run = true}
|
318
322
|
@machines[:alarm_state].after_failure {@alarm_state_failure_run = true}
|
data/test/unit/machine_test.rb
CHANGED
@@ -170,7 +170,7 @@ class MachineByDefaultTest < Test::Unit::TestCase
|
|
170
170
|
end
|
171
171
|
|
172
172
|
def test_should_extend_owner_class_with_class_methods
|
173
|
-
assert
|
173
|
+
assert((class << @klass; ancestors; end).include?(StateMachine::ClassMethods))
|
174
174
|
end
|
175
175
|
|
176
176
|
def test_should_include_instance_methods_in_owner_class
|
@@ -257,13 +257,12 @@ class MachineWithoutInitializationTest < Test::Unit::TestCase
|
|
257
257
|
end
|
258
258
|
|
259
259
|
def test_should_still_allow_manual_initialization
|
260
|
-
@klass.
|
260
|
+
@klass.send(:include, Module.new do
|
261
261
|
def initialize(attributes = {})
|
262
|
-
attributes.each {|attr, value| send("#{attr}=", value)}
|
263
262
|
super()
|
264
263
|
initialize_state_machines
|
265
264
|
end
|
266
|
-
end
|
265
|
+
end)
|
267
266
|
|
268
267
|
object = @klass.new
|
269
268
|
assert_equal 'parked', object.state
|
@@ -299,7 +298,7 @@ class MachineWithStaticInitialStateTest < Test::Unit::TestCase
|
|
299
298
|
assert_equal 'parked', @klass.new.state
|
300
299
|
end
|
301
300
|
|
302
|
-
def
|
301
|
+
def test_not_set_initial_state_even_if_not_empty
|
303
302
|
@klass.class_eval do
|
304
303
|
def initialize(attributes = {})
|
305
304
|
self.state = 'idling'
|
@@ -307,7 +306,7 @@ class MachineWithStaticInitialStateTest < Test::Unit::TestCase
|
|
307
306
|
end
|
308
307
|
end
|
309
308
|
object = @klass.new
|
310
|
-
assert_equal '
|
309
|
+
assert_equal 'idling', object.state
|
311
310
|
end
|
312
311
|
|
313
312
|
def test_should_set_initial_state_prior_to_initialization
|
@@ -319,7 +318,7 @@ class MachineWithStaticInitialStateTest < Test::Unit::TestCase
|
|
319
318
|
end
|
320
319
|
end
|
321
320
|
klass = Class.new(base)
|
322
|
-
|
321
|
+
StateMachine::Machine.new(klass, :initial => :parked)
|
323
322
|
|
324
323
|
assert_equal 'parked', klass.new.state_on_init
|
325
324
|
end
|
@@ -438,7 +437,7 @@ class MachineStateInitializationTest < Test::Unit::TestCase
|
|
438
437
|
|
439
438
|
def test_should_write_to_hash_if_specified
|
440
439
|
@machine.initialize_state(@object, :to => hash = {})
|
441
|
-
assert_equal
|
440
|
+
assert_equal({'state' => 'parked'}, hash)
|
442
441
|
end
|
443
442
|
|
444
443
|
def test_should_not_write_to_object_if_writing_to_hash
|
@@ -511,61 +510,65 @@ class MachineWithCustomIntegrationTest < Test::Unit::TestCase
|
|
511
510
|
integration = Module.new do
|
512
511
|
include StateMachine::Integrations::Base
|
513
512
|
|
514
|
-
def self.
|
515
|
-
|
516
|
-
end
|
517
|
-
|
518
|
-
def self.matches?(klass)
|
519
|
-
true
|
513
|
+
def self.matching_ancestors
|
514
|
+
['MachineWithCustomIntegrationTest::Vehicle']
|
520
515
|
end
|
521
516
|
end
|
522
517
|
|
523
518
|
StateMachine::Integrations.const_set('Custom', integration)
|
519
|
+
|
520
|
+
superclass = Class.new
|
521
|
+
self.class.const_set('Vehicle', superclass)
|
522
|
+
|
523
|
+
@klass = Class.new(superclass)
|
524
524
|
end
|
525
525
|
|
526
526
|
def test_should_be_extended_by_the_integration_if_explicit
|
527
|
-
machine = StateMachine::Machine.new(
|
528
|
-
assert
|
527
|
+
machine = StateMachine::Machine.new(@klass, :integration => :custom)
|
528
|
+
assert((class << machine; ancestors; end).include?(StateMachine::Integrations::Custom))
|
529
529
|
end
|
530
530
|
|
531
531
|
def test_should_not_be_extended_by_the_integration_if_implicit_but_not_available
|
532
532
|
StateMachine::Integrations::Custom.class_eval do
|
533
|
-
|
534
|
-
|
533
|
+
class << self; remove_method :matching_ancestors; end
|
534
|
+
def self.matching_ancestors
|
535
|
+
[]
|
535
536
|
end
|
536
537
|
end
|
537
538
|
|
538
|
-
machine = StateMachine::Machine.new(
|
539
|
-
assert
|
539
|
+
machine = StateMachine::Machine.new(@klass)
|
540
|
+
assert(!(class << machine; ancestors; end).include?(StateMachine::Integrations::Custom))
|
540
541
|
end
|
541
542
|
|
542
543
|
def test_should_not_be_extended_by_the_integration_if_implicit_but_not_matched
|
543
544
|
StateMachine::Integrations::Custom.class_eval do
|
544
|
-
|
545
|
-
|
545
|
+
class << self; remove_method :matching_ancestors; end
|
546
|
+
def self.matching_ancestors
|
547
|
+
[]
|
546
548
|
end
|
547
549
|
end
|
548
550
|
|
549
|
-
machine = StateMachine::Machine.new(
|
550
|
-
assert
|
551
|
+
machine = StateMachine::Machine.new(@klass)
|
552
|
+
assert(!(class << machine; ancestors; end).include?(StateMachine::Integrations::Custom))
|
551
553
|
end
|
552
554
|
|
553
555
|
def test_should_be_extended_by_the_integration_if_implicit_and_available_and_matches
|
554
|
-
machine = StateMachine::Machine.new(
|
555
|
-
assert
|
556
|
+
machine = StateMachine::Machine.new(@klass)
|
557
|
+
assert((class << machine; ancestors; end).include?(StateMachine::Integrations::Custom))
|
556
558
|
end
|
557
559
|
|
558
560
|
def test_should_not_be_extended_by_the_integration_if_nil
|
559
|
-
machine = StateMachine::Machine.new(
|
560
|
-
assert
|
561
|
+
machine = StateMachine::Machine.new(@klass, :integration => nil)
|
562
|
+
assert(!(class << machine; ancestors; end).include?(StateMachine::Integrations::Custom))
|
561
563
|
end
|
562
564
|
|
563
565
|
def test_should_not_be_extended_by_the_integration_if_false
|
564
|
-
machine = StateMachine::Machine.new(
|
565
|
-
assert
|
566
|
+
machine = StateMachine::Machine.new(@klass, :integration => false)
|
567
|
+
assert(!(class << machine; ancestors; end).include?(StateMachine::Integrations::Custom))
|
566
568
|
end
|
567
569
|
|
568
570
|
def teardown
|
571
|
+
self.class.send(:remove_const, 'Vehicle')
|
569
572
|
StateMachine::Integrations.send(:remove_const, 'Custom')
|
570
573
|
end
|
571
574
|
end
|
@@ -653,11 +656,11 @@ class MachineWithActionUndefinedTest < Test::Unit::TestCase
|
|
653
656
|
end
|
654
657
|
|
655
658
|
def test_should_define_an_event_transition_attribute_reader
|
656
|
-
assert @object.respond_to?(:state_event_transition)
|
659
|
+
assert @object.respond_to?(:state_event_transition, true)
|
657
660
|
end
|
658
661
|
|
659
662
|
def test_should_define_an_event_transition_attribute_writer
|
660
|
-
assert @object.respond_to?(:state_event_transition
|
663
|
+
assert @object.respond_to?(:state_event_transition=, true)
|
661
664
|
end
|
662
665
|
|
663
666
|
def test_should_not_define_action
|
@@ -689,11 +692,11 @@ class MachineWithActionDefinedInClassTest < Test::Unit::TestCase
|
|
689
692
|
end
|
690
693
|
|
691
694
|
def test_should_define_an_event_transition_attribute_reader
|
692
|
-
assert @object.respond_to?(:state_event_transition)
|
695
|
+
assert @object.respond_to?(:state_event_transition, true)
|
693
696
|
end
|
694
697
|
|
695
698
|
def test_should_define_an_event_transition_attribute_writer
|
696
|
-
assert @object.respond_to?(:state_event_transition
|
699
|
+
assert @object.respond_to?(:state_event_transition=, true)
|
697
700
|
end
|
698
701
|
|
699
702
|
def test_should_not_define_action
|
@@ -729,11 +732,11 @@ class MachineWithActionDefinedInIncludedModuleTest < Test::Unit::TestCase
|
|
729
732
|
end
|
730
733
|
|
731
734
|
def test_should_define_an_event_transition_attribute_reader
|
732
|
-
assert @object.respond_to?(:state_event_transition)
|
735
|
+
assert @object.respond_to?(:state_event_transition, true)
|
733
736
|
end
|
734
737
|
|
735
738
|
def test_should_define_an_event_transition_attribute_writer
|
736
|
-
assert @object.respond_to?(:state_event_transition
|
739
|
+
assert @object.respond_to?(:state_event_transition=, true)
|
737
740
|
end
|
738
741
|
|
739
742
|
def test_should_define_action
|
@@ -770,11 +773,11 @@ class MachineWithActionDefinedInSuperclassTest < Test::Unit::TestCase
|
|
770
773
|
end
|
771
774
|
|
772
775
|
def test_should_define_an_event_transition_attribute_reader
|
773
|
-
assert @object.respond_to?(:state_event_transition)
|
776
|
+
assert @object.respond_to?(:state_event_transition, true)
|
774
777
|
end
|
775
778
|
|
776
779
|
def test_should_define_an_event_transition_attribute_writer
|
777
|
-
assert @object.respond_to?(:state_event_transition
|
780
|
+
assert @object.respond_to?(:state_event_transition=, true)
|
778
781
|
end
|
779
782
|
|
780
783
|
def test_should_define_action
|
@@ -812,11 +815,11 @@ class MachineWithPrivateActionTest < Test::Unit::TestCase
|
|
812
815
|
end
|
813
816
|
|
814
817
|
def test_should_define_an_event_transition_attribute_reader
|
815
|
-
assert @object.respond_to?(:state_event_transition)
|
818
|
+
assert @object.respond_to?(:state_event_transition, true)
|
816
819
|
end
|
817
820
|
|
818
821
|
def test_should_define_an_event_transition_attribute_writer
|
819
|
-
assert @object.respond_to?(:state_event_transition
|
822
|
+
assert @object.respond_to?(:state_event_transition=, true)
|
820
823
|
end
|
821
824
|
|
822
825
|
def test_should_define_action
|
@@ -875,17 +878,28 @@ class MachineWithCustomPluralTest < Test::Unit::TestCase
|
|
875
878
|
end
|
876
879
|
|
877
880
|
StateMachine::Integrations.const_set('Custom', @integration)
|
878
|
-
@machine = StateMachine::Machine.new(Class.new, :integration => :custom, :plural => 'staties')
|
879
881
|
end
|
880
882
|
|
881
883
|
def test_should_define_a_singular_and_plural_with_scope
|
884
|
+
StateMachine::Machine.new(Class.new, :integration => :custom, :plural => 'staties')
|
882
885
|
assert_equal %w(with_state with_staties), @integration.with_scopes
|
883
886
|
end
|
884
887
|
|
885
888
|
def test_should_define_a_singular_and_plural_without_scope
|
889
|
+
StateMachine::Machine.new(Class.new, :integration => :custom, :plural => 'staties')
|
886
890
|
assert_equal %w(without_state without_staties), @integration.without_scopes
|
887
891
|
end
|
888
892
|
|
893
|
+
def test_should_define_single_with_scope_if_singular_same_as_plural
|
894
|
+
StateMachine::Machine.new(Class.new, :integration => :custom, :plural => 'state')
|
895
|
+
assert_equal %w(with_state), @integration.with_scopes
|
896
|
+
end
|
897
|
+
|
898
|
+
def test_should_define_single_without_scope_if_singular_same_as_plural
|
899
|
+
StateMachine::Machine.new(Class.new, :integration => :custom, :plural => 'state')
|
900
|
+
assert_equal %w(without_state), @integration.without_scopes
|
901
|
+
end
|
902
|
+
|
889
903
|
def teardown
|
890
904
|
StateMachine::Integrations.send(:remove_const, 'Custom')
|
891
905
|
end
|
@@ -1561,7 +1575,7 @@ class MachineWithConflictingHelpersBeforeDefinitionTest < Test::Unit::TestCase
|
|
1561
1575
|
assert_equal :human_state_event_name, @klass.human_state_event_name
|
1562
1576
|
end
|
1563
1577
|
|
1564
|
-
def
|
1578
|
+
def test_should_not_redefine_attribute_reader
|
1565
1579
|
assert_equal 'parked', @object.state
|
1566
1580
|
end
|
1567
1581
|
|
@@ -1609,8 +1623,8 @@ class MachineWithConflictingHelpersBeforeDefinitionTest < Test::Unit::TestCase
|
|
1609
1623
|
'Instance method "state_name"',
|
1610
1624
|
'Instance method "human_state_name"',
|
1611
1625
|
'Class method "with_state"',
|
1612
|
-
'Class method "without_state"',
|
1613
1626
|
'Class method "with_states"',
|
1627
|
+
'Class method "without_state"',
|
1614
1628
|
'Class method "without_states"'
|
1615
1629
|
].map {|method| "#{method} is already defined in #{@superclass.to_s}, use generic helper instead or set StateMachine::Machine.ignore_method_conflicts = true.\n"}.join
|
1616
1630
|
|
@@ -1734,7 +1748,7 @@ class MachineWithConflictingHelpersAfterDefinitionTest < Test::Unit::TestCase
|
|
1734
1748
|
assert_equal :human_state_event_name, @klass.human_state_event_name
|
1735
1749
|
end
|
1736
1750
|
|
1737
|
-
def
|
1751
|
+
def test_should_not_redefine_attribute_reader
|
1738
1752
|
assert_equal 'parked', @object.state
|
1739
1753
|
end
|
1740
1754
|
|
@@ -1975,8 +1989,9 @@ end
|
|
1975
1989
|
class MachineWithCustomInitializeTest < Test::Unit::TestCase
|
1976
1990
|
def setup
|
1977
1991
|
@klass = Class.new do
|
1978
|
-
def initialize
|
1979
|
-
|
1992
|
+
def initialize(state = nil, options = {})
|
1993
|
+
@state = state
|
1994
|
+
initialize_state_machines(options)
|
1980
1995
|
end
|
1981
1996
|
end
|
1982
1997
|
@machine = StateMachine::Machine.new(@klass, :initial => :parked)
|
@@ -1986,6 +2001,12 @@ class MachineWithCustomInitializeTest < Test::Unit::TestCase
|
|
1986
2001
|
def test_should_initialize_state
|
1987
2002
|
assert_equal 'parked', @object.state
|
1988
2003
|
end
|
2004
|
+
|
2005
|
+
def test_should_allow_custom_options
|
2006
|
+
@machine.state :idling
|
2007
|
+
@object = @klass.new('idling', :static => :force)
|
2008
|
+
assert_equal 'parked', @object.state
|
2009
|
+
end
|
1989
2010
|
end
|
1990
2011
|
|
1991
2012
|
class MachinePersistenceTest < Test::Unit::TestCase
|
@@ -2389,7 +2410,7 @@ class MachineWithEventMatchersTest < Test::Unit::TestCase
|
|
2389
2410
|
end
|
2390
2411
|
|
2391
2412
|
def test_should_track_referenced_events
|
2392
|
-
|
2413
|
+
@machine.event(StateMachine::BlacklistMatcher.new([:park]))
|
2393
2414
|
assert_equal [:park], @machine.events.map {|event| event.name}
|
2394
2415
|
end
|
2395
2416
|
|
@@ -2484,11 +2505,6 @@ class MachineWithTransitionsTest < Test::Unit::TestCase
|
|
2484
2505
|
assert_equal 'Must specify :on event', exception.message
|
2485
2506
|
end
|
2486
2507
|
|
2487
|
-
def test_should_not_allow_except_to_option
|
2488
|
-
exception = assert_raise(ArgumentError) {@machine.transition(:except_to => :parked, :on => :ignite)}
|
2489
|
-
assert_equal 'Invalid key(s): except_to', exception.message
|
2490
|
-
end
|
2491
|
-
|
2492
2508
|
def test_should_not_allow_except_on_option
|
2493
2509
|
exception = assert_raise(ArgumentError) {@machine.transition(:except_on => :ignite, :on => :ignite)}
|
2494
2510
|
assert_equal 'Invalid key(s): except_on', exception.message
|
@@ -2506,6 +2522,10 @@ class MachineWithTransitionsTest < Test::Unit::TestCase
|
|
2506
2522
|
assert_nothing_raised {@machine.transition(:except_from => :idling, :on => :ignite)}
|
2507
2523
|
end
|
2508
2524
|
|
2525
|
+
def test_should_allow_except_to_option
|
2526
|
+
assert_nothing_raised {@machine.transition(:except_to => :parked, :on => :ignite)}
|
2527
|
+
end
|
2528
|
+
|
2509
2529
|
def test_should_allow_implicit_options
|
2510
2530
|
branch = @machine.transition(:first_gear => :second_gear, :on => :shift_up)
|
2511
2531
|
assert_instance_of StateMachine::Branch, branch
|
@@ -2551,6 +2571,13 @@ class MachineWithTransitionsTest < Test::Unit::TestCase
|
|
2551
2571
|
assert_equal 2, branches.length
|
2552
2572
|
assert_equal [:ignite, :shift_up], @machine.events.map {|event| event.name}
|
2553
2573
|
end
|
2574
|
+
|
2575
|
+
def test_should_not_modify_options
|
2576
|
+
options = {:parked => :idling, :on => :ignite}
|
2577
|
+
@machine.transition(options)
|
2578
|
+
|
2579
|
+
assert_equal options, {:parked => :idling, :on => :ignite}
|
2580
|
+
end
|
2554
2581
|
end
|
2555
2582
|
|
2556
2583
|
class MachineWithTransitionCallbacksTest < Test::Unit::TestCase
|
@@ -3157,7 +3184,7 @@ class MachineFinderWithExistingMachineOnSuperclassTest < Test::Unit::TestCase
|
|
3157
3184
|
end
|
3158
3185
|
|
3159
3186
|
def test_should_use_the_same_integration
|
3160
|
-
assert
|
3187
|
+
assert((class << @machine; ancestors; end).include?(StateMachine::Integrations::Custom))
|
3161
3188
|
end
|
3162
3189
|
|
3163
3190
|
def teardown
|
@@ -3188,7 +3215,7 @@ begin
|
|
3188
3215
|
class MachineDrawingTest < Test::Unit::TestCase
|
3189
3216
|
def setup
|
3190
3217
|
@klass = Class.new do
|
3191
|
-
def self.name;
|
3218
|
+
def self.name; @name ||= "Vehicle_#{rand(1000000)}"; end
|
3192
3219
|
end
|
3193
3220
|
@machine = StateMachine::Machine.new(@klass, :initial => :parked)
|
3194
3221
|
@machine.event :ignite do
|
@@ -3201,23 +3228,27 @@ begin
|
|
3201
3228
|
end
|
3202
3229
|
|
3203
3230
|
def test_should_save_file_with_class_name_by_default
|
3204
|
-
|
3205
|
-
assert File.exists?(
|
3231
|
+
@machine.draw
|
3232
|
+
assert File.exists?("./#{@klass.name}_state.png")
|
3206
3233
|
end
|
3207
3234
|
|
3208
3235
|
def test_should_allow_base_name_to_be_customized
|
3209
|
-
|
3210
|
-
|
3236
|
+
name = "machine_#{rand(1000000)}"
|
3237
|
+
@machine.draw(:name => name)
|
3238
|
+
@path = "./#{name}.png"
|
3239
|
+
assert File.exists?(@path)
|
3211
3240
|
end
|
3212
3241
|
|
3213
3242
|
def test_should_allow_format_to_be_customized
|
3214
|
-
|
3215
|
-
|
3243
|
+
@machine.draw(:format => 'jpg')
|
3244
|
+
@path = "./#{@klass.name}_state.jpg"
|
3245
|
+
assert File.exists?(@path)
|
3216
3246
|
end
|
3217
3247
|
|
3218
3248
|
def test_should_allow_path_to_be_customized
|
3219
|
-
|
3220
|
-
|
3249
|
+
@machine.draw(:path => "#{File.dirname(__FILE__)}/")
|
3250
|
+
@path = "#{File.dirname(__FILE__)}/#{@klass.name}_state.png"
|
3251
|
+
assert File.exists?(@path)
|
3221
3252
|
end
|
3222
3253
|
|
3223
3254
|
def test_should_allow_orientation_to_be_landscape
|
@@ -3230,15 +3261,30 @@ begin
|
|
3230
3261
|
assert_equal 'TB', graph['rankdir'].to_s.gsub('"', '')
|
3231
3262
|
end
|
3232
3263
|
|
3264
|
+
if Constants::RGV_VERSION != '0.9.0'
|
3265
|
+
def test_should_allow_human_names_to_be_displayed
|
3266
|
+
@machine.event :ignite, :human_name => 'Ignite'
|
3267
|
+
@machine.state :parked, :human_name => 'Parked'
|
3268
|
+
@machine.state :idling, :human_name => 'Idling'
|
3269
|
+
graph = @machine.draw(:human_names => true)
|
3270
|
+
|
3271
|
+
parked_node = graph.get_node('parked')
|
3272
|
+
assert_equal 'Parked', parked_node['label'].to_s.gsub('"', '')
|
3273
|
+
|
3274
|
+
idling_node = graph.get_node('idling')
|
3275
|
+
assert_equal 'Idling', idling_node['label'].to_s.gsub('"', '')
|
3276
|
+
end
|
3277
|
+
end
|
3278
|
+
|
3233
3279
|
def teardown
|
3234
|
-
FileUtils.rm Dir["{
|
3280
|
+
FileUtils.rm Dir[@path || "./#{@klass.name}_state.png"]
|
3235
3281
|
end
|
3236
3282
|
end
|
3237
3283
|
|
3238
3284
|
class MachineDrawingWithIntegerStatesTest < Test::Unit::TestCase
|
3239
3285
|
def setup
|
3240
3286
|
@klass = Class.new do
|
3241
|
-
def self.name;
|
3287
|
+
def self.name; @name ||= "Vehicle_#{rand(1000000)}"; end
|
3242
3288
|
end
|
3243
3289
|
@machine = StateMachine::Machine.new(@klass, :state_id, :initial => :parked)
|
3244
3290
|
@machine.event :ignite do
|
@@ -3258,16 +3304,18 @@ begin
|
|
3258
3304
|
end
|
3259
3305
|
|
3260
3306
|
def test_should_draw_machine
|
3261
|
-
assert File.exist?(
|
3262
|
-
|
3263
|
-
|
3307
|
+
assert File.exist?("./#{@klass.name}_state_id.png")
|
3308
|
+
end
|
3309
|
+
|
3310
|
+
def teardown
|
3311
|
+
FileUtils.rm Dir["./#{@klass.name}_state_id.png"]
|
3264
3312
|
end
|
3265
3313
|
end
|
3266
3314
|
|
3267
3315
|
class MachineDrawingWithNilStatesTest < Test::Unit::TestCase
|
3268
3316
|
def setup
|
3269
3317
|
@klass = Class.new do
|
3270
|
-
def self.name;
|
3318
|
+
def self.name; @name ||= "Vehicle_#{rand(1000000)}"; end
|
3271
3319
|
end
|
3272
3320
|
@machine = StateMachine::Machine.new(@klass, :initial => :parked)
|
3273
3321
|
@machine.event :ignite do
|
@@ -3286,16 +3334,18 @@ begin
|
|
3286
3334
|
end
|
3287
3335
|
|
3288
3336
|
def test_should_draw_machine
|
3289
|
-
assert File.exist?(
|
3290
|
-
|
3291
|
-
|
3337
|
+
assert File.exist?("./#{@klass.name}_state.png")
|
3338
|
+
end
|
3339
|
+
|
3340
|
+
def teardown
|
3341
|
+
FileUtils.rm Dir["./#{@klass.name}_state.png"]
|
3292
3342
|
end
|
3293
3343
|
end
|
3294
3344
|
|
3295
3345
|
class MachineDrawingWithDynamicStatesTest < Test::Unit::TestCase
|
3296
3346
|
def setup
|
3297
3347
|
@klass = Class.new do
|
3298
|
-
def self.name;
|
3348
|
+
def self.name; @name ||= "Vehicle_#{rand(1000000)}"; end
|
3299
3349
|
end
|
3300
3350
|
@machine = StateMachine::Machine.new(@klass, :initial => :parked)
|
3301
3351
|
@machine.event :activate do
|
@@ -3314,16 +3364,18 @@ begin
|
|
3314
3364
|
end
|
3315
3365
|
|
3316
3366
|
def test_should_draw_machine
|
3317
|
-
assert File.exist?(
|
3318
|
-
|
3319
|
-
|
3367
|
+
assert File.exist?("./#{@klass.name}_state.png")
|
3368
|
+
end
|
3369
|
+
|
3370
|
+
def teardown
|
3371
|
+
FileUtils.rm Dir["./#{@klass.name}_state.png"]
|
3320
3372
|
end
|
3321
3373
|
end
|
3322
3374
|
|
3323
3375
|
class MachineClassDrawingTest < Test::Unit::TestCase
|
3324
3376
|
def setup
|
3325
3377
|
@klass = Class.new do
|
3326
|
-
def self.name;
|
3378
|
+
def self.name; @name ||= "Vehicle_#{rand(1000000)}"; end
|
3327
3379
|
end
|
3328
3380
|
@machine = StateMachine::Machine.new(@klass)
|
3329
3381
|
@machine.event :ignite do
|
@@ -3339,17 +3391,17 @@ begin
|
|
3339
3391
|
def test_should_load_files
|
3340
3392
|
StateMachine::Machine.draw('Switch', :file => File.expand_path("#{File.dirname(__FILE__)}/../files/switch.rb"))
|
3341
3393
|
assert defined?(::Switch)
|
3342
|
-
ensure
|
3343
|
-
FileUtils.rm('./Switch_state.png')
|
3344
3394
|
end
|
3345
3395
|
|
3346
3396
|
def test_should_allow_path_and_format_to_be_customized
|
3347
3397
|
StateMachine::Machine.draw('Switch', :file => File.expand_path("#{File.dirname(__FILE__)}/../files/switch.rb"), :path => "#{File.dirname(__FILE__)}/", :format => 'jpg')
|
3348
|
-
assert File.exist?("#{File.dirname(__FILE__)}
|
3349
|
-
|
3350
|
-
|
3398
|
+
assert File.exist?("#{File.dirname(__FILE__)}/#{Switch.name}_state.jpg")
|
3399
|
+
end
|
3400
|
+
|
3401
|
+
def teardown
|
3402
|
+
FileUtils.rm Dir["{.,#{File.dirname(__FILE__)}}/#{Switch.name}_state.{jpg,png}"]
|
3351
3403
|
end
|
3352
3404
|
end
|
3353
3405
|
rescue LoadError
|
3354
|
-
$stderr.puts 'Skipping GraphViz StateMachine::Machine tests. `gem install ruby-graphviz` >= v0.9.
|
3406
|
+
$stderr.puts 'Skipping GraphViz StateMachine::Machine tests. `gem install ruby-graphviz` >= v0.9.17 and try again.'
|
3355
3407
|
end unless ENV['TRAVIS']
|