turn 0.8.2 → 0.8.3

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.
@@ -16,6 +16,7 @@ module Turn
16
16
  # -I --loadpath=PATHS add given PATHS to the $LOAD_PATH
17
17
  # -r --requires=LIBS require given LIBS before running tests
18
18
  # -m --minitest Force use of MiniTest framework.
19
+ # -t --trace Turn on invoke/execute tracing, enable full backtrace.
19
20
  #
20
21
  # RUN MODES
21
22
  # --normal run all tests in a single process [default]
@@ -64,6 +65,9 @@ module Turn
64
65
  # Output mode.
65
66
  attr :outmode
66
67
 
68
+ # Enable full backtrace
69
+ attr :trace
70
+
67
71
  #
68
72
  def initialize
69
73
  @live = nil
@@ -75,6 +79,7 @@ module Turn
75
79
  @runmode = nil
76
80
  @outmode = nil
77
81
  @framework = RUBY_VERSION >= "1.9" ? :minitest : :testunit
82
+ @trace = nil
78
83
  end
79
84
 
80
85
  #
@@ -118,6 +123,10 @@ module Turn
118
123
  @framework = :minitest
119
124
  end
120
125
 
126
+ opts.on("-T", '--trace', "Turn on invoke/execute tracing, enable full backtrace") do
127
+ @trace = true
128
+ end
129
+
121
130
  # Turn does not support Test::Unit 2.0+
122
131
  #opts.on('-u', '--testunit', "Force use of TestUnit framework") do
123
132
  # @framework = :testunit
@@ -203,9 +212,10 @@ module Turn
203
212
 
204
213
  @loadpath = ['lib'] if loadpath.empty?
205
214
 
206
- tests = ARGV.empty? ? nil : ARGV.dup
215
+ tests = ARGV.empty? ? nil : argv.dup
207
216
 
208
- controller = Turn::Controller.new do |c|
217
+ #config = Turn::Configuration.new do |c|
218
+ config = Turn.config do |c|
209
219
  c.live = live
210
220
  c.log = log
211
221
  c.loadpath = loadpath
@@ -216,8 +226,11 @@ module Turn
216
226
  c.pattern = pattern
217
227
  c.matchcase = matchcase
218
228
  c.framework = framework
229
+ c.trace = trace
219
230
  end
220
231
 
232
+ controller = Turn::Controller.new(config)
233
+
221
234
  result = controller.start
222
235
 
223
236
  if result
@@ -12,27 +12,38 @@ module Turn
12
12
  @name = name
13
13
  @fail = false
14
14
  @error = false
15
+ @skip = false
15
16
  @raised = nil
16
17
  @message = nil
17
18
  @backtrace = []
18
19
  end
19
20
 
20
21
  def fail!(assertion)
21
- @fail, @error = true, false
22
+ @fail, @error, @skip = true, false, false
22
23
  @raised = assertion
23
24
  @message = assertion.message
24
25
  @backtrace = assertion.backtrace
25
26
  end
26
27
 
27
28
  def error!(exception)
28
- @fail, @error = false, true
29
+ @fail, @error, @skip = false, true, false
29
30
  @raised = exception
30
31
  @message = exception.message
31
32
  @backtrace = exception.backtrace
32
33
  end
33
34
 
35
+ def skip!(assertion)
36
+ @fail, @error, @skip = false, false, true
37
+ @raised = assertion
38
+ @message = assertion.message
39
+ @backtrace = assertion.backtrace
40
+ end
41
+
34
42
  def fail? ; @fail ; end
35
43
  def error? ; @error ; end
44
+ def skip? ; @skip ; end
45
+
46
+ # TODO: should this include `or @skip`?
36
47
  def pass? ; !(@fail or @error) ; end
37
48
 
38
49
  def to_s ; name ; end
@@ -1,17 +1,26 @@
1
1
  require 'fileutils'
2
2
 
3
3
  module Turn
4
+
4
5
  require 'turn/version'
6
+ require 'turn/autoload'
5
7
  require 'turn/components/suite.rb'
6
8
  require 'turn/components/case.rb'
7
9
  require 'turn/components/method.rb'
8
10
 
9
- # = Controller
11
+ # Configure Turn
12
+ def self.config(&block)
13
+ @config ||= Configuration.new
14
+ block.call(@config) if block
15
+ @config
16
+ end
17
+
18
+ #
10
19
  #
11
20
  #--
12
21
  # TODO: Add support to test run loggging.
13
22
  #++
14
- class Controller
23
+ class Configuration
15
24
 
16
25
  # List of if file names or glob pattern of tests to run.
17
26
  attr_accessor :tests
@@ -51,8 +60,15 @@ module Turn
51
60
  # Test framework, either :minitest or :testunit
52
61
  attr_accessor :framework
53
62
 
63
+ # Enable full backtrace
64
+ attr_accessor :trace
65
+
66
+ # Use natural language case names.
67
+ attr_accessor :natural
68
+
54
69
  def verbose? ; @verbose ; end
55
70
  def live? ; @live ; end
71
+ def natural? ; @natural ; end
56
72
 
57
73
  private
58
74
 
@@ -63,15 +79,19 @@ module Turn
63
79
 
64
80
  #
65
81
  def initialize_defaults
66
- @loadpath ||= ['lib']
67
- @tests ||= ["test/**/{test,}*{,test}.rb"]
68
- @exclude ||= []
69
- @requires ||= []
70
- @live ||= false
71
- @log ||= true
72
- #@format ||= nil
82
+ @loadpath ||= ['lib']
83
+ @tests ||= ["test/**/{test,}*{,test}.rb"]
84
+ @exclude ||= []
85
+ @requires ||= []
86
+ @live ||= false
87
+ @log ||= true
88
+ #@format ||= nil
73
89
  #@runner ||= RUBY_VERSION >= "1.9" ? MiniRunner : TestRunner
74
- @pattern ||= /.*/
90
+ @matchcase ||= nil
91
+ @pattern ||= /.*/
92
+ @natural ||= false
93
+
94
+ @files = nil # reset files just in case
75
95
  end
76
96
 
77
97
  # Collect test configuation.
@@ -134,61 +154,88 @@ module Turn
134
154
  ex = ex.flatten.reject{ |f| File.directory?(f) }
135
155
 
136
156
  (fs - ex).uniq.map{ |f| File.expand_path(f) }
137
- )
157
+ ).flatten
138
158
  end
139
159
 
140
- def start
141
- @files = nil # reset files just in case
142
-
143
- if files.empty?
144
- $stderr.puts "No tests."
145
- return
146
- end
147
-
148
- testrun = runner.new(self)
149
-
150
- testrun.start
160
+ # TODO: Better name ?
161
+ def suite_name
162
+ files.map{ |path| File.dirname(path).sub(Dir.pwd+'/','') }.uniq.join(',')
151
163
  end
152
164
 
153
165
  # Select reporter based on output mode.
154
166
  def reporter
155
167
  @reporter ||= (
168
+ opts = { :trace=>trace, :natural=>natural? }
156
169
  case format
157
170
  when :marshal
158
171
  require 'turn/reporters/marshal_reporter'
159
- Turn::MarshalReporter.new($stdout)
172
+ Turn::MarshalReporter.new($stdout, opts)
160
173
  when :progress
161
174
  require 'turn/reporters/progress_reporter'
162
- Turn::ProgressReporter.new($stdout)
175
+ Turn::ProgressReporter.new($stdout, opts)
163
176
  when :dotted
164
177
  require 'turn/reporters/dot_reporter'
165
- Turn::DotReporter.new($stdout)
178
+ Turn::DotReporter.new($stdout, opts)
166
179
  when :pretty
167
180
  require 'turn/reporters/pretty_reporter'
168
- Turn::PrettyReporter.new($stdout)
181
+ Turn::PrettyReporter.new($stdout, opts)
169
182
  when :cue
170
183
  require 'turn/reporters/cue_reporter'
171
- Turn::CueReporter.new($stdout)
184
+ Turn::CueReporter.new($stdout, opts)
172
185
  else
173
186
  require 'turn/reporters/outline_reporter'
174
- Turn::OutlineReporter.new($stdout)
187
+ Turn::OutlineReporter.new($stdout, opts)
175
188
  end
176
189
  )
177
190
  end
178
191
 
192
+ end
193
+
194
+ # = Controller
195
+ #
196
+ class Controller
197
+
198
+ #
199
+ def initialize(config=Turn.config)
200
+ @config = config
201
+ end
202
+
203
+ #
204
+ attr :config
205
+
206
+ #
207
+ def start
208
+ if config.files.empty?
209
+ $stderr.puts "No tests."
210
+ return
211
+ end
212
+
213
+ setup
214
+
215
+ testrun = runner.new
216
+ testrun.start
217
+ end
218
+
219
+ #
220
+ def setup
221
+ config.loadpath.each{ |path| $: << path } unless config.live?
222
+ config.requires.each{ |path| require(path) }
223
+ config.files.each{ |path| require(path) }
224
+ end
225
+
179
226
  # # Insatance of Runner, selected based on format and runmode.
180
227
  def runner
181
228
  @runner ||= (
182
- case framework
229
+ case config.framework
183
230
  when :minitest
184
231
  require 'turn/runners/minirunner'
185
232
  else
186
233
  require 'turn/runners/testrunner'
187
234
  end
188
235
 
189
- case runmode
236
+ case config.runmode
190
237
  when :marshal
191
- if framework == :minitest
238
+ if config.framework == :minitest
192
239
  Turn::MiniRunner
193
240
  else
194
241
  Turn::TestRunner
@@ -200,7 +247,7 @@ module Turn
200
247
  require 'turn/runners/crossrunner'
201
248
  Turn::CrossRunner
202
249
  else
203
- if framework == :minitest
250
+ if config.framework == :minitest
204
251
  Turn::MiniRunner
205
252
  else
206
253
  Turn::TestRunner
@@ -212,4 +259,3 @@ module Turn
212
259
  end
213
260
 
214
261
  end
215
-
@@ -18,8 +18,10 @@ module Turn
18
18
 
19
19
  attr :io
20
20
 
21
- def initialize(io)
22
- @io = io || $stdout
21
+ def initialize(io, opts={})
22
+ @io = io || $stdout
23
+ @trace = opts[:trace]
24
+ @natural = opts[:natural]
23
25
  end
24
26
 
25
27
  # These methods are called in the process of running the tests.
@@ -105,7 +105,7 @@ module Turn
105
105
  pass = total - failure - error
106
106
 
107
107
  bar = '=' * 78
108
- if COLORIZE
108
+ if colorize?
109
109
  bar = if pass == total then Colorize.green(bar)
110
110
  else Colorize.red(bar) end
111
111
  end
@@ -55,7 +55,11 @@ module Turn
55
55
  list.uniq.each do |testunit|
56
56
  message = testunit.fail? ? ' ' + FAIL : ERROR
57
57
  message = message + ' ' + testunit.message.tabto(0)
58
- message << "\n" + (filter_backtrace(testunit.backtrace).first || '')
58
+ backtrace = filter_backtrace(testunit.backtrace)
59
+ message << "\n" + (backtrace.shift || '')
60
+ if @trace
61
+ message << "\n" + backtrace.join("\n")
62
+ end
59
63
  report << "\n" << message << "\n"
60
64
  end
61
65
  report << "\n"
@@ -33,7 +33,14 @@ module Turn
33
33
  # @file = test.file
34
34
  # io.puts(test.file)
35
35
  #end
36
- io.print " %-69s" % test.name
36
+
37
+ name = if @natural
38
+ " #{test.name.gsub("test_", "").gsub(/_/, " ")}"
39
+ else
40
+ " #{test.name}"
41
+ end
42
+
43
+ io.print " %-69s" % name
37
44
 
38
45
  @stdout.rewind
39
46
  @stderr.rewind
@@ -59,10 +66,15 @@ module Turn
59
66
 
60
67
  io.puts(" #{FAIL}")
61
68
  io.puts Colorize.bold(message).tabto(8)
69
+
62
70
  unless backtrace.empty?
63
- backtrace = "Assertion at " + filter_backtrace(assertion.backtrace).first
64
- io.puts "STDERR:".tabto(8)
65
- io.puts(backtrace.tabto(8))
71
+ label = "Assertion at "
72
+ tabsize = 8
73
+ backtrace1 = label + backtrace.shift
74
+ io.puts(backtrace1.tabto(tabsize))
75
+ if @trace
76
+ io.puts backtrace.map{|l| l.tabto(label.length + tabsize) }.join("\n")
77
+ end
66
78
  end
67
79
  show_captured_output
68
80
  end
@@ -125,7 +137,7 @@ module Turn
125
137
  pass = total - failure - error
126
138
 
127
139
  bar = '=' * 78
128
- if COLORIZE
140
+ if colorize?
129
141
  bar = if pass == total then Colorize.green(bar)
130
142
  else Colorize.red(bar) end
131
143
  end
@@ -66,16 +66,19 @@ module Turn
66
66
 
67
67
  message = assertion.message
68
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
-
69
+ _trace = if assertion.respond_to?(:backtrace)
70
+ filter_backtrace(assertion.backtrace)
71
+ else
72
+ filter_backtrace(assertion.location).first
73
+ end
75
74
  io.puts
76
- #io.puts pad(message, 10)
77
- io.puts message.tabto(10)
78
- io.puts trace.tabto(10)
75
+ tabsize = 10
76
+ #io.puts pad(message, tabsize)
77
+ io.puts message.tabto(tabsize)
78
+ io.puts _trace.shift.tabto(tabsize)
79
+ if @trace
80
+ io.puts _trace.map{|l| l.tabto(tabsize) }.join("\n")
81
+ end
79
82
  #show_captured_output
80
83
  end
81
84
 
@@ -89,15 +92,19 @@ module Turn
89
92
 
90
93
  message = exception.message
91
94
 
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
-
95
+ _trace = if exception.respond_to?(:backtrace)
96
+ filter_backtrace(exception.backtrace)
97
+ else
98
+ filter_backtrace(exception.location)
99
+ end
100
+ trace = _trace.shift
98
101
  io.puts
99
- io.puts message.tabto(10)
100
- io.puts trace.tabto(10)
102
+ tabsize = 10
103
+ io.puts message.tabto(tabsize)
104
+ io.puts trace.tabto(tabsize)
105
+ if @trace
106
+ io.puts _trace.map{|l| l.tabto(tabsize) }.join("\n")
107
+ end
101
108
  end
102
109
 
103
110
  # TODO: skip support
@@ -15,8 +15,8 @@ module Turn
15
15
  def start
16
16
  suite = TestSuite.new
17
17
 
18
- files = @controller.files
19
- viles = @controller.files # TODO: make selectable ?
18
+ files = @config.files
19
+ viles = @config.files # TODO: make selectable ?
20
20
 
21
21
  #files = files.select{ |f| File.extname(f) == '.rb' and File.file?(f) }
22
22
  #viles = viles.select{ |f| File.extname(f) == '.rb' and File.file?(f) }
@@ -19,14 +19,15 @@ module Turn
19
19
 
20
20
  private
21
21
 
22
- def initialize(controller)
23
- @controller = controller
24
- @reporter = controller.reporter
22
+ def initialize
23
+ @config = Turn.config
24
+
25
+ @reporter = @config.reporter
25
26
  #yield(self) if block_given?
26
- @loadpath = controller.loadpath
27
- @requires = controller.requires
28
- @live = controller.live?
29
- @minitest = controller.framework == :minitest
27
+ @loadpath = @config.loadpath
28
+ @requires = @config.requires
29
+ @live = @config.live?
30
+ @minitest = @config.framework == :minitest
30
31
  end
31
32
 
32
33
  public
@@ -36,7 +37,7 @@ module Turn
36
37
  #
37
38
  def start
38
39
  suite = TestSuite.new
39
- testruns = @controller.files.collect do |file|
40
+ testruns = @config.files.collect do |file|
40
41
  name = file.sub(Dir.pwd+'/','')
41
42
  suite.new_case(name, file)
42
43
  end
@@ -95,7 +96,8 @@ module Turn
95
96
  files = kase.files
96
97
 
97
98
  # remove any unexpected output injected at the beginning
98
- yaml = out[out.index(/^---/)..-1]
99
+ b = out.index(/^---/)
100
+ yaml = out[b..-1]
99
101
  sub_suite = YAML.load(yaml)
100
102
 
101
103
  # TODO: How to handle pairs?
@@ -164,4 +166,3 @@ module Turn
164
166
  end#class IsoRunner
165
167
 
166
168
  end#module Turn
167
-