spec/unit/choice_spec.rb in finite_machine-0.9.1 vs spec/unit/choice_spec.rb in finite_machine-0.9.2

- old
+ new

@@ -182,6 +182,82 @@ fsm.next expect(fsm.current).to eq(:yellow) fsm.next expect(fsm.current).to eq(:green) end + + it "sets callback properties correctly" do + expected = {name: :init, from: :none, to: :red, a: nil, b: nil, c: nil } + + callback = Proc.new { |event, a, b, c| + target.expect(event.from).to target.eql(expected[:from]) + target.expect(event.to).to target.eql(expected[:to]) + target.expect(event.name).to target.eql(expected[:name]) + target.expect(a).to target.eql(expected[:a]) + target.expect(b).to target.eql(expected[:b]) + target.expect(c).to target.eql(expected[:c]) + } + + context = self + + fsm = FiniteMachine.define do + initial :red + + target context + + events { + event :next, from: :red do + choice :green, if: -> { false } + choice :yellow + end + + event :next, from: :yellow do + choice :green, if: -> { true } + choice :yellow + end + + event :finish, from: :any do + choice :green, if: -> { false } + choice :red + end + } + + callbacks { + # generic state callbacks + on_enter(&callback) + on_transition(&callback) + on_exit(&callback) + + # generic event callbacks + on_before(&callback) + on_after(&callback) + + # state callbacks + on_enter :green, &callback + on_enter :yellow, &callback + on_enter :red, &callback + + on_transition :green, &callback + on_transition :yellow, &callback + on_transition :red, &callback + + on_exit :green, &callback + on_exit :yellow, &callback + on_exit :red, &callback + + # event callbacks + on_before :next, &callback + on_after :next, &callback + } + end + expect(fsm.current).to eq(:red) + + expected = {name: :next, from: :red, to: :yellow, a: 1, b: 2, c: 3} + fsm.next(1, 2, 3) + + expected = {name: :next, from: :yellow, to: :green, a: 4, b: 5, c: 6} + fsm.next(4, 5, 6) + + expected = {name: :finish, from: :green, to: :red, a: 7, b: 8, c: 9} + fsm.finish(7, 8, 9) + end end