lib/rr/expectations/argument_equality_expectation.rb
module RR module Expectations class ArgumentEqualityExpectation #:nodoc: def self.recursive_safe_eq(arg1, arg2) if arg1.respond_to?(:'__rr__original_==') arg1.__send__(:'__rr__original_==', arg2) else arg1 == arg2 end end attr_reader :expected_arguments attr_reader :expected_keyword_arguments def initialize(expected_arguments, expected_keyword_arguments) @expected_arguments = expected_arguments @expected_keyword_arguments = expected_keyword_arguments end def exact_match?(arguments, keyword_arguments) return false unless arguments.length == expected_arguments.length arguments.each_with_index do |arg, index| expected_arg = expected_arguments[index] return false unless self.class.recursive_safe_eq(expected_arg, arg) end keywords = keyword_arguments.keys expected_keywords = expected_keyword_arguments.keys unless keywords.length == expected_keywords.length return false end keywords.each do |keyword| keyword_argument = keyword_arguments[keyword] expected_keyword_argument = expected_keyword_arguments[keyword] unless self.class.recursive_safe_eq(expected_keyword_argument, keyword_argument) return false end end true end def wildcard_match?(arguments, keyword_arguments) return false unless arguments.length == expected_arguments.length arguments.each_with_index do |arg, index| expected_argument = expected_arguments[index] if expected_argument.respond_to?(:wildcard_match?) return false unless expected_argument.wildcard_match?(arg) else return false unless self.class.recursive_safe_eq(expected_argument, arg) end end keywords = keyword_arguments.keys expected_keywords = expected_keyword_arguments.keys unless keywords.length == expected_keywords.length return false end keywords.each do |keyword| keyword_argument = keyword_arguments[keyword] expected_keyword_argument = expected_keyword_arguments[keyword] if expected_keyword_argument.respond_to?(:wildcard_match?) unless expected_keyword_argument.wildcard_match?(keyword_argument) return false end else unless self.class.recursive_safe_eq(expected_keyword_argument, keyword_argument) return false end end end true end def ==(other) other.is_a?(self.class) and expected_arguments == other.expected_arguments and expected_keyword_arguments == other.expected_keyword_arguments end end end end