rspec-expectations 3.0.0.beta2 → 3.0.0.rc1
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.
- checksums.yaml +7 -0
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +2 -2
- data/.yardopts +0 -1
- data/Changelog.md +115 -35
- data/README.md +2 -2
- data/lib/rspec/expectations.rb +13 -8
- data/lib/rspec/{matchers → expectations}/configuration.rb +38 -13
- data/lib/rspec/expectations/expectation_target.rb +72 -8
- data/lib/rspec/expectations/fail_with.rb +10 -52
- data/lib/rspec/expectations/handler.rb +9 -11
- data/lib/rspec/expectations/syntax.rb +37 -35
- data/lib/rspec/expectations/version.rb +1 -1
- data/lib/rspec/matchers.rb +60 -9
- data/lib/rspec/matchers/aliased_matcher.rb +6 -0
- data/lib/rspec/matchers/built_in.rb +9 -1
- data/lib/rspec/matchers/built_in/all.rb +78 -0
- data/lib/rspec/matchers/built_in/base_matcher.rb +39 -1
- data/lib/rspec/matchers/built_in/be.rb +117 -42
- data/lib/rspec/matchers/built_in/be_between.rb +22 -0
- data/lib/rspec/matchers/built_in/be_instance_of.rb +11 -3
- data/lib/rspec/matchers/built_in/be_kind_of.rb +5 -0
- data/lib/rspec/matchers/built_in/be_within.rb +26 -6
- data/lib/rspec/matchers/built_in/change.rb +89 -13
- data/lib/rspec/matchers/built_in/compound.rb +19 -3
- data/lib/rspec/matchers/built_in/contain_exactly.rb +17 -6
- data/lib/rspec/matchers/built_in/cover.rb +3 -0
- data/lib/rspec/matchers/built_in/eq.rb +20 -5
- data/lib/rspec/matchers/built_in/eql.rb +15 -3
- data/lib/rspec/matchers/built_in/equal.rb +23 -6
- data/lib/rspec/matchers/built_in/exist.rb +74 -10
- data/lib/rspec/matchers/built_in/has.rb +58 -3
- data/lib/rspec/matchers/built_in/include.rb +16 -1
- data/lib/rspec/matchers/built_in/match.rb +14 -4
- data/lib/rspec/matchers/built_in/operators.rb +16 -0
- data/lib/rspec/matchers/built_in/output.rb +47 -5
- data/lib/rspec/matchers/built_in/raise_error.rb +40 -23
- data/lib/rspec/matchers/built_in/respond_to.rb +37 -16
- data/lib/rspec/matchers/built_in/satisfy.rb +15 -0
- data/lib/rspec/matchers/built_in/start_and_end_with.rb +29 -14
- data/lib/rspec/matchers/built_in/throw_symbol.rb +32 -3
- data/lib/rspec/matchers/built_in/yield.rb +148 -44
- data/lib/rspec/matchers/composable.rb +48 -7
- data/lib/rspec/matchers/dsl.rb +45 -17
- data/lib/rspec/matchers/generated_descriptions.rb +7 -0
- data/lib/rspec/matchers/matcher_delegator.rb +6 -2
- data/lib/rspec/matchers/pretty.rb +15 -19
- metadata +33 -236
- metadata.gz.sig +0 -0
- data/features/README.md +0 -48
- data/features/Upgrade.md +0 -53
- data/features/built_in_matchers/README.md +0 -96
- data/features/built_in_matchers/be.feature +0 -175
- data/features/built_in_matchers/be_within.feature +0 -48
- data/features/built_in_matchers/comparisons.feature +0 -97
- data/features/built_in_matchers/contain_exactly.feature +0 -46
- data/features/built_in_matchers/cover.feature +0 -47
- data/features/built_in_matchers/end_with.feature +0 -48
- data/features/built_in_matchers/equality.feature +0 -136
- data/features/built_in_matchers/exist.feature +0 -45
- data/features/built_in_matchers/expect_change.feature +0 -59
- data/features/built_in_matchers/expect_error.feature +0 -144
- data/features/built_in_matchers/include.feature +0 -126
- data/features/built_in_matchers/match.feature +0 -51
- data/features/built_in_matchers/output.feature +0 -70
- data/features/built_in_matchers/predicates.feature +0 -161
- data/features/built_in_matchers/respond_to.feature +0 -84
- data/features/built_in_matchers/satisfy.feature +0 -33
- data/features/built_in_matchers/start_with.feature +0 -48
- data/features/built_in_matchers/throw_symbol.feature +0 -91
- data/features/built_in_matchers/types.feature +0 -116
- data/features/built_in_matchers/yield.feature +0 -161
- data/features/composing_matchers.feature +0 -250
- data/features/compound_expectations.feature +0 -45
- data/features/custom_matchers/access_running_example.feature +0 -53
- data/features/custom_matchers/define_diffable_matcher.feature +0 -27
- data/features/custom_matchers/define_matcher.feature +0 -340
- data/features/custom_matchers/define_matcher_outside_rspec.feature +0 -34
- data/features/custom_matchers/define_matcher_with_fluent_interface.feature +0 -24
- data/features/customized_message.feature +0 -39
- data/features/diffing.feature +0 -85
- data/features/implicit_docstrings.feature +0 -52
- data/features/step_definitions/additional_cli_steps.rb +0 -22
- data/features/support/env.rb +0 -21
- data/features/support/rubinius.rb +0 -6
- data/features/syntax_configuration.feature +0 -71
- data/features/test_frameworks/minitest.feature +0 -44
- data/lib/rspec-expectations.rb +0 -1
- data/lib/rspec/expectations/diff_presenter.rb +0 -141
- data/lib/rspec/expectations/differ.rb +0 -44
- data/lib/rspec/expectations/encoded_string.rb +0 -56
- data/spec/rspec/expectations/diff_presenter_spec.rb +0 -249
- data/spec/rspec/expectations/encoded_string_spec.rb +0 -74
- data/spec/rspec/expectations/expectation_target_spec.rb +0 -82
- data/spec/rspec/expectations/extensions/kernel_spec.rb +0 -67
- data/spec/rspec/expectations/fail_with_spec.rb +0 -114
- data/spec/rspec/expectations/handler_spec.rb +0 -205
- data/spec/rspec/expectations/minitest_integration_spec.rb +0 -27
- data/spec/rspec/expectations/syntax_spec.rb +0 -89
- data/spec/rspec/expectations_spec.rb +0 -12
- data/spec/rspec/matchers/aliased_matcher_spec.rb +0 -48
- data/spec/rspec/matchers/aliases_spec.rb +0 -449
- data/spec/rspec/matchers/built_in/base_matcher_spec.rb +0 -83
- data/spec/rspec/matchers/built_in/be_between_spec.rb +0 -159
- data/spec/rspec/matchers/built_in/be_instance_of_spec.rb +0 -63
- data/spec/rspec/matchers/built_in/be_kind_of_spec.rb +0 -41
- data/spec/rspec/matchers/built_in/be_spec.rb +0 -592
- data/spec/rspec/matchers/built_in/be_within_spec.rb +0 -141
- data/spec/rspec/matchers/built_in/change_spec.rb +0 -808
- data/spec/rspec/matchers/built_in/compound_spec.rb +0 -292
- data/spec/rspec/matchers/built_in/contain_exactly_spec.rb +0 -441
- data/spec/rspec/matchers/built_in/cover_spec.rb +0 -69
- data/spec/rspec/matchers/built_in/eq_spec.rb +0 -156
- data/spec/rspec/matchers/built_in/eql_spec.rb +0 -41
- data/spec/rspec/matchers/built_in/equal_spec.rb +0 -106
- data/spec/rspec/matchers/built_in/exist_spec.rb +0 -124
- data/spec/rspec/matchers/built_in/has_spec.rb +0 -161
- data/spec/rspec/matchers/built_in/include_spec.rb +0 -540
- data/spec/rspec/matchers/built_in/match_spec.rb +0 -102
- data/spec/rspec/matchers/built_in/operators_spec.rb +0 -252
- data/spec/rspec/matchers/built_in/output_spec.rb +0 -165
- data/spec/rspec/matchers/built_in/raise_error_spec.rb +0 -461
- data/spec/rspec/matchers/built_in/respond_to_spec.rb +0 -292
- data/spec/rspec/matchers/built_in/satisfy_spec.rb +0 -44
- data/spec/rspec/matchers/built_in/start_and_end_with_spec.rb +0 -253
- data/spec/rspec/matchers/built_in/throw_symbol_spec.rb +0 -135
- data/spec/rspec/matchers/built_in/yield_spec.rb +0 -627
- data/spec/rspec/matchers/configuration_spec.rb +0 -213
- data/spec/rspec/matchers/description_generation_spec.rb +0 -191
- data/spec/rspec/matchers/dsl_spec.rb +0 -895
- data/spec/rspec/matchers/legacy_spec.rb +0 -101
- data/spec/rspec/matchers_spec.rb +0 -74
- data/spec/spec_helper.rb +0 -85
- data/spec/support/matchers.rb +0 -22
- data/spec/support/shared_examples.rb +0 -35
@@ -1,161 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe "expect(...).to have_sym(*args)" do
|
4
|
-
it_behaves_like "an RSpec matcher", :valid_value => { :a => 1 },
|
5
|
-
:invalid_value => {} do
|
6
|
-
let(:matcher) { have_key(:a) }
|
7
|
-
end
|
8
|
-
|
9
|
-
it "passes if #has_sym?(*args) returns true" do
|
10
|
-
expect({:a => "A"}).to have_key(:a)
|
11
|
-
end
|
12
|
-
|
13
|
-
it "fails if #has_sym?(*args) returns false" do
|
14
|
-
expect {
|
15
|
-
expect({:b => "B"}).to have_key(:a)
|
16
|
-
}.to fail_with("expected #has_key?(:a) to return true, got false")
|
17
|
-
end
|
18
|
-
|
19
|
-
obj_with_block_method = Object.new
|
20
|
-
def obj_with_block_method.has_some_stuff?; yield; end
|
21
|
-
|
22
|
-
it 'forwards the given `{ }` block on to the `has_xyz?` method' do
|
23
|
-
expect(obj_with_block_method).to have_some_stuff { true }
|
24
|
-
expect(obj_with_block_method).to_not have_some_stuff { false }
|
25
|
-
end
|
26
|
-
|
27
|
-
it 'forwards the given `do..end` block on to the `has_xyz?` method' do
|
28
|
-
expect(obj_with_block_method).to have_some_stuff do
|
29
|
-
true
|
30
|
-
end
|
31
|
-
|
32
|
-
expect(obj_with_block_method).to_not have_some_stuff do
|
33
|
-
false
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
it 'favors a curly brace block over a do...end one since it binds to the matcher method' do
|
38
|
-
expect(obj_with_block_method).to have_some_stuff { true } do
|
39
|
-
false
|
40
|
-
end
|
41
|
-
|
42
|
-
expect(obj_with_block_method).not_to have_some_stuff { false } do
|
43
|
-
true
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
it 'does not include any args in the failure message if no args were given to the matcher' do
|
48
|
-
o = Object.new
|
49
|
-
def o.has_some_stuff?; false; end
|
50
|
-
expect {
|
51
|
-
expect(o).to have_some_stuff
|
52
|
-
}.to fail_with("expected #has_some_stuff? to return true, got false")
|
53
|
-
end
|
54
|
-
|
55
|
-
it 'includes multiple args in the failure message if multiple args were given to the matcher' do
|
56
|
-
o = Object.new
|
57
|
-
def o.has_some_stuff?(*_); false; end
|
58
|
-
expect {
|
59
|
-
expect(o).to have_some_stuff(:a, 7, "foo")
|
60
|
-
}.to fail_with('expected #has_some_stuff?(:a, 7, "foo") to return true, got false')
|
61
|
-
end
|
62
|
-
|
63
|
-
it "fails if #has_sym?(*args) returns nil" do
|
64
|
-
klass = Class.new do
|
65
|
-
def has_foo?
|
66
|
-
end
|
67
|
-
end
|
68
|
-
expect {
|
69
|
-
expect(klass.new).to have_foo
|
70
|
-
}.to fail_with(/expected #has_foo.* to return true, got false/)
|
71
|
-
end
|
72
|
-
|
73
|
-
it "fails if target does not respond to #has_sym?" do
|
74
|
-
expect {
|
75
|
-
expect(Object.new).to have_key(:a)
|
76
|
-
}.to raise_error(NoMethodError)
|
77
|
-
end
|
78
|
-
|
79
|
-
it "reraises an exception thrown in #has_sym?(*args)" do
|
80
|
-
o = Object.new
|
81
|
-
def o.has_sym?(*args)
|
82
|
-
raise "Funky exception"
|
83
|
-
end
|
84
|
-
expect {
|
85
|
-
expect(o).to have_sym(:foo)
|
86
|
-
}.to raise_error("Funky exception")
|
87
|
-
end
|
88
|
-
|
89
|
-
it 'allows composable aliases to be defined' do
|
90
|
-
RSpec::Matchers.alias_matcher :an_object_having_sym, :have_sym
|
91
|
-
o = Object.new
|
92
|
-
def o.has_sym?(sym); sym == :foo; end
|
93
|
-
|
94
|
-
expect(o).to an_object_having_sym(:foo)
|
95
|
-
expect(o).not_to an_object_having_sym(:bar)
|
96
|
-
|
97
|
-
expect(an_object_having_sym(:foo).description).to eq("an object having sym :foo")
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
describe "expect(...).not_to have_sym(*args)" do
|
102
|
-
it "passes if #has_sym?(*args) returns false" do
|
103
|
-
expect({:a => "A"}).not_to have_key(:b)
|
104
|
-
end
|
105
|
-
|
106
|
-
it "passes if #has_sym?(*args) returns nil" do
|
107
|
-
klass = Class.new do
|
108
|
-
def has_foo?
|
109
|
-
end
|
110
|
-
end
|
111
|
-
expect(klass.new).not_to have_foo
|
112
|
-
end
|
113
|
-
|
114
|
-
it "fails if #has_sym?(*args) returns true" do
|
115
|
-
expect {
|
116
|
-
expect({:a => "A"}).not_to have_key(:a)
|
117
|
-
}.to fail_with("expected #has_key?(:a) to return false, got true")
|
118
|
-
end
|
119
|
-
|
120
|
-
it "fails if target does not respond to #has_sym?" do
|
121
|
-
expect {
|
122
|
-
expect(Object.new).to have_key(:a)
|
123
|
-
}.to raise_error(NoMethodError)
|
124
|
-
end
|
125
|
-
|
126
|
-
it "reraises an exception thrown in #has_sym?(*args)" do
|
127
|
-
o = Object.new
|
128
|
-
def o.has_sym?(*args)
|
129
|
-
raise "Funky exception"
|
130
|
-
end
|
131
|
-
expect {
|
132
|
-
expect(o).not_to have_sym(:foo)
|
133
|
-
}.to raise_error("Funky exception")
|
134
|
-
end
|
135
|
-
|
136
|
-
it 'does not include any args in the failure message if no args were given to the matcher' do
|
137
|
-
o = Object.new
|
138
|
-
def o.has_some_stuff?; true; end
|
139
|
-
expect {
|
140
|
-
expect(o).not_to have_some_stuff
|
141
|
-
}.to fail_with("expected #has_some_stuff? to return false, got true")
|
142
|
-
end
|
143
|
-
|
144
|
-
it 'includes multiple args in the failure message if multiple args were given to the matcher' do
|
145
|
-
o = Object.new
|
146
|
-
def o.has_some_stuff?(*_); true; end
|
147
|
-
expect {
|
148
|
-
expect(o).not_to have_some_stuff(:a, 7, "foo")
|
149
|
-
}.to fail_with('expected #has_some_stuff?(:a, 7, "foo") to return false, got true')
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
describe "has" do
|
154
|
-
it "works when the target implements #send" do
|
155
|
-
o = {:a => "A"}
|
156
|
-
def o.send(*args); raise "DOH! Library developers shouldn't use #send!" end
|
157
|
-
expect {
|
158
|
-
expect(o).to have_key(:a)
|
159
|
-
}.not_to raise_error
|
160
|
-
end
|
161
|
-
end
|
@@ -1,540 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'uri'
|
3
|
-
|
4
|
-
describe "#include matcher" do
|
5
|
-
it "is diffable" do
|
6
|
-
expect(include("a")).to be_diffable
|
7
|
-
end
|
8
|
-
|
9
|
-
describe "expect(...).to include(with_one_arg)" do
|
10
|
-
it_behaves_like "an RSpec matcher", :valid_value => [1, 2], :invalid_value => [1] do
|
11
|
-
let(:matcher) { include(2) }
|
12
|
-
end
|
13
|
-
|
14
|
-
context "for a string target" do
|
15
|
-
it "passes if target includes expected" do
|
16
|
-
expect("abc").to include("a")
|
17
|
-
end
|
18
|
-
|
19
|
-
it "fails if target does not include expected" do
|
20
|
-
expect {
|
21
|
-
expect("abc").to include("d")
|
22
|
-
}.to fail_matching("expected \"abc\" to include \"d\"")
|
23
|
-
end
|
24
|
-
|
25
|
-
it "includes a diff when actual is multiline" do
|
26
|
-
expect {
|
27
|
-
expect("abc\ndef").to include("g")
|
28
|
-
}.to fail_matching("expected \"abc\\ndef\" to include \"g\"\nDiff")
|
29
|
-
end
|
30
|
-
|
31
|
-
it "includes a diff when actual is multiline and there are multiple expecteds" do
|
32
|
-
expect {
|
33
|
-
expect("abc\ndef").to include("g", "h")
|
34
|
-
}.to fail_matching("expected \"abc\\ndef\" to include \"g\" and \"h\"\nDiff")
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
context "for an array target" do
|
39
|
-
it "passes if target includes expected" do
|
40
|
-
expect([1,2,3]).to include(3)
|
41
|
-
end
|
42
|
-
|
43
|
-
it "fails if target does not include expected" do
|
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)
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
context "for a hash target" do
|
65
|
-
it 'passes if target has the expected as a key' do
|
66
|
-
expect({:key => 'value'}).to include(:key)
|
67
|
-
end
|
68
|
-
|
69
|
-
it "fails if target does not include expected" do
|
70
|
-
expect {
|
71
|
-
expect({:key => 'value'}).to include(:other)
|
72
|
-
}.to fail_matching(%Q|expected {:key => "value"} to include :other|)
|
73
|
-
end
|
74
|
-
|
75
|
-
it "fails if target doesn't have a key and we expect nil" do
|
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
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
describe "expect(...).to include(with, multiple, args)" do
|
99
|
-
it "has a description" do
|
100
|
-
matcher = include("a")
|
101
|
-
expect(matcher.description).to eq("include \"a\"")
|
102
|
-
end
|
103
|
-
context "for a string target" do
|
104
|
-
it "passes if target includes all items" do
|
105
|
-
expect("a string").to include("str", "a")
|
106
|
-
end
|
107
|
-
|
108
|
-
it "fails if target does not include any one of the items" do
|
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"})
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
context "for an array target" do
|
116
|
-
it "passes if target includes all items" do
|
117
|
-
expect([1,2,3]).to include(1,2,3)
|
118
|
-
end
|
119
|
-
|
120
|
-
it "fails if target does not include any one of the items" do
|
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")
|
124
|
-
end
|
125
|
-
end
|
126
|
-
|
127
|
-
context "for a hash target" do
|
128
|
-
it 'passes if target includes all items as keys' do
|
129
|
-
expect({:key => 'value', :other => 'value'}).to include(:key, :other)
|
130
|
-
end
|
131
|
-
|
132
|
-
it 'fails if target is missing any item as a key' do
|
133
|
-
expect {
|
134
|
-
expect({:key => 'value'}).to include(:key, :other)
|
135
|
-
}.to fail_matching(%Q|expected {:key => "value"} to include :key and :other|)
|
136
|
-
end
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
describe "expect(...).not_to include(expected)" do
|
141
|
-
context "for a string target" do
|
142
|
-
it "passes if target does not include expected" do
|
143
|
-
expect("abc").not_to include("d")
|
144
|
-
end
|
145
|
-
|
146
|
-
it "fails if target includes expected" do
|
147
|
-
expect {
|
148
|
-
expect("abc").not_to include("c")
|
149
|
-
}.to fail_with("expected \"abc\" not to include \"c\"")
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
context "for an array target" do
|
154
|
-
it "passes if target does not include expected" do
|
155
|
-
expect([1,2,3]).not_to include(4)
|
156
|
-
end
|
157
|
-
|
158
|
-
it "fails if target includes expected" do
|
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")
|
174
|
-
end
|
175
|
-
end
|
176
|
-
|
177
|
-
context "for a hash target" do
|
178
|
-
it 'passes if target does not have the expected as a key' do
|
179
|
-
expect({:other => 'value'}).not_to include(:key)
|
180
|
-
end
|
181
|
-
|
182
|
-
it "fails if target includes expected key" do
|
183
|
-
expect {
|
184
|
-
expect({:key => 'value'}).not_to include(:key)
|
185
|
-
}.to fail_matching(%Q|expected {:key => "value"} not to include :key|)
|
186
|
-
end
|
187
|
-
end
|
188
|
-
|
189
|
-
end
|
190
|
-
|
191
|
-
describe "expect(...).not_to include(with, multiple, args)" do
|
192
|
-
context "for a string target" do
|
193
|
-
it "passes if the target does not include any of the expected" do
|
194
|
-
expect("abc").not_to include("d", "e", "f")
|
195
|
-
end
|
196
|
-
|
197
|
-
it "fails if the target includes all of the expected" do
|
198
|
-
expect {
|
199
|
-
expect("abc").not_to include("c", "a")
|
200
|
-
}.to fail_with('expected "abc" not to include "c" and "a"')
|
201
|
-
end
|
202
|
-
|
203
|
-
it "fails if the target includes some (but not all) of the expected" do
|
204
|
-
expect {
|
205
|
-
expect("abc").not_to include("d", "a")
|
206
|
-
}.to fail_with(%q{expected "abc" not to include "d" and "a"})
|
207
|
-
end
|
208
|
-
end
|
209
|
-
|
210
|
-
context "for a hash target" do
|
211
|
-
it "passes if it does not include any of the expected keys" do
|
212
|
-
expect({ :a => 1, :b => 2 }).not_to include(:c, :d)
|
213
|
-
end
|
214
|
-
|
215
|
-
it "fails if the target includes all of the expected keys" do
|
216
|
-
expect {
|
217
|
-
expect({ :a => 1, :b => 2 }).not_to include(:a, :b)
|
218
|
-
}.to fail_matching(%Q|expected #{hash_inspect :a => 1, :b => 2} not to include :a and :b|)
|
219
|
-
end
|
220
|
-
|
221
|
-
it "fails if the target includes some (but not all) of the expected keys" do
|
222
|
-
expect {
|
223
|
-
expect({ :a => 1, :b => 2 }).not_to include(:d, :b)
|
224
|
-
}.to fail_matching(%Q|expected #{hash_inspect :a => 1, :b => 2} not to include :d and :b|)
|
225
|
-
end
|
226
|
-
end
|
227
|
-
|
228
|
-
context "for an array target" do
|
229
|
-
it "passes if the target does not include any of the expected" do
|
230
|
-
expect([1, 2, 3]).not_to include(4, 5, 6)
|
231
|
-
end
|
232
|
-
|
233
|
-
it "fails if the target includes all of the expected" do
|
234
|
-
expect {
|
235
|
-
expect([1, 2, 3]).not_to include(3, 1)
|
236
|
-
}.to fail_with(%q{expected [1, 2, 3] not to include 3 and 1})
|
237
|
-
end
|
238
|
-
|
239
|
-
it "fails if the target includes some (but not all) of the expected" do
|
240
|
-
expect {
|
241
|
-
expect([1, 2, 3]).not_to include(4, 1)
|
242
|
-
}.to fail_with(%q{expected [1, 2, 3] not to include 4 and 1})
|
243
|
-
end
|
244
|
-
end
|
245
|
-
end
|
246
|
-
|
247
|
-
describe "expect(...).to include(:key => value)" do
|
248
|
-
context 'for a hash target' do
|
249
|
-
it "passes if target includes the key/value pair" do
|
250
|
-
expect({:key => 'value'}).to include(:key => 'value')
|
251
|
-
end
|
252
|
-
|
253
|
-
it "passes if target includes the key/value pair among others" do
|
254
|
-
expect({:key => 'value', :other => 'different'}).to include(:key => 'value')
|
255
|
-
end
|
256
|
-
|
257
|
-
it "fails if target has a different value for key" do
|
258
|
-
expect {
|
259
|
-
expect({:key => 'different'}).to include(:key => 'value')
|
260
|
-
}.to fail_matching(%Q|expected {:key => "different"} to include {:key => "value"}|)
|
261
|
-
end
|
262
|
-
|
263
|
-
it "fails if target has a different key" do
|
264
|
-
expect {
|
265
|
-
expect({:other => 'value'}).to include(:key => 'value')
|
266
|
-
}.to fail_matching(%Q|expected {:other => "value"} to include {:key => "value"}|)
|
267
|
-
end
|
268
|
-
end
|
269
|
-
|
270
|
-
context 'for a non-hash target' do
|
271
|
-
it "fails if the target does not contain the given hash" do
|
272
|
-
expect {
|
273
|
-
expect(['a', 'b']).to include(:key => 'value')
|
274
|
-
}.to fail_matching(%q|expected ["a", "b"] to include {:key => "value"}|)
|
275
|
-
end
|
276
|
-
|
277
|
-
it "passes if the target contains the given hash" do
|
278
|
-
expect(['a', { :key => 'value' } ]).to include(:key => 'value')
|
279
|
-
end
|
280
|
-
end
|
281
|
-
end
|
282
|
-
|
283
|
-
describe "expect(...).not_to include(:key => value)" do
|
284
|
-
context 'for a hash target' do
|
285
|
-
it "fails if target includes the key/value pair" do
|
286
|
-
expect {
|
287
|
-
expect({:key => 'value'}).not_to include(:key => 'value')
|
288
|
-
}.to fail_matching(%Q|expected {:key => "value"} not to include {:key => "value"}|)
|
289
|
-
end
|
290
|
-
|
291
|
-
it "fails if target includes the key/value pair among others" do
|
292
|
-
expect {
|
293
|
-
expect({:key => 'value', :other => 'different'}).not_to include(:key => 'value')
|
294
|
-
}.to fail_matching(%Q|expected #{hash_inspect :key => "value", :other => "different"} not to include {:key => "value"}|)
|
295
|
-
end
|
296
|
-
|
297
|
-
it "passes if target has a different value for key" do
|
298
|
-
expect({:key => 'different'}).not_to include(:key => 'value')
|
299
|
-
end
|
300
|
-
|
301
|
-
it "passes if target has a different key" do
|
302
|
-
expect({:other => 'value'}).not_to include(:key => 'value')
|
303
|
-
end
|
304
|
-
end
|
305
|
-
|
306
|
-
context "for a non-hash target" do
|
307
|
-
it "passes if the target does not contain the given hash" do
|
308
|
-
expect(['a', 'b']).not_to include(:key => 'value')
|
309
|
-
end
|
310
|
-
|
311
|
-
it "fails if the target contains the given hash" do
|
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"}|)
|
315
|
-
end
|
316
|
-
end
|
317
|
-
end
|
318
|
-
|
319
|
-
describe "expect(...).to include(:key1 => value1, :key2 => value2)" do
|
320
|
-
context 'for a hash target' do
|
321
|
-
it "passes if target includes the key/value pairs" do
|
322
|
-
expect({:a => 1, :b => 2}).to include(:b => 2, :a => 1)
|
323
|
-
end
|
324
|
-
|
325
|
-
it "passes if target includes the key/value pairs among others" do
|
326
|
-
expect({:a => 1, :c => 3, :b => 2}).to include(:b => 2, :a => 1)
|
327
|
-
end
|
328
|
-
|
329
|
-
it "fails if target has a different value for one of the keys" do
|
330
|
-
expect {
|
331
|
-
expect({:a => 1, :b => 2}).to include(:a => 2, :b => 2)
|
332
|
-
}.to fail_matching(%Q|expected #{hash_inspect :a => 1, :b => 2} to include #{hash_inspect :a => 2, :b => 2}|)
|
333
|
-
end
|
334
|
-
|
335
|
-
it "fails if target has a different value for both of the keys" do
|
336
|
-
expect {
|
337
|
-
expect({:a => 1, :b => 1}).to include(:a => 2, :b => 2)
|
338
|
-
}.to fail_matching(%Q|expected #{hash_inspect :a => 1, :b => 1} to include #{hash_inspect :a => 2, :b => 2}|)
|
339
|
-
end
|
340
|
-
|
341
|
-
it "fails if target lacks one of the keys" do
|
342
|
-
expect {
|
343
|
-
expect({:a => 1, :b => 1}).to include(:a => 1, :c => 1)
|
344
|
-
}.to fail_matching(%Q|expected #{hash_inspect :a => 1, :b => 1} to include #{hash_inspect :a => 1, :c => 1}|)
|
345
|
-
end
|
346
|
-
|
347
|
-
it "fails if target lacks both of the keys" do
|
348
|
-
expect {
|
349
|
-
expect({:a => 1, :b => 1}).to include(:c => 1, :d => 1)
|
350
|
-
}.to fail_matching(%Q|expected #{hash_inspect :a => 1, :b => 1} to include #{hash_inspect :c => 1, :d => 1}|)
|
351
|
-
end
|
352
|
-
end
|
353
|
-
|
354
|
-
context 'for a non-hash target' do
|
355
|
-
it "fails if the target does not contain the given hash" do
|
356
|
-
expect {
|
357
|
-
expect(['a', 'b']).to include(:a => 1, :b => 1)
|
358
|
-
}.to fail_matching(%Q|expected ["a", "b"] to include #{hash_inspect :a => 1, :b => 1}|)
|
359
|
-
end
|
360
|
-
|
361
|
-
it "passes if the target contains the given hash" do
|
362
|
-
expect(['a', { :a => 1, :b => 2 } ]).to include(:a => 1, :b => 2)
|
363
|
-
end
|
364
|
-
end
|
365
|
-
end
|
366
|
-
|
367
|
-
describe "expect(...).not_to include(:key1 => value1, :key2 => value2)" do
|
368
|
-
context 'for a hash target' do
|
369
|
-
it "fails if target includes the key/value pairs" do
|
370
|
-
expect {
|
371
|
-
expect({:a => 1, :b => 2}).not_to include(:a => 1, :b => 2)
|
372
|
-
}.to fail_matching(%Q|expected #{hash_inspect :a => 1, :b => 2} not to include #{hash_inspect :a => 1, :b => 2}|)
|
373
|
-
end
|
374
|
-
|
375
|
-
it "fails if target includes the key/value pairs among others" do
|
376
|
-
hash = {:a => 1, :b => 2, :c => 3}
|
377
|
-
expect {
|
378
|
-
expect(hash).not_to include(:a => 1, :b => 2)
|
379
|
-
}.to fail_matching(%Q|expected #{hash_inspect :a => 1, :b => 2, :c => 3} not to include #{hash_inspect :a => 1, :b => 2}|)
|
380
|
-
end
|
381
|
-
|
382
|
-
it "fails if target has a different value for one of the keys" do
|
383
|
-
expect {
|
384
|
-
expect({:a => 1, :b => 2}).not_to include(:a => 2, :b => 2)
|
385
|
-
}.to fail_matching(%Q|expected #{hash_inspect :a => 1, :b => 2} not to include #{hash_inspect :a => 2, :b => 2}|)
|
386
|
-
end
|
387
|
-
|
388
|
-
it "passes if target has a different value for both of the keys" do
|
389
|
-
expect({:a => 1, :b => 1}).not_to include(:a => 2, :b => 2)
|
390
|
-
end
|
391
|
-
|
392
|
-
it "fails if target lacks one of the keys" do
|
393
|
-
expect {
|
394
|
-
expect({:a => 1, :b => 1}).not_to include(:a => 1, :c => 1)
|
395
|
-
}.to fail_matching(%Q|expected #{hash_inspect :a => 1, :b => 1} not to include #{hash_inspect :a => 1, :c => 1}|)
|
396
|
-
end
|
397
|
-
|
398
|
-
it "passes if target lacks both of the keys" do
|
399
|
-
expect({:a => 1, :b => 1}).not_to include(:c => 1, :d => 1)
|
400
|
-
end
|
401
|
-
end
|
402
|
-
|
403
|
-
context 'for a non-hash target' do
|
404
|
-
it "passes if the target does not contain the given hash" do
|
405
|
-
expect(['a', 'b']).not_to include(:a => 1, :b => 1)
|
406
|
-
end
|
407
|
-
|
408
|
-
it "fails if the target contains the given hash" do
|
409
|
-
expect {
|
410
|
-
expect(['a', { :a => 1, :b => 2 } ]).not_to include(:a => 1, :b => 2)
|
411
|
-
}.to fail_matching(%Q|expected ["a", #{hash_inspect :a => 1, :b => 2}] not to include #{hash_inspect :a => 1, :b => 2}|)
|
412
|
-
end
|
413
|
-
end
|
414
|
-
end
|
415
|
-
|
416
|
-
describe "Composing matchers with `include`" do
|
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(array).to include(matcher)" do
|
428
|
-
it "passes when the matcher matches one of the values" do
|
429
|
-
expect([10, 20, 30]).to include( a_value_within(5).of(24) )
|
430
|
-
end
|
431
|
-
|
432
|
-
it 'provides a description' do
|
433
|
-
description = include( a_value_within(5).of(24) ).description
|
434
|
-
expect(description).to eq("include (a value within 5 of 24)")
|
435
|
-
end
|
436
|
-
|
437
|
-
it 'fails with a clear message when the matcher matches none of the values' do
|
438
|
-
expect {
|
439
|
-
expect([10, 30]).to include( a_value_within(5).of(24) )
|
440
|
-
}.to fail_with("expected [10, 30] to include (a value within 5 of 24)")
|
441
|
-
end
|
442
|
-
|
443
|
-
it 'works with comparison matchers' do
|
444
|
-
expect {
|
445
|
-
expect([100, 200]).to include(a_value < 90)
|
446
|
-
}.to fail_with("expected [100, 200] to include (a value < 90)")
|
447
|
-
|
448
|
-
expect([100, 200]).to include(a_value > 150)
|
449
|
-
end
|
450
|
-
|
451
|
-
it 'does not treat an object that only implements #matches? as a matcher' do
|
452
|
-
domain = Struct.new(:domain) do
|
453
|
-
def matches?(url)
|
454
|
-
URI(url).host == self.domain
|
455
|
-
end
|
456
|
-
end
|
457
|
-
|
458
|
-
expect([domain.new("rspec.info")]).to include(domain.new("rspec.info"))
|
459
|
-
|
460
|
-
expect {
|
461
|
-
expect([domain.new("rspec.info")]).to include(domain.new("foo.com"))
|
462
|
-
}.to fail_matching("expected [#{domain.new("rspec.info").inspect}] to include")
|
463
|
-
end
|
464
|
-
end
|
465
|
-
|
466
|
-
describe "expect(array).to include(multiple, matcher, arguments)" do
|
467
|
-
it "passes if target includes items satisfying all matchers" do
|
468
|
-
expect(['foo', 'bar', 'baz']).to include(a_string_containing("ar"), a_string_containing('oo'))
|
469
|
-
end
|
470
|
-
|
471
|
-
it "fails if target does not include an item satisfying any one of the items" do
|
472
|
-
expect {
|
473
|
-
expect(['foo', 'bar', 'baz']).to include(a_string_containing("ar"), a_string_containing("abc"))
|
474
|
-
}.to fail_matching(%Q|expected #{['foo', 'bar', 'baz'].inspect} to include (a string containing 'ar') and (a string containing 'abc')|)
|
475
|
-
end
|
476
|
-
end
|
477
|
-
|
478
|
-
describe "expect(hash).to include(key => matcher)" do
|
479
|
-
it "passes when the matcher matches" do
|
480
|
-
expect(:a => 12).to include(:a => a_value_within(3).of(10))
|
481
|
-
end
|
482
|
-
|
483
|
-
it 'provides a description' do
|
484
|
-
description = include(:a => a_value_within(3).of(10)).description
|
485
|
-
expect(description).to eq("include {:a => (a value within 3 of 10)}")
|
486
|
-
end
|
487
|
-
|
488
|
-
it "fails with a clear message when the matcher does not match" do
|
489
|
-
expect {
|
490
|
-
expect(:a => 15).to include(:a => a_value_within(3).of(10))
|
491
|
-
}.to fail_matching("expected {:a => 15} to include {:a => (a value within 3 of 10)}")
|
492
|
-
end
|
493
|
-
end
|
494
|
-
|
495
|
-
describe "expect(hash).to include(key_matcher)" do
|
496
|
-
it "passes when the matcher matches a key", :if => (RUBY_VERSION.to_f > 1.8) do
|
497
|
-
expect(:drink => "water", :food => "bread").to include(a_string_matching(/foo/))
|
498
|
-
end
|
499
|
-
|
500
|
-
it 'provides a description' do
|
501
|
-
description = include(a_string_matching(/foo/)).description
|
502
|
-
expect(description).to eq("include (a string matching /foo/)")
|
503
|
-
end
|
504
|
-
|
505
|
-
it 'fails with a clear message when the matcher does not match', :if => (RUBY_VERSION.to_f > 1.8) do
|
506
|
-
expect {
|
507
|
-
expect(:drink => "water", :food => "bread").to include(a_string_matching(/bar/))
|
508
|
-
}.to fail_matching('expected {:drink => "water", :food => "bread"} to include (a string matching /bar/)')
|
509
|
-
end
|
510
|
-
end
|
511
|
-
|
512
|
-
describe "expect(array).not_to include(multiple, matcher, arguments)" do
|
513
|
-
it "passes if none of the target values satisfies any of the matchers" do
|
514
|
-
expect(['foo', 'bar', 'baz']).not_to include(a_string_containing("gh"), a_string_containing('de'))
|
515
|
-
end
|
516
|
-
|
517
|
-
it 'fails if all of the matchers are satisfied by one of the target values' do
|
518
|
-
expect {
|
519
|
-
expect(['foo', 'bar', 'baz']).not_to include(a_string_containing("ar"), a_string_containing('az'))
|
520
|
-
}.to fail_matching(%Q|expected #{['foo', 'bar', 'baz'].inspect} not to include (a string containing 'ar') and (a string containing 'az')|)
|
521
|
-
end
|
522
|
-
|
523
|
-
it 'fails if the some (but not all) of the matchers are satisifed' do
|
524
|
-
expect {
|
525
|
-
expect(['foo', 'bar', 'baz']).not_to include(a_string_containing("ar"), a_string_containing('bz'))
|
526
|
-
}.to fail_matching(%Q|expected #{['foo', 'bar', 'baz'].inspect} not to include (a string containing 'ar') and (a string containing 'bz')|)
|
527
|
-
end
|
528
|
-
end
|
529
|
-
end
|
530
|
-
|
531
|
-
include RSpec::Matchers::Pretty
|
532
|
-
# We have to use Hash#inspect in examples that have multi-entry
|
533
|
-
# hashes because the #inspect output on 1.8.7 is non-deterministic
|
534
|
-
# due to the fact that hashes are not ordered. So we can't simply
|
535
|
-
# put a literal string for what we expect because it varies.
|
536
|
-
def hash_inspect(hash)
|
537
|
-
improve_hash_formatting(hash.inspect)
|
538
|
-
end
|
539
|
-
end
|
540
|
-
|