openlogic-turn 0.8.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/History.txt +54 -0
- data/README.txt +116 -0
- data/Rakefile +40 -0
- data/Release.txt +33 -0
- data/Version.txt +1 -0
- data/bin/turn +4 -0
- data/demo/test_autorun_minitest.rb +26 -0
- data/demo/test_autorun_testunit.rb +26 -0
- data/demo/test_sample.rb +35 -0
- data/demo/test_sample2.rb +33 -0
- data/lib/turn.rb +19 -0
- data/lib/turn/autorun/minitest.rb +155 -0
- data/lib/turn/autorun/testunit.rb +116 -0
- data/lib/turn/bin.rb +4 -0
- data/lib/turn/colorize.rb +65 -0
- data/lib/turn/command.rb +210 -0
- data/lib/turn/components/case.rb +104 -0
- data/lib/turn/components/method.rb +42 -0
- data/lib/turn/components/suite.rb +85 -0
- data/lib/turn/controller.rb +204 -0
- data/lib/turn/core_ext.rb +31 -0
- data/lib/turn/reporter.rb +69 -0
- data/lib/turn/reporters/cue_reporter.rb +167 -0
- data/lib/turn/reporters/dot_reporter.rb +93 -0
- data/lib/turn/reporters/marshal_reporter.rb +17 -0
- data/lib/turn/reporters/outline_reporter.rb +144 -0
- data/lib/turn/reporters/pretty_reporter.rb +184 -0
- data/lib/turn/reporters/progress_reporter.rb +116 -0
- data/lib/turn/runners/crossrunner.rb +42 -0
- data/lib/turn/runners/isorunner.rb +167 -0
- data/lib/turn/runners/loadrunner.rb +48 -0
- data/lib/turn/runners/minirunner.rb +189 -0
- data/lib/turn/runners/solorunner.rb +8 -0
- data/lib/turn/runners/testrunner.rb +166 -0
- data/test/helper.rb +97 -0
- data/test/runner +2 -0
- data/test/test_framework.rb +131 -0
- data/test/test_reporters.rb +44 -0
- data/test/test_runners.rb +45 -0
- metadata +138 -0
@@ -0,0 +1,93 @@
|
|
1
|
+
require 'turn/reporter'
|
2
|
+
|
3
|
+
module Turn
|
4
|
+
|
5
|
+
# = Traditional Dot Reporter
|
6
|
+
#
|
7
|
+
class DotReporter < Reporter
|
8
|
+
|
9
|
+
def start_suite(suite)
|
10
|
+
@time = Time.now
|
11
|
+
io.puts "Loaded suite #{suite.name}"
|
12
|
+
io.puts "Started"
|
13
|
+
end
|
14
|
+
|
15
|
+
def start_case(kase)
|
16
|
+
end
|
17
|
+
|
18
|
+
def start_test(test)
|
19
|
+
end
|
20
|
+
|
21
|
+
def pass(message=nil)
|
22
|
+
io.print Colorize.pass('.'); io.flush
|
23
|
+
end
|
24
|
+
|
25
|
+
def fail(message=nil)
|
26
|
+
io.print Colorize.fail('F'); io.flush
|
27
|
+
end
|
28
|
+
|
29
|
+
def error(message=nil)
|
30
|
+
io.print Colorize.error('E'); io.flush
|
31
|
+
end
|
32
|
+
|
33
|
+
def finish_test(test)
|
34
|
+
end
|
35
|
+
|
36
|
+
def finish_case(kase)
|
37
|
+
end
|
38
|
+
|
39
|
+
def finish_suite(suite)
|
40
|
+
io.puts("\nFinished in %.5f seconds." % [Time.now - @time])
|
41
|
+
|
42
|
+
report = ''
|
43
|
+
|
44
|
+
list = []
|
45
|
+
suite.each do |testcase|
|
46
|
+
testcase.each do |testunit|
|
47
|
+
if testunit.fail? || testunit.error?
|
48
|
+
list << testunit
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
unless list.empty? # or verbose?
|
54
|
+
#report << "\n\n-- Failures and Errors --\n\n"
|
55
|
+
list.uniq.each do |testunit|
|
56
|
+
message = testunit.fail? ? ' ' + FAIL : ERROR
|
57
|
+
message = message + ' ' + testunit.message.tabto(0)
|
58
|
+
message << "\n" + (filter_backtrace(testunit.backtrace).first || '')
|
59
|
+
report << "\n" << message << "\n"
|
60
|
+
end
|
61
|
+
report << "\n"
|
62
|
+
end
|
63
|
+
|
64
|
+
io.puts report
|
65
|
+
|
66
|
+
count = test_tally(suite)
|
67
|
+
|
68
|
+
tally = "%s tests, %s assertions, %s failures, %s errors" % count
|
69
|
+
|
70
|
+
if count[-1] > 0 or count[-2] > 0
|
71
|
+
tally = Colorize.red(tally)
|
72
|
+
else
|
73
|
+
tally = Colorize.green(tally)
|
74
|
+
end
|
75
|
+
|
76
|
+
io.puts tally
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
def test_tally(suite)
|
82
|
+
counts = suite.collect{ |tr| tr.counts }
|
83
|
+
tally = [0,0,0,0]
|
84
|
+
counts.each do |count|
|
85
|
+
4.times{ |i| tally[i] += count[i] }
|
86
|
+
end
|
87
|
+
return tally
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
@@ -0,0 +1,144 @@
|
|
1
|
+
require 'turn/reporter'
|
2
|
+
require 'stringio'
|
3
|
+
|
4
|
+
module Turn
|
5
|
+
|
6
|
+
# = Outline Reporter (Turn's Original)
|
7
|
+
#
|
8
|
+
#--
|
9
|
+
# TODO: Should we fit reporter output to width of console?
|
10
|
+
# TODO: Running percentages?
|
11
|
+
#++
|
12
|
+
class OutlineReporter < Reporter
|
13
|
+
|
14
|
+
#
|
15
|
+
def start_suite(suite)
|
16
|
+
@suite = suite
|
17
|
+
@time = Time.now
|
18
|
+
@stdout = StringIO.new
|
19
|
+
@stderr = StringIO.new
|
20
|
+
#files = suite.collect{ |s| s.file }.join(' ')
|
21
|
+
io.puts "LOADED SUITE #{suite.name}"
|
22
|
+
#io.puts "Started"
|
23
|
+
end
|
24
|
+
|
25
|
+
#
|
26
|
+
def start_case(kase)
|
27
|
+
io.puts(Colorize.bold("#{kase.name}"))
|
28
|
+
end
|
29
|
+
|
30
|
+
#
|
31
|
+
def start_test(test)
|
32
|
+
#if @file != test.file
|
33
|
+
# @file = test.file
|
34
|
+
# io.puts(test.file)
|
35
|
+
#end
|
36
|
+
io.print " %-69s" % test.name
|
37
|
+
|
38
|
+
@stdout.rewind
|
39
|
+
@stderr.rewind
|
40
|
+
|
41
|
+
$stdout = @stdout
|
42
|
+
$stderr = @stderr unless $DEBUG
|
43
|
+
end
|
44
|
+
|
45
|
+
#
|
46
|
+
def pass(message=nil)
|
47
|
+
io.puts " #{PASS}"
|
48
|
+
if message
|
49
|
+
message = Colorize.magenta(message)
|
50
|
+
message = message.to_s.tabto(8)
|
51
|
+
io.puts(message)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
#
|
56
|
+
def fail(assertion)
|
57
|
+
message = assertion.message.to_s
|
58
|
+
backtrace = filter_backtrace(assertion.backtrace)
|
59
|
+
|
60
|
+
io.puts(" #{FAIL}")
|
61
|
+
io.puts Colorize.bold(message).tabto(8)
|
62
|
+
unless backtrace.empty?
|
63
|
+
backtrace = "Assertion at " + filter_backtrace(assertion.backtrace).first
|
64
|
+
io.puts "STDERR:".tabto(8)
|
65
|
+
io.puts(backtrace.tabto(8))
|
66
|
+
end
|
67
|
+
show_captured_output
|
68
|
+
end
|
69
|
+
|
70
|
+
#
|
71
|
+
def error(exception)
|
72
|
+
message = exception.message
|
73
|
+
backtrace = "Exception `#{exception.class}' at " + filter_backtrace(exception.backtrace).join("\n")
|
74
|
+
message = Colorize.bold(message)
|
75
|
+
io.puts("#{ERROR}")
|
76
|
+
io.puts(message.tabto(8))
|
77
|
+
io.puts "STDERR:".tabto(8)
|
78
|
+
io.puts(backtrace.tabto(8))
|
79
|
+
show_captured_output
|
80
|
+
end
|
81
|
+
|
82
|
+
#
|
83
|
+
def finish_test(test)
|
84
|
+
$stdout = STDOUT
|
85
|
+
$stderr = STDERR
|
86
|
+
end
|
87
|
+
|
88
|
+
#
|
89
|
+
def show_captured_output
|
90
|
+
show_captured_stdout
|
91
|
+
#show_captured_stderr
|
92
|
+
end
|
93
|
+
|
94
|
+
#
|
95
|
+
def show_captured_stdout
|
96
|
+
@stdout.rewind
|
97
|
+
return if @stdout.eof?
|
98
|
+
STDOUT.puts(<<-output.tabto(8))
|
99
|
+
\nSTDOUT:
|
100
|
+
#{@stdout.read}
|
101
|
+
output
|
102
|
+
end
|
103
|
+
|
104
|
+
# No longer used b/c of error messages are fairly extraneous.
|
105
|
+
=begin
|
106
|
+
def show_captured_stderr
|
107
|
+
@stderr.rewind
|
108
|
+
return if @stderr.eof?
|
109
|
+
STDOUT.puts(<<-output.tabto(8))
|
110
|
+
\nSTDERR:
|
111
|
+
#{@stderr.read}
|
112
|
+
output
|
113
|
+
end
|
114
|
+
=end
|
115
|
+
|
116
|
+
#
|
117
|
+
#def finish_case(kase)
|
118
|
+
#end
|
119
|
+
|
120
|
+
#
|
121
|
+
def finish_suite(suite)
|
122
|
+
total = suite.count_tests
|
123
|
+
failure = suite.count_failures
|
124
|
+
error = suite.count_errors
|
125
|
+
pass = total - failure - error
|
126
|
+
|
127
|
+
bar = '=' * 78
|
128
|
+
if COLORIZE
|
129
|
+
bar = if pass == total then Colorize.green(bar)
|
130
|
+
else Colorize.red(bar) end
|
131
|
+
end
|
132
|
+
|
133
|
+
tally = [total, suite.count_assertions]
|
134
|
+
|
135
|
+
io.puts bar
|
136
|
+
io.puts " pass: %d, fail: %d, error: %d" % [pass, failure, error]
|
137
|
+
io.puts " total: %d tests with %d assertions in #{Time.new - @time} seconds" % tally
|
138
|
+
io.puts bar
|
139
|
+
end
|
140
|
+
|
141
|
+
end
|
142
|
+
|
143
|
+
end
|
144
|
+
|
@@ -0,0 +1,184 @@
|
|
1
|
+
require 'turn/reporter'
|
2
|
+
|
3
|
+
module Turn
|
4
|
+
|
5
|
+
# = Pretty Reporter (by Paydro)
|
6
|
+
#
|
7
|
+
class PrettyReporter < Reporter
|
8
|
+
#
|
9
|
+
PADDING_SIZE = 4
|
10
|
+
|
11
|
+
#
|
12
|
+
def start_suite(suite)
|
13
|
+
#old_sync, @@out.sync = @@out.sync, true if io.respond_to? :sync=
|
14
|
+
@suite = suite
|
15
|
+
@time = Time.now
|
16
|
+
#@stdout = StringIO.new
|
17
|
+
#@stderr = StringIO.new
|
18
|
+
#files = suite.collect{ |s| s.file }.join(' ')
|
19
|
+
io.puts "Loaded suite #{suite.name}"
|
20
|
+
#io.puts "Loaded suite #{$0.sub(/\.rb$/, '')}\nStarted"
|
21
|
+
io.puts "Started"
|
22
|
+
end
|
23
|
+
|
24
|
+
#
|
25
|
+
def start_case(kase)
|
26
|
+
#if kase.size > 0 # TODO: Don't have size yet?
|
27
|
+
io.print "\n#{kase.name}:\n"
|
28
|
+
#end
|
29
|
+
end
|
30
|
+
|
31
|
+
#
|
32
|
+
def start_test(test)
|
33
|
+
@test_time = Time.now
|
34
|
+
@test = test
|
35
|
+
#if @file != test.file
|
36
|
+
# @file = test.file
|
37
|
+
# io.puts(test.file)
|
38
|
+
#end
|
39
|
+
#io.print " %-69s" % test.name
|
40
|
+
#$stdout = @stdout
|
41
|
+
#$stderr = @stderr
|
42
|
+
#$stdout.rewind
|
43
|
+
#$stderr.rewind
|
44
|
+
end
|
45
|
+
|
46
|
+
#
|
47
|
+
def pass(message=nil)
|
48
|
+
io.print pad_with_size("#{PASS}")
|
49
|
+
io.print " #{@test}"
|
50
|
+
io.print " (%.2fs) " % (Time.now - @test_time)
|
51
|
+
if message
|
52
|
+
message = Colorize.magenta(message)
|
53
|
+
message = message.to_s.tabto(10)
|
54
|
+
io.puts(message)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
#
|
59
|
+
def fail(assertion)
|
60
|
+
io.print pad_with_size("#{FAIL}")
|
61
|
+
io.print " #{@test}"
|
62
|
+
io.print " (%.2fs) " % (Time.now - @test_time)
|
63
|
+
|
64
|
+
#message = assertion.location[0] + "\n" + assertion.message #.gsub("\n","\n")
|
65
|
+
#trace = MiniTest::filter_backtrace(report[:exception].backtrace).first
|
66
|
+
|
67
|
+
message = assertion.message
|
68
|
+
|
69
|
+
if assertion.respond_to?(:backtrace)
|
70
|
+
trace = filter_backtrace(assertion.backtrace).first
|
71
|
+
else
|
72
|
+
trace = filter_backtrace(assertion.location).first
|
73
|
+
end
|
74
|
+
|
75
|
+
io.puts
|
76
|
+
#io.puts pad(message, 10)
|
77
|
+
io.puts message.tabto(10)
|
78
|
+
io.puts trace.tabto(10)
|
79
|
+
#show_captured_output
|
80
|
+
end
|
81
|
+
|
82
|
+
#
|
83
|
+
def error(exception)
|
84
|
+
io.print pad_with_size("#{ERROR}")
|
85
|
+
io.print " #{@test}"
|
86
|
+
io.print " (%.2fs) " % (Time.now - @test_time)
|
87
|
+
|
88
|
+
#message = exception.to_s.split("\n")[2..-1].join("\n")
|
89
|
+
|
90
|
+
message = exception.message
|
91
|
+
|
92
|
+
if exception.respond_to?(:backtrace)
|
93
|
+
trace = filter_backtrace(exception.backtrace).first
|
94
|
+
else
|
95
|
+
trace = filter_backtrace(exception.location).first
|
96
|
+
end
|
97
|
+
|
98
|
+
io.puts
|
99
|
+
io.puts message.tabto(10)
|
100
|
+
io.puts trace.tabto(10)
|
101
|
+
end
|
102
|
+
|
103
|
+
# TODO: skip support
|
104
|
+
#def skip
|
105
|
+
# io.puts(pad_with_size("#{SKIP}"))
|
106
|
+
#end
|
107
|
+
|
108
|
+
#
|
109
|
+
def finish_test(test)
|
110
|
+
io.puts
|
111
|
+
#@test_count += 1
|
112
|
+
#@assertion_count += inst._assertions
|
113
|
+
#$stdout = STDOUT
|
114
|
+
#$stderr = STDERR
|
115
|
+
end
|
116
|
+
|
117
|
+
=begin
|
118
|
+
def show_captured_output
|
119
|
+
show_captured_stdout
|
120
|
+
show_captured_stderr
|
121
|
+
end
|
122
|
+
|
123
|
+
def show_captured_stdout
|
124
|
+
@stdout.rewind
|
125
|
+
return if @stdout.eof?
|
126
|
+
STDOUT.puts(<<-output.tabto(8))
|
127
|
+
\nSTDOUT:
|
128
|
+
#{@stdout.read}
|
129
|
+
output
|
130
|
+
end
|
131
|
+
|
132
|
+
def show_captured_stderr
|
133
|
+
@stderr.rewind
|
134
|
+
return if @stderr.eof?
|
135
|
+
STDOUT.puts(<<-output.tabto(8))
|
136
|
+
\nSTDERR:
|
137
|
+
#{@stderr.read}
|
138
|
+
output
|
139
|
+
end
|
140
|
+
=end
|
141
|
+
|
142
|
+
def finish_case(kase)
|
143
|
+
if kase.size == 0
|
144
|
+
io.puts pad("(No Tests)")
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
#
|
149
|
+
def finish_suite(suite)
|
150
|
+
#@@out.sync = old_sync if @@out.respond_to? :sync=
|
151
|
+
|
152
|
+
total = suite.count_tests
|
153
|
+
failure = suite.count_failures
|
154
|
+
error = suite.count_errors
|
155
|
+
#pass = total - failure - error
|
156
|
+
|
157
|
+
io.puts
|
158
|
+
io.puts "Finished in #{'%.6f' % (Time.now - @time)} seconds."
|
159
|
+
io.puts
|
160
|
+
|
161
|
+
io.print "%d tests, " % total
|
162
|
+
io.print "%d assertions, " % suite.count_assertions
|
163
|
+
io.print Colorize.fail( "%d failures" % failure) + ', '
|
164
|
+
io.print Colorize.error("%d errors" % error) #+ ', '
|
165
|
+
#io.puts Colorize.cyan( "%d skips" % skips ) #TODO
|
166
|
+
io.puts
|
167
|
+
end
|
168
|
+
|
169
|
+
private
|
170
|
+
|
171
|
+
#
|
172
|
+
def pad(str, size=PADDING_SIZE)
|
173
|
+
" " * size + str
|
174
|
+
end
|
175
|
+
|
176
|
+
#
|
177
|
+
def pad_with_size(str)
|
178
|
+
" " * (18 - str.size) + str
|
179
|
+
end
|
180
|
+
|
181
|
+
end
|
182
|
+
|
183
|
+
end
|
184
|
+
|
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'turn/reporter'
|
2
|
+
require 'ansi/progressbar'
|
3
|
+
|
4
|
+
module Turn
|
5
|
+
|
6
|
+
#
|
7
|
+
class ProgressReporter < Reporter
|
8
|
+
|
9
|
+
def start_suite(suite)
|
10
|
+
@pbar = ::ANSI::Progressbar.new('Testing', suite.size)
|
11
|
+
@pbar.inc
|
12
|
+
end
|
13
|
+
|
14
|
+
#def start_case(kase)
|
15
|
+
#end
|
16
|
+
|
17
|
+
#def start_test(test)
|
18
|
+
#end
|
19
|
+
|
20
|
+
#def pass(message=nil)
|
21
|
+
# #@pbar.inc
|
22
|
+
#end
|
23
|
+
|
24
|
+
#def fail(message=nil)
|
25
|
+
# #@pbar.inc
|
26
|
+
#end
|
27
|
+
|
28
|
+
#def error(message=nil)
|
29
|
+
# #@pbar.inc
|
30
|
+
#end
|
31
|
+
|
32
|
+
def finish_case(kase)
|
33
|
+
@pbar.inc
|
34
|
+
end
|
35
|
+
|
36
|
+
def finish_suite(suite)
|
37
|
+
@pbar.finish
|
38
|
+
post_report(suite)
|
39
|
+
end
|
40
|
+
|
41
|
+
#
|
42
|
+
def post_report(suite)
|
43
|
+
tally = test_tally(suite)
|
44
|
+
|
45
|
+
width = suite.collect{ |tr| tr.name.size }.max
|
46
|
+
|
47
|
+
headers = [ 'TESTCASE ', ' TESTS ', 'ASSERTIONS', ' FAILURES ', ' ERRORS ' ]
|
48
|
+
io.puts "\n%-#{width}s %10s %10s %10s %10s\n" % headers
|
49
|
+
|
50
|
+
files = nil
|
51
|
+
|
52
|
+
suite.each do |testrun|
|
53
|
+
if testrun.files != [testrun.name] && testrun.files != files
|
54
|
+
label = testrun.files.join(' ')
|
55
|
+
label = Colorize.magenta(label)
|
56
|
+
io.puts(label + "\n")
|
57
|
+
files = testrun.files
|
58
|
+
end
|
59
|
+
io.puts paint_line(testrun, width)
|
60
|
+
end
|
61
|
+
|
62
|
+
#puts("\n%i tests, %i assertions, %i failures, %i errors\n\n" % tally)
|
63
|
+
|
64
|
+
tally_line = "-----\n"
|
65
|
+
tally_line << "%-#{width}s " % "TOTAL"
|
66
|
+
tally_line << "%10s %10s %10s %10s" % tally
|
67
|
+
|
68
|
+
io.puts(tally_line + "\n")
|
69
|
+
|
70
|
+
fails = suite.select do |testrun|
|
71
|
+
testrun.fail? || testrun.error?
|
72
|
+
end
|
73
|
+
|
74
|
+
#if tally[2] != 0 or tally[3] != 0
|
75
|
+
unless fails.empty? # or verbose?
|
76
|
+
io.puts "\n\n-- Failures and Errors --\n\n"
|
77
|
+
fails.uniq.each do |testrun|
|
78
|
+
message = testrun.message.tabto(0).strip
|
79
|
+
message = Colorize.red(message)
|
80
|
+
io.puts(message+"\n\n")
|
81
|
+
end
|
82
|
+
io.puts
|
83
|
+
end
|
84
|
+
#end
|
85
|
+
end
|
86
|
+
|
87
|
+
private
|
88
|
+
|
89
|
+
def paint_line(testrun, width)
|
90
|
+
line = ''
|
91
|
+
line << "%-#{width}s " % [testrun.name]
|
92
|
+
line << "%10s %10s %10s %10s" % testrun.counts
|
93
|
+
line << " " * 8
|
94
|
+
if testrun.fail?
|
95
|
+
line << "[#{FAIL}]"
|
96
|
+
elsif testrun.error?
|
97
|
+
line << "[#{FAIL}]"
|
98
|
+
else
|
99
|
+
line << "[#{PASS}]"
|
100
|
+
end
|
101
|
+
line
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_tally(suite)
|
105
|
+
counts = suite.collect{ |tr| tr.counts }
|
106
|
+
tally = [0,0,0,0]
|
107
|
+
counts.each do |count|
|
108
|
+
4.times{ |i| tally[i] += count[i] }
|
109
|
+
end
|
110
|
+
return tally
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
116
|
+
|