Sha256: 3697b36a84d4ff6a3d0c3e23e4bb8ad364e570be1138cb9c070effd441c2ae27

Contents?: true

Size: 1.46 KB

Versions: 3

Compression:

Stored size: 1.46 KB

Contents

# frozen_string_literal: true

class FailHandlingStateMachine
  class Error < StandardError; end
  class RunError < StandardError; end

  include SimplyFSM

  state_machine :activity, fail: :on_any_fail do
    state :sleeping, initial: true
    state :running
    state :cleaning

    event :sleep, transition: { from: %i[running cleaning], to: :sleeping }
    event :clean, transition: { from: :running, to: :cleaning }
    event :run,
          fail: ->(_event) { raise RunError, "Cannot run" },
          transition: { from: :sleeping, to: :running }
  end

  def on_any_fail(event_name)
    raise Error, "Cannot do: #{event_name}"
  end
end

RSpec.describe FailHandlingStateMachine do
  describe "#sleep" do
    it "error if already sleeping" do
      expect { subject.sleep }.to raise_error(FailHandlingStateMachine::Error)
    end
  end

  describe "#run" do
    it "custom error if already running" do
      subject.run
      expect { subject.run }.to raise_error(FailHandlingStateMachine::RunError)
    end

    it "custom error if cleaning" do
      subject.run
      subject.clean
      expect { subject.run }.to raise_error(FailHandlingStateMachine::RunError)
    end
  end

  describe "#clean" do
    it "error if sleeping" do
      expect { subject.clean }.to raise_error(FailHandlingStateMachine::Error)
    end

    it "error if already cleaning" do
      subject.run
      subject.clean
      expect { subject.clean }.to raise_error(FailHandlingStateMachine::Error)
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
simply_fsm-0.1.2 spec/unit/fail_events_spec.rb
simply_fsm-0.1.1 spec/unit/fail_events_spec.rb
simply_fsm-0.1.0 spec/unit/fail_events_spec.rb