require 'helper'

class DrivingInstructor
  def self.applause!
  end
end

class DrivingSchoolCar
  include Transitions

  state_machine do
    state :parked
    state :running
    state :driving
    state :switched_off

    event :start_driving, success: ->(_car) { DrivingInstructor.applause! } do
      transitions from: :parked, to: :driving, on_transition: [:start_engine, :loosen_handbrake, :push_gas_pedal]
    end

    event :switch_off_engine do
      transitions from: :parked, to: :switched_off
    end
  end

  %w(start_engine loosen_handbrake push_gas_pedal).each do |m|
    define_method(m) {}
  end
end

class TestStateTransitionSuccessCallback < Test::Unit::TestCase
  def setup
    @car = DrivingSchoolCar.new
  end

  test 'should execute the success callback after successfull event execution' do
    DrivingInstructor.expects(:applause!)

    @car.start_driving!
  end

  test 'should not execute the success callback after event execution failed' do
    DrivingInstructor.expects(:applause!).never

    @car.stubs(:event_failed)
    @car.expects(:loosen_handbrake).raises('Drive with handbrake fail!')
    @car.start_driving!
  end
end
