Sha256: 0ad86ec188d0439509ac43a399265023382a58452985508f979af99c8e65bc11

Contents?: true

Size: 1.51 KB

Versions: 1

Compression:

Stored size: 1.51 KB

Contents

module Bogus
  class Shadow
    attr_reader :calls

    def initialize
      @calls = []
      @stubs = []
      @defaults = {}
      @required = Set.new
    end

    def run(method_name, *args)
      interaction = Interaction.new(method_name, args)
      @calls << interaction
      return_value(interaction)
    end

    def has_received(name, args)
      @calls.include?(Interaction.new(name, args))
    end

    def stubs(name, *args, &return_value)
      interaction = Interaction.new(name, args)
      add_stub(interaction, return_value)
      override_default(interaction, return_value)
      @required.delete(interaction)
      interaction
    end

    def mocks(name, *args, &return_value)
      interaction = stubs(name, *args, &return_value)
      @required.add(interaction)
    end

    def unsatisfied_interactions
      @required.reject { |i| @calls.include?(i) }
    end

    def self.has_shadow?(object)
      object.respond_to?(:__shadow__)
    end

    private

    def override_default(interaction, return_value)
      return unless interaction.any_args?
      @defaults[interaction.method] = return_value || proc{nil}
    end

    def add_stub(interaction, return_value_block)
      @stubs << [interaction, return_value_block] if return_value_block
    end

    def return_value(interaction)
      _, return_value = @stubs.reverse.find{|i, v| i == interaction}
      return_value ||= @defaults[interaction.method]
      return_value ||= proc{ UndefinedReturnValue.new(interaction) }
      return_value.call
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
bogus-0.1.0 lib/bogus/shadow.rb