finite_machine 0.8.1 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +11 -0
- data/Gemfile +1 -1
- data/README.md +150 -35
- data/lib/finite_machine.rb +1 -0
- data/lib/finite_machine/catchable.rb +1 -1
- data/lib/finite_machine/definition.rb +61 -0
- data/lib/finite_machine/dsl.rb +45 -10
- data/lib/finite_machine/event.rb +17 -1
- data/lib/finite_machine/hook_event.rb +66 -7
- data/lib/finite_machine/observer.rb +3 -3
- data/lib/finite_machine/state_machine.rb +36 -28
- data/lib/finite_machine/version.rb +1 -1
- data/spec/spec_helper.rb +2 -2
- data/spec/unit/async_events_spec.rb +1 -1
- data/spec/unit/callbacks_spec.rb +23 -23
- data/spec/unit/can_spec.rb +22 -22
- data/spec/unit/event/eql_spec.rb +37 -0
- data/spec/unit/event/initialize_spec.rb +38 -0
- data/spec/unit/event/inspect_spec.rb +1 -1
- data/spec/unit/event_queue_spec.rb +2 -2
- data/spec/unit/events_chain/check_choice_conditions_spec.rb +2 -2
- data/spec/unit/events_chain/clear_spec.rb +1 -1
- data/spec/unit/events_chain/insert_spec.rb +1 -1
- data/spec/unit/events_spec.rb +17 -20
- data/spec/unit/hook_event/eql_spec.rb +37 -0
- data/spec/unit/hook_event/initialize_spec.rb +22 -0
- data/spec/unit/if_unless_spec.rb +6 -6
- data/spec/unit/initialize_spec.rb +6 -6
- data/spec/unit/is_spec.rb +12 -12
- data/spec/unit/logger_spec.rb +1 -1
- data/spec/unit/respond_to_spec.rb +2 -2
- data/spec/unit/standalone_spec.rb +72 -0
- data/spec/unit/subscribers_spec.rb +2 -2
- data/spec/unit/target_spec.rb +59 -10
- data/spec/unit/{finished_spec.rb → terminated_spec.rb} +38 -8
- metadata +15 -4
data/lib/finite_machine/dsl.rb
CHANGED
@@ -55,19 +55,38 @@ module FiniteMachine
|
|
55
55
|
|
56
56
|
# Define initial state
|
57
57
|
#
|
58
|
+
# @param [Symbol] value
|
59
|
+
# The initial state name.
|
60
|
+
# @param [Hash[Symbol]] options
|
61
|
+
# @option options [Symbol] :event
|
62
|
+
# The event name.
|
63
|
+
# @option options [Symbol] :defer
|
64
|
+
# Set to true to defer initial state transition.
|
65
|
+
# Default false.
|
66
|
+
# @option options [Symbol] :silent
|
67
|
+
# Set to true to disable callbacks.
|
68
|
+
# Default true.
|
69
|
+
#
|
58
70
|
# @example
|
59
71
|
# initial :green
|
60
72
|
#
|
61
|
-
# @example
|
73
|
+
# @example Defer initial event
|
62
74
|
# initial state: green, defer: true
|
63
75
|
#
|
76
|
+
# @example Trigger callbacks
|
77
|
+
# initial :green, silent: false
|
78
|
+
#
|
79
|
+
# @example Redefine event name
|
80
|
+
# initial :green, event: :start
|
81
|
+
#
|
64
82
|
# @param [String, Hash] value
|
65
83
|
#
|
66
84
|
# @return [StateMachine]
|
67
85
|
#
|
68
86
|
# @api public
|
69
|
-
def initial(value)
|
70
|
-
state
|
87
|
+
def initial(value, options = {})
|
88
|
+
state = (value && !value.is_a?(Hash)) ? value : raise_missing_state
|
89
|
+
name, self.defer, silent = parse(options)
|
71
90
|
self.initial_event = name
|
72
91
|
machine.event(name, FiniteMachine::DEFAULT_STATE => state, silent: silent)
|
73
92
|
end
|
@@ -112,12 +131,17 @@ module FiniteMachine
|
|
112
131
|
# @return [FiniteMachine::StateMachine]
|
113
132
|
#
|
114
133
|
# @api public
|
115
|
-
def terminal(
|
116
|
-
machine.final_state =
|
134
|
+
def terminal(*values)
|
135
|
+
machine.final_state = values
|
117
136
|
end
|
118
137
|
|
119
138
|
# Define state machine events
|
120
139
|
#
|
140
|
+
# @example
|
141
|
+
# events do
|
142
|
+
# event :start, :red => :green
|
143
|
+
# end
|
144
|
+
#
|
121
145
|
# @return [FiniteMachine::StateMachine]
|
122
146
|
#
|
123
147
|
# @api public
|
@@ -127,6 +151,13 @@ module FiniteMachine
|
|
127
151
|
|
128
152
|
# Define state machine callbacks
|
129
153
|
#
|
154
|
+
# @example
|
155
|
+
# callbacks do
|
156
|
+
# on_enter :green do |event| ... end
|
157
|
+
# end
|
158
|
+
#
|
159
|
+
# @return [FiniteMachine::Observer]
|
160
|
+
#
|
130
161
|
# @api public
|
131
162
|
def callbacks(&block)
|
132
163
|
machine.observer.call(&block)
|
@@ -159,21 +190,25 @@ module FiniteMachine
|
|
159
190
|
# @api private
|
160
191
|
def parse(value)
|
161
192
|
if value.is_a?(Hash)
|
162
|
-
[value.fetch(:
|
163
|
-
value.fetch(:event) { FiniteMachine::DEFAULT_EVENT_NAME },
|
193
|
+
[value.fetch(:event) { FiniteMachine::DEFAULT_EVENT_NAME },
|
164
194
|
value.fetch(:defer) { false },
|
165
195
|
value.fetch(:silent) { true }]
|
166
196
|
else
|
167
|
-
[
|
197
|
+
[FiniteMachine::DEFAULT_EVENT_NAME, false, true]
|
168
198
|
end
|
169
199
|
end
|
170
200
|
|
171
201
|
# Raises missing state error
|
172
202
|
#
|
203
|
+
# @raise [MissingInitialStateError]
|
204
|
+
# Raised when state name is not provided for initial.
|
205
|
+
#
|
206
|
+
# @return [nil]
|
207
|
+
#
|
173
208
|
# @api private
|
174
209
|
def raise_missing_state
|
175
|
-
|
176
|
-
|
210
|
+
fail MissingInitialStateError,
|
211
|
+
'Provide state to transition :to for the initial event'
|
177
212
|
end
|
178
213
|
end # DSL
|
179
214
|
|
data/lib/finite_machine/event.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
module FiniteMachine
|
4
4
|
# A class representing event with transitions
|
5
5
|
class Event
|
6
|
+
include Comparable
|
6
7
|
include Threadable
|
7
8
|
|
8
9
|
# The name of this event
|
@@ -26,8 +27,11 @@ module FiniteMachine
|
|
26
27
|
@silent = attrs.fetch(:silent, false)
|
27
28
|
@state_transitions = []
|
28
29
|
# TODO: add event conditions
|
30
|
+
freeze
|
29
31
|
end
|
30
32
|
|
33
|
+
protected :machine
|
34
|
+
|
31
35
|
# Add transition for this event
|
32
36
|
#
|
33
37
|
# @param [FiniteMachine::Transition] transition
|
@@ -109,7 +113,19 @@ module FiniteMachine
|
|
109
113
|
#
|
110
114
|
# @api public
|
111
115
|
def inspect
|
112
|
-
"<##{self.class} @name=#{
|
116
|
+
"<##{self.class} @name=#{name}, @silent=#{silent}, " \
|
117
|
+
"@transitions=#{state_transitions.inspect}>"
|
118
|
+
end
|
119
|
+
|
120
|
+
# Compare whether the instance is greater, less then or equal to other
|
121
|
+
#
|
122
|
+
# @return [-1 0 1]
|
123
|
+
#
|
124
|
+
# @api public
|
125
|
+
def <=>(other)
|
126
|
+
other.is_a?(self.class) && [name, silent, state_transitions] <=>
|
127
|
+
[other.name, other.silent, other.state_transitions]
|
113
128
|
end
|
129
|
+
alias_method :eql?, :==
|
114
130
|
end # Event
|
115
131
|
end # FiniteMachine
|
@@ -4,11 +4,12 @@ module FiniteMachine
|
|
4
4
|
# A class responsible for event notification
|
5
5
|
class HookEvent
|
6
6
|
include Threadable
|
7
|
+
include Comparable
|
7
8
|
|
8
9
|
MESSAGE = :trigger
|
9
10
|
|
10
|
-
# HookEvent
|
11
|
-
attr_threadsafe :
|
11
|
+
# HookEvent name
|
12
|
+
attr_threadsafe :name
|
12
13
|
|
13
14
|
# HookEvent type
|
14
15
|
attr_threadsafe :type
|
@@ -19,13 +20,50 @@ module FiniteMachine
|
|
19
20
|
# Transition associated with the event
|
20
21
|
attr_threadsafe :transition
|
21
22
|
|
22
|
-
|
23
|
-
|
23
|
+
# Instantiate a new HookEvent object
|
24
|
+
#
|
25
|
+
# @param [Symbol] name
|
26
|
+
# The action or state name
|
27
|
+
# @param [FiniteMachine::Transition]
|
28
|
+
# The transition associated with this event.
|
29
|
+
# @param [Array[Object]] data
|
30
|
+
#
|
31
|
+
# @example
|
32
|
+
# HookEvent.new(:green, ...)
|
33
|
+
#
|
34
|
+
# @return [Object]
|
35
|
+
#
|
36
|
+
# @api public
|
37
|
+
def initialize(name, transition, *data)
|
38
|
+
@name = name
|
24
39
|
@transition = transition
|
25
|
-
@data
|
26
|
-
@type
|
40
|
+
@data = *data
|
41
|
+
@type = self.class
|
42
|
+
freeze
|
27
43
|
end
|
28
44
|
|
45
|
+
# Build event hook
|
46
|
+
#
|
47
|
+
# @param [Symbol] :state
|
48
|
+
# The state name.
|
49
|
+
# @param [FiniteMachine::Transition] :event_transition
|
50
|
+
# The transition associted with this hook.
|
51
|
+
# @param [Array[Object]] :data
|
52
|
+
# The data associated with this hook
|
53
|
+
#
|
54
|
+
# @return [self]
|
55
|
+
#
|
56
|
+
# @api public
|
57
|
+
def self.build(state, event_transition, *data)
|
58
|
+
state_or_action = self < Anystate ? state : event_transition.name
|
59
|
+
new(state_or_action, event_transition, *data)
|
60
|
+
end
|
61
|
+
|
62
|
+
# Notify subscriber about this event
|
63
|
+
#
|
64
|
+
# @return [nil]
|
65
|
+
#
|
66
|
+
# @api public
|
29
67
|
def notify(subscriber, *args, &block)
|
30
68
|
if subscriber.respond_to? MESSAGE
|
31
69
|
subscriber.public_send(MESSAGE, self, *args, &block)
|
@@ -48,13 +86,34 @@ module FiniteMachine
|
|
48
86
|
|
49
87
|
EVENTS = Anystate, Enter, Transition, Exit, Anyaction, Before, After
|
50
88
|
|
89
|
+
# Extract event name
|
90
|
+
#
|
91
|
+
# @return [String] the event name
|
92
|
+
#
|
93
|
+
# @api public
|
51
94
|
def self.event_name
|
52
95
|
name.split('::').last.downcase.to_sym
|
53
96
|
end
|
54
97
|
|
98
|
+
# String representation
|
99
|
+
#
|
100
|
+
# @return [String] the event name
|
101
|
+
#
|
102
|
+
# @api public
|
55
103
|
def self.to_s
|
56
|
-
event_name
|
104
|
+
event_name.to_s
|
105
|
+
end
|
106
|
+
|
107
|
+
# Compare whether the instance is greater, less then or equal to other
|
108
|
+
#
|
109
|
+
# @return [-1 0 1]
|
110
|
+
#
|
111
|
+
# @api public
|
112
|
+
def <=>(other)
|
113
|
+
other.is_a?(type) &&
|
114
|
+
[name, transition, data] <=> [other.name, other.transition, other.data]
|
57
115
|
end
|
116
|
+
alias_method :eql?, :==
|
58
117
|
|
59
118
|
EVENTS.each do |event|
|
60
119
|
(class << self; self; end).class_eval do
|
@@ -108,10 +108,10 @@ module FiniteMachine
|
|
108
108
|
def trigger(event, *args, &block)
|
109
109
|
sync_exclusive do
|
110
110
|
[event.type, ANY_EVENT].each do |event_type|
|
111
|
-
[event.
|
112
|
-
hooks.call(event_type,
|
111
|
+
[event.name, ANY_STATE].each do |event_name|
|
112
|
+
hooks.call(event_type, event_name) do |hook|
|
113
113
|
handle_callback(hook, event)
|
114
|
-
off(event_type,
|
114
|
+
off(event_type, event_name, &hook) if hook.is_a?(Once)
|
115
115
|
end
|
116
116
|
end
|
117
117
|
end
|
@@ -75,14 +75,22 @@ module FiniteMachine
|
|
75
75
|
end
|
76
76
|
|
77
77
|
# TODO: use trigger to actually fire state machine events!
|
78
|
-
# Notify about event
|
78
|
+
# Notify about event all the subscribers
|
79
|
+
#
|
80
|
+
# @param [FiniteMachine::HookEvent] :event_type
|
81
|
+
# The hook event type.
|
82
|
+
# @param [FiniteMachine::Transition] :event_transition
|
83
|
+
# The event transition.
|
84
|
+
# @param [Array[Object]] :data
|
85
|
+
# The data associated with the hook event.
|
86
|
+
#
|
87
|
+
# @return [nil]
|
79
88
|
#
|
80
89
|
# @api public
|
81
|
-
def notify(event_type,
|
90
|
+
def notify(event_type, event_transition, *data)
|
82
91
|
sync_shared do
|
83
|
-
|
84
|
-
|
85
|
-
subscribers.visit(_event)
|
92
|
+
hook_event = event_type.build(state, event_transition, *data)
|
93
|
+
subscribers.visit(hook_event)
|
86
94
|
end
|
87
95
|
end
|
88
96
|
|
@@ -177,7 +185,7 @@ module FiniteMachine
|
|
177
185
|
event = args.shift
|
178
186
|
valid_state = transitions[event].key?(current)
|
179
187
|
valid_state ||= transitions[event].key?(ANY_STATE)
|
180
|
-
valid_state
|
188
|
+
valid_state && events_chain.valid_event?(event, *args, &block)
|
181
189
|
end
|
182
190
|
|
183
191
|
# Checks if event cannot be triggered
|
@@ -199,7 +207,7 @@ module FiniteMachine
|
|
199
207
|
# @return [Boolean]
|
200
208
|
#
|
201
209
|
# @api public
|
202
|
-
def
|
210
|
+
def terminated?
|
203
211
|
is?(final_state)
|
204
212
|
end
|
205
213
|
|
@@ -230,47 +238,51 @@ module FiniteMachine
|
|
230
238
|
|
231
239
|
# Check if state is reachable
|
232
240
|
#
|
241
|
+
# @param [FiniteMachine::Transition]
|
242
|
+
#
|
243
|
+
# @return [Boolean]
|
244
|
+
#
|
233
245
|
# @api private
|
234
|
-
def valid_state?(
|
235
|
-
current_states = transitions[
|
246
|
+
def valid_state?(event_transition)
|
247
|
+
current_states = transitions[event_transition.name].keys
|
236
248
|
if !current_states.include?(state) && !current_states.include?(ANY_STATE)
|
237
249
|
exception = InvalidStateError
|
238
250
|
catch_error(exception) ||
|
239
|
-
|
251
|
+
fail(exception, "inappropriate current state '#{state}'")
|
240
252
|
true
|
241
253
|
end
|
242
254
|
end
|
243
255
|
|
244
256
|
# Performs transition
|
245
257
|
#
|
246
|
-
# @param [Transition]
|
258
|
+
# @param [Transition] event_transition
|
247
259
|
# @param [Array] args
|
248
260
|
#
|
249
261
|
# @return [Integer]
|
250
262
|
# the status code for the transition
|
251
263
|
#
|
252
264
|
# @api private
|
253
|
-
def transition(
|
265
|
+
def transition(event_transition, *args, &block)
|
254
266
|
sync_exclusive do
|
255
|
-
notify HookEvent::Before,
|
267
|
+
notify HookEvent::Before, event_transition, *args
|
256
268
|
|
257
|
-
return CANCELLED if valid_state?(
|
258
|
-
return CANCELLED unless
|
269
|
+
return CANCELLED if valid_state?(event_transition)
|
270
|
+
return CANCELLED unless event_transition.valid?(*args, &block)
|
259
271
|
|
260
|
-
notify HookEvent::Exit,
|
272
|
+
notify HookEvent::Exit, event_transition, *args
|
261
273
|
|
262
274
|
begin
|
263
|
-
|
275
|
+
event_transition.call(*args)
|
264
276
|
|
265
|
-
notify HookEvent::Transition,
|
277
|
+
notify HookEvent::Transition, event_transition, *args
|
266
278
|
rescue Exception => e
|
267
279
|
catch_error(e) || raise_transition_error(e)
|
268
280
|
end
|
269
281
|
|
270
|
-
notify HookEvent::Enter,
|
271
|
-
notify HookEvent::After,
|
282
|
+
notify HookEvent::Enter, event_transition, *args
|
283
|
+
notify HookEvent::After, event_transition, *args
|
272
284
|
|
273
|
-
|
285
|
+
event_transition.same?(state) ? NOTRANSITION : SUCCEEDED
|
274
286
|
end
|
275
287
|
end
|
276
288
|
|
@@ -287,7 +299,7 @@ module FiniteMachine
|
|
287
299
|
"occured at #{error.backtrace.join("\n")}")
|
288
300
|
end
|
289
301
|
|
290
|
-
# Forward the message to
|
302
|
+
# Forward the message to observer or self
|
291
303
|
#
|
292
304
|
# @param [String] method_name
|
293
305
|
#
|
@@ -297,9 +309,7 @@ module FiniteMachine
|
|
297
309
|
#
|
298
310
|
# @api private
|
299
311
|
def method_missing(method_name, *args, &block)
|
300
|
-
if
|
301
|
-
target.public_send(method_name.to_sym, *args, &block)
|
302
|
-
elsif observer.respond_to?(method_name.to_sym)
|
312
|
+
if observer.respond_to?(method_name.to_sym)
|
303
313
|
observer.public_send(method_name.to_sym, *args, &block)
|
304
314
|
else
|
305
315
|
super
|
@@ -316,9 +326,7 @@ module FiniteMachine
|
|
316
326
|
#
|
317
327
|
# @api private
|
318
328
|
def respond_to_missing?(method_name, include_private = false)
|
319
|
-
|
320
|
-
observer.respond_to?(method_name.to_sym) ||
|
321
|
-
super
|
329
|
+
observer.respond_to?(method_name.to_sym) || super
|
322
330
|
end
|
323
331
|
end # StateMachine
|
324
332
|
end # FiniteMachine
|
data/spec/spec_helper.rb
CHANGED
@@ -18,9 +18,9 @@ end
|
|
18
18
|
require 'finite_machine'
|
19
19
|
|
20
20
|
RSpec.configure do |config|
|
21
|
-
config.treat_symbols_as_metadata_keys_with_true_values = true
|
22
21
|
config.run_all_when_everything_filtered = true
|
23
22
|
config.filter_run :focus
|
23
|
+
config.raise_errors_for_deprecations!
|
24
24
|
|
25
25
|
# Run specs in random order to surface order dependencies. If you find an
|
26
26
|
# order dependency and want to debug it, you can fix the order by providing
|
@@ -30,7 +30,7 @@ RSpec.configure do |config|
|
|
30
30
|
|
31
31
|
# Remove defined constants
|
32
32
|
config.before :each do
|
33
|
-
[:Car, :Logger, :Bug, :User].each do |class_name|
|
33
|
+
[:Car, :Logger, :Bug, :User, :Engine].each do |class_name|
|
34
34
|
if Object.const_defined?(class_name)
|
35
35
|
Object.send(:remove_const, class_name)
|
36
36
|
end
|
data/spec/unit/callbacks_spec.rb
CHANGED
@@ -7,7 +7,7 @@ describe FiniteMachine, 'callbacks' do
|
|
7
7
|
it "triggers default init event" do
|
8
8
|
called = []
|
9
9
|
fsm = FiniteMachine.define do
|
10
|
-
initial
|
10
|
+
initial :green, defer: true, silent: false
|
11
11
|
|
12
12
|
callbacks {
|
13
13
|
# generic state callbacks
|
@@ -54,7 +54,7 @@ describe FiniteMachine, 'callbacks' do
|
|
54
54
|
it "executes callbacks in order" do
|
55
55
|
called = []
|
56
56
|
fsm = FiniteMachine.define do
|
57
|
-
initial
|
57
|
+
initial :green, silent: false
|
58
58
|
|
59
59
|
events {
|
60
60
|
event :slow, :green => :yellow
|
@@ -173,7 +173,7 @@ describe FiniteMachine, 'callbacks' do
|
|
173
173
|
it "maintains transition execution sequence from UML statechart" do
|
174
174
|
called = []
|
175
175
|
fsm = FiniteMachine.define do
|
176
|
-
initial
|
176
|
+
initial :previous, silent: false
|
177
177
|
|
178
178
|
events {
|
179
179
|
event :go, :previous => :next, if: -> { called << 'guard'; true}
|
@@ -207,7 +207,7 @@ describe FiniteMachine, 'callbacks' do
|
|
207
207
|
it "allows multiple callbacks for the same state" do
|
208
208
|
called = []
|
209
209
|
fsm = FiniteMachine.define do
|
210
|
-
initial
|
210
|
+
initial :green, silent: false
|
211
211
|
|
212
212
|
events {
|
213
213
|
event :slow, :green => :yellow
|
@@ -359,12 +359,12 @@ describe FiniteMachine, 'callbacks' do
|
|
359
359
|
expected = {name: :init, from: :none, to: :green, a: nil, b: nil, c: nil }
|
360
360
|
|
361
361
|
callback = Proc.new { |event, a, b, c|
|
362
|
-
expect(event.from).to eql(expected[:from])
|
363
|
-
expect(event.to).to eql(expected[:to])
|
364
|
-
expect(event.name).to eql(expected[:name])
|
365
|
-
expect(a).to eql(expected[:a])
|
366
|
-
expect(b).to eql(expected[:b])
|
367
|
-
expect(c).to eql(expected[:c])
|
362
|
+
target.expect(event.from).to target.eql(expected[:from])
|
363
|
+
target.expect(event.to).to target.eql(expected[:to])
|
364
|
+
target.expect(event.name).to target.eql(expected[:name])
|
365
|
+
target.expect(a).to target.eql(expected[:a])
|
366
|
+
target.expect(b).to target.eql(expected[:b])
|
367
|
+
target.expect(c).to target.eql(expected[:c])
|
368
368
|
}
|
369
369
|
context = self
|
370
370
|
|
@@ -435,7 +435,7 @@ describe FiniteMachine, 'callbacks' do
|
|
435
435
|
initial :green
|
436
436
|
|
437
437
|
events {
|
438
|
-
event :slow,
|
438
|
+
event :slow, :green => :yellow
|
439
439
|
}
|
440
440
|
|
441
441
|
callbacks {
|
@@ -458,7 +458,7 @@ describe FiniteMachine, 'callbacks' do
|
|
458
458
|
it "doesn't allow to mix event callback with state name" do
|
459
459
|
expect {
|
460
460
|
FiniteMachine.define do
|
461
|
-
events { event :slow,
|
461
|
+
events { event :slow, :green => :yellow }
|
462
462
|
|
463
463
|
callbacks { on_before_green do |event| end }
|
464
464
|
end
|
@@ -469,7 +469,7 @@ describe FiniteMachine, 'callbacks' do
|
|
469
469
|
fsm = FiniteMachine.define do
|
470
470
|
initial :green
|
471
471
|
|
472
|
-
events { event :slow,
|
472
|
+
events { event :slow, :green => :yellow }
|
473
473
|
|
474
474
|
callbacks { on_enter(:yellow) { raise RuntimeError } }
|
475
475
|
end
|
@@ -549,11 +549,11 @@ describe FiniteMachine, 'callbacks' do
|
|
549
549
|
it "triggers callbacks only once" do
|
550
550
|
called = []
|
551
551
|
fsm = FiniteMachine.define do
|
552
|
-
initial
|
552
|
+
initial :green, silent: false
|
553
553
|
|
554
554
|
events {
|
555
|
-
event :slow,
|
556
|
-
event :go,
|
555
|
+
event :slow, :green => :yellow
|
556
|
+
event :go, :yellow => :green
|
557
557
|
}
|
558
558
|
|
559
559
|
callbacks {
|
@@ -606,8 +606,8 @@ describe FiniteMachine, 'callbacks' do
|
|
606
606
|
initial :green
|
607
607
|
|
608
608
|
events {
|
609
|
-
event :slow,
|
610
|
-
event :go,
|
609
|
+
event :slow, :green => :yellow
|
610
|
+
event :go, :yellow => :green
|
611
611
|
}
|
612
612
|
|
613
613
|
callbacks {
|
@@ -625,8 +625,8 @@ describe FiniteMachine, 'callbacks' do
|
|
625
625
|
initial :green
|
626
626
|
|
627
627
|
events {
|
628
|
-
event :slow,
|
629
|
-
event :go,
|
628
|
+
event :slow, :green => :yellow
|
629
|
+
event :go, :yellow => :green
|
630
630
|
}
|
631
631
|
|
632
632
|
callbacks {
|
@@ -646,7 +646,7 @@ describe FiniteMachine, 'callbacks' do
|
|
646
646
|
it "groups states from separate events with the same name" do
|
647
647
|
callbacks = []
|
648
648
|
fsm = FiniteMachine.define do
|
649
|
-
initial
|
649
|
+
initial :initial, silent: false
|
650
650
|
|
651
651
|
events {
|
652
652
|
event :bump, :initial => :low
|
@@ -720,7 +720,7 @@ describe FiniteMachine, 'callbacks' do
|
|
720
720
|
it "groups states under event name" do
|
721
721
|
callbacks = []
|
722
722
|
fsm = FiniteMachine.define do
|
723
|
-
initial
|
723
|
+
initial :initial, silent: false
|
724
724
|
|
725
725
|
events {
|
726
726
|
event :bump, :initial => :low,
|
@@ -770,7 +770,7 @@ describe FiniteMachine, 'callbacks' do
|
|
770
770
|
it "permits state and event with the same name" do
|
771
771
|
called = []
|
772
772
|
fsm = FiniteMachine.define do
|
773
|
-
initial
|
773
|
+
initial :on_hook, silent: false
|
774
774
|
|
775
775
|
events {
|
776
776
|
event :off_hook, :on_hook => :off_hook
|