openlogic-turn 0.8.2
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.
- data/History.txt +54 -0
- data/README.txt +116 -0
- data/Rakefile +40 -0
- data/Release.txt +33 -0
- data/Version.txt +1 -0
- data/bin/turn +4 -0
- data/demo/test_autorun_minitest.rb +26 -0
- data/demo/test_autorun_testunit.rb +26 -0
- data/demo/test_sample.rb +35 -0
- data/demo/test_sample2.rb +33 -0
- data/lib/turn.rb +19 -0
- data/lib/turn/autorun/minitest.rb +155 -0
- data/lib/turn/autorun/testunit.rb +116 -0
- data/lib/turn/bin.rb +4 -0
- data/lib/turn/colorize.rb +65 -0
- data/lib/turn/command.rb +210 -0
- data/lib/turn/components/case.rb +104 -0
- data/lib/turn/components/method.rb +42 -0
- data/lib/turn/components/suite.rb +85 -0
- data/lib/turn/controller.rb +204 -0
- data/lib/turn/core_ext.rb +31 -0
- data/lib/turn/reporter.rb +69 -0
- data/lib/turn/reporters/cue_reporter.rb +167 -0
- data/lib/turn/reporters/dot_reporter.rb +93 -0
- data/lib/turn/reporters/marshal_reporter.rb +17 -0
- data/lib/turn/reporters/outline_reporter.rb +144 -0
- data/lib/turn/reporters/pretty_reporter.rb +184 -0
- data/lib/turn/reporters/progress_reporter.rb +116 -0
- data/lib/turn/runners/crossrunner.rb +42 -0
- data/lib/turn/runners/isorunner.rb +167 -0
- data/lib/turn/runners/loadrunner.rb +48 -0
- data/lib/turn/runners/minirunner.rb +189 -0
- data/lib/turn/runners/solorunner.rb +8 -0
- data/lib/turn/runners/testrunner.rb +166 -0
- data/test/helper.rb +97 -0
- data/test/runner +2 -0
- data/test/test_framework.rb +131 -0
- data/test/test_reporters.rb +44 -0
- data/test/test_runners.rb +45 -0
- metadata +138 -0
@@ -0,0 +1,166 @@
|
|
1
|
+
#require 'test/unit'; Test::Unit.run = false
|
2
|
+
require 'test/unit/ui/console/testrunner'
|
3
|
+
|
4
|
+
#require 'turn/colorize'
|
5
|
+
#require 'turn/components/suite.rb'
|
6
|
+
#require 'turn/components/case.rb'
|
7
|
+
#require 'turn/components/method.rb'
|
8
|
+
#require 'turn/reporters/outline_reporter.rb'
|
9
|
+
#require 'turn/reporters/progress_reporter.rb'
|
10
|
+
|
11
|
+
class Test::Unit::Failure
|
12
|
+
alias_method :backtrace, :location
|
13
|
+
end
|
14
|
+
|
15
|
+
module Turn
|
16
|
+
|
17
|
+
# = TestUnit TestRunner
|
18
|
+
#
|
19
|
+
class TestRunner < ::Test::Unit::UI::Console::TestRunner
|
20
|
+
|
21
|
+
def initialize(controller)
|
22
|
+
output_level = 2 # 2-NORMAL 3-VERBOSE
|
23
|
+
|
24
|
+
controller.loadpath.each{ |path| $: << path } unless controller.live?
|
25
|
+
controller.requires.each{ |path| require(path) }
|
26
|
+
|
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(',')
|
32
|
+
|
33
|
+
sub_suites = []
|
34
|
+
ObjectSpace.each_object(Class) do |klass|
|
35
|
+
if(Test::Unit::TestCase > klass)
|
36
|
+
sub_suites << klass.suite
|
37
|
+
end
|
38
|
+
end
|
39
|
+
suite = Test::Unit::TestSuite.new(name)
|
40
|
+
|
41
|
+
sub_suites.sort_by{|s|s.name}.each{|s| suite << s}
|
42
|
+
|
43
|
+
suite.tests.each do |c|
|
44
|
+
pattern = controller.pattern
|
45
|
+
c.tests.reject! { |t| pattern !~ t.method_name }
|
46
|
+
end
|
47
|
+
|
48
|
+
@t_reporter = controller.reporter
|
49
|
+
|
50
|
+
super(suite, output_level, $stdout)
|
51
|
+
end
|
52
|
+
|
53
|
+
# Is this needed?
|
54
|
+
alias :t_attach_to_mediator :attach_to_mediator
|
55
|
+
|
56
|
+
def attach_to_mediator
|
57
|
+
@mediator.add_listener(::Test::Unit::UI::TestRunnerMediator::STARTED, &method(:t_started))
|
58
|
+
@mediator.add_listener(::Test::Unit::UI::TestRunnerMediator::FINISHED, &method(:t_finished))
|
59
|
+
@mediator.add_listener(::Test::Unit::TestSuite::STARTED, &method(:t_case_started))
|
60
|
+
@mediator.add_listener(::Test::Unit::TestSuite::FINISHED, &method(:t_case_finished))
|
61
|
+
@mediator.add_listener(::Test::Unit::TestCase::STARTED, &method(:t_test_started))
|
62
|
+
@mediator.add_listener(::Test::Unit::TestCase::FINISHED, &method(:t_test_finished))
|
63
|
+
@mediator.add_listener(::Test::Unit::TestResult::FAULT, &method(:t_fault))
|
64
|
+
|
65
|
+
@io.sync = true
|
66
|
+
|
67
|
+
@t_result = nil
|
68
|
+
@t_fault = nil
|
69
|
+
|
70
|
+
@not_first_case = nil
|
71
|
+
|
72
|
+
@t_previous_run_count = 0
|
73
|
+
@t_previous_error_count = 0
|
74
|
+
@t_previous_failure_count = 0
|
75
|
+
@t_previous_assertion_count = 0
|
76
|
+
end
|
77
|
+
|
78
|
+
def t_started(result)
|
79
|
+
@t_suite = Turn::TestSuite.new(@suite.name)
|
80
|
+
@t_suite.size = @suite.size
|
81
|
+
@t_result = result
|
82
|
+
@t_reporter.start_suite(@t_suite)
|
83
|
+
end
|
84
|
+
|
85
|
+
def t_case_started(name)
|
86
|
+
# Err.. why is testunit running this on the suite?
|
87
|
+
(@not_first_case = true; return) unless @not_first_case
|
88
|
+
@t_case = @t_suite.new_case(name)
|
89
|
+
@t_reporter.start_case(@t_case)
|
90
|
+
end
|
91
|
+
|
92
|
+
def t_test_started(name)
|
93
|
+
methname, tcase = name.scan(%r/^([^\(]+)\(([^\)]+)\)/o).flatten!
|
94
|
+
@t_test = @t_case.new_test(methname)
|
95
|
+
#@t_test.file = tcase
|
96
|
+
#@t_test.name = method
|
97
|
+
@t_reporter.start_test(@t_test)
|
98
|
+
end
|
99
|
+
|
100
|
+
def t_fault(fault)
|
101
|
+
case fault
|
102
|
+
when ::Test::Unit::Error
|
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)
|
107
|
+
when ::Test::Unit::Failure
|
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)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def t_test_finished(name)
|
117
|
+
@t_reporter.pass if @t_test.pass?
|
118
|
+
@t_reporter.finish_test(@t_test)
|
119
|
+
end
|
120
|
+
|
121
|
+
def t_case_finished(name)
|
122
|
+
# Err.. why is testunit running this on the suite?
|
123
|
+
return if name=='' # FIXME skip suite call
|
124
|
+
|
125
|
+
#t = @t_result.run_count - @t_previous_run_count
|
126
|
+
#f = @t_result.failure_count - @t_previous_failure_count
|
127
|
+
#e = @t_result.error_count - @t_previous_error_count
|
128
|
+
a = @t_result.assertion_count - @t_previous_assertion_count
|
129
|
+
#@t_case.counts(t,a,f,e)
|
130
|
+
|
131
|
+
@t_case.count_assertions = a
|
132
|
+
|
133
|
+
#@t_previous_run_count = @t_result.run_count.to_i
|
134
|
+
#@t_previous_failure_count = @t_result.failure_count.to_i
|
135
|
+
#@t_previous_error_count = @t_result.error_count.to_i
|
136
|
+
@t_previous_assertion_count = @t_result.assertion_count.to_i
|
137
|
+
|
138
|
+
@t_reporter.finish_case(@t_case)
|
139
|
+
end
|
140
|
+
|
141
|
+
def t_finished(elapsed_time)
|
142
|
+
#@t_suite.count_tests = @t_result.run_count
|
143
|
+
#@t_suite.count_failures = @t_result.failure_count
|
144
|
+
#@t_suite.count_errors = @t_result.error_count
|
145
|
+
#@t_suite.count_passes = @t_result.run_count - @t_result.failure_count - @t_result.error_count
|
146
|
+
@t_suite.count_assertions = @t_result.assertion_count
|
147
|
+
|
148
|
+
@t_reporter.finish_suite(@t_suite)
|
149
|
+
end
|
150
|
+
|
151
|
+
# This is copied verbatim from test/unit/ui/console/testrunner.rb.
|
152
|
+
# It is here for one simple reason: to supress testunits output of
|
153
|
+
# "Loaded Suite".
|
154
|
+
def setup_mediator
|
155
|
+
@mediator = create_mediator(@suite)
|
156
|
+
suite_name = @suite.to_s
|
157
|
+
if ( @suite.kind_of?(Module) )
|
158
|
+
suite_name = @suite.name
|
159
|
+
end
|
160
|
+
#output("Loaded suite #{suite_name}")
|
161
|
+
end
|
162
|
+
|
163
|
+
end#class TestRunner
|
164
|
+
|
165
|
+
end#module Turn
|
166
|
+
|
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,131 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/helper.rb'
|
2
|
+
|
3
|
+
# Test on Ruby 1.9+
|
4
|
+
if RUBY_VERSION >= '1.9'
|
5
|
+
|
6
|
+
class TestRuby19Framework < MiniTest::Unit::TestCase
|
7
|
+
|
8
|
+
def test_ruby19_minitest
|
9
|
+
setup_test('MiniTest')
|
10
|
+
result = turn 'tmp/test.rb'
|
11
|
+
assert result.index('PASS')
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_ruby19_minitest_force
|
15
|
+
setup_test('MiniTest')
|
16
|
+
result = turn '--minitest tmp/test.rb'
|
17
|
+
assert result.index('PASS')
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_ruby19_minitest_required
|
21
|
+
setup_test('MiniTest', 'minitest/unit')
|
22
|
+
result = turn 'tmp/test.rb'
|
23
|
+
assert result.index('PASS')
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_ruby19_minitest_required_force
|
27
|
+
setup_test('MiniTest', 'minitest/unit')
|
28
|
+
result = turn '--minitest tmp/test.rb'
|
29
|
+
assert result.index('PASS')
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_ruby19_minitest_mocking
|
33
|
+
setup_test('Test')
|
34
|
+
result = turn 'tmp/test.rb'
|
35
|
+
assert result.index('PASS')
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_ruby19_minitest_mocking_force
|
39
|
+
setup_test('Test')
|
40
|
+
result = turn '--minitest tmp/test.rb'
|
41
|
+
assert result.index('PASS')
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_ruby19_minitest_mocking_required
|
45
|
+
setup_test('Test', 'minitest/unit')
|
46
|
+
result = turn 'tmp/test.rb'
|
47
|
+
assert result.index('PASS')
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_ruby19_minitest_mocking_required_force
|
51
|
+
setup_test('Test', 'minitest/unit')
|
52
|
+
result = turn '--minitest tmp/test.rb'
|
53
|
+
assert result.index('PASS')
|
54
|
+
end
|
55
|
+
|
56
|
+
# Ruby 1.9 users must remove ++require 'test/unit'++ from their tests.
|
57
|
+
#def test_ruby19_testunit_required
|
58
|
+
# setup_test('Test', 'test/unit')
|
59
|
+
# result = turn 'turn tmp/test.rb'
|
60
|
+
# assert result.index('PASS')
|
61
|
+
#end
|
62
|
+
|
63
|
+
# Turn does not support Test::Unit 2.0+.
|
64
|
+
#def test_ruby19_testunit_force
|
65
|
+
# setup_test('Test')
|
66
|
+
# result = turn '--testunit tmp/test.rb'
|
67
|
+
# assert result.index('PASS')
|
68
|
+
#end
|
69
|
+
|
70
|
+
# Turn does not support Test::Unit 2.0+.
|
71
|
+
#def test_ruby19_testunit_required_force
|
72
|
+
# setup_test('Test', 'test/unit')
|
73
|
+
# result = turn '--testunit tmp/test.rb'
|
74
|
+
# assert result.index('PASS')
|
75
|
+
#end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
else
|
80
|
+
|
81
|
+
class TestRuby18Framework < Test::Unit::TestCase
|
82
|
+
|
83
|
+
def test_ruby18_testunit
|
84
|
+
setup_test('Test')
|
85
|
+
result = turn 'tmp/test.rb'
|
86
|
+
assert result.index('PASS')
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_ruby18_testunit_required
|
90
|
+
setup_test('Test', 'test/unit')
|
91
|
+
result = turn 'tmp/test.rb'
|
92
|
+
assert result.index('PASS')
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_ruby18_minitest
|
96
|
+
setup_test('MiniTest')
|
97
|
+
result = turn '--minitest tmp/test.rb'
|
98
|
+
assert result.index('PASS')
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_ruby18_minitest_mocking_testunit
|
102
|
+
setup_test('Test')
|
103
|
+
result = turn '--minitest tmp/test.rb'
|
104
|
+
assert result.index('PASS')
|
105
|
+
end
|
106
|
+
|
107
|
+
# You can't use minitest and have ++require 'test/unit'++ in your tests.
|
108
|
+
#def test_ruby18_minitest_mocking_testunit_required
|
109
|
+
# setup_test('Test', 'test/unit')
|
110
|
+
# result = turn '--minitest tmp/test.rb'
|
111
|
+
# assert result.index('PASS')
|
112
|
+
#end
|
113
|
+
|
114
|
+
# If you want to use minitest with Ruby 1.8 you have to use force option.
|
115
|
+
# TODO: add turn configuration to automatically do this.
|
116
|
+
#def test_ruby18_minitest_required
|
117
|
+
# setup_test('MiniTest', 'minitest/unit')
|
118
|
+
# result = turn 'tmp/test.rb'
|
119
|
+
# assert result.index('PASS')
|
120
|
+
#end
|
121
|
+
|
122
|
+
def test_ruby18_minitest_required_force
|
123
|
+
setup_test('MiniTest', 'minitest/unit')
|
124
|
+
result = turn '--minitest tmp/test.rb'
|
125
|
+
assert result.index('PASS')
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
129
|
+
|
130
|
+
end
|
131
|
+
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/helper.rb'
|
2
|
+
|
3
|
+
class TestReporters < Test::Unit::TestCase
|
4
|
+
|
5
|
+
begin
|
6
|
+
require 'ansi'
|
7
|
+
def test_progress
|
8
|
+
file = setup_test('Test')
|
9
|
+
result = turn '--progress', file
|
10
|
+
assert(result.index('PASS'), result)
|
11
|
+
end
|
12
|
+
rescue LoadError
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_dotted
|
16
|
+
file = setup_test('Test')
|
17
|
+
result = turn '--dotted', file
|
18
|
+
assert result.index('0 failures')
|
19
|
+
assert result.index('0 errors')
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_marshal
|
23
|
+
file = setup_test('Test')
|
24
|
+
result = turn '--marshal', file
|
25
|
+
assert !result.index('error: true')
|
26
|
+
assert !result.index('fail: true')
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_outline
|
30
|
+
file = setup_outline_test
|
31
|
+
result = turn '--outline', file
|
32
|
+
assert result.index('You should see me')
|
33
|
+
assert !result.index('You should not see me')
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_pretty
|
37
|
+
file = setup_test('Test')
|
38
|
+
result = turn '--pretty', file
|
39
|
+
assert result.index('0 errors')
|
40
|
+
assert result.index('0 failures')
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|