Sha256: 336f04623b29026aa5bfbcf61b8ad143cefad89eef13fdb010b51ead317caea7

Contents?: true

Size: 1.77 KB

Versions: 3

Compression:

Stored size: 1.77 KB

Contents

module Caricature

  # A base class to encapsulate method invocation
  class Messenger

    # the real instance of the isolated subject
    # used to forward calls in partial mocks
    attr_reader :instance

    # the expecations that have been set for the isolation
    attr_reader :expectations

    # creates a new instance of this messaging strategy
    def initialize(expectations, instance=nil)
      @instance, @expectations = instance, expectations
    end

    # deliver the message to the receiving isolation
    def deliver(method_name, return_type, *args, &b)
      
      internal_deliver(:instance, method_name, return_type, *args, &b)
    end

    # deliver the message to class of the receiving isolation
    def deliver_to_class(method_name, return_type, *args, &b)
      internal_deliver(:class, method_name, return_type, *args, &b)
    end

    protected

      # template method for looking up the expectation and/or returning a value
      def internal_deliver(mode, method_name, return_type, *args, &b)
        raise NotImplementedError.new("Override in an implementing class")
      end

  end

  # Encapsulates sending messages to Ruby isolations
  class RubyMessenger < Messenger

    protected

      # implementation of the template method for looking up the expectation and/or returning a value
      def internal_deliver(mode, method_name, return_type, *args, &b)
        exp = expectations.find(method_name, mode, *args)
        if exp
          res = instance.__send__(method_name, *args, &b) if exp.super_before?
          res = exp.execute *args
          res = instance.__send__(method_name, *args, &b) if !exp.super_before? and exp.call_super?
          res
        else
          nil
        end
      end

  end

end

Version data entries

3 entries across 3 versions & 2 rubygems

Version Path
casualjim-caricature-0.6.1 lib/caricature/messenger.rb
caricature-0.6.3 lib/caricature/messenger.rb
caricature-0.6.1 lib/caricature/messenger.rb