minitest 5.10.3 → 5.18.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.
- checksums.yaml +5 -5
- checksums.yaml.gz.sig +0 -0
- data/History.rdoc +267 -4
- data/Manifest.txt +3 -0
- data/README.rdoc +123 -22
- data/Rakefile +5 -16
- data/lib/hoe/minitest.rb +0 -4
- data/lib/minitest/assertions.rb +197 -32
- data/lib/minitest/benchmark.rb +39 -8
- data/lib/minitest/expectations.rb +72 -35
- data/lib/minitest/mock.rb +118 -34
- data/lib/minitest/parallel.rb +1 -1
- data/lib/minitest/pride_plugin.rb +1 -1
- data/lib/minitest/spec.rb +27 -9
- data/lib/minitest/test.rb +38 -66
- data/lib/minitest/test_task.rb +305 -0
- data/lib/minitest/unit.rb +5 -8
- data/lib/minitest.rb +271 -52
- data/test/minitest/metametameta.rb +44 -9
- data/test/minitest/test_minitest_assertions.rb +1701 -0
- data/test/minitest/test_minitest_benchmark.rb +2 -2
- data/test/minitest/test_minitest_mock.rb +648 -14
- data/test/minitest/test_minitest_reporter.rb +46 -21
- data/test/minitest/test_minitest_spec.rb +317 -156
- data/test/minitest/test_minitest_test.rb +308 -1146
- data/test/minitest/test_minitest_test_task.rb +46 -0
- data.tar.gz.sig +1 -2
- metadata +36 -24
- metadata.gz.sig +0 -0
@@ -1,5 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
require "minitest/
|
2
|
+
require "minitest/metametameta"
|
3
3
|
require "stringio"
|
4
4
|
|
5
5
|
class MiniSpecA < Minitest::Spec; end
|
@@ -26,9 +26,8 @@ describe Minitest::Spec do
|
|
26
26
|
|
27
27
|
msg = e.message.sub(/(---Backtrace---).*/m, '\1')
|
28
28
|
msg.gsub!(/\(oid=[-0-9]+\)/, "(oid=N)")
|
29
|
-
msg.gsub!(/@.+>/, "@PATH>")
|
30
29
|
msg.gsub!(/(\d\.\d{6})\d+/, '\1xxx') # normalize: ruby version, impl, platform
|
31
|
-
msg.gsub!(/:0x[
|
30
|
+
msg.gsub!(/:0x[Xa-fA-F0-9]{4,}[ @].+?>/, ":0xXXXXXX@PATH>")
|
32
31
|
|
33
32
|
if expected
|
34
33
|
@assertion_count += 1
|
@@ -44,6 +43,10 @@ describe Minitest::Spec do
|
|
44
43
|
end
|
45
44
|
end
|
46
45
|
|
46
|
+
def assert_success spec
|
47
|
+
assert_equal true, spec
|
48
|
+
end
|
49
|
+
|
47
50
|
before do
|
48
51
|
@assertion_count = 4
|
49
52
|
end
|
@@ -56,43 +59,63 @@ describe Minitest::Spec do
|
|
56
59
|
@assertion_count = 1
|
57
60
|
|
58
61
|
assert_triggered "Expected 1 to not be equal to 1." do
|
59
|
-
1.wont_equal 1
|
62
|
+
_(1).wont_equal 1
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
it "needs to check for file existence" do
|
67
|
+
@assertion_count = 3
|
68
|
+
|
69
|
+
assert_success _(__FILE__).path_must_exist
|
70
|
+
|
71
|
+
assert_triggered "Expected path 'blah' to exist." do
|
72
|
+
_("blah").path_must_exist
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
it "needs to check for file non-existence" do
|
77
|
+
@assertion_count = 3
|
78
|
+
|
79
|
+
assert_success _("blah").path_wont_exist
|
80
|
+
|
81
|
+
assert_triggered "Expected path '#{__FILE__}' to not exist." do
|
82
|
+
_(__FILE__).path_wont_exist
|
60
83
|
end
|
61
84
|
end
|
62
85
|
|
63
86
|
it "needs to be sensible about must_include order" do
|
64
87
|
@assertion_count += 3 # must_include is 2 assertions
|
65
88
|
|
66
|
-
[1, 2, 3].must_include(2)
|
89
|
+
assert_success _([1, 2, 3]).must_include(2)
|
67
90
|
|
68
91
|
assert_triggered "Expected [1, 2, 3] to include 5." do
|
69
|
-
[1, 2, 3].must_include 5
|
92
|
+
_([1, 2, 3]).must_include 5
|
70
93
|
end
|
71
94
|
|
72
95
|
assert_triggered "msg.\nExpected [1, 2, 3] to include 5." do
|
73
|
-
[1, 2, 3].must_include 5, "msg"
|
96
|
+
_([1, 2, 3]).must_include 5, "msg"
|
74
97
|
end
|
75
98
|
end
|
76
99
|
|
77
100
|
it "needs to be sensible about wont_include order" do
|
78
101
|
@assertion_count += 3 # wont_include is 2 assertions
|
79
102
|
|
80
|
-
[1, 2, 3].wont_include(5)
|
103
|
+
assert_success _([1, 2, 3]).wont_include(5)
|
81
104
|
|
82
105
|
assert_triggered "Expected [1, 2, 3] to not include 2." do
|
83
|
-
[1, 2, 3].wont_include 2
|
106
|
+
_([1, 2, 3]).wont_include 2
|
84
107
|
end
|
85
108
|
|
86
109
|
assert_triggered "msg.\nExpected [1, 2, 3] to not include 2." do
|
87
|
-
[1, 2, 3].wont_include 2, "msg"
|
110
|
+
_([1, 2, 3]).wont_include 2, "msg"
|
88
111
|
end
|
89
112
|
end
|
90
113
|
|
91
114
|
it "needs to catch an expected exception" do
|
92
115
|
@assertion_count = 2
|
93
116
|
|
94
|
-
|
95
|
-
|
117
|
+
expect { raise "blah" }.must_raise RuntimeError
|
118
|
+
expect { raise Minitest::Assertion }.must_raise Minitest::Assertion
|
96
119
|
end
|
97
120
|
|
98
121
|
it "needs to catch an unexpected exception" do
|
@@ -106,11 +129,51 @@ describe Minitest::Spec do
|
|
106
129
|
EOM
|
107
130
|
|
108
131
|
assert_triggered msg do
|
109
|
-
|
132
|
+
expect { raise StandardError, "woot" }.must_raise RuntimeError
|
110
133
|
end
|
111
134
|
|
112
135
|
assert_triggered "msg.\n#{msg}" do
|
113
|
-
|
136
|
+
expect { raise StandardError, "woot" }.must_raise RuntimeError, "msg"
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
def good_pattern
|
141
|
+
capture_io do # 3.0 is noisy
|
142
|
+
eval "[1,2,3] => [Integer, Integer, Integer]" # eval to escape parser for ruby<3
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def bad_pattern
|
147
|
+
capture_io do # 3.0 is noisy
|
148
|
+
eval "[1,2,3] => [Integer, Integer]" # eval to escape parser for ruby<3
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
it "needs to pattern match" do
|
153
|
+
@assertion_count = 1
|
154
|
+
|
155
|
+
if RUBY_VERSION > "3" then
|
156
|
+
expect { good_pattern }.must_pattern_match
|
157
|
+
else
|
158
|
+
assert_raises NotImplementedError do
|
159
|
+
expect {}.must_pattern_match
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
it "needs to error on bad pattern match" do
|
165
|
+
skip unless RUBY_VERSION > "3"
|
166
|
+
|
167
|
+
@assertion_count = 1
|
168
|
+
|
169
|
+
exp = if RUBY_VERSION.start_with? "3.0"
|
170
|
+
"[1, 2, 3]" # terrible error message!
|
171
|
+
else
|
172
|
+
/length mismatch/
|
173
|
+
end
|
174
|
+
|
175
|
+
assert_triggered exp do
|
176
|
+
expect { bad_pattern }.must_pattern_match
|
114
177
|
end
|
115
178
|
end
|
116
179
|
|
@@ -118,20 +181,22 @@ describe Minitest::Spec do
|
|
118
181
|
@assertion_count -= 1 # no msg
|
119
182
|
@assertion_count += 2 # assert_output is 2 assertions
|
120
183
|
|
121
|
-
|
184
|
+
assert_success expect {}.must_be_silent
|
122
185
|
|
123
186
|
assert_triggered "In stdout.\nExpected: \"\"\n Actual: \"xxx\"" do
|
124
|
-
|
187
|
+
expect { print "xxx" }.must_be_silent
|
125
188
|
end
|
126
189
|
end
|
127
190
|
|
128
191
|
it "needs to have all methods named well" do
|
192
|
+
skip "N/A" if ENV["MT_NO_EXPECTATIONS"]
|
193
|
+
|
129
194
|
@assertion_count = 2
|
130
195
|
|
131
|
-
methods =
|
196
|
+
methods = Minitest::Expectations.public_instance_methods.grep(/must|wont/)
|
132
197
|
methods.map!(&:to_s) if Symbol === methods.first
|
133
198
|
|
134
|
-
musts, wonts = methods.sort.partition { |m| m =~
|
199
|
+
musts, wonts = methods.sort.partition { |m| m =~ /must/ }
|
135
200
|
|
136
201
|
expected_musts = %w[must_be
|
137
202
|
must_be_close_to
|
@@ -147,72 +212,74 @@ describe Minitest::Spec do
|
|
147
212
|
must_include
|
148
213
|
must_match
|
149
214
|
must_output
|
215
|
+
must_pattern_match
|
150
216
|
must_raise
|
151
217
|
must_respond_to
|
152
|
-
must_throw
|
218
|
+
must_throw
|
219
|
+
path_must_exist]
|
153
220
|
|
154
221
|
bad = %w[not raise throw send output be_silent]
|
155
222
|
|
156
|
-
expected_wonts = expected_musts.map { |m| m.sub(
|
223
|
+
expected_wonts = expected_musts.map { |m| m.sub(/must/, "wont") }.sort
|
157
224
|
expected_wonts.reject! { |m| m =~ /wont_#{Regexp.union(*bad)}/ }
|
158
225
|
|
159
|
-
musts.must_equal expected_musts
|
160
|
-
wonts.must_equal expected_wonts
|
226
|
+
_(musts).must_equal expected_musts
|
227
|
+
_(wonts).must_equal expected_wonts
|
161
228
|
end
|
162
229
|
|
163
230
|
it "needs to raise if an expected exception is not raised" do
|
164
231
|
@assertion_count -= 2 # no positive test
|
165
232
|
|
166
233
|
assert_triggered "RuntimeError expected but nothing was raised." do
|
167
|
-
|
234
|
+
expect { 42 }.must_raise RuntimeError
|
168
235
|
end
|
169
236
|
|
170
237
|
assert_triggered "msg.\nRuntimeError expected but nothing was raised." do
|
171
|
-
|
238
|
+
expect { 42 }.must_raise RuntimeError, "msg"
|
172
239
|
end
|
173
240
|
end
|
174
241
|
|
175
242
|
it "needs to verify binary messages" do
|
176
|
-
42.wont_be(:<, 24)
|
243
|
+
assert_success _(42).wont_be(:<, 24)
|
177
244
|
|
178
245
|
assert_triggered "Expected 24 to not be < 42." do
|
179
|
-
24.wont_be :<, 42
|
246
|
+
_(24).wont_be :<, 42
|
180
247
|
end
|
181
248
|
|
182
249
|
assert_triggered "msg.\nExpected 24 to not be < 42." do
|
183
|
-
24.wont_be :<, 42, "msg"
|
250
|
+
_(24).wont_be :<, 42, "msg"
|
184
251
|
end
|
185
252
|
end
|
186
253
|
|
187
254
|
it "needs to verify emptyness" do
|
188
255
|
@assertion_count += 3 # empty is 2 assertions
|
189
256
|
|
190
|
-
[].must_be_empty
|
257
|
+
assert_success _([]).must_be_empty
|
191
258
|
|
192
259
|
assert_triggered "Expected [42] to be empty." do
|
193
|
-
[42].must_be_empty
|
260
|
+
_([42]).must_be_empty
|
194
261
|
end
|
195
262
|
|
196
263
|
assert_triggered "msg.\nExpected [42] to be empty." do
|
197
|
-
[42].must_be_empty "msg"
|
264
|
+
_([42]).must_be_empty "msg"
|
198
265
|
end
|
199
266
|
end
|
200
267
|
|
201
268
|
it "needs to verify equality" do
|
202
269
|
@assertion_count += 1
|
203
270
|
|
204
|
-
(6 * 7).must_equal(42)
|
271
|
+
assert_success _(6 * 7).must_equal(42)
|
205
272
|
|
206
273
|
assert_triggered "Expected: 42\n Actual: 54" do
|
207
|
-
(6 * 9).must_equal 42
|
274
|
+
_(6 * 9).must_equal 42
|
208
275
|
end
|
209
276
|
|
210
277
|
assert_triggered "msg.\nExpected: 42\n Actual: 54" do
|
211
|
-
(6 * 9).must_equal 42, "msg"
|
278
|
+
_(6 * 9).must_equal 42, "msg"
|
212
279
|
end
|
213
280
|
|
214
|
-
assert_triggered(/^-42\n\+#<Proc:0xXXXXXX@PATH>\n/) do
|
215
|
-
proc { 42 }.must_equal 42 # proc isn't called, so expectation fails
|
281
|
+
assert_triggered(/^-42\n\+#<Proc:0xXXXXXX[ @]PATH>\n/) do
|
282
|
+
_(proc { 42 }).must_equal 42 # proc isn't called, so expectation fails
|
216
283
|
end
|
217
284
|
end
|
218
285
|
|
@@ -220,7 +287,7 @@ describe Minitest::Spec do
|
|
220
287
|
@assertion_count += 1 # extra test
|
221
288
|
|
222
289
|
out, err = capture_io do
|
223
|
-
nil.must_equal(nil)
|
290
|
+
assert_success _(nil).must_equal(nil)
|
224
291
|
end
|
225
292
|
|
226
293
|
exp = "DEPRECATED: Use assert_nil if expecting nil from #{__FILE__}:#{__LINE__-3}. " \
|
@@ -234,259 +301,259 @@ describe Minitest::Spec do
|
|
234
301
|
it "needs to verify floats outside a delta" do
|
235
302
|
@assertion_count += 1 # extra test
|
236
303
|
|
237
|
-
24.wont_be_close_to(42)
|
304
|
+
assert_success _(24).wont_be_close_to(42)
|
238
305
|
|
239
306
|
assert_triggered "Expected |42 - 42.0| (0.0) to not be <= 0.001." do
|
240
|
-
(6 * 7.0).wont_be_close_to 42
|
307
|
+
_(6 * 7.0).wont_be_close_to 42
|
241
308
|
end
|
242
309
|
|
243
|
-
x =
|
310
|
+
x = "1.0e-05"
|
244
311
|
assert_triggered "Expected |42 - 42.0| (0.0) to not be <= #{x}." do
|
245
|
-
(6 * 7.0).wont_be_close_to 42, 0.00001
|
312
|
+
_(6 * 7.0).wont_be_close_to 42, 0.00001
|
246
313
|
end
|
247
314
|
|
248
315
|
assert_triggered "msg.\nExpected |42 - 42.0| (0.0) to not be <= #{x}." do
|
249
|
-
(6 * 7.0).wont_be_close_to 42, 0.00001, "msg"
|
316
|
+
_(6 * 7.0).wont_be_close_to 42, 0.00001, "msg"
|
250
317
|
end
|
251
318
|
end
|
252
319
|
|
253
320
|
it "needs to verify floats outside an epsilon" do
|
254
321
|
@assertion_count += 1 # extra test
|
255
322
|
|
256
|
-
24.wont_be_within_epsilon(42)
|
323
|
+
assert_success _(24).wont_be_within_epsilon(42)
|
257
324
|
|
258
|
-
x =
|
325
|
+
x = "0.042"
|
259
326
|
assert_triggered "Expected |42 - 42.0| (0.0) to not be <= #{x}." do
|
260
|
-
(6 * 7.0).wont_be_within_epsilon 42
|
327
|
+
_(6 * 7.0).wont_be_within_epsilon 42
|
261
328
|
end
|
262
329
|
|
263
|
-
x =
|
330
|
+
x = "0.00042"
|
264
331
|
assert_triggered "Expected |42 - 42.0| (0.0) to not be <= #{x}." do
|
265
|
-
(6 * 7.0).wont_be_within_epsilon 42, 0.00001
|
332
|
+
_(6 * 7.0).wont_be_within_epsilon 42, 0.00001
|
266
333
|
end
|
267
334
|
|
268
335
|
assert_triggered "msg.\nExpected |42 - 42.0| (0.0) to not be <= #{x}." do
|
269
|
-
(6 * 7.0).wont_be_within_epsilon 42, 0.00001, "msg"
|
336
|
+
_(6 * 7.0).wont_be_within_epsilon 42, 0.00001, "msg"
|
270
337
|
end
|
271
338
|
end
|
272
339
|
|
273
340
|
it "needs to verify floats within a delta" do
|
274
341
|
@assertion_count += 1 # extra test
|
275
342
|
|
276
|
-
(6.0 * 7).must_be_close_to(42.0)
|
343
|
+
assert_success _(6.0 * 7).must_be_close_to(42.0)
|
277
344
|
|
278
345
|
assert_triggered "Expected |0.0 - 0.01| (0.01) to be <= 0.001." do
|
279
|
-
(1.0 / 100).must_be_close_to 0.0
|
346
|
+
_(1.0 / 100).must_be_close_to 0.0
|
280
347
|
end
|
281
348
|
|
282
|
-
x =
|
349
|
+
x = "1.0e-06"
|
283
350
|
assert_triggered "Expected |0.0 - 0.001| (0.001) to be <= #{x}." do
|
284
|
-
(1.0 / 1000).must_be_close_to 0.0, 0.000001
|
351
|
+
_(1.0 / 1000).must_be_close_to 0.0, 0.000001
|
285
352
|
end
|
286
353
|
|
287
354
|
assert_triggered "msg.\nExpected |0.0 - 0.001| (0.001) to be <= #{x}." do
|
288
|
-
(1.0 / 1000).must_be_close_to 0.0, 0.000001, "msg"
|
355
|
+
_(1.0 / 1000).must_be_close_to 0.0, 0.000001, "msg"
|
289
356
|
end
|
290
357
|
end
|
291
358
|
|
292
359
|
it "needs to verify floats within an epsilon" do
|
293
360
|
@assertion_count += 1 # extra test
|
294
361
|
|
295
|
-
(6.0 * 7).must_be_within_epsilon(42.0)
|
362
|
+
assert_success _(6.0 * 7).must_be_within_epsilon(42.0)
|
296
363
|
|
297
364
|
assert_triggered "Expected |0.0 - 0.01| (0.01) to be <= 0.0." do
|
298
|
-
(1.0 / 100).must_be_within_epsilon 0.0
|
365
|
+
_(1.0 / 100).must_be_within_epsilon 0.0
|
299
366
|
end
|
300
367
|
|
301
368
|
assert_triggered "Expected |0.0 - 0.001| (0.001) to be <= 0.0." do
|
302
|
-
(1.0 / 1000).must_be_within_epsilon 0.0, 0.000001
|
369
|
+
_(1.0 / 1000).must_be_within_epsilon 0.0, 0.000001
|
303
370
|
end
|
304
371
|
|
305
372
|
assert_triggered "msg.\nExpected |0.0 - 0.001| (0.001) to be <= 0.0." do
|
306
|
-
(1.0 / 1000).must_be_within_epsilon 0.0, 0.000001, "msg"
|
373
|
+
_(1.0 / 1000).must_be_within_epsilon 0.0, 0.000001, "msg"
|
307
374
|
end
|
308
375
|
end
|
309
376
|
|
310
377
|
it "needs to verify identity" do
|
311
|
-
1.must_be_same_as(1)
|
378
|
+
assert_success _(1).must_be_same_as(1)
|
312
379
|
|
313
380
|
assert_triggered "Expected 1 (oid=N) to be the same as 2 (oid=N)." do
|
314
|
-
1.must_be_same_as 2
|
381
|
+
_(1).must_be_same_as 2
|
315
382
|
end
|
316
383
|
|
317
384
|
assert_triggered "msg.\nExpected 1 (oid=N) to be the same as 2 (oid=N)." do
|
318
|
-
1.must_be_same_as 2, "msg"
|
385
|
+
_(1).must_be_same_as 2, "msg"
|
319
386
|
end
|
320
387
|
end
|
321
388
|
|
322
389
|
it "needs to verify inequality" do
|
323
390
|
@assertion_count += 2
|
324
|
-
42.wont_equal(6 * 9)
|
325
|
-
proc {}.wont_equal(42)
|
391
|
+
assert_success _(42).wont_equal(6 * 9)
|
392
|
+
assert_success _(proc {}).wont_equal(42)
|
326
393
|
|
327
394
|
assert_triggered "Expected 1 to not be equal to 1." do
|
328
|
-
1.wont_equal 1
|
395
|
+
_(1).wont_equal 1
|
329
396
|
end
|
330
397
|
|
331
398
|
assert_triggered "msg.\nExpected 1 to not be equal to 1." do
|
332
|
-
1.wont_equal 1, "msg"
|
399
|
+
_(1).wont_equal 1, "msg"
|
333
400
|
end
|
334
401
|
end
|
335
402
|
|
336
403
|
it "needs to verify instances of a class" do
|
337
|
-
42.wont_be_instance_of(String)
|
404
|
+
assert_success _(42).wont_be_instance_of(String)
|
338
405
|
|
339
406
|
assert_triggered "Expected 42 to not be a kind of #{Int.name}." do
|
340
|
-
42.wont_be_kind_of Int
|
407
|
+
_(42).wont_be_kind_of Int
|
341
408
|
end
|
342
409
|
|
343
410
|
assert_triggered "msg.\nExpected 42 to not be an instance of #{Int.name}." do
|
344
|
-
42.wont_be_instance_of Int, "msg"
|
411
|
+
_(42).wont_be_instance_of Int, "msg"
|
345
412
|
end
|
346
413
|
end
|
347
414
|
|
348
415
|
it "needs to verify kinds of a class" do
|
349
416
|
@assertion_count += 2
|
350
417
|
|
351
|
-
42.wont_be_kind_of(String)
|
352
|
-
proc {}.wont_be_kind_of(String)
|
418
|
+
assert_success _(42).wont_be_kind_of(String)
|
419
|
+
assert_success _(proc {}).wont_be_kind_of(String)
|
353
420
|
|
354
421
|
assert_triggered "Expected 42 to not be a kind of #{Int.name}." do
|
355
|
-
42.wont_be_kind_of Int
|
422
|
+
_(42).wont_be_kind_of Int
|
356
423
|
end
|
357
424
|
|
358
425
|
assert_triggered "msg.\nExpected 42 to not be a kind of #{Int.name}." do
|
359
|
-
42.wont_be_kind_of Int, "msg"
|
426
|
+
_(42).wont_be_kind_of Int, "msg"
|
360
427
|
end
|
361
428
|
end
|
362
429
|
|
363
430
|
it "needs to verify kinds of objects" do
|
364
431
|
@assertion_count += 3 # extra test
|
365
432
|
|
366
|
-
(6 * 7).must_be_kind_of(Int)
|
367
|
-
(6 * 7).must_be_kind_of(Numeric)
|
433
|
+
assert_success _(6 * 7).must_be_kind_of(Int)
|
434
|
+
assert_success _(6 * 7).must_be_kind_of(Numeric)
|
368
435
|
|
369
436
|
assert_triggered "Expected 42 to be a kind of String, not #{Int.name}." do
|
370
|
-
(6 * 7).must_be_kind_of String
|
437
|
+
_(6 * 7).must_be_kind_of String
|
371
438
|
end
|
372
439
|
|
373
440
|
assert_triggered "msg.\nExpected 42 to be a kind of String, not #{Int.name}." do
|
374
|
-
(6 * 7).must_be_kind_of String, "msg"
|
441
|
+
_(6 * 7).must_be_kind_of String, "msg"
|
375
442
|
end
|
376
443
|
|
377
444
|
exp = "Expected #<Proc:0xXXXXXX@PATH> to be a kind of String, not Proc."
|
378
445
|
assert_triggered exp do
|
379
|
-
proc {}.must_be_kind_of String
|
446
|
+
_(proc {}).must_be_kind_of String
|
380
447
|
end
|
381
448
|
end
|
382
449
|
|
383
450
|
it "needs to verify mismatch" do
|
384
451
|
@assertion_count += 3 # match is 2
|
385
452
|
|
386
|
-
"blah".wont_match(/\d+/)
|
453
|
+
assert_success _("blah").wont_match(/\d+/)
|
387
454
|
|
388
455
|
assert_triggered "Expected /\\w+/ to not match \"blah\"." do
|
389
|
-
"blah".wont_match(/\w+/)
|
456
|
+
_("blah").wont_match(/\w+/)
|
390
457
|
end
|
391
458
|
|
392
459
|
assert_triggered "msg.\nExpected /\\w+/ to not match \"blah\"." do
|
393
|
-
"blah".wont_match(/\w+/, "msg")
|
460
|
+
_("blah").wont_match(/\w+/, "msg")
|
394
461
|
end
|
395
462
|
end
|
396
463
|
|
397
464
|
it "needs to verify nil" do
|
398
|
-
nil.must_be_nil
|
465
|
+
assert_success _(nil).must_be_nil
|
399
466
|
|
400
467
|
assert_triggered "Expected 42 to be nil." do
|
401
|
-
42.must_be_nil
|
468
|
+
_(42).must_be_nil
|
402
469
|
end
|
403
470
|
|
404
471
|
assert_triggered "msg.\nExpected 42 to be nil." do
|
405
|
-
42.must_be_nil "msg"
|
472
|
+
_(42).must_be_nil "msg"
|
406
473
|
end
|
407
474
|
end
|
408
475
|
|
409
476
|
it "needs to verify non-emptyness" do
|
410
477
|
@assertion_count += 3 # empty is 2 assertions
|
411
478
|
|
412
|
-
["some item"].wont_be_empty
|
479
|
+
assert_success _(["some item"]).wont_be_empty
|
413
480
|
|
414
481
|
assert_triggered "Expected [] to not be empty." do
|
415
|
-
[].wont_be_empty
|
482
|
+
_([]).wont_be_empty
|
416
483
|
end
|
417
484
|
|
418
485
|
assert_triggered "msg.\nExpected [] to not be empty." do
|
419
|
-
[].wont_be_empty "msg"
|
486
|
+
_([]).wont_be_empty "msg"
|
420
487
|
end
|
421
488
|
end
|
422
489
|
|
423
490
|
it "needs to verify non-identity" do
|
424
|
-
1.wont_be_same_as(2)
|
491
|
+
assert_success _(1).wont_be_same_as(2)
|
425
492
|
|
426
493
|
assert_triggered "Expected 1 (oid=N) to not be the same as 1 (oid=N)." do
|
427
|
-
1.wont_be_same_as 1
|
494
|
+
_(1).wont_be_same_as 1
|
428
495
|
end
|
429
496
|
|
430
497
|
assert_triggered "msg.\nExpected 1 (oid=N) to not be the same as 1 (oid=N)." do
|
431
|
-
1.wont_be_same_as 1, "msg"
|
498
|
+
_(1).wont_be_same_as 1, "msg"
|
432
499
|
end
|
433
500
|
end
|
434
501
|
|
435
502
|
it "needs to verify non-nil" do
|
436
|
-
42.wont_be_nil
|
503
|
+
assert_success _(42).wont_be_nil
|
437
504
|
|
438
505
|
assert_triggered "Expected nil to not be nil." do
|
439
|
-
nil.wont_be_nil
|
506
|
+
_(nil).wont_be_nil
|
440
507
|
end
|
441
508
|
|
442
509
|
assert_triggered "msg.\nExpected nil to not be nil." do
|
443
|
-
nil.wont_be_nil "msg"
|
510
|
+
_(nil).wont_be_nil "msg"
|
444
511
|
end
|
445
512
|
end
|
446
513
|
|
447
514
|
it "needs to verify objects not responding to a message" do
|
448
|
-
"".wont_respond_to(:woot!)
|
515
|
+
assert_success _("").wont_respond_to(:woot!)
|
449
516
|
|
450
517
|
assert_triggered "Expected \"\" to not respond to to_s." do
|
451
|
-
"".wont_respond_to :to_s
|
518
|
+
_("").wont_respond_to :to_s
|
452
519
|
end
|
453
520
|
|
454
521
|
assert_triggered "msg.\nExpected \"\" to not respond to to_s." do
|
455
|
-
"".wont_respond_to :to_s, "msg"
|
522
|
+
_("").wont_respond_to :to_s, "msg"
|
456
523
|
end
|
457
524
|
end
|
458
525
|
|
459
526
|
it "needs to verify output in stderr" do
|
460
527
|
@assertion_count -= 1 # no msg
|
461
528
|
|
462
|
-
|
529
|
+
assert_success expect { $stderr.print "blah" }.must_output(nil, "blah")
|
463
530
|
|
464
531
|
assert_triggered "In stderr.\nExpected: \"blah\"\n Actual: \"xxx\"" do
|
465
|
-
|
532
|
+
expect { $stderr.print "xxx" }.must_output(nil, "blah")
|
466
533
|
end
|
467
534
|
end
|
468
535
|
|
469
536
|
it "needs to verify output in stdout" do
|
470
537
|
@assertion_count -= 1 # no msg
|
471
538
|
|
472
|
-
|
539
|
+
assert_success expect { print "blah" }.must_output("blah")
|
473
540
|
|
474
541
|
assert_triggered "In stdout.\nExpected: \"blah\"\n Actual: \"xxx\"" do
|
475
|
-
|
542
|
+
expect { print "xxx" }.must_output("blah")
|
476
543
|
end
|
477
544
|
end
|
478
545
|
|
479
546
|
it "needs to verify regexp matches" do
|
480
547
|
@assertion_count += 3 # must_match is 2 assertions
|
481
548
|
|
482
|
-
"blah".must_match(/\w+/)
|
549
|
+
assert_kind_of MatchData, _("blah").must_match(/\w+/)
|
483
550
|
|
484
551
|
assert_triggered "Expected /\\d+/ to match \"blah\"." do
|
485
|
-
"blah".must_match(/\d+/)
|
552
|
+
_("blah").must_match(/\d+/)
|
486
553
|
end
|
487
554
|
|
488
555
|
assert_triggered "msg.\nExpected /\\d+/ to match \"blah\"." do
|
489
|
-
"blah".must_match(/\d+/, "msg")
|
556
|
+
_("blah").must_match(/\d+/, "msg")
|
490
557
|
end
|
491
558
|
end
|
492
559
|
|
@@ -508,87 +575,137 @@ describe Minitest::Spec do
|
|
508
575
|
end
|
509
576
|
|
510
577
|
it "can NOT use must_equal in a thread. It must use expect in a thread" do
|
511
|
-
|
512
|
-
|
578
|
+
skip "N/A" if ENV["MT_NO_EXPECTATIONS"]
|
579
|
+
assert_raises RuntimeError do
|
580
|
+
capture_io do
|
581
|
+
Thread.new { (1 + 1).must_equal 2 }.join
|
582
|
+
end
|
583
|
+
end
|
584
|
+
end
|
585
|
+
|
586
|
+
it "fails gracefully when expectation used outside of `it`" do
|
587
|
+
skip "N/A" if ENV["MT_NO_EXPECTATIONS"]
|
588
|
+
|
589
|
+
@assertion_count += 1
|
590
|
+
|
591
|
+
e = assert_raises RuntimeError do
|
592
|
+
capture_io do
|
593
|
+
Thread.new { # forces ctx to be nil
|
594
|
+
describe("woot") do
|
595
|
+
(1 + 1).must_equal 2
|
596
|
+
end
|
597
|
+
}.join
|
598
|
+
end
|
599
|
+
end
|
600
|
+
|
601
|
+
assert_equal "Calling #must_equal outside of test.", e.message
|
602
|
+
end
|
603
|
+
|
604
|
+
it "deprecates expectation used without _" do
|
605
|
+
skip "N/A" if ENV["MT_NO_EXPECTATIONS"]
|
606
|
+
|
607
|
+
@assertion_count += 3
|
608
|
+
|
609
|
+
exp = /DEPRECATED: global use of must_equal from/
|
610
|
+
|
611
|
+
assert_output "", exp do
|
612
|
+
(1 + 1).must_equal 2
|
613
|
+
end
|
614
|
+
end
|
615
|
+
|
616
|
+
# https://github.com/seattlerb/minitest/issues/837
|
617
|
+
# https://github.com/rails/rails/pull/39304
|
618
|
+
it "deprecates expectation used without _ with empty backtrace_filter" do
|
619
|
+
skip "N/A" if ENV["MT_NO_EXPECTATIONS"]
|
620
|
+
|
621
|
+
@assertion_count += 3
|
622
|
+
|
623
|
+
exp = /DEPRECATED: global use of must_equal from/
|
624
|
+
|
625
|
+
with_empty_backtrace_filter do
|
626
|
+
assert_output "", exp do
|
627
|
+
(1 + 1).must_equal 2
|
628
|
+
end
|
513
629
|
end
|
514
630
|
end
|
515
631
|
end
|
516
632
|
|
517
633
|
it "needs to verify throw" do
|
518
|
-
@assertion_count +=
|
634
|
+
@assertion_count += 4 # 2 extra tests
|
519
635
|
|
520
|
-
|
636
|
+
assert_nil expect { throw :blah }.must_throw(:blah)
|
637
|
+
assert_equal 42, expect { throw :blah, 42 }.must_throw(:blah)
|
521
638
|
|
522
639
|
assert_triggered "Expected :blah to have been thrown." do
|
523
|
-
|
640
|
+
expect {}.must_throw :blah
|
524
641
|
end
|
525
642
|
|
526
643
|
assert_triggered "Expected :blah to have been thrown, not :xxx." do
|
527
|
-
|
644
|
+
expect { throw :xxx }.must_throw :blah
|
528
645
|
end
|
529
646
|
|
530
647
|
assert_triggered "msg.\nExpected :blah to have been thrown." do
|
531
|
-
|
648
|
+
expect {}.must_throw :blah, "msg"
|
532
649
|
end
|
533
650
|
|
534
651
|
assert_triggered "msg.\nExpected :blah to have been thrown, not :xxx." do
|
535
|
-
|
652
|
+
expect { throw :xxx }.must_throw :blah, "msg"
|
536
653
|
end
|
537
654
|
end
|
538
655
|
|
539
656
|
it "needs to verify types of objects" do
|
540
|
-
(6 * 7).must_be_instance_of(Int)
|
657
|
+
assert_success _(6 * 7).must_be_instance_of(Int)
|
541
658
|
|
542
659
|
exp = "Expected 42 to be an instance of String, not #{Int.name}."
|
543
660
|
|
544
661
|
assert_triggered exp do
|
545
|
-
(6 * 7).must_be_instance_of String
|
662
|
+
_(6 * 7).must_be_instance_of String
|
546
663
|
end
|
547
664
|
|
548
665
|
assert_triggered "msg.\n#{exp}" do
|
549
|
-
(6 * 7).must_be_instance_of String, "msg"
|
666
|
+
_(6 * 7).must_be_instance_of String, "msg"
|
550
667
|
end
|
551
668
|
end
|
552
669
|
|
553
670
|
it "needs to verify using any (negative) predicate" do
|
554
671
|
@assertion_count -= 1 # doesn"t take a message
|
555
672
|
|
556
|
-
"blah".wont_be(:empty?)
|
673
|
+
assert_success _("blah").wont_be(:empty?)
|
557
674
|
|
558
675
|
assert_triggered "Expected \"\" to not be empty?." do
|
559
|
-
"".wont_be :empty?
|
676
|
+
_("").wont_be :empty?
|
560
677
|
end
|
561
678
|
end
|
562
679
|
|
563
680
|
it "needs to verify using any binary operator" do
|
564
681
|
@assertion_count -= 1 # no msg
|
565
682
|
|
566
|
-
41.must_be(:<, 42)
|
683
|
+
assert_success _(41).must_be(:<, 42)
|
567
684
|
|
568
685
|
assert_triggered "Expected 42 to be < 41." do
|
569
|
-
42.must_be(:<, 41)
|
686
|
+
_(42).must_be(:<, 41)
|
570
687
|
end
|
571
688
|
end
|
572
689
|
|
573
690
|
it "needs to verify using any predicate" do
|
574
691
|
@assertion_count -= 1 # no msg
|
575
692
|
|
576
|
-
"".must_be(:empty?)
|
693
|
+
assert_success _("").must_be(:empty?)
|
577
694
|
|
578
695
|
assert_triggered "Expected \"blah\" to be empty?." do
|
579
|
-
"blah".must_be :empty?
|
696
|
+
_("blah").must_be :empty?
|
580
697
|
end
|
581
698
|
end
|
582
699
|
|
583
700
|
it "needs to verify using respond_to" do
|
584
|
-
42.must_respond_to(:+)
|
701
|
+
assert_success _(42).must_respond_to(:+)
|
585
702
|
|
586
703
|
assert_triggered "Expected 42 (#{Int.name}) to respond to #clear." do
|
587
|
-
42.must_respond_to :clear
|
704
|
+
_(42).must_respond_to :clear
|
588
705
|
end
|
589
706
|
|
590
707
|
assert_triggered "msg.\nExpected 42 (#{Int.name}) to respond to #clear." do
|
591
|
-
42.must_respond_to :clear, "msg"
|
708
|
+
_(42).must_respond_to :clear, "msg"
|
592
709
|
end
|
593
710
|
end
|
594
711
|
end
|
@@ -606,33 +723,33 @@ describe Minitest::Spec, :let do
|
|
606
723
|
end
|
607
724
|
|
608
725
|
it "is evaluated once per example" do
|
609
|
-
_count.must_equal 0
|
726
|
+
_(_count).must_equal 0
|
610
727
|
|
611
|
-
count.must_equal 1
|
612
|
-
count.must_equal 1
|
728
|
+
_(count).must_equal 1
|
729
|
+
_(count).must_equal 1
|
613
730
|
|
614
|
-
_count.must_equal 1
|
731
|
+
_(_count).must_equal 1
|
615
732
|
end
|
616
733
|
|
617
734
|
it "is REALLY evaluated once per example" do
|
618
|
-
_count.must_equal 1
|
735
|
+
_(_count).must_equal 1
|
619
736
|
|
620
|
-
count.must_equal 2
|
621
|
-
count.must_equal 2
|
737
|
+
_(count).must_equal 2
|
738
|
+
_(count).must_equal 2
|
622
739
|
|
623
|
-
_count.must_equal 2
|
740
|
+
_(_count).must_equal 2
|
624
741
|
end
|
625
742
|
|
626
743
|
it 'raises an error if the name begins with "test"' do
|
627
|
-
|
744
|
+
expect { self.class.let(:test_value) { true } }.must_raise ArgumentError
|
628
745
|
end
|
629
746
|
|
630
747
|
it "raises an error if the name shadows a normal instance method" do
|
631
|
-
|
748
|
+
expect { self.class.let(:message) { true } }.must_raise ArgumentError
|
632
749
|
end
|
633
750
|
|
634
751
|
it "doesn't raise an error if it is just another let" do
|
635
|
-
proc do
|
752
|
+
v = proc do
|
636
753
|
describe :outer do
|
637
754
|
let(:bar)
|
638
755
|
describe :inner do
|
@@ -640,13 +757,14 @@ describe Minitest::Spec, :let do
|
|
640
757
|
end
|
641
758
|
end
|
642
759
|
:good
|
643
|
-
end.call
|
760
|
+
end.call
|
761
|
+
_(v).must_equal :good
|
644
762
|
end
|
645
763
|
|
646
764
|
it "procs come after dont_flip" do
|
647
765
|
p = proc {}
|
648
766
|
assert_respond_to p, :call
|
649
|
-
p.must_respond_to :call
|
767
|
+
_(p).must_respond_to :call
|
650
768
|
end
|
651
769
|
end
|
652
770
|
|
@@ -660,13 +778,17 @@ describe Minitest::Spec, :subject do
|
|
660
778
|
end
|
661
779
|
|
662
780
|
it "is evaluated once per example" do
|
663
|
-
subject.must_equal 1
|
664
|
-
subject.must_equal 1
|
665
|
-
subject_evaluation_count.must_equal 1
|
781
|
+
_(subject).must_equal 1
|
782
|
+
_(subject).must_equal 1
|
783
|
+
_(subject_evaluation_count).must_equal 1
|
666
784
|
end
|
667
785
|
end
|
668
786
|
|
669
787
|
class TestMetaStatic < Minitest::Test
|
788
|
+
def assert_method_count expected, klass
|
789
|
+
assert_equal expected, klass.public_instance_methods.grep(/^test_/).count
|
790
|
+
end
|
791
|
+
|
670
792
|
def test_children
|
671
793
|
Minitest::Spec.children.clear # prevents parallel run
|
672
794
|
|
@@ -700,8 +822,8 @@ class TestMetaStatic < Minitest::Test
|
|
700
822
|
end
|
701
823
|
end
|
702
824
|
|
703
|
-
|
704
|
-
|
825
|
+
assert_method_count 1, outer
|
826
|
+
assert_method_count 1, inner
|
705
827
|
end
|
706
828
|
|
707
829
|
def test_it_wont_add_test_methods_to_children
|
@@ -715,15 +837,17 @@ class TestMetaStatic < Minitest::Test
|
|
715
837
|
end
|
716
838
|
end
|
717
839
|
|
718
|
-
|
719
|
-
|
840
|
+
assert_method_count 1, outer
|
841
|
+
assert_method_count 0, inner
|
720
842
|
end
|
721
843
|
end
|
722
844
|
|
723
|
-
require "minitest/metametameta"
|
724
|
-
|
725
845
|
class TestMeta < MetaMetaMetaTestCase
|
726
|
-
parallelize_me!
|
846
|
+
# do not call parallelize_me! here because specs use register_spec_type globally
|
847
|
+
|
848
|
+
def assert_defined_methods expected, klass
|
849
|
+
assert_equal expected, klass.instance_methods(false).sort.map(&:to_s)
|
850
|
+
end
|
727
851
|
|
728
852
|
def util_structure
|
729
853
|
y = z = nil
|
@@ -793,11 +917,11 @@ class TestMeta < MetaMetaMetaTestCase
|
|
793
917
|
def test_bug_dsl_expectations
|
794
918
|
spec_class = Class.new MiniSpecB do
|
795
919
|
it "should work" do
|
796
|
-
0.must_equal 0
|
920
|
+
_(0).must_equal 0
|
797
921
|
end
|
798
922
|
end
|
799
923
|
|
800
|
-
test_name = spec_class.instance_methods.sort.grep(/
|
924
|
+
test_name = spec_class.instance_methods.sort.grep(/test_/).first
|
801
925
|
|
802
926
|
spec = spec_class.new test_name
|
803
927
|
|
@@ -846,9 +970,9 @@ class TestMeta < MetaMetaMetaTestCase
|
|
846
970
|
inner_methods2 = inner_methods1 +
|
847
971
|
%w[test_0002_anonymous test_0003_anonymous]
|
848
972
|
|
849
|
-
|
850
|
-
|
851
|
-
|
973
|
+
assert_defined_methods top_methods, x
|
974
|
+
assert_defined_methods inner_methods1, y
|
975
|
+
assert_defined_methods inner_methods2, z
|
852
976
|
end
|
853
977
|
|
854
978
|
def test_structure_postfix_it
|
@@ -865,8 +989,8 @@ class TestMeta < MetaMetaMetaTestCase
|
|
865
989
|
it "inner-it" do end
|
866
990
|
end
|
867
991
|
|
868
|
-
|
869
|
-
|
992
|
+
assert_defined_methods %w[test_0001_inner-it], y
|
993
|
+
assert_defined_methods %w[test_0001_inner-it], z
|
870
994
|
end
|
871
995
|
|
872
996
|
def test_setup_teardown_behavior
|
@@ -897,9 +1021,9 @@ class TestMeta < MetaMetaMetaTestCase
|
|
897
1021
|
].sort
|
898
1022
|
|
899
1023
|
assert_equal test_methods, [x1, x2]
|
900
|
-
|
901
|
-
|
902
|
-
|
1024
|
+
assert_defined_methods test_methods, x
|
1025
|
+
assert_defined_methods [], y
|
1026
|
+
assert_defined_methods [], z
|
903
1027
|
end
|
904
1028
|
|
905
1029
|
def test_structure_subclasses
|
@@ -945,18 +1069,20 @@ class TestSpecInTestCase < MetaMetaMetaTestCase
|
|
945
1069
|
end
|
946
1070
|
|
947
1071
|
def test_expectation
|
948
|
-
@tc.assert_equal true, 1.must_equal(1)
|
1072
|
+
@tc.assert_equal true, _(1).must_equal(1)
|
949
1073
|
end
|
950
1074
|
|
951
1075
|
def test_expectation_triggered
|
952
1076
|
assert_triggered "Expected: 2\n Actual: 1" do
|
953
|
-
1.must_equal 2
|
1077
|
+
_(1).must_equal 2
|
954
1078
|
end
|
955
1079
|
end
|
956
1080
|
|
1081
|
+
include Minitest::Spec::DSL::InstanceMethods
|
1082
|
+
|
957
1083
|
def test_expectation_with_a_message
|
958
1084
|
assert_triggered "woot.\nExpected: 2\n Actual: 1" do
|
959
|
-
1.must_equal 2, "woot"
|
1085
|
+
_(1).must_equal 2, "woot"
|
960
1086
|
end
|
961
1087
|
end
|
962
1088
|
end
|
@@ -983,3 +1109,38 @@ class ValueMonadTest < Minitest::Test
|
|
983
1109
|
assert_equal "c", struct.expect
|
984
1110
|
end
|
985
1111
|
end
|
1112
|
+
|
1113
|
+
describe Minitest::Spec, :infect_an_assertion do
|
1114
|
+
class << self
|
1115
|
+
attr_accessor :infect_mock
|
1116
|
+
end
|
1117
|
+
|
1118
|
+
def assert_infects exp, act, msg = nil, foo: nil, bar: nil
|
1119
|
+
self.class.infect_mock.assert_infects exp, act, msg, foo: foo, bar: bar
|
1120
|
+
end
|
1121
|
+
|
1122
|
+
infect_an_assertion :assert_infects, :must_infect
|
1123
|
+
infect_an_assertion :assert_infects, :must_infect_without_flipping, :dont_flip
|
1124
|
+
|
1125
|
+
it "infects assertions with kwargs" do
|
1126
|
+
mock = Minitest::Mock.new
|
1127
|
+
mock.expect :assert_infects, true, [:exp, :act, nil], foo: :foo, bar: :bar
|
1128
|
+
|
1129
|
+
self.class.infect_mock = mock
|
1130
|
+
|
1131
|
+
_(:act).must_infect :exp, foo: :foo, bar: :bar
|
1132
|
+
|
1133
|
+
assert_mock mock
|
1134
|
+
end
|
1135
|
+
|
1136
|
+
it "infects assertions with kwargs (dont_flip)" do
|
1137
|
+
mock = Minitest::Mock.new
|
1138
|
+
mock.expect :assert_infects, true, [:act, :exp, nil], foo: :foo, bar: :bar
|
1139
|
+
|
1140
|
+
self.class.infect_mock = mock
|
1141
|
+
|
1142
|
+
_(:act).must_infect_without_flipping :exp, foo: :foo, bar: :bar
|
1143
|
+
|
1144
|
+
assert_mock mock
|
1145
|
+
end
|
1146
|
+
end
|