betatest 0.0.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/.autotest +34 -0
- data/Gemfile +4 -0
- data/README.md +54 -0
- data/Rakefile +9 -0
- data/betatest.gemspec +22 -0
- data/lib/betatest.rb +773 -0
- data/lib/betatest/assertions.rb +661 -0
- data/lib/betatest/autorun.rb +12 -0
- data/lib/betatest/benchmark.rb +423 -0
- data/lib/betatest/expectations.rb +281 -0
- data/lib/betatest/hell.rb +11 -0
- data/lib/betatest/mock.rb +220 -0
- data/lib/betatest/parallel.rb +40 -0
- data/lib/betatest/pride.rb +4 -0
- data/lib/betatest/pride_plugin.rb +142 -0
- data/lib/betatest/spec.rb +294 -0
- data/lib/betatest/test.rb +283 -0
- data/lib/betatest/unit.rb +45 -0
- data/lib/betatest/version.rb +3 -0
- data/test/metametameta.rb +80 -0
- data/test/test_minitest_benchmark.rb +137 -0
- data/test/test_minitest_fork.rb +22 -0
- data/test/test_minitest_mock.rb +500 -0
- data/test/test_minitest_reporter.rb +313 -0
- data/test/test_minitest_spec.rb +832 -0
- data/test/test_minitest_unit.rb +1865 -0
- metadata +106 -0
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'betatest/autorun'
|
2
|
+
|
3
|
+
class TestBetatestFork < Betatest::Test
|
4
|
+
def test_explicit_exit_status_in_forked_process
|
5
|
+
@pid = Process.fork do
|
6
|
+
exit! 0
|
7
|
+
end
|
8
|
+
|
9
|
+
_, result = Process.wait2(@pid)
|
10
|
+
|
11
|
+
assert_equal 0, result.exitstatus
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_exit_status_in_forked_process
|
15
|
+
@pid = Process.fork do
|
16
|
+
end
|
17
|
+
|
18
|
+
_, result = Process.wait2(@pid)
|
19
|
+
|
20
|
+
assert_equal 0, result.exitstatus
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,500 @@
|
|
1
|
+
require 'betatest/autorun'
|
2
|
+
|
3
|
+
class TestBetatestMock < Betatest::Test
|
4
|
+
parallelize_me!
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@mock = Betatest::Mock.new.expect(:foo, nil)
|
8
|
+
@mock.expect(:meaning_of_life, 42)
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_create_stub_method
|
12
|
+
assert_nil @mock.foo
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_allow_return_value_specification
|
16
|
+
assert_equal 42, @mock.meaning_of_life
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_blow_up_if_not_called
|
20
|
+
@mock.foo
|
21
|
+
|
22
|
+
util_verify_bad "expected meaning_of_life() => 42, got []"
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_not_blow_up_if_everything_called
|
26
|
+
@mock.foo
|
27
|
+
@mock.meaning_of_life
|
28
|
+
|
29
|
+
assert @mock.verify
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_allow_expectations_to_be_added_after_creation
|
33
|
+
@mock.expect(:bar, true)
|
34
|
+
assert @mock.bar
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_not_verify_if_new_expected_method_is_not_called
|
38
|
+
@mock.foo
|
39
|
+
@mock.meaning_of_life
|
40
|
+
@mock.expect(:bar, true)
|
41
|
+
|
42
|
+
util_verify_bad "expected bar() => true, got []"
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_blow_up_on_wrong_number_of_arguments
|
46
|
+
@mock.foo
|
47
|
+
@mock.meaning_of_life
|
48
|
+
@mock.expect(:sum, 3, [1, 2])
|
49
|
+
|
50
|
+
e = assert_raises ArgumentError do
|
51
|
+
@mock.sum
|
52
|
+
end
|
53
|
+
|
54
|
+
assert_equal "mocked method :sum expects 2 arguments, got 0", e.message
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_return_mock_does_not_raise
|
58
|
+
retval = Betatest::Mock.new
|
59
|
+
mock = Betatest::Mock.new
|
60
|
+
mock.expect(:foo, retval)
|
61
|
+
mock.foo
|
62
|
+
|
63
|
+
assert mock.verify
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_mock_args_does_not_raise
|
67
|
+
skip "non-opaque use of ==" if maglev?
|
68
|
+
|
69
|
+
arg = Betatest::Mock.new
|
70
|
+
mock = Betatest::Mock.new
|
71
|
+
mock.expect(:foo, nil, [arg])
|
72
|
+
mock.foo(arg)
|
73
|
+
|
74
|
+
assert mock.verify
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_set_expectation_on_special_methods
|
78
|
+
mock = Betatest::Mock.new
|
79
|
+
|
80
|
+
mock.expect :object_id, "received object_id"
|
81
|
+
assert_equal "received object_id", mock.object_id
|
82
|
+
|
83
|
+
mock.expect :respond_to_missing?, "received respond_to_missing?"
|
84
|
+
assert_equal "received respond_to_missing?", mock.respond_to_missing?
|
85
|
+
|
86
|
+
mock.expect :===, "received ==="
|
87
|
+
assert_equal "received ===", mock.===
|
88
|
+
|
89
|
+
mock.expect :inspect, "received inspect"
|
90
|
+
assert_equal "received inspect", mock.inspect
|
91
|
+
|
92
|
+
mock.expect :to_s, "received to_s"
|
93
|
+
assert_equal "received to_s", mock.to_s
|
94
|
+
|
95
|
+
mock.expect :public_send, "received public_send"
|
96
|
+
assert_equal "received public_send", mock.public_send
|
97
|
+
|
98
|
+
mock.expect :send, "received send"
|
99
|
+
assert_equal "received send", mock.send
|
100
|
+
|
101
|
+
assert mock.verify
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_expectations_can_be_satisfied_via_send
|
105
|
+
@mock.send :foo
|
106
|
+
@mock.send :meaning_of_life
|
107
|
+
|
108
|
+
assert @mock.verify
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_expectations_can_be_satisfied_via_public_send
|
112
|
+
skip "Doesn't run on 1.8" if RUBY_VERSION < "1.9"
|
113
|
+
|
114
|
+
@mock.public_send :foo
|
115
|
+
@mock.public_send :meaning_of_life
|
116
|
+
|
117
|
+
assert @mock.verify
|
118
|
+
end
|
119
|
+
|
120
|
+
def test_blow_up_on_wrong_arguments
|
121
|
+
@mock.foo
|
122
|
+
@mock.meaning_of_life
|
123
|
+
@mock.expect(:sum, 3, [1, 2])
|
124
|
+
|
125
|
+
e = assert_raises MockExpectationError do
|
126
|
+
@mock.sum(2, 4)
|
127
|
+
end
|
128
|
+
|
129
|
+
exp = "mocked method :sum called with unexpected arguments [2, 4]"
|
130
|
+
assert_equal exp, e.message
|
131
|
+
end
|
132
|
+
|
133
|
+
def test_expect_with_non_array_args
|
134
|
+
e = assert_raises ArgumentError do
|
135
|
+
@mock.expect :blah, 3, false
|
136
|
+
end
|
137
|
+
|
138
|
+
assert_equal "args must be an array", e.message
|
139
|
+
end
|
140
|
+
|
141
|
+
def test_respond_appropriately
|
142
|
+
assert @mock.respond_to?(:foo)
|
143
|
+
assert @mock.respond_to?(:foo, true)
|
144
|
+
assert @mock.respond_to?('foo')
|
145
|
+
assert !@mock.respond_to?(:bar)
|
146
|
+
end
|
147
|
+
|
148
|
+
def test_no_method_error_on_unexpected_methods
|
149
|
+
e = assert_raises NoMethodError do
|
150
|
+
@mock.bar
|
151
|
+
end
|
152
|
+
|
153
|
+
expected = "unmocked method :bar, expected one of [:foo, :meaning_of_life]"
|
154
|
+
|
155
|
+
assert_equal expected, e.message
|
156
|
+
end
|
157
|
+
|
158
|
+
def test_assign_per_mock_return_values
|
159
|
+
a = Betatest::Mock.new
|
160
|
+
b = Betatest::Mock.new
|
161
|
+
|
162
|
+
a.expect(:foo, :a)
|
163
|
+
b.expect(:foo, :b)
|
164
|
+
|
165
|
+
assert_equal :a, a.foo
|
166
|
+
assert_equal :b, b.foo
|
167
|
+
end
|
168
|
+
|
169
|
+
def test_do_not_create_stub_method_on_new_mocks
|
170
|
+
a = Betatest::Mock.new
|
171
|
+
a.expect(:foo, :a)
|
172
|
+
|
173
|
+
assert !Betatest::Mock.new.respond_to?(:foo)
|
174
|
+
end
|
175
|
+
|
176
|
+
def test_mock_is_a_blank_slate
|
177
|
+
@mock.expect :kind_of?, true, [Fixnum]
|
178
|
+
@mock.expect :==, true, [1]
|
179
|
+
|
180
|
+
assert @mock.kind_of?(Fixnum), "didn't mock :kind_of\?"
|
181
|
+
assert @mock == 1, "didn't mock :=="
|
182
|
+
end
|
183
|
+
|
184
|
+
def test_verify_allows_called_args_to_be_loosely_specified
|
185
|
+
mock = Betatest::Mock.new
|
186
|
+
mock.expect :loose_expectation, true, [Integer]
|
187
|
+
mock.loose_expectation 1
|
188
|
+
|
189
|
+
assert mock.verify
|
190
|
+
end
|
191
|
+
|
192
|
+
def test_verify_raises_with_strict_args
|
193
|
+
mock = Betatest::Mock.new
|
194
|
+
mock.expect :strict_expectation, true, [2]
|
195
|
+
|
196
|
+
e = assert_raises MockExpectationError do
|
197
|
+
mock.strict_expectation 1
|
198
|
+
end
|
199
|
+
|
200
|
+
exp = "mocked method :strict_expectation called with unexpected arguments [1]"
|
201
|
+
assert_equal exp, e.message
|
202
|
+
end
|
203
|
+
|
204
|
+
def test_method_missing_empty
|
205
|
+
mock = Betatest::Mock.new
|
206
|
+
|
207
|
+
mock.expect :a, nil
|
208
|
+
|
209
|
+
mock.a
|
210
|
+
|
211
|
+
e = assert_raises MockExpectationError do
|
212
|
+
mock.a
|
213
|
+
end
|
214
|
+
|
215
|
+
assert_equal "No more expects available for :a: []", e.message
|
216
|
+
end
|
217
|
+
|
218
|
+
def test_same_method_expects_are_verified_when_all_called
|
219
|
+
mock = Betatest::Mock.new
|
220
|
+
mock.expect :foo, nil, [:bar]
|
221
|
+
mock.expect :foo, nil, [:baz]
|
222
|
+
|
223
|
+
mock.foo :bar
|
224
|
+
mock.foo :baz
|
225
|
+
|
226
|
+
assert mock.verify
|
227
|
+
end
|
228
|
+
|
229
|
+
def test_same_method_expects_blow_up_when_not_all_called
|
230
|
+
mock = Betatest::Mock.new
|
231
|
+
mock.expect :foo, nil, [:bar]
|
232
|
+
mock.expect :foo, nil, [:baz]
|
233
|
+
|
234
|
+
mock.foo :bar
|
235
|
+
|
236
|
+
e = assert_raises(MockExpectationError) { mock.verify }
|
237
|
+
|
238
|
+
exp = "expected foo(:baz) => nil, got [foo(:bar) => nil]"
|
239
|
+
|
240
|
+
assert_equal exp, e.message
|
241
|
+
end
|
242
|
+
|
243
|
+
def test_verify_passes_when_mock_block_returns_true
|
244
|
+
mock = Betatest::Mock.new
|
245
|
+
mock.expect :foo, nil do
|
246
|
+
true
|
247
|
+
end
|
248
|
+
|
249
|
+
mock.foo
|
250
|
+
|
251
|
+
assert mock.verify
|
252
|
+
end
|
253
|
+
|
254
|
+
def test_mock_block_is_passed_function_params
|
255
|
+
arg1, arg2, arg3 = :bar, [1,2,3], {:a => 'a'}
|
256
|
+
mock = Betatest::Mock.new
|
257
|
+
mock.expect :foo, nil do |a1, a2, a3|
|
258
|
+
a1 == arg1 &&
|
259
|
+
a2 == arg2 &&
|
260
|
+
a3 == arg3
|
261
|
+
end
|
262
|
+
|
263
|
+
mock.foo arg1, arg2, arg3
|
264
|
+
|
265
|
+
assert mock.verify
|
266
|
+
end
|
267
|
+
|
268
|
+
def test_mock_block_is_passed_function_block
|
269
|
+
mock = Betatest::Mock.new
|
270
|
+
block = proc { 'bar' }
|
271
|
+
mock.expect :foo, nil do |arg, &blk|
|
272
|
+
arg == 'foo' &&
|
273
|
+
blk == block
|
274
|
+
end
|
275
|
+
mock.foo 'foo', &block
|
276
|
+
assert mock.verify
|
277
|
+
end
|
278
|
+
|
279
|
+
def test_verify_fails_when_mock_block_returns_false
|
280
|
+
mock = Betatest::Mock.new
|
281
|
+
mock.expect :foo, nil do
|
282
|
+
false
|
283
|
+
end
|
284
|
+
|
285
|
+
e = assert_raises(MockExpectationError) { mock.foo }
|
286
|
+
exp = "mocked method :foo failed block w/ []"
|
287
|
+
|
288
|
+
assert_equal exp, e.message
|
289
|
+
end
|
290
|
+
|
291
|
+
def test_mock_block_throws_if_args_passed
|
292
|
+
mock = Betatest::Mock.new
|
293
|
+
|
294
|
+
e = assert_raises(ArgumentError) do
|
295
|
+
mock.expect :foo, nil, [:a, :b, :c] do
|
296
|
+
true
|
297
|
+
end
|
298
|
+
end
|
299
|
+
|
300
|
+
exp = "args ignored when block given"
|
301
|
+
|
302
|
+
assert_equal exp, e.message
|
303
|
+
end
|
304
|
+
|
305
|
+
def test_mock_returns_retval_when_called_with_block
|
306
|
+
mock = Betatest::Mock.new
|
307
|
+
mock.expect(:foo, 32) do
|
308
|
+
true
|
309
|
+
end
|
310
|
+
|
311
|
+
rs = mock.foo
|
312
|
+
|
313
|
+
assert_equal rs, 32
|
314
|
+
end
|
315
|
+
|
316
|
+
def util_verify_bad exp
|
317
|
+
e = assert_raises MockExpectationError do
|
318
|
+
@mock.verify
|
319
|
+
end
|
320
|
+
|
321
|
+
assert_equal exp, e.message
|
322
|
+
end
|
323
|
+
|
324
|
+
def test_mock_called_via_send
|
325
|
+
mock = Betatest::Mock.new
|
326
|
+
mock.expect(:foo, true)
|
327
|
+
|
328
|
+
mock.send :foo
|
329
|
+
mock.verify
|
330
|
+
end
|
331
|
+
|
332
|
+
def test_mock_called_via___send__
|
333
|
+
mock = Betatest::Mock.new
|
334
|
+
mock.expect(:foo, true)
|
335
|
+
|
336
|
+
mock.__send__ :foo
|
337
|
+
mock.verify
|
338
|
+
end
|
339
|
+
|
340
|
+
def test_mock_called_via_send_with_args
|
341
|
+
mock = Betatest::Mock.new
|
342
|
+
mock.expect(:foo, true, [1,2,3])
|
343
|
+
|
344
|
+
mock.send(:foo, 1, 2, 3)
|
345
|
+
mock.verify
|
346
|
+
end
|
347
|
+
|
348
|
+
end
|
349
|
+
|
350
|
+
require_relative 'metametameta'
|
351
|
+
|
352
|
+
class TestBetatestStub < Betatest::Test
|
353
|
+
parallelize_me!
|
354
|
+
|
355
|
+
def setup
|
356
|
+
super
|
357
|
+
Betatest::Test.reset
|
358
|
+
|
359
|
+
@tc = Betatest::Test.new 'fake tc'
|
360
|
+
@assertion_count = 1
|
361
|
+
end
|
362
|
+
|
363
|
+
def teardown
|
364
|
+
super
|
365
|
+
assert_equal @assertion_count, @tc.assertions
|
366
|
+
end
|
367
|
+
|
368
|
+
class Time
|
369
|
+
def self.now
|
370
|
+
24
|
371
|
+
end
|
372
|
+
end
|
373
|
+
|
374
|
+
def assert_stub val_or_callable
|
375
|
+
@assertion_count += 1
|
376
|
+
|
377
|
+
t = Time.now.to_i
|
378
|
+
|
379
|
+
Time.stub :now, val_or_callable do
|
380
|
+
@tc.assert_equal 42, Time.now
|
381
|
+
end
|
382
|
+
|
383
|
+
@tc.assert_operator Time.now.to_i, :>=, t
|
384
|
+
end
|
385
|
+
|
386
|
+
def test_stub_private_module_method
|
387
|
+
@assertion_count += 1
|
388
|
+
|
389
|
+
t0 = Time.now
|
390
|
+
|
391
|
+
self.stub :sleep, nil do
|
392
|
+
@tc.assert_nil sleep(10)
|
393
|
+
end
|
394
|
+
|
395
|
+
@tc.assert_operator Time.now - t0, :<=, 1
|
396
|
+
end
|
397
|
+
|
398
|
+
def test_stub_private_module_method_indirect
|
399
|
+
@assertion_count += 1
|
400
|
+
|
401
|
+
fail_clapper = Class.new do
|
402
|
+
def fail_clap
|
403
|
+
fail
|
404
|
+
:clap
|
405
|
+
end
|
406
|
+
end.new
|
407
|
+
|
408
|
+
fail_clapper.stub :fail, nil do |safe_clapper|
|
409
|
+
@tc.assert_equal :clap, safe_clapper.fail_clap # either form works
|
410
|
+
@tc.assert_equal :clap, fail_clapper.fail_clap # yay closures
|
411
|
+
end
|
412
|
+
end
|
413
|
+
|
414
|
+
def test_stub_public_module_method
|
415
|
+
Math.stub :log10, :stubbed do
|
416
|
+
@tc.assert_equal :stubbed, Math.log10(1000)
|
417
|
+
end
|
418
|
+
end
|
419
|
+
|
420
|
+
def test_stub_value
|
421
|
+
assert_stub 42
|
422
|
+
end
|
423
|
+
|
424
|
+
def test_stub_block
|
425
|
+
assert_stub lambda { 42 }
|
426
|
+
end
|
427
|
+
|
428
|
+
def test_stub_block_args
|
429
|
+
@assertion_count += 1
|
430
|
+
|
431
|
+
t = Time.now.to_i
|
432
|
+
|
433
|
+
Time.stub :now, lambda { |n| n * 2 } do
|
434
|
+
@tc.assert_equal 42, Time.now(21)
|
435
|
+
end
|
436
|
+
|
437
|
+
@tc.assert_operator Time.now.to_i, :>=, t
|
438
|
+
end
|
439
|
+
|
440
|
+
def test_stub_callable
|
441
|
+
obj = Object.new
|
442
|
+
|
443
|
+
def obj.call
|
444
|
+
42
|
445
|
+
end
|
446
|
+
|
447
|
+
assert_stub obj
|
448
|
+
end
|
449
|
+
|
450
|
+
def test_stub_yield_self
|
451
|
+
obj = "foo"
|
452
|
+
|
453
|
+
val = obj.stub :to_s, "bar" do |s|
|
454
|
+
s.to_s
|
455
|
+
end
|
456
|
+
|
457
|
+
@tc.assert_equal "bar", val
|
458
|
+
end
|
459
|
+
|
460
|
+
def test_dynamic_method
|
461
|
+
@assertion_count = 2
|
462
|
+
|
463
|
+
dynamic = Class.new do
|
464
|
+
def self.respond_to?(meth)
|
465
|
+
meth == :found
|
466
|
+
end
|
467
|
+
|
468
|
+
def self.method_missing(meth, *args, &block)
|
469
|
+
if meth == :found
|
470
|
+
false
|
471
|
+
else
|
472
|
+
super
|
473
|
+
end
|
474
|
+
end
|
475
|
+
end
|
476
|
+
|
477
|
+
val = dynamic.stub(:found, true) do |s|
|
478
|
+
s.found
|
479
|
+
end
|
480
|
+
|
481
|
+
@tc.assert_equal true, val
|
482
|
+
@tc.assert_equal false, dynamic.found
|
483
|
+
end
|
484
|
+
|
485
|
+
def test_mock_with_yield
|
486
|
+
mock = Betatest::Mock.new
|
487
|
+
mock.expect(:write, true) do
|
488
|
+
true
|
489
|
+
end
|
490
|
+
rs = nil
|
491
|
+
|
492
|
+
File.stub(:open, true, mock) do
|
493
|
+
File.open("foo.txt", "r") do |f|
|
494
|
+
rs = f.write
|
495
|
+
end
|
496
|
+
end
|
497
|
+
@tc.assert_equal true, rs
|
498
|
+
end
|
499
|
+
|
500
|
+
end
|