spec 5.0.14

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.
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