openlogic-turn 0.8.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
|