class RSpec::JsonMatcher::AbstractComparer

Attributes

actual[R]
expected[R]
reason[R]

Public Class Methods

compare(*args, &reason) click to toggle source
# File lib/rspec/json_matcher/abstract_comparer.rb, line 6
def self.compare(*args, &reason)
  new(*args, &reason).compare
end
extract_keys(array_or_hash) click to toggle source
# File lib/rspec/json_matcher/abstract_comparer.rb, line 10
def self.extract_keys(array_or_hash)
  if array_or_hash.is_a?(Array)
    array_or_hash.each_index.to_a
  else
    array_or_hash.keys.map(&:to_s)
  end
end
new(actual, expected, &reason) click to toggle source
# File lib/rspec/json_matcher/abstract_comparer.rb, line 18
def initialize(actual, expected, &reason)
  @actual   = actual
  @expected = expected
  @reason   = reason
end

Public Instance Methods

compare() click to toggle source
# File lib/rspec/json_matcher/abstract_comparer.rb, line 24
def compare
  has_same_value? || has_same_collection?
end

Private Instance Methods

collection?() click to toggle source
# File lib/rspec/json_matcher/abstract_comparer.rb, line 73
def collection?
  actual.is_a?(Array) || actual.is_a?(Hash)
end
has_same_class?() click to toggle source
# File lib/rspec/json_matcher/abstract_comparer.rb, line 30
def has_same_class?
  actual.class == expected.class
end
has_same_collection?() click to toggle source
# File lib/rspec/json_matcher/abstract_comparer.rb, line 53
def has_same_collection?
  raise NotImplementedError, "You must implement #{self.class}#has_same_collection?"
end
has_same_keys?() click to toggle source
# File lib/rspec/json_matcher/abstract_comparer.rb, line 34
def has_same_keys?
  actual_keys = self.class.extract_keys(actual).sort
  expected_keys = self.class.extract_keys(expected).sort
  (actual_keys == expected_keys).tap do |success|
    unless success
      diff_keys = (actual_keys - expected_keys) + (expected_keys - actual_keys)
      reason[diff_keys.ai]
    end
  end
end
has_same_value?() click to toggle source
# File lib/rspec/json_matcher/abstract_comparer.rb, line 45
def has_same_value?
  if expected.respond_to?(:call)
    expected.call(actual)
  else
    expected === actual
  end
end
has_same_values?() click to toggle source
# File lib/rspec/json_matcher/abstract_comparer.rb, line 57
def has_same_values?
  if expected.is_a?(Array)
    expected.each_index.all? do |index|
      (index < actual.size && self.class.compare(actual[index], expected[index], &reason)).tap do |success|
        reason["[#{index}]"] unless success
      end
    end
  else
    expected.keys.all? do |key|
      (actual.has_key?(key.to_s) && self.class.compare(actual[key.to_s], expected[key], &reason)).tap do |success|
        reason[key.to_s] unless success
      end
    end
  end
end