state_machine 1.0.1 → 1.0.2
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 +11 -0
- data/.travis.yml +16 -0
- data/.yardopts +5 -0
- data/Appraisals +260 -0
- data/CHANGELOG.rdoc +15 -0
- data/Gemfile +3 -0
- data/README.rdoc +156 -29
- data/Rakefile +31 -57
- data/gemfiles/active_model-3.0.0.gemfile +7 -0
- data/gemfiles/active_model-3.0.0.gemfile.lock +32 -0
- data/gemfiles/active_model-3.0.5.gemfile +7 -0
- data/gemfiles/active_model-3.0.5.gemfile.lock +32 -0
- data/gemfiles/active_record-2.0.0.gemfile +8 -0
- data/gemfiles/active_record-2.0.0.gemfile.lock +30 -0
- data/gemfiles/active_record-2.0.5.gemfile +8 -0
- data/gemfiles/active_record-2.0.5.gemfile.lock +30 -0
- data/gemfiles/active_record-2.1.0.gemfile +8 -0
- data/gemfiles/active_record-2.1.0.gemfile.lock +30 -0
- data/gemfiles/active_record-2.1.2.gemfile +8 -0
- data/gemfiles/active_record-2.1.2.gemfile.lock +30 -0
- data/gemfiles/active_record-2.2.3.gemfile +8 -0
- data/gemfiles/active_record-2.2.3.gemfile.lock +30 -0
- data/gemfiles/active_record-2.3.12.gemfile +8 -0
- data/gemfiles/active_record-2.3.12.gemfile.lock +30 -0
- data/gemfiles/active_record-3.0.0.gemfile +8 -0
- data/gemfiles/active_record-3.0.0.gemfile.lock +44 -0
- data/gemfiles/active_record-3.0.5.gemfile +8 -0
- data/gemfiles/active_record-3.0.5.gemfile.lock +43 -0
- data/gemfiles/data_mapper-0.10.2.gemfile +12 -0
- data/gemfiles/data_mapper-0.10.2.gemfile.lock +45 -0
- data/gemfiles/data_mapper-0.9.11.gemfile +12 -0
- data/gemfiles/data_mapper-0.9.11.gemfile.lock +47 -0
- data/gemfiles/data_mapper-0.9.4.gemfile +12 -0
- data/gemfiles/data_mapper-0.9.4.gemfile.lock +61 -0
- data/gemfiles/data_mapper-0.9.7.gemfile +12 -0
- data/gemfiles/data_mapper-0.9.7.gemfile.lock +57 -0
- data/gemfiles/data_mapper-1.0.0.gemfile +12 -0
- data/gemfiles/data_mapper-1.0.0.gemfile.lock +53 -0
- data/gemfiles/data_mapper-1.0.1.gemfile +12 -0
- data/gemfiles/data_mapper-1.0.1.gemfile.lock +53 -0
- data/gemfiles/data_mapper-1.0.2.gemfile +12 -0
- data/gemfiles/data_mapper-1.0.2.gemfile.lock +53 -0
- data/gemfiles/data_mapper-1.1.0.gemfile +12 -0
- data/gemfiles/data_mapper-1.1.0.gemfile.lock +51 -0
- data/gemfiles/default.gemfile +7 -0
- data/gemfiles/default.gemfile.lock +24 -0
- data/gemfiles/mongo_mapper-0.5.5.gemfile +8 -0
- data/gemfiles/mongo_mapper-0.5.5.gemfile.lock +33 -0
- data/gemfiles/mongo_mapper-0.5.8.gemfile +8 -0
- data/gemfiles/mongo_mapper-0.5.8.gemfile.lock +33 -0
- data/gemfiles/mongo_mapper-0.6.0.gemfile +8 -0
- data/gemfiles/mongo_mapper-0.6.0.gemfile.lock +33 -0
- data/gemfiles/mongo_mapper-0.6.10.gemfile +8 -0
- data/gemfiles/mongo_mapper-0.6.10.gemfile.lock +33 -0
- data/gemfiles/mongo_mapper-0.7.0.gemfile +8 -0
- data/gemfiles/mongo_mapper-0.7.0.gemfile.lock +33 -0
- data/gemfiles/mongo_mapper-0.7.5.gemfile +8 -0
- data/gemfiles/mongo_mapper-0.7.5.gemfile.lock +36 -0
- data/gemfiles/mongo_mapper-0.8.0.gemfile +10 -0
- data/gemfiles/mongo_mapper-0.8.0.gemfile.lock +40 -0
- data/gemfiles/mongo_mapper-0.8.3.gemfile +10 -0
- data/gemfiles/mongo_mapper-0.8.3.gemfile.lock +40 -0
- data/gemfiles/mongo_mapper-0.8.4.gemfile +8 -0
- data/gemfiles/mongo_mapper-0.8.4.gemfile.lock +38 -0
- data/gemfiles/mongo_mapper-0.8.6.gemfile +8 -0
- data/gemfiles/mongo_mapper-0.8.6.gemfile.lock +38 -0
- data/gemfiles/mongo_mapper-0.9.0.gemfile +7 -0
- data/gemfiles/mongo_mapper-0.9.0.gemfile.lock +41 -0
- data/gemfiles/mongoid-2.0.0.gemfile +7 -0
- data/gemfiles/mongoid-2.0.0.gemfile.lock +42 -0
- data/gemfiles/mongoid-2.1.4.gemfile +7 -0
- data/gemfiles/mongoid-2.1.4.gemfile.lock +40 -0
- data/gemfiles/sequel-2.11.0.gemfile +8 -0
- data/gemfiles/sequel-2.11.0.gemfile.lock +28 -0
- data/gemfiles/sequel-2.12.0.gemfile +8 -0
- data/gemfiles/sequel-2.12.0.gemfile.lock +28 -0
- data/gemfiles/sequel-2.8.0.gemfile +8 -0
- data/gemfiles/sequel-2.8.0.gemfile.lock +28 -0
- data/gemfiles/sequel-3.0.0.gemfile +8 -0
- data/gemfiles/sequel-3.0.0.gemfile.lock +28 -0
- data/gemfiles/sequel-3.13.0.gemfile +8 -0
- data/gemfiles/sequel-3.13.0.gemfile.lock +28 -0
- data/gemfiles/sequel-3.14.0.gemfile +8 -0
- data/gemfiles/sequel-3.14.0.gemfile.lock +28 -0
- data/gemfiles/sequel-3.23.0.gemfile +8 -0
- data/gemfiles/sequel-3.23.0.gemfile.lock +28 -0
- data/gemfiles/sequel-3.24.0.gemfile +8 -0
- data/gemfiles/sequel-3.24.0.gemfile.lock +28 -0
- data/lib/state_machine/event.rb +13 -90
- data/lib/state_machine/helper_module.rb +17 -0
- data/lib/state_machine/integrations/active_model.rb +35 -0
- data/lib/state_machine/integrations/active_record.rb +41 -2
- data/lib/state_machine/integrations/data_mapper.rb +17 -2
- data/lib/state_machine/integrations/mongo_mapper.rb +34 -7
- data/lib/state_machine/integrations/mongoid.rb +34 -26
- data/lib/state_machine/integrations/mongoid/versions.rb +29 -3
- data/lib/state_machine/integrations/sequel.rb +22 -72
- data/lib/state_machine/integrations/sequel/versions.rb +87 -6
- data/lib/state_machine/machine.rb +279 -19
- data/lib/state_machine/state.rb +2 -2
- data/lib/state_machine/state_context.rb +133 -0
- data/lib/state_machine/version.rb +3 -0
- data/state_machine.gemspec +22 -0
- data/test/test_helper.rb +1 -3
- data/test/unit/branch_test.rb +1 -3
- data/test/unit/event_collection_test.rb +3 -3
- data/test/unit/event_test.rb +1 -3
- data/test/unit/helper_module_test.rb +17 -0
- data/test/unit/integrations/active_model_test.rb +0 -4
- data/test/unit/integrations/active_record_test.rb +50 -9
- data/test/unit/integrations/data_mapper_test.rb +267 -253
- data/test/unit/integrations/mongo_mapper_test.rb +47 -15
- data/test/unit/integrations/mongoid_test.rb +50 -8
- data/test/unit/integrations/sequel_test.rb +10 -6
- data/test/unit/machine_test.rb +206 -25
- data/test/unit/state_context_test.rb +421 -0
- data/test/unit/state_test.rb +20 -3
- metadata +303 -128
- data/lib/state_machine/condition_proxy.rb +0 -94
- data/test/unit/condition_proxy_test.rb +0 -328
|
@@ -1,19 +1,5 @@
|
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/../../test_helper')
|
|
2
2
|
|
|
3
|
-
# Load library
|
|
4
|
-
require 'rubygems'
|
|
5
|
-
|
|
6
|
-
if ENV['VERSION']
|
|
7
|
-
if Gem::Version.new(ENV['VERSION']) >= Gem::Version.new('0.9.0')
|
|
8
|
-
gem 'activesupport', '~>3.0'
|
|
9
|
-
require 'active_support'
|
|
10
|
-
elsif Gem::Version.new(ENV['VERSION']) <= Gem::Version.new('0.7.0') || !Gem.available?('>=0.7.0')
|
|
11
|
-
gem 'activesupport', '~>2.3'
|
|
12
|
-
require 'active_support'
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
gem 'mongo_mapper', ENV['VERSION'] ? "=#{ENV['VERSION']}" : '>=0.5.5'
|
|
17
3
|
require 'mongo_mapper'
|
|
18
4
|
|
|
19
5
|
# Establish database connection
|
|
@@ -297,6 +283,33 @@ module MongoMapperTest
|
|
|
297
283
|
end
|
|
298
284
|
end
|
|
299
285
|
|
|
286
|
+
class MachineWithConflictingStateNameTest < BaseTestCase
|
|
287
|
+
def setup
|
|
288
|
+
require 'stringio'
|
|
289
|
+
@original_stderr, $stderr = $stderr, StringIO.new
|
|
290
|
+
|
|
291
|
+
@model = new_model
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
def test_should_output_warning_with_same_machine_name
|
|
295
|
+
@machine = StateMachine::Machine.new(@model)
|
|
296
|
+
@machine.state :state
|
|
297
|
+
|
|
298
|
+
assert_match /^Instance method "state\?" is already defined in .*, use generic helper instead\.\n$/, $stderr.string
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
def test_should_output_warning_with_same_machine_attribute
|
|
302
|
+
@machine = StateMachine::Machine.new(@model, :public_state, :attribute => :state)
|
|
303
|
+
@machine.state :state
|
|
304
|
+
|
|
305
|
+
assert_match /^Instance method "state\?" is already defined in .*, use generic helper instead\.\n$/, $stderr.string
|
|
306
|
+
end
|
|
307
|
+
|
|
308
|
+
def teardown
|
|
309
|
+
$stderr = @original_stderr
|
|
310
|
+
end
|
|
311
|
+
end
|
|
312
|
+
|
|
300
313
|
class MachineWithColumnStateAttributeTest < BaseTestCase
|
|
301
314
|
def setup
|
|
302
315
|
@model = new_model
|
|
@@ -421,6 +434,25 @@ module MongoMapperTest
|
|
|
421
434
|
end
|
|
422
435
|
end
|
|
423
436
|
|
|
437
|
+
class MachineWithCustomAttributeTest < BaseTestCase
|
|
438
|
+
def setup
|
|
439
|
+
require 'stringio'
|
|
440
|
+
@original_stderr, $stderr = $stderr, StringIO.new
|
|
441
|
+
|
|
442
|
+
@model = new_model
|
|
443
|
+
@machine = StateMachine::Machine.new(@model, :public_state, :attribute => :state)
|
|
444
|
+
@record = @model.new
|
|
445
|
+
end
|
|
446
|
+
|
|
447
|
+
def test_should_not_delegate_attribute_predicate_with_different_attribute
|
|
448
|
+
assert_raise(ArgumentError) { @record.public_state? }
|
|
449
|
+
end
|
|
450
|
+
|
|
451
|
+
def teardown
|
|
452
|
+
$stderr = @original_stderr
|
|
453
|
+
end
|
|
454
|
+
end
|
|
455
|
+
|
|
424
456
|
class MachineWithInitializedStateTest < BaseTestCase
|
|
425
457
|
def setup
|
|
426
458
|
@model = new_model
|
|
@@ -1606,6 +1638,6 @@ module MongoMapperTest
|
|
|
1606
1638
|
end
|
|
1607
1639
|
end
|
|
1608
1640
|
else
|
|
1609
|
-
$stderr.puts 'Skipping MongoMapper I18n tests.
|
|
1641
|
+
$stderr.puts 'Skipping MongoMapper I18n tests.'
|
|
1610
1642
|
end
|
|
1611
1643
|
end
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/../../test_helper')
|
|
2
2
|
|
|
3
|
-
# Load library
|
|
4
|
-
require 'rubygems'
|
|
5
|
-
|
|
6
|
-
gem 'mongoid', ENV['VERSION'] ? "=#{ENV['VERSION']}" : '>=2.0.0'
|
|
7
3
|
require 'mongoid'
|
|
8
4
|
|
|
9
5
|
# Establish database connection
|
|
@@ -273,6 +269,33 @@ module MongoidTest
|
|
|
273
269
|
end
|
|
274
270
|
end
|
|
275
271
|
|
|
272
|
+
class MachineWithConflictingStateNameTest < BaseTestCase
|
|
273
|
+
def setup
|
|
274
|
+
require 'stringio'
|
|
275
|
+
@original_stderr, $stderr = $stderr, StringIO.new
|
|
276
|
+
|
|
277
|
+
@model = new_model
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
def test_should_output_warning_with_same_machine_name
|
|
281
|
+
@machine = StateMachine::Machine.new(@model)
|
|
282
|
+
@machine.state :state
|
|
283
|
+
|
|
284
|
+
assert_match /^Instance method "state\?" is already defined in .*, use generic helper instead\.\n$/, $stderr.string
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
def test_should_output_warning_with_same_machine_attribute
|
|
288
|
+
@machine = StateMachine::Machine.new(@model, :public_state, :attribute => :state)
|
|
289
|
+
@machine.state :state
|
|
290
|
+
|
|
291
|
+
assert_match /^Instance method "state\?" is already defined in .*, use generic helper instead\.\n$/, $stderr.string
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
def teardown
|
|
295
|
+
$stderr = @original_stderr
|
|
296
|
+
end
|
|
297
|
+
end
|
|
298
|
+
|
|
276
299
|
class MachineWithColumnStateAttributeTest < BaseTestCase
|
|
277
300
|
def setup
|
|
278
301
|
@model = new_model
|
|
@@ -403,6 +426,25 @@ module MongoidTest
|
|
|
403
426
|
end
|
|
404
427
|
end
|
|
405
428
|
|
|
429
|
+
class MachineWithCustomAttributeTest < BaseTestCase
|
|
430
|
+
def setup
|
|
431
|
+
require 'stringio'
|
|
432
|
+
@original_stderr, $stderr = $stderr, StringIO.new
|
|
433
|
+
|
|
434
|
+
@model = new_model
|
|
435
|
+
@machine = StateMachine::Machine.new(@model, :public_state, :attribute => :state)
|
|
436
|
+
@record = @model.new
|
|
437
|
+
end
|
|
438
|
+
|
|
439
|
+
def test_should_not_delegate_attribute_predicate_with_different_attribute
|
|
440
|
+
assert_raise(ArgumentError) { @record.public_state? }
|
|
441
|
+
end
|
|
442
|
+
|
|
443
|
+
def teardown
|
|
444
|
+
$stderr = @original_stderr
|
|
445
|
+
end
|
|
446
|
+
end
|
|
447
|
+
|
|
406
448
|
class MachineWithInitializedStateTest < BaseTestCase
|
|
407
449
|
def setup
|
|
408
450
|
@model = new_model
|
|
@@ -538,7 +580,7 @@ module MongoidTest
|
|
|
538
580
|
end
|
|
539
581
|
|
|
540
582
|
def test_should_track_attribute_changes
|
|
541
|
-
assert_equal %w(parked parked), @record.
|
|
583
|
+
assert_equal %w(parked parked), @record.send(:attribute_change, 'state')
|
|
542
584
|
end
|
|
543
585
|
end
|
|
544
586
|
|
|
@@ -592,7 +634,7 @@ module MongoidTest
|
|
|
592
634
|
end
|
|
593
635
|
|
|
594
636
|
def test_should_track_attribute_changes
|
|
595
|
-
assert_equal %w(parked parked), @record.
|
|
637
|
+
assert_equal %w(parked parked), @record.send(:attribute_change, 'status')
|
|
596
638
|
end
|
|
597
639
|
end
|
|
598
640
|
|
|
@@ -611,12 +653,12 @@ module MongoidTest
|
|
|
611
653
|
end
|
|
612
654
|
|
|
613
655
|
def test_should_track_attribute_change
|
|
614
|
-
assert_equal %w(parked parked), @record.
|
|
656
|
+
assert_equal %w(parked parked), @record.send(:attribute_change, 'state')
|
|
615
657
|
end
|
|
616
658
|
|
|
617
659
|
def test_should_not_reset_changes_on_multiple_changes
|
|
618
660
|
@record.state_event = 'ignite'
|
|
619
|
-
assert_equal %w(parked parked), @record.
|
|
661
|
+
assert_equal %w(parked parked), @record.send(:attribute_change, 'state')
|
|
620
662
|
end
|
|
621
663
|
|
|
622
664
|
def test_should_not_include_state_in_changed_attributes_if_nil
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
require File.expand_path(File.dirname(__FILE__) + '/../../test_helper')
|
|
2
2
|
|
|
3
|
-
# Load library
|
|
4
|
-
require 'rubygems'
|
|
5
|
-
|
|
6
|
-
gem 'sequel', ENV['VERSION'] ? "=#{ENV['VERSION']}" : '>=2.8.0'
|
|
7
3
|
require 'sequel'
|
|
8
4
|
require 'logger'
|
|
9
5
|
|
|
@@ -19,12 +15,20 @@ module SequelTest
|
|
|
19
15
|
# Creates a new Sequel model (and the associated table)
|
|
20
16
|
def new_model(create_table = :foo, &block)
|
|
21
17
|
table_name = create_table || :foo
|
|
18
|
+
table_identifier = ::Sequel::SQL::Identifier.new(table_name)
|
|
19
|
+
|
|
20
|
+
if !defined?(Sequel::VERSION) || Gem::Version.new(::Sequel::VERSION) <= Gem::Version.new('3.26.0')
|
|
21
|
+
class << table_identifier
|
|
22
|
+
alias_method :original_to_s, :to_s
|
|
23
|
+
def to_s(*args); args.empty? ? inspect : original_to_s(*args); end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
22
26
|
|
|
23
|
-
DB.create_table!(
|
|
27
|
+
DB.create_table!(table_identifier) do
|
|
24
28
|
primary_key :id
|
|
25
29
|
column :state, :string
|
|
26
30
|
end if create_table
|
|
27
|
-
model = Class.new(Sequel::Model(DB[
|
|
31
|
+
model = Class.new(Sequel::Model(DB[table_identifier])) do
|
|
28
32
|
self.raise_on_save_failure = false
|
|
29
33
|
(class << self; self; end).class_eval do
|
|
30
34
|
define_method(:name) { "SequelTest::#{table_name.to_s.capitalize}" }
|
data/test/unit/machine_test.rb
CHANGED
|
@@ -1068,7 +1068,7 @@ class MachineWithHelpersTest < Test::Unit::TestCase
|
|
|
1068
1068
|
end
|
|
1069
1069
|
|
|
1070
1070
|
def test_should_throw_exception_with_invalid_scope
|
|
1071
|
-
assert_raise(RUBY_VERSION < '1.9' ? IndexError : KeyError) { @machine.define_helper(:invalid, :
|
|
1071
|
+
assert_raise(RUBY_VERSION < '1.9' ? IndexError : KeyError) { @machine.define_helper(:invalid, :park) {} }
|
|
1072
1072
|
end
|
|
1073
1073
|
end
|
|
1074
1074
|
|
|
@@ -1081,37 +1081,37 @@ class MachineWithInstanceHelpersTest < Test::Unit::TestCase
|
|
|
1081
1081
|
|
|
1082
1082
|
def test_should_not_redefine_existing_public_methods
|
|
1083
1083
|
@klass.class_eval do
|
|
1084
|
-
def
|
|
1085
|
-
|
|
1084
|
+
def park
|
|
1085
|
+
true
|
|
1086
1086
|
end
|
|
1087
1087
|
end
|
|
1088
1088
|
|
|
1089
|
-
@machine.define_helper(:instance, :
|
|
1090
|
-
assert_equal
|
|
1089
|
+
@machine.define_helper(:instance, :park) {}
|
|
1090
|
+
assert_equal true, @object.park
|
|
1091
1091
|
end
|
|
1092
1092
|
|
|
1093
1093
|
def test_should_not_redefine_existing_protected_methods
|
|
1094
1094
|
@klass.class_eval do
|
|
1095
1095
|
protected
|
|
1096
|
-
def
|
|
1097
|
-
|
|
1096
|
+
def park
|
|
1097
|
+
true
|
|
1098
1098
|
end
|
|
1099
1099
|
end
|
|
1100
1100
|
|
|
1101
|
-
@machine.define_helper(:instance, :
|
|
1102
|
-
assert_equal
|
|
1101
|
+
@machine.define_helper(:instance, :park) {}
|
|
1102
|
+
assert_equal true, @object.send(:park)
|
|
1103
1103
|
end
|
|
1104
1104
|
|
|
1105
1105
|
def test_should_not_redefine_existing_private_methods
|
|
1106
1106
|
@klass.class_eval do
|
|
1107
1107
|
private
|
|
1108
|
-
def
|
|
1109
|
-
|
|
1108
|
+
def park
|
|
1109
|
+
true
|
|
1110
1110
|
end
|
|
1111
1111
|
end
|
|
1112
1112
|
|
|
1113
|
-
@machine.define_helper(:instance, :
|
|
1114
|
-
assert_equal
|
|
1113
|
+
@machine.define_helper(:instance, :park) {}
|
|
1114
|
+
assert_equal true, @object.send(:park)
|
|
1115
1115
|
end
|
|
1116
1116
|
|
|
1117
1117
|
def test_should_warn_if_defined_in_superclass
|
|
@@ -1213,33 +1213,45 @@ class MachineWithInstanceHelpersTest < Test::Unit::TestCase
|
|
|
1213
1213
|
end
|
|
1214
1214
|
|
|
1215
1215
|
def test_should_define_nonexistent_methods
|
|
1216
|
-
@machine.define_helper(:instance, :
|
|
1217
|
-
assert_equal
|
|
1216
|
+
@machine.define_helper(:instance, :park) {false}
|
|
1217
|
+
assert_equal false, @object.park
|
|
1218
|
+
end
|
|
1219
|
+
|
|
1220
|
+
def test_should_warn_if_defined_multiple_times
|
|
1221
|
+
require 'stringio'
|
|
1222
|
+
@original_stderr, $stderr = $stderr, StringIO.new
|
|
1223
|
+
|
|
1224
|
+
@machine.define_helper(:instance, :park) {}
|
|
1225
|
+
@machine.define_helper(:instance, :park) {}
|
|
1226
|
+
|
|
1227
|
+
assert_equal "Instance method \"park\" is already defined in #{@klass} :state instance helpers, use generic helper instead.\n", $stderr.string
|
|
1228
|
+
ensure
|
|
1229
|
+
$stderr = @original_stderr
|
|
1218
1230
|
end
|
|
1219
1231
|
|
|
1220
1232
|
def test_should_pass_context_as_arguments
|
|
1221
1233
|
helper_args = nil
|
|
1222
|
-
@machine.define_helper(:instance, :
|
|
1223
|
-
@object.
|
|
1234
|
+
@machine.define_helper(:instance, :park) {|*args| helper_args = args}
|
|
1235
|
+
@object.park
|
|
1224
1236
|
assert_equal 2, helper_args.length
|
|
1225
1237
|
assert_equal [@machine, @object], helper_args
|
|
1226
1238
|
end
|
|
1227
1239
|
|
|
1228
1240
|
def test_should_pass_method_arguments_through
|
|
1229
1241
|
helper_args = nil
|
|
1230
|
-
@machine.define_helper(:instance, :
|
|
1231
|
-
@object.
|
|
1242
|
+
@machine.define_helper(:instance, :park) {|*args| helper_args = args}
|
|
1243
|
+
@object.park(1, 2, 3)
|
|
1232
1244
|
assert_equal 5, helper_args.length
|
|
1233
1245
|
assert_equal [@machine, @object, 1, 2, 3], helper_args
|
|
1234
1246
|
end
|
|
1235
1247
|
|
|
1236
1248
|
def test_should_allow_string_evaluation
|
|
1237
1249
|
@machine.define_helper :instance, <<-end_eval, __FILE__, __LINE__ + 1
|
|
1238
|
-
def
|
|
1239
|
-
|
|
1250
|
+
def park
|
|
1251
|
+
false
|
|
1240
1252
|
end
|
|
1241
1253
|
end_eval
|
|
1242
|
-
assert_equal
|
|
1254
|
+
assert_equal false, @object.park
|
|
1243
1255
|
end
|
|
1244
1256
|
end
|
|
1245
1257
|
|
|
@@ -1387,6 +1399,18 @@ class MachineWithClassHelpersTest < Test::Unit::TestCase
|
|
|
1387
1399
|
assert_equal [], @klass.states
|
|
1388
1400
|
end
|
|
1389
1401
|
|
|
1402
|
+
def test_should_warn_if_defined_multiple_times
|
|
1403
|
+
require 'stringio'
|
|
1404
|
+
@original_stderr, $stderr = $stderr, StringIO.new
|
|
1405
|
+
|
|
1406
|
+
@machine.define_helper(:class, :states) {}
|
|
1407
|
+
@machine.define_helper(:class, :states) {}
|
|
1408
|
+
|
|
1409
|
+
assert_equal "Class method \"states\" is already defined in #{@klass} :state class helpers, use generic helper instead.\n", $stderr.string
|
|
1410
|
+
ensure
|
|
1411
|
+
$stderr = @original_stderr
|
|
1412
|
+
end
|
|
1413
|
+
|
|
1390
1414
|
def test_should_pass_context_as_arguments
|
|
1391
1415
|
helper_args = nil
|
|
1392
1416
|
@machine.define_helper(:class, :states) {|*args| helper_args = args}
|
|
@@ -1808,6 +1832,40 @@ class MachineWithConflictingHelpersAfterDefinitionTest < Test::Unit::TestCase
|
|
|
1808
1832
|
end
|
|
1809
1833
|
end
|
|
1810
1834
|
|
|
1835
|
+
class MachineWithSuperclassConflictingHelpersAfterDefinitionTest < Test::Unit::TestCase
|
|
1836
|
+
def setup
|
|
1837
|
+
require 'stringio'
|
|
1838
|
+
@original_stderr, $stderr = $stderr, StringIO.new
|
|
1839
|
+
|
|
1840
|
+
@superclass = Class.new
|
|
1841
|
+
@klass = Class.new(@superclass)
|
|
1842
|
+
|
|
1843
|
+
@machine = StateMachine::Machine.new(@klass)
|
|
1844
|
+
@machine.state :parked, :idling
|
|
1845
|
+
@machine.event :ignite
|
|
1846
|
+
|
|
1847
|
+
@superclass.class_eval do
|
|
1848
|
+
def state?
|
|
1849
|
+
true
|
|
1850
|
+
end
|
|
1851
|
+
end
|
|
1852
|
+
|
|
1853
|
+
@object = @klass.new
|
|
1854
|
+
end
|
|
1855
|
+
|
|
1856
|
+
def test_should_call_superclass_attribute_predicate_without_arguments
|
|
1857
|
+
assert @object.state?
|
|
1858
|
+
end
|
|
1859
|
+
|
|
1860
|
+
def test_should_define_attribute_predicate_with_arguments
|
|
1861
|
+
assert !@object.state?(:parked)
|
|
1862
|
+
end
|
|
1863
|
+
|
|
1864
|
+
def teardown
|
|
1865
|
+
$stderr = @original_stderr
|
|
1866
|
+
end
|
|
1867
|
+
end
|
|
1868
|
+
|
|
1811
1869
|
class MachineWithoutInitializeTest < Test::Unit::TestCase
|
|
1812
1870
|
def setup
|
|
1813
1871
|
@klass = Class.new
|
|
@@ -2288,6 +2346,86 @@ class MachineWithMultipleEventsTest < Test::Unit::TestCase
|
|
|
2288
2346
|
end
|
|
2289
2347
|
end
|
|
2290
2348
|
|
|
2349
|
+
class MachineWithTransitionsTest < Test::Unit::TestCase
|
|
2350
|
+
def setup
|
|
2351
|
+
@klass = Class.new
|
|
2352
|
+
@machine = StateMachine::Machine.new(@klass, :initial => :parked)
|
|
2353
|
+
end
|
|
2354
|
+
|
|
2355
|
+
def test_should_require_on_event
|
|
2356
|
+
exception = assert_raise(ArgumentError) { @machine.transition(:parked => :idling) }
|
|
2357
|
+
assert_equal 'Must specify :on event', exception.message
|
|
2358
|
+
end
|
|
2359
|
+
|
|
2360
|
+
def test_should_not_allow_except_to_option
|
|
2361
|
+
exception = assert_raise(ArgumentError) {@machine.transition(:except_to => :parked, :on => :ignite)}
|
|
2362
|
+
assert_equal 'Invalid key(s): except_to', exception.message
|
|
2363
|
+
end
|
|
2364
|
+
|
|
2365
|
+
def test_should_not_allow_except_on_option
|
|
2366
|
+
exception = assert_raise(ArgumentError) {@machine.transition(:except_on => :ignite, :on => :ignite)}
|
|
2367
|
+
assert_equal 'Invalid key(s): except_on', exception.message
|
|
2368
|
+
end
|
|
2369
|
+
|
|
2370
|
+
def test_should_allow_transitioning_without_a_to_state
|
|
2371
|
+
assert_nothing_raised {@machine.transition(:from => :parked, :on => :ignite)}
|
|
2372
|
+
end
|
|
2373
|
+
|
|
2374
|
+
def test_should_allow_transitioning_without_a_from_state
|
|
2375
|
+
assert_nothing_raised {@machine.transition(:to => :idling, :on => :ignite)}
|
|
2376
|
+
end
|
|
2377
|
+
|
|
2378
|
+
def test_should_allow_except_from_option
|
|
2379
|
+
assert_nothing_raised {@machine.transition(:except_from => :idling, :on => :ignite)}
|
|
2380
|
+
end
|
|
2381
|
+
|
|
2382
|
+
def test_should_allow_implicit_options
|
|
2383
|
+
branch = @machine.transition(:first_gear => :second_gear, :on => :shift_up)
|
|
2384
|
+
assert_instance_of StateMachine::Branch, branch
|
|
2385
|
+
|
|
2386
|
+
state_requirements = branch.state_requirements
|
|
2387
|
+
assert_equal 1, state_requirements.length
|
|
2388
|
+
|
|
2389
|
+
assert_instance_of StateMachine::WhitelistMatcher, state_requirements[0][:from]
|
|
2390
|
+
assert_equal [:first_gear], state_requirements[0][:from].values
|
|
2391
|
+
assert_instance_of StateMachine::WhitelistMatcher, state_requirements[0][:to]
|
|
2392
|
+
assert_equal [:second_gear], state_requirements[0][:to].values
|
|
2393
|
+
assert_instance_of StateMachine::WhitelistMatcher, branch.event_requirement
|
|
2394
|
+
assert_equal [:shift_up], branch.event_requirement.values
|
|
2395
|
+
end
|
|
2396
|
+
|
|
2397
|
+
def test_should_allow_multiple_implicit_options
|
|
2398
|
+
branch = @machine.transition(:first_gear => :second_gear, :second_gear => :third_gear, :on => :shift_up)
|
|
2399
|
+
|
|
2400
|
+
state_requirements = branch.state_requirements
|
|
2401
|
+
assert_equal 2, state_requirements.length
|
|
2402
|
+
end
|
|
2403
|
+
|
|
2404
|
+
def test_should_allow_verbose_options
|
|
2405
|
+
branch = @machine.transition(:from => :parked, :to => :idling, :on => :ignite)
|
|
2406
|
+
assert_instance_of StateMachine::Branch, branch
|
|
2407
|
+
end
|
|
2408
|
+
|
|
2409
|
+
def test_should_include_all_transition_states_in_machine_states
|
|
2410
|
+
@machine.transition(:parked => :idling, :on => :ignite)
|
|
2411
|
+
|
|
2412
|
+
assert_equal [:parked, :idling], @machine.states.map {|state| state.name}
|
|
2413
|
+
end
|
|
2414
|
+
|
|
2415
|
+
def test_should_include_all_transition_events_in_machine_events
|
|
2416
|
+
@machine.transition(:parked => :idling, :on => :ignite)
|
|
2417
|
+
|
|
2418
|
+
assert_equal [:ignite], @machine.events.map {|event| event.name}
|
|
2419
|
+
end
|
|
2420
|
+
|
|
2421
|
+
def test_should_allow_multiple_events
|
|
2422
|
+
branches = @machine.transition(:parked => :ignite, :on => [:ignite, :shift_up])
|
|
2423
|
+
|
|
2424
|
+
assert_equal 2, branches.length
|
|
2425
|
+
assert_equal [:ignite, :shift_up], @machine.events.map {|event| event.name}
|
|
2426
|
+
end
|
|
2427
|
+
end
|
|
2428
|
+
|
|
2291
2429
|
class MachineWithTransitionCallbacksTest < Test::Unit::TestCase
|
|
2292
2430
|
def setup
|
|
2293
2431
|
@klass = Class.new do
|
|
@@ -2588,6 +2726,51 @@ class MachineWithExistingMachinesWithSameAttributesOnOwnerClassTest < Test::Unit
|
|
|
2588
2726
|
@object.park
|
|
2589
2727
|
assert_equal 'parked', @object.state
|
|
2590
2728
|
end
|
|
2729
|
+
|
|
2730
|
+
def test_should_copy_new_states_to_sibling_machines
|
|
2731
|
+
@first_gear = @machine.state :first_gear
|
|
2732
|
+
assert_equal @first_gear, @second_machine.state(:first_gear)
|
|
2733
|
+
|
|
2734
|
+
@second_gear = @second_machine.state :second_gear
|
|
2735
|
+
assert_equal @second_gear, @machine.state(:second_gear)
|
|
2736
|
+
end
|
|
2737
|
+
|
|
2738
|
+
def test_should_copy_all_existing_states_to_new_machines
|
|
2739
|
+
third_machine = StateMachine::Machine.new(@klass, :protected_state, :attribute => :state)
|
|
2740
|
+
|
|
2741
|
+
assert_equal @machine.state(:parked), third_machine.state(:parked)
|
|
2742
|
+
assert_equal @machine.state(:idling), third_machine.state(:idling)
|
|
2743
|
+
end
|
|
2744
|
+
end
|
|
2745
|
+
|
|
2746
|
+
class MachineWithExistingMachinesWithSameAttributesOnOwnerSubclassTest < Test::Unit::TestCase
|
|
2747
|
+
def setup
|
|
2748
|
+
@klass = Class.new
|
|
2749
|
+
@machine = StateMachine::Machine.new(@klass, :initial => :parked)
|
|
2750
|
+
@second_machine = StateMachine::Machine.new(@klass, :public_state, :initial => :idling, :attribute => :state)
|
|
2751
|
+
|
|
2752
|
+
@subclass = Class.new(@klass)
|
|
2753
|
+
@object = @subclass.new
|
|
2754
|
+
end
|
|
2755
|
+
|
|
2756
|
+
def test_should_not_copy_sibling_machines_to_subclass_after_initialization
|
|
2757
|
+
@subclass.state_machine(:state) {}
|
|
2758
|
+
assert_equal @klass.state_machine(:public_state), @subclass.state_machine(:public_state)
|
|
2759
|
+
end
|
|
2760
|
+
|
|
2761
|
+
def test_should_copy_sibling_machines_to_subclass_after_new_state
|
|
2762
|
+
subclass_machine = @subclass.state_machine(:state) {}
|
|
2763
|
+
subclass_machine.state :first_gear
|
|
2764
|
+
assert_not_equal @klass.state_machine(:public_state), @subclass.state_machine(:public_state)
|
|
2765
|
+
end
|
|
2766
|
+
|
|
2767
|
+
def test_should_copy_new_states_to_sibling_machines
|
|
2768
|
+
subclass_machine = @subclass.state_machine(:state) {}
|
|
2769
|
+
@first_gear = subclass_machine.state :first_gear
|
|
2770
|
+
|
|
2771
|
+
second_subclass_machine = @subclass.state_machine(:public_state)
|
|
2772
|
+
assert_equal @first_gear, second_subclass_machine.state(:first_gear)
|
|
2773
|
+
end
|
|
2591
2774
|
end
|
|
2592
2775
|
|
|
2593
2776
|
class MachineWithNamespaceTest < Test::Unit::TestCase
|
|
@@ -2869,8 +3052,6 @@ end
|
|
|
2869
3052
|
|
|
2870
3053
|
begin
|
|
2871
3054
|
# Load library
|
|
2872
|
-
require 'rubygems'
|
|
2873
|
-
gem 'ruby-graphviz', '>=0.9.0'
|
|
2874
3055
|
require 'graphviz'
|
|
2875
3056
|
|
|
2876
3057
|
class MachineDrawingTest < Test::Unit::TestCase
|
|
@@ -3040,4 +3221,4 @@ begin
|
|
|
3040
3221
|
end
|
|
3041
3222
|
rescue LoadError
|
|
3042
3223
|
$stderr.puts 'Skipping GraphViz StateMachine::Machine tests. `gem install ruby-graphviz` >= v0.9.0 and try again.'
|
|
3043
|
-
end
|
|
3224
|
+
end unless ENV['TRAVIS']
|