minitest 5.5.1 → 5.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/{History.txt → History.rdoc} +25 -3
- data/Manifest.txt +2 -2
- data/{README.txt → README.rdoc} +49 -18
- data/Rakefile +10 -9
- data/lib/minitest.rb +15 -10
- data/lib/minitest/assertions.rb +22 -23
- data/lib/minitest/benchmark.rb +14 -15
- data/lib/minitest/expectations.rb +31 -4
- data/lib/minitest/mock.rb +24 -20
- data/lib/minitest/parallel.rb +14 -4
- data/lib/minitest/pride_plugin.rb +2 -2
- data/lib/minitest/spec.rb +25 -20
- data/lib/minitest/test.rb +8 -10
- data/test/minitest/metametameta.rb +10 -10
- data/test/minitest/test_minitest_benchmark.rb +3 -3
- data/test/minitest/test_minitest_mock.rb +11 -13
- data/test/minitest/test_minitest_spec.rb +48 -26
- data/test/minitest/test_minitest_unit.rb +59 -59
- metadata +9 -14
- metadata.gz.sig +0 -0
data/lib/minitest/benchmark.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "minitest/unit"
|
2
|
+
require "minitest/spec"
|
3
3
|
|
4
4
|
module Minitest
|
5
5
|
##
|
@@ -221,8 +221,8 @@ module Minitest
|
|
221
221
|
# See: http://en.wikipedia.org/wiki/Coefficient_of_determination
|
222
222
|
|
223
223
|
def fit_error xys
|
224
|
-
y_bar = sigma(xys) { |
|
225
|
-
ss_tot = sigma(xys) { |
|
224
|
+
y_bar = sigma(xys) { |_, y| y } / xys.size.to_f
|
225
|
+
ss_tot = sigma(xys) { |_, y| (y - y_bar) ** 2 }
|
226
226
|
ss_err = sigma(xys) { |x, y| (yield(x) - y) ** 2 }
|
227
227
|
|
228
228
|
1 - (ss_err / ss_tot)
|
@@ -238,9 +238,9 @@ module Minitest
|
|
238
238
|
def fit_exponential xs, ys
|
239
239
|
n = xs.size
|
240
240
|
xys = xs.zip(ys)
|
241
|
-
sxlny = sigma(xys) { |x,y| x * Math.log(y) }
|
242
|
-
slny = sigma(xys) { |
|
243
|
-
sx2 = sigma(xys) { |x,
|
241
|
+
sxlny = sigma(xys) { |x, y| x * Math.log(y) }
|
242
|
+
slny = sigma(xys) { |_, y| Math.log(y) }
|
243
|
+
sx2 = sigma(xys) { |x, _| x * x }
|
244
244
|
sx = sigma xs
|
245
245
|
|
246
246
|
c = n * sx2 - sx ** 2
|
@@ -260,10 +260,10 @@ module Minitest
|
|
260
260
|
def fit_logarithmic xs, ys
|
261
261
|
n = xs.size
|
262
262
|
xys = xs.zip(ys)
|
263
|
-
slnx2 = sigma(xys) { |x,
|
264
|
-
slnx = sigma(xys) { |x,
|
265
|
-
sylnx = sigma(xys) { |x,y| y * Math.log(x) }
|
266
|
-
sy = sigma(xys) { |
|
263
|
+
slnx2 = sigma(xys) { |x, _| Math.log(x) ** 2 }
|
264
|
+
slnx = sigma(xys) { |x, _| Math.log(x) }
|
265
|
+
sylnx = sigma(xys) { |x, y| y * Math.log(x) }
|
266
|
+
sy = sigma(xys) { |_, y| y }
|
267
267
|
|
268
268
|
c = n * slnx2 - slnx ** 2
|
269
269
|
b = ( n * sylnx - sy * slnx ) / c
|
@@ -272,7 +272,6 @@ module Minitest
|
|
272
272
|
return a, b, fit_error(xys) { |x| a + b * Math.log(x) }
|
273
273
|
end
|
274
274
|
|
275
|
-
|
276
275
|
##
|
277
276
|
# Fits the functional form: a + bx.
|
278
277
|
#
|
@@ -286,7 +285,7 @@ module Minitest
|
|
286
285
|
sx = sigma xs
|
287
286
|
sy = sigma ys
|
288
287
|
sx2 = sigma(xs) { |x| x ** 2 }
|
289
|
-
sxy = sigma(xys) { |x,y| x * y }
|
288
|
+
sxy = sigma(xys) { |x, y| x * y }
|
290
289
|
|
291
290
|
c = n * sx2 - sx**2
|
292
291
|
a = (sy * sx2 - sx * sxy) / c
|
@@ -310,7 +309,7 @@ module Minitest
|
|
310
309
|
slny = sigma(ys) { | y| Math.log(y) }
|
311
310
|
slnx2 = sigma(xs) { |x | Math.log(x) ** 2 }
|
312
311
|
|
313
|
-
b = (n * slnxlny - slnx * slny) / (n * slnx2 - slnx ** 2)
|
312
|
+
b = (n * slnxlny - slnx * slny) / (n * slnx2 - slnx ** 2)
|
314
313
|
a = (slny - b * slnx) / n
|
315
314
|
|
316
315
|
return Math.exp(a), b, fit_error(xys) { |x| (Math.exp(a) * (x ** b)) }
|
@@ -357,7 +356,7 @@ module Minitest
|
|
357
356
|
# See ::bench_performance_linear for an example of how to use this.
|
358
357
|
|
359
358
|
def self.bench name, &block
|
360
|
-
define_method "bench_#{name.gsub(/\W+/,
|
359
|
+
define_method "bench_#{name.gsub(/\W+/, "_")}", &block
|
361
360
|
end
|
362
361
|
|
363
362
|
##
|
@@ -4,17 +4,44 @@
|
|
4
4
|
# Please note, because of the way that expectations are implemented,
|
5
5
|
# all expectations (eg must_equal) are dependent upon a thread local
|
6
6
|
# variable +:current_spec+. If your specs rely on mixing threads into
|
7
|
-
# the specs themselves, you're better off using assertions
|
8
|
-
# example:
|
7
|
+
# the specs themselves, you're better off using assertions or the new
|
8
|
+
# _(value) wrapper. For example:
|
9
9
|
#
|
10
10
|
# it "should still work in threads" do
|
11
11
|
# my_threaded_thingy do
|
12
|
-
# (1+1).must_equal 2
|
13
|
-
# assert_equal 2, 1+1
|
12
|
+
# (1+1).must_equal 2 # bad
|
13
|
+
# assert_equal 2, 1+1 # good
|
14
|
+
# _(1 + 1).must_equal 2 # good
|
15
|
+
# value(1 + 1).must_equal 2 # good, also #expect
|
14
16
|
# end
|
15
17
|
# end
|
16
18
|
|
17
19
|
module Minitest::Expectations
|
20
|
+
|
21
|
+
##
|
22
|
+
# Returns a value monad that has all of Expectations methods
|
23
|
+
# available to it.
|
24
|
+
#
|
25
|
+
# Also aliased to #value and #expect for your aesthetic pleasure:
|
26
|
+
#
|
27
|
+
# _(1 + 1).must_equal 2
|
28
|
+
# value(1 + 1).must_equal 2
|
29
|
+
# expect(1 + 1).must_equal 2
|
30
|
+
#
|
31
|
+
# This method of expectation-based testing is preferable to
|
32
|
+
# straight-expectation methods (on Object) because it stores its
|
33
|
+
# test context, bypassing our hacky use of thread-local variables.
|
34
|
+
#
|
35
|
+
# At some point, the methods on Object will be deprecated and then
|
36
|
+
# removed.
|
37
|
+
|
38
|
+
def _ value = nil, &block
|
39
|
+
Minitest::Expectation.new block || value, self
|
40
|
+
end
|
41
|
+
|
42
|
+
alias value _
|
43
|
+
alias expect _
|
44
|
+
|
18
45
|
##
|
19
46
|
# See Minitest::Assertions#assert_empty.
|
20
47
|
#
|
data/lib/minitest/mock.rb
CHANGED
@@ -10,15 +10,17 @@ module Minitest # :nodoc:
|
|
10
10
|
class Mock
|
11
11
|
alias :__respond_to? :respond_to?
|
12
12
|
|
13
|
-
overridden_methods = %w
|
13
|
+
overridden_methods = %w[
|
14
14
|
===
|
15
15
|
inspect
|
16
|
+
instance_eval
|
17
|
+
instance_variables
|
16
18
|
object_id
|
17
19
|
public_send
|
18
20
|
respond_to_missing?
|
19
21
|
send
|
20
22
|
to_s
|
21
|
-
|
23
|
+
]
|
22
24
|
|
23
25
|
instance_methods.each do |m|
|
24
26
|
undef_method m unless overridden_methods.include?(m.to_s) || m =~ /^__/
|
@@ -26,7 +28,7 @@ module Minitest # :nodoc:
|
|
26
28
|
|
27
29
|
overridden_methods.map(&:to_sym).each do |method_id|
|
28
30
|
define_method method_id do |*args, &b|
|
29
|
-
if @expected_calls.
|
31
|
+
if @expected_calls.key? method_id then
|
30
32
|
method_missing(method_id, *args, &b)
|
31
33
|
else
|
32
34
|
super(*args, &b)
|
@@ -64,7 +66,7 @@ module Minitest # :nodoc:
|
|
64
66
|
# @mock.uses_one_string("bar") # => true
|
65
67
|
# @mock.verify # => raises MockExpectationError
|
66
68
|
|
67
|
-
def expect(name, retval, args=[], &blk)
|
69
|
+
def expect(name, retval, args = [], &blk)
|
68
70
|
name = name.to_sym
|
69
71
|
|
70
72
|
if block_given?
|
@@ -98,11 +100,11 @@ module Minitest # :nodoc:
|
|
98
100
|
msg2 = "#{msg1}, got [#{__call name, @actual_calls[name]}]"
|
99
101
|
|
100
102
|
raise MockExpectationError, msg2 if
|
101
|
-
@actual_calls.
|
103
|
+
@actual_calls.key?(name) and
|
102
104
|
not @actual_calls[name].include?(expected)
|
103
105
|
|
104
106
|
raise MockExpectationError, msg1 unless
|
105
|
-
@actual_calls.
|
107
|
+
@actual_calls.key?(name) and
|
106
108
|
@actual_calls[name].include?(expected)
|
107
109
|
end
|
108
110
|
end
|
@@ -110,7 +112,7 @@ module Minitest # :nodoc:
|
|
110
112
|
end
|
111
113
|
|
112
114
|
def method_missing(sym, *args, &block) # :nodoc:
|
113
|
-
unless @expected_calls.
|
115
|
+
unless @expected_calls.key?(sym) then
|
114
116
|
raise NoMethodError, "unmocked method %p, expected one of %p" %
|
115
117
|
[sym, @expected_calls.keys.sort_by(&:to_s)]
|
116
118
|
end
|
@@ -127,11 +129,12 @@ module Minitest # :nodoc:
|
|
127
129
|
expected_call.values_at(:args, :retval, :block)
|
128
130
|
|
129
131
|
if val_block then
|
132
|
+
# keep "verify" happy
|
133
|
+
@actual_calls[sym] << expected_call
|
134
|
+
|
130
135
|
raise MockExpectationError, "mocked method %p failed block w/ %p" %
|
131
136
|
[sym, args] unless val_block.call(*args, &block)
|
132
137
|
|
133
|
-
# keep "verify" happy
|
134
|
-
@actual_calls[sym] << expected_call
|
135
138
|
return retval
|
136
139
|
end
|
137
140
|
|
@@ -151,20 +154,23 @@ module Minitest # :nodoc:
|
|
151
154
|
|
152
155
|
@actual_calls[sym] << {
|
153
156
|
:retval => retval,
|
154
|
-
:args => expected_args.zip(args).map { |mod, a| mod === a ? mod : a }
|
157
|
+
:args => expected_args.zip(args).map { |mod, a| mod === a ? mod : a },
|
155
158
|
}
|
156
159
|
|
157
160
|
retval
|
158
161
|
end
|
159
162
|
|
160
163
|
def respond_to?(sym, include_private = false) # :nodoc:
|
161
|
-
return true if @expected_calls.
|
162
|
-
|
164
|
+
return true if @expected_calls.key? sym.to_sym
|
165
|
+
__respond_to?(sym, include_private)
|
163
166
|
end
|
164
167
|
end
|
165
168
|
end
|
166
169
|
|
167
|
-
|
170
|
+
##
|
171
|
+
# Object extensions for Minitest::Mock.
|
172
|
+
|
173
|
+
class Object
|
168
174
|
|
169
175
|
##
|
170
176
|
# Add a temporary stubbed method replacing +name+ for the duration
|
@@ -184,7 +190,7 @@ class Object # :nodoc:
|
|
184
190
|
# end
|
185
191
|
#
|
186
192
|
|
187
|
-
def stub name, val_or_callable, *block_args
|
193
|
+
def stub name, val_or_callable, *block_args
|
188
194
|
new_name = "__minitest_stub__#{name}"
|
189
195
|
|
190
196
|
metaclass = class << self; self; end
|
@@ -198,12 +204,11 @@ class Object # :nodoc:
|
|
198
204
|
metaclass.send :alias_method, new_name, name
|
199
205
|
|
200
206
|
metaclass.send :define_method, name do |*args, &blk|
|
201
|
-
|
202
207
|
ret = if val_or_callable.respond_to? :call then
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
208
|
+
val_or_callable.call(*args)
|
209
|
+
else
|
210
|
+
val_or_callable
|
211
|
+
end
|
207
212
|
|
208
213
|
blk.call(*block_args) if blk
|
209
214
|
|
@@ -216,5 +221,4 @@ class Object # :nodoc:
|
|
216
221
|
metaclass.send :alias_method, name, new_name
|
217
222
|
metaclass.send :undef_method, new_name
|
218
223
|
end
|
219
|
-
|
220
224
|
end
|
data/lib/minitest/parallel.rb
CHANGED
@@ -17,10 +17,17 @@ module Minitest
|
|
17
17
|
def initialize size
|
18
18
|
@size = size
|
19
19
|
@queue = Queue.new
|
20
|
+
@pool = nil
|
21
|
+
end
|
22
|
+
|
23
|
+
##
|
24
|
+
# Start the executor
|
25
|
+
|
26
|
+
def start
|
20
27
|
@pool = size.times.map {
|
21
28
|
Thread.new(@queue) do |queue|
|
22
29
|
Thread.current.abort_on_exception = true
|
23
|
-
while job = queue.pop
|
30
|
+
while (job = queue.pop)
|
24
31
|
klass, method, reporter = job
|
25
32
|
result = Minitest.run_one_method klass, method
|
26
33
|
reporter.synchronize { reporter.record result }
|
@@ -48,11 +55,14 @@ module Minitest
|
|
48
55
|
module Test
|
49
56
|
def _synchronize; Test.io_lock.synchronize { yield }; end # :nodoc:
|
50
57
|
|
51
|
-
module ClassMethods
|
52
|
-
def run_one_method klass, method_name, reporter
|
58
|
+
module ClassMethods # :nodoc:
|
59
|
+
def run_one_method klass, method_name, reporter
|
53
60
|
Minitest.parallel_executor << [klass, method_name, reporter]
|
54
61
|
end
|
55
|
-
|
62
|
+
|
63
|
+
def test_order
|
64
|
+
:parallel
|
65
|
+
end
|
56
66
|
end
|
57
67
|
end
|
58
68
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require "minitest"
|
2
2
|
|
3
3
|
module Minitest
|
4
|
-
def self.plugin_pride_options opts,
|
4
|
+
def self.plugin_pride_options opts, _options # :nodoc:
|
5
5
|
opts.on "-p", "--pride", "Pride. Show your testing pride!" do
|
6
6
|
PrideIO.pride!
|
7
7
|
end
|
@@ -74,7 +74,7 @@ module Minitest
|
|
74
74
|
o.map! { |s|
|
75
75
|
s.to_s.sub(/Finished/) {
|
76
76
|
@index = 0
|
77
|
-
|
77
|
+
"Fabulous run".split(//).map { |c|
|
78
78
|
pride(c)
|
79
79
|
}.join
|
80
80
|
}
|
data/lib/minitest/spec.rb
CHANGED
@@ -4,21 +4,32 @@ class Module # :nodoc:
|
|
4
4
|
def infect_an_assertion meth, new_name, dont_flip = false # :nodoc:
|
5
5
|
# warn "%-22p -> %p %p" % [meth, new_name, dont_flip]
|
6
6
|
self.class_eval <<-EOM
|
7
|
+
def #{new_name} *args
|
8
|
+
Minitest::Expectation.new(self, Minitest::Spec.current).#{new_name}(*args)
|
9
|
+
end
|
10
|
+
EOM
|
11
|
+
|
12
|
+
Minitest::Expectation.class_eval <<-EOM, __FILE__, __LINE__ + 1
|
7
13
|
def #{new_name} *args
|
8
14
|
case
|
9
15
|
when #{!!dont_flip} then
|
10
|
-
|
11
|
-
when Proc ===
|
12
|
-
|
16
|
+
ctx.#{meth}(target, *args)
|
17
|
+
when Proc === target then
|
18
|
+
ctx.#{meth}(*args, &target)
|
13
19
|
else
|
14
|
-
|
20
|
+
ctx.#{meth}(args.first, target, *args[1..-1])
|
15
21
|
end
|
16
22
|
end
|
17
23
|
EOM
|
18
24
|
end
|
19
25
|
end
|
20
26
|
|
21
|
-
|
27
|
+
Minitest::Expectation = Struct.new :target, :ctx # :nodoc:
|
28
|
+
|
29
|
+
##
|
30
|
+
# Kernel extensions for minitest
|
31
|
+
|
32
|
+
module Kernel
|
22
33
|
##
|
23
34
|
# Describe a series of expectations for a given target +desc+.
|
24
35
|
#
|
@@ -57,7 +68,7 @@ module Kernel # :nodoc:
|
|
57
68
|
def describe desc, *additional_desc, &block # :doc:
|
58
69
|
stack = Minitest::Spec.describe_stack
|
59
70
|
name = [stack.last, desc, *additional_desc].compact.join("::")
|
60
|
-
sclas = stack.last || if Class === self &&
|
71
|
+
sclas = stack.last || if Class === self && kind_of?(Minitest::Spec::DSL) then
|
61
72
|
self
|
62
73
|
else
|
63
74
|
Minitest::Spec.spec_type desc, *additional_desc
|
@@ -133,7 +144,7 @@ class Minitest::Spec < Minitest::Test
|
|
133
144
|
# spec_type("BlahController") # => Minitest::Spec::Rails
|
134
145
|
|
135
146
|
def spec_type desc, *additional
|
136
|
-
TYPES.find { |matcher,
|
147
|
+
TYPES.find { |matcher, _klass|
|
137
148
|
if matcher.respond_to? :call then
|
138
149
|
matcher.call desc, *additional
|
139
150
|
else
|
@@ -146,10 +157,7 @@ class Minitest::Spec < Minitest::Test
|
|
146
157
|
Thread.current[:describe_stack] ||= []
|
147
158
|
end
|
148
159
|
|
149
|
-
|
150
|
-
# Returns the children of this spec.
|
151
|
-
|
152
|
-
def children
|
160
|
+
def children # :nodoc:
|
153
161
|
@children ||= []
|
154
162
|
end
|
155
163
|
|
@@ -166,7 +174,7 @@ class Minitest::Spec < Minitest::Test
|
|
166
174
|
#
|
167
175
|
# Equivalent to Minitest::Test#setup.
|
168
176
|
|
169
|
-
def before
|
177
|
+
def before _type = nil, &block
|
170
178
|
define_method :setup do
|
171
179
|
super()
|
172
180
|
self.instance_eval(&block)
|
@@ -180,7 +188,7 @@ class Minitest::Spec < Minitest::Test
|
|
180
188
|
#
|
181
189
|
# Equivalent to Minitest::Test#teardown.
|
182
190
|
|
183
|
-
def after
|
191
|
+
def after _type = nil, &block
|
184
192
|
define_method :teardown do
|
185
193
|
self.instance_eval(&block)
|
186
194
|
super()
|
@@ -266,22 +274,19 @@ class Minitest::Spec < Minitest::Test
|
|
266
274
|
name # Can't alias due to 1.8.7, not sure why
|
267
275
|
end
|
268
276
|
|
269
|
-
# :
|
270
|
-
attr_reader :desc
|
277
|
+
attr_reader :desc # :nodoc:
|
271
278
|
alias :specify :it
|
272
279
|
|
273
|
-
module InstanceMethods
|
274
|
-
def before_setup
|
280
|
+
module InstanceMethods # :nodoc:
|
281
|
+
def before_setup # :nodoc:
|
275
282
|
super
|
276
283
|
Thread.current[:current_spec] = self
|
277
284
|
end
|
278
285
|
end
|
279
286
|
|
280
|
-
def self.extended obj
|
287
|
+
def self.extended obj # :nodoc:
|
281
288
|
obj.send :include, InstanceMethods
|
282
289
|
end
|
283
|
-
|
284
|
-
# :startdoc:
|
285
290
|
end
|
286
291
|
|
287
292
|
extend DSL
|
data/lib/minitest/test.rb
CHANGED
@@ -94,7 +94,7 @@ module Minitest
|
|
94
94
|
super
|
95
95
|
end
|
96
96
|
|
97
|
-
TEARDOWN_METHODS = %w
|
97
|
+
TEARDOWN_METHODS = %w[ before_teardown teardown after_teardown ] # :nodoc:
|
98
98
|
|
99
99
|
##
|
100
100
|
# Runs a single test with setup/teardown hooks.
|
@@ -202,15 +202,13 @@ module Minitest
|
|
202
202
|
end # LifecycleHooks
|
203
203
|
|
204
204
|
def capture_exceptions # :nodoc:
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
self.failures << UnexpectedError.new(e)
|
213
|
-
end
|
205
|
+
yield
|
206
|
+
rescue *PASSTHROUGH_EXCEPTIONS
|
207
|
+
raise
|
208
|
+
rescue Assertion => e
|
209
|
+
self.failures << e
|
210
|
+
rescue Exception => e
|
211
|
+
self.failures << UnexpectedError.new(e)
|
214
212
|
end
|
215
213
|
|
216
214
|
##
|