Module: HaveStructureMatcher

Defined in:
lib/support_methods.rb

Defined Under Namespace

Modules: Methods

Class Method Summary collapse

Class Method Details

.build_diff(actual, expected) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/support_methods.rb', line 12

def self.build_diff(actual, expected)
  return expected unless actual.is_a?(Hash)

  keys = actual.keys | expected.keys

  keys.each_with_object({}) do |key, memo|
    if actual.key?(key) && expected.key?(key)
      actual_value = actual[key]
      expected_value = expected[key]

      if expected_value.is_a?(Hash)
        memo[key] = build_diff(actual_value, expected_value)
      elsif expected_value.is_a?(Array)
        memo[key] = expected_value.zip(actual_value).map { |(e,a)| build_diff(a, e) }
      elsif value_match?(actual_value, expected_value)
        memo[key] = actual_value
      else
        memo[key] = print_expected_value(expected_value)
      end
    elsif expected.key?(key)
      expected_value = expected[key]
      memo[key] = print_expected_value(expected_value)
    end
  end
end

.match?(actual, expected) ⇒ Boolean

Returns:

  • (Boolean)


8
9
10
# File 'lib/support_methods.rb', line 8

def self.match?(actual, expected)
  actual == build_diff(actual, expected)
end


38
39
40
41
42
43
44
# File 'lib/support_methods.rb', line 38

def self.print_expected_value(expected_value)
  if expected_value.respond_to?(:call)
    "Proc [#{expected_value.source_location.join(':')}]"
  else
    expected_value
  end
end

.value_match?(actual_value, expected_value) ⇒ Boolean

Returns:

  • (Boolean)


46
47
48
49
50
51
52
53
54
55
56
# File 'lib/support_methods.rb', line 46

def self.value_match?(actual_value, expected_value)
  if expected_value.is_a?(Regexp)
    actual_value =~ expected_value
  elsif expected_value.is_a?(Class)
    actual_value.is_a?(expected_value)
  elsif expected_value.respond_to?(:call)
    expected_value.call(actual_value)
  else
    actual_value == expected_value
  end
end