Created
October 29, 2008 02:45
-
-
Save zilkey/20597 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module Spec | |
module Matchers | |
class IncludeAll | |
attr_reader :expected_elements, :actual_elements, :extra_elements_in_actual, :extra_elements_in_expected | |
def initialize(expected_elements) | |
@expected_elements = expected_elements | |
end | |
def matches?(actual_elements) | |
@actual_elements = actual_elements | |
@extra_elements_in_actual = difference_between_arrays(actual_elements, expected_elements) | |
@extra_elements_in_expected = difference_between_arrays(expected_elements, actual_elements) | |
extra_elements_in_actual == [] && extra_elements_in_expected == [] | |
end | |
def failure_message | |
message = [] | |
unless extra_elements_in_expected.empty? | |
message << "Actual array should contain the following elements:" | |
message << " #{extra_elements_in_expected.inspect}" | |
end | |
unless extra_elements_in_actual.empty? | |
message << "Actual array should not contain the following elements:" | |
message << " #{extra_elements_in_actual.inspect}" | |
end | |
message << "expected array:" | |
expected_elements.each do |expected_element| | |
message << " #{expected_element.inspect}" | |
end | |
message << "actual array:" | |
actual_elements.each do |actual_element| | |
message << " #{actual_element.inspect}" | |
end | |
message.join("\n") | |
end | |
def negative_failure_message | |
message = ["expected:"] | |
actual_elements.each do |actual_element| | |
message << " #{actual_element.inspect}" | |
end | |
message << "to not contain:" | |
expected_elements.each do |expected_element| | |
message << " #{expected_element.inspect}" | |
end | |
message.join("\n") | |
end | |
protected | |
def difference_between_arrays(array_1, array_2) | |
difference = array_1.dup | |
array_2.each do |element| | |
if index = difference.index(element) | |
difference.delete_at(index) | |
end | |
end | |
difference | |
end | |
end | |
def include_all(*expected_elements) | |
IncludeAll.new(expected_elements) | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment