Sha256: 2cb947748f7533e5ab118d518ef5a83e2647c488b6f12abf8f2feb4eed4b9b56

Contents?: true

Size: 1.77 KB

Versions: 4

Compression:

Stored size: 1.77 KB

Contents

module Spec
  module Matchers
    class Matcher
      include Spec::Matchers::Pretty
      
      attr_reader :expected, :actual
      
      def initialize(name, *expected, &declarations)
        @name = name
        @expected = expected
        @declarations = declarations
        @diffable = false
        @messages = {
          :description => lambda {"#{name_to_sentence}#{expected_to_sentence}"},
          :failure_message_for_should => lambda {|actual| "expected #{actual.inspect} to #{name_to_sentence}#{expected_to_sentence}"},
          :failure_message_for_should_not => lambda {|actual| "expected #{actual.inspect} not to #{name_to_sentence}#{expected_to_sentence}"}
        }
      end
      
      def matches?(actual)
        @actual = actual
        instance_exec(*@expected, &@declarations)
        instance_exec(@actual,    &@match_block)
      end
      
      def description(&block)
        cache_or_call_cached(:description, &block)
      end
      
      def failure_message_for_should(&block)
        cache_or_call_cached(:failure_message_for_should, @actual, &block)
      end
      
      def failure_message_for_should_not(&block)
        cache_or_call_cached(:failure_message_for_should_not, @actual, &block)
      end
      
      def match(&block)
        @match_block = block
      end
      
      def diffable?
        @diffable
      end
      
      def diffable
        @diffable = true
      end
      
    private

      def cache_or_call_cached(key, actual=nil, &block)
        block ? @messages[key] = block : 
                actual.nil? ? @messages[key].call : @messages[key].call(actual)
      end
    
      def name_to_sentence
        split_words(@name)
      end
      
      def expected_to_sentence
        to_sentence(@expected)
      end
    
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
rspec-1.2.3 lib/spec/matchers/matcher.rb
rspec-1.2.4 lib/spec/matchers/matcher.rb
rspec-1.2.5 lib/spec/matchers/matcher.rb
rspec-1.2.6 lib/spec/matchers/matcher.rb