test 0.2.1 → 0.3.1

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,72 +0,0 @@
1
- module Test
2
-
3
- #
4
- def self.run(name=:default, &block)
5
- @config ||= {}
6
- @config[name.to_s] = block
7
- end
8
-
9
- def self.config
10
- @config ||= {}
11
- end
12
-
13
- #
14
- class Config
15
-
16
- # Test configuration file.
17
- #
18
- # The name of the file is an ode to the original Ruby cli test tool.
19
- #
20
- # @example
21
- # .test
22
- # .testrb
23
- # .test.rb
24
- # .config/test.rb
25
- #
26
- GLOB_RC = '{.testrb,.test.rb,.test,.config/test.rb,config/test.rb}'
27
-
28
- #
29
- GLOB_ROOT = '{.ruby,.git,.hg}'
30
-
31
- #
32
- def self.load
33
- super(rc_file) if rc_file
34
- end
35
-
36
- # Find rc file.
37
- def self.rc_file
38
- @rc_file ||= (
39
- glob = GLOB_RC
40
- stop = root
41
- default = nil
42
- dir = Dir.pwd
43
- file = nil
44
- loop do
45
- file = Dir[File.join(dir, glob)].first
46
- break file if file
47
- break if dir == stop
48
- dir = File.dirname(dir)
49
- break if dir == '/'
50
- end
51
- file ? file : default
52
- )
53
- end
54
-
55
- # Find project root.
56
- def self.root
57
- @root ||= (
58
- glob = GLOB_ROOT
59
- stop = '/'
60
- default = Dir.pwd
61
- dir = Dir.pwd
62
- until dir == stop
63
- break dir if Dir[File.join(dir, glob)].first
64
- dir = File.dirname(dir)
65
- end
66
- dir == stop ? default : dir
67
- )
68
- end
69
-
70
- end
71
-
72
- end
@@ -1,9 +0,0 @@
1
- if RUBY_VERSION < '1.9'
2
- require 'test/core_ext/assertion'
3
- require 'test/core_ext/exception'
4
- require 'test/core_ext/string'
5
- else
6
- require_relative 'core_ext/assertion'
7
- require_relative 'core_ext/exception'
8
- require_relative 'core_ext/string'
9
- end
@@ -1,30 +0,0 @@
1
- class Assertion < Exception
2
-
3
- # New assertion (failure).
4
- #
5
- # @param message [String] the failure message
6
- # @param options [Hash] options such as :backtrace
7
- #
8
- def initialize(message=nil, options={})
9
- super(message)
10
- backtrace = options[:backtrace]
11
- set_backtrace(backtrace) if backtrace
12
- @assertion = true
13
- end
14
-
15
- # Technically any object that affirmatively responds to #assertion?
16
- # can be taken to be an Assertion. This makes it easier for various
17
- # libraries to work together without having to depend upon a common
18
- # Assertion base class.
19
- def assertion?
20
- true # @assertion
21
- end
22
-
23
- # Parents error message prefixed with "(assertion)".
24
- #
25
- # @return [String] error message
26
- def to_s
27
- '(assertion) ' + super
28
- end
29
-
30
- end
@@ -1,8 +0,0 @@
1
- class Exception
2
- def set_assertion(boolean)
3
- @assertion = boolean
4
- end
5
- def assertion?
6
- @assertion
7
- end
8
- end
@@ -1,30 +0,0 @@
1
- class String
2
-
3
- # Preserves relative tabbing.
4
- # The first non-empty line ends up with n spaces before nonspace.
5
- #
6
- # This is a Ruby Facet (http://rubyworks.github.com/facets).
7
-
8
- def tabto(n)
9
- if self =~ /^( *)\S/
10
- indent(n - $1.length)
11
- else
12
- self
13
- end
14
- end unless method_defined?(:tabto)
15
-
16
- # Indent left or right by n spaces.
17
- # (This used to be called #tab and aliased as #indent.)
18
- #
19
- # This is a Ruby Facet (http://rubyworks.github.com/facets).
20
-
21
- def indent(n, c=' ')
22
- if n >= 0
23
- gsub(/^/, c * n)
24
- else
25
- gsub(/^#{Regexp.escape(c)}{0,#{-n}}/, "")
26
- end
27
- end unless method_defined?(:indent)
28
-
29
- end
30
-
@@ -1,124 +0,0 @@
1
- require 'rake/tasklib'
2
-
3
- module Test
4
-
5
- module Rake
6
-
7
- # Define a test rake task.
8
- #
9
- # The `TEST` environment variable can be used to select tests
10
- # when using the task.
11
- #
12
- #--
13
- # TODO: The test task uses #fork. Maybe it should shell out instead?
14
- # Or provide the option for either?
15
- #++
16
- class TestTask < ::Rake::TaskLib
17
-
18
- # Glob patterns are used by default to select test scripts.
19
- DEFAULT_TESTS = [
20
- 'test/**/case_*.rb',
21
- 'test/**/*_case.rb',
22
- 'test/**/test_*.rb',
23
- 'test/**/*_test.rb'
24
- ]
25
-
26
- # Test scripts to load. Can be a file glob.
27
- attr_accessor :tests
28
-
29
- # Paths to add to $LOAD_PATH.
30
- attr_accessor :loadpath
31
-
32
- # Scripts to load prior to loading tests.
33
- attr_accessor :requires
34
-
35
- # Report format to use.
36
- attr_accessor :format
37
-
38
- # Filter tests based by tags.
39
- attr_accessor :tags
40
-
41
- # Filter tests by matching description.
42
- attr_accessor :match
43
-
44
- # From Rake's own TestTask.
45
- alias_method :libs, :loadpath
46
- alias_method :test_files, :tests
47
-
48
- #
49
- def initialize(name='test', desc="run tests", &block)
50
- @name = name
51
- @desc = desc
52
-
53
- @loadpath = ['lib']
54
- @requires = []
55
- @tests = [ENV['TEST'] || DEFAULT_TESTS].flatten
56
- @format = nil
57
- @match = nil
58
- @tags = []
59
-
60
- block.call(self)
61
-
62
- define_task
63
- end
64
-
65
- #
66
- def define_task
67
- desc @desc
68
- task @name do
69
- @tests ||= default_tests
70
- run
71
- end
72
- end
73
-
74
- #
75
- def run
76
- fork {
77
- #require 'test'
78
- require 'test/runner'
79
-
80
- loadpath.each { |d| $LOAD_PATH.unshift(d) }
81
- requires.each { |f| require f }
82
- test_files.each { |f| require f }
83
-
84
- suite = $TEST_SUITE || []
85
- runner = new(suite, :format=>format, :tags=>tags, :match=>match)
86
- success = runner.run
87
-
88
- exit -1 unless success
89
- }
90
- Process.wait
91
- end
92
-
93
- # Resolve test globs.
94
- #--
95
- # TODO: simplify?
96
- #++
97
- def test_files
98
- files = tests
99
- files = files.map{ |f| Dir[f] }.flatten
100
- files = files.map{ |f| File.directory?(f) ? Dir[File.join(f, '**/*.rb')] : f }
101
- files = files.flatten.uniq
102
- files = files.map{ |f| File.expand_path(f) }
103
- files
104
- end
105
-
106
- #
107
- def default_tests
108
- if ENV['tests']
109
- ENV['tests'].split(/[:;]/)
110
- else
111
- DEFAULT_TESTS
112
- end
113
- end
114
-
115
- #
116
- #def ruby_command
117
- # File.join(RbConfig::CONFIG['bindir'], Config::CONFIG['ruby_install_name'])
118
- #end
119
-
120
- end
121
-
122
- end
123
-
124
- end
@@ -1,53 +0,0 @@
1
- module Test
2
-
3
- # Recorder class is an observer that tracks all tests
4
- # that are run and categorizes them according to their
5
- # test status.
6
- class Recorder
7
-
8
- def initialize
9
- @table = Hash.new{ |h,k| h[k] = [] }
10
- end
11
-
12
- def [](key)
13
- @table[key.to_sym]
14
- end
15
-
16
- #
17
- def skip(test)
18
- self[:skip] << test
19
- end
20
-
21
- # Add `test` to pass set.
22
- def pass(test)
23
- self[:pass] << test
24
- end
25
-
26
- def fail(test, exception)
27
- self[:fail] << [test, exception]
28
- end
29
-
30
- def error(test, exception)
31
- self[:error] << [test, exception]
32
- end
33
-
34
- def todo(test, exception)
35
- self[:todo] << [test, exception]
36
- end
37
-
38
- def omit(test, exception)
39
- self[:omit] << [test, exception]
40
- end
41
-
42
- # Returns true if their are no test errors or failures.
43
- def success?
44
- self[:error].size + self[:fail].size > 0 ? false : true
45
- end
46
-
47
- # Ignore any other signals.
48
- def method_missing(*a)
49
- end
50
-
51
- end
52
-
53
- end
@@ -1,268 +0,0 @@
1
- require 'ansi/core'
2
- require 'test/core_ext'
3
- require 'test/code_snippet'
4
-
5
- ignore_path = File.expand_path(File.join(__FILE__, '../../..'))
6
- ignore_regexp = Regexp.new(Regexp.escape(ignore_path))
7
-
8
- RUBY_IGNORE_CALLERS = [] unless defined? RUBY_IGNORE_CALLERS
9
- RUBY_IGNORE_CALLERS << ignore_regexp
10
- RUBY_IGNORE_CALLERS << /bin\/ruby-test/
11
-
12
- module Test
13
-
14
- #
15
- module Reporters
16
-
17
- # Test Reporter Base Class
18
- class Abstract
19
-
20
- #
21
- def self.inherited(base)
22
- registry << base
23
- end
24
-
25
- #
26
- def self.registry
27
- @registry ||= []
28
- end
29
-
30
- #
31
- def initialize(runner)
32
- @runner = runner
33
- #@source = {}
34
-
35
- # in case start_suite is overridden
36
- @start_time = Time.now
37
- end
38
-
39
- #
40
- attr :runner
41
-
42
- #
43
- def begin_suite(test_suite)
44
- @start_time = Time.now
45
- end
46
-
47
- #
48
- def begin_case(test_case)
49
- end
50
-
51
- #
52
- def begin_test(test)
53
- end
54
-
55
- #
56
- def skip_case(test_case)
57
- end
58
-
59
- #
60
- def skip_test(test)
61
- end
62
-
63
- #
64
- #def test(test)
65
- #end
66
-
67
- #
68
- def pass(test)
69
- end
70
-
71
- #
72
- def fail(test, exception)
73
- end
74
-
75
- #
76
- def error(test, exception)
77
- end
78
-
79
- # Report a pending test.
80
- def todo(test, exception)
81
- end
82
-
83
- # Report an omitted test.
84
- def omit(test, exception)
85
- end
86
-
87
- #
88
- def end_test(test)
89
- end
90
-
91
- #
92
- def end_case(test_case)
93
- end
94
-
95
- #
96
- def end_suite(test_suite)
97
- end
98
-
99
- protected
100
-
101
- def record
102
- runner.recorder
103
- end
104
-
105
- # Is coverage information requested?
106
- #def cover?
107
- # runner.cover?
108
- #end
109
-
110
- # Count up the total number of tests.
111
- def total_count(suite)
112
- c = 0
113
- suite.each do |tc|
114
- if tc.respond_to?(:each)
115
- c += total_count(tc)
116
- else
117
- c += 1
118
- end
119
- end
120
- return c
121
- end
122
-
123
- # Common timestamp any reporter can use.
124
- def timestamp
125
- seconds = Time.now - @start_time
126
-
127
- "Finished in %.5fs, %.2f tests/s." % [seconds, total/seconds]
128
- end
129
-
130
- #
131
- def total
132
- @total ||= subtotal
133
- end
134
-
135
- #
136
- def subtotal
137
- [:todo, :pass, :fail, :error, :omit, :skip].inject(0) do |s,r|
138
- s += record[r.to_sym].size; s
139
- end
140
- end
141
-
142
- # TODO: lump skipped and omitted into one group ?
143
-
144
- TITLES = {
145
- :pass => 'passing',
146
- :fail => 'failures',
147
- :error => 'errors',
148
- :todo => 'pending',
149
- :omit => 'omissions',
150
- :skip => 'skipped'
151
- }
152
-
153
- # TODO: Add assertion counts (if reasonably possible).
154
-
155
- # Common tally stamp any reporter can use.
156
- #
157
- # @return [String] tally stamp
158
- def tally
159
- sizes = {}
160
- names = %w{error fail todo omit skip}.map{ |n| n.to_sym }
161
- names.each do |r|
162
- sizes[r] = record[r].size
163
- end
164
-
165
- #names.unshift(:tests)
166
- #sizes[:tests] = total
167
-
168
- s = []
169
- names.each do |n|
170
- next unless sizes[n] > 0
171
- s << tally_item(n, sizes)
172
- end
173
-
174
- 'Executed ' + "#{total}".ansi(:bold) + ' tests with ' + s.join(', ')
175
- end
176
-
177
- #
178
- def tally_item(name, sizes)
179
- x = []
180
- x << "%s" % sizes[name].to_s.ansi(:bold)
181
- x << " %s" % TITLES[name].downcase
182
- x << " (%.1f%%)" % ((sizes[name].to_f/total*100)) if runner.verbose?
183
- x.join('')
184
- end
185
-
186
- #--
187
- # TODO: Matching `bin/ruby-test` is not robust.
188
- #++
189
-
190
- # Remove reference to lemon library from backtrace.
191
- #
192
- # @param [Exception] exception
193
- # The error that was rasied.
194
- #
195
- # @return [Array] filtered backtrace
196
- def clean_backtrace(exception)
197
- trace = (Exception === exception ? exception.backtrace : exception)
198
- return trace if $DEBUG
199
- trace = trace.reject{ |t| RUBY_IGNORE_CALLERS.any?{ |r| r =~ t }}
200
- trace = trace.map do |t|
201
- i = t.index(':in')
202
- i ? t[0...i] : t
203
- end
204
- #if trace.empty?
205
- # exception
206
- #else
207
- # exception.set_backtrace(trace) if Exception === exception
208
- # exception
209
- #end
210
- trace.uniq
211
- end
212
-
213
- # That an exception, backtrace or source code text and line
214
- # number and return a CodeSnippet object.
215
- #
216
- # @return [CodeSnippet] code snippet
217
- def code(source, line=nil)
218
- case source
219
- when Exception, Array
220
- CodeSnippet.from_backtrace(clean_backtrace(source))
221
- else
222
- CodeSnippet.new(source, line)
223
- end
224
- end
225
-
226
- #--
227
- # TODO: Show more of the file name than just the basename.
228
- #++
229
-
230
- #
231
- def file_and_line(exception)
232
- line = clean_backtrace(exception)[0]
233
- return "" unless line
234
- i = line.rindex(':in')
235
- line = i ? line[0...i] : line
236
- File.basename(line)
237
- end
238
-
239
- #
240
- def file_and_line_array(exception)
241
- case exception
242
- when Exception
243
- line = exception.backtrace[0]
244
- else
245
- line = exception[0] # backtrace
246
- end
247
- return ["", 0] unless line
248
- i = line.rindex(':in')
249
- line = i ? line[0...i] : line
250
- f, l = File.basename(line).split(':')
251
- return [f, l.to_i]
252
- end
253
-
254
- #
255
- def file(exception)
256
- file_and_line_array(exception).first
257
- end
258
-
259
- #
260
- def line(exception)
261
- file_and_line_array(exception).last
262
- end
263
-
264
- end
265
-
266
- end
267
-
268
- end