test-unit 3.2.5 → 3.4.7

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 (82) hide show
  1. checksums.yaml +5 -5
  2. data/BSDL +24 -0
  3. data/COPYING +41 -44
  4. data/README.md +8 -11
  5. data/Rakefile +0 -23
  6. data/doc/text/getting-started.md +1 -1
  7. data/doc/text/news.md +366 -0
  8. data/lib/test/unit/assertion-failed-error.rb +35 -0
  9. data/lib/test/unit/assertions.rb +312 -112
  10. data/lib/test/unit/attribute.rb +7 -2
  11. data/lib/test/unit/autorunner.rb +79 -31
  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 +10 -13
  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 +116 -0
  20. data/lib/test/unit/data.rb +121 -12
  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 -3
  27. data/lib/test/unit/runner/console.rb +8 -0
  28. data/lib/test/unit/test-suite-creator.rb +22 -8
  29. data/lib/test/unit/testcase.rb +216 -146
  30. data/lib/test/unit/testsuite.rb +1 -1
  31. data/lib/test/unit/ui/console/testrunner.rb +92 -32
  32. data/lib/test/unit/util/memory-usage.rb +47 -0
  33. data/lib/test/unit/util/observable.rb +2 -2
  34. data/lib/test/unit/util/output.rb +5 -4
  35. data/lib/test/unit/util/procwrapper.rb +4 -4
  36. data/lib/test/unit/version.rb +1 -1
  37. data/lib/test/unit/warning.rb +3 -0
  38. data/lib/test/unit.rb +177 -161
  39. data/lib/test-unit.rb +2 -17
  40. metadata +13 -88
  41. data/GPL +0 -339
  42. data/LGPL +0 -502
  43. data/test/collector/test-descendant.rb +0 -182
  44. data/test/collector/test-load.rb +0 -442
  45. data/test/collector/test_dir.rb +0 -407
  46. data/test/collector/test_objectspace.rb +0 -102
  47. data/test/fixtures/header-label.csv +0 -3
  48. data/test/fixtures/header-label.tsv +0 -3
  49. data/test/fixtures/header.csv +0 -3
  50. data/test/fixtures/header.tsv +0 -3
  51. data/test/fixtures/no-header.csv +0 -2
  52. data/test/fixtures/no-header.tsv +0 -2
  53. data/test/fixtures/plus.csv +0 -3
  54. data/test/run-test.rb +0 -22
  55. data/test/test-assertions.rb +0 -2180
  56. data/test/test-attribute-matcher.rb +0 -38
  57. data/test/test-attribute.rb +0 -123
  58. data/test/test-code-snippet.rb +0 -37
  59. data/test/test-color-scheme.rb +0 -82
  60. data/test/test-color.rb +0 -47
  61. data/test/test-data.rb +0 -303
  62. data/test/test-diff.rb +0 -518
  63. data/test/test-emacs-runner.rb +0 -60
  64. data/test/test-error.rb +0 -26
  65. data/test/test-failure.rb +0 -33
  66. data/test/test-fault-location-detector.rb +0 -163
  67. data/test/test-fixture.rb +0 -713
  68. data/test/test-notification.rb +0 -33
  69. data/test/test-omission.rb +0 -81
  70. data/test/test-pending.rb +0 -70
  71. data/test/test-priority.rb +0 -173
  72. data/test/test-test-case.rb +0 -1278
  73. data/test/test-test-result.rb +0 -113
  74. data/test/test-test-suite-creator.rb +0 -97
  75. data/test/test-test-suite.rb +0 -151
  76. data/test/testunit-test-util.rb +0 -31
  77. data/test/ui/test_testrunmediator.rb +0 -20
  78. data/test/util/test-method-owner-finder.rb +0 -38
  79. data/test/util/test-output.rb +0 -11
  80. data/test/util/test_backtracefilter.rb +0 -52
  81. data/test/util/test_observable.rb +0 -102
  82. data/test/util/test_procwrapper.rb +0 -36
@@ -130,6 +130,16 @@ module Test
130
130
  super
131
131
  end
132
132
 
133
+ def include(*modules, &block) # :nodoc:
134
+ result = super
135
+ modules.each do |mod|
136
+ mod.public_instance_methods(false).each do |method_name|
137
+ AutoRunnerLoader.check(self, method_name.to_s)
138
+ end
139
+ end
140
+ result
141
+ end
142
+
133
143
  @@added_method_names = {}
134
144
  def method_added(name) # :nodoc:
135
145
  super
@@ -150,11 +160,12 @@ module Test
150
160
  path, line, = caller[0].split(/:(\d+)/, 2)
151
161
  line = line.to_i if line
152
162
  end
153
- method_locations << {
163
+ location = {
154
164
  :method_name => stringified_name,
155
165
  :path => File.expand_path(path),
156
166
  :line => line,
157
167
  }
168
+ add_method_location(location)
158
169
  added_method_names[stringified_name] = true
159
170
  AutoRunnerLoader.check(self, stringified_name)
160
171
  end
@@ -176,27 +187,29 @@ module Test
176
187
  # scope.
177
188
  #
178
189
  # Here is an example test case:
179
- # class TestMyClass < Test::Unit::TestCase
180
- # class << self
181
- # def startup
182
- # ...
190
+ #
191
+ # class TestMyClass < Test::Unit::TestCase
192
+ # class << self
193
+ # def startup
194
+ # ...
195
+ # end
183
196
  # end
184
- # end
185
197
  #
186
- # def setup
187
- # ...
188
- # end
198
+ # def setup
199
+ # ...
200
+ # end
189
201
  #
190
- # def test_my_class1
191
- # ...
192
- # end
202
+ # def test_my_class1
203
+ # ...
204
+ # end
193
205
  #
194
- # def test_my_class2
195
- # ...
206
+ # def test_my_class2
207
+ # ...
208
+ # end
196
209
  # end
197
- # end
198
210
  #
199
211
  # Here is a call order:
212
+ #
200
213
  # * startup
201
214
  # * setup
202
215
  # * test_my_class1 (or test_my_class2)
@@ -212,27 +225,29 @@ module Test
212
225
  # down fixture information used in test case scope.
213
226
  #
214
227
  # Here is an example test case:
215
- # class TestMyClass < Test::Unit::TestCase
216
- # class << self
217
- # def shutdown
218
- # ...
228
+ #
229
+ # class TestMyClass < Test::Unit::TestCase
230
+ # class << self
231
+ # def shutdown
232
+ # ...
233
+ # end
219
234
  # end
220
- # end
221
235
  #
222
- # def teardown
223
- # ...
224
- # end
236
+ # def teardown
237
+ # ...
238
+ # end
225
239
  #
226
- # def test_my_class1
227
- # ...
228
- # end
240
+ # def test_my_class1
241
+ # ...
242
+ # end
229
243
  #
230
- # def test_my_class2
231
- # ...
244
+ # def test_my_class2
245
+ # ...
246
+ # end
232
247
  # end
233
- # end
234
248
  #
235
249
  # Here is a call order:
250
+ #
236
251
  # * test_my_class1 (or test_my_class2)
237
252
  # * teardown
238
253
  # * test_my_class2 (or test_my_class1)
@@ -247,7 +262,7 @@ module Test
247
262
  @@test_orders = {}
248
263
 
249
264
  # Returns the current test order. This returns
250
- # +:alphabetic+ by default.
265
+ # `:alphabetic` by default.
251
266
  def test_order
252
267
  ancestors.each do |ancestor|
253
268
  order = @@test_orders[ancestor]
@@ -259,12 +274,15 @@ module Test
259
274
  # Sets the current test order.
260
275
  #
261
276
  # Here are the available _order_:
262
- # [:alphabetic]
263
- # Default. Tests are sorted in alphabetic order.
264
- # [:random]
265
- # Tests are sorted in random order.
266
- # [:defined]
267
- # Tests are sorted in defined order.
277
+ #
278
+ # :alphabetic
279
+ # : Default. Tests are sorted in alphabetic order.
280
+ #
281
+ # :random
282
+ # : Tests are sorted in random order.
283
+ #
284
+ # :defined
285
+ # : Tests are sorted in defined order.
268
286
  def test_order=(order)
269
287
  @@test_orders[self] = order
270
288
  end
@@ -275,22 +293,22 @@ module Test
275
293
  # In declarative syntax usage, the following two
276
294
  # test definitions are the almost same:
277
295
  #
278
- # description "register user"
279
- # def test_register_user
280
- # ...
281
- # end
296
+ # description "register user"
297
+ # def test_register_user
298
+ # ...
299
+ # end
282
300
  #
283
- # test "register user" do
284
- # ...
285
- # end
301
+ # test "register user" do
302
+ # ...
303
+ # end
286
304
  #
287
305
  # In test method mark usage, the "my_test_method" is
288
306
  # treated as a test method:
289
307
  #
290
- # test
291
- # def my_test_method
292
- # assert_equal("call me", ...)
293
- # end
308
+ # test
309
+ # def my_test_method
310
+ # assert_equal("call me", ...)
311
+ # end
294
312
  def test(*test_description_or_targets, &block)
295
313
  if block_given?
296
314
  test_description = test_description_or_targets.first
@@ -324,35 +342,67 @@ module Test
324
342
  # normal user" description with "test_register"
325
343
  # test.
326
344
  #
327
- # description "register a normal user"
328
- # def test_register
329
- # ...
330
- # end
345
+ # description "register a normal user"
346
+ # def test_register
347
+ # ...
348
+ # end
331
349
  def description(value, target=nil)
332
350
  targets = [target].compact
333
351
  attribute(:description, value, {}, *targets)
334
352
  end
335
353
 
354
+ # Declares that the following test uses Ractor.
355
+ #
356
+ # Tests that use Ractor are executed at the end. Because multi
357
+ # Ractor mode is enabled in the current process and it's not
358
+ # disabled even when only one Ractor is running after running
359
+ # a test that uses Ractor on Ruby 3.0. It will be solved in
360
+ # Ruby 3.1.
361
+ #
362
+ # This is implemented by setting the `:ractor` attribute of
363
+ # the test to `true`.
364
+ #
365
+ # @param options [Hash] See {Attribute::ClassMethods#attribute}
366
+ # for details.
367
+ #
368
+ # @return [void]
369
+ #
370
+ # @example Declares that test_do_something_with_ractor uses Ractor
371
+ #
372
+ # ractor
373
+ # def test_do_something_with_ractor
374
+ # Ractor.new do
375
+ # # ...
376
+ # end
377
+ # end
378
+ #
379
+ # @since 3.4.6
380
+ def ractor(options={})
381
+ attribute(:ractor, true, options)
382
+ end
383
+
336
384
  # Defines a sub test case.
337
385
  #
338
386
  # This is a syntax sugar. The both of the following codes are
339
387
  # the same in meaning:
340
388
  #
341
389
  # Standard:
342
- # class TestParent < Test::Unit::TestCase
343
- # class TestChild < self
344
- # def test_in_child
390
+ #
391
+ # class TestParent < Test::Unit::TestCase
392
+ # class TestChild < self
393
+ # def test_in_child
394
+ # end
345
395
  # end
346
396
  # end
347
- # end
348
397
  #
349
398
  # Syntax sugar:
350
- # class TestParent < Test::Unit::TestCase
351
- # sub_test_case("TestChild") do
352
- # def test_in_child
399
+ #
400
+ # class TestParent < Test::Unit::TestCase
401
+ # sub_test_case("TestChild") do
402
+ # def test_in_child
403
+ # end
353
404
  # end
354
405
  # end
355
- # end
356
406
  #
357
407
  # The difference of them are the following:
358
408
  #
@@ -426,31 +476,43 @@ module Test
426
476
  private
427
477
  # @private
428
478
  @@method_locations = {}
479
+ # @private
480
+ @@method_location_mutex = Thread::Mutex.new
481
+
429
482
  # @private
430
483
  def method_locations
431
484
  @@method_locations[self] ||= []
432
485
  end
433
486
 
434
487
  # @private
435
- def target_method_locations(path)
436
- if path.nil?
437
- self_location = method_locations.first
438
- path = self_location[:path] if self_location
488
+ def add_method_location(location)
489
+ @@method_location_mutex.synchronize do
490
+ method_locations << location
439
491
  end
440
- return [] if path.nil?
441
-
442
- target_locations = []
443
- @@method_locations.each do |test_case, locations|
444
- locations.each do |location|
445
- absolete_path = File.expand_path(path)
446
- location_path = location[:path]
447
- location_basename = File.basename(location_path)
448
- if location_path == absolete_path or location_basename == path
449
- target_locations << location.merge(:test_case => test_case)
492
+ end
493
+
494
+ # @private
495
+ def target_method_locations(path)
496
+ @@method_location_mutex.synchronize do
497
+ if path.nil?
498
+ self_location = method_locations.first
499
+ path = self_location[:path] if self_location
500
+ end
501
+ return [] if path.nil?
502
+
503
+ target_locations = []
504
+ @@method_locations.each do |test_case, locations|
505
+ locations.each do |location|
506
+ absolete_path = File.expand_path(path)
507
+ location_path = location[:path]
508
+ location_basename = File.basename(location_path)
509
+ if location_path == absolete_path or location_basename == path
510
+ target_locations << location.merge(:test_case => test_case)
511
+ end
450
512
  end
451
513
  end
514
+ target_locations
452
515
  end
453
- target_locations
454
516
  end
455
517
  end
456
518
 
@@ -537,35 +599,37 @@ module Test
537
599
  #
538
600
  # You can add additional setup tasks by the following
539
601
  # code:
540
- # class TestMyClass < Test::Unit::TestCase
541
- # def setup
542
- # ...
543
- # end
544
602
  #
545
- # setup
546
- # def my_setup1
547
- # ...
548
- # end
603
+ # class TestMyClass < Test::Unit::TestCase
604
+ # def setup
605
+ # ...
606
+ # end
549
607
  #
550
- # setup do
551
- # ... # setup callback1
552
- # end
608
+ # setup
609
+ # def my_setup1
610
+ # ...
611
+ # end
553
612
  #
554
- # setup
555
- # def my_setup2
556
- # ...
557
- # end
613
+ # setup do
614
+ # ... # setup callback1
615
+ # end
558
616
  #
559
- # setup do
560
- # ... # setup callback2
561
- # end
617
+ # setup
618
+ # def my_setup2
619
+ # ...
620
+ # end
562
621
  #
563
- # def test_my_class
564
- # ...
622
+ # setup do
623
+ # ... # setup callback2
624
+ # end
625
+ #
626
+ # def test_my_class
627
+ # ...
628
+ # end
565
629
  # end
566
- # end
567
630
  #
568
631
  # Here is a call order:
632
+ #
569
633
  # * setup
570
634
  # * my_setup1
571
635
  # * setup callback1
@@ -582,35 +646,37 @@ module Test
582
646
  #
583
647
  # You can add additional cleanup tasks by the following
584
648
  # code:
585
- # class TestMyClass < Test::Unit::TestCase
586
- # def cleanup
587
- # ...
588
- # end
589
649
  #
590
- # cleanup
591
- # def my_cleanup1
592
- # ...
593
- # end
650
+ # class TestMyClass < Test::Unit::TestCase
651
+ # def cleanup
652
+ # ...
653
+ # end
594
654
  #
595
- # cleanup do
596
- # ... # cleanup callback1
597
- # end
655
+ # cleanup
656
+ # def my_cleanup1
657
+ # ...
658
+ # end
598
659
  #
599
- # cleanup
600
- # def my_cleanup2
601
- # ...
602
- # end
660
+ # cleanup do
661
+ # ... # cleanup callback1
662
+ # end
603
663
  #
604
- # cleanup do
605
- # ... # cleanup callback2
606
- # end
664
+ # cleanup
665
+ # def my_cleanup2
666
+ # ...
667
+ # end
668
+ #
669
+ # cleanup do
670
+ # ... # cleanup callback2
671
+ # end
607
672
  #
608
- # def test_my_class
609
- # ...
673
+ # def test_my_class
674
+ # ...
675
+ # end
610
676
  # end
611
- # end
612
677
  #
613
678
  # Here is a call order:
679
+ #
614
680
  # * test_my_class
615
681
  # * cleanup callback2
616
682
  # * my_cleanup2
@@ -625,35 +691,37 @@ module Test
625
691
  #
626
692
  # You can add additional teardown tasks by the following
627
693
  # code:
628
- # class TestMyClass < Test::Unit::TestCase
629
- # def teardown
630
- # ...
631
- # end
632
694
  #
633
- # teardown
634
- # def my_teardown1
635
- # ...
636
- # end
695
+ # class TestMyClass < Test::Unit::TestCase
696
+ # def teardown
697
+ # ...
698
+ # end
637
699
  #
638
- # teardown do
639
- # ... # teardown callback1
640
- # end
700
+ # teardown
701
+ # def my_teardown1
702
+ # ...
703
+ # end
641
704
  #
642
- # teardown
643
- # def my_teardown2
644
- # ...
645
- # end
705
+ # teardown do
706
+ # ... # teardown callback1
707
+ # end
646
708
  #
647
- # teardown do
648
- # ... # teardown callback2
649
- # end
709
+ # teardown
710
+ # def my_teardown2
711
+ # ...
712
+ # end
713
+ #
714
+ # teardown do
715
+ # ... # teardown callback2
716
+ # end
650
717
  #
651
- # def test_my_class
652
- # ...
718
+ # def test_my_class
719
+ # ...
720
+ # end
653
721
  # end
654
- # end
655
722
  #
656
723
  # Here is a call order:
724
+ #
657
725
  # * test_my_class
658
726
  # * teardown callback2
659
727
  # * my_teardown2
@@ -673,11 +741,17 @@ module Test
673
741
 
674
742
  # Returns a label of test data for the test. If the
675
743
  # test isn't associated with any test data, it returns
676
- # +nil+.
744
+ # `nil`.
677
745
  def data_label
678
746
  @internal_data.test_data_label
679
747
  end
680
748
 
749
+ # Returns test data for the test. If the test isn't associated
750
+ # with any test data, it returns `nil`.
751
+ def data
752
+ @internal_data.test_data
753
+ end
754
+
681
755
  # Returns a human-readable name for the specific test that
682
756
  # this instance of TestCase represents.
683
757
  def name
@@ -779,15 +853,11 @@ module Test
779
853
  end
780
854
  if @internal_data.have_test_data?
781
855
  test_method = method(@method_name)
782
- if test_method.arity == 1 or test_method.arity < 0
783
- __send__(@method_name, @internal_data.test_data)
856
+ arity = test_method.arity
857
+ if arity.zero?
858
+ __send__(@method_name)
784
859
  else
785
- locations = self.class.find_locations(:method_name => @method_name)
786
- backtrace = locations.collect do |location|
787
- "#{location[:path]}:#{location[:line]}"
788
- end
789
- notify("<#{signature}> misses a parameter to take test data",
790
- :backtrace => backtrace)
860
+ __send__(@method_name, @internal_data.test_data)
791
861
  end
792
862
  else
793
863
  __send__(@method_name)
@@ -77,7 +77,7 @@ module Test
77
77
  @tests -= tests
78
78
  end
79
79
 
80
- # Retuns the rolled up number of tests in this suite;
80
+ # Returns the rolled up number of tests in this suite;
81
81
  # i.e. if the suite contains other suites, it counts the
82
82
  # tests within those suites, not the suites themselves.
83
83
  def size