spec 5.0.14

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +7 -0
  2. data/.autotest +34 -0
  3. data/.gitignore +3 -0
  4. data/History.txt +911 -0
  5. data/Manifest.txt +26 -0
  6. data/README.txt +497 -0
  7. data/Rakefile +214 -0
  8. data/design_rationale.rb +52 -0
  9. data/lib/hoe/minitest.rb +26 -0
  10. data/lib/minitest/assertions.rb +649 -0
  11. data/lib/minitest/autorun.rb +12 -0
  12. data/lib/minitest/benchmark.rb +423 -0
  13. data/lib/minitest/expectations.rb +268 -0
  14. data/lib/minitest/hell.rb +11 -0
  15. data/lib/minitest/mock.rb +220 -0
  16. data/lib/minitest/parallel_each.rb +120 -0
  17. data/lib/minitest/pride.rb +4 -0
  18. data/lib/minitest/pride_plugin.rb +143 -0
  19. data/lib/minitest/spec.rb +292 -0
  20. data/lib/minitest/test.rb +272 -0
  21. data/lib/minitest/unit.rb +45 -0
  22. data/lib/minitest.rb +839 -0
  23. data/lib/spec.rb +3 -0
  24. data/readme.md +7 -0
  25. data/release_notes.md +49 -0
  26. data/spec.gemspec +36 -0
  27. data/test/manual/appium.rb +14 -0
  28. data/test/manual/appium_after_last.rb +24 -0
  29. data/test/manual/appium_before_first.rb +23 -0
  30. data/test/manual/assert.rb +61 -0
  31. data/test/manual/before_first_0.rb +27 -0
  32. data/test/manual/before_first_1.rb +29 -0
  33. data/test/manual/debug.rb +37 -0
  34. data/test/manual/do_end.rb +31 -0
  35. data/test/manual/raise.rb +61 -0
  36. data/test/manual/run2.rb +74 -0
  37. data/test/manual/run3.rb +91 -0
  38. data/test/manual/setup.rb +13 -0
  39. data/test/manual/simple.rb +19 -0
  40. data/test/manual/simple2.rb +20 -0
  41. data/test/manual/t.rb +11 -0
  42. data/test/manual/trace.rb +19 -0
  43. data/test/manual/trace2.rb +15 -0
  44. data/test/minitest/metametameta.rb +78 -0
  45. data/test/minitest/test_helper.rb +20 -0
  46. data/test/minitest/test_minitest_benchmark.rb +131 -0
  47. data/test/minitest/test_minitest_mock.rb +490 -0
  48. data/test/minitest/test_minitest_reporter.rb +270 -0
  49. data/test/minitest/test_minitest_spec.rb +794 -0
  50. data/test/minitest/test_minitest_unit.rb +1846 -0
  51. metadata +147 -0
@@ -0,0 +1,78 @@
1
+ require 'tempfile'
2
+ require 'stringio'
3
+ require 'minitest/autorun'
4
+
5
+ class Minitest::Test
6
+ def clean s
7
+ s.gsub(/^ {6}/, '')
8
+ end
9
+ end
10
+
11
+ class MetaMetaMetaTestCase < Minitest::Test
12
+ attr_accessor :reporter, :output, :tu
13
+
14
+ def run_tu_with_fresh_reporter flags = %w[--seed 42]
15
+ options = Minitest.process_args flags
16
+
17
+ @output = StringIO.new("")
18
+
19
+ self.reporter = Minitest::CompositeReporter.new
20
+ reporter << Minitest::SummaryReporter.new(@output, options)
21
+ reporter << Minitest::ProgressReporter.new(@output, options)
22
+
23
+ reporter.start
24
+
25
+ @tus ||= [@tu]
26
+ @tus.each do |tu|
27
+ Minitest::Runnable.runnables.delete tu
28
+
29
+ tu.run reporter, options
30
+ end
31
+
32
+ reporter.report
33
+ end
34
+
35
+ def first_reporter
36
+ reporter.reporters.first
37
+ end
38
+
39
+ def assert_report expected, flags = %w[--seed 42]
40
+ header = clean <<-EOM
41
+ Run options: #{flags.map { |s| s =~ /\|/ ? s.inspect : s }.join " "}
42
+
43
+ # Running:
44
+
45
+ EOM
46
+
47
+ run_tu_with_fresh_reporter flags
48
+
49
+ output = normalize_output @output.string.dup
50
+
51
+ assert_equal header + expected, output
52
+ end
53
+
54
+ def normalize_output output
55
+ output.sub!(/Finished in .*/, "Finished in 0.00")
56
+ output.sub!(/Loaded suite .*/, 'Loaded suite blah')
57
+
58
+ output.gsub!(/ = \d+.\d\d s = /, ' = 0.00 s = ')
59
+ output.gsub!(/0x[A-Fa-f0-9]+/, '0xXXX')
60
+
61
+ if windows? then
62
+ output.gsub!(/\[(?:[A-Za-z]:)?[^\]:]+:\d+\]/, '[FILE:LINE]')
63
+ output.gsub!(/^(\s+)(?:[A-Za-z]:)?[^:]+:\d+:in/, '\1FILE:LINE:in')
64
+ else
65
+ output.gsub!(/\[[^\]:]+:\d+\]/, '[FILE:LINE]')
66
+ output.gsub!(/^(\s+)[^:]+:\d+:in/, '\1FILE:LINE:in')
67
+ end
68
+
69
+ output
70
+ end
71
+
72
+ def setup
73
+ super
74
+ srand 42
75
+ Minitest::Test.reset
76
+ @tu = nil
77
+ end
78
+ end
@@ -0,0 +1,20 @@
1
+ # Disable fail on first failure
2
+ class Minitest::Runnable
3
+ def self.check_failures result, reporter
4
+ end
5
+ end
6
+
7
+ # Restore summary reporter's output
8
+ class Minitest::SummaryReporter < Minitest::StatisticsReporter
9
+ def start # :nodoc:
10
+ super
11
+
12
+ io.puts "Run options: #{options[:args]}"
13
+ io.puts
14
+ io.puts "# Running:"
15
+ io.puts
16
+
17
+ self.sync = io.respond_to? :"sync=" # stupid emacs
18
+ self.old_sync, io.sync = io.sync, true if self.sync
19
+ end
20
+ end
@@ -0,0 +1,131 @@
1
+ require 'minitest/autorun'
2
+ require 'minitest/benchmark'
3
+ require 'minitest/test_helper'
4
+
5
+ ##
6
+ # Used to verify data:
7
+ # http://www.wolframalpha.com/examples/RegressionAnalysis.html
8
+
9
+ class TestMinitestBenchmark < Minitest::Test
10
+ def test_cls_bench_exp
11
+ assert_equal [2, 4, 8, 16, 32], Minitest::Benchmark.bench_exp(2, 32, 2)
12
+ end
13
+
14
+ def test_cls_bench_linear
15
+ assert_equal [2, 4, 6, 8, 10], Minitest::Benchmark.bench_linear(2, 10, 2)
16
+ end
17
+
18
+ def test_cls_runnable_methods
19
+ assert_equal [], Minitest::Benchmark.runnable_methods
20
+
21
+ c = Class.new(Minitest::Benchmark) do
22
+ def bench_blah
23
+ end
24
+ end
25
+
26
+ assert_equal ["bench_blah"], c.runnable_methods
27
+ end
28
+
29
+ def test_cls_bench_range
30
+ assert_equal [1, 10, 100, 1_000, 10_000], Minitest::Benchmark.bench_range
31
+ end
32
+
33
+ def test_fit_exponential_clean
34
+ x = [1.0, 2.0, 3.0, 4.0, 5.0]
35
+ y = x.map { |n| 1.1 * Math.exp(2.1 * n) }
36
+
37
+ assert_fit :exponential, x, y, 1.0, 1.1, 2.1
38
+ end
39
+
40
+ def test_fit_exponential_noisy
41
+ x = [1.0, 1.9, 2.6, 3.4, 5.0]
42
+ y = [12, 10, 8.2, 6.9, 5.9]
43
+
44
+ # verified with Numbers and R
45
+ assert_fit :exponential, x, y, 0.95, 13.81148, -0.1820
46
+ end
47
+
48
+ def test_fit_logarithmic_clean
49
+ x = [1.0, 2.0, 3.0, 4.0, 5.0]
50
+ y = x.map { |n| 1.1 + 2.1 * Math.log(n) }
51
+
52
+ assert_fit :logarithmic, x, y, 1.0, 1.1, 2.1
53
+ end
54
+
55
+ def test_fit_logarithmic_noisy
56
+ x = [1.0, 2.0, 3.0, 4.0, 5.0]
57
+ # Generated with
58
+ # y = x.map { |n| jitter = 0.999 + 0.002 * rand; (Math.log(n) ) * jitter }
59
+ y = [0.0, 0.6935, 1.0995, 1.3873, 1.6097]
60
+
61
+ assert_fit :logarithmic, x, y, 0.95, 0, 1
62
+ end
63
+
64
+ def test_fit_constant_clean
65
+ x = (1..5).to_a
66
+ y = [5.0, 5.0, 5.0, 5.0, 5.0]
67
+
68
+ assert_fit :linear, x, y, nil, 5.0, 0
69
+ end
70
+
71
+ def test_fit_constant_noisy
72
+ x = (1..5).to_a
73
+ y = [1.0, 1.2, 1.0, 0.8, 1.0]
74
+
75
+ # verified in numbers and R
76
+ assert_fit :linear, x, y, nil, 1.12, -0.04
77
+ end
78
+
79
+ def test_fit_linear_clean
80
+ # y = m * x + b where m = 2.2, b = 3.1
81
+ x = (1..5).to_a
82
+ y = x.map { |n| 2.2 * n + 3.1 }
83
+
84
+ assert_fit :linear, x, y, 1.0, 3.1, 2.2
85
+ end
86
+
87
+ def test_fit_linear_noisy
88
+ x = [ 60, 61, 62, 63, 65]
89
+ y = [3.1, 3.6, 3.8, 4.0, 4.1]
90
+
91
+ # verified in numbers and R
92
+ assert_fit :linear, x, y, 0.8315, -7.9635, 0.1878
93
+ end
94
+
95
+ def test_fit_power_clean
96
+ # y = A x ** B, where B = b and A = e ** a
97
+ # if, A = 1, B = 2, then
98
+
99
+ x = [1.0, 2.0, 3.0, 4.0, 5.0]
100
+ y = [1.0, 4.0, 9.0, 16.0, 25.0]
101
+
102
+ assert_fit :power, x, y, 1.0, 1.0, 2.0
103
+ end
104
+
105
+ def test_fit_power_noisy
106
+ # from www.engr.uidaho.edu/thompson/courses/ME330/lecture/least_squares.html
107
+ x = [10, 12, 15, 17, 20, 22, 25, 27, 30, 32, 35]
108
+ y = [95, 105, 125, 141, 173, 200, 253, 298, 385, 459, 602]
109
+
110
+ # verified in numbers
111
+ assert_fit :power, x, y, 0.90, 2.6217, 1.4556
112
+
113
+ # income to % of households below income amount
114
+ # http://library.wolfram.com/infocenter/Conferences/6461/PowerLaws.nb
115
+ x = [15000, 25000, 35000, 50000, 75000, 100000]
116
+ y = [0.154, 0.283, 0.402, 0.55, 0.733, 0.843]
117
+
118
+ # verified in numbers
119
+ assert_fit :power, x, y, 0.96, 3.119e-5, 0.8959
120
+ end
121
+
122
+ def assert_fit msg, x, y, fit, exp_a, exp_b
123
+ bench = Minitest::Benchmark.new :blah
124
+
125
+ a, b, rr = bench.send "fit_#{msg}", x, y
126
+
127
+ assert_operator rr, :>=, fit if fit
128
+ assert_in_delta exp_a, a
129
+ assert_in_delta exp_b, b
130
+ end
131
+ end
@@ -0,0 +1,490 @@
1
+ require 'minitest/autorun'
2
+ require 'minitest/test_helper'
3
+
4
+ class TestMinitestMock < Minitest::Test
5
+ parallelize_me!
6
+
7
+ def setup
8
+ @mock = Minitest::Mock.new.expect(:foo, nil)
9
+ @mock.expect(:meaning_of_life, 42)
10
+ end
11
+
12
+ def test_create_stub_method
13
+ assert_nil @mock.foo
14
+ end
15
+
16
+ def test_allow_return_value_specification
17
+ assert_equal 42, @mock.meaning_of_life
18
+ end
19
+
20
+ def test_blow_up_if_not_called
21
+ @mock.foo
22
+
23
+ util_verify_bad "expected meaning_of_life() => 42, got []"
24
+ end
25
+
26
+ def test_not_blow_up_if_everything_called
27
+ @mock.foo
28
+ @mock.meaning_of_life
29
+
30
+ assert @mock.verify
31
+ end
32
+
33
+ def test_allow_expectations_to_be_added_after_creation
34
+ @mock.expect(:bar, true)
35
+ assert @mock.bar
36
+ end
37
+
38
+ def test_not_verify_if_new_expected_method_is_not_called
39
+ @mock.foo
40
+ @mock.meaning_of_life
41
+ @mock.expect(:bar, true)
42
+
43
+ util_verify_bad "expected bar() => true, got []"
44
+ end
45
+
46
+ def test_blow_up_on_wrong_number_of_arguments
47
+ @mock.foo
48
+ @mock.meaning_of_life
49
+ @mock.expect(:sum, 3, [1, 2])
50
+
51
+ e = assert_raises ArgumentError do
52
+ @mock.sum
53
+ end
54
+
55
+ assert_equal "mocked method :sum expects 2 arguments, got 0", e.message
56
+ end
57
+
58
+ def test_return_mock_does_not_raise
59
+ retval = Minitest::Mock.new
60
+ mock = Minitest::Mock.new
61
+ mock.expect(:foo, retval)
62
+ mock.foo
63
+
64
+ assert mock.verify
65
+ end
66
+
67
+ def test_mock_args_does_not_raise
68
+ skip "non-opaque use of ==" if maglev?
69
+
70
+ arg = Minitest::Mock.new
71
+ mock = Minitest::Mock.new
72
+ mock.expect(:foo, nil, [arg])
73
+ mock.foo(arg)
74
+
75
+ assert mock.verify
76
+ end
77
+
78
+ def test_set_expectation_on_special_methods
79
+ mock = Minitest::Mock.new
80
+
81
+ mock.expect :object_id, "received object_id"
82
+ assert_equal "received object_id", mock.object_id
83
+
84
+ mock.expect :respond_to_missing?, "received respond_to_missing?"
85
+ assert_equal "received respond_to_missing?", mock.respond_to_missing?
86
+
87
+ mock.expect :===, "received ==="
88
+ assert_equal "received ===", mock.===
89
+
90
+ mock.expect :inspect, "received inspect"
91
+ assert_equal "received inspect", mock.inspect
92
+
93
+ mock.expect :to_s, "received to_s"
94
+ assert_equal "received to_s", mock.to_s
95
+
96
+ mock.expect :public_send, "received public_send"
97
+ assert_equal "received public_send", mock.public_send
98
+
99
+ mock.expect :send, "received send"
100
+ assert_equal "received send", mock.send
101
+
102
+ assert mock.verify
103
+ end
104
+
105
+ def test_expectations_can_be_satisfied_via_send
106
+ @mock.send :foo
107
+ @mock.send :meaning_of_life
108
+
109
+ assert @mock.verify
110
+ end
111
+
112
+ def test_expectations_can_be_satisfied_via_public_send
113
+ skip if RUBY_VERSION < "1.9"
114
+
115
+ @mock.public_send :foo
116
+ @mock.public_send :meaning_of_life
117
+
118
+ assert @mock.verify
119
+ end
120
+
121
+ def test_blow_up_on_wrong_arguments
122
+ @mock.foo
123
+ @mock.meaning_of_life
124
+ @mock.expect(:sum, 3, [1, 2])
125
+
126
+ e = assert_raises MockExpectationError do
127
+ @mock.sum(2, 4)
128
+ end
129
+
130
+ exp = "mocked method :sum called with unexpected arguments [2, 4]"
131
+ assert_equal exp, e.message
132
+ end
133
+
134
+ def test_expect_with_non_array_args
135
+ e = assert_raises ArgumentError do
136
+ @mock.expect :blah, 3, false
137
+ end
138
+
139
+ assert_equal "args must be an array", e.message
140
+ end
141
+
142
+ def test_respond_appropriately
143
+ assert @mock.respond_to?(:foo)
144
+ assert @mock.respond_to?(:foo, true)
145
+ assert @mock.respond_to?('foo')
146
+ assert !@mock.respond_to?(:bar)
147
+ end
148
+
149
+ def test_no_method_error_on_unexpected_methods
150
+ e = assert_raises NoMethodError do
151
+ @mock.bar
152
+ end
153
+
154
+ expected = "unmocked method :bar, expected one of [:foo, :meaning_of_life]"
155
+
156
+ assert_equal expected, e.message
157
+ end
158
+
159
+ def test_assign_per_mock_return_values
160
+ a = Minitest::Mock.new
161
+ b = Minitest::Mock.new
162
+
163
+ a.expect(:foo, :a)
164
+ b.expect(:foo, :b)
165
+
166
+ assert_equal :a, a.foo
167
+ assert_equal :b, b.foo
168
+ end
169
+
170
+ def test_do_not_create_stub_method_on_new_mocks
171
+ a = Minitest::Mock.new
172
+ a.expect(:foo, :a)
173
+
174
+ assert !Minitest::Mock.new.respond_to?(:foo)
175
+ end
176
+
177
+ def test_mock_is_a_blank_slate
178
+ @mock.expect :kind_of?, true, [Fixnum]
179
+ @mock.expect :==, true, [1]
180
+
181
+ assert @mock.kind_of?(Fixnum), "didn't mock :kind_of\?"
182
+ assert @mock == 1, "didn't mock :=="
183
+ end
184
+
185
+ def test_verify_allows_called_args_to_be_loosely_specified
186
+ mock = Minitest::Mock.new
187
+ mock.expect :loose_expectation, true, [Integer]
188
+ mock.loose_expectation 1
189
+
190
+ assert mock.verify
191
+ end
192
+
193
+ def test_verify_raises_with_strict_args
194
+ mock = Minitest::Mock.new
195
+ mock.expect :strict_expectation, true, [2]
196
+
197
+ e = assert_raises MockExpectationError do
198
+ mock.strict_expectation 1
199
+ end
200
+
201
+ exp = "mocked method :strict_expectation called with unexpected arguments [1]"
202
+ assert_equal exp, e.message
203
+ end
204
+
205
+ def test_method_missing_empty
206
+ mock = Minitest::Mock.new
207
+
208
+ mock.expect :a, nil
209
+
210
+ mock.a
211
+
212
+ e = assert_raises MockExpectationError do
213
+ mock.a
214
+ end
215
+
216
+ assert_equal "No more expects available for :a: []", e.message
217
+ end
218
+
219
+ def test_same_method_expects_are_verified_when_all_called
220
+ mock = Minitest::Mock.new
221
+ mock.expect :foo, nil, [:bar]
222
+ mock.expect :foo, nil, [:baz]
223
+
224
+ mock.foo :bar
225
+ mock.foo :baz
226
+
227
+ assert mock.verify
228
+ end
229
+
230
+ def test_same_method_expects_blow_up_when_not_all_called
231
+ mock = Minitest::Mock.new
232
+ mock.expect :foo, nil, [:bar]
233
+ mock.expect :foo, nil, [:baz]
234
+
235
+ mock.foo :bar
236
+
237
+ e = assert_raises(MockExpectationError) { mock.verify }
238
+
239
+ exp = "expected foo(:baz) => nil, got [foo(:bar) => nil]"
240
+
241
+ assert_equal exp, e.message
242
+ end
243
+
244
+ def test_verify_passes_when_mock_block_returns_true
245
+ mock = Minitest::Mock.new
246
+ mock.expect :foo, nil do
247
+ true
248
+ end
249
+
250
+ mock.foo
251
+
252
+ assert mock.verify
253
+ end
254
+
255
+ def test_mock_block_is_passed_function_params
256
+ arg1, arg2, arg3 = :bar, [1,2,3], {:a => 'a'}
257
+ mock = Minitest::Mock.new
258
+ mock.expect :foo, nil do |a1, a2, a3|
259
+ a1 == arg1 &&
260
+ a2 == arg2 &&
261
+ a3 == arg3
262
+ end
263
+
264
+ mock.foo arg1, arg2, arg3
265
+
266
+ assert mock.verify
267
+ end
268
+
269
+ def test_verify_fails_when_mock_block_returns_false
270
+ mock = Minitest::Mock.new
271
+ mock.expect :foo, nil do
272
+ false
273
+ end
274
+
275
+ e = assert_raises(MockExpectationError) { mock.foo }
276
+ exp = "mocked method :foo failed block w/ []"
277
+
278
+ assert_equal exp, e.message
279
+ end
280
+
281
+ def test_mock_block_throws_if_args_passed
282
+ mock = Minitest::Mock.new
283
+
284
+ e = assert_raises(ArgumentError) do
285
+ mock.expect :foo, nil, [:a, :b, :c] do
286
+ true
287
+ end
288
+ end
289
+
290
+ exp = "args ignored when block given"
291
+
292
+ assert_equal exp, e.message
293
+ end
294
+
295
+ def test_mock_returns_retval_when_called_with_block
296
+ mock = Minitest::Mock.new
297
+ mock.expect(:foo, 32) do
298
+ true
299
+ end
300
+
301
+ rs = mock.foo
302
+
303
+ assert_equal rs, 32
304
+ end
305
+
306
+ def util_verify_bad exp
307
+ e = assert_raises MockExpectationError do
308
+ @mock.verify
309
+ end
310
+
311
+ assert_equal exp, e.message
312
+ end
313
+
314
+ def test_mock_called_via_send
315
+ mock = Minitest::Mock.new
316
+ mock.expect(:foo, true)
317
+
318
+ mock.send :foo
319
+ mock.verify
320
+ end
321
+
322
+ def test_mock_called_via___send__
323
+ mock = Minitest::Mock.new
324
+ mock.expect(:foo, true)
325
+
326
+ mock.__send__ :foo
327
+ mock.verify
328
+ end
329
+
330
+ def test_mock_called_via_send_with_args
331
+ mock = Minitest::Mock.new
332
+ mock.expect(:foo, true, [1,2,3])
333
+
334
+ mock.send(:foo, 1, 2, 3)
335
+ mock.verify
336
+ end
337
+
338
+ end
339
+
340
+ require "minitest/metametameta"
341
+
342
+ class TestMinitestStub < Minitest::Test
343
+ parallelize_me!
344
+
345
+ def setup
346
+ super
347
+ Minitest::Test.reset
348
+
349
+ @tc = Minitest::Test.new 'fake tc'
350
+ @assertion_count = 1
351
+ end
352
+
353
+ def teardown
354
+ super
355
+ assert_equal @assertion_count, @tc.assertions
356
+ end
357
+
358
+ class Time
359
+ def self.now
360
+ 24
361
+ end
362
+ end
363
+
364
+ def assert_stub val_or_callable
365
+ @assertion_count += 1
366
+
367
+ t = Time.now.to_i
368
+
369
+ Time.stub :now, val_or_callable do
370
+ @tc.assert_equal 42, Time.now
371
+ end
372
+
373
+ @tc.assert_operator Time.now.to_i, :>=, t
374
+ end
375
+
376
+ def test_stub_private_module_method
377
+ @assertion_count += 1
378
+
379
+ t0 = Time.now
380
+
381
+ self.stub :sleep, nil do
382
+ @tc.assert_nil sleep(10)
383
+ end
384
+
385
+ @tc.assert_operator Time.now - t0, :<=, 1
386
+ end
387
+
388
+ def test_stub_private_module_method_indirect
389
+ @assertion_count += 1
390
+
391
+ fail_clapper = Class.new do
392
+ def fail_clap
393
+ fail
394
+ :clap
395
+ end
396
+ end.new
397
+
398
+ fail_clapper.stub :fail, nil do |safe_clapper|
399
+ @tc.assert_equal :clap, safe_clapper.fail_clap # either form works
400
+ @tc.assert_equal :clap, fail_clapper.fail_clap # yay closures
401
+ end
402
+ end
403
+
404
+ def test_stub_public_module_method
405
+ Math.stub :log10, :stubbed do
406
+ @tc.assert_equal :stubbed, Math.log10(1000)
407
+ end
408
+ end
409
+
410
+ def test_stub_value
411
+ assert_stub 42
412
+ end
413
+
414
+ def test_stub_block
415
+ assert_stub lambda { 42 }
416
+ end
417
+
418
+ def test_stub_block_args
419
+ @assertion_count += 1
420
+
421
+ t = Time.now.to_i
422
+
423
+ Time.stub :now, lambda { |n| n * 2 } do
424
+ @tc.assert_equal 42, Time.now(21)
425
+ end
426
+
427
+ @tc.assert_operator Time.now.to_i, :>=, t
428
+ end
429
+
430
+ def test_stub_callable
431
+ obj = Object.new
432
+
433
+ def obj.call
434
+ 42
435
+ end
436
+
437
+ assert_stub obj
438
+ end
439
+
440
+ def test_stub_yield_self
441
+ obj = "foo"
442
+
443
+ val = obj.stub :to_s, "bar" do |s|
444
+ s.to_s
445
+ end
446
+
447
+ @tc.assert_equal "bar", val
448
+ end
449
+
450
+ def test_dynamic_method
451
+ @assertion_count = 2
452
+
453
+ dynamic = Class.new do
454
+ def self.respond_to?(meth)
455
+ meth == :found
456
+ end
457
+
458
+ def self.method_missing(meth, *args, &block)
459
+ if meth == :found
460
+ false
461
+ else
462
+ super
463
+ end
464
+ end
465
+ end
466
+
467
+ val = dynamic.stub(:found, true) do |s|
468
+ s.found
469
+ end
470
+
471
+ @tc.assert_equal true, val
472
+ @tc.assert_equal false, dynamic.found
473
+ end
474
+
475
+ def test_mock_with_yield
476
+ mock = Minitest::Mock.new
477
+ mock.expect(:write, true) do
478
+ true
479
+ end
480
+ rs = nil
481
+
482
+ File.stub(:open, true, mock) do
483
+ File.open("foo.txt", "r") do |f|
484
+ rs = f.write
485
+ end
486
+ end
487
+ @tc.assert_equal true, rs
488
+ end
489
+
490
+ end