File: shadow.rb

package info (click to toggle)
ruby-bogus 0.1.5-3
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 828 kB
  • ctags: 628
  • sloc: ruby: 4,124; makefile: 6; sh: 2
file content (57 lines) | stat: -rw-r--r-- 1,491 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
module Bogus
  class Shadow
    attr_reader :calls

    def initialize
      @calls = []
      @stubs = []
      @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.any? { |i| Interaction.same?(recorded: i, stubbed: Interaction.new(name, args)) }
    end

    def stubs(name, *args, &return_value)
      interaction = Interaction.new(name, args)
      add_stub(interaction, return_value)
      @required.reject! { |i| Interaction.same?(recorded: i, stubbed: interaction) }
      interaction
    end

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

    def unsatisfied_interactions
      @required.reject do |stubbed|
        @calls.any? do |recorded|
          Interaction.same?(recorded: recorded, stubbed: stubbed)
        end
      end
    end

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

    private

    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| Interaction.same?(recorded: interaction, stubbed: i)}
      return_value ||= proc{ UndefinedReturnValue.new(interaction) }
      return_value.call
    end
  end
end