test_plus 0.1.1
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 +7 -0
- data/Gemfile +7 -0
- data/Gemfile.lock +64 -0
- data/LICENSE.txt +20 -0
- data/README.md +23 -0
- data/Rakefile +38 -0
- data/VERSION +1 -0
- data/lib/test_plus/extensions.rb +108 -0
- data/lib/test_plus/support.rb +17 -0
- data/lib/test_plus.rb +5 -0
- data/test/helper.rb +20 -0
- data/test/test_test_plus.rb +28 -0
- data/test_plus.gemspec +58 -0
- metadata +99 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 97e83f1e828a00c93d4a5fc4d8c01593e7850bc2
|
4
|
+
data.tar.gz: c64338bdb827d667e18bdc5c6b5afb6678f04618
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a9776dd84740c8e7408a5b95e664af12d5bbd9eac8a5b7de163ec9496a3c930420b0cb5c2913a0b40958a1faffa21c14d1227f22c705ec45f5b166ea321edf77
|
7
|
+
data.tar.gz: 4c2252b7a3cfec44a2b3ae4639a4dc7b1294ae85ff61c2685f09903c2c22059b03475cba3305a49b1598e9671da0b30d3a813cebb1dad02a0406d52ba4362f83
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
GEM
|
2
|
+
remote: https://rubygems.org/
|
3
|
+
specs:
|
4
|
+
addressable (2.4.0)
|
5
|
+
builder (3.2.3)
|
6
|
+
descendants_tracker (0.0.4)
|
7
|
+
thread_safe (~> 0.3, >= 0.3.1)
|
8
|
+
faraday (0.9.2)
|
9
|
+
multipart-post (>= 1.2, < 3)
|
10
|
+
git (1.3.0)
|
11
|
+
github_api (0.16.0)
|
12
|
+
addressable (~> 2.4.0)
|
13
|
+
descendants_tracker (~> 0.0.4)
|
14
|
+
faraday (~> 0.8, < 0.10)
|
15
|
+
hashie (>= 3.4)
|
16
|
+
mime-types (>= 1.16, < 3.0)
|
17
|
+
oauth2 (~> 1.0)
|
18
|
+
hashie (3.5.6)
|
19
|
+
highline (1.7.8)
|
20
|
+
jeweler (2.3.7)
|
21
|
+
builder
|
22
|
+
bundler (>= 1)
|
23
|
+
git (>= 1.2.5)
|
24
|
+
github_api (~> 0.16.0)
|
25
|
+
highline (>= 1.6.15)
|
26
|
+
nokogiri (>= 1.5.10)
|
27
|
+
psych (~> 2.2)
|
28
|
+
rake
|
29
|
+
rdoc
|
30
|
+
semver2
|
31
|
+
jwt (1.5.6)
|
32
|
+
mime-types (2.99.3)
|
33
|
+
mini_portile2 (2.3.0)
|
34
|
+
multi_json (1.12.2)
|
35
|
+
multi_xml (0.6.0)
|
36
|
+
multipart-post (2.0.0)
|
37
|
+
nokogiri (1.8.1)
|
38
|
+
mini_portile2 (~> 2.3.0)
|
39
|
+
oauth2 (1.4.0)
|
40
|
+
faraday (>= 0.8, < 0.13)
|
41
|
+
jwt (~> 1.0)
|
42
|
+
multi_json (~> 1.3)
|
43
|
+
multi_xml (~> 0.5)
|
44
|
+
rack (>= 1.2, < 3)
|
45
|
+
power_assert (1.1.1)
|
46
|
+
psych (2.2.4)
|
47
|
+
rack (2.0.3)
|
48
|
+
rake (12.2.1)
|
49
|
+
rdoc (5.1.0)
|
50
|
+
semver2 (3.4.2)
|
51
|
+
test-unit (3.2.6)
|
52
|
+
power_assert
|
53
|
+
thread_safe (0.3.6)
|
54
|
+
|
55
|
+
PLATFORMS
|
56
|
+
ruby
|
57
|
+
|
58
|
+
DEPENDENCIES
|
59
|
+
bundler
|
60
|
+
jeweler
|
61
|
+
test-unit
|
62
|
+
|
63
|
+
BUNDLED WITH
|
64
|
+
1.16.0
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2017 Scott Tadman
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# Test Plus
|
2
|
+
|
3
|
+
Helper extensions for testing Ruby and Rails code using Test::Unit and
|
4
|
+
MiniTest.
|
5
|
+
|
6
|
+
## Usage
|
7
|
+
|
8
|
+
The `TestPlus` library can be imported into any project as necessary. Typically
|
9
|
+
this is done in the `test/helper.rb` file or equivalent:
|
10
|
+
|
11
|
+
class Test::Unit::TestCase
|
12
|
+
include TestPlus::Extensions
|
13
|
+
end
|
14
|
+
|
15
|
+
# Examples
|
16
|
+
|
17
|
+
The `test/` directory contains a number of examples demonstrating how the
|
18
|
+
various assertion rules are applied.
|
19
|
+
|
20
|
+
## Copyright
|
21
|
+
|
22
|
+
Copyright (c) 2017 Scott Tadman. See LICENSE.txt for
|
23
|
+
further details.
|
data/Rakefile
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'bundler'
|
5
|
+
|
6
|
+
begin
|
7
|
+
Bundler.setup(:default, :development, :test)
|
8
|
+
rescue Bundler::BundlerError => e
|
9
|
+
$stderr.puts e.message
|
10
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
11
|
+
exit e.status_code
|
12
|
+
end
|
13
|
+
|
14
|
+
require 'rake'
|
15
|
+
require 'jeweler'
|
16
|
+
|
17
|
+
Jeweler::Tasks.new do |gem|
|
18
|
+
# gem is a Gem::Specification... see http://guides.rubygems.org/specification-reference/ for more options
|
19
|
+
gem.name = "test_plus"
|
20
|
+
gem.homepage = "http://github.com/postageapp/test_plus"
|
21
|
+
gem.license = "MIT"
|
22
|
+
gem.summary = %Q{Extensions for Test::Unit and Minitest}
|
23
|
+
gem.description = %Q{Convenience methods for testing in Ruby and Rails}
|
24
|
+
gem.email = "tadman@postageapp.com"
|
25
|
+
gem.authors = ["Scott Tadman"]
|
26
|
+
# dependencies defined in Gemfile
|
27
|
+
end
|
28
|
+
|
29
|
+
Jeweler::RubygemsDotOrgTasks.new
|
30
|
+
|
31
|
+
require 'rake/testtask'
|
32
|
+
Rake::TestTask.new(:test) do |test|
|
33
|
+
test.libs << 'lib' << 'test'
|
34
|
+
test.pattern = 'test/**/test_*.rb'
|
35
|
+
test.verbose = true
|
36
|
+
end
|
37
|
+
|
38
|
+
task default: :test
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.1
|
@@ -0,0 +1,108 @@
|
|
1
|
+
module TestPlus::Extensions
|
2
|
+
# == Mixin Methods ========================================================
|
3
|
+
|
4
|
+
# Tests that a model was created properly: That no errors were reported,
|
5
|
+
# that the model is listed as valid, and that it's no longer flagged as a
|
6
|
+
# new record.
|
7
|
+
def assert_created(model)
|
8
|
+
assert(model, "Model was not defined")
|
9
|
+
assert_equal([ ], model.errors.full_messages)
|
10
|
+
assert(model.valid?, "Model failed to validate")
|
11
|
+
assert(!model.new_record?, "Model is still a new record")
|
12
|
+
end
|
13
|
+
|
14
|
+
# Tests that a model was not created by verifying that it has not been saved.
|
15
|
+
def assert_not_created(model)
|
16
|
+
assert(model, "Model was not defined")
|
17
|
+
assert(model.new_record?, "Model has been saved")
|
18
|
+
end
|
19
|
+
alias_method :refute_created, :assert_not_created
|
20
|
+
|
21
|
+
# Tests that the given model has errors on the specified attributes. Any
|
22
|
+
# additional errors will be reported as anomalous, and any missing ones
|
23
|
+
# will be flagged as well.
|
24
|
+
def assert_errors_on(model, *attrs)
|
25
|
+
found_attrs = [ ]
|
26
|
+
|
27
|
+
model.errors.each do |attr, error|
|
28
|
+
found_attrs << attr
|
29
|
+
end
|
30
|
+
|
31
|
+
assert_equal(
|
32
|
+
attrs.flatten.collect(&:to_s).sort,
|
33
|
+
found_attrs.uniq.collect(&:to_s).sort
|
34
|
+
)
|
35
|
+
end
|
36
|
+
|
37
|
+
# Tests that two lists of objects contain the same values when calling a
|
38
|
+
# method on the itens in question, if they respond to it. Those items that
|
39
|
+
# do not respond to the method are treated as-is.
|
40
|
+
def assert_equal_reduced(a, b, reduce, message = nil, &block)
|
41
|
+
assert_equal(
|
42
|
+
TestPlus::Support.reduce_with(a, reduce).to_a.sort,
|
43
|
+
TestPlus::Support.reduce_with(b, reduce).to_a.sort,
|
44
|
+
message,
|
45
|
+
&block
|
46
|
+
)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Tests a number of cases simultaneously using a key-value Hash to map
|
50
|
+
# inputs to expected outputs. The keys are supplied to a block and the
|
51
|
+
# result of that block is compared to the expected value. Any mistakes
|
52
|
+
# are reported as failures.
|
53
|
+
def assert_mapping(map)
|
54
|
+
result_map = map.each_with_object({ }) do |(k,_), h|
|
55
|
+
if (k and k.respond_to?(:freeze))
|
56
|
+
k = k.freeze
|
57
|
+
end
|
58
|
+
|
59
|
+
h[k] = yield(k)
|
60
|
+
end
|
61
|
+
|
62
|
+
differences = result_map.each_with_object([ ]) do |(k,v), a|
|
63
|
+
next unless (v == map[k])
|
64
|
+
|
65
|
+
a << k
|
66
|
+
end
|
67
|
+
|
68
|
+
assert_equal(
|
69
|
+
map,
|
70
|
+
result_map,
|
71
|
+
differences.collect do |s|
|
72
|
+
"Input: #{s.inspect}\n Expected: #{map[s].inspect}\n Result: #{result_map[s].inspect}\n"
|
73
|
+
end.join('')
|
74
|
+
)
|
75
|
+
end
|
76
|
+
|
77
|
+
# Tests that an exceeption is raised. An optional exception class can be
|
78
|
+
# provided to ensure that the exception is of the correct type.
|
79
|
+
def assert_exception_raised(exception_class = nil, error_text = nil, message = nil, &block)
|
80
|
+
exception_raised = nil
|
81
|
+
|
82
|
+
yield
|
83
|
+
|
84
|
+
rescue Object => exception_raised
|
85
|
+
if (exception_class)
|
86
|
+
assert(
|
87
|
+
exception_raised.is_a?(exception_class),
|
88
|
+
message || "Exception raised is not of type #{exception_class}, instead is #{exception_raised.class}"
|
89
|
+
)
|
90
|
+
else
|
91
|
+
assert(true)
|
92
|
+
end
|
93
|
+
|
94
|
+
if (error_text)
|
95
|
+
assert_equal(
|
96
|
+
error_text,
|
97
|
+
exception_raised.to_s,
|
98
|
+
message || "Exception raised had incorrect text"
|
99
|
+
)
|
100
|
+
end
|
101
|
+
else
|
102
|
+
if (exception_class)
|
103
|
+
flunk(message || "Exception of type #{exception_class} was not raised")
|
104
|
+
else
|
105
|
+
flunk(message || "An exception was not raised")
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module TestPlus::Support
|
2
|
+
# == Module Methods =======================================================
|
3
|
+
|
4
|
+
def reduce_with(list, reduction)
|
5
|
+
case (reduction)
|
6
|
+
when Symbol
|
7
|
+
reduction_method = reduction
|
8
|
+
reduction = lambda do |o|
|
9
|
+
o.respond_to?(reduction_method) ? o.send(reduction_method) : o
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
list.to_a.flatten.map(&reduction)
|
14
|
+
end
|
15
|
+
|
16
|
+
extend self
|
17
|
+
end
|
data/lib/test_plus.rb
ADDED
data/test/helper.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
begin
|
4
|
+
Bundler.setup(:default, :development, :test)
|
5
|
+
rescue Bundler::BundlerError => e
|
6
|
+
$stderr.puts e.message
|
7
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
+
exit e.status_code
|
9
|
+
end
|
10
|
+
|
11
|
+
require 'test/unit'
|
12
|
+
|
13
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
14
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
15
|
+
|
16
|
+
require 'test_plus'
|
17
|
+
|
18
|
+
class Test::Unit::TestCase
|
19
|
+
include TestPlus::Extensions
|
20
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require_relative './helper'
|
2
|
+
|
3
|
+
class TestTestPlus < Test::Unit::TestCase
|
4
|
+
def test_assert_mapping
|
5
|
+
assert_mapping(
|
6
|
+
'a' => 'A',
|
7
|
+
'A' => 'A',
|
8
|
+
nil => nil
|
9
|
+
) do |letter|
|
10
|
+
letter and letter.upcase
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_assert_exception_raised
|
15
|
+
assert_exception_raised ArgumentError do
|
16
|
+
''.to_s(1)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_assert_equal_reduced
|
21
|
+
a = [ 1, 2, 3, 4, 5 ]
|
22
|
+
b = %w[ 1 2 3 4 5 ]
|
23
|
+
|
24
|
+
assert_equal_reduced(a, b, :to_s)
|
25
|
+
|
26
|
+
assert_equal_reduced(a, b, ->(v) { v.to_s })
|
27
|
+
end
|
28
|
+
end
|
data/test_plus.gemspec
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
# stub: test_plus 0.1.1 ruby lib
|
6
|
+
|
7
|
+
Gem::Specification.new do |s|
|
8
|
+
s.name = "test_plus".freeze
|
9
|
+
s.version = "0.1.1"
|
10
|
+
|
11
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
12
|
+
s.require_paths = ["lib".freeze]
|
13
|
+
s.authors = ["Scott Tadman".freeze]
|
14
|
+
s.date = "2017-11-06"
|
15
|
+
s.description = "Convenience methods for testing in Ruby and Rails".freeze
|
16
|
+
s.email = "tadman@postageapp.com".freeze
|
17
|
+
s.extra_rdoc_files = [
|
18
|
+
"LICENSE.txt",
|
19
|
+
"README.md"
|
20
|
+
]
|
21
|
+
s.files = [
|
22
|
+
"Gemfile",
|
23
|
+
"Gemfile.lock",
|
24
|
+
"LICENSE.txt",
|
25
|
+
"README.md",
|
26
|
+
"Rakefile",
|
27
|
+
"VERSION",
|
28
|
+
"lib/test_plus.rb",
|
29
|
+
"lib/test_plus/extensions.rb",
|
30
|
+
"lib/test_plus/support.rb",
|
31
|
+
"test/helper.rb",
|
32
|
+
"test/test_test_plus.rb",
|
33
|
+
"test_plus.gemspec"
|
34
|
+
]
|
35
|
+
s.homepage = "http://github.com/postageapp/test_plus".freeze
|
36
|
+
s.licenses = ["MIT".freeze]
|
37
|
+
s.rubygems_version = "2.6.13".freeze
|
38
|
+
s.summary = "Extensions for Test::Unit and Minitest".freeze
|
39
|
+
|
40
|
+
if s.respond_to? :specification_version then
|
41
|
+
s.specification_version = 4
|
42
|
+
|
43
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
44
|
+
s.add_development_dependency(%q<bundler>.freeze, [">= 0"])
|
45
|
+
s.add_development_dependency(%q<jeweler>.freeze, [">= 0"])
|
46
|
+
s.add_development_dependency(%q<test-unit>.freeze, [">= 0"])
|
47
|
+
else
|
48
|
+
s.add_dependency(%q<bundler>.freeze, [">= 0"])
|
49
|
+
s.add_dependency(%q<jeweler>.freeze, [">= 0"])
|
50
|
+
s.add_dependency(%q<test-unit>.freeze, [">= 0"])
|
51
|
+
end
|
52
|
+
else
|
53
|
+
s.add_dependency(%q<bundler>.freeze, [">= 0"])
|
54
|
+
s.add_dependency(%q<jeweler>.freeze, [">= 0"])
|
55
|
+
s.add_dependency(%q<test-unit>.freeze, [">= 0"])
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
metadata
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: test_plus
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Scott Tadman
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2017-11-06 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: jeweler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: test-unit
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description: Convenience methods for testing in Ruby and Rails
|
56
|
+
email: tadman@postageapp.com
|
57
|
+
executables: []
|
58
|
+
extensions: []
|
59
|
+
extra_rdoc_files:
|
60
|
+
- LICENSE.txt
|
61
|
+
- README.md
|
62
|
+
files:
|
63
|
+
- Gemfile
|
64
|
+
- Gemfile.lock
|
65
|
+
- LICENSE.txt
|
66
|
+
- README.md
|
67
|
+
- Rakefile
|
68
|
+
- VERSION
|
69
|
+
- lib/test_plus.rb
|
70
|
+
- lib/test_plus/extensions.rb
|
71
|
+
- lib/test_plus/support.rb
|
72
|
+
- test/helper.rb
|
73
|
+
- test/test_test_plus.rb
|
74
|
+
- test_plus.gemspec
|
75
|
+
homepage: http://github.com/postageapp/test_plus
|
76
|
+
licenses:
|
77
|
+
- MIT
|
78
|
+
metadata: {}
|
79
|
+
post_install_message:
|
80
|
+
rdoc_options: []
|
81
|
+
require_paths:
|
82
|
+
- lib
|
83
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
84
|
+
requirements:
|
85
|
+
- - ">="
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
88
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
89
|
+
requirements:
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: '0'
|
93
|
+
requirements: []
|
94
|
+
rubyforge_project:
|
95
|
+
rubygems_version: 2.6.13
|
96
|
+
signing_key:
|
97
|
+
specification_version: 4
|
98
|
+
summary: Extensions for Test::Unit and Minitest
|
99
|
+
test_files: []
|