test-unit 3.2.9 → 3.5.5

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.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/BSDL +24 -0
  3. data/COPYING +41 -44
  4. data/README.md +18 -11
  5. data/Rakefile +0 -23
  6. data/doc/text/getting-started.md +2 -2
  7. data/doc/text/news.md +329 -1
  8. data/lib/test/unit/assertion-failed-error.rb +35 -0
  9. data/lib/test/unit/assertions.rb +453 -161
  10. data/lib/test/unit/attribute.rb +3 -1
  11. data/lib/test/unit/autorunner.rb +78 -30
  12. data/lib/test/unit/code-snippet-fetcher.rb +7 -7
  13. data/lib/test/unit/collector/descendant.rb +1 -0
  14. data/lib/test/unit/collector/dir.rb +4 -2
  15. data/lib/test/unit/collector/load.rb +3 -3
  16. data/lib/test/unit/collector/objectspace.rb +1 -0
  17. data/lib/test/unit/collector.rb +31 -0
  18. data/lib/test/unit/color-scheme.rb +20 -2
  19. data/lib/test/unit/data-sets.rb +26 -15
  20. data/lib/test/unit/data.rb +5 -5
  21. data/lib/test/unit/diff.rb +2 -3
  22. data/lib/test/unit/fixture.rb +6 -0
  23. data/lib/test/unit/notification.rb +9 -7
  24. data/lib/test/unit/omission.rb +34 -31
  25. data/lib/test/unit/pending.rb +12 -11
  26. data/lib/test/unit/priority.rb +7 -5
  27. data/lib/test/unit/runner/console.rb +0 -17
  28. data/lib/test/unit/testcase.rb +222 -146
  29. data/lib/test/unit/testsuite.rb +1 -1
  30. data/lib/test/unit/ui/console/testrunner.rb +58 -49
  31. data/lib/test/unit/util/memory-usage.rb +47 -0
  32. data/lib/test/unit/util/observable.rb +2 -2
  33. data/lib/test/unit/util/output.rb +5 -4
  34. data/lib/test/unit/version.rb +1 -1
  35. data/lib/test/unit/warning.rb +3 -0
  36. data/lib/test/unit.rb +177 -161
  37. data/lib/test-unit.rb +2 -17
  38. metadata +14 -91
  39. data/GPL +0 -339
  40. data/LGPL +0 -502
  41. data/test/collector/test-descendant.rb +0 -182
  42. data/test/collector/test-load.rb +0 -442
  43. data/test/collector/test_dir.rb +0 -407
  44. data/test/collector/test_objectspace.rb +0 -102
  45. data/test/fixtures/header-label.csv +0 -3
  46. data/test/fixtures/header-label.tsv +0 -3
  47. data/test/fixtures/header.csv +0 -3
  48. data/test/fixtures/header.tsv +0 -3
  49. data/test/fixtures/no-header.csv +0 -2
  50. data/test/fixtures/no-header.tsv +0 -2
  51. data/test/fixtures/plus.csv +0 -3
  52. data/test/run-test.rb +0 -22
  53. data/test/test-assertions.rb +0 -2180
  54. data/test/test-attribute-matcher.rb +0 -38
  55. data/test/test-attribute.rb +0 -123
  56. data/test/test-code-snippet.rb +0 -37
  57. data/test/test-color-scheme.rb +0 -82
  58. data/test/test-color.rb +0 -47
  59. data/test/test-data.rb +0 -419
  60. data/test/test-diff.rb +0 -518
  61. data/test/test-emacs-runner.rb +0 -60
  62. data/test/test-error.rb +0 -26
  63. data/test/test-failure.rb +0 -33
  64. data/test/test-fault-location-detector.rb +0 -163
  65. data/test/test-fixture.rb +0 -713
  66. data/test/test-notification.rb +0 -33
  67. data/test/test-omission.rb +0 -81
  68. data/test/test-pending.rb +0 -70
  69. data/test/test-priority.rb +0 -173
  70. data/test/test-test-case.rb +0 -1279
  71. data/test/test-test-result.rb +0 -113
  72. data/test/test-test-suite-creator.rb +0 -97
  73. data/test/test-test-suite.rb +0 -151
  74. data/test/testunit-test-util.rb +0 -31
  75. data/test/ui/test_testrunmediator.rb +0 -20
  76. data/test/util/test-method-owner-finder.rb +0 -38
  77. data/test/util/test-output.rb +0 -11
  78. data/test/util/test_backtracefilter.rb +0 -52
  79. data/test/util/test_observable.rb +0 -102
  80. data/test/util/test_procwrapper.rb +0 -36
@@ -5,6 +5,7 @@
5
5
 
6
6
  require 'test/unit/assertion-failed-error'
7
7
  require 'test/unit/util/backtracefilter'
8
+ require 'test/unit/util/memory-usage'
8
9
  require 'test/unit/util/method-owner-finder'
9
10
  require 'test/unit/diff'
10
11
 
@@ -32,9 +33,9 @@ module Test
32
33
  #
33
34
  # @example Example Custom Assertion
34
35
  #
35
- # def deny(boolean, message = nil)
36
- # message = build_message message, '<?> is not false or nil.', boolean
37
- # assert_block message do
36
+ # def deny(boolean, message=nil)
37
+ # message = build_message(message, '<?> is not false or nil.', boolean)
38
+ # assert_block(message) do
38
39
  # not boolean
39
40
  # end
40
41
  # end
@@ -43,7 +44,7 @@ module Test
43
44
 
44
45
  ##
45
46
  # The assertion upon which all other assertions are based. Passes if the
46
- # block yields true.
47
+ # block yields not false nor nil.
47
48
  #
48
49
  # @example
49
50
  # assert_block "Couldn't do the thing" do
@@ -52,7 +53,11 @@ module Test
52
53
  def assert_block(message="assert_block failed.")
53
54
  _wrap_assertion do
54
55
  if (! yield)
55
- raise AssertionFailedError.new(message.to_s)
56
+ options = {}
57
+ if message.respond_to?(:user_message)
58
+ options[:user_message] = message.user_message
59
+ end
60
+ raise AssertionFailedError.new(message.to_s, options)
56
61
  end
57
62
  end
58
63
  end
@@ -167,7 +172,7 @@ module Test
167
172
  end
168
173
  end
169
174
 
170
- # Asserts that +object+ is false or nil.
175
+ # Asserts that `object` is false or nil.
171
176
  #
172
177
  # @note Just for minitest compatibility. :<
173
178
  #
@@ -209,7 +214,7 @@ module Test
209
214
  end
210
215
 
211
216
  ##
212
- # Passes if +expected+ == +actual+.
217
+ # Passes if `expected` == `actual`.
213
218
  #
214
219
  # Note that the ordering of arguments is important, since a helpful
215
220
  # error message is generated when this one fails that tells you the
@@ -239,7 +244,7 @@ EOT
239
244
  begin
240
245
  assert_block(full_message) { expected == actual }
241
246
  rescue AssertionFailedError => failure
242
- _set_failed_information(failure, expected, actual, message)
247
+ _set_failed_information(failure, expected, actual)
243
248
  raise failure # For JRuby. :<
244
249
  end
245
250
  end
@@ -275,8 +280,7 @@ EOT
275
280
  assert_exception_helper.expected?(actual_exception)
276
281
  end
277
282
  rescue AssertionFailedError => failure
278
- _set_failed_information(failure, expected, actual_exception,
279
- message)
283
+ _set_failed_information(failure, expected, actual_exception)
280
284
  raise failure # For JRuby. :<
281
285
  end
282
286
  end
@@ -286,6 +290,71 @@ EOT
286
290
  # Just for minitest compatibility. :<
287
291
  alias_method :assert_raises, :assert_raise
288
292
 
293
+ # Passes if the block raises `expected_exception` with
294
+ # `expected_message`. `expected_message` can be a `String` or
295
+ # `Regexp`.
296
+ #
297
+ # @example Pass pattern: String
298
+ # assert_raise_with_message(RuntimeError, "Boom!!!") do
299
+ # raise "Boom!!!"
300
+ # end # -> pass
301
+ #
302
+ # @example Pass pattern: Regexp
303
+ # assert_raise_with_message(RuntimeError, /!!!/) do
304
+ # raise "Boom!!!"
305
+ # end # -> pass
306
+ #
307
+ # @example Failure pattern: Exception class isn't matched
308
+ # assert_raise_with_message(RuntimeError, "Boom!!!") do
309
+ # raise ArgumentError, "Boom!!!"
310
+ # end # -> failure
311
+ #
312
+ # @example Failure pattern: Exception message isn't matched
313
+ # assert_raise_with_message(RuntimeError, "Boom!!!") do
314
+ # raise "Hello"
315
+ # end # -> failure
316
+ #
317
+ # @since 3.4.3
318
+ def assert_raise_with_message(expected_exception_class,
319
+ expected_message,
320
+ message=nil,
321
+ &block)
322
+ assert_expected_exception = Proc.new do |*_args|
323
+ _message, assert_exception_helper, actual_exception = _args
324
+ diff = AssertionMessage.delayed_diff([
325
+ expected_exception_class,
326
+ expected_message,
327
+ ],
328
+ [
329
+ actual_exception.class,
330
+ actual_exception.message,
331
+ ])
332
+ full_message = build_message(message,
333
+ "<?>(<?>) exception expected but was\n" +
334
+ "<?>(<?>).?",
335
+ expected_exception_class,
336
+ expected_message,
337
+ actual_exception.class,
338
+ actual_exception.message,
339
+ diff)
340
+ begin
341
+ assert_block(full_message) do
342
+ assert_exception_helper.expected?(actual_exception) and
343
+ expected_message === actual_exception.message
344
+ end
345
+ rescue AssertionFailedError => failure
346
+ _set_failed_information(failure,
347
+ expected_exception_class,
348
+ actual_exception)
349
+ raise failure # For JRuby. :<
350
+ end
351
+ actual_exception
352
+ end
353
+ args = [expected_exception_class]
354
+ args << message if message
355
+ _assert_raise(assert_expected_exception, *args, &block)
356
+ end
357
+
289
358
  ##
290
359
  # Passes if the block raises one of the given
291
360
  # exceptions or sub exceptions of the given exceptions.
@@ -311,7 +380,7 @@ EOT
311
380
 
312
381
 
313
382
  ##
314
- # Passes if +object+.instance_of?(+klass+). When +klass+ is
383
+ # Passes if `object`.instance_of?(`klass`). When `klass` is
315
384
  # an array of classes, it passes if any class
316
385
  # satisfies +object.instance_of?(class).
317
386
  #
@@ -319,7 +388,7 @@ EOT
319
388
  # assert_instance_of(String, 'foo') # -> pass
320
389
  # assert_instance_of([Fixnum, NilClass], 100) # -> pass
321
390
  # assert_instance_of([Numeric, NilClass], 100) # -> fail
322
- def assert_instance_of(klass, object, message="")
391
+ def assert_instance_of(klass, object, message=nil)
323
392
  _wrap_assertion do
324
393
  if klass.is_a?(Array)
325
394
  klasses = klass
@@ -345,8 +414,8 @@ EOT
345
414
  end
346
415
 
347
416
  ##
348
- # Passes if +object+.instance_of?(+klass+) does not hold.
349
- # When +klass+ is an array of classes, it passes if no class
417
+ # Passes if `object`.instance_of?(`klass`) does not hold.
418
+ # When `klass` is an array of classes, it passes if no class
350
419
  # satisfies +object.instance_of?(class).
351
420
  #
352
421
  # @example
@@ -355,7 +424,7 @@ EOT
355
424
  # assert_not_instance_of([Numeric, NilClass], 100) # -> fail
356
425
  #
357
426
  # @since 3.0.0
358
- def assert_not_instance_of(klass, object, message="")
427
+ def assert_not_instance_of(klass, object, message=nil)
359
428
  _wrap_assertion do
360
429
  if klass.is_a?(Array)
361
430
  klasses = klass
@@ -386,11 +455,11 @@ EOT
386
455
  alias_method :refute_instance_of, :assert_not_instance_of
387
456
 
388
457
  ##
389
- # Passes if +object+ is nil.
458
+ # Passes if `object`.nil?.
390
459
  #
391
460
  # @example
392
461
  # assert_nil [1, 2].uniq!
393
- def assert_nil(object, message="")
462
+ def assert_nil(object, message=nil)
394
463
  full_message = build_message(message, <<EOT, object)
395
464
  <?> was expected to be nil.
396
465
  EOT
@@ -398,7 +467,7 @@ EOT
398
467
  end
399
468
 
400
469
  ##
401
- # Passes if +object+.kind_of?(+klass+). When +klass+ is
470
+ # Passes if `object`.kind_of?(`klass`). When `klass` is
402
471
  # an array of classes or modules, it passes if any
403
472
  # class or module satisfies +object.kind_of?(class_or_module).
404
473
  #
@@ -406,7 +475,7 @@ EOT
406
475
  # assert_kind_of(Object, 'foo') # -> pass
407
476
  # assert_kind_of([Fixnum, NilClass], 100) # -> pass
408
477
  # assert_kind_of([Fixnum, NilClass], "string") # -> fail
409
- def assert_kind_of(klass, object, message="")
478
+ def assert_kind_of(klass, object, message=nil)
410
479
  _wrap_assertion do
411
480
  if klass.is_a?(Array)
412
481
  klasses = klass
@@ -434,8 +503,8 @@ EOT
434
503
  end
435
504
 
436
505
  ##
437
- # Passes if +object+.kind_of?(+klass+) does not hold.
438
- # When +klass+ is an array of classes or modules, it passes only if all
506
+ # Passes if `object`.kind_of?(`klass`) does not hold.
507
+ # When `klass` is an array of classes or modules, it passes only if all
439
508
  # classes (and modules) do not satisfy +object.kind_of?(class_or_module).
440
509
  #
441
510
  # @example
@@ -444,7 +513,7 @@ EOT
444
513
  # assert_not_kind_of([Fixnum, NilClass], 100) # -> fail
445
514
  #
446
515
  # @since 3.0.0
447
- def assert_not_kind_of(klass, object, message="")
516
+ def assert_not_kind_of(klass, object, message=nil)
448
517
  _wrap_assertion do
449
518
  if klass.is_a?(Array)
450
519
  klasses = klass
@@ -475,11 +544,11 @@ EOT
475
544
  alias_method :refute_kind_of, :assert_not_kind_of
476
545
 
477
546
  ##
478
- # Passes if +object+ .respond_to? +method+
547
+ # Passes if `object` .respond_to? `method`
479
548
  #
480
549
  # @example
481
550
  # assert_respond_to 'bugbear', :slice
482
- def assert_respond_to(object, method, message="")
551
+ def assert_respond_to(object, method, message=nil)
483
552
  _wrap_assertion do
484
553
  full_message = build_message(message,
485
554
  "<?>.kind_of\\?(Symbol) or\n" +
@@ -497,12 +566,12 @@ EOT
497
566
  end
498
567
 
499
568
  ##
500
- # Passes if +object+ does not .respond_to? +method+.
569
+ # Passes if `object` does not .respond_to? `method`.
501
570
  #
502
571
  # @example
503
572
  # assert_not_respond_to('bugbear', :nonexistence) # -> pass
504
573
  # assert_not_respond_to('bugbear', :size) # -> fail
505
- def assert_not_respond_to(object, method, message="")
574
+ def assert_not_respond_to(object, method, message=nil)
506
575
  _wrap_assertion do
507
576
  full_message = build_message(message,
508
577
  "<?>.kind_of\\?(Symbol) or\n" +
@@ -525,18 +594,13 @@ EOT
525
594
  alias_method :refute_respond_to, :assert_not_respond_to
526
595
 
527
596
  ##
528
- # Passes if +pattern+ =~ +string+.
597
+ # Passes if `pattern` =~ `string`.
529
598
  #
530
599
  # @example
531
600
  # assert_match(/\d+/, 'five, 6, seven')
532
- def assert_match(pattern, string, message="")
601
+ def assert_match(pattern, string, message=nil)
533
602
  _wrap_assertion do
534
- pattern = case(pattern)
535
- when String
536
- Regexp.new(Regexp.escape(pattern))
537
- else
538
- pattern
539
- end
603
+ pattern = Regexp.new(Regexp.escape(pattern)) if pattern.is_a?(String)
540
604
  full_message = build_message(message,
541
605
  "<?> was expected to be =~\n<?>.",
542
606
  pattern, string)
@@ -545,13 +609,13 @@ EOT
545
609
  end
546
610
 
547
611
  ##
548
- # Passes if +actual+ .equal? +expected+ (i.e. they are the same
612
+ # Passes if `actual` .equal? `expected` (i.e. they are the same
549
613
  # instance).
550
614
  #
551
615
  # @example
552
616
  # o = Object.new
553
617
  # assert_same o, o
554
- def assert_same(expected, actual, message="")
618
+ def assert_same(expected, actual, message=nil)
555
619
  full_message = build_message(message, <<EOT, expected, expected.__id__, actual, actual.__id__)
556
620
  <?>
557
621
  with id <?> was expected to be equal\\? to
@@ -562,13 +626,13 @@ EOT
562
626
  end
563
627
 
564
628
  ##
565
- # Compares the +object1+ with +object2+ using +operator+.
629
+ # Compares the `object1` with `object2` using `operator`.
566
630
  #
567
- # Passes if object1.__send__(operator, object2) is true.
631
+ # Passes if object1.__send__(operator, object2) is not false nor nil.
568
632
  #
569
633
  # @example
570
634
  # assert_operator 5, :>=, 4
571
- def assert_operator(object1, operator, object2, message="")
635
+ def assert_operator(object1, operator, object2, message=nil)
572
636
  _wrap_assertion do
573
637
  full_message = build_message(nil, "<?>\ngiven as the operator for #assert_operator must be a Symbol or #respond_to\\?(:to_str).", operator)
574
638
  assert_block(full_message){operator.kind_of?(Symbol) || operator.respond_to?(:to_str)}
@@ -582,16 +646,16 @@ EOT
582
646
  end
583
647
 
584
648
  ##
585
- # Compares the +object1+ with +object2+ using +operator+.
649
+ # Compares the `object1` with `object2` using `operator`.
586
650
  #
587
- # Passes if object1.__send__(operator, object2) is not true.
651
+ # Passes if object1.__send__(operator, object2) is false or nil.
588
652
  #
589
653
  # @example
590
654
  # assert_not_operator(5, :<, 4) # => pass
591
655
  # assert_not_operator(5, :>, 4) # => fail
592
656
  #
593
657
  # @since 3.0.0
594
- def assert_not_operator(object1, operator, object2, message="")
658
+ def assert_not_operator(object1, operator, object2, message=nil)
595
659
  _wrap_assertion do
596
660
  full_message = build_message(nil, "<?>\ngiven as the operator for #assert_not_operator must be a Symbol or #respond_to\\?(:to_str).", operator)
597
661
  assert_block(full_message){operator.kind_of?(Symbol) || operator.respond_to?(:to_str)}
@@ -649,11 +713,11 @@ EOT
649
713
  end
650
714
 
651
715
  ##
652
- # Passes if ! +actual+ .equal? +expected+
716
+ # Passes if ! `actual` .equal? `expected`
653
717
  #
654
718
  # @example
655
719
  # assert_not_same Object.new, Object.new
656
- def assert_not_same(expected, actual, message="")
720
+ def assert_not_same(expected, actual, message=nil)
657
721
  full_message = build_message(message, <<EOT, expected, expected.__id__, actual, actual.__id__)
658
722
  <?>
659
723
  with id <?> was expected to not be equal\\? to
@@ -669,11 +733,11 @@ EOT
669
733
  alias_method :refute_same, :assert_not_same
670
734
 
671
735
  ##
672
- # Passes if +expected+ != +actual+
736
+ # Passes if `expected` != `actual`
673
737
  #
674
738
  # @example
675
739
  # assert_not_equal 'some string', 5
676
- def assert_not_equal(expected, actual, message="")
740
+ def assert_not_equal(expected, actual, message=nil)
677
741
  full_message = build_message(message,
678
742
  "<?> was expected to be != to\n<?>.",
679
743
  expected, actual)
@@ -686,11 +750,11 @@ EOT
686
750
  alias_method :refute_equal, :assert_not_equal
687
751
 
688
752
  ##
689
- # Passes if ! +object+ .nil?
753
+ # Passes if ! `object` .nil?
690
754
  #
691
755
  # @example
692
756
  # assert_not_nil '1 two 3'.sub!(/two/, '2')
693
- def assert_not_nil(object, message="")
757
+ def assert_not_nil(object, message=nil)
694
758
  full_message = build_message(message,
695
759
  "<?> was expected to not be nil.",
696
760
  object)
@@ -703,20 +767,18 @@ EOT
703
767
  alias_method :refute_nil, :assert_not_nil
704
768
 
705
769
  ##
706
- # Passes if +regexp+ !~ +string+
770
+ # Passes if `regexp` !~ `string`
707
771
  #
708
772
  # @example
709
773
  # assert_not_match(/two/, 'one 2 three') # -> pass
710
774
  # assert_not_match(/three/, 'one 2 three') # -> fail
711
- def assert_not_match(regexp, string, message="")
775
+ def assert_not_match(pattern, string, message=nil)
712
776
  _wrap_assertion do
713
- assert_instance_of(Regexp, regexp,
714
- "<REGEXP> in assert_not_match(<REGEXP>, ...) " +
715
- "should be a Regexp.")
777
+ pattern = Regexp.new(Regexp.escape(pattern)) if pattern.is_a?(String)
716
778
  full_message = build_message(message,
717
779
  "<?> was expected to not match\n<?>.",
718
- regexp, string)
719
- assert_block(full_message) { regexp !~ string }
780
+ pattern, string)
781
+ assert_block(full_message) { pattern !~ string }
720
782
  end
721
783
  end
722
784
 
@@ -726,9 +788,9 @@ EOT
726
788
  alias_method :refute_match, :assert_not_match
727
789
 
728
790
  ##
729
- # Deprecated. Use #assert_not_match instead.
791
+ # @deprecated Use {#assert_not_match} instead.
730
792
  #
731
- # Passes if +regexp+ !~ +string+
793
+ # Passes if `regexp` !~ `string`
732
794
  #
733
795
  # @example
734
796
  # assert_no_match(/two/, 'one 2 three') # -> pass
@@ -786,13 +848,13 @@ EOT
786
848
  end
787
849
 
788
850
  ##
789
- # Passes if the block throws +expected_object+
851
+ # Passes if the block throws `expected_object`
790
852
  #
791
853
  # @example
792
854
  # assert_throw(:done) do
793
855
  # throw(:done)
794
856
  # end
795
- def assert_throw(expected_object, message="", &proc)
857
+ def assert_throw(expected_object, message=nil, &proc)
796
858
  _wrap_assertion do
797
859
  begin
798
860
  catch([]) {}
@@ -838,7 +900,7 @@ EOT
838
900
  # assert_nothing_thrown do
839
901
  # [1, 2].uniq
840
902
  # end
841
- def assert_nothing_thrown(message="", &proc)
903
+ def assert_nothing_thrown(message=nil, &proc)
842
904
  _wrap_assertion do
843
905
  assert(block_given?, "Should have passed a block to assert_nothing_thrown")
844
906
  begin
@@ -857,29 +919,51 @@ EOT
857
919
  end
858
920
 
859
921
  ##
860
- # Passes if +expected_float+ and +actual_float+ are equal
861
- # within +delta+ tolerance.
922
+ # Passes if `expected_float` and `actual_float` are equal
923
+ # within `delta` tolerance.
862
924
  #
863
925
  # @example
864
926
  # assert_in_delta 0.05, (50000.0 / 10**6), 0.00001
865
927
  def assert_in_delta(expected_float, actual_float, delta=0.001, message="")
866
928
  _wrap_assertion do
867
- _assert_in_delta_validate_arguments(expected_float,
868
- actual_float,
869
- delta)
870
- full_message = _assert_in_delta_message(expected_float,
871
- actual_float,
872
- delta,
873
- message)
929
+ begin
930
+ pass = delta >= (expected_float - actual_float).abs
931
+ assert_operator(delta, :>=, 0.0, "The delta should not be negative")
932
+ full_message = _assert_in_delta_message(expected_float,
933
+ expected_float,
934
+ actual_float,
935
+ actual_float,
936
+ delta,
937
+ delta,
938
+ message)
939
+ rescue Test::Unit::AssertionFailedError
940
+ # for the above assert_operator
941
+ raise
942
+ rescue
943
+ _assert_in_delta_validate_arguments(expected_float,
944
+ actual_float,
945
+ delta)
946
+ normalized_expected = expected_float.to_f
947
+ normalized_actual = actual_float.to_f
948
+ normalized_delta = delta.to_f
949
+ pass = (normalized_expected - normalized_actual).abs <= normalized_delta
950
+ full_message = _assert_in_delta_message(expected_float,
951
+ normalized_expected,
952
+ actual_float,
953
+ normalized_actual,
954
+ delta,
955
+ normalized_delta,
956
+ message)
957
+ end
874
958
  assert_block(full_message) do
875
- (expected_float.to_f - actual_float.to_f).abs <= delta.to_f
959
+ pass
876
960
  end
877
961
  end
878
962
  end
879
963
 
880
964
  ##
881
- # Passes if +expected_float+ and +actual_float+ are
882
- # not equal within +delta+ tolerance.
965
+ # Passes if `expected_float` and `actual_float` are
966
+ # not equal within `delta` tolerance.
883
967
  #
884
968
  # @example
885
969
  # assert_not_in_delta(0.05, (50000.0 / 10**6), 0.00002) # -> pass
@@ -889,13 +973,32 @@ EOT
889
973
  _assert_in_delta_validate_arguments(expected_float,
890
974
  actual_float,
891
975
  delta)
892
- full_message = _assert_in_delta_message(expected_float,
893
- actual_float,
894
- delta,
895
- message,
896
- :negative_assertion => true)
976
+ begin
977
+ pass = (expected_float - actual_float).abs > delta
978
+ full_message = _assert_in_delta_message(expected_float,
979
+ expected_float,
980
+ actual_float,
981
+ actual_float,
982
+ delta,
983
+ delta,
984
+ message,
985
+ :negative_assertion => true)
986
+ rescue
987
+ normalized_expected = expected_float.to_f
988
+ normalized_actual = actual_float.to_f
989
+ normalized_delta = delta.to_f
990
+ pass = (normalized_expected - normalized_actual).abs > normalized_delta
991
+ full_message = _assert_in_delta_message(expected_float,
992
+ normalized_expected,
993
+ actual_float,
994
+ normalized_actual,
995
+ delta,
996
+ normalized_delta,
997
+ message,
998
+ :negative_assertion => true)
999
+ end
897
1000
  assert_block(full_message) do
898
- (expected_float.to_f - actual_float.to_f).abs > delta.to_f
1001
+ pass
899
1002
  end
900
1003
  end
901
1004
  end
@@ -922,7 +1025,9 @@ EOT
922
1025
  assert_operator(delta, :>=, 0.0, "The delta should not be negative")
923
1026
  end
924
1027
 
925
- def _assert_in_delta_message(expected_float, actual_float, delta,
1028
+ def _assert_in_delta_message(expected_float, normalized_expected,
1029
+ actual_float, normalized_actual,
1030
+ delta, normalized_delta,
926
1031
  message, options={})
927
1032
  if options[:negative_assertion]
928
1033
  format = <<-EOT
@@ -936,9 +1041,6 @@ EOT
936
1041
  EOT
937
1042
  end
938
1043
  arguments = [expected_float, delta, actual_float]
939
- normalized_expected = expected_float.to_f
940
- normalized_actual = actual_float.to_f
941
- normalized_delta = delta.to_f
942
1044
  relation_format = nil
943
1045
  relation_arguments = nil
944
1046
  if normalized_actual < normalized_expected - normalized_delta
@@ -978,8 +1080,8 @@ EOT
978
1080
 
979
1081
  public
980
1082
  ##
981
- # Passes if +expected_float+ and +actual_float+ are equal
982
- # within +epsilon+ relative error of +expected_float+.
1083
+ # Passes if `expected_float` and `actual_float` are equal
1084
+ # within `epsilon` relative error of `expected_float`.
983
1085
  #
984
1086
  # @example
985
1087
  # assert_in_epsilon(10000.0, 9900.0, 0.1) # -> pass
@@ -987,30 +1089,60 @@ EOT
987
1089
  def assert_in_epsilon(expected_float, actual_float, epsilon=0.001,
988
1090
  message="")
989
1091
  _wrap_assertion do
990
- _assert_in_epsilon_validate_arguments(expected_float,
991
- actual_float,
992
- epsilon)
993
- full_message = _assert_in_epsilon_message(expected_float,
994
- actual_float,
995
- epsilon,
996
- message)
997
- assert_block(full_message) do
998
- normalized_expected_float = expected_float.to_f
999
- if normalized_expected_float.zero?
1000
- delta = epsilon.to_f ** 2
1092
+ begin
1093
+ zero_p = expected_float.zero? rescue expected_float == 0
1094
+ if zero_p
1095
+ delta = epsilon ** 2
1096
+ else
1097
+ delta = expected_float * epsilon
1098
+ end
1099
+ delta = delta.abs
1100
+ pass = (expected_float - actual_float).abs <= delta
1101
+ assert_operator(epsilon, :>=, 0.0, "The epsilon should not be negative")
1102
+ full_message = _assert_in_epsilon_message(expected_float,
1103
+ expected_float,
1104
+ actual_float,
1105
+ actual_float,
1106
+ epsilon,
1107
+ epsilon,
1108
+ delta,
1109
+ message)
1110
+ rescue Test::Unit::AssertionFailedError
1111
+ # for the above assert_operator
1112
+ raise
1113
+ rescue
1114
+ _assert_in_epsilon_validate_arguments(expected_float,
1115
+ actual_float,
1116
+ epsilon)
1117
+ normalized_expected = expected_float.to_f
1118
+ normalized_actual = actual_float.to_f
1119
+ normalized_epsilon = epsilon.to_f
1120
+ if normalized_expected.zero?
1121
+ delta = normalized_epsilon ** 2
1001
1122
  else
1002
- delta = normalized_expected_float * epsilon.to_f
1123
+ delta = normalized_expected * normalized_epsilon
1003
1124
  end
1004
1125
  delta = delta.abs
1005
- (normalized_expected_float - actual_float.to_f).abs <= delta
1126
+ full_message = _assert_in_epsilon_message(expected_float,
1127
+ normalized_expected,
1128
+ actual_float,
1129
+ normalized_actual,
1130
+ epsilon,
1131
+ normalized_epsilon,
1132
+ delta,
1133
+ message)
1134
+ pass = (normalized_expected - normalized_actual).abs <= delta
1135
+ end
1136
+ assert_block(full_message) do
1137
+ pass
1006
1138
  end
1007
1139
  end
1008
1140
  end
1009
1141
 
1010
1142
  ##
1011
- # Passes if +expected_float+ and +actual_float+ are
1012
- # not equal within +epsilon+ relative error of
1013
- # +expected_float+.
1143
+ # Passes if `expected_float` and `actual_float` are
1144
+ # not equal within `epsilon` relative error of
1145
+ # `expected_float`.
1014
1146
  #
1015
1147
  # @example
1016
1148
  # assert_not_in_epsilon(10000.0, 9900.0, 0.1) # -> fail
@@ -1018,18 +1150,43 @@ EOT
1018
1150
  def assert_not_in_epsilon(expected_float, actual_float, epsilon=0.001,
1019
1151
  message="")
1020
1152
  _wrap_assertion do
1021
- _assert_in_epsilon_validate_arguments(expected_float,
1022
- actual_float,
1023
- epsilon)
1024
- full_message = _assert_in_epsilon_message(expected_float,
1025
- actual_float,
1026
- epsilon,
1027
- message,
1028
- :negative_assertion => true)
1153
+ begin
1154
+ delta = expected_float * epsilon
1155
+ pass = (expected_float - actual_float).abs > delta
1156
+ assert_operator(epsilon, :>=, 0.0, "The epsilon should not be negative")
1157
+ full_message = _assert_in_epsilon_message(expected_float,
1158
+ expected_float,
1159
+ actual_float,
1160
+ actual_float,
1161
+ epsilon,
1162
+ epsilon,
1163
+ delta,
1164
+ message,
1165
+ :negative_assertion => true)
1166
+ rescue Test::Unit::AssertionFailedError
1167
+ # for the above assert_operator
1168
+ raise
1169
+ rescue
1170
+ _assert_in_epsilon_validate_arguments(expected_float,
1171
+ actual_float,
1172
+ epsilon)
1173
+ normalized_expected = expected_float.to_f
1174
+ normalized_actual = actual_float.to_f
1175
+ normalized_epsilon = epsilon.to_f
1176
+ delta = normalized_expected * normalized_epsilon
1177
+ pass = (normalized_expected - normalized_actual).abs > delta
1178
+ full_message = _assert_in_epsilon_message(expected_float,
1179
+ normalized_expected,
1180
+ actual_float,
1181
+ normalized_actual,
1182
+ epsilon,
1183
+ normalized_epsilon,
1184
+ delta,
1185
+ message,
1186
+ :negative_assertion => true)
1187
+ end
1029
1188
  assert_block(full_message) do
1030
- normalized_expected_float = expected_float.to_f
1031
- delta = normalized_expected_float * epsilon.to_f
1032
- (normalized_expected_float - actual_float.to_f).abs > delta
1189
+ pass
1033
1190
  end
1034
1191
  end
1035
1192
  end
@@ -1056,13 +1213,10 @@ EOT
1056
1213
  assert_operator(epsilon, :>=, 0.0, "The epsilon should not be negative")
1057
1214
  end
1058
1215
 
1059
- def _assert_in_epsilon_message(expected_float, actual_float, epsilon,
1060
- message, options={})
1061
- normalized_expected = expected_float.to_f
1062
- normalized_actual = actual_float.to_f
1063
- normalized_epsilon = epsilon.to_f
1064
- delta = normalized_expected * normalized_epsilon
1065
-
1216
+ def _assert_in_epsilon_message(expected_float, normalized_expected,
1217
+ actual_float, normalized_actual,
1218
+ epsilon, normalized_epsilon,
1219
+ delta, message, options={})
1066
1220
  if options[:negative_assertion]
1067
1221
  format = <<-EOT
1068
1222
  <?> -/+ (<?> * <?>)[?] was expected to not include
@@ -1116,9 +1270,9 @@ EOT
1116
1270
 
1117
1271
  public
1118
1272
  ##
1119
- # Passes if the method send returns a true value.
1273
+ # Passes if the method `__send__` returns not false nor nil.
1120
1274
  #
1121
- # +send_array+ is composed of:
1275
+ # `send_array` is composed of:
1122
1276
  # * A receiver
1123
1277
  # * A method
1124
1278
  # * Arguments to the method
@@ -1156,9 +1310,9 @@ EOT
1156
1310
  end
1157
1311
 
1158
1312
  ##
1159
- # Passes if the method send doesn't return a true value.
1313
+ # Passes if the method `__send__` returns false or nil.
1160
1314
  #
1161
- # +send_array+ is composed of:
1315
+ # `send_array` is composed of:
1162
1316
  # * A receiver
1163
1317
  # * A method
1164
1318
  # * Arguments to the method
@@ -1196,7 +1350,7 @@ EOT
1196
1350
  end
1197
1351
 
1198
1352
  ##
1199
- # Passes if +actual+ is a boolean value.
1353
+ # Passes if `actual` is a boolean value.
1200
1354
  #
1201
1355
  # @example
1202
1356
  # assert_boolean(true) # -> pass
@@ -1206,13 +1360,13 @@ EOT
1206
1360
  assert_block(build_message(message,
1207
1361
  "<true> or <false> expected but was\n<?>",
1208
1362
  actual)) do
1209
- [true, false].include?(actual)
1363
+ true == actual || false == actual
1210
1364
  end
1211
1365
  end
1212
1366
  end
1213
1367
 
1214
1368
  ##
1215
- # Passes if +actual+ is true.
1369
+ # Passes if `actual` is true.
1216
1370
  #
1217
1371
  # @example
1218
1372
  # assert_true(true) # -> pass
@@ -1222,13 +1376,13 @@ EOT
1222
1376
  assert_block(build_message(message,
1223
1377
  "<true> expected but was\n<?>",
1224
1378
  actual)) do
1225
- actual == true
1379
+ true == actual
1226
1380
  end
1227
1381
  end
1228
1382
  end
1229
1383
 
1230
1384
  ##
1231
- # Passes if +actual+ is false.
1385
+ # Passes if `actual` is false.
1232
1386
  #
1233
1387
  # @example
1234
1388
  # assert_false(false) # -> pass
@@ -1238,14 +1392,14 @@ EOT
1238
1392
  assert_block(build_message(message,
1239
1393
  "<false> expected but was\n<?>",
1240
1394
  actual)) do
1241
- actual == false
1395
+ false == actual
1242
1396
  end
1243
1397
  end
1244
1398
  end
1245
1399
 
1246
1400
  ##
1247
- # Passes if expression "+expected+ +operator+
1248
- # +actual+" is true.
1401
+ # Passes if expression "`expected` `operator`
1402
+ # `actual`" is not false nor nil.
1249
1403
  #
1250
1404
  # @example
1251
1405
  # assert_compare(1, "<", 10) # -> pass
@@ -1300,7 +1454,7 @@ EOT
1300
1454
 
1301
1455
  ##
1302
1456
  # Passes if an exception is raised in block and its
1303
- # message is +expected+.
1457
+ # message is `expected`.
1304
1458
  #
1305
1459
  # @example
1306
1460
  # assert_raise_message("exception") {raise "exception"} # -> pass
@@ -1340,7 +1494,7 @@ EOT
1340
1494
  end
1341
1495
 
1342
1496
  ##
1343
- # Passes if +object+.const_defined?(+constant_name+)
1497
+ # Passes if `object`.const_defined?(`constant_name`)
1344
1498
  #
1345
1499
  # @example
1346
1500
  # assert_const_defined(Test, :Unit) # -> pass
@@ -1357,7 +1511,7 @@ EOT
1357
1511
  end
1358
1512
 
1359
1513
  ##
1360
- # Passes if !+object+.const_defined?(+constant_name+)
1514
+ # Passes if !`object`.const_defined?(`constant_name`)
1361
1515
  #
1362
1516
  # @example
1363
1517
  # assert_not_const_defined(Object, :Nonexistent) # -> pass
@@ -1374,7 +1528,7 @@ EOT
1374
1528
  end
1375
1529
 
1376
1530
  ##
1377
- # Passes if +object+.+predicate+ is _true_.
1531
+ # Passes if `object`.`predicate` is not false nor nil.
1378
1532
  #
1379
1533
  # @example
1380
1534
  # assert_predicate([], :empty?) # -> pass
@@ -1396,7 +1550,7 @@ EOT
1396
1550
  end
1397
1551
 
1398
1552
  ##
1399
- # Passes if +object+.+predicate+ is not _true_.
1553
+ # Passes if `object`.`predicate` is false or nil.
1400
1554
  #
1401
1555
  # @example
1402
1556
  # assert_not_predicate([1], :empty?) # -> pass
@@ -1423,8 +1577,8 @@ EOT
1423
1577
  alias_method :refute_predicate, :assert_not_predicate
1424
1578
 
1425
1579
  ##
1426
- # Passes if +object+#+alias_name+ is an alias method of
1427
- # +object+#+original_name+.
1580
+ # Passes if `object`#`alias_name` is an alias method of
1581
+ # `object`#`original_name`.
1428
1582
  #
1429
1583
  # @example
1430
1584
  # assert_alias_method([], :length, :size) # -> pass
@@ -1471,7 +1625,7 @@ EOT
1471
1625
  end
1472
1626
 
1473
1627
  ##
1474
- # Passes if +path+ exists.
1628
+ # Passes if `path` exists.
1475
1629
  #
1476
1630
  # @example
1477
1631
  # assert_path_exist("/tmp") # -> pass
@@ -1489,7 +1643,7 @@ EOT
1489
1643
  end
1490
1644
 
1491
1645
  ##
1492
- # Passes if +path+ doesn't exist.
1646
+ # Passes if `path` doesn't exist.
1493
1647
  #
1494
1648
  # @example
1495
1649
  # assert_path_not_exist("/nonexistent") # -> pass
@@ -1507,7 +1661,7 @@ EOT
1507
1661
  end
1508
1662
 
1509
1663
  ##
1510
- # Passes if +collection+ includes +object+.
1664
+ # Passes if `collection` includes `object`.
1511
1665
  #
1512
1666
  # @example
1513
1667
  # assert_include([1, 10], 1) # -> pass
@@ -1534,7 +1688,7 @@ EOT
1534
1688
  alias_method :assert_includes, :assert_include
1535
1689
 
1536
1690
  ##
1537
- # Passes if +collection+ doesn't include +object+.
1691
+ # Passes if `collection` doesn't include `object`.
1538
1692
  #
1539
1693
  # @example
1540
1694
  # assert_not_include([1, 10], 5) # -> pass
@@ -1566,7 +1720,7 @@ EOT
1566
1720
  alias_method :refute_includes, :assert_not_include
1567
1721
 
1568
1722
  ##
1569
- # Passes if +object+ is empty.
1723
+ # Passes if `object` is empty.
1570
1724
  #
1571
1725
  # @example
1572
1726
  # assert_empty("") # -> pass
@@ -1589,7 +1743,7 @@ EOT
1589
1743
  end
1590
1744
 
1591
1745
  ##
1592
- # Passes if +object+ is not empty.
1746
+ # Passes if `object` is not empty.
1593
1747
  #
1594
1748
  # @example
1595
1749
  # assert_not_empty(" ") # -> pass
@@ -1616,12 +1770,140 @@ EOT
1616
1770
  # @since 3.0.0
1617
1771
  alias_method :refute_empty, :assert_not_empty
1618
1772
 
1773
+ # @overload assert_all(collection, message=nil, &block)
1774
+ #
1775
+ # Asserts that all `block.call(item)` where `item` is each
1776
+ # item in `collection` are not false nor nil.
1777
+ #
1778
+ # If `collection` is empty, this assertion is always passed
1779
+ # with any `block`.
1780
+ #
1781
+ # @example Pass patterns
1782
+ # assert_all([1, 2, 3]) {|item| item > 0} # => pass
1783
+ # assert_all([1, 2, 3], &:positive?) # => pass
1784
+ # assert_all([]) {|item| false} # => pass
1785
+ #
1786
+ # @example Failure pattern
1787
+ # assert_all([0, 1, 2], &:zero?) # => failure
1788
+ #
1789
+ # @param [#each] collection The check target.
1790
+ # @param [String] message The additional user message. It is
1791
+ # showed when the assertion is failed.
1792
+ # @yield [Object] Give each item in `collection` to the block.
1793
+ # @yieldreturn [Object] The checked object.
1794
+ # @return [void]
1795
+ #
1796
+ # @since 3.4.4
1797
+ def assert_all(collection, message=nil)
1798
+ _wrap_assertion do
1799
+ failed = false
1800
+ result = {}
1801
+ collection.each do |item|
1802
+ element_result = yield(item)
1803
+ failed = true unless element_result
1804
+ result[item] = element_result
1805
+ end
1806
+ format = <<-FORMAT
1807
+ <?> was expected to be all true values with the given block but was
1808
+ <?>
1809
+ FORMAT
1810
+ full_message = build_message(message,
1811
+ format,
1812
+ collection,
1813
+ result)
1814
+ assert_block(full_message) do
1815
+ not failed
1816
+ end
1817
+ end
1818
+ end
1819
+
1820
+ # Just for Ruby's tool/lib/test/unit compatibility.
1821
+ #
1822
+ # @since 3.4.3
1823
+ alias_method :assert_all?, :assert_all
1824
+
1825
+ # @overload assert_nothing_leaked_memory(max_increasable_size, target=:physical, message=nil, &block)
1826
+ #
1827
+ # Asserts that increased memory usage by `block.call` is less
1828
+ # than `max_increasable_size`. `GC.start` is called before and
1829
+ # after `block.call`.
1830
+ #
1831
+ # This assertion may be fragile. Because memory usage is
1832
+ # depends on the current Ruby process's memory
1833
+ # usage. Launching a new Ruby process for this will produce
1834
+ # more stable result but we need to specify target code as
1835
+ # `String` instead of block for the approach. We choose easy
1836
+ # to write API approach rather than more stable result
1837
+ # approach for this case.
1838
+ #
1839
+ # @example Pass pattern
1840
+ # require "objspace"
1841
+ # size_per_object = ObjectSpace.memsize_of("Hello")
1842
+ # # If memory isn't leaked, physical memory of almost created objects
1843
+ # # (1000 - 10 objects) must be freed.
1844
+ # assert_nothing_leaked_memory(size_per_object * 10) do
1845
+ # 1_000.times do
1846
+ # "Hello".dup
1847
+ # end
1848
+ # end # => pass
1849
+ #
1850
+ # @example Failure pattern
1851
+ # require "objspace"
1852
+ # size_per_object = ObjectSpace.memsize_of("Hello")
1853
+ # strings = []
1854
+ # assert_nothing_leaked_memory(size_per_object * 10) do
1855
+ # 10_000.times do
1856
+ # # Created objects aren't GC-ed because they are referred.
1857
+ # strings << "Hello".dup
1858
+ # end
1859
+ # end # => failure
1860
+ #
1861
+ # @param target [:physical, :virtual] which memory usage is
1862
+ # used for comparing. `:physical` means physical memory usage
1863
+ # also known as Resident Set Size (RSS). `:virtual` means
1864
+ # virtual memory usage.
1865
+ # @yield [] do anything you want to measure memory usage
1866
+ # in the block.
1867
+ # @yieldreturn [void]
1868
+ # @return [void]
1869
+ #
1870
+ # @since 3.4.5
1871
+ def assert_nothing_leaked_memory(max_increasable_size,
1872
+ target=:physical,
1873
+ message=nil)
1874
+ _wrap_assertion do
1875
+ GC.start
1876
+ before = Util::MemoryUsage.new
1877
+ unless before.collected?
1878
+ omit("memory usage collection isn't supported on this platform")
1879
+ end
1880
+ yield
1881
+ GC.start
1882
+ after = Util::MemoryUsage.new
1883
+ before_value = before.__send__(target)
1884
+ after_value = after.__send__(target)
1885
+ actual_increased_size = after_value - before_value
1886
+ template = <<-TEMPLATE
1887
+ <?> was expected to be less than
1888
+ <?>.
1889
+ TEMPLATE
1890
+ full_message = build_message(message,
1891
+ template,
1892
+ actual_increased_size,
1893
+ max_increasable_size)
1894
+ assert_block(full_message) do
1895
+ actual_increased_size < max_increasable_size
1896
+ end
1897
+ end
1898
+ end
1899
+
1619
1900
  ##
1620
- # Builds a failure message. +head+ is added before the +template+ and
1621
- # +arguments+ replaces the '?'s positionally in the template.
1622
- def build_message(head, template=nil, *arguments)
1901
+ # Builds a failure message. `user_message` is added before the
1902
+ # `template` and `arguments` replaces the '?'s positionally in
1903
+ # the template.
1904
+ def build_message(user_message, template=nil, *arguments)
1623
1905
  template &&= template.chomp
1624
- return AssertionMessage.new(head, template, arguments)
1906
+ return AssertionMessage.new(user_message, template, arguments)
1625
1907
  end
1626
1908
 
1627
1909
  private
@@ -1688,12 +1970,11 @@ EOT
1688
1970
  end
1689
1971
  end
1690
1972
 
1691
- def _set_failed_information(failure, expected, actual, user_message)
1973
+ def _set_failed_information(failure, expected, actual)
1692
1974
  failure.expected = expected
1693
1975
  failure.actual = actual
1694
1976
  failure.inspected_expected = AssertionMessage.convert(expected)
1695
1977
  failure.inspected_actual = AssertionMessage.convert(actual)
1696
- failure.user_message = user_message
1697
1978
  end
1698
1979
 
1699
1980
  class AssertionMessage
@@ -2071,8 +2352,8 @@ EOT
2071
2352
 
2072
2353
  include Util::BacktraceFilter
2073
2354
 
2074
- def initialize(head, template_string, parameters)
2075
- @head = head
2355
+ def initialize(user_message, template_string, parameters)
2356
+ @user_message = user_message
2076
2357
  @template_string = template_string
2077
2358
  @parameters = parameters
2078
2359
  end
@@ -2085,24 +2366,28 @@ EOT
2085
2366
  @template ||= Template.create(@template_string)
2086
2367
  end
2087
2368
 
2088
- def add_period(string)
2089
- (string =~ /\.\Z/ ? string : string + '.')
2369
+ def user_message
2370
+ return nil unless @user_message
2371
+ message = @user_message
2372
+ message = message.call if message.respond_to?(:call)
2373
+ message.to_s
2090
2374
  end
2091
2375
 
2092
2376
  def to_s
2093
2377
  message_parts = []
2094
- if (@head)
2095
- head = @head
2096
- head = head.call if head.respond_to?(:call)
2097
- head = head.to_s
2098
- unless(head.empty?)
2099
- message_parts << add_period(head)
2100
- end
2378
+ head = user_message
2379
+ if head and not head.empty?
2380
+ message_parts << add_period(head)
2101
2381
  end
2102
2382
  tail = template.result(@parameters.collect{|e| convert(e)})
2103
2383
  message_parts << tail unless(tail.empty?)
2104
2384
  message_parts.join("\n")
2105
2385
  end
2386
+
2387
+ private
2388
+ def add_period(string)
2389
+ (string =~ /\.\Z/ ? string : string + '.')
2390
+ end
2106
2391
  end
2107
2392
 
2108
2393
  class AssertExceptionHelper
@@ -2114,7 +2399,14 @@ EOT
2114
2399
 
2115
2400
  def inspect
2116
2401
  if default_inspect?
2117
- "#{@exception.class.inspect}(<#{@exception.message}>)"
2402
+ inspected = "#{@exception.class.inspect}(<#{@exception.message}>)"
2403
+ unless (@exception.backtrace || []).empty?
2404
+ inspected += "\n"
2405
+ @exception.backtrace.each do |trace|
2406
+ inspected << "#{trace}\n"
2407
+ end
2408
+ end
2409
+ inspected
2118
2410
  else
2119
2411
  @exception.inspect
2120
2412
  end