Skip to content

Instantly share code, notes, and snippets.

@zilkey
Created October 29, 2008 02:45
Show Gist options
  • Save zilkey/20597 to your computer and use it in GitHub Desktop.
Save zilkey/20597 to your computer and use it in GitHub Desktop.
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