arikui1911-tinytest 0.0.2
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.
- data/LICENSE +28 -0
- data/README +25 -0
- data/Rakefile +17 -0
- data/lib/tinytest.rb +706 -0
- data/lib/tinytest/compat.rb +27 -0
- data/lib/tinytest/unit.rb +53 -0
- data/test/test_tinytest.rb +1251 -0
- metadata +71 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
unless Method.method_defined?(:source_location)
|
|
2
|
+
class TinyTest::TestCase
|
|
3
|
+
def self.method_added(name)
|
|
4
|
+
filename, lineno = caller[0].match(TinyTest::Suite::CALLER_RE).captures
|
|
5
|
+
lineno = Integer(lineno)
|
|
6
|
+
TinyTest::Suite::METHOD_ADDED_RECORDS[[self, name]] = [filename, lineno]
|
|
7
|
+
end
|
|
8
|
+
private_class_method :method_added
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
class TinyTest::Suite
|
|
12
|
+
METHOD_ADDED_RECORDS = {}
|
|
13
|
+
|
|
14
|
+
def method_location(obj, name)
|
|
15
|
+
METHOD_ADDED_RECORDS[[obj.class, name]]
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
unless Object.method_defined?(:define_singleton_method)
|
|
21
|
+
class TinyTest::TestCase
|
|
22
|
+
def bind_testsuite(suite)
|
|
23
|
+
(class << self ; self ; end).class_eval{ define_method(:suite){ suite } }
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Distributes under The modified BSD license.
|
|
3
|
+
#
|
|
4
|
+
# Copyright (c) 2009 arikui <http://d.hatena.ne.jp/arikui/>
|
|
5
|
+
# All rights reserved.
|
|
6
|
+
#
|
|
7
|
+
|
|
8
|
+
require 'tinytest'
|
|
9
|
+
require 'optparse'
|
|
10
|
+
|
|
11
|
+
module TinyTest::Unit
|
|
12
|
+
# Add hook which allocate TinyTest::Runner with parsed ARGV and
|
|
13
|
+
# execute Runner#run at exit (Only wehn firstly called).
|
|
14
|
+
def self.autorun
|
|
15
|
+
@autorunner ||= autorunner()
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Already set #autorun or not.
|
|
19
|
+
def self.autorun?
|
|
20
|
+
@autorunner ? true : false
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def self.autorunner
|
|
24
|
+
at_exit{
|
|
25
|
+
runner = parse_options(ARGV)
|
|
26
|
+
runner.run
|
|
27
|
+
}
|
|
28
|
+
end
|
|
29
|
+
private_class_method :autorunner
|
|
30
|
+
|
|
31
|
+
def self.parse_options(argv)
|
|
32
|
+
opts = {}
|
|
33
|
+
o = OptionParser.new
|
|
34
|
+
o.banner = "== TinyTest autorunner ==\n"
|
|
35
|
+
o.banner << "Usage: test-script [options]\n"
|
|
36
|
+
o.on('-n', '--testname=NAME', 'assign testname matcher') do |s|
|
|
37
|
+
opts[:testname] = Regexp.new(s)
|
|
38
|
+
end
|
|
39
|
+
o.on('-t', '--testcase=NAME', 'assign testcase matcher') do |s|
|
|
40
|
+
opts[:testcase] = Regexp.new(s)
|
|
41
|
+
end
|
|
42
|
+
o.on('-I', '--load-path=DIR', 'add to ruby load-path') do |s|
|
|
43
|
+
$LOAD_PATH.push s
|
|
44
|
+
end
|
|
45
|
+
o.on('-v', '--[no-]verbose', 'turn on/off verbose mode') do |b|
|
|
46
|
+
opts[:verbose] = b
|
|
47
|
+
end
|
|
48
|
+
o.parse! argv
|
|
49
|
+
TinyTest::Runner.new(opts)
|
|
50
|
+
end
|
|
51
|
+
private_class_method :parse_options
|
|
52
|
+
end
|
|
53
|
+
|
|
@@ -0,0 +1,1251 @@
|
|
|
1
|
+
require 'test/unit'
|
|
2
|
+
require 'set'
|
|
3
|
+
require 'stringio'
|
|
4
|
+
$LOAD_PATH.unshift File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
5
|
+
before = $LOADED_FEATURES.dup
|
|
6
|
+
require 'tinytest'
|
|
7
|
+
after = $LOADED_FEATURES
|
|
8
|
+
feature = (after - before).last
|
|
9
|
+
unless feature.include?('/') || feature.include?('\\')
|
|
10
|
+
# expand feature because $LOADED_FEATURES holds relative path in Ruby 1.8.x
|
|
11
|
+
feature = $LOAD_PATH.map{|d| File.join(d, feature) }.find{|path| File.file?(path) }
|
|
12
|
+
end
|
|
13
|
+
TINYTEST_FEATURE = feature
|
|
14
|
+
|
|
15
|
+
module TestUtil
|
|
16
|
+
def positive_integer_cases(limit)
|
|
17
|
+
[0, 1, TestUtil.sample([*2..limit])]
|
|
18
|
+
end
|
|
19
|
+
module_function :positive_integer_cases
|
|
20
|
+
|
|
21
|
+
def shuffle(collection)
|
|
22
|
+
collection.sort_by{ rand }
|
|
23
|
+
end
|
|
24
|
+
module_function :shuffle
|
|
25
|
+
|
|
26
|
+
def sample(collection)
|
|
27
|
+
TestUtil.shuffle(collection).first
|
|
28
|
+
end
|
|
29
|
+
module_function :sample
|
|
30
|
+
|
|
31
|
+
def start_with?(str, tgt)
|
|
32
|
+
i = str.index(tgt) and i == 0 ? true : false
|
|
33
|
+
end
|
|
34
|
+
module_function :start_with?
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
class TC_AssertError < Test::Unit::TestCase
|
|
38
|
+
def test_superclass
|
|
39
|
+
assert TinyTest::AssertError < Exception
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
class TC_SkipError < Test::Unit::TestCase
|
|
44
|
+
def test_superclass
|
|
45
|
+
assert TinyTest::SkipError < TinyTest::AssertError
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
class TC_Runner < Test::Unit::TestCase
|
|
50
|
+
module MockForRun
|
|
51
|
+
def set(n_assertions, results, benchmark)
|
|
52
|
+
self.n_assertions = n_assertions
|
|
53
|
+
self.results = results
|
|
54
|
+
self.benchmark = benchmark
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
attr_accessor :n_assertions
|
|
58
|
+
attr_accessor :results
|
|
59
|
+
attr_accessor :benchmark
|
|
60
|
+
|
|
61
|
+
def run_suites(suites)
|
|
62
|
+
return n_assertions, results, benchmark
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def collect_suites
|
|
66
|
+
suite_list
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def suite_list
|
|
70
|
+
@suite_list ||= []
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def count_suiteresults_types(results)
|
|
74
|
+
return 1, 2, 3
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
class ReporterMock
|
|
79
|
+
def initialize
|
|
80
|
+
@history = []
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
attr_reader :history
|
|
84
|
+
|
|
85
|
+
def method_missing(name, *args)
|
|
86
|
+
history << [name, *args]
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
BENCH = Object.new
|
|
91
|
+
def BENCH.real
|
|
92
|
+
6.66
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def test_run
|
|
96
|
+
results = []
|
|
97
|
+
repo = ReporterMock.new
|
|
98
|
+
runner = TinyTest::Runner.new(:reporter => repo)
|
|
99
|
+
runner.extend(MockForRun).set(666, results, BENCH)
|
|
100
|
+
runner.run
|
|
101
|
+
assert_equal :load_suite, repo.history.shift.first
|
|
102
|
+
assert_equal [:mark_results, results], repo.history.shift
|
|
103
|
+
assert_equal [:running_times, BENCH], repo.history.shift
|
|
104
|
+
assert_equal [:blank], repo.history.shift
|
|
105
|
+
assert_equal [:counts_report, results.size, 666, 1, 2, 3], repo.history.shift
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def test_run_verbose
|
|
109
|
+
results = []
|
|
110
|
+
repo = ReporterMock.new
|
|
111
|
+
runner = TinyTest::Runner.new(:reporter => repo, :verbose => true)
|
|
112
|
+
runner.extend(MockForRun).set(666, results, BENCH)
|
|
113
|
+
runner.run
|
|
114
|
+
assert_equal :load_suite, repo.history.shift.first
|
|
115
|
+
assert_equal [:mark_results_with_times, results], repo.history.shift
|
|
116
|
+
assert_equal [:running_times, BENCH], repo.history.shift
|
|
117
|
+
assert_equal [:blank], repo.history.shift
|
|
118
|
+
assert_equal [:counts_report, results.size, 666, 1, 2, 3], repo.history.shift
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def test_run_with_errors
|
|
122
|
+
results = Array.new(5){
|
|
123
|
+
o = Object.new
|
|
124
|
+
def o.success?
|
|
125
|
+
true
|
|
126
|
+
end
|
|
127
|
+
o
|
|
128
|
+
}
|
|
129
|
+
results = Array.new(5){
|
|
130
|
+
o = Object.new
|
|
131
|
+
def o.success?
|
|
132
|
+
false
|
|
133
|
+
end
|
|
134
|
+
o
|
|
135
|
+
}
|
|
136
|
+
results = TestUtil.shuffle(results)
|
|
137
|
+
not_succeededs = results.select{|r| not r.success? }
|
|
138
|
+
repo = ReporterMock.new
|
|
139
|
+
runner = TinyTest::Runner.new(:reporter => repo)
|
|
140
|
+
runner.extend(MockForRun).set(666, results, BENCH)
|
|
141
|
+
runner.run
|
|
142
|
+
assert_equal :load_suite, repo.history.shift.first
|
|
143
|
+
assert_equal [:mark_results, results], repo.history.shift
|
|
144
|
+
assert_equal [:running_times, BENCH], repo.history.shift
|
|
145
|
+
assert_equal [:error_reports, not_succeededs], repo.history.shift
|
|
146
|
+
assert_equal [:counts_report, results.size, 666, 1, 2, 3], repo.history.shift
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
class TC_Runner_private < Test::Unit::TestCase
|
|
151
|
+
def setup
|
|
152
|
+
@runner = TinyTest::Runner.new
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def test_each_class
|
|
156
|
+
root = Class.new
|
|
157
|
+
sub = Class.new(root)
|
|
158
|
+
subsub = Class.new(sub)
|
|
159
|
+
classes = []
|
|
160
|
+
@runner.instance_eval{ each_class(root){|c| classes << c } }
|
|
161
|
+
assert_equal Set.new([sub, subsub]), Set.new(classes)
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
class SuiteMock
|
|
165
|
+
def count_assertions
|
|
166
|
+
yield()
|
|
167
|
+
666
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def execute
|
|
171
|
+
'execute'
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def test_private_run_suites
|
|
176
|
+
suites = Array.new(3){ SuiteMock.new }
|
|
177
|
+
n, results, bench = @runner.instance_eval{ run_suites(suites) }
|
|
178
|
+
assert_equal 666 * 3, n
|
|
179
|
+
assert_equal ['execute'] * 3, results
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def test_private_count_suiteresults_types
|
|
183
|
+
nums = Array.new(4){ TestUtil.sample([*1..10]) }
|
|
184
|
+
results = []
|
|
185
|
+
klass = Struct.new(:char)
|
|
186
|
+
%w[. F E S].zip(nums) do |c, n|
|
|
187
|
+
results.concat Array.new(n){ klass.new(c) }
|
|
188
|
+
end
|
|
189
|
+
results = TestUtil.shuffle(results)
|
|
190
|
+
counts = @runner.instance_eval{ count_suiteresults_types(results) }
|
|
191
|
+
assert_equal nums[1..-1], counts
|
|
192
|
+
end
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
class TC_Runner_private_collect_suites < Test::Unit::TestCase
|
|
196
|
+
module EachClassMock
|
|
197
|
+
def class_list
|
|
198
|
+
@class_list ||= []
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
def each_class(root = nil, &block)
|
|
202
|
+
class_list.each(&block)
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
class ClassMock
|
|
207
|
+
def initialize(name, *methods)
|
|
208
|
+
@name = name
|
|
209
|
+
@public_instance_methods = methods
|
|
210
|
+
unless /./ === :hoge # for 1.8 Symbol-Regexp matching
|
|
211
|
+
@public_instance_methods.map!{|m| m.id2name }
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
attr_accessor :name
|
|
216
|
+
|
|
217
|
+
def public_instance_methods(inherited_too = true)
|
|
218
|
+
@public_instance_methods
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
def new
|
|
222
|
+
self
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
def bind_testsuite(suite)
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
def inspect
|
|
229
|
+
"<#ClassMock:#{name}>"
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
# for ClassMock's 1.8 consideration
|
|
234
|
+
def symbol_set(enum)
|
|
235
|
+
enum = enum.map{|e| e.respond_to?(:intern) ? e.intern : e }
|
|
236
|
+
Set.new(enum)
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
def test_collect_suites
|
|
240
|
+
runner = TinyTest::Runner.new()
|
|
241
|
+
runner.extend(EachClassMock)
|
|
242
|
+
runner.class_list << ClassMock.new("Foo", :test_foo, :test_bar, :not_test_baz)
|
|
243
|
+
suites = runner.instance_eval{ collect_suites() }
|
|
244
|
+
assert_equal symbol_set([:test_foo, :test_bar]), symbol_set(suites.map{|s| s.testname })
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
def test_collect_suites_testname_matcher_re
|
|
248
|
+
runner = TinyTest::Runner.new(:testname => /\Aprefix_/)
|
|
249
|
+
runner.extend(EachClassMock)
|
|
250
|
+
runner.class_list << ClassMock.new("Foo", :test_foo, :prefix_bar, :prefix_baz)
|
|
251
|
+
suites = runner.instance_eval{ collect_suites() }
|
|
252
|
+
assert_equal symbol_set([:prefix_bar, :prefix_baz]), symbol_set(suites.map{|s| s.testname })
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
def test_collect_suites_testname_matcher_proc
|
|
256
|
+
matcher = lambda{|name| TestUtil.start_with?(name.to_s, 'prefix') }
|
|
257
|
+
runner = TinyTest::Runner.new(:testname => matcher)
|
|
258
|
+
runner.extend(EachClassMock)
|
|
259
|
+
runner.class_list << ClassMock.new("Foo", :test_foo, :prefix_bar, :prefix_baz)
|
|
260
|
+
suites = runner.instance_eval{ collect_suites() }
|
|
261
|
+
assert_equal symbol_set([:prefix_bar, :prefix_baz]), symbol_set(suites.map{|s| s.testname })
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
def test_collect_suites_testcase_matcher_re
|
|
265
|
+
runner = TinyTest::Runner.new(:testcase => /\ATC_/)
|
|
266
|
+
runner.extend(EachClassMock)
|
|
267
|
+
runner.class_list << ClassMock.new("TC_Foo", :test_foo_a, :test_foo_b, :not_test_foo_c)
|
|
268
|
+
runner.class_list << ClassMock.new("Bar", :test_bar_a, :test_bar_b, :not_test_bar_c)
|
|
269
|
+
suites = runner.instance_eval{ collect_suites() }
|
|
270
|
+
assert_equal Set.new(["TC_Foo"]), Set.new(suites.map{|s| s.testcase.name })
|
|
271
|
+
assert_equal symbol_set([:test_foo_a, :test_foo_b]), symbol_set(suites.map{|s| s.testname })
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
def test_collect_suites_testcase_matcher_proc
|
|
275
|
+
cm = ClassMock.new("TC_Foo", :test_foo_a, :test_foo_b, :not_test_foo_c)
|
|
276
|
+
matcher = lambda{|tc| tc.equal? cm }
|
|
277
|
+
runner = TinyTest::Runner.new(:testcase => matcher)
|
|
278
|
+
runner.extend(EachClassMock)
|
|
279
|
+
runner.class_list << cm
|
|
280
|
+
runner.class_list << ClassMock.new("Bar", :test_bar_a, :test_bar_b, :not_test_bar_c)
|
|
281
|
+
suites = runner.instance_eval{ collect_suites() }
|
|
282
|
+
assert_equal Set.new(["TC_Foo"]), Set.new(suites.map{|s| s.testcase.name })
|
|
283
|
+
assert_equal symbol_set([:test_foo_a, :test_foo_b]), symbol_set(suites.map{|s| s.testname })
|
|
284
|
+
end
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
class TC_Reporter < Test::Unit::TestCase
|
|
288
|
+
def setup
|
|
289
|
+
@f = StringIO.new
|
|
290
|
+
@r = TinyTest::Reporter.new(@f)
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
def test_blank
|
|
294
|
+
@r.blank
|
|
295
|
+
assert_equal "\n", @f.string
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
def test_load_suite
|
|
299
|
+
@r.load_suite "foo/bar"
|
|
300
|
+
@r.load_suite "foo/bar.rb"
|
|
301
|
+
assert_equal "Loaded suite foo/bar\nStarted\n" * 2, @f.string
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
module BenchmarkMock
|
|
305
|
+
REAL = 1.0
|
|
306
|
+
|
|
307
|
+
def self.real
|
|
308
|
+
REAL
|
|
309
|
+
end
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
class SuiteResultMock
|
|
313
|
+
def char
|
|
314
|
+
'*'
|
|
315
|
+
end
|
|
316
|
+
|
|
317
|
+
def report
|
|
318
|
+
'REPORT'
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
SUITE = Object.new
|
|
322
|
+
def SUITE.inspect
|
|
323
|
+
'INSPECTION'
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
def suite
|
|
327
|
+
SUITE
|
|
328
|
+
end
|
|
329
|
+
|
|
330
|
+
def benchmark
|
|
331
|
+
BenchmarkMock
|
|
332
|
+
end
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
include TestUtil
|
|
336
|
+
|
|
337
|
+
def test_mark_results
|
|
338
|
+
nums = positive_integer_cases(10)
|
|
339
|
+
nums.each do |n|
|
|
340
|
+
results = Array.new(n){ SuiteResultMock.new }
|
|
341
|
+
@r.mark_results(results)
|
|
342
|
+
end
|
|
343
|
+
assert_equal nums.map{|n| "#{'*' * n}\n" }.join, @f.string
|
|
344
|
+
end
|
|
345
|
+
|
|
346
|
+
def test_mark_results_with_times_for_0_results
|
|
347
|
+
@r.mark_results_with_times([])
|
|
348
|
+
assert_equal "\n\n", @f.string
|
|
349
|
+
end
|
|
350
|
+
|
|
351
|
+
def test_mark_results_with_times_for_1_result
|
|
352
|
+
@r.mark_results_with_times([SuiteResultMock.new])
|
|
353
|
+
assert_equal "\nINSPECTION: 1.00 sec: *\n\n", @f.string
|
|
354
|
+
end
|
|
355
|
+
|
|
356
|
+
def test_mark_results_with_times_for_results
|
|
357
|
+
n = positive_integer_cases(10).last
|
|
358
|
+
results = Array.new(n){ SuiteResultMock.new }
|
|
359
|
+
@r.mark_results_with_times(results)
|
|
360
|
+
expected = "\n" << "INSPECTION: 1.00 sec: *\n" * n << "\n"
|
|
361
|
+
assert_equal expected, @f.string
|
|
362
|
+
end
|
|
363
|
+
|
|
364
|
+
def test_running_times
|
|
365
|
+
@r.running_times(BenchmarkMock)
|
|
366
|
+
assert_equal "Finished in 1.000000 seconds.\n", @f.string
|
|
367
|
+
end
|
|
368
|
+
|
|
369
|
+
def test_error_reports_for_0_results
|
|
370
|
+
@r.error_reports([])
|
|
371
|
+
assert @f.string.empty?
|
|
372
|
+
end
|
|
373
|
+
|
|
374
|
+
def test_error_reports_for_1_result
|
|
375
|
+
@r.error_reports([SuiteResultMock.new])
|
|
376
|
+
assert_equal "\n 1) REPORT\n\n", @f.string
|
|
377
|
+
end
|
|
378
|
+
|
|
379
|
+
def test_error_reports_for_results
|
|
380
|
+
n = positive_integer_cases(9).last
|
|
381
|
+
results = Array.new(n){ SuiteResultMock.new }
|
|
382
|
+
@r.error_reports(results)
|
|
383
|
+
expected = Array.new(n){|i| "\n #{i.succ}) REPORT\n\n" }.join('')
|
|
384
|
+
assert_equal expected, @f.string
|
|
385
|
+
end
|
|
386
|
+
|
|
387
|
+
def test_counts_report
|
|
388
|
+
@r.counts_report(1, 2, 3, 4, 5)
|
|
389
|
+
expected = "1 tests, 2 assertions, 3 failures, 4 errors, 5 skips\n"
|
|
390
|
+
assert_equal expected, @f.string
|
|
391
|
+
end
|
|
392
|
+
end
|
|
393
|
+
|
|
394
|
+
class MockTestCase
|
|
395
|
+
def self.def_hist_method(name, &body)
|
|
396
|
+
define_method name do |*args|
|
|
397
|
+
history << name
|
|
398
|
+
body.call(*args) if body
|
|
399
|
+
end
|
|
400
|
+
end
|
|
401
|
+
|
|
402
|
+
def history
|
|
403
|
+
@history ||= []
|
|
404
|
+
end
|
|
405
|
+
|
|
406
|
+
attr_accessor :suite
|
|
407
|
+
alias :bind_testsuite :suite=
|
|
408
|
+
|
|
409
|
+
def_hist_method :setup
|
|
410
|
+
def_hist_method :teardown
|
|
411
|
+
|
|
412
|
+
def_hist_method :test_succeed do
|
|
413
|
+
true
|
|
414
|
+
end
|
|
415
|
+
|
|
416
|
+
def_hist_method :test_failure do
|
|
417
|
+
raise TinyTest::AssertError
|
|
418
|
+
end
|
|
419
|
+
|
|
420
|
+
def_hist_method :test_skip do
|
|
421
|
+
raise TinyTest::SkipError
|
|
422
|
+
end
|
|
423
|
+
|
|
424
|
+
def_hist_method :test_error do
|
|
425
|
+
raise
|
|
426
|
+
end
|
|
427
|
+
end
|
|
428
|
+
|
|
429
|
+
class TC_Suite < Test::Unit::TestCase
|
|
430
|
+
|
|
431
|
+
def setup
|
|
432
|
+
@testcase = MockTestCase.new
|
|
433
|
+
end
|
|
434
|
+
|
|
435
|
+
def test_initialize
|
|
436
|
+
suite = TinyTest::Suite.new(@testcase, :testname)
|
|
437
|
+
assert_equal @testcase, suite.testcase
|
|
438
|
+
assert_equal :testname, suite.testname
|
|
439
|
+
end
|
|
440
|
+
|
|
441
|
+
def test_inspect
|
|
442
|
+
suite = TinyTest::Suite.new(@testcase, :testname)
|
|
443
|
+
assert_equal "#{@testcase.class}#testname", suite.inspect
|
|
444
|
+
end
|
|
445
|
+
|
|
446
|
+
def test_execute_success
|
|
447
|
+
suite = TinyTest::Suite.new(@testcase, :test_succeed)
|
|
448
|
+
result = suite.execute
|
|
449
|
+
assert_equal [:setup, :test_succeed, :teardown], @testcase.history
|
|
450
|
+
assert result.success?
|
|
451
|
+
end
|
|
452
|
+
|
|
453
|
+
def test_execute_failure
|
|
454
|
+
suite = TinyTest::Suite.new(@testcase, :test_failure)
|
|
455
|
+
result = suite.execute
|
|
456
|
+
assert_equal [:setup, :test_failure, :teardown], @testcase.history
|
|
457
|
+
assert_equal 'F', result.char
|
|
458
|
+
end
|
|
459
|
+
|
|
460
|
+
def test_execute_error
|
|
461
|
+
suite = TinyTest::Suite.new(@testcase, :test_error)
|
|
462
|
+
result = suite.execute
|
|
463
|
+
assert_equal [:setup, :test_error, :teardown], @testcase.history
|
|
464
|
+
assert_equal 'E', result.char
|
|
465
|
+
end
|
|
466
|
+
|
|
467
|
+
def test_execute_skip
|
|
468
|
+
suite = TinyTest::Suite.new(@testcase, :test_skip)
|
|
469
|
+
result = suite.execute
|
|
470
|
+
assert_equal [:setup, :test_skip, :teardown], @testcase.history
|
|
471
|
+
assert_equal 'S', result.char
|
|
472
|
+
end
|
|
473
|
+
end
|
|
474
|
+
|
|
475
|
+
class TC_Suite_assertioncount < Test::Unit::TestCase
|
|
476
|
+
include TestUtil
|
|
477
|
+
|
|
478
|
+
def setup
|
|
479
|
+
@testcase = MockTestCase.new
|
|
480
|
+
@counter = TinyTest::Suite.new(@testcase, :dummy)
|
|
481
|
+
end
|
|
482
|
+
|
|
483
|
+
def test_out_of_count_assertions_block
|
|
484
|
+
do_count = lambda{|n|
|
|
485
|
+
n.times{ @counter.succ_assertion_count }
|
|
486
|
+
@counter.count_assertions{}
|
|
487
|
+
}
|
|
488
|
+
results = []
|
|
489
|
+
positive_integer_cases(10).each do |n|
|
|
490
|
+
results << do_count.call(n)
|
|
491
|
+
@counter.assertion_count_grouping{ results << do_count.call(n) }
|
|
492
|
+
end
|
|
493
|
+
assert_equal [0], results.uniq
|
|
494
|
+
end
|
|
495
|
+
|
|
496
|
+
def test_count_assertions
|
|
497
|
+
nums = positive_integer_cases(10)
|
|
498
|
+
assert_equal nums, nums.map{|n|
|
|
499
|
+
@counter.count_assertions{ n.times{ @counter.succ_assertion_count } }
|
|
500
|
+
}
|
|
501
|
+
end
|
|
502
|
+
|
|
503
|
+
def test_assertion_count_grouping
|
|
504
|
+
assert_equal 0, @counter.count_assertions{
|
|
505
|
+
@counter.assertion_count_grouping{}
|
|
506
|
+
}
|
|
507
|
+
naturals = positive_integer_cases(10)[1..-1]
|
|
508
|
+
assert_equal [1], naturals.map{|n|
|
|
509
|
+
@counter.count_assertions do
|
|
510
|
+
@counter.assertion_count_grouping do
|
|
511
|
+
n.times{ @counter.succ_assertion_count }
|
|
512
|
+
end
|
|
513
|
+
end
|
|
514
|
+
}.uniq
|
|
515
|
+
end
|
|
516
|
+
|
|
517
|
+
def test_assertion_count_grouping_several
|
|
518
|
+
assert_equal 4, @counter.count_assertions{
|
|
519
|
+
@counter.assertion_count_grouping{ @counter.succ_assertion_count }
|
|
520
|
+
2.times{ @counter.succ_assertion_count }
|
|
521
|
+
@counter.assertion_count_grouping{ 2.times{ @counter.succ_assertion_count } }
|
|
522
|
+
@counter.assertion_count_grouping{}
|
|
523
|
+
}
|
|
524
|
+
end
|
|
525
|
+
end
|
|
526
|
+
|
|
527
|
+
|
|
528
|
+
class TC_SuiteResult < Test::Unit::TestCase
|
|
529
|
+
Reports = {
|
|
530
|
+
:success => nil,
|
|
531
|
+
:failure => 'Failure',
|
|
532
|
+
:error => 'Error',
|
|
533
|
+
:skip => 'Skip',
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
def setup
|
|
537
|
+
@results = {}
|
|
538
|
+
Reports.each{|k, v| @results[k] = TinyTest::SuiteResult.new(:suite, :benchmark, v) }
|
|
539
|
+
end
|
|
540
|
+
|
|
541
|
+
def test_report
|
|
542
|
+
Reports.each_key do |k|
|
|
543
|
+
assert_equal Reports[k], @results[k].report
|
|
544
|
+
end
|
|
545
|
+
end
|
|
546
|
+
|
|
547
|
+
def test_char
|
|
548
|
+
assert_equal ['.', 'F', 'E', 'S'],
|
|
549
|
+
[:success, :failure, :error, :skip].map{|k| @results[k].char }
|
|
550
|
+
end
|
|
551
|
+
|
|
552
|
+
def test_success?
|
|
553
|
+
others = Reports.keys
|
|
554
|
+
others.delete(:success)
|
|
555
|
+
others = others.map{|k| @results[k].success? }.uniq
|
|
556
|
+
assert_equal [false], others
|
|
557
|
+
assert @results[:success].success?
|
|
558
|
+
end
|
|
559
|
+
end
|
|
560
|
+
|
|
561
|
+
class TC_TestCase < Test::Unit::TestCase
|
|
562
|
+
def setup
|
|
563
|
+
@testcase = TinyTest::TestCase.new
|
|
564
|
+
end
|
|
565
|
+
|
|
566
|
+
def test_respondance_about_setup
|
|
567
|
+
assert_nothing_raised NoMethodError do
|
|
568
|
+
@testcase.setup
|
|
569
|
+
end
|
|
570
|
+
end
|
|
571
|
+
|
|
572
|
+
def test_respondance_about_teardown
|
|
573
|
+
assert_nothing_raised NoMethodError do
|
|
574
|
+
@testcase.teardown
|
|
575
|
+
end
|
|
576
|
+
end
|
|
577
|
+
|
|
578
|
+
def test_suite_attr
|
|
579
|
+
gensym = Object.new
|
|
580
|
+
assert_nothing_raised NoMethodError do
|
|
581
|
+
@testcase.bind_testsuite gensym
|
|
582
|
+
assert_equal gensym, @testcase.suite
|
|
583
|
+
end
|
|
584
|
+
end
|
|
585
|
+
end
|
|
586
|
+
|
|
587
|
+
class TC_TestCase_assertions < Test::Unit::TestCase
|
|
588
|
+
def setup
|
|
589
|
+
@tc = TinyTest::TestCase.new
|
|
590
|
+
@suite = TinyTest::Suite.new(@tc, nil)
|
|
591
|
+
@tc.bind_testsuite(@suite)
|
|
592
|
+
end
|
|
593
|
+
|
|
594
|
+
def if_flunk(message)
|
|
595
|
+
@flunk_message = message
|
|
596
|
+
yield()
|
|
597
|
+
@flunk_message = nil
|
|
598
|
+
end
|
|
599
|
+
|
|
600
|
+
def ex_message(target = TinyTest::AssertError)
|
|
601
|
+
yield()
|
|
602
|
+
flunk @flunk_message
|
|
603
|
+
rescue target => ex
|
|
604
|
+
ex.message
|
|
605
|
+
end
|
|
606
|
+
|
|
607
|
+
def test_assert
|
|
608
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
609
|
+
@tc.assert true
|
|
610
|
+
end
|
|
611
|
+
if_flunk "assert seems to contain bug." do
|
|
612
|
+
assert_equal "Failed assertion, no message given.", ex_message{
|
|
613
|
+
@tc.assert false
|
|
614
|
+
}
|
|
615
|
+
assert_equal 'MESSAGE', ex_message{
|
|
616
|
+
@tc.assert false, 'MESSAGE'
|
|
617
|
+
}
|
|
618
|
+
end
|
|
619
|
+
end
|
|
620
|
+
|
|
621
|
+
def test_refute
|
|
622
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
623
|
+
@tc.refute false
|
|
624
|
+
end
|
|
625
|
+
if_flunk "refute seems to contain bug." do
|
|
626
|
+
assert_equal "Failed refutation, no message given", ex_message{
|
|
627
|
+
@tc.refute true
|
|
628
|
+
}
|
|
629
|
+
assert_equal 'MESSAGE', ex_message{
|
|
630
|
+
@tc.refute true, 'MESSAGE'
|
|
631
|
+
}
|
|
632
|
+
end
|
|
633
|
+
end
|
|
634
|
+
|
|
635
|
+
def test_pass
|
|
636
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
637
|
+
@tc.pass
|
|
638
|
+
end
|
|
639
|
+
end
|
|
640
|
+
|
|
641
|
+
def test_skip
|
|
642
|
+
if_flunk "skip seems to contain bug." do
|
|
643
|
+
assert_equal "Skipped, no message given", ex_message{
|
|
644
|
+
@tc.skip
|
|
645
|
+
}
|
|
646
|
+
assert_equal 'MESSAGE', ex_message{
|
|
647
|
+
@tc.skip 'MESSAGE'
|
|
648
|
+
}
|
|
649
|
+
end
|
|
650
|
+
end
|
|
651
|
+
|
|
652
|
+
def test_assert_block
|
|
653
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
654
|
+
@tc.assert_block{ true }
|
|
655
|
+
end
|
|
656
|
+
if_flunk "assert_block seems to contain bug." do
|
|
657
|
+
default = "Expected block to return a value evaluated as true."
|
|
658
|
+
assert_equal default, ex_message{
|
|
659
|
+
@tc.assert_block{ false }
|
|
660
|
+
}
|
|
661
|
+
assert_equal "MESSAGE.\n#{default}", ex_message{
|
|
662
|
+
@tc.assert_block('MESSAGE'){ false }
|
|
663
|
+
}
|
|
664
|
+
end
|
|
665
|
+
end
|
|
666
|
+
|
|
667
|
+
def test_refute_block
|
|
668
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
669
|
+
@tc.refute_block{ false }
|
|
670
|
+
end
|
|
671
|
+
if_flunk "refute_block seems to contain bug." do
|
|
672
|
+
default = "Expected block to return a value evaluated as false."
|
|
673
|
+
assert_equal default, ex_message{
|
|
674
|
+
@tc.refute_block{ true }
|
|
675
|
+
}
|
|
676
|
+
assert_equal "MESSAGE.\n#{default}", ex_message{
|
|
677
|
+
@tc.refute_block('MESSAGE'){ true }
|
|
678
|
+
}
|
|
679
|
+
end
|
|
680
|
+
end
|
|
681
|
+
|
|
682
|
+
def test_assert_equal
|
|
683
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
684
|
+
@tc.assert_equal 4, 'Ruby'.size
|
|
685
|
+
end
|
|
686
|
+
if_flunk "assert_equal seems to contain bug." do
|
|
687
|
+
default = %Q`Expected "expected", not "actual".`
|
|
688
|
+
assert_equal default, ex_message{
|
|
689
|
+
@tc.assert_equal 'expected', 'actual'
|
|
690
|
+
}
|
|
691
|
+
assert_equal "MESSAGE.\n#{default}", ex_message{
|
|
692
|
+
@tc.assert_equal 'expected', 'actual', 'MESSAGE'
|
|
693
|
+
}
|
|
694
|
+
end
|
|
695
|
+
end
|
|
696
|
+
|
|
697
|
+
def test_refute_equal
|
|
698
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
699
|
+
@tc.refute_equal 4, 'Python'.size
|
|
700
|
+
end
|
|
701
|
+
if_flunk "refute_equal seems to contain bug." do
|
|
702
|
+
val = %w[a b c]
|
|
703
|
+
default = %Q`Expected ["a", "b", "c"] to not be equal to ["a", "b", "c"].`
|
|
704
|
+
assert_equal default, ex_message{
|
|
705
|
+
@tc.refute_equal val, val
|
|
706
|
+
}
|
|
707
|
+
assert_equal "MESSAGE.\n#{default}", ex_message{
|
|
708
|
+
@tc.refute_equal val, val, 'MESSAGE'
|
|
709
|
+
}
|
|
710
|
+
end
|
|
711
|
+
end
|
|
712
|
+
|
|
713
|
+
def test_assert_instance_of
|
|
714
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
715
|
+
@tc.assert_instance_of Array, []
|
|
716
|
+
end
|
|
717
|
+
if_flunk "assert_instance_of seems to contain bug." do
|
|
718
|
+
default = "Expected \"\" to be an instance of Array."
|
|
719
|
+
assert_equal default, ex_message{
|
|
720
|
+
@tc.assert_instance_of Array, ''
|
|
721
|
+
}
|
|
722
|
+
assert_equal "MESSAGE.\n#{default}", ex_message{
|
|
723
|
+
@tc.assert_instance_of Array, '', 'MESSAGE'
|
|
724
|
+
}
|
|
725
|
+
end
|
|
726
|
+
end
|
|
727
|
+
|
|
728
|
+
def test_refute_instance_of
|
|
729
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
730
|
+
@tc.refute_instance_of Hash, []
|
|
731
|
+
end
|
|
732
|
+
if_flunk "refute_instance_of seems to contain bug." do
|
|
733
|
+
default = "Expected \"\" to not be an instance of String."
|
|
734
|
+
assert_equal default, ex_message{
|
|
735
|
+
@tc.refute_instance_of String, ''
|
|
736
|
+
}
|
|
737
|
+
assert_equal "MESSAGE.\n#{default}", ex_message{
|
|
738
|
+
@tc.refute_instance_of String, '', 'MESSAGE'
|
|
739
|
+
}
|
|
740
|
+
end
|
|
741
|
+
end
|
|
742
|
+
|
|
743
|
+
def test_assrt_kind_of
|
|
744
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
745
|
+
@tc.assert_kind_of IO, STDOUT
|
|
746
|
+
end
|
|
747
|
+
if_flunk "assrt_kind_of seems to contain bug." do
|
|
748
|
+
default = "Expected [] to be a kind of Hash."
|
|
749
|
+
assert_equal default, ex_message{
|
|
750
|
+
@tc.assert_kind_of Hash, []
|
|
751
|
+
}
|
|
752
|
+
assert_equal "MESSAGE.\n#{default}", ex_message{
|
|
753
|
+
@tc.assert_kind_of Hash, [], 'MESSAGE'
|
|
754
|
+
}
|
|
755
|
+
end
|
|
756
|
+
end
|
|
757
|
+
|
|
758
|
+
def test_refute_kind_of
|
|
759
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
760
|
+
@tc.refute_kind_of Array, 123
|
|
761
|
+
end
|
|
762
|
+
if_flunk "refute_kind_of seems to contain bug." do
|
|
763
|
+
default = "Expected 123 to not be a kind of Numeric."
|
|
764
|
+
assert_equal default, ex_message{
|
|
765
|
+
@tc.refute_kind_of Numeric, 123
|
|
766
|
+
}
|
|
767
|
+
assert_equal "MESSAGE.\n#{default}", ex_message{
|
|
768
|
+
@tc.refute_kind_of Numeric, 123, 'MESSAGE'
|
|
769
|
+
}
|
|
770
|
+
end
|
|
771
|
+
end
|
|
772
|
+
|
|
773
|
+
def test_assert_match
|
|
774
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
775
|
+
@tc.assert_match /\A=+/, "== headline"
|
|
776
|
+
end
|
|
777
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
778
|
+
@tc.assert_match 'bar', 'foobarbaz'
|
|
779
|
+
end
|
|
780
|
+
if_flunk "assert_match seems to contain bug." do
|
|
781
|
+
default = "Expected /(?!)/ to match \"hoge\"."
|
|
782
|
+
assert_equal default, ex_message{
|
|
783
|
+
@tc.assert_match /(?!)/, 'hoge'
|
|
784
|
+
}
|
|
785
|
+
assert_equal "MESSAGE.\n#{default}", ex_message{
|
|
786
|
+
@tc.assert_match /(?!)/, 'hoge', 'MESSAGE'
|
|
787
|
+
}
|
|
788
|
+
end
|
|
789
|
+
end
|
|
790
|
+
|
|
791
|
+
def test_refute_match
|
|
792
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
793
|
+
@tc.refute_match /(?!)/, 'WRYYYYYYYYYYY!!!'
|
|
794
|
+
end
|
|
795
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
796
|
+
@tc.refute_match 'hoge', 'foobarbaz'
|
|
797
|
+
end
|
|
798
|
+
if_flunk "refute_match seems to contain bug." do
|
|
799
|
+
default = "Expected /^[A-Z]/ to not match \"Hoge\"."
|
|
800
|
+
assert_equal default, ex_message{
|
|
801
|
+
@tc.refute_match /^[A-Z]/, 'Hoge'
|
|
802
|
+
}
|
|
803
|
+
assert_equal "MESSAGE.\n#{default}", ex_message{
|
|
804
|
+
@tc.refute_match /^[A-Z]/, 'Hoge', 'MESSAGE'
|
|
805
|
+
}
|
|
806
|
+
end
|
|
807
|
+
end
|
|
808
|
+
|
|
809
|
+
def test_assert_nil
|
|
810
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
811
|
+
@tc.assert_nil nil
|
|
812
|
+
end
|
|
813
|
+
if_flunk "assert_nil seems to contain bug." do
|
|
814
|
+
default = "Expected 123 to be nil."
|
|
815
|
+
assert_equal default, ex_message{
|
|
816
|
+
@tc.assert_nil 123
|
|
817
|
+
}
|
|
818
|
+
assert_equal "MESSAGE.\n#{default}", ex_message{
|
|
819
|
+
@tc.assert_nil 123, 'MESSAGE'
|
|
820
|
+
}
|
|
821
|
+
end
|
|
822
|
+
end
|
|
823
|
+
|
|
824
|
+
def test_refute_nil
|
|
825
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
826
|
+
@tc.refute_nil false
|
|
827
|
+
end
|
|
828
|
+
if_flunk "refute_nil seems to contain bug." do
|
|
829
|
+
default = "Expected nil to not be nil."
|
|
830
|
+
assert_equal default, ex_message{
|
|
831
|
+
@tc.refute_nil nil
|
|
832
|
+
}
|
|
833
|
+
assert_equal "MESSAGE.\n#{default}", ex_message{
|
|
834
|
+
@tc.refute_nil nil, 'MESSAGE'
|
|
835
|
+
}
|
|
836
|
+
end
|
|
837
|
+
end
|
|
838
|
+
|
|
839
|
+
def test_assert_same
|
|
840
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
841
|
+
@tc.assert_same :hoge, :hoge
|
|
842
|
+
end
|
|
843
|
+
if_flunk "assert_same seems to contain bug." do
|
|
844
|
+
expected, actual = Array.new(2){ Object.new }
|
|
845
|
+
default = sprintf(
|
|
846
|
+
"Expected %s (0x%x) to be the same as %s (0x%x).",
|
|
847
|
+
expected.inspect, expected.object_id,
|
|
848
|
+
actual.inspect, actual.object_id
|
|
849
|
+
)
|
|
850
|
+
assert_equal default, ex_message{
|
|
851
|
+
@tc.assert_same expected, actual
|
|
852
|
+
}
|
|
853
|
+
assert_equal "MESSAGE.\n#{default}", ex_message{
|
|
854
|
+
@tc.assert_same expected, actual, 'MESSAGE'
|
|
855
|
+
}
|
|
856
|
+
end
|
|
857
|
+
end
|
|
858
|
+
|
|
859
|
+
def test_refute_same
|
|
860
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
861
|
+
@tc.refute_same *Array.new(2){ Object.new }
|
|
862
|
+
end
|
|
863
|
+
if_flunk "refute_same seems to contain bug." do
|
|
864
|
+
default = "Expected :hoge to not be the same as :hoge."
|
|
865
|
+
assert_equal default, ex_message{
|
|
866
|
+
@tc.refute_same :hoge, :hoge
|
|
867
|
+
}
|
|
868
|
+
assert_equal "MESSAGE.\n#{default}", ex_message{
|
|
869
|
+
@tc.refute_same :hoge, :hoge, 'MESSAGE'
|
|
870
|
+
}
|
|
871
|
+
end
|
|
872
|
+
end
|
|
873
|
+
|
|
874
|
+
def test_assert_respond_to
|
|
875
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
876
|
+
@tc.assert_respond_to 123, :divmod
|
|
877
|
+
end
|
|
878
|
+
if_flunk "assert_respond_to seems to contain bug." do
|
|
879
|
+
default = "Expected 666 (Fixnum) to respond to encoding."
|
|
880
|
+
assert_equal default, ex_message{
|
|
881
|
+
@tc.assert_respond_to 666, :encoding
|
|
882
|
+
}
|
|
883
|
+
assert_equal "MESSAGE.\n#{default}", ex_message{
|
|
884
|
+
@tc.assert_respond_to 666, :encoding, 'MESSAGE'
|
|
885
|
+
}
|
|
886
|
+
end
|
|
887
|
+
end
|
|
888
|
+
|
|
889
|
+
def test_refute_respond_to
|
|
890
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
891
|
+
@tc.refute_respond_to 666, :encoding
|
|
892
|
+
end
|
|
893
|
+
if_flunk "refute_respond_to seems to contain bug." do
|
|
894
|
+
default = "Expected \"hoge\" to not respond to capitalize."
|
|
895
|
+
assert_equal default, ex_message{
|
|
896
|
+
@tc.refute_respond_to 'hoge', :capitalize
|
|
897
|
+
}
|
|
898
|
+
assert_equal "MESSAGE.\n#{default}", ex_message{
|
|
899
|
+
@tc.refute_respond_to 'hoge', :capitalize, 'MESSAGE'
|
|
900
|
+
}
|
|
901
|
+
end
|
|
902
|
+
end
|
|
903
|
+
|
|
904
|
+
def test_assert_empty
|
|
905
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
906
|
+
@tc.assert_empty []
|
|
907
|
+
end
|
|
908
|
+
assert_raises TinyTest::AssertError do
|
|
909
|
+
@tc.assert_empty 666
|
|
910
|
+
end
|
|
911
|
+
if_flunk "assert_empty seems to contain bug." do
|
|
912
|
+
default = "Expected [1, 2, 3] to be empty."
|
|
913
|
+
assert_equal default, ex_message{
|
|
914
|
+
@tc.assert_empty [1, 2, 3]
|
|
915
|
+
}
|
|
916
|
+
assert_equal "MESSAGE.\n#{default}", ex_message{
|
|
917
|
+
@tc.assert_empty [1, 2, 3], 'MESSAGE'
|
|
918
|
+
}
|
|
919
|
+
end
|
|
920
|
+
end
|
|
921
|
+
|
|
922
|
+
def test_refute_empty
|
|
923
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
924
|
+
@tc.refute_empty 'hoge'
|
|
925
|
+
end
|
|
926
|
+
assert_raises TinyTest::AssertError do
|
|
927
|
+
@tc.refute_empty 666
|
|
928
|
+
end
|
|
929
|
+
if_flunk "refute_empty seems to contain bug." do
|
|
930
|
+
default = "Expected [] to not be empty."
|
|
931
|
+
assert_equal default, ex_message{
|
|
932
|
+
@tc.refute_empty []
|
|
933
|
+
}
|
|
934
|
+
assert_equal "MESSAGE.\n#{default}", ex_message{
|
|
935
|
+
@tc.refute_empty [], 'MESSAGE'
|
|
936
|
+
}
|
|
937
|
+
end
|
|
938
|
+
end
|
|
939
|
+
|
|
940
|
+
def test_assert_includes
|
|
941
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
942
|
+
@tc.assert_includes [1, 2, 3], 2
|
|
943
|
+
end
|
|
944
|
+
assert_raises TinyTest::AssertError do
|
|
945
|
+
@tc.assert_includes 666, 4
|
|
946
|
+
end
|
|
947
|
+
if_flunk "assert_includes seems to contain bug." do
|
|
948
|
+
default = "Expected [1, 2, 3] to include 666."
|
|
949
|
+
assert_equal default, ex_message{
|
|
950
|
+
@tc.assert_includes [1, 2, 3], 666
|
|
951
|
+
}
|
|
952
|
+
assert_equal "MESSAGE.\n#{default}", ex_message{
|
|
953
|
+
@tc.assert_includes [1, 2, 3], 666, 'MESSAGE'
|
|
954
|
+
}
|
|
955
|
+
end
|
|
956
|
+
end
|
|
957
|
+
|
|
958
|
+
def test_refute_includes
|
|
959
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
960
|
+
@tc.refute_includes [1, 2, 3], 666
|
|
961
|
+
end
|
|
962
|
+
assert_raises TinyTest::AssertError do
|
|
963
|
+
@tc.assert_includes 666, 4
|
|
964
|
+
end
|
|
965
|
+
if_flunk "refute_includes seems to contain bug." do
|
|
966
|
+
default = %Q`Expected ["a", "b", "c"] to not include "b".`
|
|
967
|
+
assert_equal default, ex_message{
|
|
968
|
+
@tc.refute_includes %w[a b c], 'b'
|
|
969
|
+
}
|
|
970
|
+
assert_equal "MESSAGE.\n#{default}", ex_message{
|
|
971
|
+
@tc.refute_includes %w[a b c], 'b', 'MESSAGE'
|
|
972
|
+
}
|
|
973
|
+
end
|
|
974
|
+
end
|
|
975
|
+
|
|
976
|
+
def test_assert_in_delta
|
|
977
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
978
|
+
@tc.assert_in_delta 1, 1
|
|
979
|
+
end
|
|
980
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
981
|
+
@tc.assert_in_delta 1, 2, 10
|
|
982
|
+
end
|
|
983
|
+
assert_raises TinyTest::AssertError do
|
|
984
|
+
@tc.assert_in_delta 1, 2
|
|
985
|
+
end
|
|
986
|
+
if_flunk "assert_in_delta seems to contain bug." do
|
|
987
|
+
default = "Expected 1 - 10 (9) to be < %s."
|
|
988
|
+
assert_equal default % '0.001', ex_message{
|
|
989
|
+
@tc.assert_in_delta 1, 10
|
|
990
|
+
}
|
|
991
|
+
assert_equal "MESSAGE.\n#{default % '0.001'}", ex_message{
|
|
992
|
+
@tc.assert_in_delta 1, 10, 'MESSAGE'
|
|
993
|
+
}
|
|
994
|
+
assert_equal default % '5.0', ex_message{
|
|
995
|
+
@tc.assert_in_delta 1, 10, 5
|
|
996
|
+
}
|
|
997
|
+
assert_equal "MESSAGE.\n#{default % '5.0'}", ex_message{
|
|
998
|
+
@tc.assert_in_delta 1, 10, 5, 'MESSAGE'
|
|
999
|
+
}
|
|
1000
|
+
end
|
|
1001
|
+
end
|
|
1002
|
+
|
|
1003
|
+
def test_refute_in_delta
|
|
1004
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
1005
|
+
@tc.refute_in_delta 1, 10
|
|
1006
|
+
end
|
|
1007
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
1008
|
+
@tc.refute_in_delta 1, 2, 0.1
|
|
1009
|
+
end
|
|
1010
|
+
assert_raises TinyTest::AssertError do
|
|
1011
|
+
@tc.refute_in_delta 1, 1
|
|
1012
|
+
end
|
|
1013
|
+
if_flunk "refute_in_delta seems to contain bug." do
|
|
1014
|
+
default = "Expected 1 - 1 (0) to not be < %s."
|
|
1015
|
+
assert_equal default % '0.001', ex_message{
|
|
1016
|
+
@tc.refute_in_delta 1, 1
|
|
1017
|
+
}
|
|
1018
|
+
assert_equal "MESSAGE.\n#{default % '0.001'}", ex_message{
|
|
1019
|
+
@tc.refute_in_delta 1, 1, 'MESSAGE'
|
|
1020
|
+
}
|
|
1021
|
+
assert_equal default % '100.0', ex_message{
|
|
1022
|
+
@tc.refute_in_delta 1, 1, 100
|
|
1023
|
+
}
|
|
1024
|
+
assert_equal "MESSAGE.\n#{default % '100.0'}", ex_message{
|
|
1025
|
+
@tc.refute_in_delta 1, 1, 100, 'MESSAGE'
|
|
1026
|
+
}
|
|
1027
|
+
end
|
|
1028
|
+
end
|
|
1029
|
+
|
|
1030
|
+
def test_assert_in_epsilon
|
|
1031
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
1032
|
+
@tc.assert_in_epsilon 1, 1
|
|
1033
|
+
end
|
|
1034
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
1035
|
+
@tc.assert_in_epsilon 1, 2, 10
|
|
1036
|
+
end
|
|
1037
|
+
assert_raises TinyTest::AssertError do
|
|
1038
|
+
@tc.assert_in_epsilon 1, 2
|
|
1039
|
+
end
|
|
1040
|
+
if_flunk "assert_in_epsilon seems to contain bug." do
|
|
1041
|
+
default = "Expected 1 - 10 (9) to be < %s."
|
|
1042
|
+
assert_equal default % '0.001', ex_message{
|
|
1043
|
+
@tc.assert_in_epsilon 1, 10
|
|
1044
|
+
}
|
|
1045
|
+
assert_equal "MESSAGE.\n#{default % '0.001'}", ex_message{
|
|
1046
|
+
@tc.assert_in_epsilon 1, 10, 'MESSAGE'
|
|
1047
|
+
}
|
|
1048
|
+
end
|
|
1049
|
+
end
|
|
1050
|
+
|
|
1051
|
+
def test_refute_in_epsilon
|
|
1052
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
1053
|
+
@tc.refute_in_epsilon 1, 10
|
|
1054
|
+
end
|
|
1055
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
1056
|
+
@tc.refute_in_epsilon 1, 1.0001, 0.00001
|
|
1057
|
+
end
|
|
1058
|
+
assert_raises TinyTest::AssertError do
|
|
1059
|
+
@tc.refute_in_epsilon 1, 1.0001
|
|
1060
|
+
end
|
|
1061
|
+
if_flunk "refute_in_epsilon seems to contain bug." do
|
|
1062
|
+
default = "Expected 1 - 1 (0) to not be < %s."
|
|
1063
|
+
assert_equal default % '0.001', ex_message{
|
|
1064
|
+
@tc.refute_in_epsilon 1, 1
|
|
1065
|
+
}
|
|
1066
|
+
assert_equal "MESSAGE.\n#{default % '0.001'}", ex_message{
|
|
1067
|
+
@tc.refute_in_epsilon 1, 1, 'MESSAGE'
|
|
1068
|
+
}
|
|
1069
|
+
end
|
|
1070
|
+
end
|
|
1071
|
+
|
|
1072
|
+
def test_assert_operator
|
|
1073
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
1074
|
+
@tc.assert_operator :hoge, :equal?, :hoge
|
|
1075
|
+
end
|
|
1076
|
+
if_flunk "assert_operator seems to contain bug." do
|
|
1077
|
+
default = "Expected :hoge to be == :piyo."
|
|
1078
|
+
assert_equal default, ex_message{
|
|
1079
|
+
@tc.assert_operator :hoge, :==, :piyo
|
|
1080
|
+
}
|
|
1081
|
+
assert_equal "MESSAGE.\n#{default}", ex_message{
|
|
1082
|
+
@tc.assert_operator :hoge, :==, :piyo, 'MESSAGE'
|
|
1083
|
+
}
|
|
1084
|
+
end
|
|
1085
|
+
end
|
|
1086
|
+
|
|
1087
|
+
def test_refute_operator
|
|
1088
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
1089
|
+
@tc.refute_operator 'foo', :equal?, :bar
|
|
1090
|
+
end
|
|
1091
|
+
if_flunk "refute_operator seems to contain bug." do
|
|
1092
|
+
default = "Expected 123 to not be == 123."
|
|
1093
|
+
assert_equal default, ex_message{
|
|
1094
|
+
@tc.refute_operator 123, :==, 123
|
|
1095
|
+
}
|
|
1096
|
+
assert_equal "MESSAGE.\n#{default}", ex_message{
|
|
1097
|
+
@tc.refute_operator 123, :==, 123, 'MESSAGE'
|
|
1098
|
+
}
|
|
1099
|
+
end
|
|
1100
|
+
end
|
|
1101
|
+
|
|
1102
|
+
def test_assert_send
|
|
1103
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
1104
|
+
@tc.assert_send [[1, 2, 3], :include?, 2]
|
|
1105
|
+
end
|
|
1106
|
+
if_flunk "assert_send seems to contain bug." do
|
|
1107
|
+
default = "Expected [1, 2, 3].include?(10) to be evaluated as true."
|
|
1108
|
+
assert_equal default, ex_message{
|
|
1109
|
+
@tc.assert_send [[1, 2, 3], :include?, 10]
|
|
1110
|
+
}
|
|
1111
|
+
assert_equal "MESSAGE.\n#{default}", ex_message{
|
|
1112
|
+
@tc.assert_send [[1, 2, 3], :include?, 10], 'MESSAGE'
|
|
1113
|
+
}
|
|
1114
|
+
end
|
|
1115
|
+
end
|
|
1116
|
+
|
|
1117
|
+
def test_refute_send
|
|
1118
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
1119
|
+
@tc.refute_send [{}, :fetch, :key, nil]
|
|
1120
|
+
end
|
|
1121
|
+
if_flunk "refute_send seems to contain bug." do
|
|
1122
|
+
default = "Expected {:key=>123}.fetch(:key, nil) to be evaluated as false."
|
|
1123
|
+
assert_equal default, ex_message{
|
|
1124
|
+
@tc.refute_send [{:key => 123}, :fetch, :key, nil]
|
|
1125
|
+
}
|
|
1126
|
+
assert_equal "MESSAGE.\n#{default}", ex_message{
|
|
1127
|
+
@tc.refute_send [{:key => 123}, :fetch, :key, nil], 'MESSAGE'
|
|
1128
|
+
}
|
|
1129
|
+
end
|
|
1130
|
+
end
|
|
1131
|
+
|
|
1132
|
+
def test_assert_raises
|
|
1133
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
1134
|
+
@tc.assert_raises(ZeroDivisionError){ 666 / 0 }
|
|
1135
|
+
end
|
|
1136
|
+
assert_raises ArgumentError do
|
|
1137
|
+
@tc.assert_raises{}
|
|
1138
|
+
end
|
|
1139
|
+
assert_raises LocalJumpError do
|
|
1140
|
+
@tc.assert_raises(RuntimeError)
|
|
1141
|
+
end
|
|
1142
|
+
if_flunk "assert_raises seems to contain bug." do
|
|
1143
|
+
msg = "[RuntimeError, ZeroDivisionError] expected but nothing was raised"
|
|
1144
|
+
assert_equal msg, ex_message{
|
|
1145
|
+
@tc.assert_raises([RuntimeError, ZeroDivisionError]){}
|
|
1146
|
+
}
|
|
1147
|
+
assert_match /\AMSG.\n/, ex_message{
|
|
1148
|
+
@tc.assert_raises(RuntimeError, 'MSG'){}
|
|
1149
|
+
}
|
|
1150
|
+
actual = nil
|
|
1151
|
+
actual_message = ex_message{
|
|
1152
|
+
@tc.assert_raises(ZeroDivisionError) do
|
|
1153
|
+
begin
|
|
1154
|
+
raise 'MSG'
|
|
1155
|
+
rescue => ex
|
|
1156
|
+
actual = ex
|
|
1157
|
+
raise ex
|
|
1158
|
+
end
|
|
1159
|
+
end
|
|
1160
|
+
}
|
|
1161
|
+
expected = [
|
|
1162
|
+
"[ZeroDivisionError] expected, but\n",
|
|
1163
|
+
"Class: <RuntimeError>\n",
|
|
1164
|
+
"Message: <MSG>\n",
|
|
1165
|
+
"---Backtrace---\n",
|
|
1166
|
+
].join('')
|
|
1167
|
+
expected << actual.backtrace.reject{|b| TestUtil.start_with?(b, TINYTEST_FEATURE) }.join("\n") << "\n"
|
|
1168
|
+
expected << "---------------"
|
|
1169
|
+
assert_equal expected, actual_message
|
|
1170
|
+
end
|
|
1171
|
+
end
|
|
1172
|
+
|
|
1173
|
+
def test_refute_raises
|
|
1174
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
1175
|
+
@tc.refute_raises(SystemStackError){ 666 / 0 }
|
|
1176
|
+
end
|
|
1177
|
+
assert_raises ArgumentError do
|
|
1178
|
+
@tc.refute_raises{}
|
|
1179
|
+
end
|
|
1180
|
+
assert_raises LocalJumpError do
|
|
1181
|
+
@tc.refute_raises(RuntimeError)
|
|
1182
|
+
end
|
|
1183
|
+
if_flunk "refute_raises seems to contain bug." do
|
|
1184
|
+
assert_match /\AMSG.\n/, ex_message{
|
|
1185
|
+
@tc.refute_raises(ZeroDivisionError, 'MSG'){ 666 / 0 }
|
|
1186
|
+
}
|
|
1187
|
+
actual = nil
|
|
1188
|
+
actual_message = ex_message{
|
|
1189
|
+
@tc.refute_raises(RuntimeError) do
|
|
1190
|
+
begin
|
|
1191
|
+
raise 'MSG'
|
|
1192
|
+
rescue => ex
|
|
1193
|
+
actual = ex
|
|
1194
|
+
raise ex
|
|
1195
|
+
end
|
|
1196
|
+
end
|
|
1197
|
+
}
|
|
1198
|
+
expected = [
|
|
1199
|
+
"[RuntimeError] not expected, but\n",
|
|
1200
|
+
"Class: <RuntimeError>\n",
|
|
1201
|
+
"Message: <MSG>\n",
|
|
1202
|
+
"---Backtrace---\n",
|
|
1203
|
+
].join('')
|
|
1204
|
+
expected << actual.backtrace.reject{|b| TestUtil.start_with?(b, TINYTEST_FEATURE) }.join("\n") << "\n"
|
|
1205
|
+
expected << "---------------"
|
|
1206
|
+
assert_equal expected, actual_message
|
|
1207
|
+
end
|
|
1208
|
+
end
|
|
1209
|
+
|
|
1210
|
+
def uncaught_throw_ex_class
|
|
1211
|
+
throw :hoge
|
|
1212
|
+
rescue => ex
|
|
1213
|
+
ex.class
|
|
1214
|
+
else
|
|
1215
|
+
raise Exception, 'must not happen'
|
|
1216
|
+
end
|
|
1217
|
+
|
|
1218
|
+
def test_assert_throws
|
|
1219
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
1220
|
+
@tc.assert_throws(:hoge){ throw :hoge }
|
|
1221
|
+
end
|
|
1222
|
+
assert_raises uncaught_throw_ex_class() do
|
|
1223
|
+
@tc.assert_throws(:hoge){ throw :piyo }
|
|
1224
|
+
end
|
|
1225
|
+
if_flunk "assert_throws seems to contain bug." do
|
|
1226
|
+
default = "Expected :hoge to have been thrown."
|
|
1227
|
+
assert_equal default, ex_message{
|
|
1228
|
+
@tc.assert_throws(:hoge){}
|
|
1229
|
+
}
|
|
1230
|
+
assert_equal "MESSAGE.\n#{default}", ex_message{
|
|
1231
|
+
@tc.assert_throws(:hoge, 'MESSAGE'){}
|
|
1232
|
+
}
|
|
1233
|
+
end
|
|
1234
|
+
end
|
|
1235
|
+
|
|
1236
|
+
def test_refute_throws
|
|
1237
|
+
assert_nothing_raised TinyTest::AssertError do
|
|
1238
|
+
@tc.refute_throws(:hoge){}
|
|
1239
|
+
end
|
|
1240
|
+
if_flunk "refute_throws seems to contain bug." do
|
|
1241
|
+
default = "Expected :hoge to not have been thrown."
|
|
1242
|
+
assert_equal default, ex_message{
|
|
1243
|
+
@tc.refute_throws(:hoge){ throw :hoge }
|
|
1244
|
+
}
|
|
1245
|
+
assert_equal "MESSAGE.\n#{default}", ex_message{
|
|
1246
|
+
@tc.refute_throws(:hoge, 'MESSAGE'){ throw :hoge }
|
|
1247
|
+
}
|
|
1248
|
+
end
|
|
1249
|
+
end
|
|
1250
|
+
end
|
|
1251
|
+
|