end_state 0.0.1 → 0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fd9f6c8fbf5f8ec9fd075dabbd2011aa51420465
4
- data.tar.gz: 12ba88eafad32a520b119756773f723482054536
3
+ metadata.gz: 809272ea728fbfd921f3cf13974883104447861e
4
+ data.tar.gz: 9660e13251dccad1d37fa22c5e5bfdf7cbe917ad
5
5
  SHA512:
6
- metadata.gz: 569f287932d9c85bb81ff72bfba03e8c5d78d1ea03d492a2ba8379213f794e5fe12f445ee13eab17036c775789a9a88c4525256b71738ca07601c48850c6ea9d
7
- data.tar.gz: 497920437e5eea536f63249ffe9bf84875793ab2e39c276cbf1d56e627953a90a05967500acb503f03802b3ad115d5bc4d680f7e528e51052a89c9eb6cd21681
6
+ metadata.gz: 6f452a250ae2e681e53b79902312903ab8a98ad19c2cf37d72748af0208f6405170cb8b1470c96b6ce7e0e6ef84bfd04f424af9d5bea60633a789758c0c132a0
7
+ data.tar.gz: 3103761a9adc01570e0d4788a961dc594d72b706eacc34f99a69d15e1a5df52c4a3aa64ba3035140840a63a60de3dd42941990669152f667ab80a8409790fba9
data/README.md CHANGED
@@ -193,6 +193,29 @@ transition to the new state.
193
193
  You also have the option to use `transition!` which will instead raise an error for failures. If your guards and/or finalizers
194
194
  add to the `failure_messages` array then they will be included in the error message.
195
195
 
196
+ ## Testing
197
+
198
+ Included is a custom RSpec matcher for testing your machines.
199
+
200
+ In your `spec_helper.rb` add:
201
+
202
+ ```ruby
203
+ require 'end_state_matchers'
204
+ ```
205
+
206
+ In the spec for your state machine:
207
+
208
+ ```ruby
209
+ describe Machine do
210
+ specify { expect(Machine).to have_transition(a: :b).with_guard(MyGuard) }
211
+ specify { expect(Machine).to have_transition(a: :b).with_finalizer(MyFinalizer) }
212
+ specify { expect(Machine).to have_transition(a: :b).with_guard(MyGuard).with_finalizer(MyFinalizer) }
213
+ specify { expect(Machine).to have_transition(a: :b).with_guards(MyGuard, AnotherGuard) }
214
+ specify { expect(Machine).to have_transition(a: :b).with_finalizers(MyFinalizer, AnotherFinalizer) }
215
+ specify { expect(Machine).not_to have_transition(a: :c) }
216
+ end
217
+ ```
218
+
196
219
  ## Contributing
197
220
 
198
221
  1. Fork it ( https://github.com/Originate/end_state/fork )
@@ -0,0 +1,28 @@
1
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
+ require 'end_state'
3
+ require 'end_state_matchers'
4
+
5
+ class Easy < EndState::Guard
6
+ def will_allow?
7
+ true
8
+ end
9
+ end
10
+
11
+ class NoOp < EndState::Finalizer
12
+ def call
13
+ true
14
+ end
15
+ end
16
+
17
+ class Machine < EndState::StateMachine
18
+ transition a: :b do |t|
19
+ t.guard Easy
20
+ t.finalizer NoOp
21
+ end
22
+ end
23
+
24
+ describe Machine do
25
+ specify { expect(Machine).to have_transition(a: :b).with_guard(Easy).with_finalizer(NoOp) }
26
+ specify { expect(Machine).to have_transition(a: :b).with_guards(Easy, Easy).with_finalizers(NoOp, NoOp) }
27
+ specify { expect(Machine).not_to have_transition(a: :c) }
28
+ end
@@ -1,3 +1,3 @@
1
1
  module EndState
2
- VERSION = "0.0.1"
2
+ VERSION = '0.0.2'
3
3
  end
@@ -0,0 +1,87 @@
1
+ module EndStateMatchers
2
+ def have_transition(transition)
3
+ TransitionMatcher.new(transition)
4
+ end
5
+
6
+ class TransitionMatcher
7
+ attr_reader :transition, :machine, :failure_messages, :guards, :finalizers
8
+
9
+ def initialize(transition)
10
+ @transition = transition
11
+ @failure_messages = []
12
+ @guards = []
13
+ @finalizers = []
14
+ end
15
+
16
+ def matches?(actual)
17
+ @machine = actual
18
+ verify
19
+ end
20
+
21
+ def failure_message
22
+ failure_messages.join("\n")
23
+ end
24
+
25
+ def description
26
+ "have transition :#{transition.keys.first} => :#{transition.values.first}"
27
+ end
28
+
29
+ def with_guard(guard)
30
+ @guards << guard
31
+ self
32
+ end
33
+
34
+ def with_guards(*guards)
35
+ @guards += Array(guards)
36
+ self
37
+ end
38
+
39
+ def with_finalizer(finalizer)
40
+ @finalizers << finalizer
41
+ self
42
+ end
43
+
44
+ def with_finalizers(*finalizers)
45
+ @finalizers += Array(finalizers)
46
+ self
47
+ end
48
+
49
+ private
50
+
51
+ def verify
52
+ result = true
53
+ if machine.transitions.keys.include? transition
54
+ result = (result && verify_guards) if guards.any?
55
+ result = (result && verify_finalizers) if finalizers.any?
56
+ result
57
+ else
58
+ failure_messages << "expected that #{machine.name} would have transition :#{transition.keys.first} => :#{transition.values.first}"
59
+ false
60
+ end
61
+ end
62
+
63
+ def verify_guards
64
+ result = true
65
+ guards.each do |guard|
66
+ unless machine.transitions[transition].guards.any? { |g| g[:guard] == guard }
67
+ failure_messages << "expected that transition :#{transition.keys.first} => :#{transition.values.first} would have guard #{guard.name}"
68
+ result = false
69
+ end
70
+ end
71
+ result
72
+ end
73
+
74
+ def verify_finalizers
75
+ result = true
76
+ finalizers.each do |finalizer|
77
+ unless machine.transitions[transition].finalizers.any? { |f| f[:finalizer] == finalizer }
78
+ failure_messages << "expected that transition :#{transition.keys.first} => :#{transition.values.first} would have finalizer #{finalizer.name}"
79
+ result = false
80
+ end
81
+ end
82
+ result
83
+ end
84
+ end
85
+ end
86
+
87
+ include EndStateMatchers
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: end_state
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - alexpeachey
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-16 00:00:00.000000000 Z
11
+ date: 2014-04-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -84,6 +84,7 @@ files:
84
84
  - Rakefile
85
85
  - end_state.gemspec
86
86
  - examples/example1.rb
87
+ - examples/machine_spec.rb
87
88
  - lib/end_state.rb
88
89
  - lib/end_state/action.rb
89
90
  - lib/end_state/errors.rb
@@ -94,6 +95,7 @@ files:
94
95
  - lib/end_state/state_machine.rb
95
96
  - lib/end_state/transition.rb
96
97
  - lib/end_state/version.rb
98
+ - lib/end_state_matchers.rb
97
99
  - spec/end_state/action_spec.rb
98
100
  - spec/end_state/finalizers/persistence_spec.rb
99
101
  - spec/end_state/state_machine_spec.rb