rspec-expectations 3.0.0.beta2 → 3.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (135) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +2 -2
  4. data/.yardopts +0 -1
  5. data/Changelog.md +115 -35
  6. data/README.md +2 -2
  7. data/lib/rspec/expectations.rb +13 -8
  8. data/lib/rspec/{matchers → expectations}/configuration.rb +38 -13
  9. data/lib/rspec/expectations/expectation_target.rb +72 -8
  10. data/lib/rspec/expectations/fail_with.rb +10 -52
  11. data/lib/rspec/expectations/handler.rb +9 -11
  12. data/lib/rspec/expectations/syntax.rb +37 -35
  13. data/lib/rspec/expectations/version.rb +1 -1
  14. data/lib/rspec/matchers.rb +60 -9
  15. data/lib/rspec/matchers/aliased_matcher.rb +6 -0
  16. data/lib/rspec/matchers/built_in.rb +9 -1
  17. data/lib/rspec/matchers/built_in/all.rb +78 -0
  18. data/lib/rspec/matchers/built_in/base_matcher.rb +39 -1
  19. data/lib/rspec/matchers/built_in/be.rb +117 -42
  20. data/lib/rspec/matchers/built_in/be_between.rb +22 -0
  21. data/lib/rspec/matchers/built_in/be_instance_of.rb +11 -3
  22. data/lib/rspec/matchers/built_in/be_kind_of.rb +5 -0
  23. data/lib/rspec/matchers/built_in/be_within.rb +26 -6
  24. data/lib/rspec/matchers/built_in/change.rb +89 -13
  25. data/lib/rspec/matchers/built_in/compound.rb +19 -3
  26. data/lib/rspec/matchers/built_in/contain_exactly.rb +17 -6
  27. data/lib/rspec/matchers/built_in/cover.rb +3 -0
  28. data/lib/rspec/matchers/built_in/eq.rb +20 -5
  29. data/lib/rspec/matchers/built_in/eql.rb +15 -3
  30. data/lib/rspec/matchers/built_in/equal.rb +23 -6
  31. data/lib/rspec/matchers/built_in/exist.rb +74 -10
  32. data/lib/rspec/matchers/built_in/has.rb +58 -3
  33. data/lib/rspec/matchers/built_in/include.rb +16 -1
  34. data/lib/rspec/matchers/built_in/match.rb +14 -4
  35. data/lib/rspec/matchers/built_in/operators.rb +16 -0
  36. data/lib/rspec/matchers/built_in/output.rb +47 -5
  37. data/lib/rspec/matchers/built_in/raise_error.rb +40 -23
  38. data/lib/rspec/matchers/built_in/respond_to.rb +37 -16
  39. data/lib/rspec/matchers/built_in/satisfy.rb +15 -0
  40. data/lib/rspec/matchers/built_in/start_and_end_with.rb +29 -14
  41. data/lib/rspec/matchers/built_in/throw_symbol.rb +32 -3
  42. data/lib/rspec/matchers/built_in/yield.rb +148 -44
  43. data/lib/rspec/matchers/composable.rb +48 -7
  44. data/lib/rspec/matchers/dsl.rb +45 -17
  45. data/lib/rspec/matchers/generated_descriptions.rb +7 -0
  46. data/lib/rspec/matchers/matcher_delegator.rb +6 -2
  47. data/lib/rspec/matchers/pretty.rb +15 -19
  48. metadata +33 -236
  49. metadata.gz.sig +0 -0
  50. data/features/README.md +0 -48
  51. data/features/Upgrade.md +0 -53
  52. data/features/built_in_matchers/README.md +0 -96
  53. data/features/built_in_matchers/be.feature +0 -175
  54. data/features/built_in_matchers/be_within.feature +0 -48
  55. data/features/built_in_matchers/comparisons.feature +0 -97
  56. data/features/built_in_matchers/contain_exactly.feature +0 -46
  57. data/features/built_in_matchers/cover.feature +0 -47
  58. data/features/built_in_matchers/end_with.feature +0 -48
  59. data/features/built_in_matchers/equality.feature +0 -136
  60. data/features/built_in_matchers/exist.feature +0 -45
  61. data/features/built_in_matchers/expect_change.feature +0 -59
  62. data/features/built_in_matchers/expect_error.feature +0 -144
  63. data/features/built_in_matchers/include.feature +0 -126
  64. data/features/built_in_matchers/match.feature +0 -51
  65. data/features/built_in_matchers/output.feature +0 -70
  66. data/features/built_in_matchers/predicates.feature +0 -161
  67. data/features/built_in_matchers/respond_to.feature +0 -84
  68. data/features/built_in_matchers/satisfy.feature +0 -33
  69. data/features/built_in_matchers/start_with.feature +0 -48
  70. data/features/built_in_matchers/throw_symbol.feature +0 -91
  71. data/features/built_in_matchers/types.feature +0 -116
  72. data/features/built_in_matchers/yield.feature +0 -161
  73. data/features/composing_matchers.feature +0 -250
  74. data/features/compound_expectations.feature +0 -45
  75. data/features/custom_matchers/access_running_example.feature +0 -53
  76. data/features/custom_matchers/define_diffable_matcher.feature +0 -27
  77. data/features/custom_matchers/define_matcher.feature +0 -340
  78. data/features/custom_matchers/define_matcher_outside_rspec.feature +0 -34
  79. data/features/custom_matchers/define_matcher_with_fluent_interface.feature +0 -24
  80. data/features/customized_message.feature +0 -39
  81. data/features/diffing.feature +0 -85
  82. data/features/implicit_docstrings.feature +0 -52
  83. data/features/step_definitions/additional_cli_steps.rb +0 -22
  84. data/features/support/env.rb +0 -21
  85. data/features/support/rubinius.rb +0 -6
  86. data/features/syntax_configuration.feature +0 -71
  87. data/features/test_frameworks/minitest.feature +0 -44
  88. data/lib/rspec-expectations.rb +0 -1
  89. data/lib/rspec/expectations/diff_presenter.rb +0 -141
  90. data/lib/rspec/expectations/differ.rb +0 -44
  91. data/lib/rspec/expectations/encoded_string.rb +0 -56
  92. data/spec/rspec/expectations/diff_presenter_spec.rb +0 -249
  93. data/spec/rspec/expectations/encoded_string_spec.rb +0 -74
  94. data/spec/rspec/expectations/expectation_target_spec.rb +0 -82
  95. data/spec/rspec/expectations/extensions/kernel_spec.rb +0 -67
  96. data/spec/rspec/expectations/fail_with_spec.rb +0 -114
  97. data/spec/rspec/expectations/handler_spec.rb +0 -205
  98. data/spec/rspec/expectations/minitest_integration_spec.rb +0 -27
  99. data/spec/rspec/expectations/syntax_spec.rb +0 -89
  100. data/spec/rspec/expectations_spec.rb +0 -12
  101. data/spec/rspec/matchers/aliased_matcher_spec.rb +0 -48
  102. data/spec/rspec/matchers/aliases_spec.rb +0 -449
  103. data/spec/rspec/matchers/built_in/base_matcher_spec.rb +0 -83
  104. data/spec/rspec/matchers/built_in/be_between_spec.rb +0 -159
  105. data/spec/rspec/matchers/built_in/be_instance_of_spec.rb +0 -63
  106. data/spec/rspec/matchers/built_in/be_kind_of_spec.rb +0 -41
  107. data/spec/rspec/matchers/built_in/be_spec.rb +0 -592
  108. data/spec/rspec/matchers/built_in/be_within_spec.rb +0 -141
  109. data/spec/rspec/matchers/built_in/change_spec.rb +0 -808
  110. data/spec/rspec/matchers/built_in/compound_spec.rb +0 -292
  111. data/spec/rspec/matchers/built_in/contain_exactly_spec.rb +0 -441
  112. data/spec/rspec/matchers/built_in/cover_spec.rb +0 -69
  113. data/spec/rspec/matchers/built_in/eq_spec.rb +0 -156
  114. data/spec/rspec/matchers/built_in/eql_spec.rb +0 -41
  115. data/spec/rspec/matchers/built_in/equal_spec.rb +0 -106
  116. data/spec/rspec/matchers/built_in/exist_spec.rb +0 -124
  117. data/spec/rspec/matchers/built_in/has_spec.rb +0 -161
  118. data/spec/rspec/matchers/built_in/include_spec.rb +0 -540
  119. data/spec/rspec/matchers/built_in/match_spec.rb +0 -102
  120. data/spec/rspec/matchers/built_in/operators_spec.rb +0 -252
  121. data/spec/rspec/matchers/built_in/output_spec.rb +0 -165
  122. data/spec/rspec/matchers/built_in/raise_error_spec.rb +0 -461
  123. data/spec/rspec/matchers/built_in/respond_to_spec.rb +0 -292
  124. data/spec/rspec/matchers/built_in/satisfy_spec.rb +0 -44
  125. data/spec/rspec/matchers/built_in/start_and_end_with_spec.rb +0 -253
  126. data/spec/rspec/matchers/built_in/throw_symbol_spec.rb +0 -135
  127. data/spec/rspec/matchers/built_in/yield_spec.rb +0 -627
  128. data/spec/rspec/matchers/configuration_spec.rb +0 -213
  129. data/spec/rspec/matchers/description_generation_spec.rb +0 -191
  130. data/spec/rspec/matchers/dsl_spec.rb +0 -895
  131. data/spec/rspec/matchers/legacy_spec.rb +0 -101
  132. data/spec/rspec/matchers_spec.rb +0 -74
  133. data/spec/spec_helper.rb +0 -85
  134. data/spec/support/matchers.rb +0 -22
  135. data/spec/support/shared_examples.rb +0 -35
@@ -1,292 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "expect(...).to respond_to(:sym)" do
4
- it_behaves_like "an RSpec matcher", :valid_value => "s", :invalid_value => 5 do
5
- let(:matcher) { respond_to(:upcase) }
6
- end
7
-
8
- it "passes if target responds to :sym" do
9
- expect(Object.new).to respond_to(:methods)
10
- end
11
-
12
- it "fails if target does not respond to :sym" do
13
- expect {
14
- expect("this string").to respond_to(:some_method)
15
- }.to fail_with(%q|expected "this string" to respond to :some_method|)
16
- end
17
- end
18
-
19
- describe "expect(...).to respond_to(:sym).with(1).argument" do
20
- it "passes if target responds to :sym with 1 arg" do
21
- obj = Object.new
22
- def obj.foo(arg); end
23
- expect(obj).to respond_to(:foo).with(1).argument
24
- end
25
-
26
- it "passes if target responds to any number of arguments" do
27
- obj = Object.new
28
- def obj.foo(*args); end
29
- expect(obj).to respond_to(:foo).with(1).argument
30
- end
31
-
32
- it "passes if target responds to one or more arguments" do
33
- obj = Object.new
34
- def obj.foo(a, *args); end
35
- expect(obj).to respond_to(:foo).with(1).argument
36
- end
37
-
38
- it "fails if target does not respond to :sym" do
39
- obj = Object.new
40
- expect {
41
- expect(obj).to respond_to(:some_method).with(1).argument
42
- }.to fail_with(/expected .* to respond to :some_method/)
43
- end
44
-
45
- it "fails if :sym expects 0 args" do
46
- obj = Object.new
47
- def obj.foo; end
48
- expect {
49
- expect(obj).to respond_to(:foo).with(1).argument
50
- }.to fail_with(/expected #<Object.*> to respond to :foo with 1 argument/)
51
- end
52
-
53
- it "fails if :sym expects 2 args" do
54
- obj = Object.new
55
- def obj.foo(arg, arg2); end
56
- expect {
57
- expect(obj).to respond_to(:foo).with(1).argument
58
- }.to fail_with(/expected #<Object.*> to respond to :foo with 1 argument/)
59
- end
60
-
61
- it "fails if :sym expects 2 or more args" do
62
- obj = Object.new
63
- def obj.foo(arg, arg2, *args); end
64
- expect {
65
- expect(obj).to respond_to(:foo).with(1).argument
66
- }.to fail_with(/expected #<Object.*> to respond to :foo with 1 argument/)
67
- end
68
- end
69
-
70
- describe "expect(...).to respond_to(message1, message2)" do
71
- it "passes if target responds to both messages" do
72
- expect(Object.new).to respond_to('methods', 'inspect')
73
- end
74
-
75
- it "fails if target does not respond to first message" do
76
- expect {
77
- expect(Object.new).to respond_to('method_one', 'inspect')
78
- }.to fail_with(/expected #<Object:.*> to respond to "method_one"/)
79
- end
80
-
81
- it "fails if target does not respond to second message" do
82
- expect {
83
- expect(Object.new).to respond_to('inspect', 'method_one')
84
- }.to fail_with(/expected #<Object:.*> to respond to "method_one"/)
85
- end
86
-
87
- it "fails if target does not respond to either message" do
88
- expect {
89
- expect(Object.new).to respond_to('method_one', 'method_two')
90
- }.to fail_with(/expected #<Object:.*> to respond to "method_one", "method_two"/)
91
- end
92
- end
93
-
94
- describe "expect(...).to respond_to(:sym).with(2).arguments" do
95
- it "passes if target responds to :sym with 2 args" do
96
- obj = Object.new
97
- def obj.foo(a1, a2); end
98
- expect(obj).to respond_to(:foo).with(2).arguments
99
- end
100
-
101
- it "passes if target responds to any number of arguments" do
102
- obj = Object.new
103
- def obj.foo(*args); end
104
- expect(obj).to respond_to(:foo).with(2).arguments
105
- end
106
-
107
- it "passes if target responds to one or more arguments" do
108
- obj = Object.new
109
- def obj.foo(a, *args); end
110
- expect(obj).to respond_to(:foo).with(2).arguments
111
- end
112
-
113
- it "passes if target responds to two or more arguments" do
114
- obj = Object.new
115
- def obj.foo(a, b, *args); end
116
- expect(obj).to respond_to(:foo).with(2).arguments
117
- end
118
-
119
- it "fails if target does not respond to :sym" do
120
- obj = Object.new
121
- expect {
122
- expect(obj).to respond_to(:some_method).with(2).arguments
123
- }.to fail_with(/expected .* to respond to :some_method/)
124
- end
125
-
126
- it "fails if :sym expects 0 args" do
127
- obj = Object.new
128
- def obj.foo; end
129
- expect {
130
- expect(obj).to respond_to(:foo).with(2).arguments
131
- }.to fail_with(/expected #<Object.*> to respond to :foo with 2 arguments/)
132
- end
133
-
134
- it "fails if :sym expects 1 args" do
135
- obj = Object.new
136
- def obj.foo(arg); end
137
- expect {
138
- expect(obj).to respond_to(:foo).with(2).arguments
139
- }.to fail_with(/expected #<Object.*> to respond to :foo with 2 arguments/)
140
- end
141
-
142
- it "fails if :sym expects 3 or more args" do
143
- obj = Object.new
144
- def obj.foo(arg, arg2, arg3, *args); end
145
- expect {
146
- expect(obj).to respond_to(:foo).with(2).arguments
147
- }.to fail_with(/expected #<Object.*> to respond to :foo with 2 arguments/)
148
- end
149
- end
150
-
151
- describe "expect(...).not_to respond_to(:sym)" do
152
- it "passes if target does not respond to :sym" do
153
- expect(Object.new).not_to respond_to(:some_method)
154
- end
155
-
156
- it "fails if target responds to :sym" do
157
- expect {
158
- expect(Object.new).not_to respond_to(:methods)
159
- }.to fail_with(/expected #<Object:.*> not to respond to :methods/)
160
- end
161
- end
162
-
163
- describe "expect(...).not_to respond_to(:sym).with(1).argument" do
164
- it "fails if target responds to :sym with 1 arg" do
165
- obj = Object.new
166
- def obj.foo(arg); end
167
- expect {
168
- expect(obj).not_to respond_to(:foo).with(1).argument
169
- }.to fail_with(/expected #<Object:.*> not to respond to :foo with 1 argument/)
170
- end
171
-
172
- it "fails if target responds to :sym with any number of args" do
173
- obj = Object.new
174
- def obj.foo(*args); end
175
- expect {
176
- expect(obj).not_to respond_to(:foo).with(1).argument
177
- }.to fail_with(/expected #<Object:.*> not to respond to :foo with 1 argument/)
178
- end
179
-
180
- it "fails if target responds to :sym with one or more args" do
181
- obj = Object.new
182
- def obj.foo(a, *args); end
183
- expect {
184
- expect(obj).not_to respond_to(:foo).with(1).argument
185
- }.to fail_with(/expected #<Object:.*> not to respond to :foo with 1 argument/)
186
- end
187
-
188
- it "passes if target does not respond to :sym" do
189
- obj = Object.new
190
- expect(obj).not_to respond_to(:some_method).with(1).argument
191
- end
192
-
193
- it "passes if :sym expects 0 args" do
194
- obj = Object.new
195
- def obj.foo; end
196
- expect(obj).not_to respond_to(:foo).with(1).argument
197
- end
198
-
199
- it "passes if :sym expects 2 args" do
200
- obj = Object.new
201
- def obj.foo(arg, arg2); end
202
- expect(obj).not_to respond_to(:foo).with(1).argument
203
- end
204
-
205
- it "passes if :sym expects 2 or more args" do
206
- obj = Object.new
207
- def obj.foo(arg, arg2, *args); end
208
- expect(obj).not_to respond_to(:foo).with(1).argument
209
- end
210
- end
211
-
212
- describe "expect(...).not_to respond_to(message1, message2)" do
213
- it "passes if target does not respond to either message1 or message2" do
214
- expect(Object.new).not_to respond_to(:some_method, :some_other_method)
215
- end
216
-
217
- it "fails if target responds to message1 but not message2" do
218
- expect {
219
- expect(Object.new).not_to respond_to(:object_id, :some_method)
220
- }.to fail_with(/expected #<Object:.*> not to respond to :object_id/)
221
- end
222
-
223
- it "fails if target responds to message2 but not message1" do
224
- expect {
225
- expect(Object.new).not_to respond_to(:some_method, :object_id)
226
- }.to fail_with(/expected #<Object:.*> not to respond to :object_id/)
227
- end
228
-
229
- it "fails if target responds to both message1 and message2" do
230
- expect {
231
- expect(Object.new).not_to respond_to(:class, :object_id)
232
- }.to fail_with(/expected #<Object:.*> not to respond to :class, :object_id/)
233
- end
234
- end
235
-
236
- describe "expect(...).not_to respond_to(:sym).with(2).arguments" do
237
- it "fails if target responds to :sym with 2 args" do
238
- obj = Object.new
239
- def obj.foo(a1, a2); end
240
- expect {
241
- expect(obj).not_to respond_to(:foo).with(2).arguments
242
- }.to fail_with(/expected .* not to respond to :foo with 2 arguments/)
243
- end
244
-
245
- it "fails if target responds to :sym with any number args" do
246
- obj = Object.new
247
- def obj.foo(*args); end
248
- expect {
249
- expect(obj).not_to respond_to(:foo).with(2).arguments
250
- }.to fail_with(/expected .* not to respond to :foo with 2 arguments/)
251
- end
252
-
253
- it "fails if target responds to :sym with one or more args" do
254
- obj = Object.new
255
- def obj.foo(a, *args); end
256
- expect {
257
- expect(obj).not_to respond_to(:foo).with(2).arguments
258
- }.to fail_with(/expected .* not to respond to :foo with 2 arguments/)
259
- end
260
-
261
- it "fails if target responds to :sym with two or more args" do
262
- obj = Object.new
263
- def obj.foo(a, b, *args); end
264
- expect {
265
- expect(obj).not_to respond_to(:foo).with(2).arguments
266
- }.to fail_with(/expected .* not to respond to :foo with 2 arguments/)
267
- end
268
-
269
- it "passes if target does not respond to :sym" do
270
- obj = Object.new
271
- expect(obj).not_to respond_to(:some_method).with(2).arguments
272
- end
273
-
274
- it "passes if :sym expects 0 args" do
275
- obj = Object.new
276
- def obj.foo; end
277
- expect(obj).not_to respond_to(:foo).with(2).arguments
278
- end
279
-
280
- it "passes if :sym expects 2 args" do
281
- obj = Object.new
282
- def obj.foo(arg); end
283
- expect(obj).not_to respond_to(:foo).with(2).arguments
284
- end
285
-
286
- it "passes if :sym expects 3 or more args" do
287
- obj = Object.new
288
- def obj.foo(a, b, c, *arg); end
289
- expect(obj).not_to respond_to(:foo).with(2).arguments
290
- end
291
- end
292
-
@@ -1,44 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe "expect(...).to satisfy { block }" do
4
- it_behaves_like "an RSpec matcher", :valid_value => true, :invalid_value => false do
5
- let(:matcher) { satisfy { |v| v } }
6
- end
7
-
8
- it "describes itself" do
9
- expect(satisfy.description).to eq("satisfy block")
10
- end
11
-
12
- it "passes if block returns true" do
13
- expect(true).to satisfy { |val| val }
14
- expect(true).to satisfy do |val|
15
- val
16
- end
17
- end
18
-
19
- it "fails if block returns false" do
20
- expect {
21
- expect(false).to satisfy { |val| val }
22
- }.to fail_with("expected false to satisfy block")
23
- expect do
24
- expect(false).to satisfy do |val|
25
- val
26
- end
27
- end.to fail_with("expected false to satisfy block")
28
- end
29
- end
30
-
31
- describe "expect(...).not_to satisfy { block }" do
32
- it "passes if block returns false" do
33
- expect(false).not_to satisfy { |val| val }
34
- expect(false).not_to satisfy do |val|
35
- val
36
- end
37
- end
38
-
39
- it "fails if block returns true" do
40
- expect {
41
- expect(true).not_to satisfy { |val| val }
42
- }.to fail_with("expected true not to satisfy block")
43
- end
44
- end
@@ -1,253 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe "expect(...).to start_with" do
4
- it_behaves_like "an RSpec matcher", :valid_value => "ab", :invalid_value => "bc" do
5
- let(:matcher) { start_with("a") }
6
- end
7
-
8
- context "with a string" do
9
- it "passes if it matches the start of the actual string" do
10
- expect("this string").to start_with "this str"
11
- end
12
-
13
- it "fails if it does not match the start of the actual string" do
14
- expect {
15
- expect("this string").to start_with "that str"
16
- }.to fail_with("expected \"this string\" to start with \"that str\"")
17
- end
18
- end
19
-
20
- context "with an array" do
21
- it "passes if it is the first element of the array" do
22
- expect([0, 1, 2]).to start_with 0
23
- end
24
-
25
- it "passes if the first elements of the array match" do
26
- expect([0, 1, 2]).to start_with 0, 1
27
- end
28
-
29
- it "fails if it does not match the first element of the array" do
30
- expect {
31
- expect([0, 1, 2]).to start_with 2
32
- }.to fail_with("expected [0, 1, 2] to start with 2")
33
- end
34
-
35
- it "fails if it the first elements of the array do not match" do
36
- expect {
37
- expect([0, 1, 2]).to start_with 1, 2
38
- }.to fail_with("expected [0, 1, 2] to start with 1 and 2")
39
- end
40
- end
41
-
42
- context "with an object that does not respond to :[]" do
43
- it "fails with a useful message" do
44
- actual = Object.new
45
- expect {
46
- expect(actual).to start_with 0
47
- }.to fail_with("expected #{actual.inspect} to start with 0, but it cannot be indexed using #[]")
48
- end
49
- end
50
-
51
- context "with a hash" do
52
- it "fails with a useful error if trying to match more than one element" do
53
- actual = { :a => 'b', :b => 'b', :c => 'c' }
54
- expected = { :a => 'b', :b => 'b' }
55
- expect{
56
- expect(actual).to start_with(expected)
57
- }.to fail_with("expected #{actual.inspect} to start with #{expected.inspect}, but it does not have ordered elements")
58
- end
59
- end
60
-
61
- describe "composing with other matchers" do
62
- it 'passes if the start of an array matches two given matchers' do
63
- expect([1.01, "food", 3]).to start_with(a_value_within(0.2).of(1), a_string_matching(/foo/))
64
- end
65
-
66
- it 'passes if the start of an array matches one given matcher' do
67
- expect([1.01, "food", 3]).to start_with(a_value_within(0.2).of(1))
68
- end
69
-
70
- it 'provides a description' do
71
- description = start_with(a_value_within(0.1).of(1), a_string_matching(/abc/)).description
72
- expect(description).to eq("start with a value within 0.1 of 1 and a string matching /abc/")
73
- end
74
-
75
- it 'fails with a clear error message when the matchers do not match' do
76
- expect {
77
- expect([2.01, "food", 3]).to start_with(a_value_within(0.2).of(1), a_string_matching(/foo/))
78
- }.to fail_with('expected [2.01, "food", 3] to start with a value within 0.2 of 1 and a string matching /foo/')
79
- end
80
- end
81
- end
82
-
83
- describe "expect(...).not_to start_with" do
84
- context "with a string" do
85
- it "passes if it does not match the start of the actual string" do
86
- expect("this string").not_to start_with "that str"
87
- end
88
-
89
- it "fails if it does match the start of the actual string" do
90
- expect {
91
- expect("this string").not_to start_with "this str"
92
- }.to fail_with("expected \"this string\" not to start with \"this str\"")
93
- end
94
- end
95
-
96
- context "with an array" do
97
- it "passes if it is not the first element of the array" do
98
- expect([0, 1, 2]).not_to start_with 2
99
- end
100
-
101
- it "passes if the first elements of the array do not match" do
102
- expect([0, 1, 2]).not_to start_with 1, 2
103
- end
104
-
105
- it "fails if it matches the first element of the array" do
106
- expect {
107
- expect([0, 1, 2]).not_to start_with 0
108
- }.to fail_with("expected [0, 1, 2] not to start with 0")
109
- end
110
-
111
- it "fails if it the first elements of the array match" do
112
- expect {
113
- expect([0, 1, 2]).not_to start_with 0, 1
114
- }.to fail_with("expected [0, 1, 2] not to start with 0 and 1")
115
- end
116
- end
117
-
118
- it 'can pass when composed with another matcher' do
119
- expect(["a"]).not_to start_with(a_string_matching(/bar/))
120
- end
121
-
122
- it 'can fail when composed with another matcher' do
123
- expect {
124
- expect(["a"]).not_to start_with(a_string_matching(/a/))
125
- }.to fail_with('expected ["a"] not to start with a string matching /a/')
126
- end
127
- end
128
-
129
- describe "expect(...).to end_with" do
130
- it_behaves_like "an RSpec matcher", :valid_value => "ab", :invalid_value => "bc" do
131
- let(:matcher) { end_with("b") }
132
- end
133
-
134
- context "with a string" do
135
- it "passes if it matches the end of the actual string" do
136
- expect("this string").to end_with "is string"
137
- end
138
-
139
- it "fails if it does not match the end of the actual string" do
140
- expect {
141
- expect("this string").to end_with "is stringy"
142
- }.to fail_with("expected \"this string\" to end with \"is stringy\"")
143
- end
144
- end
145
-
146
- context "with an array" do
147
- it "passes if it is the last element of the array" do
148
- expect([0, 1, 2]).to end_with 2
149
- end
150
-
151
- it "passes if the last elements of the array match" do
152
- expect([0, 1, 2]).to end_with [1, 2]
153
- end
154
-
155
- it "fails if it does not match the last element of the array" do
156
- expect {
157
- expect([0, 1, 2]).to end_with 1
158
- }.to fail_with("expected [0, 1, 2] to end with 1")
159
- end
160
-
161
- it "fails if it the last elements of the array do not match" do
162
- expect {
163
- expect([0, 1, 2]).to end_with [0, 1]
164
- }.to fail_with("expected [0, 1, 2] to end with 0 and 1")
165
- end
166
- end
167
-
168
- context "with an object that does not respond to :[]" do
169
- it "fails with a useful message" do
170
- actual = Object.new
171
- expect {
172
- expect(actual).to end_with 0
173
- }.to fail_with("expected #{actual.inspect} to end with 0, but it cannot be indexed using #[]")
174
- end
175
- end
176
-
177
- context "with a hash" do
178
- it "raises an ArgumentError if trying to match more than one element" do
179
- actual = { :a => 'b', :b => 'b', :c => 'c' }
180
- expected = { :a => 'b', :b => 'b' }
181
- expect{
182
- expect(actual).to end_with(expected)
183
- }.to fail_with("expected #{actual.inspect} to end with #{expected.inspect}, but it does not have ordered elements")
184
- end
185
- end
186
-
187
- describe "composing with other matchers" do
188
- it 'passes if the end of an array matches two given matchers' do
189
- expect([3, "food", 1.1]).to end_with(a_string_matching(/foo/), a_value_within(0.2).of(1))
190
- end
191
-
192
- it 'passes if the end of an array matches one given matcher' do
193
- expect([3, "food", 1.1]).to end_with(a_value_within(0.2).of(1))
194
- end
195
-
196
- it 'provides a description' do
197
- description = end_with(a_value_within(0.1).of(1), a_string_matching(/abc/)).description
198
- expect(description).to eq("end with a value within 0.1 of 1 and a string matching /abc/")
199
- end
200
-
201
- it 'fails with a clear error message when the matchers do not match' do
202
- expect {
203
- expect([2.01, 3, "food"]).to end_with(a_value_within(0.2).of(1), a_string_matching(/foo/))
204
- }.to fail_with('expected [2.01, 3, "food"] to end with a value within 0.2 of 1 and a string matching /foo/')
205
- end
206
- end
207
- end
208
-
209
- describe "expect(...).not_to end_with" do
210
- context "with a sting" do
211
- it "passes if it does not match the end of the actual string" do
212
- expect("this string").not_to end_with "stringy"
213
- end
214
-
215
- it "fails if it matches the end of the actual string" do
216
- expect {
217
- expect("this string").not_to end_with "string"
218
- }.to fail_with("expected \"this string\" not to end with \"string\"")
219
- end
220
- end
221
-
222
- context "an array" do
223
- it "passes if it is not the last element of the array" do
224
- expect([0, 1, 2]).not_to end_with 1
225
- end
226
-
227
- it "passes if the last elements of the array do not match" do
228
- expect([0, 1, 2]).not_to end_with [0, 1]
229
- end
230
-
231
- it "fails if it matches the last element of the array" do
232
- expect {
233
- expect([0, 1, 2]).not_to end_with 2
234
- }.to fail_with("expected [0, 1, 2] not to end with 2")
235
- end
236
-
237
- it "fails if it the last elements of the array match" do
238
- expect {
239
- expect([0, 1, 2]).not_to end_with [1, 2]
240
- }.to fail_with("expected [0, 1, 2] not to end with 1 and 2")
241
- end
242
- end
243
-
244
- it 'can pass when composed with another matcher' do
245
- expect(["a"]).not_to end_with(a_string_matching(/bar/))
246
- end
247
-
248
- it 'can fail when composed with another matcher' do
249
- expect {
250
- expect(["a"]).not_to end_with(a_string_matching(/a/))
251
- }.to fail_with('expected ["a"] not to end with a string matching /a/')
252
- end
253
- end