tapout 0.2.3 → 0.3.0
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/.ruby +6 -5
- data/HISTORY.rdoc +11 -0
- data/PROFILE +1 -1
- data/TAP-YJ.md +32 -12
- data/lib/tapout.rb +16 -8
- data/lib/tapout.yml +46 -0
- data/lib/tapout/adapters/perl.rb +1 -1
- data/lib/tapout/core_ext.rb +31 -0
- data/lib/tapout/parsers/json.rb +1 -1
- data/lib/tapout/reporters.rb +10 -6
- data/lib/tapout/reporters/abstract.rb +90 -53
- data/lib/tapout/reporters/{breakdown.rb → breakdown_reporter.rb} +5 -4
- data/lib/tapout/reporters/{dotprogress.rb → dot_reporter.rb} +4 -3
- data/lib/tapout/reporters/{html.rb → html_reporter.rb} +2 -2
- data/lib/tapout/reporters/{outline.rb → outline_reporter.rb} +2 -2
- data/lib/tapout/reporters/pretty_reporter.rb +205 -0
- data/lib/tapout/reporters/progress_reporter.rb +205 -0
- data/lib/tapout/reporters/{tap.rb → tap_reporter.rb} +2 -2
- data/lib/tapout/reporters/turn_reporter.rb +178 -0
- data/lib/tapout/version.rb +17 -4
- data/spec/applique/env.rb +5 -0
- data/spec/perl_adapter.rdoc +68 -0
- data/spec/reporters/applique/cli.rb +13 -0
- data/spec/reporters/fixtures/tapy.yml +78 -0
- data/spec/reporters/reporters.rdoc +86 -0
- data/test/unit/test-progressbar.rb +5 -0
- metadata +26 -16
- data/lib/tapout/reporters/progressbar.rb +0 -93
@@ -4,8 +4,9 @@ module TapOut
|
|
4
4
|
|
5
5
|
module Reporters
|
6
6
|
|
7
|
-
# The Breakdown report format
|
8
|
-
|
7
|
+
# The Breakdown report format gives a tally for each test case.
|
8
|
+
#
|
9
|
+
class BreakdownReporter < Abstract
|
9
10
|
|
10
11
|
def initialize
|
11
12
|
super
|
@@ -23,7 +24,7 @@ module TapOut
|
|
23
24
|
@case_entries = []
|
24
25
|
end
|
25
26
|
|
26
|
-
def
|
27
|
+
def start_test(entry)
|
27
28
|
@case_entries << entry
|
28
29
|
end
|
29
30
|
|
@@ -110,7 +111,7 @@ module TapOut
|
|
110
111
|
end
|
111
112
|
#end
|
112
113
|
|
113
|
-
puts
|
114
|
+
puts tally_message(entry)
|
114
115
|
end
|
115
116
|
|
116
117
|
end
|
@@ -3,7 +3,8 @@ require 'tapout/reporters/abstract'
|
|
3
3
|
module TapOut::Reporters
|
4
4
|
|
5
5
|
# Traditional dot progress reporter.
|
6
|
-
|
6
|
+
#
|
7
|
+
class DotReporter < Abstract
|
7
8
|
|
8
9
|
#
|
9
10
|
def start_suite(entry)
|
@@ -26,7 +27,7 @@ module TapOut::Reporters
|
|
26
27
|
end
|
27
28
|
|
28
29
|
#
|
29
|
-
def
|
30
|
+
def error(entry)
|
30
31
|
$stdout.print 'E'.ansi(:yellow)
|
31
32
|
$stdout.flush
|
32
33
|
super(entry)
|
@@ -61,7 +62,7 @@ module TapOut::Reporters
|
|
61
62
|
end
|
62
63
|
|
63
64
|
$stdout.puts "Finished in #{Time.now - @start_time}s"
|
64
|
-
$stdout.puts
|
65
|
+
$stdout.puts tally_message(entry)
|
65
66
|
end
|
66
67
|
|
67
68
|
end
|
@@ -81,7 +81,7 @@ module TapOut::Reporters
|
|
81
81
|
end
|
82
82
|
|
83
83
|
#
|
84
|
-
def
|
84
|
+
def error(entry)
|
85
85
|
e = entry['exception']
|
86
86
|
|
87
87
|
puts %[<li class="error">]
|
@@ -117,7 +117,7 @@ module TapOut::Reporters
|
|
117
117
|
def finish_suite(entry)
|
118
118
|
puts ""
|
119
119
|
puts %[<div class="tally">]
|
120
|
-
puts
|
120
|
+
puts tally_message(entry)
|
121
121
|
puts %[</div>]
|
122
122
|
puts ""
|
123
123
|
puts ""
|
@@ -34,7 +34,7 @@ module TapOut::Reporters
|
|
34
34
|
$stdout.puts
|
35
35
|
end
|
36
36
|
|
37
|
-
def
|
37
|
+
def error(entry)
|
38
38
|
super(entry)
|
39
39
|
$stdout.puts "* " + entry['label'].ansi(:yellow) + " #{entry['source']}"
|
40
40
|
$stdout.puts
|
@@ -48,7 +48,7 @@ module TapOut::Reporters
|
|
48
48
|
#
|
49
49
|
def finish_suite(entry)
|
50
50
|
#$stderr.puts
|
51
|
-
$stdout.print
|
51
|
+
$stdout.print tally_message(entry)
|
52
52
|
$stdout.puts " [%0.4fs] " % [Time.now - @start_time]
|
53
53
|
end
|
54
54
|
|
@@ -0,0 +1,205 @@
|
|
1
|
+
require 'tapout/core_ext'
|
2
|
+
require 'tapout/reporters/abstract'
|
3
|
+
|
4
|
+
module TapOut
|
5
|
+
|
6
|
+
module Reporters
|
7
|
+
|
8
|
+
# = Pretty Reporter (by Paydro)
|
9
|
+
#
|
10
|
+
class PrettyReporter < Abstract
|
11
|
+
|
12
|
+
#
|
13
|
+
PADDING_SIZE = 4
|
14
|
+
|
15
|
+
PASS = "PASS".ansi(:green)
|
16
|
+
FAIL = "FAIL".ansi(:red)
|
17
|
+
ERROR = "ERROR".ansi(:yellow)
|
18
|
+
|
19
|
+
#
|
20
|
+
def start_suite(suite)
|
21
|
+
#old_sync, @@out.sync = @@out.sync, true if io.respond_to? :sync=
|
22
|
+
@suite = suite
|
23
|
+
@time = Time.now
|
24
|
+
#@stdout = StringIO.new
|
25
|
+
#@stderr = StringIO.new
|
26
|
+
#files = suite.collect{ |s| s.file }.join(' ')
|
27
|
+
#puts "Loaded suite #{suite.name}"
|
28
|
+
puts "Suite seed: #{suite['seed']}" if suite['seed']
|
29
|
+
puts "Started"
|
30
|
+
end
|
31
|
+
|
32
|
+
#
|
33
|
+
def start_case(kase)
|
34
|
+
#if kase.size > 0 # TODO: Don't have size yet?
|
35
|
+
print "\n#{kase['label']}:\n"
|
36
|
+
#end
|
37
|
+
end
|
38
|
+
|
39
|
+
#
|
40
|
+
def start_test(test)
|
41
|
+
@test_time = Time.now
|
42
|
+
@test = test
|
43
|
+
#if @file != test.file
|
44
|
+
# @file = test.file
|
45
|
+
# puts(test.file)
|
46
|
+
#end
|
47
|
+
#print " %-69s" % test.name
|
48
|
+
#$stdout = @stdout
|
49
|
+
#$stderr = @stderr
|
50
|
+
#$stdout.rewind
|
51
|
+
#$stderr.rewind
|
52
|
+
end
|
53
|
+
|
54
|
+
#
|
55
|
+
def pass(test)
|
56
|
+
print pad_with_size("#{PASS}")
|
57
|
+
print " #{test['label']}"
|
58
|
+
print " (%.2fs) " % (Time.now - @test_time)
|
59
|
+
#if message
|
60
|
+
# message = test['source'].ansi(:magenta)
|
61
|
+
# message = message.to_s.tabto(10)
|
62
|
+
# puts(message)
|
63
|
+
#end
|
64
|
+
end
|
65
|
+
|
66
|
+
#
|
67
|
+
def fail(test)
|
68
|
+
print pad_with_size("#{FAIL}")
|
69
|
+
print " #{test['label']}"
|
70
|
+
print " (%.2fs) " % (Time.now - @test_time)
|
71
|
+
|
72
|
+
#message = assertion.location[0] + "\n" + assertion.message #.gsub("\n","\n")
|
73
|
+
#trace = MiniTest::filter_backtrace(report[:exception].backtrace).first
|
74
|
+
|
75
|
+
message = test['exception']['message']
|
76
|
+
|
77
|
+
if bt = test['exception']['backtrace']
|
78
|
+
_trace = clean_backtrace(bt)
|
79
|
+
else
|
80
|
+
_trace = clean_backtrace(bt)
|
81
|
+
end
|
82
|
+
|
83
|
+
puts
|
84
|
+
tabsize = 10
|
85
|
+
#puts pad(message, tabsize)
|
86
|
+
puts message.tabto(tabsize)
|
87
|
+
puts _trace.shift.tabto(tabsize)
|
88
|
+
if depth = TapOut.trace
|
89
|
+
puts _trace[0,depth].map{|l| l.tabto(tabsize) }.join("\n")
|
90
|
+
end
|
91
|
+
#show_captured_output
|
92
|
+
end
|
93
|
+
|
94
|
+
#
|
95
|
+
def error(test)
|
96
|
+
print pad_with_size("#{ERROR}")
|
97
|
+
print " #{test['label']}"
|
98
|
+
print " (%.2fs) " % (Time.now - @test_time)
|
99
|
+
|
100
|
+
#message = exception.to_s.split("\n")[2..-1].join("\n")
|
101
|
+
|
102
|
+
message = test['exception']['message']
|
103
|
+
|
104
|
+
if bt = test['exception']['backtrace']
|
105
|
+
_trace = clean_backtrace(bt)
|
106
|
+
else
|
107
|
+
_trace = filter_backtrace(bt)
|
108
|
+
end
|
109
|
+
|
110
|
+
trace = _trace.shift
|
111
|
+
puts
|
112
|
+
tabsize = 10
|
113
|
+
puts message.tabto(tabsize)
|
114
|
+
puts trace.tabto(tabsize)
|
115
|
+
if depth = TapOut.trace
|
116
|
+
puts _trace[0,depth].map{|l| l.tabto(tabsize) }.join("\n")
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
# TODO: skip support
|
121
|
+
#def skip
|
122
|
+
# puts(pad_with_size("#{SKIP}"))
|
123
|
+
#end
|
124
|
+
|
125
|
+
#
|
126
|
+
def finish_test(test)
|
127
|
+
puts
|
128
|
+
#@test_count += 1
|
129
|
+
#@assertion_count += inst._assertions
|
130
|
+
#$stdout = STDOUT
|
131
|
+
#$stderr = STDERR
|
132
|
+
end
|
133
|
+
|
134
|
+
=begin
|
135
|
+
def show_captured_output
|
136
|
+
show_captured_stdout
|
137
|
+
show_captured_stderr
|
138
|
+
end
|
139
|
+
|
140
|
+
def show_captured_stdout
|
141
|
+
@stdout.rewind
|
142
|
+
return if @stdout.eof?
|
143
|
+
STDOUT.puts(<<-output.tabto(8))
|
144
|
+
\nSTDOUT:
|
145
|
+
#{@stdout.read}
|
146
|
+
output
|
147
|
+
end
|
148
|
+
|
149
|
+
def show_captured_stderr
|
150
|
+
@stderr.rewind
|
151
|
+
return if @stderr.eof?
|
152
|
+
STDOUT.puts(<<-output.tabto(8))
|
153
|
+
\nSTDERR:
|
154
|
+
#{@stderr.read}
|
155
|
+
output
|
156
|
+
end
|
157
|
+
=end
|
158
|
+
|
159
|
+
def finish_case(kase)
|
160
|
+
#if kase.size == 0
|
161
|
+
# puts pad("(No Tests)")
|
162
|
+
#end
|
163
|
+
end
|
164
|
+
|
165
|
+
#
|
166
|
+
def finish_suite(final)
|
167
|
+
#@@out.sync = old_sync if @@out.respond_to? :sync=
|
168
|
+
|
169
|
+
total = final['counts']['total'] || 0
|
170
|
+
failure = final['counts']['fail'] || 0
|
171
|
+
error = final['counts']['error'] || 0
|
172
|
+
skip = final['counts']['skip'] || 0
|
173
|
+
omit = final['counts']['omit'] || 0
|
174
|
+
#pass = total - failure - error
|
175
|
+
|
176
|
+
puts
|
177
|
+
puts "Finished in #{'%.6f' % (Time.now - @time)} seconds."
|
178
|
+
puts
|
179
|
+
|
180
|
+
print "%d tests, " % total
|
181
|
+
#print "%d assertions, " % suite.count_assertions
|
182
|
+
print ("%d failures" % failure).ansi(:red) + ', '
|
183
|
+
print ("%d errors" % error).ansi(:yellow) + ', '
|
184
|
+
print ("%d pending" % skip).ansi(:cyan)
|
185
|
+
puts
|
186
|
+
end
|
187
|
+
|
188
|
+
private
|
189
|
+
|
190
|
+
#
|
191
|
+
def pad(str, size=PADDING_SIZE)
|
192
|
+
" " * size + str
|
193
|
+
end
|
194
|
+
|
195
|
+
#
|
196
|
+
def pad_with_size(str)
|
197
|
+
" " * (18 - str.size) + str
|
198
|
+
end
|
199
|
+
|
200
|
+
end
|
201
|
+
|
202
|
+
end
|
203
|
+
|
204
|
+
end
|
205
|
+
|
@@ -0,0 +1,205 @@
|
|
1
|
+
require 'tapout/reporters/abstract'
|
2
|
+
require 'ansi/progressbar'
|
3
|
+
|
4
|
+
module TapOut
|
5
|
+
|
6
|
+
module Reporters
|
7
|
+
|
8
|
+
# The progress report format utilises a progress bar to indicate
|
9
|
+
# elapsed progress.
|
10
|
+
#
|
11
|
+
class ProgressReporter < Abstract
|
12
|
+
|
13
|
+
def start_suite(entry)
|
14
|
+
@pbar = ::ANSI::Progressbar.new('Testing', entry['count'].to_i + 1)
|
15
|
+
@pbar.style(:bar=>:green)
|
16
|
+
@pbar.inc
|
17
|
+
end
|
18
|
+
|
19
|
+
def start_case(entry)
|
20
|
+
end
|
21
|
+
|
22
|
+
#def test(entry)
|
23
|
+
# #@pbar.inc
|
24
|
+
#end
|
25
|
+
|
26
|
+
def pass(entry)
|
27
|
+
@pbar.inc
|
28
|
+
end
|
29
|
+
|
30
|
+
#
|
31
|
+
def fail(entry)
|
32
|
+
@pbar.clear
|
33
|
+
|
34
|
+
e = entry['exception']
|
35
|
+
|
36
|
+
puts
|
37
|
+
message = e['message'].strip
|
38
|
+
message = message.ansi(:red)
|
39
|
+
puts(message)
|
40
|
+
puts "#{e['file']}:#{e['line']}"
|
41
|
+
puts
|
42
|
+
puts code_snippet(e)
|
43
|
+
puts
|
44
|
+
|
45
|
+
@pbar.style(:bar=>:red)
|
46
|
+
@pbar.inc
|
47
|
+
end
|
48
|
+
|
49
|
+
#
|
50
|
+
def error(entry) #message=nil)
|
51
|
+
@pbar.clear
|
52
|
+
|
53
|
+
e = entry['exception']
|
54
|
+
|
55
|
+
puts
|
56
|
+
message = e['message'].strip
|
57
|
+
message = message.ansi(:red)
|
58
|
+
puts(message)
|
59
|
+
puts "#{e['file']}:#{e['line']}"
|
60
|
+
puts
|
61
|
+
puts code_snippet(e)
|
62
|
+
puts
|
63
|
+
|
64
|
+
@pbar.style(:bar=>:yellow)
|
65
|
+
@pbar.inc
|
66
|
+
end
|
67
|
+
|
68
|
+
#
|
69
|
+
def omit(entry)
|
70
|
+
@pbar.inc
|
71
|
+
end
|
72
|
+
|
73
|
+
#
|
74
|
+
def skip(entry)
|
75
|
+
@pbar.inc
|
76
|
+
end
|
77
|
+
|
78
|
+
#def finish_case(kase)
|
79
|
+
#end
|
80
|
+
|
81
|
+
def finish_suite(entry)
|
82
|
+
@pbar.finish
|
83
|
+
#post_report(entry)
|
84
|
+
puts
|
85
|
+
puts tally_message(entry)
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
|
95
|
+
|
96
|
+
|
97
|
+
=begin
|
98
|
+
def start_suite(suite)
|
99
|
+
@pbar = ::ANSI::Progressbar.new('Testing', suite.size)
|
100
|
+
@pbar.inc
|
101
|
+
end
|
102
|
+
|
103
|
+
#def start_case(kase)
|
104
|
+
#end
|
105
|
+
|
106
|
+
#def start_test(test)
|
107
|
+
#end
|
108
|
+
|
109
|
+
#def pass(message=nil)
|
110
|
+
# #@pbar.inc
|
111
|
+
#end
|
112
|
+
|
113
|
+
#def fail(message=nil)
|
114
|
+
# #@pbar.inc
|
115
|
+
#end
|
116
|
+
|
117
|
+
#def error(message=nil)
|
118
|
+
# #@pbar.inc
|
119
|
+
#end
|
120
|
+
|
121
|
+
def finish_case(kase)
|
122
|
+
@pbar.inc
|
123
|
+
end
|
124
|
+
|
125
|
+
def finish_suite(suite)
|
126
|
+
@pbar.finish
|
127
|
+
post_report(suite)
|
128
|
+
end
|
129
|
+
|
130
|
+
#
|
131
|
+
def post_report(suite)
|
132
|
+
tally = test_tally(suite)
|
133
|
+
|
134
|
+
width = suite.collect{ |tr| tr.name.size }.max
|
135
|
+
|
136
|
+
headers = [ 'TESTCASE ', ' TESTS ', 'ASSERTIONS', ' FAILURES ', ' ERRORS ' ]
|
137
|
+
io.puts "\n%-#{width}s %10s %10s %10s %10s\n" % headers
|
138
|
+
|
139
|
+
files = nil
|
140
|
+
|
141
|
+
suite.each do |testrun|
|
142
|
+
if testrun.files != [testrun.name] && testrun.files != files
|
143
|
+
label = testrun.files.join(' ')
|
144
|
+
label = Colorize.magenta(label)
|
145
|
+
io.puts(label + "\n")
|
146
|
+
files = testrun.files
|
147
|
+
end
|
148
|
+
io.puts paint_line(testrun, width)
|
149
|
+
end
|
150
|
+
|
151
|
+
#puts("\n%i tests, %i assertions, %i failures, %i errors\n\n" % tally)
|
152
|
+
|
153
|
+
tally_line = "-----\n"
|
154
|
+
tally_line << "%-#{width}s " % "TOTAL"
|
155
|
+
tally_line << "%10s %10s %10s %10s" % tally
|
156
|
+
|
157
|
+
io.puts(tally_line + "\n")
|
158
|
+
|
159
|
+
fails = suite.select do |testrun|
|
160
|
+
testrun.fail? || testrun.error?
|
161
|
+
end
|
162
|
+
|
163
|
+
#if tally[2] != 0 or tally[3] != 0
|
164
|
+
unless fails.empty? # or verbose?
|
165
|
+
io.puts "\n\n-- Failures and Errors --\n\n"
|
166
|
+
fails.uniq.each do |testrun|
|
167
|
+
message = testrun.message.tabto(0).strip
|
168
|
+
message = Colorize.red(message)
|
169
|
+
io.puts(message+"\n\n")
|
170
|
+
end
|
171
|
+
io.puts
|
172
|
+
end
|
173
|
+
#end
|
174
|
+
end
|
175
|
+
|
176
|
+
private
|
177
|
+
|
178
|
+
def paint_line(testrun, width)
|
179
|
+
line = ''
|
180
|
+
line << "%-#{width}s " % [testrun.name]
|
181
|
+
line << "%10s %10s %10s %10s" % testrun.counts
|
182
|
+
line << " " * 8
|
183
|
+
if testrun.fail?
|
184
|
+
line << "[#{FAIL}]"
|
185
|
+
elsif testrun.error?
|
186
|
+
line << "[#{FAIL}]"
|
187
|
+
else
|
188
|
+
line << "[#{PASS}]"
|
189
|
+
end
|
190
|
+
line
|
191
|
+
end
|
192
|
+
|
193
|
+
def test_tally(suite)
|
194
|
+
counts = suite.collect{ |tr| tr.counts }
|
195
|
+
tally = [0,0,0,0]
|
196
|
+
counts.each do |count|
|
197
|
+
4.times{ |i| tally[i] += count[i] }
|
198
|
+
end
|
199
|
+
return tally
|
200
|
+
end
|
201
|
+
|
202
|
+
end
|
203
|
+
|
204
|
+
=end
|
205
|
+
|