rspec-expectations 2.12.1 → 2.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Changelog.md +31 -0
- data/README.md +1 -1
- data/features/built_in_matchers/be.feature +6 -4
- data/features/built_in_matchers/be_within.feature +3 -1
- data/features/built_in_matchers/cover.feature +2 -0
- data/features/built_in_matchers/end_with.feature +2 -0
- data/features/built_in_matchers/equality.feature +9 -15
- data/features/built_in_matchers/exist.feature +2 -0
- data/features/built_in_matchers/expect_error.feature +14 -8
- data/features/built_in_matchers/have.feature +11 -5
- data/features/built_in_matchers/include.feature +53 -0
- data/features/built_in_matchers/match.feature +2 -0
- data/features/built_in_matchers/operators.feature +17 -11
- data/features/built_in_matchers/predicates.feature +21 -13
- data/features/built_in_matchers/respond_to.feature +7 -1
- data/features/built_in_matchers/satisfy.feature +2 -0
- data/features/built_in_matchers/start_with.feature +2 -0
- data/features/built_in_matchers/throw_symbol.feature +6 -0
- data/features/built_in_matchers/types.feature +8 -6
- data/lib/rspec/expectations/deprecation.rb +1 -1
- data/lib/rspec/expectations/differ.rb +8 -8
- data/lib/rspec/expectations/fail_with.rb +17 -3
- data/lib/rspec/expectations/syntax.rb +46 -0
- data/lib/rspec/expectations/version.rb +1 -1
- data/lib/rspec/matchers/built_in/be.rb +7 -3
- data/lib/rspec/matchers/built_in/be_within.rb +13 -4
- data/lib/rspec/matchers/built_in/change.rb +2 -2
- data/lib/rspec/matchers/built_in/equal.rb +5 -1
- data/lib/rspec/matchers/built_in/exist.rb +1 -1
- data/lib/rspec/matchers/built_in/have.rb +8 -8
- data/lib/rspec/matchers/built_in/include.rb +19 -3
- data/lib/rspec/matchers/built_in/respond_to.rb +1 -1
- data/lib/rspec/matchers/extensions/instance_eval_with_args.rb +1 -1
- data/lib/rspec/matchers/matcher.rb +4 -3
- data/lib/rspec/matchers/operator_matcher.rb +1 -1
- data/lib/rspec/matchers/pretty.rb +5 -1
- data/spec/rspec/expectations/differ_spec.rb +8 -15
- data/spec/rspec/expectations/expectation_target_spec.rb +18 -8
- data/spec/rspec/expectations/extensions/kernel_spec.rb +15 -15
- data/spec/rspec/expectations/fail_with_spec.rb +41 -16
- data/spec/rspec/expectations/handler_spec.rb +13 -13
- data/spec/rspec/expectations/syntax_spec.rb +70 -8
- data/spec/rspec/matchers/base_matcher_spec.rb +14 -12
- data/spec/rspec/matchers/be_close_spec.rb +1 -1
- data/spec/rspec/matchers/be_instance_of_spec.rb +14 -8
- data/spec/rspec/matchers/be_kind_of_spec.rb +12 -8
- data/spec/rspec/matchers/be_spec.rb +212 -148
- data/spec/rspec/matchers/be_within_spec.rb +91 -42
- data/spec/rspec/matchers/change_spec.rb +52 -38
- data/spec/rspec/matchers/configuration_spec.rb +19 -15
- data/spec/rspec/matchers/cover_spec.rb +19 -19
- data/spec/rspec/matchers/description_generation_spec.rb +86 -86
- data/spec/rspec/matchers/dsl_spec.rb +7 -7
- data/spec/rspec/matchers/eq_spec.rb +17 -11
- data/spec/rspec/matchers/eql_spec.rb +10 -10
- data/spec/rspec/matchers/equal_spec.rb +27 -9
- data/spec/rspec/matchers/exist_spec.rb +35 -21
- data/spec/rspec/matchers/has_spec.rb +33 -29
- data/spec/rspec/matchers/have_spec.rb +165 -151
- data/spec/rspec/matchers/include_matcher_integration_spec.rb +30 -0
- data/spec/rspec/matchers/include_spec.rb +282 -124
- data/spec/rspec/matchers/match_array_spec.rb +90 -49
- data/spec/rspec/matchers/match_spec.rb +21 -21
- data/spec/rspec/matchers/matcher_spec.rb +85 -48
- data/spec/rspec/matchers/matchers_spec.rb +12 -6
- data/spec/rspec/matchers/method_missing_spec.rb +5 -1
- data/spec/rspec/matchers/operator_matcher_spec.rb +216 -237
- data/spec/rspec/matchers/raise_error_spec.rb +132 -132
- data/spec/rspec/matchers/respond_to_spec.rb +109 -112
- data/spec/rspec/matchers/satisfy_spec.rb +16 -16
- data/spec/rspec/matchers/start_with_end_with_spec.rb +36 -32
- data/spec/rspec/matchers/throw_symbol_spec.rb +24 -24
- data/spec/rspec/matchers/yield_spec.rb +7 -7
- data/spec/spec_helper.rb +46 -19
- data/spec/support/in_sub_process.rb +27 -20
- metadata +81 -83
| @@ -0,0 +1,30 @@ | |
| 1 | 
            +
            require 'spec_helper'
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module RSpec
         | 
| 4 | 
            +
              module Matchers
         | 
| 5 | 
            +
                describe "include() interaction with built-in matchers" do
         | 
| 6 | 
            +
                  it "works with be_within(delta).of(expected)" do
         | 
| 7 | 
            +
                    expect([10, 20, 30]).to include( be_within(5).of(24) )
         | 
| 8 | 
            +
                    expect([10, 20, 30]).not_to include( be_within(3).of(24) )
         | 
| 9 | 
            +
                  end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  it "works with be_instance_of(klass)" do
         | 
| 12 | 
            +
                    expect(["foo", 123, {:foo => "bar"}]).to include( be_instance_of(Hash) )
         | 
| 13 | 
            +
                    expect(["foo", 123, {:foo => "bar"}]).not_to include( be_instance_of(Range) )
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                  it "works with be_kind_of(klass)" do
         | 
| 17 | 
            +
                    class StringSubclass < String; end
         | 
| 18 | 
            +
                    class NotHashSubclass; end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                    expect([StringSubclass.new("baz")]).to include( be_kind_of(String) )
         | 
| 21 | 
            +
                    expect([NotHashSubclass.new]).not_to include( be_kind_of(Hash) )
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  it "works with be_[some predicate]" do
         | 
| 25 | 
            +
                    expect([stub("actual", :happy? => true)]).to include( be_happy )
         | 
| 26 | 
            +
                    expect([stub("actual", :happy? => false)]).not_to include( be_happy )
         | 
| 27 | 
            +
                  end
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
              end
         | 
| 30 | 
            +
            end
         | 
| @@ -1,373 +1,531 @@ | |
| 1 1 | 
             
            require 'spec_helper'
         | 
| 2 | 
            +
            require 'uri'
         | 
| 2 3 |  | 
| 3 4 | 
             
            describe "#include matcher" do
         | 
| 4 5 | 
             
              it "is diffable" do
         | 
| 5 | 
            -
                include("a"). | 
| 6 | 
            +
                expect(include("a")).to be_diffable
         | 
| 6 7 | 
             
              end
         | 
| 7 8 |  | 
| 8 | 
            -
              describe " | 
| 9 | 
            +
              describe "expect(...).to include(with_one_arg)" do
         | 
| 9 10 | 
             
                it_behaves_like "an RSpec matcher", :valid_value => [1, 2], :invalid_value => [1] do
         | 
| 10 11 | 
             
                  let(:matcher) { include(2) }
         | 
| 11 12 | 
             
                end
         | 
| 12 13 |  | 
| 13 14 | 
             
                context "for a string target" do
         | 
| 14 15 | 
             
                  it "passes if target includes expected" do
         | 
| 15 | 
            -
                    "abc". | 
| 16 | 
            +
                    expect("abc").to include("a")
         | 
| 16 17 | 
             
                  end
         | 
| 17 18 |  | 
| 18 19 | 
             
                  it "fails if target does not include expected" do
         | 
| 19 | 
            -
                     | 
| 20 | 
            -
                      "abc". | 
| 21 | 
            -
                    }. | 
| 20 | 
            +
                    expect {
         | 
| 21 | 
            +
                      expect("abc").to include("d")
         | 
| 22 | 
            +
                    }.to fail_matching("expected \"abc\" to include \"d\"")
         | 
| 22 23 | 
             
                  end
         | 
| 23 24 |  | 
| 24 25 | 
             
                  it "includes a diff when actual is multiline" do
         | 
| 25 | 
            -
                     | 
| 26 | 
            -
                      "abc\ndef". | 
| 27 | 
            -
                    }. | 
| 26 | 
            +
                    expect {
         | 
| 27 | 
            +
                      expect("abc\ndef").to include("g")
         | 
| 28 | 
            +
                    }.to fail_matching("expected \"abc\\ndef\" to include \"g\"\nDiff")
         | 
| 28 29 | 
             
                  end
         | 
| 29 30 |  | 
| 30 31 | 
             
                  it "includes a diff when actual is multiline and there are multiple expecteds" do
         | 
| 31 | 
            -
                     | 
| 32 | 
            -
                      "abc\ndef". | 
| 33 | 
            -
                    }. | 
| 32 | 
            +
                    expect {
         | 
| 33 | 
            +
                      expect("abc\ndef").to include("g", "h")
         | 
| 34 | 
            +
                    }.to fail_matching("expected \"abc\\ndef\" to include \"g\" and \"h\"\nDiff")
         | 
| 34 35 | 
             
                  end
         | 
| 35 36 | 
             
                end
         | 
| 36 37 |  | 
| 37 38 | 
             
                context "for an array target" do
         | 
| 38 39 | 
             
                  it "passes if target includes expected" do
         | 
| 39 | 
            -
                    [1,2,3]. | 
| 40 | 
            +
                    expect([1,2,3]).to include(3)
         | 
| 40 41 | 
             
                  end
         | 
| 41 42 |  | 
| 42 43 | 
             
                  it "fails if target does not include expected" do
         | 
| 43 | 
            -
                     | 
| 44 | 
            -
                      [1,2,3]. | 
| 45 | 
            -
                    }. | 
| 44 | 
            +
                    expect {
         | 
| 45 | 
            +
                      expect([1,2,3]).to include(4)
         | 
| 46 | 
            +
                    }.to fail_matching("expected [1, 2, 3] to include 4")
         | 
| 47 | 
            +
                  end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                  it 'fails when given differing null doubles' do
         | 
| 50 | 
            +
                    dbl_1 = double.as_null_object
         | 
| 51 | 
            +
                    dbl_2 = double.as_null_object
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                    expect {
         | 
| 54 | 
            +
                      expect([dbl_1]).to include(dbl_2)
         | 
| 55 | 
            +
                    }.to fail_matching("expected [#{dbl_1.inspect}] to include")
         | 
| 56 | 
            +
                  end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                  it 'passes when given the same null double' do
         | 
| 59 | 
            +
                    dbl = double.as_null_object
         | 
| 60 | 
            +
                    expect([dbl]).to include(dbl)
         | 
| 46 61 | 
             
                  end
         | 
| 47 62 | 
             
                end
         | 
| 48 63 |  | 
| 49 64 | 
             
                context "for a hash target" do
         | 
| 50 65 | 
             
                  it 'passes if target has the expected as a key' do
         | 
| 51 | 
            -
                    {:key => 'value'}. | 
| 66 | 
            +
                    expect({:key => 'value'}).to include(:key)
         | 
| 52 67 | 
             
                  end
         | 
| 53 68 |  | 
| 54 69 | 
             
                  it "fails if target does not include expected" do
         | 
| 55 | 
            -
                     | 
| 56 | 
            -
                      {:key => 'value'}. | 
| 57 | 
            -
                    }. | 
| 70 | 
            +
                    expect {
         | 
| 71 | 
            +
                      expect({:key => 'value'}).to include(:other)
         | 
| 72 | 
            +
                    }.to fail_matching(%Q|expected {:key=>"value"} to include :other|)
         | 
| 58 73 | 
             
                  end
         | 
| 59 74 |  | 
| 60 75 | 
             
                  it "fails if target doesn't have a key and we expect nil" do
         | 
| 61 | 
            -
                     | 
| 62 | 
            -
                      {}. | 
| 63 | 
            -
                    }. | 
| 76 | 
            +
                    expect {
         | 
| 77 | 
            +
                      expect({}).to include(:something => nil)
         | 
| 78 | 
            +
                    }.to fail_matching(%Q|expected {} to include {:something=>nil}|)
         | 
| 79 | 
            +
                  end
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                  it 'works even when an entry in the hash overrides #send' do
         | 
| 82 | 
            +
                    hash = { :key => 'value' }
         | 
| 83 | 
            +
                    def hash.send; :sent; end
         | 
| 84 | 
            +
                    expect(hash).to include(hash)
         | 
| 85 | 
            +
                  end
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                  context 'that overrides #send' do
         | 
| 88 | 
            +
                    it 'still works' do
         | 
| 89 | 
            +
                      array = [1, 2]
         | 
| 90 | 
            +
                      def array.send; :sent; end
         | 
| 91 | 
            +
             | 
| 92 | 
            +
                      expect(array).to include(*array)
         | 
| 93 | 
            +
                    end
         | 
| 64 94 | 
             
                  end
         | 
| 65 95 | 
             
                end
         | 
| 66 96 | 
             
              end
         | 
| 67 97 |  | 
| 68 | 
            -
              describe " | 
| 98 | 
            +
              describe "expect(...).to include(with, multiple, args)" do
         | 
| 69 99 | 
             
                it "has a description" do
         | 
| 70 100 | 
             
                  matcher = include("a")
         | 
| 71 | 
            -
                  matcher.description. | 
| 101 | 
            +
                  expect(matcher.description).to eq("include \"a\"")
         | 
| 72 102 | 
             
                end
         | 
| 73 103 | 
             
                context "for a string target" do
         | 
| 74 104 | 
             
                  it "passes if target includes all items" do
         | 
| 75 | 
            -
                    "a string". | 
| 105 | 
            +
                    expect("a string").to include("str", "a")
         | 
| 76 106 | 
             
                  end
         | 
| 77 107 |  | 
| 78 108 | 
             
                  it "fails if target does not include any one of the items" do
         | 
| 79 | 
            -
                     | 
| 80 | 
            -
                      "a string". | 
| 81 | 
            -
                    }. | 
| 109 | 
            +
                    expect {
         | 
| 110 | 
            +
                      expect("a string").to include("str", "a", "foo")
         | 
| 111 | 
            +
                    }.to fail_matching(%Q{expected "a string" to include "str", "a", and "foo"})
         | 
| 82 112 | 
             
                  end
         | 
| 83 113 | 
             
                end
         | 
| 84 114 |  | 
| 85 115 | 
             
                context "for an array target" do
         | 
| 86 116 | 
             
                  it "passes if target includes all items" do
         | 
| 87 | 
            -
                    [1,2,3]. | 
| 117 | 
            +
                    expect([1,2,3]).to include(1,2,3)
         | 
| 88 118 | 
             
                  end
         | 
| 89 119 |  | 
| 90 120 | 
             
                  it "fails if target does not include any one of the items" do
         | 
| 91 | 
            -
                     | 
| 92 | 
            -
                      [1,2,3]. | 
| 93 | 
            -
                    }. | 
| 121 | 
            +
                    expect {
         | 
| 122 | 
            +
                      expect([1,2,3]).to include(1,2,4)
         | 
| 123 | 
            +
                    }.to fail_matching("expected [1, 2, 3] to include 1, 2, and 4")
         | 
| 94 124 | 
             
                  end
         | 
| 95 125 | 
             
                end
         | 
| 96 126 |  | 
| 97 127 | 
             
                context "for a hash target" do
         | 
| 98 128 | 
             
                  it 'passes if target includes all items as keys' do
         | 
| 99 | 
            -
                    {:key => 'value', :other => 'value'}. | 
| 129 | 
            +
                    expect({:key => 'value', :other => 'value'}).to include(:key, :other)
         | 
| 100 130 | 
             
                  end
         | 
| 101 131 |  | 
| 102 132 | 
             
                  it 'fails if target is missing any item as a key' do
         | 
| 103 | 
            -
                     | 
| 104 | 
            -
                      {:key => 'value'}. | 
| 105 | 
            -
                    }. | 
| 133 | 
            +
                    expect {
         | 
| 134 | 
            +
                      expect({:key => 'value'}).to include(:key, :other)
         | 
| 135 | 
            +
                    }.to fail_matching(%Q|expected {:key=>"value"} to include :key and :other|)
         | 
| 106 136 | 
             
                  end
         | 
| 107 137 | 
             
                end
         | 
| 108 138 | 
             
              end
         | 
| 109 139 |  | 
| 110 | 
            -
              describe " | 
| 140 | 
            +
              describe "expect(...).to_not include(expected)" do
         | 
| 111 141 | 
             
                context "for a string target" do
         | 
| 112 142 | 
             
                  it "passes if target does not include expected" do
         | 
| 113 | 
            -
                    "abc". | 
| 143 | 
            +
                    expect("abc").not_to include("d")
         | 
| 114 144 | 
             
                  end
         | 
| 115 145 |  | 
| 116 146 | 
             
                  it "fails if target includes expected" do
         | 
| 117 | 
            -
                     | 
| 118 | 
            -
                      "abc". | 
| 119 | 
            -
                    }. | 
| 147 | 
            +
                    expect {
         | 
| 148 | 
            +
                      expect("abc").not_to include("c")
         | 
| 149 | 
            +
                    }.to fail_with("expected \"abc\" not to include \"c\"")
         | 
| 120 150 | 
             
                  end
         | 
| 121 151 | 
             
                end
         | 
| 122 152 |  | 
| 123 153 | 
             
                context "for an array target" do
         | 
| 124 154 | 
             
                  it "passes if target does not include expected" do
         | 
| 125 | 
            -
                    [1,2,3]. | 
| 155 | 
            +
                    expect([1,2,3]).not_to include(4)
         | 
| 126 156 | 
             
                  end
         | 
| 127 157 |  | 
| 128 158 | 
             
                  it "fails if target includes expected" do
         | 
| 129 | 
            -
                     | 
| 130 | 
            -
                      [1,2,3]. | 
| 131 | 
            -
                    }. | 
| 159 | 
            +
                    expect {
         | 
| 160 | 
            +
                      expect([1,2,3]).not_to include(3)
         | 
| 161 | 
            +
                    }.to fail_with("expected [1, 2, 3] not to include 3")
         | 
| 162 | 
            +
                  end
         | 
| 163 | 
            +
             | 
| 164 | 
            +
                  it 'passes when given differing null doubles' do
         | 
| 165 | 
            +
                    expect([double.as_null_object]).not_to include(double.as_null_object)
         | 
| 166 | 
            +
                  end
         | 
| 167 | 
            +
             | 
| 168 | 
            +
                  it 'fails when given the same null double' do
         | 
| 169 | 
            +
                    dbl = double.as_null_object
         | 
| 170 | 
            +
             | 
| 171 | 
            +
                    expect {
         | 
| 172 | 
            +
                      expect([dbl]).not_to include(dbl)
         | 
| 173 | 
            +
                    }.to fail_matching("expected [#{dbl.inspect}] not to include")
         | 
| 132 174 | 
             
                  end
         | 
| 133 175 | 
             
                end
         | 
| 134 176 |  | 
| 135 177 | 
             
                context "for a hash target" do
         | 
| 136 178 | 
             
                  it 'passes if target does not have the expected as a key' do
         | 
| 137 | 
            -
                    {:other => 'value'}. | 
| 179 | 
            +
                    expect({:other => 'value'}).not_to include(:key)
         | 
| 138 180 | 
             
                  end
         | 
| 139 181 |  | 
| 140 182 | 
             
                  it "fails if target includes expected key" do
         | 
| 141 | 
            -
                     | 
| 142 | 
            -
                      {:key => 'value'}. | 
| 143 | 
            -
                    }. | 
| 183 | 
            +
                    expect {
         | 
| 184 | 
            +
                      expect({:key => 'value'}).not_to include(:key)
         | 
| 185 | 
            +
                    }.to fail_matching(%Q|expected {:key=>"value"} not to include :key|)
         | 
| 144 186 | 
             
                  end
         | 
| 145 187 | 
             
                end
         | 
| 146 188 |  | 
| 147 189 | 
             
              end
         | 
| 148 190 |  | 
| 149 | 
            -
              describe " | 
| 191 | 
            +
              describe "expect(...).to_not include(with, multiple, args)" do
         | 
| 150 192 | 
             
                context "for a string target" do
         | 
| 151 193 | 
             
                  it "passes if the target does not include any of the expected" do
         | 
| 152 | 
            -
                    "abc". | 
| 194 | 
            +
                    expect("abc").not_to include("d", "e", "f")
         | 
| 153 195 | 
             
                  end
         | 
| 154 196 |  | 
| 155 197 | 
             
                  it "fails if the target includes all of the expected" do
         | 
| 156 198 | 
             
                    expect {
         | 
| 157 | 
            -
                      "abc". | 
| 199 | 
            +
                      expect("abc").not_to include("c", "a")
         | 
| 158 200 | 
             
                    }.to fail_with('expected "abc" not to include "c" and "a"')
         | 
| 159 201 | 
             
                  end
         | 
| 160 202 |  | 
| 161 203 | 
             
                  it "fails if the target includes some (but not all) of the expected" do
         | 
| 162 204 | 
             
                    expect {
         | 
| 163 | 
            -
                      "abc". | 
| 205 | 
            +
                      expect("abc").not_to include("d", "a")
         | 
| 164 206 | 
             
                    }.to fail_with(%q{expected "abc" not to include "d" and "a"})
         | 
| 165 207 | 
             
                  end
         | 
| 166 208 | 
             
                end
         | 
| 167 209 |  | 
| 168 210 | 
             
                context "for a hash target" do
         | 
| 169 211 | 
             
                  it "passes if it does not include any of the expected keys" do
         | 
| 170 | 
            -
                    { :a => 1, :b => 2 }. | 
| 212 | 
            +
                    expect({ :a => 1, :b => 2 }).not_to include(:c, :d)
         | 
| 171 213 | 
             
                  end
         | 
| 172 214 |  | 
| 173 215 | 
             
                  it "fails if the target includes all of the expected keys" do
         | 
| 174 216 | 
             
                    expect {
         | 
| 175 | 
            -
                      { :a => 1, :b => 2 }. | 
| 217 | 
            +
                      expect({ :a => 1, :b => 2 }).not_to include(:a, :b)
         | 
| 176 218 | 
             
                    }.to fail_matching(%Q|expected #{{:a=>1, :b=>2}.inspect} not to include :a and :b|)
         | 
| 177 219 | 
             
                  end
         | 
| 178 220 |  | 
| 179 221 | 
             
                  it "fails if the target includes some (but not all) of the expected keys" do
         | 
| 180 222 | 
             
                    expect {
         | 
| 181 | 
            -
                      { :a => 1, :b => 2 }. | 
| 223 | 
            +
                      expect({ :a => 1, :b => 2 }).not_to include(:d, :b)
         | 
| 182 224 | 
             
                    }.to fail_matching(%Q|expected #{{:a=>1, :b=>2}.inspect} not to include :d and :b|)
         | 
| 183 225 | 
             
                  end
         | 
| 184 226 | 
             
                end
         | 
| 185 227 |  | 
| 186 228 | 
             
                context "for an array target" do
         | 
| 187 229 | 
             
                  it "passes if the target does not include any of the expected" do
         | 
| 188 | 
            -
                    [1, 2, 3]. | 
| 230 | 
            +
                    expect([1, 2, 3]).not_to include(4, 5, 6)
         | 
| 189 231 | 
             
                  end
         | 
| 190 232 |  | 
| 191 233 | 
             
                  it "fails if the target includes all of the expected" do
         | 
| 192 234 | 
             
                    expect {
         | 
| 193 | 
            -
                      [1, 2, 3]. | 
| 235 | 
            +
                      expect([1, 2, 3]).not_to include(3, 1)
         | 
| 194 236 | 
             
                    }.to fail_with(%q{expected [1, 2, 3] not to include 3 and 1})
         | 
| 195 237 | 
             
                  end
         | 
| 196 238 |  | 
| 197 239 | 
             
                  it "fails if the target includes some (but not all) of the expected" do
         | 
| 198 240 | 
             
                    expect {
         | 
| 199 | 
            -
                      [1, 2, 3]. | 
| 241 | 
            +
                      expect([1, 2, 3]).not_to include(4, 1)
         | 
| 200 242 | 
             
                    }.to fail_with(%q{expected [1, 2, 3] not to include 4 and 1})
         | 
| 201 243 | 
             
                  end
         | 
| 202 244 | 
             
                end
         | 
| 203 245 | 
             
              end
         | 
| 204 246 |  | 
| 205 | 
            -
              describe " | 
| 247 | 
            +
              describe "expect(...).to include(:key => value)" do
         | 
| 206 248 | 
             
                context 'for a hash target' do
         | 
| 207 249 | 
             
                  it "passes if target includes the key/value pair" do
         | 
| 208 | 
            -
                    {:key => 'value'}. | 
| 250 | 
            +
                    expect({:key => 'value'}).to include(:key => 'value')
         | 
| 209 251 | 
             
                  end
         | 
| 210 252 |  | 
| 211 253 | 
             
                  it "passes if target includes the key/value pair among others" do
         | 
| 212 | 
            -
                    {:key => 'value', :other => 'different'}. | 
| 254 | 
            +
                    expect({:key => 'value', :other => 'different'}).to include(:key => 'value')
         | 
| 213 255 | 
             
                  end
         | 
| 214 256 |  | 
| 215 257 | 
             
                  it "fails if target has a different value for key" do
         | 
| 216 | 
            -
                     | 
| 217 | 
            -
                      {:key => 'different'}. | 
| 218 | 
            -
                    }. | 
| 258 | 
            +
                    expect {
         | 
| 259 | 
            +
                      expect({:key => 'different'}).to include(:key => 'value')
         | 
| 260 | 
            +
                    }.to fail_matching(%Q|expected {:key=>"different"} to include {:key=>"value"}|)
         | 
| 219 261 | 
             
                  end
         | 
| 220 262 |  | 
| 221 263 | 
             
                  it "fails if target has a different key" do
         | 
| 222 | 
            -
                     | 
| 223 | 
            -
                      {:other => 'value'}. | 
| 224 | 
            -
                    }. | 
| 264 | 
            +
                    expect {
         | 
| 265 | 
            +
                      expect({:other => 'value'}).to include(:key => 'value')
         | 
| 266 | 
            +
                    }.to fail_matching(%Q|expected {:other=>"value"} to include {:key=>"value"}|)
         | 
| 225 267 | 
             
                  end
         | 
| 226 268 | 
             
                end
         | 
| 227 269 |  | 
| 228 270 | 
             
                context 'for a non-hash target' do
         | 
| 229 271 | 
             
                  it "fails if the target does not contain the given hash" do
         | 
| 230 | 
            -
                     | 
| 231 | 
            -
                      ['a', 'b']. | 
| 232 | 
            -
                    }. | 
| 272 | 
            +
                    expect {
         | 
| 273 | 
            +
                      expect(['a', 'b']).to include(:key => 'value')
         | 
| 274 | 
            +
                    }.to fail_matching(%q|expected ["a", "b"] to include {:key=>"value"}|)
         | 
| 233 275 | 
             
                  end
         | 
| 234 276 |  | 
| 235 277 | 
             
                  it "passes if the target contains the given hash" do
         | 
| 236 | 
            -
                    ['a', { :key => 'value' } ]. | 
| 278 | 
            +
                    expect(['a', { :key => 'value' } ]).to include(:key => 'value')
         | 
| 237 279 | 
             
                  end
         | 
| 238 280 | 
             
                end
         | 
| 239 281 | 
             
              end
         | 
| 240 282 |  | 
| 241 | 
            -
              describe " | 
| 283 | 
            +
              describe "expect(...).to_not include(:key => value)" do
         | 
| 242 284 | 
             
                context 'for a hash target' do
         | 
| 243 285 | 
             
                  it "fails if target includes the key/value pair" do
         | 
| 244 | 
            -
                     | 
| 245 | 
            -
                      {:key => 'value'}. | 
| 246 | 
            -
                    }. | 
| 286 | 
            +
                    expect {
         | 
| 287 | 
            +
                      expect({:key => 'value'}).not_to include(:key => 'value')
         | 
| 288 | 
            +
                    }.to fail_matching(%Q|expected {:key=>"value"} not to include {:key=>"value"}|)
         | 
| 247 289 | 
             
                  end
         | 
| 248 290 |  | 
| 249 291 | 
             
                  it "fails if target includes the key/value pair among others" do
         | 
| 250 | 
            -
                     | 
| 251 | 
            -
                      {:key => 'value', :other => 'different'}. | 
| 252 | 
            -
                    }. | 
| 292 | 
            +
                    expect {
         | 
| 293 | 
            +
                      expect({:key => 'value', :other => 'different'}).not_to include(:key => 'value')
         | 
| 294 | 
            +
                    }.to fail_matching(%Q|expected #{{:key=>"value", :other=>"different"}.inspect} not to include {:key=>"value"}|)
         | 
| 253 295 | 
             
                  end
         | 
| 254 296 |  | 
| 255 297 | 
             
                  it "passes if target has a different value for key" do
         | 
| 256 | 
            -
                    {:key => 'different'}. | 
| 298 | 
            +
                    expect({:key => 'different'}).not_to include(:key => 'value')
         | 
| 257 299 | 
             
                  end
         | 
| 258 300 |  | 
| 259 301 | 
             
                  it "passes if target has a different key" do
         | 
| 260 | 
            -
                    {:other => 'value'}. | 
| 302 | 
            +
                    expect({:other => 'value'}).not_to include(:key => 'value')
         | 
| 261 303 | 
             
                  end
         | 
| 262 304 | 
             
                end
         | 
| 263 305 |  | 
| 264 306 | 
             
                context "for a non-hash target" do
         | 
| 265 307 | 
             
                  it "passes if the target does not contain the given hash" do
         | 
| 266 | 
            -
                    ['a', 'b']. | 
| 308 | 
            +
                    expect(['a', 'b']).not_to include(:key => 'value')
         | 
| 267 309 | 
             
                  end
         | 
| 268 310 |  | 
| 269 311 | 
             
                  it "fails if the target contains the given hash" do
         | 
| 270 | 
            -
                     | 
| 271 | 
            -
                      ['a', { :key => 'value' } ]. | 
| 272 | 
            -
                    }. | 
| 312 | 
            +
                    expect {
         | 
| 313 | 
            +
                      expect(['a', { :key => 'value' } ]).not_to include(:key => 'value')
         | 
| 314 | 
            +
                    }.to fail_matching(%Q|expected ["a", {:key=>"value"}] not to include {:key=>"value"}|)
         | 
| 273 315 | 
             
                  end
         | 
| 274 316 | 
             
                end
         | 
| 275 317 | 
             
              end
         | 
| 276 318 |  | 
| 277 | 
            -
              describe " | 
| 319 | 
            +
              describe "expect(...).to include(:key1 => value1, :key2 => value2)" do
         | 
| 278 320 | 
             
                context 'for a hash target' do
         | 
| 279 321 | 
             
                  it "passes if target includes the key/value pairs" do
         | 
| 280 | 
            -
                    {:a => 1, :b => 2}. | 
| 322 | 
            +
                    expect({:a => 1, :b => 2}).to include(:b => 2, :a => 1)
         | 
| 281 323 | 
             
                  end
         | 
| 282 324 |  | 
| 283 325 | 
             
                  it "passes if target includes the key/value pairs among others" do
         | 
| 284 | 
            -
                    {:a => 1, :c => 3, :b => 2}. | 
| 326 | 
            +
                    expect({:a => 1, :c => 3, :b => 2}).to include(:b => 2, :a => 1)
         | 
| 285 327 | 
             
                  end
         | 
| 286 328 |  | 
| 287 329 | 
             
                  it "fails if target has a different value for one of the keys" do
         | 
| 288 | 
            -
                     | 
| 289 | 
            -
                      {:a => 1, :b => 2}. | 
| 290 | 
            -
                    }. | 
| 330 | 
            +
                    expect {
         | 
| 331 | 
            +
                      expect({:a => 1, :b => 2}).to include(:a => 2, :b => 2)
         | 
| 332 | 
            +
                    }.to fail_matching(%Q|expected #{{:a=>1, :b=>2}.inspect} to include #{{:a=>2, :b=>2}.inspect}|)
         | 
| 291 333 | 
             
                  end
         | 
| 292 334 |  | 
| 293 335 | 
             
                  it "fails if target has a different value for both of the keys" do
         | 
| 294 | 
            -
                     | 
| 295 | 
            -
                      {:a => 1, :b => 1}. | 
| 296 | 
            -
                    }. | 
| 336 | 
            +
                    expect {
         | 
| 337 | 
            +
                      expect({:a => 1, :b => 1}).to include(:a => 2, :b => 2)
         | 
| 338 | 
            +
                    }.to fail_matching(%Q|expected #{{:a=>1, :b=>1}.inspect} to include #{{:a=>2, :b=>2}.inspect}|)
         | 
| 297 339 | 
             
                  end
         | 
| 298 340 |  | 
| 299 341 | 
             
                  it "fails if target lacks one of the keys" do
         | 
| 300 | 
            -
                     | 
| 301 | 
            -
                      {:a => 1, :b => 1}. | 
| 302 | 
            -
                    }. | 
| 342 | 
            +
                    expect {
         | 
| 343 | 
            +
                      expect({:a => 1, :b => 1}).to include(:a => 1, :c => 1)
         | 
| 344 | 
            +
                    }.to fail_matching(%Q|expected #{{:a=>1, :b=>1}.inspect} to include #{{:a=>1, :c=>1}.inspect}|)
         | 
| 303 345 | 
             
                  end
         | 
| 304 346 |  | 
| 305 347 | 
             
                  it "fails if target lacks both of the keys" do
         | 
| 306 | 
            -
                     | 
| 307 | 
            -
                      {:a => 1, :b => 1}. | 
| 308 | 
            -
                    }. | 
| 348 | 
            +
                    expect {
         | 
| 349 | 
            +
                      expect({:a => 1, :b => 1}).to include(:c => 1, :d => 1)
         | 
| 350 | 
            +
                    }.to fail_matching(%Q|expected #{{:a=>1, :b=>1}.inspect} to include #{{:c=>1, :d=>1}.inspect}|)
         | 
| 309 351 | 
             
                  end
         | 
| 310 352 | 
             
                end
         | 
| 311 353 |  | 
| 312 354 | 
             
                context 'for a non-hash target' do
         | 
| 313 355 | 
             
                  it "fails if the target does not contain the given hash" do
         | 
| 314 | 
            -
                     | 
| 315 | 
            -
                      ['a', 'b']. | 
| 316 | 
            -
                    }. | 
| 356 | 
            +
                    expect {
         | 
| 357 | 
            +
                      expect(['a', 'b']).to include(:a => 1, :b => 1)
         | 
| 358 | 
            +
                    }.to fail_matching(%Q|expected ["a", "b"] to include #{{:a=>1, :b=>1}.inspect}|)
         | 
| 317 359 | 
             
                  end
         | 
| 318 360 |  | 
| 319 361 | 
             
                  it "passes if the target contains the given hash" do
         | 
| 320 | 
            -
                    ['a', { :a => 1, :b => 2 } ]. | 
| 362 | 
            +
                    expect(['a', { :a => 1, :b => 2 } ]).to include(:a => 1, :b => 2)
         | 
| 321 363 | 
             
                  end
         | 
| 322 364 | 
             
                end
         | 
| 323 365 | 
             
              end
         | 
| 324 366 |  | 
| 325 | 
            -
              describe " | 
| 367 | 
            +
              describe "expect(...).to_not include(:key1 => value1, :key2 => value2)" do
         | 
| 326 368 | 
             
                context 'for a hash target' do
         | 
| 327 369 | 
             
                  it "fails if target includes the key/value pairs" do
         | 
| 328 | 
            -
                     | 
| 329 | 
            -
                      {:a => 1, :b => 2}. | 
| 330 | 
            -
                    }. | 
| 370 | 
            +
                    expect {
         | 
| 371 | 
            +
                      expect({:a => 1, :b => 2}).not_to include(:a => 1, :b => 2)
         | 
| 372 | 
            +
                    }.to fail_matching(%Q|expected #{{:a=>1, :b=>2}.inspect} not to include #{{:a=>1, :b=>2}.inspect}|)
         | 
| 331 373 | 
             
                  end
         | 
| 332 374 |  | 
| 333 375 | 
             
                  it "fails if target includes the key/value pairs among others" do
         | 
| 334 376 | 
             
                    hash = {:a => 1, :b => 2, :c => 3}
         | 
| 335 | 
            -
                     | 
| 336 | 
            -
                      hash. | 
| 337 | 
            -
                    }. | 
| 377 | 
            +
                    expect {
         | 
| 378 | 
            +
                      expect(hash).not_to include(:a => 1, :b => 2)
         | 
| 379 | 
            +
                    }.to fail_matching(%Q|expected #{hash.inspect} not to include #{{:a=>1, :b=>2}.inspect}|)
         | 
| 338 380 | 
             
                  end
         | 
| 339 381 |  | 
| 340 382 | 
             
                  it "fails if target has a different value for one of the keys" do
         | 
| 341 | 
            -
                     | 
| 342 | 
            -
                      {:a => 1, :b => 2}. | 
| 343 | 
            -
                    }. | 
| 383 | 
            +
                    expect {
         | 
| 384 | 
            +
                      expect({:a => 1, :b => 2}).not_to include(:a => 2, :b => 2)
         | 
| 385 | 
            +
                    }.to fail_matching(%Q|expected #{{:a=>1, :b=>2}.inspect} not to include #{{:a=>2, :b=>2}.inspect}|)
         | 
| 344 386 | 
             
                  end
         | 
| 345 387 |  | 
| 346 388 | 
             
                  it "passes if target has a different value for both of the keys" do
         | 
| 347 | 
            -
                    {:a => 1, :b => 1}. | 
| 389 | 
            +
                    expect({:a => 1, :b => 1}).not_to include(:a => 2, :b => 2)
         | 
| 348 390 | 
             
                  end
         | 
| 349 391 |  | 
| 350 392 | 
             
                  it "fails if target lacks one of the keys" do
         | 
| 351 | 
            -
                     | 
| 352 | 
            -
                      {:a => 1, :b => 1}. | 
| 353 | 
            -
                    }. | 
| 393 | 
            +
                    expect {
         | 
| 394 | 
            +
                      expect({:a => 1, :b => 1}).not_to include(:a => 1, :c => 1)
         | 
| 395 | 
            +
                    }.to fail_matching(%Q|expected #{{:a=>1, :b=>1}.inspect} not to include #{{:a=>1, :c=>1}.inspect}|)
         | 
| 354 396 | 
             
                  end
         | 
| 355 397 |  | 
| 356 398 | 
             
                  it "passes if target lacks both of the keys" do
         | 
| 357 | 
            -
                    {:a => 1, :b => 1}. | 
| 399 | 
            +
                    expect({:a => 1, :b => 1}).not_to include(:c => 1, :d => 1)
         | 
| 358 400 | 
             
                  end
         | 
| 359 401 | 
             
                end
         | 
| 360 402 |  | 
| 361 403 | 
             
                context 'for a non-hash target' do
         | 
| 362 404 | 
             
                  it "passes if the target does not contain the given hash" do
         | 
| 363 | 
            -
                    ['a', 'b']. | 
| 405 | 
            +
                    expect(['a', 'b']).not_to include(:a => 1, :b => 1)
         | 
| 364 406 | 
             
                  end
         | 
| 365 407 |  | 
| 366 408 | 
             
                  it "fails if the target contains the given hash" do
         | 
| 367 | 
            -
                     | 
| 368 | 
            -
                      ['a', { :a => 1, :b => 2 } ]. | 
| 369 | 
            -
                    }. | 
| 409 | 
            +
                    expect {
         | 
| 410 | 
            +
                      expect(['a', { :a => 1, :b => 2 } ]).not_to include(:a => 1, :b => 2)
         | 
| 411 | 
            +
                    }.to fail_matching(%Q|expected #{["a", {:a=>1, :b=>2}].inspect} not to include #{{:a=>1, :b=>2}.inspect}|)
         | 
| 412 | 
            +
                  end
         | 
| 413 | 
            +
                end
         | 
| 414 | 
            +
              end
         | 
| 415 | 
            +
            end
         | 
| 416 | 
            +
             | 
| 417 | 
            +
            RSpec::Matchers.define :a_string_containing do |expected|
         | 
| 418 | 
            +
              match do |actual|
         | 
| 419 | 
            +
                actual.include?(expected)
         | 
| 420 | 
            +
              end
         | 
| 421 | 
            +
             | 
| 422 | 
            +
              description do
         | 
| 423 | 
            +
                "a string containing '#{expected}'"
         | 
| 424 | 
            +
              end
         | 
| 425 | 
            +
            end
         | 
| 426 | 
            +
             | 
| 427 | 
            +
            describe "expect(...).to include(matcher)" do
         | 
| 428 | 
            +
              context 'for an array target' do
         | 
| 429 | 
            +
                it "passes if target includes an object that satisfies the matcher" do
         | 
| 430 | 
            +
                  expect(['foo', 'bar', 'baz']).to include(a_string_containing("ar"))
         | 
| 431 | 
            +
                end
         | 
| 432 | 
            +
             | 
| 433 | 
            +
                it "fails if target doesn't include object that satisfies the matcher" do
         | 
| 434 | 
            +
                  expect {
         | 
| 435 | 
            +
                    expect(['foo', 'bar', 'baz']).to include(a_string_containing("abc"))
         | 
| 436 | 
            +
                  }.to fail_matching(%Q|expected #{['foo', 'bar', 'baz'].inspect} to include a string containing 'abc'|)
         | 
| 437 | 
            +
                end
         | 
| 438 | 
            +
             | 
| 439 | 
            +
                it 'does not include a diff when the match fails' do
         | 
| 440 | 
            +
                  expect {
         | 
| 441 | 
            +
                    expect(['foo', 'bar', 'baz']).to include(a_string_containing("abc"))
         | 
| 442 | 
            +
                  }.to raise_error { |e|
         | 
| 443 | 
            +
                    expect(e.message).not_to match(/diff/i)
         | 
| 444 | 
            +
                  }
         | 
| 445 | 
            +
                end
         | 
| 446 | 
            +
             | 
| 447 | 
            +
                it 'does not treat an object that only implements #matches? as a matcher' do
         | 
| 448 | 
            +
                  domain = Struct.new(:domain) do
         | 
| 449 | 
            +
                    def matches?(url)
         | 
| 450 | 
            +
                      URI(url).host == self.domain
         | 
| 451 | 
            +
                    end
         | 
| 452 | 
            +
                  end
         | 
| 453 | 
            +
             | 
| 454 | 
            +
                  expect([domain.new("rspec.info")]).to include(domain.new("rspec.info"))
         | 
| 455 | 
            +
             | 
| 456 | 
            +
                  expect {
         | 
| 457 | 
            +
                    expect([domain.new("rspec.info")]).to include(domain.new("foo.com"))
         | 
| 458 | 
            +
                  }.to fail_matching("expected [#{domain.new("rspec.info").inspect}] to include")
         | 
| 459 | 
            +
                end
         | 
| 460 | 
            +
             | 
| 461 | 
            +
                it 'works with an old-style matcher that implements failure_message rather than failure_message_for_should' do
         | 
| 462 | 
            +
                  a_multiple_of = Class.new do
         | 
| 463 | 
            +
                    def initialize(expected)
         | 
| 464 | 
            +
                      @expected = expected
         | 
| 465 | 
            +
                    end
         | 
| 466 | 
            +
             | 
| 467 | 
            +
                    def matches?(actual)
         | 
| 468 | 
            +
                      (actual % @expected).zero?
         | 
| 469 | 
            +
                    end
         | 
| 470 | 
            +
             | 
| 471 | 
            +
                    def failure_message
         | 
| 472 | 
            +
                      "expected a multiple of #{@expected}"
         | 
| 473 | 
            +
                    end
         | 
| 370 474 | 
             
                  end
         | 
| 475 | 
            +
             | 
| 476 | 
            +
                  # Verify the matcher works normally
         | 
| 477 | 
            +
                  expect(10).to a_multiple_of.new(5)
         | 
| 478 | 
            +
             | 
| 479 | 
            +
                  expect {
         | 
| 480 | 
            +
                    expect(10).to a_multiple_of.new(7)
         | 
| 481 | 
            +
                  }.to fail_with("expected a multiple of 7")
         | 
| 482 | 
            +
             | 
| 483 | 
            +
                  expect([12, 13, 14]).to include(a_multiple_of.new(6))
         | 
| 484 | 
            +
             | 
| 485 | 
            +
                  expect {
         | 
| 486 | 
            +
                    expect([12, 13, 14]).to include(a_multiple_of.new(10))
         | 
| 487 | 
            +
                  }.to fail_matching("expected [12, 13, 14] to include")
         | 
| 488 | 
            +
                end
         | 
| 489 | 
            +
              end
         | 
| 490 | 
            +
            end
         | 
| 491 | 
            +
             | 
| 492 | 
            +
            describe "expect(...).to include(multiple, matcher, arguments)" do
         | 
| 493 | 
            +
              context 'for an array target' do
         | 
| 494 | 
            +
                it "passes if target includes items satisfying all matchers" do
         | 
| 495 | 
            +
                  expect(['foo', 'bar', 'baz']).to include(a_string_containing("ar"), a_string_containing('oo'))
         | 
| 496 | 
            +
                end
         | 
| 497 | 
            +
             | 
| 498 | 
            +
                it "fails if target does not include an item satisfying any one of the items" do
         | 
| 499 | 
            +
                  expect {
         | 
| 500 | 
            +
                    expect(['foo', 'bar', 'baz']).to include(a_string_containing("ar"), a_string_containing("abc"))
         | 
| 501 | 
            +
                  }.to fail_matching(%Q|expected #{['foo', 'bar', 'baz'].inspect} to include a string containing 'ar' and a string containing 'abc'|)
         | 
| 502 | 
            +
                end
         | 
| 503 | 
            +
             | 
| 504 | 
            +
                it 'does not include a diff when the match fails' do
         | 
| 505 | 
            +
                  expect {
         | 
| 506 | 
            +
                    expect(['foo', 'bar', 'baz']).to include(a_string_containing("ar"), a_string_containing("abc"))
         | 
| 507 | 
            +
                  }.to raise_error { |e|
         | 
| 508 | 
            +
                    expect(e.message).not_to match(/diff/i)
         | 
| 509 | 
            +
                  }
         | 
| 371 510 | 
             
                end
         | 
| 372 511 | 
             
              end
         | 
| 373 512 | 
             
            end
         | 
| 513 | 
            +
             | 
| 514 | 
            +
            describe "expect(...).not_to include(multiple, matcher, arguments)" do
         | 
| 515 | 
            +
              it "passes if none of the target values satisfies any of the matchers" do
         | 
| 516 | 
            +
                expect(['foo', 'bar', 'baz']).not_to include(a_string_containing("gh"), a_string_containing('de'))
         | 
| 517 | 
            +
              end
         | 
| 518 | 
            +
             | 
| 519 | 
            +
              it 'fails if all of the matchers are satisfied by one of the target values' do
         | 
| 520 | 
            +
                expect {
         | 
| 521 | 
            +
                  expect(['foo', 'bar', 'baz']).not_to include(a_string_containing("ar"), a_string_containing('az'))
         | 
| 522 | 
            +
                }.to fail_matching(%Q|expected #{['foo', 'bar', 'baz'].inspect} not to include a string containing 'ar' and a string containing 'az'|)
         | 
| 523 | 
            +
              end
         | 
| 524 | 
            +
             | 
| 525 | 
            +
              it 'fails if the some (but not all) of the matchers are satisifed' do
         | 
| 526 | 
            +
                expect {
         | 
| 527 | 
            +
                  expect(['foo', 'bar', 'baz']).not_to include(a_string_containing("ar"), a_string_containing('bz'))
         | 
| 528 | 
            +
                }.to fail_matching(%Q|expected #{['foo', 'bar', 'baz'].inspect} not to include a string containing 'ar' and a string containing 'bz'|)
         | 
| 529 | 
            +
              end
         | 
| 530 | 
            +
            end
         | 
| 531 | 
            +
             |