Sha256: cff066cc62a9553f9e92983a66549601521e1e0d351eb2a530226c6da2d90eae

Contents?: true

Size: 1.2 KB

Versions: 1

Compression:

Stored size: 1.2 KB

Contents

require 'quarry/assert'

module Quarry

  # Quarry's Mocking facility.
  #
  #   obj = "hello"
  #
  #   obj.mock.upcase == "HeLLo"
  #
  #   obj.upcase  #=> "HeLLo"
  #
  #   obj.mockless!
  #
  #   obj.upcase  #=> "HELLO"
  #
  class Mock < Module
    attr :object

    def initialize(object)
      super()
      @object = object
      @table  = {}
      object.extend(self)
    end

    def __table__ ; @table ; end

    def method_missing(meth, *args, &block)
      table     = @table
      interface = [meth, args, block_given?]

      table[interface] = nil

      define_method(meth) do |*args|
        result = super
        result.assert == table[interface]
        return result
      end

      Setter.new(table, interface)
    end

    #
    class Setter
      def initialize(table, interface)
        @table     = table
        @interface = interface
      end

      def ==(result)
        @table[@interface] = result
      end
    end

  end

  #
  class ::Object

    def mock
      @_mock ||= Mock.new(self)
    end

    def mockless!
      mock.__table__.each do |interface, result|
        meth = interface[0]
        mock.module_eval do
          remove_method(meth)
        end
      end
    end

  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
quarry-0.4.0 work/deprecated/mock/mock.0.rb