Module: Maze::Compare
- Defined in:
- lib/maze/compare.rb
Overview
Routines for conducting comparisons
Defined Under Namespace
Classes: Result
Class Method Summary collapse
-
.array(array1, array2, result) ⇒ Object
Compares two arrays for value equality, traversing and comparing each element.
-
.hash(hash1, hash2, result) ⇒ Object
Compares two hashes for value equality, traversing and comparing each key-value pair.
-
.regex_match(template, value) ⇒ Boolean
Matches a string against a regex.
-
.string(template, str2, result) ⇒ Object
Compares two strings, writing the results to the given Result object.
-
.value(obj1, obj2, result = nil) ⇒ Result
Compares two objects for value equality, traversing to compare each nested object.
Class Method Details
.array(array1, array2, result) ⇒ Object
Compares two arrays for value equality, traversing and comparing each element. Results are written to the given Result object.
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
# File 'lib/maze/compare.rb', line 95 def array(array1, array2, result) unless array1.length == array2.length result.equal = false result.reasons << "Expected #{array1.length} items in array, received #{array2.length}" return end array1.each_with_index do |obj1, index| value(obj1, array2[index], result) unless result.equal? result.keys << index.to_s break end end end |
.hash(hash1, hash2, result) ⇒ Object
Compares two hashes for value equality, traversing and comparing each key-value pair. Results are written to the given Result object.
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
# File 'lib/maze/compare.rb', line 117 def hash(hash1, hash2, result) unless hash1.keys.length == hash2.keys.length result.equal = false missing = hash1.keys - hash2.keys unexpected = hash2.keys - hash1.keys result.reasons << "Missing keys from hash: #{missing.join(',')}" unless missing.empty? result.reasons << "Unexpected keys in hash: #{unexpected.join(',')}" unless unexpected.empty? return end hash1.each do |key, value| value(value, hash2[key], result) unless result.equal? result.keys << key break end end end |
.regex_match(template, value) ⇒ Boolean
Matches a string against a regex
154 155 156 157 158 |
# File 'lib/maze/compare.rb', line 154 def regex_match(template, value) regex = template regex = "^#{regex}$" unless regex.start_with?('^') || regex.end_with?('$') value =~ /#{regex}/ end |
.string(template, str2, result) ⇒ Object
Compares two strings, writing the results to the given Result object.
141 142 143 144 145 146 |
# File 'lib/maze/compare.rb', line 141 def string(template, str2, result) return if template == str2 || regex_match(template, str2) result.equal = false result.reasons << "'#{str2}' does not match '#{template}'" end |
.value(obj1, obj2, result = nil) ⇒ Result
Compares two objects for value equality, traversing to compare each nested object.
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
# File 'lib/maze/compare.rb', line 56 def value(obj1, obj2, result = nil) result ||= Result.new return result if obj1 == 'IGNORE' if obj1 == 'NUMBER' if obj2.is_a?(Numeric) return result else result.equal = false result.reasons << "A Number was expected, '#{obj2.class} received" return result end end unless obj1.class == obj2.class result.equal = false result.reasons << "Object types differ - expected '#{obj1.class}', received '#{obj2.class}'" return result end case obj1 when Array array(obj1, obj2, result) when Hash hash(obj1, obj2, result) when String string(obj1, obj2, result) else result.reasons << "#{obj1} is not equal to #{obj2}" unless (result.equal = (obj1 == obj2)) end result end |