turn 0.8.3 → 0.9.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.
Files changed (44) hide show
  1. data/.gitignore +4 -0
  2. data/Gemfile +1 -8
  3. data/History.txt +16 -0
  4. data/{license/GPLv2.txt → LICENSE-GPL2.txt} +0 -0
  5. data/{license/MIT-LICENSE.txt → LICENSE-MIT.txt} +0 -0
  6. data/{license/RUBY-LICENSE.txt → LICENSE-RUBY.txt} +0 -0
  7. data/{NOTICE.txt → LICENSE.txt} +1 -1
  8. data/README.md +26 -0
  9. data/Rakefile +1 -0
  10. data/Version.txt +1 -1
  11. data/bin/turn +7 -1
  12. data/lib/turn.rb +20 -11
  13. data/lib/turn/autoload.rb +1 -1
  14. data/lib/turn/autorun.rb +8 -0
  15. data/lib/turn/bin.rb +7 -1
  16. data/lib/turn/colorize.rb +26 -10
  17. data/lib/turn/command.rb +32 -13
  18. data/lib/turn/components.rb +4 -0
  19. data/lib/turn/components/case.rb +1 -1
  20. data/lib/turn/components/suite.rb +9 -3
  21. data/lib/turn/configuration.rb +197 -0
  22. data/lib/turn/controller.rb +15 -206
  23. data/lib/turn/{autorun/minitest.rb → minitest.rb} +7 -3
  24. data/lib/turn/reporter.rb +65 -10
  25. data/lib/turn/reporters/cue_reporter.rb +13 -2
  26. data/lib/turn/reporters/dot_reporter.rb +12 -11
  27. data/lib/turn/reporters/outline_reporter.rb +57 -36
  28. data/lib/turn/reporters/pretty_reporter.rb +37 -24
  29. data/lib/turn/reporters/progress_reporter.rb +64 -26
  30. data/lib/turn/runners/minirunner.rb +7 -32
  31. data/lib/turn/testunit.rb +5 -0
  32. data/test/helper.rb +11 -2
  33. data/test/test_framework.rb +39 -30
  34. data/test/test_runners.rb +9 -7
  35. data/{demo → try}/test_autorun_minitest.rb +0 -0
  36. data/{demo → try}/test_autorun_testunit.rb +0 -0
  37. data/{demo → try}/test_counts.rb +0 -0
  38. data/{demo → try}/test_sample.rb +0 -0
  39. data/{demo → try}/test_sample2.rb +0 -0
  40. data/turn.gemspec +2 -2
  41. metadata +42 -29
  42. data/lib/turn/autorun/minitest0.rb +0 -163
  43. data/lib/turn/autorun/testunit.rb +0 -9
  44. data/lib/turn/autorun/testunit0.rb +0 -116
@@ -0,0 +1,4 @@
1
+ coverage
2
+ doc
3
+ pkg
4
+ tmp
data/Gemfile CHANGED
@@ -1,9 +1,2 @@
1
1
  source :rubygems
2
-
3
- gem "ansi", ">= 1.2.2"
4
-
5
- group :development do
6
- gem "bones"', ">= 3.6.5"
7
- gem "bones-get"', ">= 1.2.4"
8
- end
9
-
2
+ gemspec
@@ -1,3 +1,19 @@
1
+ == 0.9.0 / 2012-01-30
2
+ * Fix bundle exec issue, which means...
3
+ * Developer's must require `turn/autorun` instead fo just `turn`.
4
+ * Improve detection of TestUnit 1.x vs. MiniTest
5
+ * Show randomization seed number in output.
6
+ * Pretty format option is now `-R` instead of `-T`.
7
+ * Rename case match shortcut to `-c` instead of `-t`.
8
+ * Add support for skipped tests.
9
+ * Support max backtrace limit via `-b` option.
10
+ * Use $RUBY_IGNORE_CALLERS to ignore lines of backtrace.
11
+ * Better color support on Windows (install ANSICON)
12
+ * MiniTest is a dependency (even if you are using it for TestUnit 1.x).
13
+
14
+ == 0.8.4 / 2011-11-11
15
+ * Now must use MiniTest 2.0+.
16
+
1
17
  == 0.8.3 / 2011-10-10
2
18
  * Merge pull request #56 from codeinvain/master
3
19
  * Merge pull request #52 from markburns/patch-2
File without changes
@@ -25,7 +25,7 @@ interface with MiniTest effectively.
25
25
  Copyright:: (c) Nathaniel Talbott
26
26
  License:: The Ruby License
27
27
 
28
- This software is distributed under the same terms as ruby.
28
+ This software is distributed under the same terms as Ruby.
29
29
 
30
30
  See license/RUBY-LICENSE.txt for detiails.
31
31
 
data/README.md CHANGED
@@ -85,6 +85,32 @@ the end user to install the TURN package.
85
85
  For a Rails application, put the require line into the 'test/test_helper.rb'
86
86
  script. Now your Rails tests will use TURN formatting.
87
87
 
88
+
89
+ ## RAILS/BUNDLER USERS
90
+
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.
96
+
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.
101
+
102
+ Thankfully there is a work around. In your Gemfile add:
103
+
104
+ gem 'turn', :require => false
105
+
106
+ The `:require` option will prevent Turn from trying to autorun tests.
107
+
108
+ In the future we will change turn to use `reuqire '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.
112
+
113
+
88
114
  ## REQUIREMENTS:
89
115
 
90
116
  * ansi 1.1+ (for colorized output and progress bar output mode)
data/Rakefile CHANGED
@@ -21,6 +21,7 @@ Bones {
21
21
  use_gmail
22
22
 
23
23
  depend_on 'ansi'
24
+ depend_on 'minitest'
24
25
  depend_on 'bones-git', :development => true
25
26
  }
26
27
 
@@ -1 +1 @@
1
- 0.8.3
1
+ 0.9.0
data/bin/turn CHANGED
@@ -1,4 +1,10 @@
1
1
  #!/usr/bin/env ruby
2
2
  require 'turn/command'
3
- Turn::Command.main(*ARGV)
3
+ begin
4
+ Turn::Command.main(*ARGV)
5
+ rescue StandardError => e
6
+ raise if $DEBUG
7
+ puts e
8
+ exit -1
9
+ end
4
10
 
@@ -1,19 +1,28 @@
1
+ #
1
2
  module Turn
2
- # Returns +true+ if the ruby version supports minitest.
3
- # Otherwise, +false+ is returned.
4
- def self.minitest?
5
- RUBY_VERSION >= '1.9'
3
+ # Are we using Test::Unit (1.x)?
4
+ def self.testunit?
5
+ defined?(Test::Unit) && !defined?(MiniTest)
6
6
  end
7
7
  end
8
8
 
9
+ require 'fileutils'
10
+
11
+ require 'turn/version'
9
12
  require 'turn/autoload'
13
+ require 'turn/configuration'
14
+ require 'turn/colorize'
15
+ require 'turn/components'
16
+ require 'turn/controller'
10
17
 
11
- unless defined?(Turn::Command)
12
- if Turn.minitest?
13
- require 'turn/autorun/minitest'
14
- MiniTest::Unit.autorun
15
- else
16
- require 'turn/autorun/testunit'
17
- end
18
+ if Turn.testunit?
19
+ require 'turn/testunit'
20
+ else
21
+ require 'turn/minitest'
18
22
  end
19
23
 
24
+ #if ENV['autorun']
25
+ # warn "Use `require 'turn/autorun'` instead of `require 'turn'` for future versions."
26
+ # MiniTest::Unit.autorun
27
+ #end
28
+
@@ -1,6 +1,6 @@
1
1
  # This is a "dirty trick" to load `test/unit` or `minitest/unit` if sought.
2
2
  # Eventually a way to handle this more robustly (without autoreload)
3
- # should be worked out.
3
+ # should be worked out. But how?
4
4
  autoload "Test", 'test/unit'
5
5
  autoload "MiniTest", 'minitest/unit'
6
6
 
@@ -0,0 +1,8 @@
1
+ require 'turn'
2
+
3
+ if Turn.testunit?
4
+ Test::Unit.run = true
5
+ else
6
+ MiniTest::Unit.autorun
7
+ end
8
+
@@ -1,4 +1,10 @@
1
1
  $LOAD_PATH.unshift(File.dirname(File.dirname(__FILE__)))
2
2
  require 'turn/command'
3
- Turn::Command.main(*ARGV)
3
+ #begin
4
+ Turn::Command.main(*ARGV)
5
+ #rescue StandardError => e
6
+ # raise if $DEBUG
7
+ # puts e
8
+ # exit -1
9
+ #end
4
10
 
@@ -1,3 +1,5 @@
1
+ require 'turn/configuration' # why is this needed here?
2
+
1
3
  begin
2
4
  require 'ansi/code'
3
5
  rescue LoadError
@@ -10,17 +12,30 @@ end
10
12
 
11
13
  module Turn
12
14
 
15
+ # Provides a uniform interface for colorizing Turn output.
16
+ #
13
17
  module Colorize
14
18
 
15
19
  COLORLESS_TERMINALS = ['dumb']
16
20
 
17
- def colorize?
18
- defined?(::ANSI::Code) &&
19
- ENV.has_key?('TERM') &&
20
- !COLORLESS_TERMINALS.include?(ENV['TERM']) &&
21
- $stdout.tty?
21
+ def self.colorize?
22
+ @colorize ||= (
23
+ ansi = Turn.config.ansi?
24
+ if ansi.nil?
25
+ color_supported?
26
+ else
27
+ Turn.config.ansi?
28
+ end
29
+ )
30
+ end
31
+
32
+ def self.color_supported?
33
+ return false unless defined?(::ANSI::Code)
34
+ return false unless $stdout.tty?
35
+ return true if ENV.has_key?('TERM') && !COLORLESS_TERMINALS.include?(ENV['TERM'])
36
+ return true if ::RbConfig::CONFIG['host_os'] =~ /mswin|mingw/ && ENV.has_key?('ANSICON')
37
+ return false
22
38
  end
23
- module_function :colorize?
24
39
 
25
40
  def self.red(string)
26
41
  colorize? ? ::ANSI::Code.red{ string } : string
@@ -50,11 +65,8 @@ module Turn
50
65
  colorize? ? ::ANSI::Code.red{ string } : string
51
66
  end
52
67
 
53
- #def self.error(string)
54
- # colorize? ? ::ANSI::Code.white{ ::ANSI::Code.on_red{ string } } : string
55
- #end
56
-
57
68
  def self.error(string)
69
+ #colorize? ? ::ANSI::Code.white_on_red{ string } : string
58
70
  colorize? ? ::ANSI::Code.yellow{ string } : string
59
71
  end
60
72
 
@@ -67,6 +79,10 @@ module Turn
67
79
  ERROR = error('ERROR')
68
80
  SKIP = skip('SKIP')
69
81
 
82
+ def colorize?
83
+ Colorize.colorize?
84
+ end
85
+
70
86
  end
71
87
 
72
88
  end
@@ -1,7 +1,7 @@
1
1
  require 'optparse'
2
+ require 'turn'
2
3
 
3
4
  module Turn
4
- require 'turn/controller'
5
5
 
6
6
  # Turn - Pretty Unit Test Runner for Ruby
7
7
  #
@@ -13,10 +13,11 @@ module Turn
13
13
  # --live don't use loadpath
14
14
  # --log log results to a file
15
15
  # -n --name=PATTERN only run tests that match regexp PATTERN
16
+ # -c --case=PATTERN only run testcases that match regexp PATTERN
16
17
  # -I --loadpath=PATHS add given PATHS to the $LOAD_PATH
17
18
  # -r --requires=LIBS require given LIBS before running tests
18
19
  # -m --minitest Force use of MiniTest framework.
19
- # -t --trace Turn on invoke/execute tracing, enable full backtrace.
20
+ # -b --backtrace=INT Set the number of lines to show in backtrace.
20
21
  #
21
22
  # RUN MODES
22
23
  # --normal run all tests in a single process [default]
@@ -27,9 +28,9 @@ module Turn
27
28
  # -O --outline turn's original case/test outline mode [default]
28
29
  # -P --progress indicates progress with progress bar
29
30
  # -D --dotted test/unit's traditonal dot-progress mode
30
- # --pretty new pretty reporter
31
+ # -R --pretty new pretty reporter
31
32
  # -M --marshal dump output as YAML (normal run mode only)
32
- # -Q --queued interactive testing
33
+ # -C --cue interactive testing
33
34
  #
34
35
  class Command
35
36
 
@@ -57,7 +58,7 @@ module Turn
57
58
  attr :requires
58
59
 
59
60
  # Framework to use, :minitest or :testunit.
60
- attr :framework
61
+ #attr :framework
61
62
 
62
63
  # Run mode.
63
64
  attr :runmode
@@ -68,6 +69,12 @@ module Turn
68
69
  # Enable full backtrace
69
70
  attr :trace
70
71
 
72
+ # Use natural test case names.
73
+ attr :natural
74
+
75
+ # Force ANSI use on or off.
76
+ attr :ansi
77
+
71
78
  #
72
79
  def initialize
73
80
  @live = nil
@@ -78,8 +85,10 @@ module Turn
78
85
  @requires = []
79
86
  @runmode = nil
80
87
  @outmode = nil
81
- @framework = RUBY_VERSION >= "1.9" ? :minitest : :testunit
88
+ #@framework = RUBY_VERSION >= "1.9" ? :minitest : :testunit
82
89
  @trace = nil
90
+ @natural = false
91
+ @ansi = nil
83
92
  end
84
93
 
85
94
  #
@@ -111,7 +120,7 @@ module Turn
111
120
  end
112
121
  end
113
122
 
114
- opts.on('-t', '--testcase=PATTERN', "only run testcases that match PATTERN") do |pattern|
123
+ opts.on('-c', '--case=PATTERN', "only run test cases that match PATTERN") do |pattern|
115
124
  if pattern =~ /\/(.*)\//
116
125
  @matchcase = Regexp.new($1)
117
126
  else
@@ -119,12 +128,20 @@ module Turn
119
128
  end
120
129
  end
121
130
 
122
- opts.on('-m', '--minitest', "Force use of MiniTest framework") do
123
- @framework = :minitest
131
+ #opts.on('-m', '--minitest', "Force use of MiniTest framework") do
132
+ # @framework = :minitest
133
+ #end
134
+
135
+ opts.on('-b', '--backtrace', '--trace INT', "Limit the number of lines of backtrace.") do |int|
136
+ @trace = int
137
+ end
138
+
139
+ opts.on('--natural', "Show natualized test names.") do |bool|
140
+ @natural = bool
124
141
  end
125
142
 
126
- opts.on("-T", '--trace', "Turn on invoke/execute tracing, enable full backtrace") do
127
- @trace = true
143
+ opts.on('--[no-]ansi', "Force use of ANSI codes on or off.") do |bool|
144
+ @ansi = bool
128
145
  end
129
146
 
130
147
  # Turn does not support Test::Unit 2.0+
@@ -173,7 +190,7 @@ module Turn
173
190
  @outmode = :dotted
174
191
  end
175
192
 
176
- opts.on('--pretty', '-T', "new pretty output mode") do
193
+ opts.on('--pretty', '-R', '-T', "new pretty output mode") do
177
194
  @outmode = :pretty
178
195
  end
179
196
 
@@ -225,8 +242,10 @@ module Turn
225
242
  c.format = outmode
226
243
  c.pattern = pattern
227
244
  c.matchcase = matchcase
228
- c.framework = framework
245
+ #c.framework = framework
229
246
  c.trace = trace
247
+ c.natural = natural
248
+ c.ansi = ansi unless ansi.nil?
230
249
  end
231
250
 
232
251
  controller = Turn::Controller.new(config)
@@ -0,0 +1,4 @@
1
+ require 'turn/components/suite'
2
+ require 'turn/components/case'
3
+ require 'turn/components/method'
4
+
@@ -23,7 +23,7 @@ module Turn
23
23
  attr_accessor :count_assertions
24
24
 
25
25
  # Holds dump of test output (optional depending on runner).
26
- attr_accessor :message
26
+ attr_writer :message
27
27
 
28
28
  # Command used to run test (optional depending on runner).
29
29
  #attr_accessor :command
@@ -6,18 +6,19 @@ module Turn
6
6
  include Enumerable
7
7
 
8
8
  attr_accessor :name
9
- attr_accessor :size
10
9
  attr_accessor :cases
10
+ attr_accessor :seed
11
11
 
12
12
  # This one can be set manually since it
13
13
  # is not calculatable (beyond the case level).
14
- attr_accessor :count_assertions
14
+ attr_writer :count_assertions
15
15
 
16
16
  #
17
17
  def initialize(name=nil)
18
18
  @name = name
19
- @size = nil
20
19
  @cases = []
20
+ @size = nil
21
+ @seed = nil
21
22
 
22
23
  #@count_tests = nil
23
24
  #@count_assertions = nil
@@ -76,6 +77,11 @@ module Turn
76
77
  @size ||= @cases.size
77
78
  end
78
79
 
80
+ # Why the size would ever have to overridden... well who can say.
81
+ def size=(number)
82
+ @size = number.to_i
83
+ end
84
+
79
85
  def passed?
80
86
  (count_failures == 0 && count_errors == 0)
81
87
  end
@@ -0,0 +1,197 @@
1
+ module Turn
2
+
3
+ # Configure Turn
4
+ def self.config(&block)
5
+ @config ||= Configuration.new
6
+ block.call(@config) if block
7
+ @config
8
+ end
9
+
10
+ # TODO: Support for test run loggging ?
11
+
12
+ # Central interface for Turn configuration.
13
+ #
14
+ class Configuration
15
+
16
+ # List of if file names or glob pattern of tests to run.
17
+ attr_reader :tests
18
+
19
+ # List of file names or globs to exclude from +tests+ list.
20
+ attr_reader :exclude
21
+
22
+ # Regexp pattern that all test name's must
23
+ # match to be eligible to run.
24
+ attr_accessor :pattern
25
+
26
+ # Regexp pattern that all test cases must
27
+ # match to be eligible to run.
28
+ attr_accessor :matchcase
29
+
30
+ # Add these folders to the $LOAD_PATH.
31
+ attr_reader :loadpath
32
+
33
+ # Libs to require when running tests.
34
+ attr_reader :requires
35
+
36
+ # Reporter type.
37
+ attr_accessor :format
38
+
39
+ # Run mode.
40
+ attr_accessor :runmode
41
+
42
+ # Test against live install (i.e. Don't use loadpath option)
43
+ attr_accessor :live
44
+
45
+ # Log results? May be true/false or log file name. (TODO)
46
+ attr_accessor :log
47
+
48
+ # Verbose output?
49
+ attr_accessor :verbose
50
+
51
+ # Test framework, either :minitest or :testunit
52
+ attr_accessor :framework
53
+
54
+ # Enable full backtrace
55
+ attr_accessor :trace
56
+
57
+ # Use natural language case names.
58
+ attr_accessor :natural
59
+
60
+ def verbose? ; @verbose ; end
61
+ def live? ; @live ; end
62
+ def natural? ; @natural ; end
63
+ def ansi? ; @ansi ; end
64
+
65
+ private
66
+
67
+ def initialize
68
+ yield(self) if block_given?
69
+ initialize_defaults
70
+ end
71
+
72
+ #
73
+ def initialize_defaults
74
+ @loadpath ||= ['lib']
75
+ @tests ||= ["test/**/{test,}*{,test}.rb"]
76
+ @exclude ||= []
77
+ @requires ||= []
78
+ @live ||= false
79
+ @log ||= true
80
+ #@format ||= nil
81
+ #@runner ||= RUBY_VERSION >= "1.9" ? MiniRunner : TestRunner
82
+ @matchcase ||= nil
83
+ @pattern ||= /.*/
84
+ @natural ||= false
85
+ @trace ||= environment_trace
86
+ @ansi ||= nil
87
+
88
+ @files = nil # reset files just in case
89
+ end
90
+
91
+ # Collect test configuation.
92
+ #def test_configuration(options={})
93
+ # #options = configure_options(options, 'test')
94
+ # #options['loadpath'] ||= metadata.loadpath
95
+ # options['tests'] ||= self.tests
96
+ # options['loadpath'] ||= self.loadpath
97
+ # options['requires'] ||= self.requires
98
+ # options['live'] ||= self.live
99
+ # options['exclude'] ||= self.exclude
100
+ # #options['tests'] = list_option(options['tests'])
101
+ # options['loadpath'] = list_option(options['loadpath'])
102
+ # options['exclude'] = list_option(options['exclude'])
103
+ # options['require'] = list_option(options['require'])
104
+ # return options
105
+ #end
106
+
107
+ #
108
+ def list_option(list)
109
+ case list
110
+ when nil
111
+ []
112
+ when Array
113
+ list
114
+ else
115
+ list.split(/[:;]/)
116
+ end
117
+ end
118
+
119
+ public
120
+
121
+ def ansi=(boolean)
122
+ @ansi = boolean ? true : false
123
+ end
124
+
125
+ def tests=(paths)
126
+ @tests = list_option(paths)
127
+ end
128
+
129
+ def loadpath=(paths)
130
+ @loadpath = list_option(paths)
131
+ end
132
+
133
+ def exclude=(paths)
134
+ @exclude = list_option(paths)
135
+ end
136
+
137
+ def requires=(paths)
138
+ @requires = list_option(paths)
139
+ end
140
+
141
+ # Test files.
142
+ def files
143
+ @files ||= (
144
+ fs = tests.map do |t|
145
+ File.directory?(t) ? Dir[File.join(t, '**', '*')] : Dir[t]
146
+ end
147
+ fs = fs.flatten.reject{ |f| File.directory?(f) }
148
+
149
+ ex = exclude.map do |x|
150
+ File.directory?(x) ? Dir[File.join(x, '**', '*')] : Dir[x]
151
+ end
152
+ ex = ex.flatten.reject{ |f| File.directory?(f) }
153
+
154
+ (fs - ex).uniq.map{ |f| File.expand_path(f) }
155
+ ).flatten
156
+ end
157
+
158
+ # TODO: Better name ?
159
+ def suite_name
160
+ files.map{ |path| File.dirname(path).sub(Dir.pwd+'/','') }.uniq.join(',')
161
+ end
162
+
163
+ # Select reporter based on output mode.
164
+ def reporter
165
+ @reporter ||= (
166
+ opts = { :trace=>trace, :natural=>natural? }
167
+ case format
168
+ when :marshal
169
+ require 'turn/reporters/marshal_reporter'
170
+ Turn::MarshalReporter.new($stdout, opts)
171
+ when :progress
172
+ require 'turn/reporters/progress_reporter'
173
+ Turn::ProgressReporter.new($stdout, opts)
174
+ when :dotted, :dot
175
+ require 'turn/reporters/dot_reporter'
176
+ Turn::DotReporter.new($stdout, opts)
177
+ when :pretty
178
+ require 'turn/reporters/pretty_reporter'
179
+ Turn::PrettyReporter.new($stdout, opts)
180
+ when :cue
181
+ require 'turn/reporters/cue_reporter'
182
+ Turn::CueReporter.new($stdout, opts)
183
+ else
184
+ require 'turn/reporters/outline_reporter'
185
+ Turn::OutlineReporter.new($stdout, opts)
186
+ end
187
+ )
188
+ end
189
+
190
+ #
191
+ def environment_trace
192
+ (ENV['backtrace'] ? ENV['backtrace'].to_i : nil)
193
+ end
194
+
195
+ end
196
+
197
+ end