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
@@ -3,7 +3,7 @@ require 'stringio'
3
3
 
4
4
  module Turn
5
5
 
6
- # = Outline Reporter (Turn's Original)
6
+ # Outline Reporter is Turn's Original.
7
7
  #
8
8
  #--
9
9
  # TODO: Should we fit reporter output to width of console?
@@ -11,15 +11,23 @@ module Turn
11
11
  #++
12
12
  class OutlineReporter < Reporter
13
13
 
14
+ #
15
+ TAB_SIZE = 8
16
+
14
17
  #
15
18
  def start_suite(suite)
16
- @suite = suite
17
- @time = Time.now
19
+ @suite = suite
20
+ @time = Time.now
18
21
  @stdout = StringIO.new
19
22
  @stderr = StringIO.new
20
- #files = suite.collect{ |s| s.file }.join(' ')
21
- io.puts "LOADED SUITE #{suite.name}"
22
- #io.puts "Started"
23
+ #files = suite.collect{ |s| s.file }.join(' ')
24
+ puts '=' * 78
25
+ if suite.seed
26
+ io.puts "SUITE #{suite.name} (SEED #{suite.seed})"
27
+ else
28
+ io.puts "SUITE #{suite.name}"
29
+ end
30
+ puts '=' * 78
23
31
  end
24
32
 
25
33
  #
@@ -34,13 +42,9 @@ module Turn
34
42
  # io.puts(test.file)
35
43
  #end
36
44
 
37
- name = if @natural
38
- " #{test.name.gsub("test_", "").gsub(/_/, " ")}"
39
- else
40
- " #{test.name}"
41
- end
45
+ name = naturalized_name(test)
42
46
 
43
- io.print " %-69s" % name
47
+ io.print " %-57s" % name
44
48
 
45
49
  @stdout.rewind
46
50
  @stderr.rewind
@@ -51,43 +55,60 @@ module Turn
51
55
 
52
56
  #
53
57
  def pass(message=nil)
54
- io.puts " #{PASS}"
58
+ io.puts " %s %s" % [ticktock, PASS]
59
+
55
60
  if message
56
61
  message = Colorize.magenta(message)
57
- message = message.to_s.tabto(8)
62
+ message = message.to_s.tabto(TAB_SIZE)
58
63
  io.puts(message)
59
64
  end
60
65
  end
61
66
 
62
67
  #
63
68
  def fail(assertion)
64
- message = assertion.message.to_s
65
- backtrace = filter_backtrace(assertion.backtrace)
66
-
67
- io.puts(" #{FAIL}")
68
- io.puts Colorize.bold(message).tabto(8)
69
-
70
- unless backtrace.empty?
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
78
- end
69
+ io.puts " %s %s" % [ticktock, FAIL]
70
+
71
+ message = []
72
+ message << Colorize.bold(assertion.message.to_s)
73
+ message << "Assertion at:"
74
+ message << clean_backtrace(assertion.backtrace).join("\n")
75
+ message = message.join("\n")
76
+
77
+ io.puts(message.tabto(TAB_SIZE))
78
+
79
+ #unless backtrace.empty?
80
+ # io.puts "Assertion at".tabto(TAB_SIZE)
81
+ # io.puts backtrace.map{|l| l.tabto(TAB_SIZE)}.join("\n")
82
+ #end
83
+
84
+ #io.puts "STDERR:".tabto(TAB_SIZE)
79
85
  show_captured_output
80
86
  end
81
87
 
82
88
  #
83
89
  def error(exception)
84
- message = exception.message
85
- backtrace = "Exception `#{exception.class}' at " + filter_backtrace(exception.backtrace).join("\n")
86
- message = Colorize.bold(message)
87
- io.puts("#{ERROR}")
90
+ io.puts " %s %s" % [ticktock, ERROR]
91
+
92
+ message = []
93
+ message << Colorize.bold(exception.message)
94
+ message << "Exception `#{exception.class}' at:"
95
+ message << clean_backtrace(exception.backtrace).join("\n")
96
+ message = message.join("\n")
97
+
98
+ io.puts(message.tabto(TAB_SIZE))
99
+
100
+ #io.puts "STDERR:".tabto(TAB_SIZE)
101
+ show_captured_output
102
+ end
103
+
104
+ #
105
+ def skip(exception)
106
+ io.puts " %s %s" % [ticktock, SKIP]
107
+
108
+ message = exception.message
109
+
88
110
  io.puts(message.tabto(8))
89
- io.puts "STDERR:".tabto(8)
90
- io.puts(backtrace.tabto(8))
111
+
91
112
  show_captured_output
92
113
  end
93
114
 
@@ -129,7 +150,7 @@ module Turn
129
150
  #def finish_case(kase)
130
151
  #end
131
152
 
132
- #
153
+ # TODO: pending (skip) counts
133
154
  def finish_suite(suite)
134
155
  total = suite.count_tests
135
156
  failure = suite.count_failures
@@ -8,6 +8,9 @@ module Turn
8
8
  #
9
9
  PADDING_SIZE = 4
10
10
 
11
+ #
12
+ TAB_SIZE = 10
13
+
11
14
  #
12
15
  def start_suite(suite)
13
16
  #old_sync, @@out.sync = @@out.sync, true if io.respond_to? :sync=
@@ -18,7 +21,7 @@ module Turn
18
21
  #files = suite.collect{ |s| s.file }.join(' ')
19
22
  io.puts "Loaded suite #{suite.name}"
20
23
  #io.puts "Loaded suite #{$0.sub(/\.rb$/, '')}\nStarted"
21
- io.puts "Started"
24
+ io.puts "Started (#{suite.seed})"
22
25
  end
23
26
 
24
27
  #
@@ -56,7 +59,7 @@ module Turn
56
59
  end
57
60
 
58
61
  #
59
- def fail(assertion)
62
+ def fail(assertion, message=nil)
60
63
  io.print pad_with_size("#{FAIL}")
61
64
  io.print " #{@test}"
62
65
  io.print " (%.2fs) " % (Time.now - @test_time)
@@ -64,53 +67,63 @@ module Turn
64
67
  #message = assertion.location[0] + "\n" + assertion.message #.gsub("\n","\n")
65
68
  #trace = MiniTest::filter_backtrace(report[:exception].backtrace).first
66
69
 
67
- message = assertion.message
70
+ message ||= assertion.message
68
71
 
69
72
  _trace = if assertion.respond_to?(:backtrace)
70
73
  filter_backtrace(assertion.backtrace)
71
74
  else
72
75
  filter_backtrace(assertion.location).first
73
76
  end
77
+
74
78
  io.puts
75
- tabsize = 10
76
79
  #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
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")
84
+
82
85
  #show_captured_output
83
86
  end
84
87
 
85
88
  #
86
- def error(exception)
89
+ def error(exception, message=nil)
87
90
  io.print pad_with_size("#{ERROR}")
88
91
  io.print " #{@test}"
89
92
  io.print " (%.2fs) " % (Time.now - @test_time)
90
93
 
91
94
  #message = exception.to_s.split("\n")[2..-1].join("\n")
92
95
 
93
- message = exception.message
96
+ message ||= exception.message
94
97
 
95
98
  _trace = if exception.respond_to?(:backtrace)
96
- filter_backtrace(exception.backtrace)
99
+ clean_backtrace(exception.backtrace)
97
100
  else
98
- filter_backtrace(exception.location)
101
+ clean_backtrace(exception.location)
99
102
  end
100
- trace = _trace.shift
103
+
101
104
  io.puts
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
105
+ io.puts message.tabto(TAB_SIZE)
106
+ io.puts _trace.map{|l| l.tabto(TAB_SIZE) }.join("\n")
108
107
  end
109
108
 
110
- # TODO: skip support
111
- #def skip
112
- # io.puts(pad_with_size("#{SKIP}"))
113
- #end
109
+ #
110
+ 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
114
127
 
115
128
  #
116
129
  def finish_test(test)
@@ -6,28 +6,39 @@ module Turn
6
6
  #
7
7
  class ProgressReporter < Reporter
8
8
 
9
+ def initialize(io, opts={})
10
+ super(io, opts)
11
+ @fails = Hash.new{|h,k|h[k]=[]}
12
+ @errors = Hash.new{|h,k|h[k]=[]}
13
+ @skips = Hash.new{|h,k|h[k]=[]}
14
+ end
15
+
9
16
  def start_suite(suite)
10
17
  @pbar = ::ANSI::Progressbar.new('Testing', suite.size)
11
18
  @pbar.inc
12
19
  end
13
20
 
14
- #def start_case(kase)
15
- #end
21
+ def start_case(testcase)
22
+ @_current_case = testcase
23
+ end
16
24
 
17
25
  #def start_test(test)
18
26
  #end
19
27
 
20
28
  #def pass(message=nil)
21
- # #@pbar.inc
22
29
  #end
23
30
 
24
- #def fail(message=nil)
25
- # #@pbar.inc
26
- #end
31
+ def fail(assertion, message=nil)
32
+ @fails[@_current_case] << assertion
33
+ end
27
34
 
28
- #def error(message=nil)
29
- # #@pbar.inc
30
- #end
35
+ def error(exception, message=nil)
36
+ @errors[@_current_case] << exception
37
+ end
38
+
39
+ def skip(exception, message=nil)
40
+ @skips[@_current_case] << exception
41
+ end
31
42
 
32
43
  def finish_case(kase)
33
44
  @pbar.inc
@@ -42,13 +53,14 @@ module Turn
42
53
  def post_report(suite)
43
54
  tally = test_tally(suite)
44
55
 
45
- width = suite.collect{ |tr| tr.name.size }.max
56
+ width = suite.collect{ |tr| tr.name.to_s.size }.max
46
57
 
47
58
  headers = [ 'TESTCASE ', ' TESTS ', 'ASSERTIONS', ' FAILURES ', ' ERRORS ' ]
48
- io.puts "\n%-#{width}s %10s %10s %10s %10s\n" % headers
59
+ io.puts "\n\n%-#{width}s %10s %10s %10s %10s\n" % headers
49
60
 
50
- files = nil
61
+ io.puts ("-" * (width + 50))
51
62
 
63
+ files = nil
52
64
  suite.each do |testrun|
53
65
  if testrun.files != [testrun.name] && testrun.files != files
54
66
  label = testrun.files.join(' ')
@@ -61,27 +73,53 @@ module Turn
61
73
 
62
74
  #puts("\n%i tests, %i assertions, %i failures, %i errors\n\n" % tally)
63
75
 
64
- tally_line = "-----\n"
65
- tally_line << "%-#{width}s " % "TOTAL"
76
+ tally_line = ("-" * (width + 50))
77
+ tally_line << "\n%-#{width}s " % "TOTAL"
66
78
  tally_line << "%10s %10s %10s %10s" % tally
67
79
 
68
- io.puts(tally_line + "\n")
80
+ io.puts(tally_line + "\n\n\n")
69
81
 
70
- fails = suite.select do |testrun|
71
- testrun.fail? || testrun.error?
82
+ io.puts "-- Failures --\n\n" unless @fails.empty?
83
+
84
+ @fails.each do |tc, cc|
85
+ cc.each do |e|
86
+ message = e.message.tabto(0).strip
87
+ message = Colorize.red(message)
88
+ message += "\n" + clean_backtrace(e.backtrace).join("\n")
89
+ io.puts(message+"\n\n")
90
+ end
91
+ io.puts
72
92
  end
73
93
 
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
94
+ io.puts "-- Errors --\n\n" unless @errors.empty?
95
+
96
+ @errors.each do |tc, cc|
97
+ cc.each do |e|
98
+ message = e.message.tabto(0).strip
99
+ message = Colorize.red(message)
100
+ message += "\n" + clean_backtrace(e.backtrace).join("\n")
101
+ io.puts(message+"\n\n")
83
102
  end
103
+ io.puts
104
+ end
105
+
106
+ #fails = suite.select do |testrun|
107
+ # testrun.fail? || testrun.error?
84
108
  #end
109
+
110
+ ##if tally[2] != 0 or tally[3] != 0
111
+ # unless fails.empty? # or verbose?
112
+ # io.puts "\n\n-- Failures and Errors --\n\n"
113
+ # fails.uniq.each do |testrun|
114
+ # message = testrun.message.tabto(0).strip
115
+ # message = Colorize.red(message)
116
+ # # backtrace ?
117
+ # #message += clean_backtrace(testrun.exception.backtrace).join("\n")
118
+ # io.puts(message+"\n\n")
119
+ # end
120
+ # io.puts
121
+ # end
122
+ ##end
85
123
  end
86
124
 
87
125
  private
@@ -40,8 +40,12 @@ module Turn
40
40
 
41
41
  # Override #_run_suite to setup Turn.
42
42
  def _run_suites suites, type
43
+ # Someone want to explain to me why these are fucking here?
44
+ suites = suites - [MiniTest::Spec, Test::Unit::TestCase]
45
+
43
46
  @turn_suite = Turn::TestSuite.new(@turn_config.suite_name)
44
- @turn_suite.size = ::MiniTest::Unit::TestCase.test_suites.size
47
+ @turn_suite.size = suites.size #::MiniTest::Unit::TestCase.test_suites.size
48
+ @turn_suite.seed = ::MiniTest::Unit.runner.options[:seed]
45
49
 
46
50
  turn_reporter.start_suite(@turn_suite)
47
51
 
@@ -101,8 +105,8 @@ module Turn
101
105
  def puke(klass, meth, err)
102
106
  case err
103
107
  when MiniTest::Skip
104
- @turn_test.skip!
105
- turn_reporter.skip #(e)
108
+ @turn_test.skip!(err)
109
+ turn_reporter.skip(err)
106
110
  when MiniTest::Assertion
107
111
  @turn_test.fail!(err)
108
112
  turn_reporter.fail(err)
@@ -113,35 +117,6 @@ module Turn
113
117
  super(klass, meth, err)
114
118
  end
115
119
 
116
- # To maintain compatibility with old versions of MiniTest.
117
- #
118
- # Hey, Ryan Davis wrote this code!
119
- if ::MiniTest::Unit::VERSION < '2.0'
120
- #attr_accessor :options
121
-
122
- #
123
- def run(args=[])
124
- suites = ::MiniTest::Unit::TestCase.test_suites
125
- return if suites.empty?
126
-
127
- @test_count, @assertion_count = 0, 0
128
- sync = @@out.respond_to? :"sync=" # stupid emacs
129
- old_sync, @@out.sync = @@out.sync, true if sync
130
-
131
- results = _run_suites suites, :test #type
132
-
133
- @test_count = results.inject(0) { |sum, (tc, _)| sum + tc }
134
- @assertion_count = results.inject(0) { |sum, (_, ac)| sum + ac }
135
-
136
- @@out.sync = old_sync if sync
137
-
138
- return failures + errors if @test_count > 0 # or return nil...
139
- rescue Interrupt
140
- abort 'Interrupted'
141
- end
142
-
143
- end
144
-
145
120
  end
146
121
 
147
122
  end