File: path_collection_test.rb

package info (click to toggle)
ruby-state-machine 1.2.0-2
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 3,764 kB
  • ctags: 6,623
  • sloc: ruby: 26,008; makefile: 11
file content (266 lines) | stat: -rw-r--r-- 7,765 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
require File.expand_path(File.dirname(__FILE__) + '/../test_helper')

class PathCollectionByDefaultTest < Test::Unit::TestCase
  def setup
    @klass = Class.new
    @machine = StateMachine::Machine.new(@klass)
    @machine.state :parked
    
    @object = @klass.new
    @object.state = 'parked'
    
    @paths = StateMachine::PathCollection.new(@object, @machine)
  end
  
  def test_should_have_an_object
    assert_equal @object, @paths.object
  end
  
  def test_should_have_a_machine
    assert_equal @machine, @paths.machine
  end
  
  def test_should_have_a_from_name
    assert_equal :parked, @paths.from_name
  end
  
  def test_should_not_have_a_to_name
    assert_nil @paths.to_name
  end
  
  def test_should_have_no_from_states
    assert_equal [], @paths.from_states
  end
  
  def test_should_have_no_to_states
    assert_equal [], @paths.to_states
  end
  
  def test_should_have_no_events
    assert_equal [], @paths.events
  end
  
  def test_should_have_no_paths
    assert @paths.empty?
  end
end

class PathCollectionTest < Test::Unit::TestCase
  def setup
    @klass = Class.new
    @machine = StateMachine::Machine.new(@klass)
    @object = @klass.new
  end
  
  def test_should_raise_exception_if_invalid_option_specified
    exception = assert_raise(ArgumentError) {StateMachine::PathCollection.new(@object, @machine, :invalid => true)}
    assert_equal 'Invalid key(s): invalid', exception.message
  end
  
  def test_should_raise_exception_if_invalid_from_state_specified
    exception = assert_raise(IndexError) {StateMachine::PathCollection.new(@object, @machine, :from => :invalid)}
    assert_equal ':invalid is an invalid name', exception.message
  end
  
  def test_should_raise_exception_if_invalid_to_state_specified
    exception = assert_raise(IndexError) {StateMachine::PathCollection.new(@object, @machine, :to => :invalid)}
    assert_equal ':invalid is an invalid name', exception.message
  end
end

class PathCollectionWithPathsTest < Test::Unit::TestCase
  def setup
    @klass = Class.new
    @machine = StateMachine::Machine.new(@klass)
    @machine.state :parked, :idling, :first_gear
    @machine.event :ignite do
      transition :parked => :idling
    end
    @machine.event :shift_up do
      transition :idling => :first_gear
    end
    
    @object = @klass.new
    @object.state = 'parked'
    
    @paths = StateMachine::PathCollection.new(@object, @machine)
  end
  
  def test_should_enumerate_paths
    assert_equal [[
      StateMachine::Transition.new(@object, @machine, :ignite, :parked, :idling),
      StateMachine::Transition.new(@object, @machine, :shift_up, :idling, :first_gear)
    ]], @paths
  end
  
  def test_should_have_a_from_name
    assert_equal :parked, @paths.from_name
  end
  
  def test_should_not_have_a_to_name
    assert_nil @paths.to_name
  end
  
  def test_should_have_from_states
    assert_equal [:parked, :idling], @paths.from_states
  end
  
  def test_should_have_to_states
    assert_equal [:idling, :first_gear], @paths.to_states
  end
  
  def test_should_have_no_events
    assert_equal [:ignite, :shift_up], @paths.events
  end
end

class PathWithGuardedPathsTest < Test::Unit::TestCase
  def setup
    @klass = Class.new
    @machine = StateMachine::Machine.new(@klass)
    @machine.state :parked, :idling, :first_gear
    @machine.event :ignite do
      transition :parked => :idling, :if => lambda {false}
    end
    
    @object = @klass.new
    @object.state = 'parked'
  end
  
  def test_should_not_enumerate_paths_if_guard_enabled
    assert_equal [], StateMachine::PathCollection.new(@object, @machine)
  end
  
  def test_should_enumerate_paths_if_guard_disabled
    paths = StateMachine::PathCollection.new(@object, @machine, :guard => false)
    assert_equal [[
      StateMachine::Transition.new(@object, @machine, :ignite, :parked, :idling)
    ]], paths
  end
end

class PathCollectionWithDuplicateNodesTest < Test::Unit::TestCase
  def setup
    @klass = Class.new
    @machine = StateMachine::Machine.new(@klass)
    @machine.state :parked, :idling
    @machine.event :shift_up do
      transition :parked => :idling, :idling => :first_gear
    end
    @machine.event :park do
      transition :first_gear => :idling
    end
    @object = @klass.new
    @object.state = 'parked'
    
    @paths = StateMachine::PathCollection.new(@object, @machine)
  end
  
  def test_should_not_include_duplicates_in_from_states
    assert_equal [:parked, :idling, :first_gear], @paths.from_states
  end
  
  def test_should_not_include_duplicates_in_to_states
    assert_equal [:idling, :first_gear], @paths.to_states
  end
  
  def test_should_not_include_duplicates_in_events
    assert_equal [:shift_up, :park], @paths.events
  end
end

class PathCollectionWithFromStateTest < Test::Unit::TestCase
  def setup
    @klass = Class.new
    @machine = StateMachine::Machine.new(@klass)
    @machine.state :parked, :idling, :first_gear
    @machine.event :park do
      transition :idling => :parked
    end
    
    @object = @klass.new
    @object.state = 'parked'
    
    @paths = StateMachine::PathCollection.new(@object, @machine, :from => :idling)
  end
  
  def test_should_generate_paths_from_custom_from_state
    assert_equal [[
      StateMachine::Transition.new(@object, @machine, :park, :idling, :parked)
    ]], @paths
  end
  
  def test_should_have_a_from_name
    assert_equal :idling, @paths.from_name
  end
end

class PathCollectionWithToStateTest < Test::Unit::TestCase
  def setup
    @klass = Class.new
    @machine = StateMachine::Machine.new(@klass)
    @machine.state :parked, :idling
    @machine.event :ignite do
      transition :parked => :idling
    end
    @machine.event :shift_up do
      transition :parked => :idling, :idling => :first_gear
    end
    @machine.event :shift_down do
      transition :first_gear => :idling
    end
    @object = @klass.new
    @object.state = 'parked'
    
    @paths = StateMachine::PathCollection.new(@object, @machine, :to => :idling)
  end
  
  def test_should_stop_paths_once_target_state_reached
    assert_equal [
      [StateMachine::Transition.new(@object, @machine, :ignite, :parked, :idling)],
      [StateMachine::Transition.new(@object, @machine, :shift_up, :parked, :idling)]
    ], @paths
  end
end

class PathCollectionWithDeepPathsTest < Test::Unit::TestCase
  def setup
    @klass = Class.new
    @machine = StateMachine::Machine.new(@klass)
    @machine.state :parked, :idling
    @machine.event :ignite do
      transition :parked => :idling
    end
    @machine.event :shift_up do
      transition :parked => :idling, :idling => :first_gear
    end
    @machine.event :shift_down do
      transition :first_gear => :idling
    end
    @object = @klass.new
    @object.state = 'parked'
    
    @paths = StateMachine::PathCollection.new(@object, @machine, :to => :idling, :deep => true)
  end
  
  def test_should_allow_target_to_be_reached_more_than_once_per_path
    assert_equal [
      [
        StateMachine::Transition.new(@object, @machine, :ignite, :parked, :idling)
      ],
      [
        StateMachine::Transition.new(@object, @machine, :ignite, :parked, :idling),
        StateMachine::Transition.new(@object, @machine, :shift_up, :idling, :first_gear),
        StateMachine::Transition.new(@object, @machine, :shift_down, :first_gear, :idling)
      ],
      [
        StateMachine::Transition.new(@object, @machine, :shift_up, :parked, :idling)
      ],
      [
        StateMachine::Transition.new(@object, @machine, :shift_up, :parked, :idling),
        StateMachine::Transition.new(@object, @machine, :shift_up, :idling, :first_gear),
        StateMachine::Transition.new(@object, @machine, :shift_down, :first_gear, :idling)
      ]
    ], @paths
  end
end