Sha256: 51e6cc5bae5454ea10b3f3e92eeabac86a7d85f3fedfa0851f83891f31e89663

Contents?: true

Size: 1.48 KB

Versions: 2

Compression:

Stored size: 1.48 KB

Contents

module Spec
  module Matchers
    class Matcher
      def initialize(name, expected=nil, &block_passed_to_init)
        @name = name
        @expected = expected
        @block = block_passed_to_init
        @messages = {
          :description => lambda {"#{name_to_sentence} #{expected}"},
          :failure_message_for_should => lambda {|actual| "expected #{actual} to #{name_to_sentence} #{expected}"},
          :failure_message_for_should_not => lambda {|actual| "expected #{actual} not to #{name_to_sentence} #{expected}"}
        }
      end
      
      def matches?(actual)
        @actual = actual
        instance_exec @expected, &@block
        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
      
    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
        @name_to_sentence ||= @name.to_s.gsub(/_/,' ')
      end
    
    end
  end
end

Version data entries

2 entries across 2 versions & 2 rubygems

Version Path
dchelimsky-rspec-1.1.99.13 lib/spec/matchers/matcher.rb
rspec-1.2.0 lib/spec/matchers/matcher.rb