test-unit 3.3.8 → 3.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/doc/text/news.md +47 -0
- data/lib/test-unit.rb +2 -0
- data/lib/test/unit.rb +2 -0
- data/lib/test/unit/assertions.rb +117 -12
- data/lib/test/unit/fixture.rb +6 -0
- data/lib/test/unit/testcase.rb +2 -1
- data/lib/test/unit/ui/console/testrunner.rb +26 -0
- data/lib/test/unit/version.rb +1 -1
- data/lib/test/unit/warning.rb +3 -0
- data/test/test-assertions.rb +102 -11
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '096e65b8d56779e795090f5e56e10a10bcef4f666f45702da71acb1e0e0e769e'
|
4
|
+
data.tar.gz: 31402966d552fe2c7cd960185929963e7358296e9ff5727be4c7a72781d070b7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e46ad14d93dadac17224d10ab58617acc4dfaae61f06067c400308d9c1b3ad060201e88a7fd097d94d93c053a1d5bed0a9f56e765bb573fe960c7086251a891c
|
7
|
+
data.tar.gz: cfa5f1b593e993ff2643cab4989428817fdae1258a357797b2e42d0d563022351349eb3648056305df8ddb6f5e9847a1084646f2edec93b7a1c519bba96c9d11
|
data/doc/text/news.md
CHANGED
@@ -1,5 +1,52 @@
|
|
1
1
|
# News
|
2
2
|
|
3
|
+
## 3.4.3 - 2021-06-04 {#version-3-4-3}
|
4
|
+
|
5
|
+
### Improvements
|
6
|
+
|
7
|
+
* Stopped to change result value of `Test::Unit::TestCase#include`.
|
8
|
+
|
9
|
+
* Added `assert_all?`.
|
10
|
+
|
11
|
+
* Added support for `assert_raise_with_message`.
|
12
|
+
|
13
|
+
## 3.4.2 - 2021-05-30 {#version-3-4-2}
|
14
|
+
|
15
|
+
### Improvements
|
16
|
+
|
17
|
+
* [UI][console]: Improved diff readability for no color
|
18
|
+
case. Character based diff marks are always showed.
|
19
|
+
|
20
|
+
## 3.4.1 - 2021-04-19 {#version-3-4-1}
|
21
|
+
|
22
|
+
### Fixes
|
23
|
+
|
24
|
+
* Fixed a bug that `setup`/`cleanup`/`teardown` with block may be
|
25
|
+
overwritten by another `setup`/`cleanup`/`teardown` with
|
26
|
+
block. It's caused only with Ruby 2.6 or earlier.
|
27
|
+
[GitHub#179][Reported by akira yamada]
|
28
|
+
|
29
|
+
### Thanks
|
30
|
+
|
31
|
+
* akira yamada
|
32
|
+
|
33
|
+
## 3.4.0 - 2021-01-30 {#version-3-4-0}
|
34
|
+
|
35
|
+
### Improvements
|
36
|
+
|
37
|
+
* Enable deprecated warnings by default.
|
38
|
+
|
39
|
+
## 3.3.9 - 2020-12-29 {#version-3-3-9}
|
40
|
+
|
41
|
+
### Improvements
|
42
|
+
|
43
|
+
* `assert_not_match`: Add support for `String` as pattern.
|
44
|
+
[GitHub#178][Patch by David Rodríguez]
|
45
|
+
|
46
|
+
### Thanks
|
47
|
+
|
48
|
+
* David Rodríguez
|
49
|
+
|
3
50
|
## 3.3.8 - 2020-12-25 {#version-3-3-8}
|
4
51
|
|
5
52
|
### Improvements
|
data/lib/test-unit.rb
CHANGED
data/lib/test/unit.rb
CHANGED
data/lib/test/unit/assertions.rb
CHANGED
@@ -289,6 +289,71 @@ EOT
|
|
289
289
|
# Just for minitest compatibility. :<
|
290
290
|
alias_method :assert_raises, :assert_raise
|
291
291
|
|
292
|
+
# Passes if the block raises `expected_exception` with
|
293
|
+
# `expected_message`. `expected_message` can be a `String` or
|
294
|
+
# `Regexp`.
|
295
|
+
#
|
296
|
+
# @example Pass pattern: String
|
297
|
+
# assert_raise_with_message(RuntimeError, "Boom!!!") do
|
298
|
+
# raise "Boom!!!"
|
299
|
+
# end # -> pass
|
300
|
+
#
|
301
|
+
# @example Pass pattern: Regexp
|
302
|
+
# assert_raise_with_message(RuntimeError, /!!!/) do
|
303
|
+
# raise "Boom!!!"
|
304
|
+
# end # -> pass
|
305
|
+
#
|
306
|
+
# @example Failure pattern: Exception class isn't matched
|
307
|
+
# assert_raise_with_message(RuntimeError, "Boom!!!") do
|
308
|
+
# raise ArgumentError, "Boom!!!"
|
309
|
+
# end # -> failure
|
310
|
+
#
|
311
|
+
# @example Failure pattern: Exception message isn't matched
|
312
|
+
# assert_raise_with_message(RuntimeError, "Boom!!!") do
|
313
|
+
# raise "Hello"
|
314
|
+
# end # -> failure
|
315
|
+
#
|
316
|
+
# @since 3.4.3
|
317
|
+
def assert_raise_with_message(expected_exception_class,
|
318
|
+
expected_message,
|
319
|
+
message=nil,
|
320
|
+
&block)
|
321
|
+
assert_expected_exception = Proc.new do |*_args|
|
322
|
+
_message, assert_exception_helper, actual_exception = _args
|
323
|
+
diff = AssertionMessage.delayed_diff([
|
324
|
+
expected_exception_class,
|
325
|
+
expected_message,
|
326
|
+
],
|
327
|
+
[
|
328
|
+
actual_exception.class,
|
329
|
+
actual_exception.message,
|
330
|
+
])
|
331
|
+
full_message = build_message(message,
|
332
|
+
"<?>(<?>) exception expected but was\n" +
|
333
|
+
"<?>(<?>).?",
|
334
|
+
expected_exception_class,
|
335
|
+
expected_message,
|
336
|
+
actual_exception.class,
|
337
|
+
actual_exception.message,
|
338
|
+
diff)
|
339
|
+
begin
|
340
|
+
assert_block(full_message) do
|
341
|
+
assert_exception_helper.expected?(actual_exception) and
|
342
|
+
expected_message === actual_exception.message
|
343
|
+
end
|
344
|
+
rescue AssertionFailedError => failure
|
345
|
+
_set_failed_information(failure,
|
346
|
+
expected_exception_class,
|
347
|
+
actual_exception)
|
348
|
+
raise failure # For JRuby. :<
|
349
|
+
end
|
350
|
+
actual_exception
|
351
|
+
end
|
352
|
+
args = [expected_exception_class]
|
353
|
+
args << message if message
|
354
|
+
_assert_raise(assert_expected_exception, *args, &block)
|
355
|
+
end
|
356
|
+
|
292
357
|
##
|
293
358
|
# Passes if the block raises one of the given
|
294
359
|
# exceptions or sub exceptions of the given exceptions.
|
@@ -534,12 +599,7 @@ EOT
|
|
534
599
|
# assert_match(/\d+/, 'five, 6, seven')
|
535
600
|
def assert_match(pattern, string, message=nil)
|
536
601
|
_wrap_assertion do
|
537
|
-
pattern =
|
538
|
-
when String
|
539
|
-
Regexp.new(Regexp.escape(pattern))
|
540
|
-
else
|
541
|
-
pattern
|
542
|
-
end
|
602
|
+
pattern = Regexp.new(Regexp.escape(pattern)) if pattern.is_a?(String)
|
543
603
|
full_message = build_message(message,
|
544
604
|
"<?> was expected to be =~\n<?>.",
|
545
605
|
pattern, string)
|
@@ -711,15 +771,13 @@ EOT
|
|
711
771
|
# @example
|
712
772
|
# assert_not_match(/two/, 'one 2 three') # -> pass
|
713
773
|
# assert_not_match(/three/, 'one 2 three') # -> fail
|
714
|
-
def assert_not_match(
|
774
|
+
def assert_not_match(pattern, string, message=nil)
|
715
775
|
_wrap_assertion do
|
716
|
-
|
717
|
-
"<REGEXP> in assert_not_match(<REGEXP>, ...) " +
|
718
|
-
"should be a Regexp.")
|
776
|
+
pattern = Regexp.new(Regexp.escape(pattern)) if pattern.is_a?(String)
|
719
777
|
full_message = build_message(message,
|
720
778
|
"<?> was expected to not match\n<?>.",
|
721
|
-
|
722
|
-
assert_block(full_message) {
|
779
|
+
pattern, string)
|
780
|
+
assert_block(full_message) { pattern !~ string }
|
723
781
|
end
|
724
782
|
end
|
725
783
|
|
@@ -1619,6 +1677,53 @@ EOT
|
|
1619
1677
|
# @since 3.0.0
|
1620
1678
|
alias_method :refute_empty, :assert_not_empty
|
1621
1679
|
|
1680
|
+
# @overload assert_all?(collection, message=nil, &block)
|
1681
|
+
#
|
1682
|
+
# Asserts that all `block.call(item)` where `item` is each
|
1683
|
+
# item in `collection` are not false nor nil.
|
1684
|
+
#
|
1685
|
+
# If `collection` is empty, this assertion is always passed
|
1686
|
+
# with any `block`.
|
1687
|
+
#
|
1688
|
+
# @example Pass patterns
|
1689
|
+
# assert_all?([1, 2, 3]) {|item| item > 0} # => pass
|
1690
|
+
# assert_all?([1, 2, 3], &:positive?) # => pass
|
1691
|
+
# assert_all?([]) {|item| false} # => pass
|
1692
|
+
#
|
1693
|
+
# @example Failure pattern
|
1694
|
+
# assert_all?([0, 1, 2], &:zero?) # => failure
|
1695
|
+
#
|
1696
|
+
# @param [#each] collection The check target.
|
1697
|
+
# @param [String] message The additional user message. It is
|
1698
|
+
# showed when the assertion is failed.
|
1699
|
+
# @yield [Object] Give each item in `collection` to the block.
|
1700
|
+
# @yieldreturn [Object] The checked object.
|
1701
|
+
# @return [void]
|
1702
|
+
#
|
1703
|
+
# @since 3.4.3
|
1704
|
+
def assert_all?(collection, message=nil)
|
1705
|
+
_wrap_assertion do
|
1706
|
+
failed = false
|
1707
|
+
result = {}
|
1708
|
+
collection.each do |item|
|
1709
|
+
element_result = yield(item)
|
1710
|
+
failed = true unless element_result
|
1711
|
+
result[item] = element_result
|
1712
|
+
end
|
1713
|
+
format = <<-FORMAT
|
1714
|
+
<?> was expected to be all true values with the given block but was
|
1715
|
+
<?>
|
1716
|
+
FORMAT
|
1717
|
+
full_message = build_message(message,
|
1718
|
+
format,
|
1719
|
+
collection,
|
1720
|
+
result)
|
1721
|
+
assert_block(full_message) do
|
1722
|
+
not failed
|
1723
|
+
end
|
1724
|
+
end
|
1725
|
+
end
|
1726
|
+
|
1622
1727
|
##
|
1623
1728
|
# Builds a failure message. `user_message` is added before the
|
1624
1729
|
# `template` and `arguments` replaces the '?'s positionally in
|
data/lib/test/unit/fixture.rb
CHANGED
@@ -103,6 +103,7 @@ module Test
|
|
103
103
|
@test_case = test_case
|
104
104
|
@type = type
|
105
105
|
@default_options = default_options
|
106
|
+
@callbacks = {}
|
106
107
|
@before_prepend_callbacks = []
|
107
108
|
@before_append_callbacks = []
|
108
109
|
@after_prepend_callbacks = []
|
@@ -130,6 +131,11 @@ module Test
|
|
130
131
|
@test_case.attribute(:source_location,
|
131
132
|
callback.source_location,
|
132
133
|
method_name)
|
134
|
+
# For Ruby 2.6 or earlier. callback may be GC-ed. If
|
135
|
+
# callback is GC-ed, callback_method_name may be
|
136
|
+
# duplicated because callback_method_name uses callback.object_id.
|
137
|
+
# See also: https://github.com/test-unit/test-unit/issues/179
|
138
|
+
@callbacks[callback] = true
|
133
139
|
@test_case.__send__(:define_method, method_name, &callback)
|
134
140
|
else
|
135
141
|
method_name = method_name_or_callback
|
data/lib/test/unit/testcase.rb
CHANGED
@@ -131,12 +131,13 @@ module Test
|
|
131
131
|
end
|
132
132
|
|
133
133
|
def include(*modules, &block) # :nodoc:
|
134
|
-
super
|
134
|
+
result = super
|
135
135
|
modules.each do |mod|
|
136
136
|
mod.public_instance_methods(false).each do |method_name|
|
137
137
|
AutoRunnerLoader.check(self, method_name.to_s)
|
138
138
|
end
|
139
139
|
end
|
140
|
+
result
|
140
141
|
end
|
141
142
|
|
142
143
|
@@added_method_names = {}
|
@@ -660,6 +660,7 @@ module Test
|
|
660
660
|
|
661
661
|
def diff_line(from_line, to_line)
|
662
662
|
to_operations = []
|
663
|
+
mark_operations = []
|
663
664
|
from_line, to_line, _operations = line_operations(from_line, to_line)
|
664
665
|
|
665
666
|
no_replace = true
|
@@ -689,11 +690,22 @@ module Test
|
|
689
690
|
output_single(" " * (from_width - to_width))
|
690
691
|
end
|
691
692
|
end
|
693
|
+
mark_operations << Proc.new do
|
694
|
+
output_single("?" * from_width,
|
695
|
+
color("diff-difference-tag"))
|
696
|
+
if (to_width < from_width)
|
697
|
+
output_single(" " * (from_width - to_width))
|
698
|
+
end
|
699
|
+
end
|
692
700
|
when :delete
|
693
701
|
output_single(from_line[from_start...from_end],
|
694
702
|
color("diff-deleted"))
|
695
703
|
unless no_replace
|
696
704
|
to_operations << Proc.new {output_single(" " * from_width)}
|
705
|
+
mark_operations << Proc.new do
|
706
|
+
output_single("-" * from_width,
|
707
|
+
color("diff-deleted"))
|
708
|
+
end
|
697
709
|
end
|
698
710
|
when :insert
|
699
711
|
if no_replace
|
@@ -705,11 +717,16 @@ module Test
|
|
705
717
|
output_single(to_line[to_start...to_end],
|
706
718
|
color("diff-inserted"))
|
707
719
|
end
|
720
|
+
mark_operations << Proc.new do
|
721
|
+
output_single("+" * to_width,
|
722
|
+
color("diff-inserted"))
|
723
|
+
end
|
708
724
|
end
|
709
725
|
when :equal
|
710
726
|
output_single(from_line[from_start...from_end])
|
711
727
|
unless no_replace
|
712
728
|
to_operations << Proc.new {output_single(" " * to_width)}
|
729
|
+
mark_operations << Proc.new {output_single(" " * to_width)}
|
713
730
|
end
|
714
731
|
else
|
715
732
|
raise "unknown tag: #{tag}"
|
@@ -725,6 +742,15 @@ module Test
|
|
725
742
|
end
|
726
743
|
output("")
|
727
744
|
end
|
745
|
+
|
746
|
+
unless mark_operations.empty?
|
747
|
+
output_single("?", color("diff-difference-tag"))
|
748
|
+
output_single(" ")
|
749
|
+
mark_operations.each do |operation|
|
750
|
+
operation.call
|
751
|
+
end
|
752
|
+
output("")
|
753
|
+
end
|
728
754
|
end
|
729
755
|
end
|
730
756
|
end
|
data/lib/test/unit/version.rb
CHANGED
data/test/test-assertions.rb
CHANGED
@@ -98,7 +98,8 @@ module Test
|
|
98
98
|
|
99
99
|
def check_fail_exception(expected_message, options={}, &proc)
|
100
100
|
normalizer = lambda do |actual_message|
|
101
|
-
actual_message.gsub(/^(
|
101
|
+
actual_message.gsub(/^(?:[a-zA-Z]:|<internal:core> )?[^:\n]+:\d+:.+\n/,
|
102
|
+
"")
|
102
103
|
end
|
103
104
|
check_assertions(true,
|
104
105
|
options.merge(:expected_message => expected_message,
|
@@ -956,16 +957,6 @@ EOM
|
|
956
957
|
end
|
957
958
|
end
|
958
959
|
|
959
|
-
def test_assert_not_match_fail_not_regexp
|
960
|
-
check_fail("<REGEXP> in assert_not_match(<REGEXP>, ...) " +
|
961
|
-
"should be a Regexp.\n" +
|
962
|
-
"<\"asdf\"> was expected to be instance_of?\n" +
|
963
|
-
"<Regexp> but was\n" +
|
964
|
-
"<String>.") do
|
965
|
-
assert_not_match("asdf", "asdf")
|
966
|
-
end
|
967
|
-
end
|
968
|
-
|
969
960
|
def test_assert_not_match_fail_match
|
970
961
|
check_fail("</string/> was expected to not match\n" +
|
971
962
|
"<\"string\">.") do
|
@@ -973,6 +964,13 @@ EOM
|
|
973
964
|
end
|
974
965
|
end
|
975
966
|
|
967
|
+
def test_assert_not_match_fail_match_string
|
968
|
+
check_fail("</asdf/> was expected to not match\n" +
|
969
|
+
"<\"asdf\">.") do
|
970
|
+
assert_not_match("asdf", "asdf")
|
971
|
+
end
|
972
|
+
end
|
973
|
+
|
976
974
|
def test_assert_not_match_fail_match_with_message
|
977
975
|
check_fail("message.\n" +
|
978
976
|
"</string/> was expected to not match\n" +
|
@@ -1609,6 +1607,66 @@ MESSAGE
|
|
1609
1607
|
end
|
1610
1608
|
end
|
1611
1609
|
|
1610
|
+
class TestAssertRaiseWithMessage < Test::Unit::TestCase
|
1611
|
+
include AssertionCheckable
|
1612
|
+
|
1613
|
+
def test_pass_string
|
1614
|
+
check_nothing_fails(true) do
|
1615
|
+
assert_raise_with_message(RuntimeError, "Boom!!!") do
|
1616
|
+
raise "Boom!!!"
|
1617
|
+
end
|
1618
|
+
end
|
1619
|
+
end
|
1620
|
+
|
1621
|
+
def test_pass_regexp
|
1622
|
+
check_nothing_fails(true) do
|
1623
|
+
assert_raise_with_message(RuntimeError, /!!!/) do
|
1624
|
+
raise "Boom!!!"
|
1625
|
+
end
|
1626
|
+
end
|
1627
|
+
end
|
1628
|
+
|
1629
|
+
def test_pass_message
|
1630
|
+
check_nothing_fails(true) do
|
1631
|
+
assert_raise_with_message(RuntimeError, "Boom!!!", "message") do
|
1632
|
+
raise "Boom!!!"
|
1633
|
+
end
|
1634
|
+
end
|
1635
|
+
end
|
1636
|
+
|
1637
|
+
def test_fail_unmatch_class
|
1638
|
+
expected_message = <<-MESSAGE.chomp
|
1639
|
+
message.
|
1640
|
+
<LoadError>(<"Boom!!!">) exception expected but was
|
1641
|
+
<RuntimeError>(<"Boom!!!">).
|
1642
|
+
|
1643
|
+
diff:
|
1644
|
+
- [LoadError, "Boom!!!"]
|
1645
|
+
? ^^^^
|
1646
|
+
+ [RuntimeError, "Boom!!!"]
|
1647
|
+
? ^^^^^^^
|
1648
|
+
MESSAGE
|
1649
|
+
check_fail(expected_message) do
|
1650
|
+
assert_raise_with_message(LoadError, "Boom!!!", "message") do
|
1651
|
+
raise "Boom!!!"
|
1652
|
+
end
|
1653
|
+
end
|
1654
|
+
end
|
1655
|
+
|
1656
|
+
def test_fail_unmatch_message
|
1657
|
+
expected_message = <<-MESSAGE.chomp
|
1658
|
+
message.
|
1659
|
+
<RuntimeError>(</Hello/>) exception expected but was
|
1660
|
+
<RuntimeError>(<"Boom!!!">).
|
1661
|
+
MESSAGE
|
1662
|
+
check_fail(expected_message) do
|
1663
|
+
assert_raise_with_message(RuntimeError, /Hello/, "message") do
|
1664
|
+
raise "Boom!!!"
|
1665
|
+
end
|
1666
|
+
end
|
1667
|
+
end
|
1668
|
+
end
|
1669
|
+
|
1612
1670
|
class TestAssertInDelta < TestCase
|
1613
1671
|
include AssertionCheckable
|
1614
1672
|
|
@@ -2172,6 +2230,39 @@ EOM
|
|
2172
2230
|
end
|
2173
2231
|
end
|
2174
2232
|
|
2233
|
+
class TestAssertAll < Test::Unit::TestCase
|
2234
|
+
include AssertionCheckable
|
2235
|
+
|
2236
|
+
def test_pass
|
2237
|
+
check_nothing_fails do
|
2238
|
+
assert_all?([1, 2]) {|item| item > 0}
|
2239
|
+
end
|
2240
|
+
end
|
2241
|
+
|
2242
|
+
def test_pass_message
|
2243
|
+
check_nothing_fails do
|
2244
|
+
assert_all?([1, 2], "positive") {|item| item > 0}
|
2245
|
+
end
|
2246
|
+
end
|
2247
|
+
|
2248
|
+
def test_pass_empty
|
2249
|
+
check_nothing_fails do
|
2250
|
+
assert_all?([]) {|item| false}
|
2251
|
+
end
|
2252
|
+
end
|
2253
|
+
|
2254
|
+
def test_fail
|
2255
|
+
expected_message = <<-EOM
|
2256
|
+
message.
|
2257
|
+
<[0, 1]> was expected to be all true values with the given block but was
|
2258
|
+
<{0=>true, 1=>false}>
|
2259
|
+
EOM
|
2260
|
+
check_fail(expected_message.chomp) do
|
2261
|
+
assert_all?([0, 1], "message", &:zero?)
|
2262
|
+
end
|
2263
|
+
end
|
2264
|
+
end
|
2265
|
+
|
2175
2266
|
class TestTemplate < Test::Unit::TestCase
|
2176
2267
|
def test_incompatible_encoding_by_diff
|
2177
2268
|
need_encoding
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: test-unit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.3
|
4
|
+
version: 3.4.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kouhei Sutou
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2021-06-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: power_assert
|
@@ -164,6 +164,7 @@ files:
|
|
164
164
|
- lib/test/unit/util/output.rb
|
165
165
|
- lib/test/unit/util/procwrapper.rb
|
166
166
|
- lib/test/unit/version.rb
|
167
|
+
- lib/test/unit/warning.rb
|
167
168
|
- sample/adder.rb
|
168
169
|
- sample/subtracter.rb
|
169
170
|
- sample/test_adder.rb
|
@@ -231,7 +232,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
231
232
|
- !ruby/object:Gem::Version
|
232
233
|
version: '0'
|
233
234
|
requirements: []
|
234
|
-
rubygems_version: 3.
|
235
|
+
rubygems_version: 3.3.0.dev
|
235
236
|
signing_key:
|
236
237
|
specification_version: 4
|
237
238
|
summary: An xUnit family unit testing framework for Ruby.
|