minitest 5.11.3 → 5.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -109,8 +109,8 @@ module Minitest
109
109
  # is applied against the slope itself. As such, you probably want
110
110
  # to tighten it from the default.
111
111
  #
112
- # See http://www.graphpad.com/curvefit/goodness_of_fit.htm for
113
- # more details.
112
+ # See https://www.graphpad.com/guides/prism/8/curve-fitting/reg_intepretingnonlinr2.htm
113
+ # for more details.
114
114
  #
115
115
  # Fit is calculated by #fit_linear.
116
116
  #
@@ -168,6 +168,24 @@ module Minitest::Expectations
168
168
 
169
169
  infect_an_assertion :assert_throws, :must_throw, :block
170
170
 
171
+ ##
172
+ # See Minitest::Assertions#assert_path_exists
173
+ #
174
+ # _(some_path).path_must_exist
175
+ #
176
+ # :method: path_must_exist
177
+
178
+ infect_an_assertion :assert_path_exists, :path_must_exist, :unary
179
+
180
+ ##
181
+ # See Minitest::Assertions#refute_path_exists
182
+ #
183
+ # _(some_path).path_wont_exist
184
+ #
185
+ # :method: path_wont_exist
186
+
187
+ infect_an_assertion :refute_path_exists, :path_wont_exist, :unary
188
+
171
189
  ##
172
190
  # See Minitest::Assertions#refute_empty
173
191
  #
@@ -8,12 +8,16 @@ class Module # :nodoc:
8
8
  # warn "%-22p -> %p %p" % [meth, new_name, dont_flip]
9
9
  self.class_eval <<-EOM, __FILE__, __LINE__ + 1
10
10
  def #{new_name} *args
11
+ where = Minitest.filter_backtrace(caller).first
12
+ where = where.split(/:in /, 2).first # clean up noise
13
+ warn "DEPRECATED: global use of #{new_name} from #\{where}. Use _(obj).#{new_name} instead. This will fail in Minitest 6."
11
14
  Minitest::Expectation.new(self, Minitest::Spec.current).#{new_name}(*args)
12
15
  end
13
16
  EOM
14
17
 
15
18
  Minitest::Expectation.class_eval <<-EOM, __FILE__, __LINE__ + 1
16
19
  def #{new_name} *args
20
+ raise "Calling ##{new_name} outside of test." unless ctx
17
21
  case
18
22
  when #{!!dont_flip} then
19
23
  ctx.#{meth}(target, *args)
@@ -285,21 +289,28 @@ class Minitest::Spec < Minitest::Test
285
289
 
286
290
  module InstanceMethods
287
291
  ##
288
- # Returns a value monad that has all of Expectations methods
289
- # available to it.
292
+ # Takes a value or a block and returns a value monad that has
293
+ # all of Expectations methods available to it.
290
294
  #
291
- # Also aliased to #value and #expect for your aesthetic pleasure:
295
+ # _(1 + 1).must_equal 2
292
296
  #
293
- # _(1 + 1).must_equal 2
294
- # value(1 + 1).must_equal 2
295
- # expect(1 + 1).must_equal 2
297
+ # And for blocks:
298
+ #
299
+ # _ { 1 + "1" }.must_raise TypeError
296
300
  #
297
301
  # This method of expectation-based testing is preferable to
298
302
  # straight-expectation methods (on Object) because it stores its
299
303
  # test context, bypassing our hacky use of thread-local variables.
300
304
  #
301
- # At some point, the methods on Object will be deprecated and then
302
- # removed.
305
+ # NOTE: At some point, the methods on Object will be deprecated
306
+ # and then removed.
307
+ #
308
+ # It is also aliased to #value and #expect for your aesthetic
309
+ # pleasure:
310
+ #
311
+ # _(1 + 1).must_equal 2
312
+ # value(1 + 1).must_equal 2
313
+ # expect(1 + 1).must_equal 2
303
314
 
304
315
  def _ value = nil, &block
305
316
  Minitest::Expectation.new block || value, self
@@ -19,9 +19,20 @@ class FakeNamedTest < Minitest::Test
19
19
  end
20
20
  end
21
21
 
22
+ module MyModule; end
23
+ class AnError < StandardError; include MyModule; end
24
+
22
25
  class MetaMetaMetaTestCase < Minitest::Test
23
26
  attr_accessor :reporter, :output, :tu
24
27
 
28
+ def with_stderr err
29
+ old = $stderr
30
+ $stderr = err
31
+ yield
32
+ ensure
33
+ $stderr = old
34
+ end
35
+
25
36
  def run_tu_with_fresh_reporter flags = %w[--seed 42]
26
37
  options = Minitest.process_args flags
27
38
 
@@ -31,18 +42,20 @@ class MetaMetaMetaTestCase < Minitest::Test
31
42
  reporter << Minitest::SummaryReporter.new(@output, options)
32
43
  reporter << Minitest::ProgressReporter.new(@output, options)
33
44
 
34
- reporter.start
45
+ with_stderr @output do
46
+ reporter.start
35
47
 
36
- yield(reporter) if block_given?
48
+ yield(reporter) if block_given?
37
49
 
38
- @tus ||= [@tu]
39
- @tus.each do |tu|
40
- Minitest::Runnable.runnables.delete tu
50
+ @tus ||= [@tu]
51
+ @tus.each do |tu|
52
+ Minitest::Runnable.runnables.delete tu
41
53
 
42
- tu.run reporter, options
43
- end
54
+ tu.run reporter, options
55
+ end
44
56
 
45
- reporter.report
57
+ reporter.report
58
+ end
46
59
  end
47
60
 
48
61
  def first_reporter
@@ -81,6 +94,8 @@ class MetaMetaMetaTestCase < Minitest::Test
81
94
  output.gsub!(/^(\s+)[^:]+:\d+:in/, '\1FILE:LINE:in')
82
95
  end
83
96
 
97
+ output.gsub!(/( at )[^:]+:\d+/, '\1[FILE:LINE]')
98
+
84
99
  output
85
100
  end
86
101
 
@@ -0,0 +1,1437 @@
1
+ # encoding: UTF-8
2
+
3
+ require "minitest/autorun"
4
+
5
+ if defined? Encoding then
6
+ e = Encoding.default_external
7
+ if e != Encoding::UTF_8 then
8
+ warn ""
9
+ warn ""
10
+ warn "NOTE: External encoding #{e} is not UTF-8. Tests WILL fail."
11
+ warn " Run tests with `RUBYOPT=-Eutf-8 rake` to avoid errors."
12
+ warn ""
13
+ warn ""
14
+ end
15
+ end
16
+
17
+ SomeError = Class.new Exception
18
+
19
+ unless defined? MyModule then
20
+ module MyModule; end
21
+ class AnError < StandardError; include MyModule; end
22
+ end
23
+
24
+ class TestMinitestAssertions < Minitest::Test
25
+ # do not call parallelize_me! - teardown accesses @tc._assertions
26
+ # which is not threadsafe. Nearly every method in here is an
27
+ # assertion test so it isn't worth splitting it out further.
28
+
29
+ RUBY18 = !defined? Encoding
30
+
31
+ class DummyTest
32
+ include Minitest::Assertions
33
+ # include Minitest::Reportable # TODO: why do I really need this?
34
+
35
+ attr_accessor :assertions, :failure
36
+
37
+ def initialize
38
+ self.assertions = 0
39
+ self.failure = nil
40
+ end
41
+ end
42
+
43
+ def setup
44
+ super
45
+
46
+ Minitest::Test.reset
47
+
48
+ @tc = DummyTest.new
49
+ @zomg = "zomg ponies!" # TODO: const
50
+ @assertion_count = 1
51
+ end
52
+
53
+ def teardown
54
+ assert_equal(@assertion_count, @tc.assertions,
55
+ "expected #{@assertion_count} assertions to be fired during the test, not #{@tc.assertions}")
56
+ end
57
+
58
+ def assert_deprecated name
59
+ dep = /DEPRECATED: #{name}. From #{__FILE__}:\d+(?::.*)?/
60
+ dep = "" if $-w.nil?
61
+
62
+ assert_output nil, dep do
63
+ yield
64
+ end
65
+ end
66
+
67
+ def assert_triggered expected, klass = Minitest::Assertion
68
+ e = assert_raises klass do
69
+ yield
70
+ end
71
+
72
+ msg = e.message.sub(/(---Backtrace---).*/m, '\1')
73
+ msg.gsub!(/\(oid=[-0-9]+\)/, "(oid=N)")
74
+ msg.gsub!(/(\d\.\d{6})\d+/, '\1xxx') # normalize: ruby version, impl, platform
75
+
76
+ assert_msg = Regexp === expected ? :assert_match : :assert_equal
77
+ self.send assert_msg, expected, msg
78
+ end
79
+
80
+ def clean s
81
+ s.gsub(/^ {6,10}/, "")
82
+ end
83
+
84
+ def non_verbose
85
+ orig_verbose = $VERBOSE
86
+ $VERBOSE = false
87
+
88
+ yield
89
+ ensure
90
+ $VERBOSE = orig_verbose
91
+ end
92
+
93
+ def test_assert
94
+ @assertion_count = 2
95
+
96
+ @tc.assert_equal true, @tc.assert(true), "returns true on success"
97
+ end
98
+
99
+ def test_assert__triggered
100
+ assert_triggered "Expected false to be truthy." do
101
+ @tc.assert false
102
+ end
103
+ end
104
+
105
+ def test_assert__triggered_message
106
+ assert_triggered @zomg do
107
+ @tc.assert false, @zomg
108
+ end
109
+ end
110
+
111
+ def test_assert__triggered_lambda
112
+ assert_triggered "whoops" do
113
+ @tc.assert false, lambda { "whoops" }
114
+ end
115
+ end
116
+
117
+ def test_assert_empty
118
+ @assertion_count = 2
119
+
120
+ @tc.assert_empty []
121
+ end
122
+
123
+ def test_assert_empty_triggered
124
+ @assertion_count = 2
125
+
126
+ assert_triggered "Expected [1] to be empty." do
127
+ @tc.assert_empty [1]
128
+ end
129
+ end
130
+
131
+ def test_assert_equal
132
+ @tc.assert_equal 1, 1
133
+ end
134
+
135
+ def test_assert_equal_different_collection_array_hex_invisible
136
+ object1 = Object.new
137
+ object2 = Object.new
138
+ msg = "No visible difference in the Array#inspect output.
139
+ You should look at the implementation of #== on Array or its members.
140
+ [#<Object:0xXXXXXX>]".gsub(/^ +/, "")
141
+ assert_triggered msg do
142
+ @tc.assert_equal [object1], [object2]
143
+ end
144
+ end
145
+
146
+ def test_assert_equal_different_collection_hash_hex_invisible
147
+ h1, h2 = {}, {}
148
+ h1[1] = Object.new
149
+ h2[1] = Object.new
150
+ msg = "No visible difference in the Hash#inspect output.
151
+ You should look at the implementation of #== on Hash or its members.
152
+ {1=>#<Object:0xXXXXXX>}".gsub(/^ +/, "")
153
+
154
+ assert_triggered msg do
155
+ @tc.assert_equal h1, h2
156
+ end
157
+ end
158
+
159
+ def test_assert_equal_different_diff_deactivated
160
+ without_diff do
161
+ assert_triggered util_msg("haha" * 10, "blah" * 10) do
162
+ o1 = "haha" * 10
163
+ o2 = "blah" * 10
164
+
165
+ @tc.assert_equal o1, o2
166
+ end
167
+ end
168
+ end
169
+
170
+ def test_assert_equal_different_message
171
+ assert_triggered "whoops.\nExpected: 1\n Actual: 2" do
172
+ @tc.assert_equal 1, 2, message { "whoops" }
173
+ end
174
+ end
175
+
176
+ def test_assert_equal_different_lambda
177
+ assert_triggered "whoops.\nExpected: 1\n Actual: 2" do
178
+ @tc.assert_equal 1, 2, lambda { "whoops" }
179
+ end
180
+ end
181
+
182
+ def test_assert_equal_different_hex
183
+ c = Class.new do
184
+ def initialize s; @name = s; end
185
+ end
186
+
187
+ o1 = c.new "a"
188
+ o2 = c.new "b"
189
+ msg = clean <<-EOS
190
+ --- expected
191
+ +++ actual
192
+ @@ -1 +1 @@
193
+ -#<#<Class:0xXXXXXX>:0xXXXXXX @name=\"a\">
194
+ +#<#<Class:0xXXXXXX>:0xXXXXXX @name=\"b\">
195
+ EOS
196
+
197
+ assert_triggered msg do
198
+ @tc.assert_equal o1, o2
199
+ end
200
+ end
201
+
202
+ def test_assert_equal_different_hex_invisible
203
+ o1 = Object.new
204
+ o2 = Object.new
205
+
206
+ msg = "No visible difference in the Object#inspect output.
207
+ You should look at the implementation of #== on Object or its members.
208
+ #<Object:0xXXXXXX>".gsub(/^ +/, "")
209
+
210
+ assert_triggered msg do
211
+ @tc.assert_equal o1, o2
212
+ end
213
+ end
214
+
215
+ def test_assert_equal_different_long
216
+ msg = "--- expected
217
+ +++ actual
218
+ @@ -1 +1 @@
219
+ -\"hahahahahahahahahahahahahahahahahahahaha\"
220
+ +\"blahblahblahblahblahblahblahblahblahblah\"
221
+ ".gsub(/^ +/, "")
222
+
223
+ assert_triggered msg do
224
+ o1 = "haha" * 10
225
+ o2 = "blah" * 10
226
+
227
+ @tc.assert_equal o1, o2
228
+ end
229
+ end
230
+
231
+ def test_assert_equal_different_long_invisible
232
+ msg = "No visible difference in the String#inspect output.
233
+ You should look at the implementation of #== on String or its members.
234
+ \"blahblahblahblahblahblahblahblahblahblah\"".gsub(/^ +/, "")
235
+
236
+ assert_triggered msg do
237
+ o1 = "blah" * 10
238
+ o2 = "blah" * 10
239
+ def o1.== _
240
+ false
241
+ end
242
+ @tc.assert_equal o1, o2
243
+ end
244
+ end
245
+
246
+ def test_assert_equal_different_long_msg
247
+ msg = "message.
248
+ --- expected
249
+ +++ actual
250
+ @@ -1 +1 @@
251
+ -\"hahahahahahahahahahahahahahahahahahahaha\"
252
+ +\"blahblahblahblahblahblahblahblahblahblah\"
253
+ ".gsub(/^ +/, "")
254
+
255
+ assert_triggered msg do
256
+ o1 = "haha" * 10
257
+ o2 = "blah" * 10
258
+ @tc.assert_equal o1, o2, "message"
259
+ end
260
+ end
261
+
262
+ def test_assert_equal_different_short
263
+ assert_triggered util_msg(1, 2) do
264
+ @tc.assert_equal 1, 2
265
+ end
266
+ end
267
+
268
+ def test_assert_equal_different_short_msg
269
+ assert_triggered util_msg(1, 2, "message") do
270
+ @tc.assert_equal 1, 2, "message"
271
+ end
272
+ end
273
+
274
+ def test_assert_equal_different_short_multiline
275
+ msg = "--- expected\n+++ actual\n@@ -1,2 +1,2 @@\n \"a\n-b\"\n+c\"\n"
276
+ assert_triggered msg do
277
+ @tc.assert_equal "a\nb", "a\nc"
278
+ end
279
+ end
280
+
281
+ def test_assert_equal_does_not_allow_lhs_nil
282
+ if Minitest::VERSION =~ /^6/ then
283
+ warn "Time to strip the MT5 test"
284
+
285
+ @assertion_count += 1
286
+ assert_triggered(/Use assert_nil if expecting nil/) do
287
+ @tc.assert_equal nil, nil
288
+ end
289
+ else
290
+ err_re = /Use assert_nil if expecting nil from .*test_minitest_\w+.rb/
291
+ err_re = "" if $-w.nil?
292
+
293
+ assert_output "", err_re do
294
+ @tc.assert_equal nil, nil
295
+ end
296
+ end
297
+ end
298
+
299
+ def test_assert_equal_does_not_allow_lhs_nil_triggered
300
+ assert_triggered "Expected: nil\n Actual: false" do
301
+ @tc.assert_equal nil, false
302
+ end
303
+ end
304
+
305
+ def test_assert_equal_string_bug791
306
+ exp = <<-'EOF'.gsub(/^ {10}/, "") # note single quotes
307
+ --- expected
308
+ +++ actual
309
+ @@ -1,2 +1 @@
310
+ -"\\n
311
+ -"
312
+ +"\\\"
313
+ EOF
314
+
315
+ exp = "Expected: \"\\\\n\"\n Actual: \"\\\\\""
316
+ assert_triggered exp do
317
+ @tc.assert_equal "\\n", "\\"
318
+ end
319
+ end
320
+
321
+ def test_assert_equal_string_both_escaped_unescaped_newlines
322
+ msg = <<-EOM.gsub(/^ {10}/, "")
323
+ --- expected
324
+ +++ actual
325
+ @@ -1,2 +1 @@
326
+ -\"A\\n
327
+ -B\"
328
+ +\"A\\n\\\\nB\"
329
+ EOM
330
+
331
+ assert_triggered msg do
332
+ exp = "A\\nB"
333
+ act = "A\n\\nB"
334
+
335
+ @tc.assert_equal exp, act
336
+ end
337
+ end
338
+
339
+ def test_assert_equal_string_encodings
340
+ msg = <<-EOM.gsub(/^ {10}/, "")
341
+ --- expected
342
+ +++ actual
343
+ @@ -1,3 +1,3 @@
344
+ -# encoding: UTF-8
345
+ -# valid: false
346
+ +# encoding: ASCII-8BIT
347
+ +# valid: true
348
+ "bad-utf8-\\xF1.txt"
349
+ EOM
350
+
351
+ assert_triggered msg do
352
+ x = "bad-utf8-\xF1.txt"
353
+ y = x.dup.force_encoding "binary" # TODO: switch to .b when 1.9 dropped
354
+ @tc.assert_equal x, y
355
+ end
356
+ end unless RUBY18
357
+
358
+ def test_assert_equal_string_encodings_both_different
359
+ msg = <<-EOM.gsub(/^ {10}/, "")
360
+ --- expected
361
+ +++ actual
362
+ @@ -1,3 +1,3 @@
363
+ -# encoding: US-ASCII
364
+ -# valid: false
365
+ +# encoding: ASCII-8BIT
366
+ +# valid: true
367
+ "bad-utf8-\\xF1.txt"
368
+ EOM
369
+
370
+ assert_triggered msg do
371
+ x = "bad-utf8-\xF1.txt".force_encoding "ASCII"
372
+ y = x.dup.force_encoding "binary" # TODO: switch to .b when 1.9 dropped
373
+ @tc.assert_equal x, y
374
+ end
375
+ end unless RUBY18
376
+
377
+ def test_assert_equal_unescape_newlines
378
+ msg = <<-'EOM'.gsub(/^ {10}/, "") # NOTE single quotes on heredoc
379
+ --- expected
380
+ +++ actual
381
+ @@ -1,2 +1,2 @@
382
+ -"hello
383
+ +"hello\n
384
+ world"
385
+ EOM
386
+
387
+ assert_triggered msg do
388
+ exp = "hello\nworld"
389
+ act = 'hello\nworld' # notice single quotes
390
+
391
+ @tc.assert_equal exp, act
392
+ end
393
+ end
394
+
395
+ def test_assert_in_delta
396
+ @tc.assert_in_delta 0.0, 1.0 / 1000, 0.1
397
+ end
398
+
399
+ def test_assert_in_delta_triggered
400
+ x = "1.0e-06"
401
+ assert_triggered "Expected |0.0 - 0.001| (0.001) to be <= #{x}." do
402
+ @tc.assert_in_delta 0.0, 1.0 / 1000, 0.000001
403
+ end
404
+ end
405
+
406
+ def test_assert_in_epsilon
407
+ @assertion_count = 10
408
+
409
+ @tc.assert_in_epsilon 10_000, 9991
410
+ @tc.assert_in_epsilon 9991, 10_000
411
+ @tc.assert_in_epsilon 1.0, 1.001
412
+ @tc.assert_in_epsilon 1.001, 1.0
413
+
414
+ @tc.assert_in_epsilon 10_000, 9999.1, 0.0001
415
+ @tc.assert_in_epsilon 9999.1, 10_000, 0.0001
416
+ @tc.assert_in_epsilon 1.0, 1.0001, 0.0001
417
+ @tc.assert_in_epsilon 1.0001, 1.0, 0.0001
418
+
419
+ @tc.assert_in_epsilon(-1, -1)
420
+ @tc.assert_in_epsilon(-10_000, -9991)
421
+ end
422
+
423
+ def test_assert_in_epsilon_triggered
424
+ assert_triggered "Expected |10000 - 9990| (10) to be <= 9.99." do
425
+ @tc.assert_in_epsilon 10_000, 9990
426
+ end
427
+ end
428
+
429
+ def test_assert_in_epsilon_triggered_negative_case
430
+ x = (RUBY18 and not maglev?) ? "0.1" : "0.100000xxx"
431
+ y = "0.1"
432
+ assert_triggered "Expected |-1.1 - -1| (#{x}) to be <= #{y}." do
433
+ @tc.assert_in_epsilon(-1.1, -1, 0.1)
434
+ end
435
+ end
436
+
437
+ def test_assert_includes
438
+ @assertion_count = 2
439
+
440
+ @tc.assert_includes [true], true
441
+ end
442
+
443
+ def test_assert_includes_triggered
444
+ @assertion_count = 3
445
+
446
+ e = @tc.assert_raises Minitest::Assertion do
447
+ @tc.assert_includes [true], false
448
+ end
449
+
450
+ expected = "Expected [true] to include false."
451
+ assert_equal expected, e.message
452
+ end
453
+
454
+ def test_assert_instance_of
455
+ @tc.assert_instance_of String, "blah"
456
+ end
457
+
458
+ def test_assert_instance_of_triggered
459
+ assert_triggered 'Expected "blah" to be an instance of Array, not String.' do
460
+ @tc.assert_instance_of Array, "blah"
461
+ end
462
+ end
463
+
464
+ def test_assert_kind_of
465
+ @tc.assert_kind_of String, "blah"
466
+ end
467
+
468
+ def test_assert_kind_of_triggered
469
+ assert_triggered 'Expected "blah" to be a kind of Array, not String.' do
470
+ @tc.assert_kind_of Array, "blah"
471
+ end
472
+ end
473
+
474
+ def test_assert_match
475
+ @assertion_count = 2
476
+ @tc.assert_match(/\w+/, "blah blah blah")
477
+ end
478
+
479
+ def test_assert_match_matchee_to_str
480
+ @assertion_count = 2
481
+
482
+ obj = Object.new
483
+ def obj.to_str; "blah" end
484
+
485
+ @tc.assert_match "blah", obj
486
+ end
487
+
488
+ def test_assert_match_matcher_object
489
+ @assertion_count = 2
490
+
491
+ pattern = Object.new
492
+ def pattern.=~ _; true end
493
+
494
+ @tc.assert_match pattern, 5
495
+ end
496
+
497
+ def test_assert_match_object_triggered
498
+ @assertion_count = 2
499
+
500
+ pattern = Object.new
501
+ def pattern.=~ _; false end
502
+ def pattern.inspect; "[Object]" end
503
+
504
+ assert_triggered "Expected [Object] to match 5." do
505
+ @tc.assert_match pattern, 5
506
+ end
507
+ end
508
+
509
+ def test_assert_match_triggered
510
+ @assertion_count = 2
511
+ assert_triggered 'Expected /\d+/ to match "blah blah blah".' do
512
+ @tc.assert_match(/\d+/, "blah blah blah")
513
+ end
514
+ end
515
+
516
+ def test_assert_nil
517
+ @tc.assert_nil nil
518
+ end
519
+
520
+ def test_assert_nil_triggered
521
+ assert_triggered "Expected 42 to be nil." do
522
+ @tc.assert_nil 42
523
+ end
524
+ end
525
+
526
+ def test_assert_operator
527
+ @tc.assert_operator 2, :>, 1
528
+ end
529
+
530
+ def test_assert_operator_bad_object
531
+ bad = Object.new
532
+ def bad.== _; true end
533
+
534
+ @tc.assert_operator bad, :equal?, bad
535
+ end
536
+
537
+ def test_assert_operator_triggered
538
+ assert_triggered "Expected 2 to be < 1." do
539
+ @tc.assert_operator 2, :<, 1
540
+ end
541
+ end
542
+
543
+ def test_assert_output_both
544
+ @assertion_count = 2
545
+
546
+ @tc.assert_output "yay", "blah" do
547
+ print "yay"
548
+ $stderr.print "blah"
549
+ end
550
+ end
551
+
552
+ def test_assert_output_both_regexps
553
+ @assertion_count = 4
554
+
555
+ @tc.assert_output(/y.y/, /bl.h/) do
556
+ print "yay"
557
+ $stderr.print "blah"
558
+ end
559
+ end
560
+
561
+ def test_assert_output_err
562
+ @tc.assert_output nil, "blah" do
563
+ $stderr.print "blah"
564
+ end
565
+ end
566
+
567
+ def test_assert_output_neither
568
+ @assertion_count = 0
569
+
570
+ @tc.assert_output do
571
+ # do nothing
572
+ end
573
+ end
574
+
575
+ def test_assert_output_out
576
+ @tc.assert_output "blah" do
577
+ print "blah"
578
+ end
579
+ end
580
+
581
+ def test_assert_output_triggered_both
582
+ assert_triggered util_msg("blah", "blah blah", "In stderr") do
583
+ @tc.assert_output "yay", "blah" do
584
+ print "boo"
585
+ $stderr.print "blah blah"
586
+ end
587
+ end
588
+ end
589
+
590
+ def test_assert_output_triggered_err
591
+ assert_triggered util_msg("blah", "blah blah", "In stderr") do
592
+ @tc.assert_output nil, "blah" do
593
+ $stderr.print "blah blah"
594
+ end
595
+ end
596
+ end
597
+
598
+ def test_assert_output_triggered_out
599
+ assert_triggered util_msg("blah", "blah blah", "In stdout") do
600
+ @tc.assert_output "blah" do
601
+ print "blah blah"
602
+ end
603
+ end
604
+ end
605
+
606
+ def test_assert_output_without_block
607
+ assert_triggered "assert_output requires a block to capture output." do
608
+ @tc.assert_output "blah"
609
+ end
610
+ end
611
+
612
+ def test_assert_predicate
613
+ @tc.assert_predicate "", :empty?
614
+ end
615
+
616
+ def test_assert_predicate_triggered
617
+ assert_triggered 'Expected "blah" to be empty?.' do
618
+ @tc.assert_predicate "blah", :empty?
619
+ end
620
+ end
621
+
622
+ def test_assert_raises
623
+ @tc.assert_raises RuntimeError do
624
+ raise "blah"
625
+ end
626
+ end
627
+
628
+ def test_assert_raises_default
629
+ @tc.assert_raises do
630
+ raise StandardError, "blah"
631
+ end
632
+ end
633
+
634
+ def test_assert_raises_default_triggered
635
+ e = assert_raises Minitest::Assertion do
636
+ @tc.assert_raises do
637
+ raise SomeError, "blah"
638
+ end
639
+ end
640
+
641
+ expected = clean <<-EOM.chomp
642
+ [StandardError] exception expected, not
643
+ Class: <SomeError>
644
+ Message: <\"blah\">
645
+ ---Backtrace---
646
+ FILE:LINE:in \`test_assert_raises_default_triggered\'
647
+ ---------------
648
+ EOM
649
+
650
+ actual = e.message.gsub(/^.+:\d+/, "FILE:LINE")
651
+ actual.gsub!(/block \(\d+ levels\) in /, "") if RUBY_VERSION >= "1.9.0"
652
+
653
+ assert_equal expected, actual
654
+ end
655
+
656
+ def test_assert_raises_exit
657
+ @tc.assert_raises SystemExit do
658
+ exit 1
659
+ end
660
+ end
661
+
662
+ def test_assert_raises_module
663
+ @tc.assert_raises MyModule do
664
+ raise AnError
665
+ end
666
+ end
667
+
668
+ def test_assert_raises_signals
669
+ @tc.assert_raises SignalException do
670
+ raise SignalException, :INT
671
+ end
672
+ end
673
+
674
+ ##
675
+ # *sigh* This is quite an odd scenario, but it is from real (albeit
676
+ # ugly) test code in ruby-core:
677
+
678
+ # http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=29259
679
+
680
+ def test_assert_raises_skip
681
+ @assertion_count = 0
682
+
683
+ assert_triggered "skipped", Minitest::Skip do
684
+ @tc.assert_raises ArgumentError do
685
+ begin
686
+ raise "blah"
687
+ rescue
688
+ skip "skipped"
689
+ end
690
+ end
691
+ end
692
+ end
693
+
694
+ def test_assert_raises_subclass
695
+ @tc.assert_raises StandardError do
696
+ raise AnError
697
+ end
698
+ end
699
+
700
+ def test_assert_raises_subclass_triggered
701
+ e = assert_raises Minitest::Assertion do
702
+ @tc.assert_raises SomeError do
703
+ raise AnError, "some message"
704
+ end
705
+ end
706
+
707
+ expected = clean <<-EOM
708
+ [SomeError] exception expected, not
709
+ Class: <AnError>
710
+ Message: <\"some message\">
711
+ ---Backtrace---
712
+ FILE:LINE:in \`test_assert_raises_subclass_triggered\'
713
+ ---------------
714
+ EOM
715
+
716
+ actual = e.message.gsub(/^.+:\d+/, "FILE:LINE")
717
+ actual.gsub!(/block \(\d+ levels\) in /, "") if RUBY_VERSION >= "1.9.0"
718
+
719
+ assert_equal expected.chomp, actual
720
+ end
721
+
722
+ def test_assert_raises_triggered_different
723
+ e = assert_raises Minitest::Assertion do
724
+ @tc.assert_raises RuntimeError do
725
+ raise SyntaxError, "icky"
726
+ end
727
+ end
728
+
729
+ expected = clean <<-EOM.chomp
730
+ [RuntimeError] exception expected, not
731
+ Class: <SyntaxError>
732
+ Message: <\"icky\">
733
+ ---Backtrace---
734
+ FILE:LINE:in \`test_assert_raises_triggered_different\'
735
+ ---------------
736
+ EOM
737
+
738
+ actual = e.message.gsub(/^.+:\d+/, "FILE:LINE")
739
+ actual.gsub!(/block \(\d+ levels\) in /, "") if RUBY_VERSION >= "1.9.0"
740
+
741
+ assert_equal expected, actual
742
+ end
743
+
744
+ def test_assert_raises_triggered_different_msg
745
+ e = assert_raises Minitest::Assertion do
746
+ @tc.assert_raises RuntimeError, "XXX" do
747
+ raise SyntaxError, "icky"
748
+ end
749
+ end
750
+
751
+ expected = clean <<-EOM
752
+ XXX.
753
+ [RuntimeError] exception expected, not
754
+ Class: <SyntaxError>
755
+ Message: <\"icky\">
756
+ ---Backtrace---
757
+ FILE:LINE:in \`test_assert_raises_triggered_different_msg\'
758
+ ---------------
759
+ EOM
760
+
761
+ actual = e.message.gsub(/^.+:\d+/, "FILE:LINE")
762
+ actual.gsub!(/block \(\d+ levels\) in /, "") if RUBY_VERSION >= "1.9.0"
763
+
764
+ assert_equal expected.chomp, actual
765
+ end
766
+
767
+ def test_assert_raises_triggered_none
768
+ e = assert_raises Minitest::Assertion do
769
+ @tc.assert_raises Minitest::Assertion do
770
+ # do nothing
771
+ end
772
+ end
773
+
774
+ expected = "Minitest::Assertion expected but nothing was raised."
775
+
776
+ assert_equal expected, e.message
777
+ end
778
+
779
+ def test_assert_raises_triggered_none_msg
780
+ e = assert_raises Minitest::Assertion do
781
+ @tc.assert_raises Minitest::Assertion, "XXX" do
782
+ # do nothing
783
+ end
784
+ end
785
+
786
+ expected = "XXX.\nMinitest::Assertion expected but nothing was raised."
787
+
788
+ assert_equal expected, e.message
789
+ end
790
+
791
+ def test_assert_raises_without_block
792
+ assert_triggered "assert_raises requires a block to capture errors." do
793
+ @tc.assert_raises StandardError
794
+ end
795
+ end
796
+
797
+ def test_assert_respond_to
798
+ @tc.assert_respond_to "blah", :empty?
799
+ end
800
+
801
+ def test_assert_respond_to_triggered
802
+ assert_triggered 'Expected "blah" (String) to respond to #rawr!.' do
803
+ @tc.assert_respond_to "blah", :rawr!
804
+ end
805
+ end
806
+
807
+ def test_assert_same
808
+ @assertion_count = 3
809
+
810
+ o = "blah"
811
+ @tc.assert_same 1, 1
812
+ @tc.assert_same :blah, :blah
813
+ @tc.assert_same o, o
814
+ end
815
+
816
+ def test_assert_same_triggered
817
+ @assertion_count = 2
818
+
819
+ assert_triggered "Expected 2 (oid=N) to be the same as 1 (oid=N)." do
820
+ @tc.assert_same 1, 2
821
+ end
822
+
823
+ s1 = "blah"
824
+ s2 = "blah"
825
+
826
+ assert_triggered 'Expected "blah" (oid=N) to be the same as "blah" (oid=N).' do
827
+ @tc.assert_same s1, s2
828
+ end
829
+ end
830
+
831
+ def test_assert_send
832
+ assert_deprecated :assert_send do
833
+ @tc.assert_send [1, :<, 2]
834
+ end
835
+ end
836
+
837
+ def test_assert_send_bad
838
+ assert_deprecated :assert_send do
839
+ assert_triggered "Expected 1.>(*[2]) to return true." do
840
+ @tc.assert_send [1, :>, 2]
841
+ end
842
+ end
843
+ end
844
+
845
+ def test_assert_silent
846
+ @assertion_count = 2
847
+
848
+ @tc.assert_silent do
849
+ # do nothing
850
+ end
851
+ end
852
+
853
+ def test_assert_silent_triggered_err
854
+ assert_triggered util_msg("", "blah blah", "In stderr") do
855
+ @tc.assert_silent do
856
+ $stderr.print "blah blah"
857
+ end
858
+ end
859
+ end
860
+
861
+ def test_assert_silent_triggered_out
862
+ @assertion_count = 2
863
+
864
+ assert_triggered util_msg("", "blah blah", "In stdout") do
865
+ @tc.assert_silent do
866
+ print "blah blah"
867
+ end
868
+ end
869
+ end
870
+
871
+ def test_assert_throws
872
+ @tc.assert_throws :blah do
873
+ throw :blah
874
+ end
875
+ end
876
+
877
+ def test_assert_throws_argument_exception
878
+ @tc.assert_raises ArgumentError do
879
+ @tc.assert_throws :blah do
880
+ raise ArgumentError
881
+ end
882
+ end
883
+ end
884
+
885
+ def test_assert_throws_different
886
+ assert_triggered "Expected :blah to have been thrown, not :not_blah." do
887
+ @tc.assert_throws :blah do
888
+ throw :not_blah
889
+ end
890
+ end
891
+ end
892
+
893
+ def test_assert_throws_name_error
894
+ @tc.assert_raises NameError do
895
+ @tc.assert_throws :blah do
896
+ raise NameError
897
+ end
898
+ end
899
+ end
900
+
901
+ def test_assert_throws_unthrown
902
+ assert_triggered "Expected :blah to have been thrown." do
903
+ @tc.assert_throws :blah do
904
+ # do nothing
905
+ end
906
+ end
907
+ end
908
+
909
+ def test_assert_path_exists
910
+ @tc.assert_path_exists __FILE__
911
+ end
912
+
913
+ def test_assert_path_exists_triggered
914
+ assert_triggered "Expected path 'blah' to exist." do
915
+ @tc.assert_path_exists "blah"
916
+ end
917
+ end
918
+
919
+ def test_capture_io
920
+ @assertion_count = 0
921
+
922
+ non_verbose do
923
+ out, err = capture_io do
924
+ puts "hi"
925
+ $stderr.puts "bye!"
926
+ end
927
+
928
+ assert_equal "hi\n", out
929
+ assert_equal "bye!\n", err
930
+ end
931
+ end
932
+
933
+ def test_capture_subprocess_io
934
+ @assertion_count = 0
935
+
936
+ non_verbose do
937
+ out, err = capture_subprocess_io do
938
+ system("echo hi")
939
+ system("echo bye! 1>&2")
940
+ end
941
+
942
+ assert_equal "hi\n", out
943
+ assert_equal "bye!", err.strip
944
+ end
945
+ end
946
+
947
+ def test_class_asserts_match_refutes
948
+ @assertion_count = 0
949
+
950
+ methods = Minitest::Assertions.public_instance_methods
951
+ methods.map!(&:to_s) if Symbol === methods.first
952
+
953
+ # These don't have corresponding refutes _on purpose_. They're
954
+ # useless and will never be added, so don't bother.
955
+ ignores = %w[assert_output assert_raises assert_send
956
+ assert_silent assert_throws assert_mock]
957
+
958
+ # These are test/unit methods. I'm not actually sure why they're still here
959
+ ignores += %w[assert_no_match assert_not_equal assert_not_nil
960
+ assert_not_same assert_nothing_raised
961
+ assert_nothing_thrown assert_raise]
962
+
963
+ asserts = methods.grep(/^assert/).sort - ignores
964
+ refutes = methods.grep(/^refute/).sort - ignores
965
+
966
+ assert_empty refutes.map { |n| n.sub(/^refute/, "assert") } - asserts
967
+ assert_empty asserts.map { |n| n.sub(/^assert/, "refute") } - refutes
968
+ end
969
+
970
+ def test_delta_consistency
971
+ @assertion_count = 2
972
+
973
+ @tc.assert_in_delta 0, 1, 1
974
+
975
+ assert_triggered "Expected |0 - 1| (1) to not be <= 1." do
976
+ @tc.refute_in_delta 0, 1, 1
977
+ end
978
+ end
979
+
980
+ def test_epsilon_consistency
981
+ @assertion_count = 2
982
+
983
+ @tc.assert_in_epsilon 1.0, 1.001
984
+
985
+ msg = "Expected |1.0 - 1.001| (0.000999xxx) to not be <= 0.001."
986
+ assert_triggered msg do
987
+ @tc.refute_in_epsilon 1.0, 1.001
988
+ end
989
+ end
990
+
991
+ def test_fail_after
992
+ t = Time.now
993
+ y, m, d = t.year, t.month, t.day
994
+
995
+ assert_silent do
996
+ @tc.fail_after y, m, d+1, "remove the deprecations"
997
+ end
998
+
999
+ assert_triggered "remove the deprecations" do
1000
+ @tc.fail_after y, m, d, "remove the deprecations"
1001
+ end
1002
+ end
1003
+
1004
+ def test_flunk
1005
+ assert_triggered "Epic Fail!" do
1006
+ @tc.flunk
1007
+ end
1008
+ end
1009
+
1010
+ def test_flunk_message
1011
+ assert_triggered @zomg do
1012
+ @tc.flunk @zomg
1013
+ end
1014
+ end
1015
+
1016
+ def test_pass
1017
+ @tc.pass
1018
+ end
1019
+
1020
+ def test_refute
1021
+ @assertion_count = 2
1022
+
1023
+ @tc.assert_equal false, @tc.refute(false), "returns false on success"
1024
+ end
1025
+
1026
+ def test_refute_empty
1027
+ @assertion_count = 2
1028
+
1029
+ @tc.refute_empty [1]
1030
+ end
1031
+
1032
+ def test_refute_empty_triggered
1033
+ @assertion_count = 2
1034
+
1035
+ assert_triggered "Expected [] to not be empty." do
1036
+ @tc.refute_empty []
1037
+ end
1038
+ end
1039
+
1040
+ def test_refute_equal
1041
+ @tc.refute_equal "blah", "yay"
1042
+ end
1043
+
1044
+ def test_refute_equal_triggered
1045
+ assert_triggered 'Expected "blah" to not be equal to "blah".' do
1046
+ @tc.refute_equal "blah", "blah"
1047
+ end
1048
+ end
1049
+
1050
+ def test_refute_in_delta
1051
+ @tc.refute_in_delta 0.0, 1.0 / 1000, 0.000001
1052
+ end
1053
+
1054
+ def test_refute_in_delta_triggered
1055
+ x = "0.1"
1056
+ assert_triggered "Expected |0.0 - 0.001| (0.001) to not be <= #{x}." do
1057
+ @tc.refute_in_delta 0.0, 1.0 / 1000, 0.1
1058
+ end
1059
+ end
1060
+
1061
+ def test_refute_in_epsilon
1062
+ @tc.refute_in_epsilon 10_000, 9990-1
1063
+ end
1064
+
1065
+ def test_refute_in_epsilon_triggered
1066
+ assert_triggered "Expected |10000 - 9990| (10) to not be <= 10.0." do
1067
+ @tc.refute_in_epsilon 10_000, 9990
1068
+ flunk
1069
+ end
1070
+ end
1071
+
1072
+ def test_refute_includes
1073
+ @assertion_count = 2
1074
+
1075
+ @tc.refute_includes [true], false
1076
+ end
1077
+
1078
+ def test_refute_includes_triggered
1079
+ @assertion_count = 3
1080
+
1081
+ e = @tc.assert_raises Minitest::Assertion do
1082
+ @tc.refute_includes [true], true
1083
+ end
1084
+
1085
+ expected = "Expected [true] to not include true."
1086
+ assert_equal expected, e.message
1087
+ end
1088
+
1089
+ def test_refute_instance_of
1090
+ @tc.refute_instance_of Array, "blah"
1091
+ end
1092
+
1093
+ def test_refute_instance_of_triggered
1094
+ assert_triggered 'Expected "blah" to not be an instance of String.' do
1095
+ @tc.refute_instance_of String, "blah"
1096
+ end
1097
+ end
1098
+
1099
+ def test_refute_kind_of
1100
+ @tc.refute_kind_of Array, "blah"
1101
+ end
1102
+
1103
+ def test_refute_kind_of_triggered
1104
+ assert_triggered 'Expected "blah" to not be a kind of String.' do
1105
+ @tc.refute_kind_of String, "blah"
1106
+ end
1107
+ end
1108
+
1109
+ def test_refute_match
1110
+ @assertion_count = 2
1111
+ @tc.refute_match(/\d+/, "blah blah blah")
1112
+ end
1113
+
1114
+ def test_refute_match_matcher_object
1115
+ @assertion_count = 2
1116
+ pattern = Object.new
1117
+ def pattern.=~ _; false end
1118
+ @tc.refute_match pattern, 5
1119
+ end
1120
+
1121
+ def test_refute_match_object_triggered
1122
+ @assertion_count = 2
1123
+
1124
+ pattern = Object.new
1125
+ def pattern.=~ _; true end
1126
+ def pattern.inspect; "[Object]" end
1127
+
1128
+ assert_triggered "Expected [Object] to not match 5." do
1129
+ @tc.refute_match pattern, 5
1130
+ end
1131
+ end
1132
+
1133
+ def test_refute_match_triggered
1134
+ @assertion_count = 2
1135
+ assert_triggered 'Expected /\w+/ to not match "blah blah blah".' do
1136
+ @tc.refute_match(/\w+/, "blah blah blah")
1137
+ end
1138
+ end
1139
+
1140
+ def test_refute_nil
1141
+ @tc.refute_nil 42
1142
+ end
1143
+
1144
+ def test_refute_nil_triggered
1145
+ assert_triggered "Expected nil to not be nil." do
1146
+ @tc.refute_nil nil
1147
+ end
1148
+ end
1149
+
1150
+ def test_refute_operator
1151
+ @tc.refute_operator 2, :<, 1
1152
+ end
1153
+
1154
+ def test_refute_operator_bad_object
1155
+ bad = Object.new
1156
+ def bad.== _; true end
1157
+
1158
+ @tc.refute_operator true, :equal?, bad
1159
+ end
1160
+
1161
+ def test_refute_operator_triggered
1162
+ assert_triggered "Expected 2 to not be > 1." do
1163
+ @tc.refute_operator 2, :>, 1
1164
+ end
1165
+ end
1166
+
1167
+ def test_refute_predicate
1168
+ @tc.refute_predicate "42", :empty?
1169
+ end
1170
+
1171
+ def test_refute_predicate_triggered
1172
+ assert_triggered 'Expected "" to not be empty?.' do
1173
+ @tc.refute_predicate "", :empty?
1174
+ end
1175
+ end
1176
+
1177
+ def test_refute_respond_to
1178
+ @tc.refute_respond_to "blah", :rawr!
1179
+ end
1180
+
1181
+ def test_refute_respond_to_triggered
1182
+ assert_triggered 'Expected "blah" to not respond to empty?.' do
1183
+ @tc.refute_respond_to "blah", :empty?
1184
+ end
1185
+ end
1186
+
1187
+ def test_refute_same
1188
+ @tc.refute_same 1, 2
1189
+ end
1190
+
1191
+ def test_refute_same_triggered
1192
+ assert_triggered "Expected 1 (oid=N) to not be the same as 1 (oid=N)." do
1193
+ @tc.refute_same 1, 1
1194
+ end
1195
+ end
1196
+
1197
+ def test_refute_path_exists
1198
+ @tc.refute_path_exists "blah"
1199
+ end
1200
+
1201
+ def test_refute_path_exists_triggered
1202
+ assert_triggered "Expected path '#{__FILE__}' to not exist." do
1203
+ @tc.refute_path_exists __FILE__
1204
+ end
1205
+ end
1206
+
1207
+ def test_skip
1208
+ @assertion_count = 0
1209
+
1210
+ assert_triggered "haha!", Minitest::Skip do
1211
+ @tc.skip "haha!"
1212
+ end
1213
+ end
1214
+
1215
+ def test_skip_until
1216
+ @assertion_count = 0
1217
+
1218
+ t = Time.now
1219
+ y, m, d = t.year, t.month, t.day
1220
+
1221
+ assert_output "", /Stale skip_until \"not yet\" at .*?:\d+$/ do
1222
+ @tc.skip_until y, m, d, "not yet"
1223
+ end
1224
+
1225
+ assert_triggered "not ready yet", Minitest::Skip do
1226
+ @tc.skip_until y, m, d+1, "not ready yet"
1227
+ end
1228
+ end
1229
+
1230
+ def util_msg exp, act, msg = nil
1231
+ s = "Expected: #{exp.inspect}\n Actual: #{act.inspect}"
1232
+ s = "#{msg}.\n#{s}" if msg
1233
+ s
1234
+ end
1235
+
1236
+ def without_diff
1237
+ old_diff = Minitest::Assertions.diff
1238
+ Minitest::Assertions.diff = nil
1239
+
1240
+ yield
1241
+ ensure
1242
+ Minitest::Assertions.diff = old_diff
1243
+ end
1244
+ end
1245
+
1246
+ class TestMinitestAssertionHelpers < Minitest::Test
1247
+ def assert_mu_pp exp, input, raw = false
1248
+ act = mu_pp input
1249
+
1250
+ if String === input && !raw then
1251
+ assert_equal "\"#{exp}\"", act
1252
+ else
1253
+ assert_equal exp, act
1254
+ end
1255
+ end
1256
+
1257
+ def assert_mu_pp_for_diff exp, input, raw = false
1258
+ act = mu_pp_for_diff input
1259
+
1260
+ if String === input && !raw then
1261
+ assert_equal "\"#{exp}\"", act
1262
+ else
1263
+ assert_equal exp, act
1264
+ end
1265
+ end
1266
+
1267
+ def test_diff_equal
1268
+ msg = "No visible difference in the String#inspect output.
1269
+ You should look at the implementation of #== on String or its members.
1270
+ \"blahblahblahblahblahblahblahblahblahblah\"".gsub(/^ +/, "")
1271
+
1272
+ o1 = "blah" * 10
1273
+ o2 = "blah" * 10
1274
+ def o1.== _
1275
+ false
1276
+ end
1277
+
1278
+ assert_equal msg, diff(o1, o2)
1279
+ end
1280
+
1281
+ def test_diff_str_mixed
1282
+ msg = <<-'EOM'.gsub(/^ {10}/, "") # NOTE single quotes on heredoc
1283
+ --- expected
1284
+ +++ actual
1285
+ @@ -1 +1 @@
1286
+ -"A\\n\nB"
1287
+ +"A\n\\nB"
1288
+ EOM
1289
+
1290
+ exp = "A\\n\nB"
1291
+ act = "A\n\\nB"
1292
+
1293
+ assert_equal msg, diff(exp, act)
1294
+ end
1295
+
1296
+ def test_diff_str_multiline
1297
+ msg = <<-'EOM'.gsub(/^ {10}/, "") # NOTE single quotes on heredoc
1298
+ --- expected
1299
+ +++ actual
1300
+ @@ -1,2 +1,2 @@
1301
+ "A
1302
+ -B"
1303
+ +C"
1304
+ EOM
1305
+
1306
+ exp = "A\nB"
1307
+ act = "A\nC"
1308
+
1309
+ assert_equal msg, diff(exp, act)
1310
+ end
1311
+
1312
+ def test_diff_str_simple
1313
+ msg = <<-'EOM'.gsub(/^ {10}/, "").chomp # NOTE single quotes on heredoc
1314
+ Expected: "A"
1315
+ Actual: "B"
1316
+ EOM
1317
+
1318
+ exp = "A"
1319
+ act = "B"
1320
+
1321
+ assert_equal msg, diff(exp, act)
1322
+ end
1323
+
1324
+ def test_message
1325
+ assert_equal "blah2.", message { "blah2" }.call
1326
+ assert_equal "blah2.", message("") { "blah2" }.call
1327
+ assert_equal "blah1.\nblah2.", message(:blah1) { "blah2" }.call
1328
+ assert_equal "blah1.\nblah2.", message("blah1") { "blah2" }.call
1329
+
1330
+ message = proc { "blah1" }
1331
+ assert_equal "blah1.\nblah2.", message(message) { "blah2" }.call
1332
+
1333
+ message = message { "blah1" }
1334
+ assert_equal "blah1.\nblah2.", message(message) { "blah2" }.call
1335
+ end
1336
+
1337
+ def test_message_deferred
1338
+ var = nil
1339
+
1340
+ msg = message { var = "blah" }
1341
+
1342
+ assert_nil var
1343
+
1344
+ msg.call
1345
+
1346
+ assert_equal "blah", var
1347
+ end
1348
+
1349
+ def test_mu_pp
1350
+ assert_mu_pp 42.inspect, 42
1351
+ assert_mu_pp %w[a b c].inspect, %w[a b c]
1352
+ assert_mu_pp "A B", "A B"
1353
+ assert_mu_pp "A\\nB", "A\nB"
1354
+ assert_mu_pp "A\\\\nB", 'A\nB' # notice single quotes
1355
+ end
1356
+
1357
+ def test_mu_pp_for_diff
1358
+ assert_mu_pp_for_diff "#<Object:0xXXXXXX>", Object.new
1359
+ assert_mu_pp_for_diff "A B", "A B"
1360
+ assert_mu_pp_for_diff [1, 2, 3].inspect, [1, 2, 3]
1361
+ assert_mu_pp_for_diff "A\nB", "A\nB"
1362
+ end
1363
+
1364
+ def test_mu_pp_for_diff_str_bad_encoding
1365
+ str = "\666".force_encoding Encoding::UTF_8
1366
+ exp = "# encoding: UTF-8\n# valid: false\n\"\\xB6\""
1367
+
1368
+ assert_mu_pp_for_diff exp, str, :raw
1369
+ end
1370
+
1371
+ def test_mu_pp_for_diff_str_bad_encoding_both
1372
+ str = "\666A\\n\nB".force_encoding Encoding::UTF_8
1373
+ exp = "# encoding: UTF-8\n# valid: false\n\"\\xB6A\\\\n\\nB\""
1374
+
1375
+ assert_mu_pp_for_diff exp, str, :raw
1376
+ end
1377
+
1378
+ def test_mu_pp_for_diff_str_encoding
1379
+ str = "A\nB".b
1380
+ exp = "# encoding: ASCII-8BIT\n# valid: true\n\"A\nB\""
1381
+
1382
+ assert_mu_pp_for_diff exp, str, :raw
1383
+ end
1384
+
1385
+ def test_mu_pp_for_diff_str_encoding_both
1386
+ str = "A\\n\nB".b
1387
+ exp = "# encoding: ASCII-8BIT\n# valid: true\n\"A\\\\n\\nB\""
1388
+
1389
+ assert_mu_pp_for_diff exp, str, :raw
1390
+ end
1391
+
1392
+ def test_mu_pp_for_diff_str_nerd
1393
+ assert_mu_pp_for_diff "A\\nB\\\\nC", "A\nB\\nC"
1394
+ assert_mu_pp_for_diff "\\nB\\\\nC", "\nB\\nC"
1395
+ assert_mu_pp_for_diff "\\nB\\\\n", "\nB\\n"
1396
+ assert_mu_pp_for_diff "\\n\\\\n", "\n\\n"
1397
+ assert_mu_pp_for_diff "\\\\n\\n", "\\n\n"
1398
+ assert_mu_pp_for_diff "\\\\nB\\n", "\\nB\n"
1399
+ assert_mu_pp_for_diff "\\\\nB\\nC", "\\nB\nC"
1400
+ assert_mu_pp_for_diff "A\\\\n\\nB", "A\\n\nB"
1401
+ assert_mu_pp_for_diff "A\\n\\\\nB", "A\n\\nB"
1402
+ assert_mu_pp_for_diff "\\\\n\\n", "\\n\n"
1403
+ assert_mu_pp_for_diff "\\n\\\\n", "\n\\n"
1404
+ end
1405
+
1406
+ def test_mu_pp_for_diff_str_normal
1407
+ assert_mu_pp_for_diff "", ""
1408
+ assert_mu_pp_for_diff "A\\n\n", "A\\n"
1409
+ assert_mu_pp_for_diff "A\\n\nB", "A\\nB"
1410
+ assert_mu_pp_for_diff "A\n", "A\n"
1411
+ assert_mu_pp_for_diff "A\nB", "A\nB"
1412
+ assert_mu_pp_for_diff "\\n\n", "\\n"
1413
+ assert_mu_pp_for_diff "\n", "\n"
1414
+ assert_mu_pp_for_diff "\\n\nA", "\\nA"
1415
+ assert_mu_pp_for_diff "\nA", "\nA"
1416
+ end
1417
+
1418
+ def test_mu_pp_str_bad_encoding
1419
+ str = "\666".force_encoding Encoding::UTF_8
1420
+ exp = "# encoding: UTF-8\n# valid: false\n\"\\xB6\""
1421
+
1422
+ assert_mu_pp exp, str, :raw
1423
+ end
1424
+
1425
+ def test_mu_pp_str_encoding
1426
+ str = "A\nB".b
1427
+ exp = "# encoding: ASCII-8BIT\n# valid: true\n\"A\\nB\""
1428
+
1429
+ assert_mu_pp exp, str, :raw
1430
+ end
1431
+
1432
+ def test_mu_pp_str_immutable
1433
+ printer = Class.new { extend Minitest::Assertions }
1434
+ str = "test".freeze
1435
+ assert_equal '"test"', printer.mu_pp(str)
1436
+ end
1437
+ end