TwP-turn 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt ADDED
@@ -0,0 +1,23 @@
1
+ == 0.5.1 / 2009-03-25
2
+ * fixed a "convert nil into String" error
3
+
4
+ == 0.4.0 / 2008-09-18
5
+ * add solo and cross runners
6
+ * move Colorize into separate file
7
+ * use ::ANSICode instead of ::Console::ANSICode
8
+
9
+ == 0.3.0 / 2007-12-11
10
+ * color highlighting now works (need facets-2.0 library)
11
+
12
+ == 0.2.0 / 2006-11-26
13
+ * add the "turn" executable
14
+ * fixed warnings
15
+
16
+ == 0.1.2 / 2006-11-13
17
+ * added some instructions for using the package
18
+
19
+ == 0.1.1 / 2006-11-10
20
+ * removed explicit dependency on the 'hoe' gem
21
+
22
+ == 0.1.0 / 2006-11-10
23
+ * initial release
data/README.txt ADDED
@@ -0,0 +1,117 @@
1
+ = TURN - Test::Unit Reporter (New)
2
+ by Tim Pease
3
+ http://codeforpeople.rubyforge.org/turn
4
+
5
+ == DESCRIPTION:
6
+
7
+ TURN is a new way to view Test::Unit results. With longer running tests, it
8
+ can be very frustrating to see a failure (....F...) and then have to wait till
9
+ all the tests finish before you can see what the exact failure was. TURN
10
+ displays each test on a separate line with failures being displayed
11
+ immediately instead of at the end of the tests.
12
+
13
+ If you have the 'facets' gem installed, then TURN output will be displayed in
14
+ wonderful technicolor (but only if your terminal supports ANSI color codes).
15
+ Well, the only colors are green and red, but that is still color.
16
+
17
+ == FEATURES:
18
+
19
+ General usage provides better test output. Here is some sample output:
20
+
21
+ TestMyClass
22
+ test_alt PASS
23
+ test_alt_eq PASS
24
+ test_bad FAIL
25
+ ./test/test_my_class.rb:64:in `test_bad'
26
+ <false> is not true.
27
+ test_foo PASS
28
+ test_foo_eq PASS
29
+ TestYourClass
30
+ test_method_a PASS
31
+ test_method_b PASS
32
+ test_method_c PASS
33
+ ============================================================================
34
+ pass: 7, fail: 1, error: 0
35
+ total: 15 tests with 42 assertions in 0.018 seconds
36
+ ============================================================================
37
+
38
+ Turn also provides solo and cross test modes when run from the *turn* commandline
39
+ application.
40
+
41
+ == SYNOPSIS:
42
+
43
+ If you have the 'facets' gem installed, then TURN output will be displayed in
44
+ wonderful technicolor (but only if your terminal supports ANSI color codes).
45
+ Well, the only colors are green and red, but that is still color.
46
+
47
+ === Command Line
48
+
49
+ You can use the *turn* executable in place of the *ruby* interpreter.
50
+
51
+ turn -Ilib test/test_all.rb
52
+
53
+ This will invoke the ruby interpreter and automatically require the turn
54
+ formatting library. All command line arguments are passed "as is" to the
55
+ ruby interpreter.
56
+
57
+ To use the solo runner.
58
+
59
+ turn --solo -Ilib test/
60
+
61
+ This will run all tests in the test/ directory in a separate process.
62
+ Likewise for the cross runner.
63
+
64
+ turn --cross -Ilib test/
65
+
66
+ This will run every pairing of tests in a separate process.
67
+
68
+ === Require
69
+
70
+ Simply require the TURN package from within your test suite.
71
+
72
+ require 'turn'
73
+
74
+ This will configure Test::Unit to use TURN formatting for displaying test
75
+ restuls. A better line to use, though, is the following:
76
+
77
+ begin; require 'turn'; rescue LoadError; end
78
+
79
+ When you distribute your code, the test suite can be run without requiring
80
+ the end user to install the TURN package.
81
+
82
+ For a Rails application, put the require line into the 'test/test_helper.rb'
83
+ scipt. Now your Rails tests will use TURN formatting.
84
+
85
+ == REQUIREMENTS:
86
+
87
+ * facets 2.0+
88
+
89
+ == INSTALL:
90
+
91
+ * sudo gem install turn
92
+
93
+ == LICENSE:
94
+
95
+ MIT License
96
+
97
+ Copyright (c) 2006-2008
98
+
99
+ Permission is hereby granted, free of charge, to any person obtaining
100
+ a copy of this software and associated documentation files (the
101
+ 'Software'), to deal in the Software without restriction, including
102
+ without limitation the rights to use, copy, modify, merge, publish,
103
+ distribute, sublicense, and/or sell copies of the Software, and to
104
+ permit persons to whom the Software is furnished to do so, subject to
105
+ the following conditions:
106
+
107
+ The above copyright notice and this permission notice shall be
108
+ included in all copies or substantial portions of the Software.
109
+
110
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
111
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
112
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
113
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
114
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
115
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
116
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
117
+
data/Rakefile ADDED
@@ -0,0 +1,32 @@
1
+
2
+ begin
3
+ require 'bones'
4
+ Bones.setup
5
+ rescue LoadError
6
+ begin
7
+ load 'tasks/setup.rb'
8
+ rescue LoadError
9
+ raise RuntimeError, '### please install the "bones" gem ###'
10
+ end
11
+ end
12
+
13
+ task :default => 'test'
14
+
15
+ PROJ.name = 'turn'
16
+ PROJ.summary = 'Test::Unit Reporter (New) -- new output format for Test::Unit'
17
+ PROJ.authors = 'Tim Pease'
18
+ PROJ.email = 'tim.pease@gmail.com'
19
+ PROJ.url = 'http://codeforpeople.rubyforge.org/turn'
20
+ PROJ.version = '0.5.1'
21
+ PROJ.ignore_file = '.gitignore'
22
+
23
+ PROJ.rubyforge.name = 'codeforpeople'
24
+
25
+ PROJ.rdoc.exclude << '^lib/'
26
+ PROJ.rdoc.remote_dir = PROJ.name
27
+
28
+ PROJ.ann.email[:server] = 'smtp.gmail.com'
29
+ PROJ.ann.email[:port] = 587
30
+ PROJ.ann.email[:from] = 'Tim Pease'
31
+
32
+ # EOF
data/Release.txt ADDED
@@ -0,0 +1,29 @@
1
+ = Turn 0.5
2
+
3
+ Turn has turned 0.5 with some signifficant new features.
4
+
5
+ While Turn still provides the exact same functionality for running
6
+ tests via ruby or testrb as previous versions. The turn commandline
7
+ utility has been completely rewritten with expanded capabilites.
8
+
9
+ The turn command now features three run modes:
10
+
11
+ * Solo runner for running each test file in a separate process.
12
+ * Cross runner for running test file pairs in separate processes.
13
+ * Normal runner, which of course runs all test in a single process.
14
+
15
+ It also support three report modes:
16
+
17
+ * Progress reporter which uses a progress bar.
18
+ * Minimal reporter which provides traditional "dot" progress.
19
+ * Outline reporter populaized by turn.
20
+
21
+ The is also a special Marshal Mode which dumps test results as YAML.
22
+ And the underlying API makes it easy create new reporters.
23
+
24
+ To get a quick rundown on how to use the new commandline:
25
+
26
+ $ turn --help
27
+
28
+ Enjoy!
29
+
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ turn 0.5.1 stable (2009-03-25)
data/bin/turn ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/ruby
2
+
3
+ load 'turn/command.rb'
4
+
data/lib/turn.rb ADDED
@@ -0,0 +1,80 @@
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
+ alias :t_attach_to_mediator :attach_to_mediator
11
+ def attach_to_mediator
12
+ @mediator.add_listener(TestRunnerMediator::STARTED, &method(:t_started))
13
+ @mediator.add_listener(TestRunnerMediator::FINISHED, &method(:t_finished))
14
+ @mediator.add_listener(TestCase::STARTED, &method(:t_test_started))
15
+ @mediator.add_listener(TestCase::FINISHED, &method(:t_test_finished))
16
+ @mediator.add_listener(TestResult::FAULT, &method(:t_fault))
17
+ @io.sync = true
18
+ @t_cur_file, @t_fault = nil
19
+ end
20
+
21
+ def t_started( result )
22
+ @t_result = result
23
+ end
24
+
25
+ def t_finished( elapsed_time )
26
+ failure = @t_result.failure_count
27
+ error = @t_result.error_count
28
+ total = @t_result.run_count
29
+ pass = total - failure - error
30
+
31
+ bar = '=' * 78
32
+ if COLORIZE
33
+ bar = if pass == total then ::ANSICode.green bar
34
+ else ::ANSICode.red bar end
35
+ end
36
+
37
+ @io.puts bar
38
+ @io.puts " pass: %d, fail: %d, error: %d" % [pass, failure, error]
39
+ @io.puts " total: %d tests with %d assertions in #{elapsed_time} seconds" % [total, @t_result.assertion_count]
40
+ @io.puts bar
41
+ end
42
+
43
+ def t_test_started( name )
44
+ method, file = name.scan(%r/^([^\(]+)\(([^\)]+)\)/o).flatten!
45
+ if @t_cur_file != file
46
+ @t_cur_file = file
47
+ @io.puts file
48
+ end
49
+ @io.print " %-69s" % method
50
+ end
51
+
52
+ def t_test_finished( name )
53
+ @io.puts " #{PASS}" unless @t_fault
54
+ @t_fault = false
55
+ end
56
+
57
+ def t_fault( fault )
58
+ @t_fault = true
59
+ msg = "\t"
60
+
61
+ case fault
62
+ when ::Test::Unit::Error
63
+ @io.puts ERROR
64
+ msg << fault.to_s.split("\n")[2..-1].join("\n\t")
65
+ when ::Test::Unit::Failure
66
+ @io.puts " #{FAIL}"
67
+ msg << fault.location[0].to_s << "\n\t"
68
+ msg << fault.message.gsub("\n","\n\t")
69
+ end
70
+
71
+ msg = ::ANSICode.magenta msg if COLORIZE
72
+ @io.puts msg
73
+ end
74
+
75
+ end
76
+ end
77
+ end
78
+ end
79
+
80
+ # EOF
@@ -0,0 +1,29 @@
1
+ begin
2
+ require 'facets/ansicode'
3
+ rescue LoadError
4
+ begin
5
+ require 'rubygems'
6
+ require 'facets/ansicode'
7
+ rescue LoadError
8
+ end
9
+ end
10
+
11
+ module Turn
12
+
13
+ module Colorize
14
+
15
+ COLORIZE = defined?(::ANSICode) && ENV.has_key?('TERM')
16
+
17
+ if COLORIZE
18
+ PASS = ::ANSICode.green('PASS')
19
+ FAIL = ::ANSICode.red('FAIL')
20
+ ERROR = ::ANSICode.white(::ANSICode.on_red('ERROR'))
21
+ else
22
+ PASS = "PASS"
23
+ FAIL = "FAIL"
24
+ ERROR = "ERROR"
25
+ end
26
+
27
+ end
28
+
29
+ end
@@ -0,0 +1,159 @@
1
+ # Turn - Pretty Unit Test Runner for Ruby
2
+ #
3
+ # SYNOPSIS
4
+ # turn [OPTIONS] [RUN MODE] [OUTPUT MODE] [test globs...]
5
+ #
6
+ # OPTIONS
7
+ # -h --help display this help information
8
+ # --live don't use loadpath
9
+ # --log log results to a file
10
+ # -I --loadpath=PATHS add given paths to the $LOAD_PATH
11
+ # -r --requires=PATHS require given paths before running tests
12
+ #
13
+ # RUN MODES
14
+ # --normal run all tests in a single process [default]
15
+ # --solo run each test in a separate process
16
+ # --cross run each pair of test files in a separate process
17
+ #
18
+ # OUTPUT MODES
19
+ # -O --outline turn's original case/test outline mode [default]
20
+ # -P --progress indicates progress with progress bar
21
+ # -D --dotted test/unit's traditonal dot-progress mode
22
+ # -M --marshal dump output as YAML (normal run mode only)
23
+
24
+ require 'getoptlong'
25
+ require 'turn/controller'
26
+
27
+ #RUBY = File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name'])
28
+
29
+ original_argv = ARGV.dup
30
+
31
+ opts = GetoptLong.new(
32
+ [ '--help', '-h', GetoptLong::NO_ARGUMENT ],
33
+ [ '--live', GetoptLong::NO_ARGUMENT ],
34
+ [ '--log', GetoptLong::OPTIONAL_ARGUMENT ],
35
+ [ '--loadpath', '-I', GetoptLong::REQUIRED_ARGUMENT ],
36
+ [ '--requires', '-r', GetoptLong::REQUIRED_ARGUMENT ],
37
+
38
+ # RUN MODES
39
+ [ '--normal', GetoptLong::NO_ARGUMENT ],
40
+ [ '--solo', GetoptLong::NO_ARGUMENT ],
41
+ [ '--cross', GetoptLong::NO_ARGUMENT ],
42
+ #[ '--load', GetoptLong::NO_ARGUMENT ],
43
+
44
+ # OUTPUT MODES
45
+ [ '--outline', '-O', GetoptLong::NO_ARGUMENT ],
46
+ [ '--progress', '-P', GetoptLong::NO_ARGUMENT ],
47
+ [ '--dotted', '-D', GetoptLong::NO_ARGUMENT ],
48
+ [ '--marshal', '-M', GetoptLong::NO_ARGUMENT ]
49
+ )
50
+
51
+ live = nil
52
+ log = nil
53
+ loadpath = []
54
+ requires = []
55
+
56
+ runmode = nil
57
+ outmode = nil
58
+
59
+ opts.each do |opt, arg|
60
+ case opt
61
+ when '--help'
62
+ help, rest = File.read(__FILE__).split(/^\s*$/)
63
+ puts help.gsub(/^\#[ ]{0,1}/,'')
64
+ exit
65
+
66
+ when '--live'
67
+ live = true
68
+ when '--log'
69
+ log = true
70
+ when '--loadpath'
71
+ loadpath << arg
72
+ when '--requires'
73
+ requires << arg
74
+
75
+ when '--solo'
76
+ runmode = :solo
77
+ when '--cross'
78
+ runmode = :cross
79
+ when '--marshal'
80
+ runmode = :marshal
81
+ outmode = :marshal
82
+ when '--progress'
83
+ outmode = :progress
84
+ when '--outline'
85
+ outmode = :outline
86
+ when '--dotted'
87
+ outmode = :dotted
88
+ end
89
+ end
90
+
91
+ loadpath = ['lib'] if loadpath.empty?
92
+
93
+ tests = ARGV.empty? ? nil : ARGV.dup
94
+
95
+ case outmode
96
+ when :marshal
97
+ reporter = Turn::MarshalReporter.new($stdout)
98
+ when :progress
99
+ reporter = Turn::ProgressReporter.new($stdout)
100
+ when :dotted
101
+ reporter = Turn::DotReporter.new($stdout)
102
+ else
103
+ reporter = Turn::OutlineReporter.new($stdout)
104
+ end
105
+
106
+ case runmode
107
+ when :marshal
108
+ require 'turn/runners/testrunner'
109
+ runner = Turn::TestRunner
110
+ when :solo
111
+ require 'turn/runners/solorunner'
112
+ runner = Turn::SoloRunner
113
+ when :cross
114
+ require 'turn/runners/crossrunner'
115
+ runner = Turn::CrossRunner
116
+ else
117
+ require 'turn/runners/testrunner'
118
+ runner = Turn::TestRunner
119
+ end
120
+
121
+ controller = Turn::Controller.new do |c|
122
+ c.live = live
123
+ c.log = log
124
+ c.loadpath = loadpath
125
+ c.requires = requires
126
+ c.tests = tests
127
+ c.runner = runner
128
+ c.reporter = reporter
129
+ end
130
+
131
+ controller.start
132
+
133
+ =begin
134
+ else
135
+
136
+ begin
137
+ require 'turn/adapters/testunit' # 'turn'
138
+ rescue LoadError
139
+ require 'rubygems'
140
+ require 'turn/adapters/testunit' # 'turn'
141
+ end
142
+
143
+ ARGV.each{ |a| Dir[a].each{ |f| require f }}
144
+ Turn::TestRunner.run(TS_MyTests)
145
+
146
+ #RUBY = File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name'])
147
+ #
148
+ #begin
149
+ # require 'turn'
150
+ # Kernel.exec(RUBY, '-r', 'turn', *ARGV)
151
+ #rescue LoadError
152
+ # require 'rubygems'
153
+ # require 'turn'
154
+ # Kernel.exec(RUBY, '-rubygems', '-r', 'turn', *ARGV)
155
+ #end
156
+
157
+ end
158
+ =end
159
+