@@ -34,7 +34,13 @@ def comparison_strategy(reporter)
34
34
end
35
35
36
36
def combined_keys
37
- ( left . keys + right . keys ) . uniq
37
+ if hash? ( left ) && hash? ( right ) then
38
+ ( left . keys + right . keys ) . uniq . sort
39
+ elsif array? ( left ) && array? ( right ) then
40
+ ( 0 ..[ left . size , right . size ] . max ) . to_a
41
+ else
42
+ raise ArgumentError , "Don't know how to extract keys. Neither arrays nor hashes given"
43
+ end
38
44
end
39
45
40
46
def equal? ( key )
@@ -45,13 +51,23 @@ def hash?(value)
45
51
value . is_a? ( Hash )
46
52
end
47
53
48
- def comparable? ( key )
54
+ def array? ( value )
55
+ value . is_a? ( Array )
56
+ end
57
+
58
+ def comparable_hash? ( key )
49
59
hash? ( left [ key ] ) && hash? ( right [ key ] )
50
60
end
51
61
62
+ def comparable_array? ( key )
63
+ array? ( left [ key ] ) && array? ( right [ key ] )
64
+ end
65
+
52
66
def report_difference ( key , reporter )
53
- if comparable ?( key )
67
+ if comparable_hash ?( key )
54
68
self . class . new ( left [ key ] , right [ key ] ) . find_differences ( &reporter )
69
+ elsif comparable_array? ( key )
70
+ self . class . new ( left [ key ] , right [ key ] ) . find_differences ( &reporter )
55
71
else
56
72
reporter . call (
57
73
value_with_default ( left , key ) ,
@@ -61,7 +77,8 @@ def report_difference(key, reporter)
61
77
end
62
78
63
79
def value_with_default ( obj , key )
64
- obj . fetch ( key , NO_VALUE )
80
+ obj [ key ] || NO_VALUE
65
81
end
66
82
end
67
83
end
84
+
0 commit comments