Sha256: e59b64a1b5f838872005d899ae18bb99e61404dfb1dc88063b3177ebbb900bd6

Contents?: true

Size: 1.44 KB

Versions: 3

Compression:

Stored size: 1.44 KB

Contents

module Matchy
  module Expectations
    # Class to handle operator expectations.
    #
    # ==== Examples
    #   
    #   13.should == 13
    #   "hello".length.should_not == 2
    #
    class OperatorExpectation #< Base
      include Matchy.assertions_module
           
      def initialize(receiver, match)
        @receiver, @match = receiver, match
      end
      
      ['==', '===', '=~', '>', '>=', '<', '<='].each do |op|
        define_method(op) do |expected|
          @expected = expected
          (@receiver.send(op,expected) ? true : false) == @match ? pass! : fail!(op)
        end
      end
      
      protected
      def pass!
        defined?($current_test_case) ? $current_test_case.assert(true) : (assert true)
      end
      
      def fail!(operator)
        flunk @match ? failure_message(operator) : negative_failure_message(operator)
      end
      
      def failure_message(operator)
        out = "Expected #{@receiver.inspect} to #{operator} #{@expected.inspect}"
        if Hash === @receiver && Hash === @expected
          # Hash#diff, from ActiveSupport
          diff = @receiver.dup.delete_if { |k, v| @expected[k] == v }.merge(@expected.dup.delete_if { |k, v| @receiver.has_key?(k) })
          out += " (diff: #{diff.inspect})"
        end
        out += "."
      end
      
      def negative_failure_message(operator)
        "Expected #{@receiver.inspect} to not #{operator} #{@expected.inspect}."
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
mcmire-matchy-0.5.2 lib/matchy/built_in/operator_expectations.rb
mcmire-matchy-0.5.1 lib/matchy/built_in/operator_expectations.rb
mcmire-matchy-0.5.0 lib/matchy/built_in/operator_expectations.rb