1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
module Matchers; module Include
extend RSpec::Matchers::DSL
matcher :include_in_any_order do |*matchers|
match do |enumerable|
@not_matched = []
expected_as_array.each do |matcher|
if enumerable.empty?
break
end
if found = enumerable.find { |elem| matcher.matches?(elem) }
enumerable = enumerable.reject { |elem| elem == found }
else
@not_matched << matcher
end
end
@not_matched.empty? && enumerable.empty?
end
failure_message do |enumerable|
"did not match #{@not_matched.collect(&:description).join(', ')} in #{enumerable.inspect}: <#{@not_matched.collect(&:failure_message).join('>, <')}>"
end
end
end; end
|