minitest 4.7.5 → 5.0.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.
@@ -1,16 +1,32 @@
1
1
  require 'minitest/unit'
2
2
  require 'minitest/spec'
3
3
 
4
- class MiniTest::Unit # :nodoc:
5
- def run_benchmarks # :nodoc:
6
- _run_anything :benchmark
7
- end
4
+ module Minitest
5
+ ##
6
+ # Subclass Benchmark to create your own benchmark runs. Methods
7
+ # starting with "bench_" get executed on a per-class.
8
+ #
9
+ # See Minitest::Assertions
8
10
 
9
- def benchmark_suite_header suite # :nodoc:
10
- "\n#{suite}\t#{suite.bench_range.join("\t")}"
11
- end
11
+ class Benchmark < Test
12
+ def self.io # :nodoc:
13
+ @io
14
+ end
15
+
16
+ def io # :nodoc:
17
+ self.class.io
18
+ end
19
+
20
+ def self.run reporter, options = {} # :nodoc:
21
+ # NOTE: this is truly horrible... but I don't see a way around this ATM.
22
+ @io = reporter.reporters.first.io
23
+ super
24
+ end
25
+
26
+ def self.runnable_methods # :nodoc:
27
+ methods_matching(/^bench_/)
28
+ end
12
29
 
13
- class TestCase
14
30
  ##
15
31
  # Returns a set of ranges stepped exponentially from +min+ to
16
32
  # +max+ by powers of +base+. Eg:
@@ -36,21 +52,6 @@ class MiniTest::Unit # :nodoc:
36
52
  r = []; (min..max).step(step) { |n| r << n }; r
37
53
  end
38
54
 
39
- ##
40
- # Returns the benchmark methods (methods that start with bench_)
41
- # for that class.
42
-
43
- def self.benchmark_methods # :nodoc:
44
- public_instance_methods(true).grep(/^bench_/).map { |m| m.to_s }.sort
45
- end
46
-
47
- ##
48
- # Returns all test suites that have benchmark methods.
49
-
50
- def self.benchmark_suites
51
- TestCase.test_suites.reject { |s| s.benchmark_methods.empty? }
52
- end
53
-
54
55
  ##
55
56
  # Specifies the ranges used for benchmarking for that class.
56
57
  # Defaults to exponential growth from 1 to 10k by powers of 10.
@@ -83,7 +84,7 @@ class MiniTest::Unit # :nodoc:
83
84
  def assert_performance validation, &work
84
85
  range = self.class.bench_range
85
86
 
86
- io.print "#{__name__}"
87
+ io.print "#{self.name}"
87
88
 
88
89
  times = []
89
90
 
@@ -341,76 +342,82 @@ class MiniTest::Unit # :nodoc:
341
342
  end
342
343
  end
343
344
 
344
- class MiniTest::Spec
345
- ##
346
- # This is used to define a new benchmark method. You usually don't
347
- # use this directly and is intended for those needing to write new
348
- # performance curve fits (eg: you need a specific polynomial fit).
349
- #
350
- # See ::bench_performance_linear for an example of how to use this.
345
+ module Minitest
346
+ class BenchSpec < Benchmark
347
+ extend Minitest::Spec::DSL
351
348
 
352
- def self.bench name, &block
353
- define_method "bench_#{name.gsub(/\W+/, '_')}", &block
354
- end
349
+ ##
350
+ # This is used to define a new benchmark method. You usually don't
351
+ # use this directly and is intended for those needing to write new
352
+ # performance curve fits (eg: you need a specific polynomial fit).
353
+ #
354
+ # See ::bench_performance_linear for an example of how to use this.
355
355
 
356
- ##
357
- # Specifies the ranges used for benchmarking for that class.
358
- #
359
- # bench_range do
360
- # bench_exp(2, 16, 2)
361
- # end
362
- #
363
- # See Unit::TestCase.bench_range for more details.
356
+ def self.bench name, &block
357
+ define_method "bench_#{name.gsub(/\W+/, '_')}", &block
358
+ end
359
+
360
+ ##
361
+ # Specifies the ranges used for benchmarking for that class.
362
+ #
363
+ # bench_range do
364
+ # bench_exp(2, 16, 2)
365
+ # end
366
+ #
367
+ # See Minitest::Benchmark#bench_range for more details.
364
368
 
365
- def self.bench_range &block
366
- return super unless block
369
+ def self.bench_range &block
370
+ return super unless block
367
371
 
368
- meta = (class << self; self; end)
369
- meta.send :define_method, "bench_range", &block
370
- end
372
+ meta = (class << self; self; end)
373
+ meta.send :define_method, "bench_range", &block
374
+ end
371
375
 
372
- ##
373
- # Create a benchmark that verifies that the performance is linear.
374
- #
375
- # describe "my class" do
376
- # bench_performance_linear "fast_algorithm", 0.9999 do |n|
377
- # @obj.fast_algorithm(n)
378
- # end
379
- # end
380
-
381
- def self.bench_performance_linear name, threshold = 0.99, &work
382
- bench name do
383
- assert_performance_linear threshold, &work
376
+ ##
377
+ # Create a benchmark that verifies that the performance is linear.
378
+ #
379
+ # describe "my class" do
380
+ # bench_performance_linear "fast_algorithm", 0.9999 do |n|
381
+ # @obj.fast_algorithm(n)
382
+ # end
383
+ # end
384
+
385
+ def self.bench_performance_linear name, threshold = 0.99, &work
386
+ bench name do
387
+ assert_performance_linear threshold, &work
388
+ end
384
389
  end
385
- end
386
390
 
387
- ##
388
- # Create a benchmark that verifies that the performance is constant.
389
- #
390
- # describe "my class" do
391
- # bench_performance_constant "zoom_algorithm!" do |n|
392
- # @obj.zoom_algorithm!(n)
393
- # end
394
- # end
395
-
396
- def self.bench_performance_constant name, threshold = 0.99, &work
397
- bench name do
398
- assert_performance_constant threshold, &work
391
+ ##
392
+ # Create a benchmark that verifies that the performance is constant.
393
+ #
394
+ # describe "my class" do
395
+ # bench_performance_constant "zoom_algorithm!" do |n|
396
+ # @obj.zoom_algorithm!(n)
397
+ # end
398
+ # end
399
+
400
+ def self.bench_performance_constant name, threshold = 0.99, &work
401
+ bench name do
402
+ assert_performance_constant threshold, &work
403
+ end
399
404
  end
400
- end
401
405
 
402
- ##
403
- # Create a benchmark that verifies that the performance is exponential.
404
- #
405
- # describe "my class" do
406
- # bench_performance_exponential "algorithm" do |n|
407
- # @obj.algorithm(n)
408
- # end
409
- # end
410
-
411
- def self.bench_performance_exponential name, threshold = 0.99, &work
412
- bench name do
413
- assert_performance_exponential threshold, &work
406
+ ##
407
+ # Create a benchmark that verifies that the performance is exponential.
408
+ #
409
+ # describe "my class" do
410
+ # bench_performance_exponential "algorithm" do |n|
411
+ # @obj.algorithm(n)
412
+ # end
413
+ # end
414
+
415
+ def self.bench_performance_exponential name, threshold = 0.99, &work
416
+ bench name do
417
+ assert_performance_exponential threshold, &work
418
+ end
414
419
  end
415
420
  end
421
+
422
+ Minitest::Spec.register_spec_type(/Bench(mark)?$/, Minitest::BenchSpec)
416
423
  end
@@ -0,0 +1,281 @@
1
+ ##
2
+ # It's where you hide your "assertions".
3
+ #
4
+ # Please note, because of the way that expectations are implemented,
5
+ # all expectations (eg must_equal) are dependent upon a thread local
6
+ # variable +:current_spec+. If your specs rely on mixing threads into
7
+ # the specs themselves, you're better off using assertions. For
8
+ # example:
9
+ #
10
+ # it "should still work in threads" do
11
+ # my_threaded_thingy do
12
+ # (1+1).must_equal 2 # bad
13
+ # assert_equal 2, 1+1 # good
14
+ # end
15
+ # end
16
+
17
+ module Minitest::Expectations
18
+ ##
19
+ # See Minitest::Assertions#assert_empty.
20
+ #
21
+ # collection.must_be_empty
22
+ #
23
+ # :method: must_be_empty
24
+
25
+ infect_an_assertion :assert_empty, :must_be_empty, :unary
26
+
27
+ ##
28
+ # See Minitest::Assertions#assert_equal
29
+ #
30
+ # a.must_equal b
31
+ #
32
+ # :method: must_equal
33
+
34
+ infect_an_assertion :assert_equal, :must_equal
35
+
36
+ ##
37
+ # See Minitest::Assertions#assert_in_delta
38
+ #
39
+ # n.must_be_close_to m [, delta]
40
+ #
41
+ # :method: must_be_close_to
42
+
43
+ infect_an_assertion :assert_in_delta, :must_be_close_to
44
+
45
+ alias :must_be_within_delta :must_be_close_to # :nodoc:
46
+
47
+ ##
48
+ # See Minitest::Assertions#assert_in_epsilon
49
+ #
50
+ # n.must_be_within_epsilon m [, epsilon]
51
+ #
52
+ # :method: must_be_within_epsilon
53
+
54
+ infect_an_assertion :assert_in_epsilon, :must_be_within_epsilon
55
+
56
+ ##
57
+ # See Minitest::Assertions#assert_includes
58
+ #
59
+ # collection.must_include obj
60
+ #
61
+ # :method: must_include
62
+
63
+ infect_an_assertion :assert_includes, :must_include, :reverse
64
+
65
+ ##
66
+ # See Minitest::Assertions#assert_instance_of
67
+ #
68
+ # obj.must_be_instance_of klass
69
+ #
70
+ # :method: must_be_instance_of
71
+
72
+ infect_an_assertion :assert_instance_of, :must_be_instance_of
73
+
74
+ ##
75
+ # See Minitest::Assertions#assert_kind_of
76
+ #
77
+ # obj.must_be_kind_of mod
78
+ #
79
+ # :method: must_be_kind_of
80
+
81
+ infect_an_assertion :assert_kind_of, :must_be_kind_of
82
+
83
+ ##
84
+ # See Minitest::Assertions#assert_match
85
+ #
86
+ # a.must_match b
87
+ #
88
+ # :method: must_match
89
+
90
+ infect_an_assertion :assert_match, :must_match
91
+
92
+ ##
93
+ # See Minitest::Assertions#assert_nil
94
+ #
95
+ # obj.must_be_nil
96
+ #
97
+ # :method: must_be_nil
98
+
99
+ infect_an_assertion :assert_nil, :must_be_nil, :unary
100
+
101
+ ##
102
+ # See Minitest::Assertions#assert_operator
103
+ #
104
+ # n.must_be :<=, 42
105
+ #
106
+ # This can also do predicates:
107
+ #
108
+ # str.must_be :empty?
109
+ #
110
+ # :method: must_be
111
+
112
+ infect_an_assertion :assert_operator, :must_be, :reverse
113
+
114
+ ##
115
+ # See Minitest::Assertions#assert_output
116
+ #
117
+ # proc { ... }.must_output out_or_nil [, err]
118
+ #
119
+ # :method: must_output
120
+
121
+ infect_an_assertion :assert_output, :must_output
122
+
123
+ ##
124
+ # See Minitest::Assertions#assert_raises
125
+ #
126
+ # proc { ... }.must_raise exception
127
+ #
128
+ # :method: must_raise
129
+
130
+ infect_an_assertion :assert_raises, :must_raise
131
+
132
+ ##
133
+ # See Minitest::Assertions#assert_respond_to
134
+ #
135
+ # obj.must_respond_to msg
136
+ #
137
+ # :method: must_respond_to
138
+
139
+ infect_an_assertion :assert_respond_to, :must_respond_to, :reverse
140
+
141
+ ##
142
+ # See Minitest::Assertions#assert_same
143
+ #
144
+ # a.must_be_same_as b
145
+ #
146
+ # :method: must_be_same_as
147
+
148
+ infect_an_assertion :assert_same, :must_be_same_as
149
+
150
+ ##
151
+ # See Minitest::Assertions#assert_silent
152
+ #
153
+ # proc { ... }.must_be_silent
154
+ #
155
+ # :method: must_be_silent
156
+
157
+ infect_an_assertion :assert_silent, :must_be_silent
158
+
159
+ ##
160
+ # See Minitest::Assertions#assert_throws
161
+ #
162
+ # proc { ... }.must_throw sym
163
+ #
164
+ # :method: must_throw
165
+
166
+ infect_an_assertion :assert_throws, :must_throw
167
+
168
+ ##
169
+ # See Minitest::Assertions#refute_empty
170
+ #
171
+ # collection.wont_be_empty
172
+ #
173
+ # :method: wont_be_empty
174
+
175
+ infect_an_assertion :refute_empty, :wont_be_empty, :unary
176
+
177
+ ##
178
+ # See Minitest::Assertions#refute_equal
179
+ #
180
+ # a.wont_equal b
181
+ #
182
+ # :method: wont_equal
183
+
184
+ infect_an_assertion :refute_equal, :wont_equal
185
+
186
+ ##
187
+ # See Minitest::Assertions#refute_in_delta
188
+ #
189
+ # n.wont_be_close_to m [, delta]
190
+ #
191
+ # :method: wont_be_close_to
192
+
193
+ infect_an_assertion :refute_in_delta, :wont_be_close_to
194
+
195
+ alias :wont_be_within_delta :wont_be_close_to # :nodoc:
196
+
197
+ ##
198
+ # See Minitest::Assertions#refute_in_epsilon
199
+ #
200
+ # n.wont_be_within_epsilon m [, epsilon]
201
+ #
202
+ # :method: wont_be_within_epsilon
203
+
204
+ infect_an_assertion :refute_in_epsilon, :wont_be_within_epsilon
205
+
206
+ ##
207
+ # See Minitest::Assertions#refute_includes
208
+ #
209
+ # collection.wont_include obj
210
+ #
211
+ # :method: wont_include
212
+
213
+ infect_an_assertion :refute_includes, :wont_include, :reverse
214
+
215
+ ##
216
+ # See Minitest::Assertions#refute_instance_of
217
+ #
218
+ # obj.wont_be_instance_of klass
219
+ #
220
+ # :method: wont_be_instance_of
221
+
222
+ infect_an_assertion :refute_instance_of, :wont_be_instance_of
223
+
224
+ ##
225
+ # See Minitest::Assertions#refute_kind_of
226
+ #
227
+ # obj.wont_be_kind_of mod
228
+ #
229
+ # :method: wont_be_kind_of
230
+
231
+ infect_an_assertion :refute_kind_of, :wont_be_kind_of
232
+
233
+ ##
234
+ # See Minitest::Assertions#refute_match
235
+ #
236
+ # a.wont_match b
237
+ #
238
+ # :method: wont_match
239
+
240
+ infect_an_assertion :refute_match, :wont_match
241
+
242
+ ##
243
+ # See Minitest::Assertions#refute_nil
244
+ #
245
+ # obj.wont_be_nil
246
+ #
247
+ # :method: wont_be_nil
248
+
249
+ infect_an_assertion :refute_nil, :wont_be_nil, :unary
250
+
251
+ ##
252
+ # See Minitest::Assertions#refute_operator
253
+ #
254
+ # n.wont_be :<=, 42
255
+ #
256
+ # This can also do predicates:
257
+ #
258
+ # str.wont_be :empty?
259
+ #
260
+ # :method: wont_be
261
+
262
+ infect_an_assertion :refute_operator, :wont_be, :reverse
263
+
264
+ ##
265
+ # See Minitest::Assertions#refute_respond_to
266
+ #
267
+ # obj.wont_respond_to msg
268
+ #
269
+ # :method: wont_respond_to
270
+
271
+ infect_an_assertion :refute_respond_to, :wont_respond_to, :reverse
272
+
273
+ ##
274
+ # See Minitest::Assertions#refute_same
275
+ #
276
+ # a.wont_be_same_as b
277
+ #
278
+ # :method: wont_be_same_as
279
+
280
+ infect_an_assertion :refute_same, :wont_be_same_as
281
+ end
data/lib/minitest/hell.rb CHANGED
@@ -1,13 +1,11 @@
1
1
  require "minitest/parallel_each"
2
2
 
3
- # :stopdoc:
4
- class Minitest::Unit::TestCase
3
+ class Minitest::Test
5
4
  class << self
6
- alias :old_test_order :test_order
5
+ alias :old_test_order :test_order # :nodoc:
7
6
 
8
- def test_order
7
+ def test_order # :nodoc:
9
8
  :parallel
10
9
  end
11
10
  end
12
11
  end
13
- # :startdoc:
data/lib/minitest/mock.rb CHANGED
@@ -1,20 +1,37 @@
1
1
  class MockExpectationError < StandardError; end # :nodoc:
2
2
 
3
- ##
4
- # A simple and clean mock object framework.
5
-
6
- module MiniTest # :nodoc:
3
+ module Minitest # :nodoc:
7
4
 
8
5
  ##
6
+ # A simple and clean mock object framework.
7
+ #
9
8
  # All mock objects are an instance of Mock
10
9
 
11
10
  class Mock
12
11
  alias :__respond_to? :respond_to?
13
12
 
14
- skip_methods = %w(object_id respond_to_missing? inspect === to_s)
13
+ overridden_methods = %w(
14
+ ===
15
+ inspect
16
+ object_id
17
+ public_send
18
+ respond_to_missing?
19
+ send
20
+ to_s
21
+ )
15
22
 
16
23
  instance_methods.each do |m|
17
- undef_method m unless skip_methods.include?(m.to_s) || m =~ /^__/
24
+ undef_method m unless overridden_methods.include?(m.to_s) || m =~ /^__/
25
+ end
26
+
27
+ overridden_methods.map(&:to_sym).each do |method_id|
28
+ define_method method_id do |*args, &b|
29
+ if @expected_calls.has_key? method_id then
30
+ method_missing(method_id, *args, &b)
31
+ else
32
+ super(*args, &b)
33
+ end
34
+ end
18
35
  end
19
36
 
20
37
  def initialize # :nodoc:
@@ -43,11 +60,13 @@ module MiniTest # :nodoc:
43
60
  # @mock.uses_any_string("foo") # => true
44
61
  # @mock.verify # => true
45
62
  #
46
- # @mock.expect(:uses_one_string, true, ["foo"]
63
+ # @mock.expect(:uses_one_string, true, ["foo"])
47
64
  # @mock.uses_one_string("bar") # => true
48
65
  # @mock.verify # => raises MockExpectationError
49
66
 
50
67
  def expect(name, retval, args=[], &blk)
68
+ name = name.to_sym
69
+
51
70
  if block_given?
52
71
  raise ArgumentError, "args ignored when block given" unless args.empty?
53
72
  @expected_calls[name] << { :retval => retval, :block => blk }
@@ -139,7 +158,7 @@ module MiniTest # :nodoc:
139
158
  end
140
159
 
141
160
  def respond_to?(sym, include_private = false) # :nodoc:
142
- return true if @expected_calls.has_key?(sym.to_sym)
161
+ return true if @expected_calls.has_key? sym.to_sym
143
162
  return __respond_to?(sym, include_private)
144
163
  end
145
164
  end
@@ -151,8 +170,9 @@ class Object # :nodoc:
151
170
  # Add a temporary stubbed method replacing +name+ for the duration
152
171
  # of the +block+. If +val_or_callable+ responds to #call, then it
153
172
  # returns the result of calling it, otherwise returns the value
154
- # as-is. Cleans up the stub at the end of the +block+. The method
155
- # +name+ must exist before stubbing.
173
+ # as-is. If stubbed method yields a block, +block_args+ will be
174
+ # passed along. Cleans up the stub at the end of the +block+. The
175
+ # method +name+ must exist before stubbing.
156
176
  #
157
177
  # def test_stale_eh
158
178
  # obj_under_test = Something.new
@@ -162,8 +182,9 @@ class Object # :nodoc:
162
182
  # assert obj_under_test.stale?
163
183
  # end
164
184
  # end
185
+ #
165
186
 
166
- def stub name, val_or_callable, &block
187
+ def stub name, val_or_callable, *block_args, &block
167
188
  new_name = "__minitest_stub__#{name}"
168
189
 
169
190
  metaclass = class << self; self; end
@@ -176,12 +197,17 @@ class Object # :nodoc:
176
197
 
177
198
  metaclass.send :alias_method, new_name, name
178
199
 
179
- metaclass.send :define_method, name do |*args|
180
- if val_or_callable.respond_to? :call then
200
+ metaclass.send :define_method, name do |*args, &blk|
201
+
202
+ ret = if val_or_callable.respond_to? :call then
181
203
  val_or_callable.call(*args)
182
204
  else
183
205
  val_or_callable
184
206
  end
207
+
208
+ blk.call(*block_args) if blk
209
+
210
+ ret
185
211
  end
186
212
 
187
213
  yield self
@@ -190,4 +216,5 @@ class Object # :nodoc:
190
216
  metaclass.send :alias_method, name, new_name
191
217
  metaclass.send :undef_method, new_name
192
218
  end
219
+
193
220
  end