turn 0.7.0 → 0.8.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.
@@ -1,5 +1,7 @@
1
1
  module Turn
2
2
  require 'turn/colorize'
3
+ require 'yaml'
4
+ require 'open3'
3
5
 
4
6
  # = IsoRunner
5
7
  #
@@ -24,6 +26,7 @@ module Turn
24
26
  @loadpath = controller.loadpath
25
27
  @requires = controller.requires
26
28
  @live = controller.live?
29
+ @minitest = controller.framework == :minitest
27
30
  end
28
31
 
29
32
  public
@@ -34,7 +37,8 @@ module Turn
34
37
  def start
35
38
  suite = TestSuite.new
36
39
  testruns = @controller.files.collect do |file|
37
- suite.new_case(file)
40
+ name = file.sub(Dir.pwd+'/','')
41
+ suite.new_case(name, file)
38
42
  end
39
43
  test_loop_runner(suite)
40
44
  end
@@ -52,20 +56,37 @@ module Turn
52
56
  suite.each_with_index do |kase, index|
53
57
  reporter.start_case(kase)
54
58
 
59
+ turn_path = File.expand_path(File.dirname(__FILE__) + '/../bin.rb')
60
+
61
+ files = kase.files.map{ |f| f.sub(Dir.pwd+'/', '') }
62
+
55
63
  # FRACKING GENIUS RIGHT HERE !!!!!!!!!!!!
56
64
  cmd = []
57
- cmd << %[turn]
58
- cmd << %[--marshal]
59
- cmd << %[--loadpath="#{@loadpath.join(';')}"] unless @loadpath.empty?
60
- cmd << %[--requires="#{@requires.join(';')}"] unless @requires.empty?
61
- cmd << %[--live] if @live
62
- cmd << %[#{kase.files.join(' ')}]
65
+ cmd << "ruby"
66
+ cmd << "-I#{@loadpath.join(':')}" unless @loadpath.empty?
67
+ cmd << "-r#{@requires.join(':')}" unless @requires.empty?
68
+ cmd << "--"
69
+ cmd << turn_path
70
+ cmd << "--marshal"
71
+ cmd << %[--loadpath="#{@loadpath.join(':')}"] unless @loadpath.empty?
72
+ cmd << %[--requires="#{@requires.join(':')}"] unless @requires.empty?
73
+ cmd << "--live" if @live
74
+ cmd << "--minitest" if @minitest
75
+ cmd << files.join(' ')
63
76
  cmd = cmd.join(' ')
64
- result = `#{cmd}`
77
+
78
+ #out = `#{cmd}`
79
+
80
+ out, err = nil, nil
81
+ Open3.popen3(cmd) do |stdin, stdout, stderr|
82
+ stdin.close
83
+ out = stdout.read.chomp
84
+ err = stderr.read.chomp
85
+ end
65
86
 
66
87
  files = kase.files
67
88
 
68
- head, yaml = *result.split('---')
89
+ head, yaml = *out.split('---')
69
90
  sub_suite = YAML.load(yaml)
70
91
 
71
92
  # TODO: How to handle pairs?
@@ -95,8 +116,14 @@ module Turn
95
116
 
96
117
  reporter.finish_suite(suite)
97
118
 
98
- # shutdown test/unit auto runner if test/unit is loaded.
99
- ::Test::Unit.run=true rescue nil
119
+ # shutdown auto runner
120
+ if @minitest
121
+
122
+ else
123
+ ::Test::Unit.run=true rescue nil
124
+ end
125
+
126
+ suite
100
127
  end
101
128
 
102
129
  #
@@ -0,0 +1,189 @@
1
+ #
2
+
3
+ # Becuase of some wierdness in MiniTest
4
+ debug, $DEBUG = $DEBUG, false
5
+ require 'minitest/unit'
6
+ $DEBUG = debug
7
+
8
+ Test = MiniTest
9
+
10
+ module Turn
11
+
12
+ # = MiniTest TestRunner
13
+ #
14
+ class MiniRunner < ::MiniTest::Unit
15
+
16
+ #
17
+ def initialize(controller)
18
+
19
+ controller.loadpath.each{ |path| $: << path } unless controller.live?
20
+ controller.requires.each{ |path| require(path) }
21
+
22
+ [controller.files].flatten.each{ |path| require(path) }
23
+
24
+ files = [controller.files].flatten
25
+ files.each{ |path| require(path) }
26
+
27
+ # TODO: Better name ?
28
+ @turn_suite_name = files.map{ |path| File.dirname(path).sub(Dir.pwd+'/','') }.uniq.join(',')
29
+
30
+ #sub_suites = []
31
+ #ObjectSpace.each_object(Class) do |klass|
32
+ # if(Test::Unit::TestCase > klass)
33
+ # sub_suites << klass.suite
34
+ # end
35
+ #end
36
+ #suite = Test::Unit::TestSuite.new('') # FIXME: Name?
37
+ #sub_suites.sort_by{|s|s.name}.each{|s| suite << s}
38
+
39
+ #suite.tests.each do |c|
40
+ # pattern = controller.pattern
41
+ # c.tests.reject! { |t| pattern !~ t.method_name }
42
+ #end
43
+
44
+ @turn_logger = controller.reporter
45
+
46
+ super()
47
+ end
48
+
49
+ #
50
+ def start(args=[])
51
+ run(args)
52
+ return @turn_suite
53
+ end
54
+
55
+ #
56
+ def run(args = [])
57
+ @verbose = true
58
+
59
+ filter = if args.first =~ /^(-n|--name)$/ then
60
+ args.shift
61
+ arg = args.shift
62
+ arg =~ /\/(.*)\// ? Regexp.new($1) : arg
63
+ else
64
+ /./ # anything - ^test_ already filtered by #tests
65
+ end
66
+
67
+ #@@out.puts "Loaded suite #{$0.sub(/\.rb$/, '')}\nStarted"
68
+
69
+ start = Time.now
70
+
71
+ run_test_suites(filter)
72
+
73
+ return failures + errors if @test_count > 0 # or return nil...
74
+ end
75
+
76
+ #
77
+ def run_test_suites(filter = /./)
78
+ @test_count, @assertion_count = 0, 0
79
+ old_sync, @@out.sync = @@out.sync, true if @@out.respond_to? :sync=
80
+
81
+ @turn_suite = Turn::TestSuite.new(@turn_suite_name)
82
+ @turn_suite.size = ::MiniTest::Unit::TestCase.test_suites.size
83
+ @turn_logger.start_suite(@turn_suite)
84
+
85
+ ::MiniTest::Unit::TestCase.test_suites.each do |kase|
86
+
87
+ test_cases = kase.test_methods.grep(filter)
88
+
89
+ @turn_case = @turn_suite.new_case(kase.name)
90
+
91
+ turn_cases = test_cases.map do |test|
92
+ @turn_case.new_test(test)
93
+ end
94
+
95
+ @turn_logger.start_case(@turn_case)
96
+
97
+ turn_cases.each do |test|
98
+ #methname, tcase = name.scan(%r/^([^\(]+)\(([^\)]+)\)/o).flatten!
99
+ @turn_test = test #@turn_case.new_test(test)
100
+ @turn_logger.start_test(@turn_test)
101
+
102
+ inst = kase.new(test.name)
103
+ inst._assertions = 0
104
+
105
+ result = inst.run(self)
106
+ report = @report.last
107
+
108
+ case result
109
+ when :pass
110
+ @turn_logger.pass
111
+ when :error
112
+ #trace = ::MiniTest::filter_backtrace(report[:exception].backtrace).first
113
+ @turn_test.error!(report)
114
+ @turn_logger.error(report)
115
+ when :fail
116
+ #trace = ::MiniTest::filter_backtrace(report[:exception].backtrace).first
117
+ @turn_test.fail!(report)
118
+ @turn_logger.fail(report)
119
+ when :skip
120
+ @turn_test.skip! #(report)
121
+ @turn_logger.skip #(report)
122
+ end
123
+
124
+ @turn_logger.finish_test(@turn_test)
125
+
126
+ @test_count += 1
127
+ @assertion_count += inst._assertions
128
+ end
129
+ @turn_case.count_assertions = @assertion_count # for lack of a better appraoch
130
+ @turn_logger.finish_case(@turn_case)
131
+ end
132
+ @turn_logger.finish_suite(@turn_suite)
133
+ @@out.sync = old_sync if @@out.respond_to? :sync=
134
+ [@test_count, @assertion_count]
135
+ end
136
+
137
+ # Overwrite #puke method so that is stores a hash
138
+ # with :message and :exception keys.
139
+ def puke(klass, meth, e)
140
+ result = nil
141
+ msg = case e
142
+ when ::MiniTest::Skip
143
+ @skips += 1
144
+ result = :skip
145
+ e.message
146
+ when ::MiniTest::Assertion
147
+ @failures += 1
148
+ result = :fail
149
+ e.message
150
+ else
151
+ @errors += 1
152
+ result = :error
153
+ "#{e.class}: #{e.message}\n"
154
+ end
155
+
156
+ @report << e #{:message => msg, :exception => e}
157
+ result
158
+ end
159
+
160
+ end
161
+
162
+ end
163
+
164
+ class ::MiniTest::Unit::TestCase
165
+ old_verbose, $VERBOSE = $VERBOSE, false
166
+ # Overwrite #run method so that is uses symbols
167
+ # as return values rather than characters.
168
+ def run(runner)
169
+ result = :pass
170
+ begin
171
+ @passed = nil
172
+ self.setup
173
+ self.__send__(self.__name__.to_s)
174
+ @passed = true
175
+ rescue Exception => e
176
+ @passed = false
177
+ result = runner.puke(self.class, self.__name__.to_s, e)
178
+ ensure
179
+ begin
180
+ self.teardown
181
+ rescue Exception => e
182
+ result = runner.puke(self.class, self.__name__.to_s, e)
183
+ end
184
+ end
185
+ result
186
+ end
187
+ $VERBOSE = old_verbose
188
+ end
189
+
@@ -8,13 +8,14 @@ require 'test/unit/ui/console/testrunner'
8
8
  #require 'turn/reporters/outline_reporter.rb'
9
9
  #require 'turn/reporters/progress_reporter.rb'
10
10
 
11
+ class Test::Unit::Failure
12
+ alias_method :backtrace, :location
13
+ end
14
+
11
15
  module Turn
12
16
 
13
17
  # = TestUnit TestRunner
14
18
  #
15
- #--
16
- # TODO: Add minitest runner.
17
- #++
18
19
  class TestRunner < ::Test::Unit::UI::Console::TestRunner
19
20
 
20
21
  def initialize(controller)
@@ -23,7 +24,11 @@ module Turn
23
24
  controller.loadpath.each{ |path| $: << path } unless controller.live?
24
25
  controller.requires.each{ |path| require(path) }
25
26
 
26
- [controller.files].flatten.each{ |path| require(path) }
27
+ files = [controller.files].flatten
28
+ files.each{ |path| require(path) }
29
+
30
+ # TODO: Better name ?
31
+ name = files.map{ |path| File.dirname(path).sub(Dir.pwd+'/','') }.uniq.join(',')
27
32
 
28
33
  sub_suites = []
29
34
  ObjectSpace.each_object(Class) do |klass|
@@ -31,7 +36,8 @@ module Turn
31
36
  sub_suites << klass.suite
32
37
  end
33
38
  end
34
- suite = Test::Unit::TestSuite.new('') # FIXME: Name?
39
+ suite = Test::Unit::TestSuite.new(name)
40
+
35
41
  sub_suites.sort_by{|s|s.name}.each{|s| suite << s}
36
42
 
37
43
  suite.tests.each do |c|
@@ -61,6 +67,8 @@ module Turn
61
67
  @t_result = nil
62
68
  @t_fault = nil
63
69
 
70
+ @not_first_case = nil
71
+
64
72
  @t_previous_run_count = 0
65
73
  @t_previous_error_count = 0
66
74
  @t_previous_failure_count = 0
@@ -68,7 +76,7 @@ module Turn
68
76
  end
69
77
 
70
78
  def t_started(result)
71
- @t_suite = Turn::TestSuite.new #@suite
79
+ @t_suite = Turn::TestSuite.new(@suite.name)
72
80
  @t_suite.size = @suite.size
73
81
  @t_result = result
74
82
  @t_reporter.start_suite(@t_suite)
@@ -92,16 +100,16 @@ module Turn
92
100
  def t_fault(fault)
93
101
  case fault
94
102
  when ::Test::Unit::Error
95
- msg = ""
96
- msg << fault.to_s.split("\n")[2..-1].join("\n")
97
- @t_test.error!(msg)
98
- @t_reporter.error(msg)
103
+ #msg = ""
104
+ #msg << fault.to_s.split("\n")[2..-1].join("\n")
105
+ @t_test.error!(fault.exception)
106
+ @t_reporter.error(fault.exception)
99
107
  when ::Test::Unit::Failure
100
- msg = ""
101
- msg << fault.location[0] << "\n"
102
- msg << fault.message #.gsub("\n","\n")
103
- @t_test.fail!(msg)
104
- @t_reporter.fail(msg)
108
+ #msg = ""
109
+ #msg << fault.location[0] << "\n"
110
+ #msg << fault.message #.gsub("\n","\n")
111
+ @t_test.fail!(fault)
112
+ @t_reporter.fail(fault)
105
113
  end
106
114
  end
107
115
 
@@ -118,7 +126,6 @@ module Turn
118
126
  #f = @t_result.failure_count - @t_previous_failure_count
119
127
  #e = @t_result.error_count - @t_previous_error_count
120
128
  a = @t_result.assertion_count - @t_previous_assertion_count
121
-
122
129
  #@t_case.counts(t,a,f,e)
123
130
 
124
131
  @t_case.count_assertions = a
data/lib/turn.rb CHANGED
@@ -1,102 +1,19 @@
1
- require 'test/unit/ui/console/testrunner'
2
- require 'turn/colorize'
3
-
4
- module ::Test::Unit
5
- module UI
6
- module Console
7
- class TestRunner
8
- include Turn::Colorize
9
-
10
- # 1.x of test/unut used @io, where as 2.x uses @output.
11
- def turn_out
12
- @turn_out ||= (@io || @output)
13
- end
14
-
15
- alias :t_attach_to_mediator :attach_to_mediator
16
- def attach_to_mediator
17
- @mediator.add_listener(TestRunnerMediator::STARTED, &method(:t_started))
18
- @mediator.add_listener(TestRunnerMediator::FINISHED, &method(:t_finished))
19
- @mediator.add_listener(TestCase::STARTED, &method(:t_test_started))
20
- @mediator.add_listener(TestCase::FINISHED, &method(:t_test_finished))
21
- @mediator.add_listener(TestResult::FAULT, &method(:t_fault))
22
- turn_out.sync = true
23
- @t_cur_file, @t_fault = nil
24
- end
25
-
26
- def t_started( result )
27
- @t_result = result
28
- end
29
-
30
- def t_finished( elapsed_time )
31
- failure = @t_result.failure_count
32
- error = @t_result.error_count
33
- total = @t_result.run_count
34
- pass = total - failure - error
35
-
36
- bar = '=' * 78
37
- if COLORIZE
38
- bar = if pass == total then ::ANSI::Code.green bar
39
- else ::ANSI::Code.red bar end
40
- end
41
-
42
- turn_out.puts bar
43
- turn_out.puts " pass: %d, fail: %d, error: %d" % [pass, failure, error]
44
- turn_out.puts " total: %d tests with %d assertions in #{elapsed_time} seconds" % [total, @t_result.assertion_count]
45
- turn_out.puts bar
46
- end
47
-
48
- def t_test_started( name )
49
- method, file = name.scan(%r/^([^\(]+)\(([^\)]+)\)/o).flatten!
50
- if @t_cur_file != file
51
- @t_cur_file = file
52
- file = COLORIZE ? ::ANSI::Code.yellow(file) : file
53
- turn_out.puts file
54
- end
55
- turn_out.print " %-69s" % method
56
- end
57
-
58
- def t_test_finished( name )
59
- turn_out.puts " #{PASS}" unless @t_fault
60
- @t_fault = false
61
- end
62
-
63
- def t_fault( fault )
64
- @t_fault = true
65
- msg = "\t"
66
-
67
- case fault
68
- when ::Test::Unit::Error
69
- turn_out.puts ERROR
70
- msg << fault.to_s.split("\n")[2..-1].join("\n\t")
71
- when ::Test::Unit::Failure
72
- turn_out.puts " #{FAIL}"
73
- msg << fault.location[0].to_s << "\n\t"
74
- msg << fault.message.gsub("\n","\n\t")
75
- end
76
-
77
- msg = ::ANSI::Code.magenta msg if COLORIZE
78
- turn_out.puts msg
79
- end
80
-
81
- private
82
- def setup_mediator
83
- @mediator = create_mediator(@suite)
84
- suite_name = @suite.to_s
85
- if ( @suite.kind_of?(Module) )
86
- suite_name = @suite.name
87
- end
88
- msg = rails? ? "\n" : "Loaded suite #{suite_name}" #always same in rails so scrap it
89
- output(msg)
90
- end
91
-
92
- def rails?
93
- $:.to_s.include? "rails"
94
- end
95
-
96
-
1
+ 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'
97
6
  end
98
7
  end
99
- end
8
+
9
+ unless defined?(Turn::Command)
10
+ if Turn.minitest?
11
+ require 'turn/autorun/minitest'
12
+ MiniTest::Unit.autorun
13
+ else
14
+ require 'turn/autorun/testunit'
15
+ end
16
+ #autoload :Test, 'turn/autorun/testunit'
17
+ #autoload :MiniTest, 'turn/autorun/minitest'
100
18
  end
101
19
 
102
- # EOF
data/test/helper.rb ADDED
@@ -0,0 +1,97 @@
1
+ require 'fileutils'
2
+
3
+ if RUBY_VERSION < "1.9"
4
+ require 'test/unit'
5
+ else
6
+ require 'minitest/unit'
7
+ end
8
+
9
+ #
10
+ def turn(*args)
11
+ `ruby -Ilib bin/turn -Ilib #{args.join(' ')} 2>&1`
12
+ end
13
+
14
+ #
15
+ def turn2(*args)
16
+ `ruby -Ilib bin/turn -Ilib #{args.join(' ')}`
17
+ end
18
+
19
+ #
20
+ def setup_test(framework, required=false, name=nil)
21
+ text = ''
22
+ text << "require '#{required}'\n" if required
23
+ text << <<-HERE
24
+ class TestTest < #{framework}::Unit::TestCase
25
+ #{standard_test_body}
26
+ end
27
+ HERE
28
+ #name = framwwork.downcase
29
+ #name = name + '_required' if requires
30
+ save_test(text, name)
31
+ end
32
+
33
+ #
34
+ def save_test(text, name=nil)
35
+ file = File.join('tmp', name || 'test.rb')
36
+ FileUtils.mkdir_p('tmp')
37
+ File.open(file, 'w'){ |f| f << text }
38
+ return file
39
+ end
40
+
41
+ #
42
+ def standard_test_body
43
+ <<-HERE
44
+ def test_pass
45
+ assert_equal(1,1)
46
+ end
47
+ HERE
48
+ end
49
+
50
+ #
51
+ def guanlent_test_body
52
+ <<-HERE
53
+ def test_pass
54
+ assert_equal(1,1)
55
+ end
56
+
57
+ def test_fail
58
+ assert_equal(1,2)
59
+ end
60
+
61
+ def test_error
62
+ raise
63
+ end
64
+ HERE
65
+ end
66
+
67
+ #
68
+ def setup_outline_test
69
+ text = <<-HERE
70
+ class OutlineTest < Test::Unit::TestCase
71
+ def test_sample_pass
72
+ puts "You should not see me"
73
+ assert_equal(1,1)
74
+ end
75
+ def test_sample_fail
76
+ puts "You should see me"
77
+ assert_equal(1,2)
78
+ end
79
+ end
80
+ HERE
81
+ save_test(text, 'outline_test.rb')
82
+ end
83
+
84
+ #
85
+ def setup_minitest_autorun
86
+ text = <<-HERE
87
+ require 'minitest/unit'
88
+ MiniTest::Unit.autorun
89
+ class TestTest < MiniTest::Unit::TestCase
90
+ def test_sample_pass
91
+ assert_equal(1,1)
92
+ end
93
+ end
94
+ HERE
95
+ save_test(text, 'minitest_autorun_test.rb')
96
+ end
97
+
data/test/runner ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env sh
2
+ ruby -Ilib bin/turn -Ilib test/*.rb