state-fu 0.13.1 → 0.13.3
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/support/vizier.rb +1 -0
- data/spec/features/plotter_spec.rb +7 -7
- data/spec/helper.rb +0 -10
- data/spec/integration/active_record_persistence_spec.rb +4 -12
- data/spec/integration/example_01_document_spec.rb +2 -2
- data/spec/integration/example_02_string_spec.rb +2 -1
- data/spec/integration/requirement_reflection_spec.rb +14 -22
- data/spec/spec_helper.rb +3 -3
- data/spec/state_fu_spec.rb +1 -1
- data/spec/units/binding_spec.rb +9 -10
- data/spec/units/event_spec.rb +29 -34
- data/spec/units/lathe_spec.rb +26 -30
- data/spec/units/machine_spec.rb +4 -4
- data/spec/units/method_factory_spec.rb +7 -2
- data/spec/units/state_spec.rb +2 -2
- metadata +2 -2
data/lib/support/vizier.rb
CHANGED
@@ -47,29 +47,29 @@ describe StateFu::Plotter do
|
|
47
47
|
describe ".generate" do
|
48
48
|
|
49
49
|
it "should call generate_dot!" do
|
50
|
-
|
50
|
+
@plotter.should_receive(:generate_dot!).and_return("dot")
|
51
51
|
@plotter.generate
|
52
52
|
end
|
53
53
|
|
54
54
|
it "should store the result in the dot attribute" do
|
55
|
-
|
55
|
+
@plotter.should_receive(:generate_dot!).and_return("dot")
|
56
56
|
@plotter.generate
|
57
57
|
@plotter.dot.should == "dot"
|
58
58
|
end
|
59
59
|
|
60
60
|
describe ".save_as(filename)" do
|
61
61
|
it "should save the string to a file" do
|
62
|
-
|
63
|
-
|
62
|
+
File.should_receive(:open).with('filename', 'w').and_yield(@fh = Object.new())
|
63
|
+
@fh.should_receive(:write).with(@plotter.output)
|
64
64
|
@plotter.output.save_as( 'filename' )
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
68
68
|
describe ".save!" do
|
69
69
|
it "should save the string in a tempfile and return the path" do
|
70
|
-
|
71
|
-
|
72
|
-
|
70
|
+
(@tempfile = Object.new).should_receive(:path).and_return('path')
|
71
|
+
(@fh = Object.new()).should_receive(:write).with(@plotter.output)
|
72
|
+
Tempfile.should_receive(:new).with(['state_fu_graph','.dot']).and_yield(@fh).and_return(@tempfile)
|
73
73
|
@plotter.output.save!.should == 'path'
|
74
74
|
end
|
75
75
|
end
|
data/spec/helper.rb
CHANGED
@@ -1,13 +1,3 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
require File.join(File.dirname(__FILE__),'spec_helper')
|
3
3
|
|
4
|
-
begin
|
5
|
-
require 'rr'
|
6
|
-
rescue LoadError => e
|
7
|
-
STDERR.puts "The '#{gem_name}' gem is required to run StateFu's specs. Please install it by running (as root):\ngem install #{gem_name}\n\n"
|
8
|
-
exit 1;
|
9
|
-
end
|
10
|
-
|
11
|
-
Spec::Runner.configure do |config|
|
12
|
-
config.mock_with :rr
|
13
|
-
end
|
@@ -111,22 +111,14 @@ describe "an ActiveRecord model with StateFu included:" do
|
|
111
111
|
# satisfy the not null constraint
|
112
112
|
describe "automagic state_fu! before_save filter and validations" do
|
113
113
|
|
114
|
-
it "should call state_fu! before a record is created"
|
115
|
-
|
116
|
-
mock.proxy( @ex ).state_fu!.at_least( 1 ) { }
|
117
|
-
@ex.save!
|
118
|
-
end
|
119
|
-
|
120
|
-
it "should call state_fu! before a record is updated" do
|
121
|
-
@ex.should be_new_record
|
122
|
-
mock.proxy( @ex ).state_fu!.at_least( 1 ) { }
|
123
|
-
@ex.save!
|
124
|
-
end
|
114
|
+
it "should call state_fu! before a record is created"
|
115
|
+
it "should call state_fu! before a record is updated"
|
125
116
|
|
126
117
|
it "should create a record given only a name, with the field set to the initial state" do
|
127
118
|
ex = ExampleRecord.new( :name => "exemplar" )
|
128
|
-
ex.should be_valid
|
129
119
|
ex.state_fu_field.should == nil
|
120
|
+
ex.should be_valid
|
121
|
+
ex.state_fu_field.should == 'initial'
|
130
122
|
ex.save!
|
131
123
|
ex.should_not be_new_record
|
132
124
|
ex.state_fu_field.should == 'initial'
|
@@ -89,7 +89,7 @@ describe "Document" do
|
|
89
89
|
end
|
90
90
|
|
91
91
|
it "should call update_rss when publish! is called" do
|
92
|
-
|
92
|
+
@doc.should_receive(:update_rss)
|
93
93
|
@doc.status.publish!
|
94
94
|
end
|
95
95
|
|
@@ -125,7 +125,7 @@ describe "Document" do
|
|
125
125
|
describe "delete!" do
|
126
126
|
|
127
127
|
it "should execute destroy()" do
|
128
|
-
|
128
|
+
@doc.should_receive(:destroy)
|
129
129
|
@doc.status.delete!
|
130
130
|
end
|
131
131
|
|
@@ -49,7 +49,8 @@ describe String do
|
|
49
49
|
it "should call sanitize_for_shell! when shell.escape! is called, and be clean afterwards " do
|
50
50
|
@str.should be_dirty
|
51
51
|
@str.should_not be_clean
|
52
|
-
|
52
|
+
@str.should_receive(:sanitize_for_shell!)
|
53
|
+
|
53
54
|
@str.shell.escape!
|
54
55
|
@str.should_not be_dirty
|
55
56
|
@str.should be_clean
|
@@ -51,18 +51,14 @@ describe "Transition requirement reflection" do
|
|
51
51
|
|
52
52
|
describe "transition.valid? / transition.requirements_met?" do
|
53
53
|
it "should be true if all requirements are met (return truth)" do
|
54
|
-
|
55
|
-
|
56
|
-
#@obj.state_fu.fireable?([:fly_spaceship,:moon]).should == true
|
54
|
+
@obj.state_fu.next_states[:moon].entry_requirements.should == [:spacesuit?]
|
57
55
|
@obj.can_fly_spaceship?(:moon).should == true
|
58
|
-
|
59
|
-
#@obj.fly_spaceship(:moon).should be_valid
|
56
|
+
@obj.fly_spaceship(:moon).should be_valid
|
60
57
|
end
|
61
58
|
|
62
59
|
it "should be false if not all requirements are met" do
|
63
|
-
|
60
|
+
@obj.should_receive(:spacesuit?).any_number_of_times.and_return(false)
|
64
61
|
@obj.state_fu.next_states[:moon].entry_requirements.should == [:spacesuit?]
|
65
|
-
# @obj.state_fu.evaluate(:spacesuit?).should == false
|
66
62
|
@obj.can_fly_spaceship?(:moon).should == false
|
67
63
|
@obj.fly_spaceship(:moon).requirements_met?.should == false
|
68
64
|
@obj.fly_spaceship(:moon).should_not be_valid
|
@@ -71,11 +67,9 @@ describe "Transition requirement reflection" do
|
|
71
67
|
|
72
68
|
describe "flying from russia to america without one's affairs in order while wearing a turban" do
|
73
69
|
before do
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
mock( @obj ).money_for_bribe?(anything) { false }
|
78
|
-
mock( @obj ).papers_in_order?(anything) { false }
|
70
|
+
%w(us_visa? no_turban? no_arrest_warrant? money_for_bribe? papers_in_order?).each do |meth|
|
71
|
+
@obj.should_receive(meth).any_number_of_times.and_return(false)
|
72
|
+
end
|
79
73
|
end
|
80
74
|
|
81
75
|
describe "when no messages are supplied for the requirements" do
|
@@ -136,9 +130,9 @@ describe "Transition requirement reflection" do
|
|
136
130
|
end
|
137
131
|
|
138
132
|
describe "when a message is supplied for the requirement" do
|
139
|
-
it "should contain a list of the requirement failure messages as strings" do
|
140
|
-
|
141
|
-
|
133
|
+
it "should contain a list of the requirement failure messages as strings" do
|
134
|
+
@obj.should_receive(:spacesuit?).and_return(false)
|
135
|
+
@obj.should_receive(:fuel?).and_return(false)
|
142
136
|
@obj.state_fu.fly_spaceship(:moon).unmet_requirements.should == [:spacesuit?, :fuel?]
|
143
137
|
end
|
144
138
|
end
|
@@ -148,8 +142,8 @@ describe "Transition requirement reflection" do
|
|
148
142
|
describe "transition.unmet_requirement_messages" do
|
149
143
|
describe "when a string message is defined for one of two unmet_requirements" do
|
150
144
|
before do
|
151
|
-
|
152
|
-
|
145
|
+
@obj.should_receive(:spacesuit?).and_return(false)
|
146
|
+
@obj.should_receive(:fuel?).and_return(false)
|
153
147
|
@msg = "You got no spacesuit."
|
154
148
|
@machine.requirement_messages[:spacesuit?] = @msg
|
155
149
|
end
|
@@ -169,8 +163,8 @@ describe "Transition requirement reflection" do
|
|
169
163
|
|
170
164
|
describe "when a proc message is defined for one of two unmet_requirements" do
|
171
165
|
before do
|
172
|
-
|
173
|
-
|
166
|
+
@obj.should_receive(:spacesuit?).any_number_of_times.and_return(false)
|
167
|
+
@obj.should_receive(:fuel?).any_number_of_times.and_return(false)
|
174
168
|
end
|
175
169
|
|
176
170
|
describe "when the arity of the proc is 1" do
|
@@ -239,9 +233,7 @@ describe "Transition requirement reflection" do
|
|
239
233
|
it "should call t.evaluate_named_proc_or_method(:no_spacesuit_msg_method)" do
|
240
234
|
t = @obj.state_fu.fly_spaceship(:moon)
|
241
235
|
t.unmet_requirements.length.should == 2
|
242
|
-
|
243
|
-
|
244
|
-
mock( t ).evaluate(:no_spacesuit_msg_method){ ":)" }
|
236
|
+
t.should_receive(:evaluate).with(:no_spacesuit_msg_method).and_return ':)'
|
245
237
|
messages = t.unmet_requirement_messages
|
246
238
|
messages.should include( ":)" )
|
247
239
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -20,16 +20,16 @@ module MySpecHelper
|
|
20
20
|
|
21
21
|
def prepare_active_record( options={}, &migration )
|
22
22
|
if skip_slow_specs?
|
23
|
-
skip_slow_specs and return
|
23
|
+
skip_slow_specs and return
|
24
24
|
end
|
25
25
|
|
26
26
|
begin
|
27
|
-
require '
|
27
|
+
require 'active_support'
|
28
28
|
require 'active_record'
|
29
29
|
require 'sqlite3'
|
30
30
|
rescue LoadError => e
|
31
31
|
pending "skipping specifications due to load error: #{e}"
|
32
|
-
return
|
32
|
+
return
|
33
33
|
end
|
34
34
|
|
35
35
|
options.symbolize_keys!
|
data/spec/state_fu_spec.rb
CHANGED
@@ -219,7 +219,7 @@ describe "A door which opens and shuts:" do
|
|
219
219
|
rescue StateFu::RequirementError => e
|
220
220
|
e.to_a.should == ["Sorry, it's locked."]
|
221
221
|
e.to_h.should == {:not_locked? => "Sorry, it's locked."}
|
222
|
-
e.
|
222
|
+
e.should respond_to(:to_enum)
|
223
223
|
e.should_not be_empty
|
224
224
|
e.length.should == 1
|
225
225
|
e.each do |requirement, message|
|
data/spec/units/binding_spec.rb
CHANGED
@@ -27,11 +27,9 @@ describe StateFu::Binding do
|
|
27
27
|
|
28
28
|
describe "constructor" do
|
29
29
|
before do
|
30
|
-
|
31
|
-
{
|
32
|
-
|
33
|
-
}
|
34
|
-
end
|
30
|
+
Klass.should_receive(:state_fu_options).at_most(3).times.and_return({
|
31
|
+
:example => {:field_name => :example_field}
|
32
|
+
})
|
35
33
|
end
|
36
34
|
|
37
35
|
it "should create a new Binding given valid arguments" do
|
@@ -61,12 +59,12 @@ describe StateFu::Binding do
|
|
61
59
|
describe "when StateFu::Persistence.active_record_column? is true" do
|
62
60
|
|
63
61
|
before do
|
64
|
-
|
65
|
-
|
62
|
+
StateFu::Persistence.should_receive(:active_record_column?).with(Klass, :example_field).and_return true
|
63
|
+
Klass.should_receive(:before_validation_on_create).with(:state_fu!)
|
66
64
|
end
|
67
65
|
|
68
66
|
it "should get an ActiveRecord persister" do
|
69
|
-
|
67
|
+
StateFu::Persistence::ActiveRecord.should_receive(:new).with(anything, :example_field).and_return(@p)
|
70
68
|
b = StateFu::Binding.new( Klass.state_fu_machine, @obj, :example )
|
71
69
|
b.persister.should == @p
|
72
70
|
end
|
@@ -74,10 +72,10 @@ describe StateFu::Binding do
|
|
74
72
|
|
75
73
|
describe "when StateFu::Persistence.active_record_column? is false" do
|
76
74
|
before do
|
77
|
-
|
75
|
+
StateFu::Persistence.should_receive(:active_record_column?).with(Klass, :example_field).and_return false
|
78
76
|
end
|
79
77
|
it "should get an Attribute persister" do
|
80
|
-
|
78
|
+
StateFu::Persistence::Attribute.should_receive(:new).with(anything, :example_field).and_return @p
|
81
79
|
b = StateFu::Binding.new( Klass.state_fu_machine, @obj, :example )
|
82
80
|
b.persister.should == @p
|
83
81
|
end
|
@@ -173,6 +171,7 @@ describe StateFu::Binding do
|
|
173
171
|
describe "when called with additional arguments after the destination event/state" do
|
174
172
|
|
175
173
|
# This would make very little sense to someone trying to understand how to use the library.
|
174
|
+
# figure out how to spec it properly.
|
176
175
|
it "should pass the arguments to any requirements to determine transition availability" do
|
177
176
|
pending
|
178
177
|
t = nil
|
data/spec/units/event_spec.rb
CHANGED
@@ -8,7 +8,7 @@ describe StateFu::Event do
|
|
8
8
|
include MySpecHelper
|
9
9
|
before do
|
10
10
|
@machine = Object.new
|
11
|
-
|
11
|
+
@machine.should_receive(:tools).any_number_of_times.and_return [].extend(StateFu::ToolArray)
|
12
12
|
end
|
13
13
|
|
14
14
|
describe "Instance methods" do
|
@@ -30,29 +30,29 @@ describe StateFu::Event do
|
|
30
30
|
|
31
31
|
describe "target" do
|
32
32
|
it "should be nil if targets is nil" do
|
33
|
-
|
33
|
+
@event.should_receive(:targets).and_return nil
|
34
34
|
@event.target.should == nil
|
35
35
|
end
|
36
36
|
|
37
37
|
it "should be nil if targets has more than one state" do
|
38
|
-
|
38
|
+
@event.should_receive(:targets).at_least(1).times.and_return [@state_a, @state_b]
|
39
39
|
@event.target.should == nil
|
40
40
|
end
|
41
41
|
|
42
42
|
it "should be the sole state if targets is set and there is only one" do
|
43
|
-
|
43
|
+
@event.should_receive(:targets).at_least(1).times.and_return [@state_a]
|
44
44
|
@event.target.should == @state_a
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
48
|
describe 'origins=' do
|
49
49
|
it "should call get_states_list_by_name with its argument" do
|
50
|
-
|
50
|
+
@machine.should_receive(:find_or_create_states_by_name).with(:initial).and_return []
|
51
51
|
@event.origins= :initial
|
52
52
|
end
|
53
53
|
|
54
54
|
it "should set @origin to the result" do
|
55
|
-
|
55
|
+
@machine.should_receive(:find_or_create_states_by_name).with(:initial).and_return [:result]
|
56
56
|
@event.origins= :initial
|
57
57
|
@event.origins.should == [:result]
|
58
58
|
end
|
@@ -61,12 +61,12 @@ describe StateFu::Event do
|
|
61
61
|
|
62
62
|
describe 'targets=' do
|
63
63
|
it "should call get_states_list_by_name with its argument" do
|
64
|
-
|
64
|
+
@machine.should_receive(:find_or_create_states_by_name).with(:initial).and_return []
|
65
65
|
@event.targets= :initial
|
66
66
|
end
|
67
67
|
|
68
68
|
it "should set @target to the result" do
|
69
|
-
|
69
|
+
@machine.should_receive(:find_or_create_states_by_name).with(:initial).and_return [:result]
|
70
70
|
@event.targets= :initial
|
71
71
|
@event.targets.should == [:result]
|
72
72
|
end
|
@@ -95,9 +95,12 @@ describe StateFu::Event do
|
|
95
95
|
describe "given @event.from :initial, :to => :final" do
|
96
96
|
describe "setting attributes" do
|
97
97
|
before do
|
98
|
-
|
99
|
-
|
100
|
-
|
98
|
+
@machine.should_receive(:find_or_create_states_by_name).with(:initial).and_return [@initial]
|
99
|
+
@machine.should_receive(:find_or_create_states_by_name).with(:final).and_return [@final]
|
100
|
+
|
101
|
+
# stub( @machine ).find_or_create_states_by_name( anything ) { |*a| raise(a.inspect) }
|
102
|
+
# stub( @machine ).find_or_create_states_by_name( :initial ) { [@initial] }
|
103
|
+
# stub( @machine ).find_or_create_states_by_name( :final ) { [@final] }
|
101
104
|
end
|
102
105
|
|
103
106
|
it "should call @machine.find_or_create_states_by_name() with :initial and :final" do
|
@@ -118,23 +121,15 @@ describe StateFu::Event do
|
|
118
121
|
|
119
122
|
describe "given @event.from <Array>, :to => <Array>" do
|
120
123
|
it "should call @machine.find_or_create_states_by_name() with both arrays" do
|
121
|
-
|
122
|
-
|
123
|
-
end
|
124
|
-
stub( @machine ).find_or_create_states_by_name(:final, :end) do
|
125
|
-
[@final, @end]
|
126
|
-
end
|
127
|
-
|
124
|
+
@machine.should_receive(:find_or_create_states_by_name).with(:initial, :start).and_return [@initial, @start]
|
125
|
+
@machine.should_receive(:find_or_create_states_by_name).with(:final, :end).and_return [@final, @end]
|
128
126
|
@event.from( [:initial, :start], :to => [:final, :end] )
|
129
127
|
end
|
130
128
|
end
|
131
129
|
|
132
130
|
describe "given @event.from :ALL, :to => :ALL" do
|
133
131
|
it "should set origins and targets to @machine.states" do
|
134
|
-
|
135
|
-
stub( @machine ).find_or_create_states_by_name(anything) do |x|
|
136
|
-
x
|
137
|
-
end
|
132
|
+
@machine.should_receive(:states).any_number_of_times.and_return [:all, :of, :them]
|
138
133
|
@event.from( :ALL, :to => :ALL )
|
139
134
|
@event.origins.should == [:all, :of, :them ]
|
140
135
|
@event.targets.should == [:all, :of, :them ]
|
@@ -146,7 +141,7 @@ describe StateFu::Event do
|
|
146
141
|
describe '.to()' do
|
147
142
|
describe "given :final" do
|
148
143
|
it "should set @event.target to machine.find_or_create_states_by_name( :final )" do
|
149
|
-
|
144
|
+
@machine.should_receive(:find_or_create_states_by_name).with(:final).and_return [@final]
|
150
145
|
@event.to :final
|
151
146
|
@event.targets.should == [@final]
|
152
147
|
end
|
@@ -157,16 +152,16 @@ describe StateFu::Event do
|
|
157
152
|
|
158
153
|
describe 'origin_names' do
|
159
154
|
it "should return an array of state names in origin when origin is not nil" do
|
160
|
-
|
161
|
-
|
155
|
+
@machine.should_receive(:find_or_create_states_by_name).with(:initial).and_return [@initial]
|
156
|
+
@machine.should_receive(:find_or_create_states_by_name).with(:final).and_return [@final]
|
162
157
|
@event.from :initial, :to => :final
|
163
158
|
@event.origin.should == @initial
|
164
|
-
|
159
|
+
@initial.should_receive(:to_sym).any_number_of_times.and_return(:initial)
|
165
160
|
@event.origin_names.should == [:initial]
|
166
161
|
end
|
167
162
|
|
168
163
|
it "should return nil when origin is nil" do
|
169
|
-
|
164
|
+
@event.should_receive(:origins).any_number_of_times.and_return nil
|
170
165
|
@event.origin_names.should == nil
|
171
166
|
end
|
172
167
|
|
@@ -174,37 +169,37 @@ describe StateFu::Event do
|
|
174
169
|
|
175
170
|
describe 'target_names' do
|
176
171
|
it "should return an array of state names in target when target is not nil" do
|
177
|
-
|
178
|
-
|
172
|
+
@event.should_receive(:targets).any_number_of_times.and_return [@final]
|
173
|
+
@final.should_receive(:to_sym).any_number_of_times.and_return(:final)
|
179
174
|
@event.target_names.should == [:final]
|
180
175
|
end
|
181
176
|
|
182
177
|
it "should return nil when target is nil" do
|
183
|
-
|
178
|
+
@event.should_receive(:targets).any_number_of_times.and_return nil
|
184
179
|
@event.target_names.should == nil
|
185
180
|
end
|
186
181
|
end
|
187
182
|
|
188
183
|
describe 'to?' do
|
189
184
|
it "should return true given a symbol which is the name of a state in @target" do
|
190
|
-
|
185
|
+
@event.should_receive(:targets).any_number_of_times.and_return [StateFu::State.new(@machine,:a)]
|
191
186
|
@event.to?( :a ).should == true
|
192
187
|
end
|
193
188
|
|
194
189
|
it "should return false given a symbol which is not the name of a state in @target" do
|
195
|
-
|
190
|
+
@event.should_receive(:targets).any_number_of_times.and_return [StateFu::State.new(@machine,:a)]
|
196
191
|
@event.to?( :b ).should == false
|
197
192
|
end
|
198
193
|
end
|
199
194
|
|
200
195
|
describe 'from?' do
|
201
196
|
it "should return true given a symbol which is the name of a state in @origin" do
|
202
|
-
|
197
|
+
@event.should_receive(:origins).any_number_of_times.and_return [StateFu::State.new(@machine,:a)]
|
203
198
|
@event.from?( :a ).should == true
|
204
199
|
end
|
205
200
|
|
206
201
|
it "should return nil given a symbol which is not the name of a state in @origin" do
|
207
|
-
|
202
|
+
@event.should_receive(:origins).any_number_of_times.and_return [StateFu::State.new(@machine,:a)]
|
208
203
|
@event.from?( :b ).should == nil
|
209
204
|
end
|
210
205
|
end
|
data/spec/units/lathe_spec.rb
CHANGED
@@ -10,12 +10,12 @@ describe StateFu::Lathe do
|
|
10
10
|
@state = Object.new()
|
11
11
|
@event = Object.new()
|
12
12
|
|
13
|
-
|
13
|
+
@machine.should_receive(:tools).any_number_of_times.and_return([].extend( StateFu::ToolArray ))
|
14
14
|
@lathe = StateFu::Lathe.new( @machine )
|
15
|
-
@states = [].extend StateFu::StateArray
|
16
|
-
|
15
|
+
@states = [].extend StateFu::StateArray
|
16
|
+
@machine.should_receive(:states).any_number_of_times.and_return(@states)
|
17
17
|
@events = [].extend StateFu::EventArray
|
18
|
-
|
18
|
+
@machine.should_receive(:events).any_number_of_times.and_return(@events)
|
19
19
|
end
|
20
20
|
|
21
21
|
describe "constructor" do
|
@@ -29,7 +29,7 @@ describe StateFu::Lathe do
|
|
29
29
|
|
30
30
|
it "should accept a state_or_event (state / event ) and if given one, be a child" do
|
31
31
|
options = {}
|
32
|
-
|
32
|
+
@state.should_receive(:apply!).with(options)
|
33
33
|
lathe = StateFu::Lathe.new( @machine, @state )
|
34
34
|
lathe.should be_kind_of( StateFu::Lathe )
|
35
35
|
lathe.machine.should == @machine
|
@@ -63,10 +63,9 @@ describe StateFu::Lathe do
|
|
63
63
|
options = {:banana => :flower}
|
64
64
|
@state = Object.new()
|
65
65
|
@child = Object.new()
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
mock( @child )
|
66
|
+
StateFu::State.should_receive(:new).with(@machine, :wobble, options).and_return(@state)
|
67
|
+
StateFu::Lathe.should_receive(:new).with(@machine, @state, options).and_return(@child)
|
68
|
+
# TODO mock the block
|
70
69
|
@lathe.state( :wobble, options )
|
71
70
|
end
|
72
71
|
|
@@ -183,10 +182,9 @@ describe StateFu::Lathe do
|
|
183
182
|
options = {:banana => :flower}
|
184
183
|
@event = Object.new()
|
185
184
|
@child = Object.new()
|
186
|
-
#
|
187
|
-
|
188
|
-
|
189
|
-
mock( @child )
|
185
|
+
# TODO mock the block
|
186
|
+
StateFu::Event.should_receive(:new).with(@machine, :wobble, options).and_return(@event)
|
187
|
+
StateFu::Lathe.should_receive(:new).with(@machine, @event, options).and_return(@child)
|
190
188
|
@lathe.event( :wobble, options )
|
191
189
|
end
|
192
190
|
|
@@ -327,7 +325,7 @@ describe StateFu::Lathe do
|
|
327
325
|
|
328
326
|
describe "helper" do
|
329
327
|
it "should call machine.helper *args" do
|
330
|
-
|
328
|
+
@machine.should_receive(:helper).with( :fee, :fi, :fo, :fum )
|
331
329
|
@lathe.helper( :fee, :fi, :fo, :fum )
|
332
330
|
end
|
333
331
|
end
|
@@ -380,7 +378,7 @@ describe StateFu::Lathe do
|
|
380
378
|
|
381
379
|
describe ".event(:name)" do
|
382
380
|
before do
|
383
|
-
|
381
|
+
@machine.should_receive(:find_or_create_states_by_name).with(@lathe.state_or_event).at_least(1).times.and_return(@lathe.state_or_event)
|
384
382
|
end
|
385
383
|
|
386
384
|
it "should create the named event if it does not exist" do
|
@@ -477,25 +475,23 @@ describe StateFu::Lathe do
|
|
477
475
|
@master = @lathe
|
478
476
|
@event = @lathe.event( :go )
|
479
477
|
@lathe = StateFu::Lathe.new( @machine, @event )
|
480
|
-
stub( @machine ).find_or_create_states_by_name(:a) { [:a] }
|
481
|
-
stub( @machine ).find_or_create_states_by_name(:b) { [:b] }
|
482
478
|
end
|
483
479
|
|
484
480
|
describe ".from" do
|
485
481
|
it "should create any states mentioned which do not exist" do
|
486
|
-
|
482
|
+
@machine.should_receive(:find_or_create_states_by_name).with(:a, :b).and_return([:a, :b])
|
487
483
|
@lathe.from( :a, :b )
|
488
484
|
end
|
489
485
|
|
490
486
|
it "should set the origins to the result of machine.find_or_create_states_by_name" do
|
491
|
-
|
487
|
+
@machine.should_receive(:find_or_create_states_by_name).with(:a, :b).and_return([:a, :b])
|
492
488
|
@lathe.from( :a, :b )
|
493
489
|
@event.origins.should == [:a, :b]
|
494
490
|
end
|
495
491
|
|
496
492
|
it "should accumulate @origins on successive invocations" do
|
497
|
-
|
498
|
-
|
493
|
+
@machine.should_receive(:find_or_create_states_by_name).with(:a, :b).and_return([:a, :b])
|
494
|
+
@machine.should_receive(:find_or_create_states_by_name).with(:x, :y).and_return([:x, :y])
|
499
495
|
@lathe.from( :a, :b )
|
500
496
|
@event.origins.should == [:a, :b]
|
501
497
|
@lathe.from( :x, :y )
|
@@ -503,10 +499,10 @@ describe StateFu::Lathe do
|
|
503
499
|
end
|
504
500
|
|
505
501
|
it "should set / update both origin and target if a hash is given" do
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
502
|
+
@machine.should_receive(:find_or_create_states_by_name).with(:a).and_return [:a]
|
503
|
+
@machine.should_receive(:find_or_create_states_by_name).with(:b).and_return [:b]
|
504
|
+
@machine.should_receive(:find_or_create_states_by_name).with(:a, :b).and_return([:a, :b])
|
505
|
+
@machine.should_receive(:find_or_create_states_by_name).with(:x, :y).and_return([:x, :y])
|
510
506
|
@lathe.from( :a => :b )
|
511
507
|
@event.origin.should == :a
|
512
508
|
@event.target.should == :b
|
@@ -519,20 +515,20 @@ describe StateFu::Lathe do
|
|
519
515
|
end
|
520
516
|
|
521
517
|
describe ".to" do
|
522
|
-
it "should create any states mentioned which do not exist" do
|
523
|
-
|
518
|
+
it "should create any states mentioned which do not exist" do
|
519
|
+
@machine.should_receive(:find_or_create_states_by_name).with(:a, :b).and_return([:a, :b])
|
524
520
|
@lathe.to( :a, :b )
|
525
521
|
end
|
526
522
|
|
527
523
|
it "should set the targets to the result of machine.find_or_create_states_by_name" do
|
528
|
-
|
524
|
+
@machine.should_receive(:find_or_create_states_by_name).with(:a, :b).and_return([:a, :b])
|
529
525
|
@lathe.to( :a, :b )
|
530
526
|
@event.targets.should == [:a, :b]
|
531
527
|
end
|
532
528
|
|
533
529
|
it "should update @origins on successive invocations" do
|
534
|
-
|
535
|
-
|
530
|
+
@machine.should_receive(:find_or_create_states_by_name).with(:a, :b).and_return([:a, :b])
|
531
|
+
@machine.should_receive(:find_or_create_states_by_name).with(:x, :y).and_return([:x, :y])
|
536
532
|
@lathe.to( :a, :b )
|
537
533
|
@event.targets.should == [:a, :b]
|
538
534
|
@lathe.to( :x, :y )
|
data/spec/units/machine_spec.rb
CHANGED
@@ -24,8 +24,8 @@ describe StateFu::Machine do
|
|
24
24
|
|
25
25
|
it "should create a new machine and bind! it" do
|
26
26
|
@machine = Object.new
|
27
|
-
|
28
|
-
|
27
|
+
@machine.should_receive(:bind!).with(Klass, :moose, {})
|
28
|
+
StateFu::Machine.should_receive(:new).and_return @machine
|
29
29
|
StateFu::Machine.for_class Klass, :moose
|
30
30
|
end
|
31
31
|
|
@@ -73,7 +73,7 @@ describe StateFu::Machine do
|
|
73
73
|
describe ".bind!" do
|
74
74
|
it "should call StateFu::Machine.bind! with itself and its arguments" do
|
75
75
|
field_name = :my_field_name
|
76
|
-
|
76
|
+
StateFu::Machine.should_receive(:bind!).with @m, Klass, :newname, field_name
|
77
77
|
@m.bind!( Klass, :newname, field_name )
|
78
78
|
end
|
79
79
|
|
@@ -119,7 +119,7 @@ describe StateFu::Machine do
|
|
119
119
|
end
|
120
120
|
|
121
121
|
it "should return the first state if one exists" do
|
122
|
-
|
122
|
+
@m.should_receive(:states).and_return [:a, :b, :c]
|
123
123
|
@m.initial_state.should == :a
|
124
124
|
end
|
125
125
|
|
@@ -34,18 +34,21 @@ describe StateFu::MethodFactory do
|
|
34
34
|
end
|
35
35
|
it "should call the original method_missing on an unexpected method call" do
|
36
36
|
@k = Klass.new
|
37
|
-
|
37
|
+
@k.should_receive(:callme)
|
38
38
|
@k.whut?
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
42
|
describe "event creation methods" do
|
43
43
|
it "should call method_missing" do
|
44
|
+
pending "RSpec mocking makes this tricky ..."
|
45
|
+
@obj.should_receive(:method_missing).with(:simple_event!)
|
44
46
|
mock( @obj ).method_missing( :simple_event! )
|
45
47
|
@obj.simple_event!
|
46
48
|
end
|
47
49
|
|
48
50
|
it "should call state_fu!" do
|
51
|
+
pending "RSpec mocking makes this tricky ..."
|
49
52
|
mock.proxy( StateFu::Binding ).new( Klass.state_fu_machine, @obj, StateFu::DEFAULT )
|
50
53
|
@obj
|
51
54
|
@obj.private_methods.map(&:to_sym).should include(:state_fu_field)
|
@@ -61,6 +64,8 @@ describe StateFu::MethodFactory do
|
|
61
64
|
end
|
62
65
|
|
63
66
|
it "should call binding.fire!( :simple_event ... ) with any specified args" do
|
67
|
+
pending "RSpec mocking makes this tricky ..."
|
68
|
+
|
64
69
|
mock.instance_of( StateFu::Binding ).fire_transition!( is_a(StateFu::Event), is_a(StateFu::State), :aa, :bb, {:cc => "dd"} )
|
65
70
|
t = @obj.simple_event!( :aa, :bb, :cc => "dd" )
|
66
71
|
end
|
@@ -127,7 +132,7 @@ describe StateFu::MethodFactory do
|
|
127
132
|
end
|
128
133
|
|
129
134
|
it "should be false when the binding says it\'s not can_transition?" do
|
130
|
-
|
135
|
+
@binding.should_receive(:can_transition?).with(@machine.events[:simple_event], @machine.states[:targ]).and_return false
|
131
136
|
@binding.can_simple_event?.should == false
|
132
137
|
end
|
133
138
|
end # can_transition?
|
data/spec/units/state_spec.rb
CHANGED
@@ -48,8 +48,8 @@ describe StateFu::State do
|
|
48
48
|
|
49
49
|
it "should call machine.events.from(self)" do
|
50
50
|
machine_events = Object.new
|
51
|
-
|
52
|
-
|
51
|
+
@machine.should_receive(:events).and_return machine_events
|
52
|
+
machine_events.should_receive(:from).with(@state).and_return nil
|
53
53
|
@state.events
|
54
54
|
end
|
55
55
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: state-fu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.13.
|
4
|
+
version: 0.13.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Lee
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-12-13 00:00:00 +11:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|