turn 0.9.2 → 0.9.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,11 @@
1
+ == 0.9.3 / 2012-02-09
2
+ * Default to pretty reporter.
3
+ * Can set reporter via `rpt` environment variable.
4
+ * Fix backtrace filter.
5
+ * Fix require warning when using cli.
6
+ * Add skip counts to reporter tallies. (t8)
7
+ * Improve Pretty reporter output. (t8)
8
+
1
9
  == 0.9.2 / 2012-02-08
2
10
  * Fix colorization config issue.
3
11
  * Switch to simple dotruby build system.
data/README.md CHANGED
@@ -2,6 +2,7 @@
2
2
  by Tim Pease
3
3
  http://codeforpeople.rubyforge.org/turn
4
4
 
5
+
5
6
  ## DESCRIPTION:
6
7
 
7
8
  TURN is a new way to view test results. With longer running tests, it
@@ -9,12 +10,13 @@ can be very frustrating to see a failure (....F...) and then have to wait till
9
10
  all the tests finish before you can see what the exact failure was. TURN
10
11
  displays each test on a separate line with failures being displayed
11
12
  immediately instead of at the end of the tests.
12
-
13
+
13
14
  If you have the 'ansi' gem installed, then TURN output will be displayed in
14
15
  wonderful technicolor (but only if your terminal supports ANSI color codes).
15
16
  Well, the only colors are green and red, but that is still color.
16
17
 
17
- <b>Interested in improving Turn?</b> Please read this[https://github.com/TwP/turn/wiki/Implementation].
18
+ <b>Interested in improving Turn?</b> [Please read this](https://github.com/TwP/turn/wiki/Implementation).
19
+
18
20
 
19
21
  ## FEATURES:
20
22
 
@@ -42,7 +44,7 @@ General usage provides better test output. Here is some sample output:
42
44
  Turn also provides solo and cross test modes when run from the *turn* commandline
43
45
  application.
44
46
 
45
- ## SYNOPSIS:
47
+ ## INSTRUCTION:
46
48
 
47
49
  Turn can be using from the command-line or via require. The command-line tool
48
50
  offers additional options for how one runs tests.
@@ -72,12 +74,12 @@ This will run every pairing of tests in a separate process.
72
74
 
73
75
  Simply require the TURN package from within your test suite.
74
76
 
75
- $ require 'turn'
77
+ $ require 'turn/autorun'
76
78
 
77
79
  This will configure MiniTest to use TURN formatting for displaying test
78
- restuls. A better line to use, though, is the following:
80
+ results. A better line to use, though, is the following:
79
81
 
80
- begin; require 'turn'; rescue LoadError; end
82
+ begin; require 'turn/autorun'; rescue LoadError; end
81
83
 
82
84
  When you distribute your code, the test suite can be run without requiring
83
85
  the end user to install the TURN package.
@@ -85,39 +87,50 @@ the end user to install the TURN package.
85
87
  For a Rails application, put the require line into the 'test/test_helper.rb'
86
88
  script. Now your Rails tests will use TURN formatting.
87
89
 
90
+ <b>Note:</b> This changed in version 0.9. It used to be just `require 'turn'`,
91
+ but becuase of how `bundle exec` works, it was better to require a subdirectory
92
+ file.
93
+
94
+ ### Configuration
88
95
 
89
- ## RAILS/BUNDLER USERS
96
+ You can use `Turn.config` to adjust turn configuration.
90
97
 
91
- Bundler automatically requires everything listed in your Gemfile, e.g.
92
- when using `bundle exec`. This means `turn` will get automatically
93
- required too, which in turn means the Turn's test autorunner is doing
94
- to kick in. Obviously we don't want that to happen unless we are actually
95
- running tests.
98
+ Options are following:
96
99
 
97
- Turn was created well before Bundler existed, and the use of `require 'turn'`
98
- as the autorunner was the obvious convenience. Unfortunately Bundler's choice
99
- to force require all requirements by defualt can have unexpected consequences,
100
- as is the case here.
100
+ tests List of file names or glob patterns of tests to run. Default: ["test/**/{test,}*{,test}.rb"]
101
+ exclude List of file names or globs to exclude from tests list. Default: []
102
+ pattern Regexp pattern that all test names must match to be eligible to run. Default: /.*/ (all)
103
+ matchcase Regexp pattern that all test cases must match to be eligible to run. Default: nil (all)
104
+ loadpath Add these folders to the $LOAD_PATH. Default: ['lib']
105
+ requires Libs to require when running tests. Default: []
106
+ format Reporter type (:pretty, :dot, :cue, :marshal, :outline, :progress). Default: :pretty
107
+ live Test against live install (i.e. Don't use loadpath option). Default: false
108
+ verbose Verbose output? Default: false
109
+ trace Number of backtrace lines to display. Default: set from ENV or nil (all)
110
+ natural Use natural language case names. Default: false
111
+ ansi Force colorized output (requires 'ansi' gem). Default: set from ENV or nil (auto)
101
112
 
102
- Thankfully there is a work around. In your Gemfile add:
113
+ To set option just call the desired method:
103
114
 
104
- gem 'turn', :require => false
115
+ Turn.config.format = :progress
105
116
 
106
- The `:require` option will prevent Turn from trying to autorun tests.
117
+ Also, you can use following environment variables to adjust settings:
107
118
 
108
- In the future we will change turn to use `require 'turn/autorun'` instead,
109
- but that will require a lot of people to update a lot of tests, so it's not
110
- something to do lightly. Full change over will wait until the 1.0 release.
111
- In the mean time Turn will just put out a warning.
119
+ backtrace Number of backtrace lines to display. Default: set from ENV or nil
120
+ ansi Force colorize output (requires 'ansi' gem).
112
121
 
113
122
 
114
123
  ## REQUIREMENTS:
115
124
 
116
125
  * ansi 1.1+ (for colorized output and progress bar output mode)
117
126
 
118
- ## INSTALL:
119
127
 
120
- * sudo gem install turn
128
+ ## INSTALLATION:
129
+
130
+ Follow the ususal procedure:
131
+
132
+ $ sudo gem install turn
133
+
121
134
 
122
135
  ## LICENSE:
123
136
 
@@ -1 +1 @@
1
- 0.9.2
1
+ 0.9.3
data/bin/turn CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
- require 'turn/command'
2
+ require 'turn'
3
3
  begin
4
4
  Turn::Command.main(*ARGV)
5
5
  rescue StandardError => e
@@ -9,5 +9,6 @@ require 'turn/configuration'
9
9
  require 'turn/colorize'
10
10
  require 'turn/components'
11
11
  require 'turn/controller'
12
+ require 'turn/command'
12
13
  require 'turn/minitest'
13
14
 
@@ -1,5 +1,5 @@
1
1
  $LOAD_PATH.unshift(File.dirname(File.dirname(__FILE__)))
2
- require 'turn/command'
2
+ require 'turn'
3
3
  #begin
4
4
  Turn::Command.main(*ARGV)
5
5
  #rescue StandardError => e
@@ -1,5 +1,4 @@
1
1
  require 'optparse'
2
- require 'turn'
3
2
 
4
3
  module Turn
5
4
 
@@ -207,10 +206,13 @@ module Turn
207
206
  opts.separator "COMMAND OPTIONS"
208
207
 
209
208
  opts.on('--debug', "turn debug mode on") do
210
- $VERBOSE = true
211
209
  $DEBUG = true
212
210
  end
213
211
 
212
+ opts.on('--warn', "turn warnings on") do
213
+ $VERBOSE = true
214
+ end
215
+
214
216
  opts.on_tail('--version', "display version") do
215
217
  puts VERSION
216
218
  exit
@@ -252,9 +254,9 @@ module Turn
252
254
  result = controller.start
253
255
 
254
256
  if result
255
- exit result.passed?
257
+ exit (result.passed? ? 0 : -1)
256
258
  else # no tests
257
- exit
259
+ exit -1
258
260
  end
259
261
  end
260
262
 
@@ -86,9 +86,14 @@ module Turn
86
86
  sum = 0; tests.each{ |t| sum += 1 if t.pass? }; sum
87
87
  end
88
88
 
89
+ def count_skips
90
+ # Why not use tests.select(&:skip?).size ?
91
+ sum = 0; tests.each{ |t| sum += 1 if t.skip? }; sum
92
+ end
93
+
89
94
  #
90
95
  def counts
91
- return count_tests, count_assertions, count_failures, count_errors
96
+ return count_tests, count_assertions, count_failures, count_errors, count_skips
92
97
  end
93
98
 
94
99
  def message
@@ -64,9 +64,13 @@ module Turn
64
64
  #)
65
65
  end
66
66
 
67
+ def count_skips
68
+ sum = 0; each{ |c| sum += c.count_skips }; sum
69
+ end
70
+
67
71
  # Convenience methods --this is what is typcially wanted.
68
72
  def counts
69
- return count_tests, count_assertions, count_failures, count_errors #,count_skips
73
+ return count_tests, count_assertions, count_failures, count_errors ,count_skips
70
74
  end
71
75
 
72
76
  def each(&block)
@@ -87,5 +91,4 @@ module Turn
87
91
  end
88
92
  end
89
93
 
90
- end
91
-
94
+ end
@@ -89,11 +89,11 @@ module Turn
89
89
  @requires ||= []
90
90
  @live ||= false
91
91
  @log ||= true
92
- #@format ||= nil
93
92
  #@runner ||= RUBY_VERSION >= "1.9" ? MiniRunner : TestRunner
94
93
  @matchcase ||= nil
95
94
  @pattern ||= /.*/
96
95
  @natural ||= false
96
+ @format ||= environment_format
97
97
  @trace ||= environment_trace
98
98
  @ansi ||= environment_ansi
99
99
 
@@ -186,19 +186,27 @@ module Turn
186
186
  when :dotted, :dot
187
187
  require 'turn/reporters/dot_reporter'
188
188
  Turn::DotReporter.new($stdout, opts)
189
- when :pretty
190
- require 'turn/reporters/pretty_reporter'
191
- Turn::PrettyReporter.new($stdout, opts)
189
+ when :outline
190
+ require 'turn/reporters/outline_reporter'
191
+ Turn::OutlineReporter.new($stdout, opts)
192
192
  when :cue
193
193
  require 'turn/reporters/cue_reporter'
194
194
  Turn::CueReporter.new($stdout, opts)
195
+ when :pretty
196
+ require 'turn/reporters/pretty_reporter'
197
+ Turn::PrettyReporter.new($stdout, opts)
195
198
  else
196
- require 'turn/reporters/outline_reporter'
197
- Turn::OutlineReporter.new($stdout, opts)
199
+ require 'turn/reporters/pretty_reporter'
200
+ Turn::PrettyReporter.new($stdout, opts)
198
201
  end
199
202
  )
200
203
  end
201
204
 
205
+ #
206
+ def environment_format
207
+ ENV['rpt']
208
+ end
209
+
202
210
  #
203
211
  def environment_trace
204
212
  (ENV['backtrace'] ? ENV['backtrace'].to_i : nil)
@@ -74,9 +74,9 @@ module Turn
74
74
 
75
75
  $RUBY_IGNORE_CALLERS ||= []
76
76
  $RUBY_IGNORE_CALLERS.concat([
77
- /\/turn.*\.rb/,
77
+ /\/lib\/turn.*\.rb/,
78
78
  /\/bin\/turn/,
79
- /\/minitest.*\.rb/,
79
+ /\/lib\/minitest.*\.rb/,
80
80
  /\/test\/unit.*\.rb/
81
81
  ])
82
82
 
@@ -87,7 +87,7 @@ module Turn
87
87
  def filter_backtrace(backtrace)
88
88
  return [] unless backtrace
89
89
  bt = backtrace.dup
90
- bt.reject!{ |line| $RUBY_IGNORE_CALLERS.any?{ |re| re =~ line } } unless $DEBUG
90
+ bt = bt.reject{ |line| $RUBY_IGNORE_CALLERS.any?{ |re| re =~ line } } unless $DEBUG
91
91
  #bt.reject!{ |line| line.rindex('minitest') }
92
92
  #bt.reject!{ |line| line.rindex('test/unit') }
93
93
  #bt.reject!{ |line| line.rindex('lib/turn') }
@@ -105,7 +105,7 @@ module Turn
105
105
  #
106
106
  def naturalized_name(test)
107
107
  if @natural
108
- " #{test.name.gsub("test_", "").gsub(/_/, " ")}"
108
+ " #{test.name.gsub("test_", "").gsub(/_/, " ")}"
109
109
  else
110
110
  " #{test.name}"
111
111
  end
@@ -119,7 +119,7 @@ module Turn
119
119
  s = t.truncate
120
120
  f = ((t - s) * 1000).to_i
121
121
 
122
- "%01d:%02d:%02d:%03d" % [h,m,s,f]
122
+ "%01d:%02d:%02d.%03d" % [h,m,s,f]
123
123
  end
124
124
  end
125
125
 
@@ -108,22 +108,26 @@ module Turn
108
108
  #end
109
109
 
110
110
  def finish_suite(suite)
111
- total = suite.count_tests
112
- failure = suite.count_failures
113
- error = suite.count_errors
114
- pass = total - failure - error
111
+ total = suite.count_tests
112
+ passes = suite.count_passes
113
+ assertions = suite.count_assertions
114
+ failures = suite.count_failures
115
+ errors = suite.count_errors
116
+ skips = suite.count_skips
115
117
 
116
118
  bar = '=' * 78
119
+ # @FIXME: Remove this, since Colorize already take care of colorize?
117
120
  if colorize?
118
121
  bar = if pass == total then Colorize.green(bar)
119
122
  else Colorize.red(bar) end
120
123
  end
121
124
 
122
- tally = [total, suite.count_assertions]
125
+ # @FIXME: Should we add suite.runtime, instead if this lame time calculations?
126
+ tally = [total, assertions, (Time.new - @time)]
123
127
 
124
128
  io.puts bar
125
- io.puts " pass: %d, fail: %d, error: %d" % [pass, failure, error]
126
- io.puts " total: %d tests with %d assertions in #{Time.new - @time} seconds" % tally
129
+ io.puts " pass: %d, fail: %d, error: %d, skip: %d" % [passes, failures, errors, skips]
130
+ io.puts " total: %d tests with %d assertions in %f seconds" % tally
127
131
  io.puts bar
128
132
  end
129
133
 
@@ -68,31 +68,22 @@ module Turn
68
68
 
69
69
  io.puts report
70
70
 
71
- count = test_tally(suite)
72
-
73
- tally = "%s tests, %s assertions, %s failures, %s errors" % count
74
-
75
- if count[-1] > 0 or count[-2] > 0
76
- tally = Colorize.red(tally)
77
- else
78
- tally = Colorize.green(tally)
79
- end
80
-
81
- io.puts tally
82
- end
83
-
84
- private
85
-
86
- def test_tally(suite)
87
- counts = suite.collect{ |tr| tr.counts }
88
- tally = [0,0,0,0]
89
- counts.each do |count|
90
- 4.times{ |i| tally[i] += count[i] }
91
- end
92
- return tally
71
+ # @TODO: Add something like suite.count(:tests, :passes) or
72
+ # suite.count(tests: "%d tests", passes: "%d passes")
73
+ # to cleanup, which will return something handy
74
+ # (suite.count(:test, :passes).test proxy maybe?)
75
+ total = "%d tests" % suite.count_tests
76
+ passes = "%d passed" % suite.count_passes
77
+ assertions = "%d assertions" % suite.count_assertions
78
+ failures = "%s failures" % suite.count_failures
79
+ errors = "%s errors" % suite.count_errors
80
+ skips = "%s skips" % suite.count_skips
81
+
82
+ tally = [total, passes, assertions, failures, errors, skips].join(", ")
83
+
84
+ io.puts suite.passed? ? Colorize.green(tally) : Colorize.red(tally)
93
85
  end
94
86
 
95
87
  end
96
88
 
97
- end
98
-
89
+ end
@@ -7,7 +7,10 @@ module Turn
7
7
  #
8
8
  #--
9
9
  # TODO: Should we fit reporter output to width of console?
10
+ # y8: Yes. we should, but it's a kinda tricky, if you want to make it
11
+ # cross-platform. (See https://github.com/cldwalker/hirb/blob/master/lib/hirb/util.rb#L61)
10
12
  # TODO: Running percentages?
13
+ # TODO: Cleanup me!
11
14
  #++
12
15
  class OutlineReporter < Reporter
13
16
 
@@ -18,6 +21,7 @@ module Turn
18
21
  def start_suite(suite)
19
22
  @suite = suite
20
23
  @time = Time.now
24
+ # @FIXME (y8): Why we need to capture stdout and stderr?
21
25
  @stdout = StringIO.new
22
26
  @stderr = StringIO.new
23
27
  #files = suite.collect{ |s| s.file }.join(' ')
@@ -32,7 +36,7 @@ module Turn
32
36
 
33
37
  #
34
38
  def start_case(kase)
35
- io.puts(Colorize.bold("#{kase.name}"))
39
+ io.puts(Colorize.bold("#{kase.name}")) if kase.size > 0
36
40
  end
37
41
 
38
42
  #
@@ -42,6 +46,7 @@ module Turn
42
46
  # io.puts(test.file)
43
47
  #end
44
48
 
49
+ # @FIXME: Should we move naturalized_name to test itself?
45
50
  name = naturalized_name(test)
46
51
 
47
52
  io.print " %-57s" % name
@@ -152,26 +157,29 @@ module Turn
152
157
 
153
158
  # TODO: pending (skip) counts
154
159
  def finish_suite(suite)
155
- total = suite.count_tests
156
- failure = suite.count_failures
157
- error = suite.count_errors
158
- pass = total - failure - error
160
+ total = suite.count_tests
161
+ passes = suite.count_passes
162
+ assertions = suite.count_assertions
163
+ failures = suite.count_failures
164
+ errors = suite.count_errors
165
+ skips = suite.count_skips
159
166
 
160
167
  bar = '=' * 78
168
+ # @FIXME: Remove this, since Colorize already take care of colorize?
161
169
  if colorize?
162
170
  bar = if pass == total then Colorize.green(bar)
163
171
  else Colorize.red(bar) end
164
172
  end
165
173
 
166
- tally = [total, suite.count_assertions]
174
+ # @FIXME: Should we add suite.runtime, instead if this lame time calculations?
175
+ tally = [total, assertions, (Time.new - @time)]
167
176
 
168
177
  io.puts bar
169
- io.puts " pass: %d, fail: %d, error: %d" % [pass, failure, error]
170
- io.puts " total: %d tests with %d assertions in #{Time.new - @time} seconds" % tally
178
+ io.puts " pass: %d, fail: %d, error: %d, skip: %d" % [passes, failures, errors, skips]
179
+ io.puts " total: %d tests with %d assertions in %f seconds" % tally
171
180
  io.puts bar
172
181
  end
173
182
 
174
183
  end
175
184
 
176
- end
177
-
185
+ end
@@ -1,204 +1,146 @@
1
1
  require 'turn/reporter'
2
2
 
3
3
  module Turn
4
-
5
4
  # = Pretty Reporter (by Paydro)
6
5
  #
6
+ # Example output:
7
+ # TestCaseName:
8
+ # PASS test: Succesful test case. (0:00:02:059)
9
+ # ERROR test: Bogus test case. (0:00:02:059)
10
+ # FAIL test: Failed test case. (0:00:02:059)
11
+ #
7
12
  class PrettyReporter < Reporter
8
- #
9
- PADDING_SIZE = 4
10
-
11
- #
13
+ # Second column left padding in chars.
12
14
  TAB_SIZE = 10
13
15
 
14
- #
16
+ # Character to put in front of backtrace.
17
+ TRACE_MARK = '@ '
18
+
19
+ # TODO: solo and cross runners do not have name or seed, need to fix.
20
+
21
+ # At the very start, before any testcases are run, this is called.
15
22
  def start_suite(suite)
16
- #old_sync, @@out.sync = @@out.sync, true if io.respond_to? :sync=
17
23
  @suite = suite
18
24
  @time = Time.now
19
- #@stdout = StringIO.new
20
- #@stderr = StringIO.new
21
- #files = suite.collect{ |s| s.file }.join(' ')
22
- io.puts "Loaded suite #{suite.name}"
23
- #io.puts "Loaded suite #{$0.sub(/\.rb$/, '')}\nStarted"
24
- io.puts "Started (#{suite.seed})"
25
+
26
+ io.puts Colorize.bold("Loaded Suite #{suite.name}")
27
+ io.puts
28
+ if suite.seed
29
+ io.puts "Started at #{Time.now} w/ seed #{suite.seed}."
30
+ else
31
+ io.puts "Started at #{Time.now}."
32
+ end
33
+ io.puts
25
34
  end
26
35
 
27
- #
36
+ # Invoked before a testcase is run.
28
37
  def start_case(kase)
29
- #if kase.size > 0 # TODO: Don't have size yet?
30
- io.print "\n#{kase.name}:\n"
31
- #end
38
+ # Print case name if there any tests in suite
39
+ # TODO: Add option which will show all test cases, even without tests?
40
+ io.puts kase.name if kase.size > 0
32
41
  end
33
42
 
34
- #
43
+ # Invoked before a test is run.
35
44
  def start_test(test)
36
45
  @test_time = Time.now
37
46
  @test = test
38
- #if @file != test.file
39
- # @file = test.file
40
- # io.puts(test.file)
41
- #end
42
- #io.print " %-69s" % test.name
43
- #$stdout = @stdout
44
- #$stderr = @stderr
45
- #$stdout.rewind
46
- #$stderr.rewind
47
47
  end
48
48
 
49
- #
49
+ # Invoked when a test passes.
50
50
  def pass(message=nil)
51
- io.print pad_with_size("#{PASS}")
52
- io.print " #{@test}"
53
- io.print " (%.2fs) " % (Time.now - @test_time)
51
+ banner PASS
52
+
54
53
  if message
55
54
  message = Colorize.magenta(message)
56
- message = message.to_s.tabto(10)
55
+ message = message.to_s.tabto(TAB_SIZE)
56
+
57
57
  io.puts(message)
58
58
  end
59
59
  end
60
60
 
61
- #
61
+ # Invoked when a test raises an assertion.
62
62
  def fail(assertion, message=nil)
63
- io.print pad_with_size("#{FAIL}")
64
- io.print " #{@test}"
65
- io.print " (%.2fs) " % (Time.now - @test_time)
66
-
67
- #message = assertion.location[0] + "\n" + assertion.message #.gsub("\n","\n")
68
- #trace = MiniTest::filter_backtrace(report[:exception].backtrace).first
69
-
70
- message ||= assertion.message
71
-
72
- _trace = if assertion.respond_to?(:backtrace)
73
- filter_backtrace(assertion.backtrace)
74
- else
75
- filter_backtrace(assertion.location).first
76
- end
77
-
78
- io.puts
79
- #io.puts pad(message, tabsize)
80
- io.puts message.tabto(TAB_SIZE)
81
-
82
- cnt = @trace ? @trace.to_i : _trace.size
83
- io.puts _trace[0, cnt].map{|l| l.tabto(TAB_SIZE) }.join("\n")
63
+ banner FAIL
84
64
 
85
- #show_captured_output
65
+ prettify(message, assertion)
86
66
  end
87
67
 
88
- #
68
+ # Invoked when a test raises an exception.
89
69
  def error(exception, message=nil)
90
- io.print pad_with_size("#{ERROR}")
91
- io.print " #{@test}"
92
- io.print " (%.2fs) " % (Time.now - @test_time)
93
-
94
- #message = exception.to_s.split("\n")[2..-1].join("\n")
70
+ banner ERROR
95
71
 
96
- message ||= exception.message
97
-
98
- _trace = if exception.respond_to?(:backtrace)
99
- clean_backtrace(exception.backtrace)
100
- else
101
- clean_backtrace(exception.location)
102
- end
103
-
104
- io.puts
105
- io.puts message.tabto(TAB_SIZE)
106
- io.puts _trace.map{|l| l.tabto(TAB_SIZE) }.join("\n")
72
+ prettify(message, exception)
107
73
  end
108
74
 
109
- #
75
+ # Invoked when a test is skipped.
110
76
  def skip(exception, message=nil)
111
- io.print pad_with_size("#{SKIP}")
112
- io.print " #{@test}"
113
- io.print " (%.2fs) " % (Time.now - @test_time)
114
-
115
- message ||= exception.message
116
-
117
- _trace = if exception.respond_to?(:backtrace)
118
- clean_backtrace(exception.backtrace)
119
- else
120
- clean_backtrace(exception.location)
121
- end
122
-
123
- io.puts
124
- io.puts message.tabto(TAB_SIZE)
125
- io.puts _trace.map{|l| l.tabto(TAB_SIZE) }.join("\n")
126
- end
77
+ banner SKIP
127
78
 
128
- #
129
- def finish_test(test)
130
- io.puts
131
- #@test_count += 1
132
- #@assertion_count += inst._assertions
133
- #$stdout = STDOUT
134
- #$stderr = STDERR
79
+ prettify(message, exception)
135
80
  end
136
81
 
137
- =begin
138
- def show_captured_output
139
- show_captured_stdout
140
- show_captured_stderr
141
- end
142
-
143
- def show_captured_stdout
144
- @stdout.rewind
145
- return if @stdout.eof?
146
- STDOUT.puts(<<-output.tabto(8))
147
- \nSTDOUT:
148
- #{@stdout.read}
149
- output
150
- end
151
-
152
- def show_captured_stderr
153
- @stderr.rewind
154
- return if @stderr.eof?
155
- STDOUT.puts(<<-output.tabto(8))
156
- \nSTDERR:
157
- #{@stderr.read}
158
- output
159
- end
160
- =end
161
-
82
+ # Invoked after all tests in a testcase have ben run.
162
83
  def finish_case(kase)
163
- if kase.size == 0
164
- io.puts pad("(No Tests)")
165
- end
84
+ # Print newline is there any tests in suite
85
+ io.puts if kase.size > 0
166
86
  end
167
87
 
168
- #
88
+ # After all tests are run, this is the last observable action.
169
89
  def finish_suite(suite)
170
- #@@out.sync = old_sync if @@out.respond_to? :sync=
171
-
172
- total = suite.count_tests
173
- failure = suite.count_failures
174
- error = suite.count_errors
175
- #pass = total - failure - error
176
-
177
- io.puts
178
- io.puts "Finished in #{'%.6f' % (Time.now - @time)} seconds."
90
+ total = "%d tests" % suite.count_tests
91
+ passes = "%d passed" % suite.count_passes
92
+ assertions = "%d assertions" % suite.count_assertions
93
+ failures = "%d failures" % suite.count_failures
94
+ errors = "%d errors" % suite.count_errors
95
+ skips = "%d skips" % suite.count_skips
96
+
97
+ io.puts "Finished in %.6f seconds." % (Time.now - @time)
179
98
  io.puts
180
99
 
181
- io.print "%d tests, " % total
182
- io.print "%d assertions, " % suite.count_assertions
183
- io.print Colorize.fail( "%d failures" % failure) + ', '
184
- io.print Colorize.error("%d errors" % error) #+ ', '
185
- #io.puts Colorize.cyan( "%d skips" % skips ) #TODO
100
+ io.puts [ Colorize.bold(total),
101
+ Colorize.pass(passes),
102
+ Colorize.fail(failures),
103
+ Colorize.error(errors),
104
+ Colorize.skip(skips),
105
+ assertions
106
+ ].join(", ")
107
+
108
+ # Please keep this newline, since it will be useful when after test case
109
+ # there will be other lines. For example "rake aborted!" or kind of.
186
110
  io.puts
187
111
  end
188
112
 
189
113
  private
190
-
114
+ # Outputs test case header for given event (error, fail & etc)
191
115
  #
192
- def pad(str, size=PADDING_SIZE)
193
- " " * size + str
116
+ # Example:
117
+ # PASS test: Test decription. (0:00:02:059)
118
+ def banner(event)
119
+ io.puts "%18s %s (%s)" % [event, @test, ticktock]
194
120
  end
195
121
 
122
+ # Cleanups and prints test payload
196
123
  #
197
- def pad_with_size(str)
198
- " " * (18 - str.size) + str
199
- end
124
+ # Example:
125
+ # fail is not 1
126
+ # @ test/test_runners.rb:46:in `test_autorun_with_trace'
127
+ # bin/turn:4:in `<main>'
128
+ def prettify(message=nil, raised)
129
+ # Get message from raised, if not given
130
+ message ||= raised.message
200
131
 
201
- end
132
+ backtrace = raised.respond_to?(:backtrace) ? raised.backtrace : raised.location
202
133
 
203
- end
134
+ # Filter and clean backtrace
135
+ backtrace = clean_backtrace(backtrace)
204
136
 
137
+ # Add trace mark to first line.
138
+ backtrace.first.insert(0, TRACE_MARK)
139
+
140
+ io.puts Colorize.bold(message.tabto(TAB_SIZE))
141
+ io.puts backtrace.shift.tabto(TAB_SIZE - TRACE_MARK.length)
142
+ io.puts backtrace.join("\n").tabto(TAB_SIZE)
143
+ io.puts
144
+ end
145
+ end
146
+ end
@@ -55,10 +55,10 @@ module Turn
55
55
 
56
56
  width = suite.collect{ |tr| tr.name.to_s.size }.max
57
57
 
58
- headers = [ 'TESTCASE ', ' TESTS ', 'ASSERTIONS', ' FAILURES ', ' ERRORS ' ]
59
- io.puts "\n\n%-#{width}s %10s %10s %10s %10s\n" % headers
58
+ headers = [ 'TESTCASE ', ' TESTS ', 'ASSERTIONS', ' FAILURES ', ' ERRORS ', 'SKIPS ' ]
59
+ io.puts "\n\n%-#{width}s %10s %10s %10s %10s %10s\n" % headers
60
60
 
61
- io.puts ("-" * (width + 50))
61
+ io.puts ("-" * (width + 60))
62
62
 
63
63
  files = nil
64
64
  suite.each do |testrun|
@@ -73,9 +73,9 @@ module Turn
73
73
 
74
74
  #puts("\n%i tests, %i assertions, %i failures, %i errors\n\n" % tally)
75
75
 
76
- tally_line = ("-" * (width + 50))
76
+ tally_line = ("-" * (width + 60))
77
77
  tally_line << "\n%-#{width}s " % "TOTAL"
78
- tally_line << "%10s %10s %10s %10s" % tally
78
+ tally_line << "%10s %10s %10s %10s %10s" % tally
79
79
 
80
80
  io.puts(tally_line + "\n\n\n")
81
81
 
@@ -127,7 +127,7 @@ module Turn
127
127
  def paint_line(testrun, width)
128
128
  line = ''
129
129
  line << "%-#{width}s " % [testrun.name]
130
- line << "%10s %10s %10s %10s" % testrun.counts
130
+ line << "%10s %10s %10s %10s %10s" % testrun.counts
131
131
  line << " " * 8
132
132
  if testrun.fail?
133
133
  line << "[#{FAIL}]"
@@ -141,14 +141,13 @@ module Turn
141
141
 
142
142
  def test_tally(suite)
143
143
  counts = suite.collect{ |tr| tr.counts }
144
- tally = [0,0,0,0]
144
+ tally = [0,0,0,0,0]
145
145
  counts.each do |count|
146
- 4.times{ |i| tally[i] += count[i] }
146
+ 5.times{ |i| tally[i] += count[i] }
147
147
  end
148
148
  return tally
149
149
  end
150
150
 
151
151
  end
152
152
 
153
- end
154
-
153
+ end
@@ -80,6 +80,7 @@ module Turn
80
80
  #err = ''
81
81
 
82
82
  out, err = nil, nil
83
+ p cmd
83
84
  Open3.popen3(cmd) do |stdin, stdout, stderr|
84
85
  stdin.close
85
86
  out = stdout.read.chomp
@@ -96,7 +97,7 @@ module Turn
96
97
  files = kase.files
97
98
 
98
99
  # remove any unexpected output injected at the beginning
99
- b = out.index(/^---/)
100
+ b = out.index(/^---/m)
100
101
  yaml = out[b..-1]
101
102
  sub_suite = YAML.load(yaml)
102
103
 
@@ -1,3 +1,3 @@
1
1
  module Turn
2
- VERSION = "0.9.2"
2
+ VERSION = "0.9.3"
3
3
  end
@@ -5,17 +5,17 @@ class TestRunners < Test::Unit::TestCase
5
5
  def test_solo
6
6
  file = setup_testunit(false, 'test_solo.rb')
7
7
  result = turn2 '--solo', file
8
- assert result.index('pass: 1'), "ACTUAL RESULT --->\n #{result}"
9
- assert result.index('fail: 0'), "ACTUAL RESULT --->\n #{result}"
10
- assert result.index('error: 0'), "ACTUAL RESULT --->\n #{result}"
8
+ assert result.index('1 passed'), "ACTUAL RESULT:\n #{result}"
9
+ assert result.index('0 failures'), "ACTUAL RESULT:\n #{result}"
10
+ assert result.index('0 errors'), "ACTUAL RESULT:\n #{result}"
11
11
  end
12
12
 
13
13
  def test_cross
14
14
  file1 = setup_testunit(false, 'test1.rb')
15
15
  file2 = setup_testunit(false, 'test2.rb')
16
16
  result = turn2 '--cross', file1, file2
17
- assert result.index('pass: 2'), "ACTUAL RESULT --->\n #{result}"
18
- assert result.index('error: 0'), "ACTUAL RESULT --->\n #{result}"
17
+ assert result.index('2 passed'), "ACTUAL RESULT:\n #{result}"
18
+ assert result.index('0 errors'), "ACTUAL RESULT:\n #{result}"
19
19
  end
20
20
 
21
21
  # autorun
@@ -25,9 +25,9 @@ class TestRunners < Test::Unit::TestCase
25
25
  def test_autorun_testunit
26
26
  file = setup_testunit('turn/autorun', 'test_autorun.rb')
27
27
  result = `ruby -Ilib #{file} 2>&1`
28
- assert(result.index('pass: 1'), "ACTUAL RESULT:\n #{result}")
29
- assert(result.index('fail: 0'), "ACTUAL RESULT:\n #{result}")
30
- assert(result.index('error: 0'), "ACTUAL RESULT:\n #{result}")
28
+ assert(result.index('1 passed'), "ACTUAL RESULT:\n #{result}")
29
+ assert(result.index('0 failures'), "ACTUAL RESULT:\n #{result}")
30
+ assert(result.index('0 errors'), "ACTUAL RESULT:\n #{result}")
31
31
  end
32
32
 
33
33
  #else
@@ -35,16 +35,16 @@ class TestRunners < Test::Unit::TestCase
35
35
  def test_autorun
36
36
  file = setup_minitest_autorun
37
37
  result = `ruby -Ilib #{file} 2>&1`
38
- assert result.index('fail: 0'), "ACTUAL RESULT --->\n #{result}"
39
- assert result.index('error: 0'), "ACTUAL RESULT --->\n #{result}"
38
+ assert result.index('0 failures'), "ACTUAL RESULT:\n #{result}"
39
+ assert result.index('0 errors'), "ACTUAL RESULT:\n #{result}"
40
40
  end
41
41
 
42
42
  def test_autorun_with_trace
43
43
  file = setup_minitest_autorun_with_trace
44
44
 
45
45
  result = `ruby -Ilib #{file} 2>&1`
46
- assert result.index('fail: 1'), 'fail is not 1'
47
- assert result.index('error: 0'), 'error is not 0'
46
+ assert result.index('1 failures'), 'fail is not 1'
47
+ assert result.index('0 errors'), 'error is not 0'
48
48
 
49
49
  # TODO: the backtrace is empty, why?
50
50
  #assert result.scan(/\.rb:\d+:in/).length > 1
@@ -1,5 +1,4 @@
1
- require 'minitest/unit'
2
- require 'turn'
1
+ require 'turn/autorun'
3
2
 
4
3
  Turn.config do |c|
5
4
  c.natural = true
@@ -1,5 +1,4 @@
1
- require 'test/unit'
2
- require 'turn'
1
+ require 'turn/testunit'
3
2
 
4
3
  class SampleCase1 < Test::Unit::TestCase
5
4
  def test_sample_pass1
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: turn
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.2
4
+ version: 0.9.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-02-08 00:00:00.000000000 Z
13
+ date: 2012-02-17 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: ansi
17
- requirement: &14008240 !ruby/object:Gem::Requirement
17
+ requirement: &7615200 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: '0'
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *14008240
25
+ version_requirements: *7615200
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: minitest
28
- requirement: &14007520 !ruby/object:Gem::Requirement
28
+ requirement: &7613840 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ! '>='
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
- version_requirements: *14007520
36
+ version_requirements: *7613840
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: rake
39
- requirement: &14006980 !ruby/object:Gem::Requirement
39
+ requirement: &7566920 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ! '>='
@@ -44,7 +44,7 @@ dependencies:
44
44
  version: '0'
45
45
  type: :development
46
46
  prerelease: false
47
- version_requirements: *14006980
47
+ version_requirements: *7566920
48
48
  description: Turn provides a set of alternative runners for MiniTest, both colorful
49
49
  and informative.
50
50
  email: