zilkey (owner)

Revisions

gist: 20597 Download_button fork
public
Public Clone URL: git://gist.github.com/20597.git
Embed All Files: show embed
Text #
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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