baretest 0.2.4 → 0.4.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE.txt +6 -6
- data/MANIFEST.txt +40 -18
- data/README.rdoc +8 -1
- data/bin/baretest +126 -118
- data/doc/baretest.rdoc +1 -1
- data/doc/mocking_stubbing_test_doubles.rdoc +31 -3
- data/doc/news/news-0.3.0.rdoc +7 -0
- data/doc/quickref.rdoc +74 -28
- data/doc/whats_going_on.rdoc +5 -0
- data/doc/writing_tests.rdoc +25 -13
- data/examples/components/rack-test.rb +17 -0
- data/examples/{tests/irb_mode → irb_mode}/failures.rb +0 -0
- data/examples/rake/test.rake +40 -0
- data/examples/tests/01_basics_I.rb +34 -0
- data/examples/tests/02_basics_II_helpers.rb +25 -0
- data/examples/tests/03_basics_III_setup_and_teardown.rb +53 -0
- data/examples/tests/04_advanced_I_dependencies.rb +31 -0
- data/examples/tests/05_advanced_II_tags.rb +12 -0
- data/examples/tests/06_advanced_III_requires.rb +21 -0
- data/examples/tests/07_advanced_IV_components.rb +48 -0
- data/examples/tests/08_expert_I_setup_variants.rb +46 -0
- data/lib/baretest.rb +142 -21
- data/lib/baretest/assertion.rb +83 -92
- data/lib/baretest/assertion/context.rb +9 -0
- data/lib/baretest/assertion/support.rb +88 -61
- data/lib/baretest/commandline.rb +268 -0
- data/lib/baretest/formatter.rb +58 -0
- data/lib/baretest/invalidselectors.rb +24 -0
- data/lib/baretest/irb_mode.rb +100 -58
- data/lib/baretest/persistence.rb +94 -0
- data/lib/baretest/run.rb +138 -37
- data/lib/baretest/run/cli.rb +97 -43
- data/lib/baretest/run/minimal.rb +2 -1
- data/lib/baretest/run/none.rb +21 -0
- data/lib/baretest/run/xml.rb +21 -19
- data/lib/baretest/setup.rb +2 -0
- data/lib/baretest/status.rb +93 -0
- data/lib/baretest/suite.rb +185 -59
- data/lib/baretest/uid.rb +51 -0
- data/lib/baretest/use/mocha.rb +24 -0
- data/lib/baretest/use/rack_test.rb +9 -0
- data/lib/baretest/use/rr.rb +17 -0
- data/lib/baretest/version.rb +18 -4
- data/lib/command.rb +36 -0
- data/lib/command/argument.rb +11 -0
- data/lib/command/decoratinghash.rb +31 -0
- data/lib/command/definition.rb +294 -0
- data/lib/command/directorynotfounderror.rb +11 -0
- data/lib/command/env.rb +11 -0
- data/lib/command/filenotfounderror.rb +11 -0
- data/lib/command/kernel.rb +14 -0
- data/lib/command/nodirectoryerror.rb +11 -0
- data/lib/command/nofileerror.rb +11 -0
- data/lib/command/option.rb +16 -0
- data/lib/command/parser.rb +145 -0
- data/lib/command/result.rb +11 -0
- data/lib/command/types.rb +33 -0
- data/lib/command/version.rb +28 -0
- data/test/setup.rb +3 -0
- data/test/suite/lib/baretest.rb +0 -178
- data/test/suite/lib/baretest/assertion.rb +133 -112
- data/test/suite/lib/baretest/assertion/context.rb +40 -0
- data/test/suite/lib/baretest/assertion/failure.rb +19 -0
- data/test/suite/lib/baretest/assertion/skip.rb +19 -0
- data/test/suite/lib/baretest/assertion/support.rb +366 -84
- data/test/suite/lib/baretest/run.rb +114 -15
- data/test/suite/lib/baretest/suite.rb +70 -29
- metadata +46 -24
- data/examples/test.rake +0 -65
- data/examples/tests/mock_developer/test/helper/mocks.rb +0 -0
- data/examples/tests/mock_developer/test/setup.rb +0 -57
- data/examples/tests/mock_developer/test/suite/mock_demo.rb +0 -19
- data/examples/tests/overview/test.rb +0 -89
- data/examples/tests/variations/variations_01.rb +0 -14
- data/examples/tests/variations/variations_02.rb +0 -19
- data/examples/tests/variations/variations_03.rb +0 -19
- data/lib/baretest/mocha.rb +0 -18
- data/lib/baretest/rr.rb +0 -16
- data/lib/baretest/run/errors.rb +0 -49
- data/lib/baretest/skipped.rb +0 -15
- data/lib/baretest/skipped/assertion.rb +0 -20
- data/lib/baretest/skipped/suite.rb +0 -49
- data/test/external/bootstraptest.rb +0 -5
- data/test/external/bootstrapwrap.rb +0 -2
- data/test/helper/mocks.rb +0 -0
@@ -8,10 +8,19 @@
|
|
8
8
|
|
9
9
|
module BareTest
|
10
10
|
class Assertion
|
11
|
+
|
12
|
+
# Serves as the exercise- and verify-container for Assertions. Upon
|
13
|
+
# Assertion#execute, a new Context is created, the setups, the assertions'
|
14
|
+
# defining block and the teardowns instance evaled.
|
15
|
+
# Components will want to extend this class.
|
11
16
|
class Context
|
17
|
+
|
18
|
+
# The Assertion instance this Context was created for
|
12
19
|
attr_reader :__assertion__
|
13
20
|
alias assertion __assertion__
|
14
21
|
|
22
|
+
# Accepts the Assertion instance this Context is created for as first
|
23
|
+
# and only argument.
|
15
24
|
def initialize(assertion)
|
16
25
|
@__assertion__ = assertion
|
17
26
|
end
|
@@ -18,7 +18,7 @@ module BareTest
|
|
18
18
|
@touch = {}
|
19
19
|
|
20
20
|
# We don't want to litter in Assertion
|
21
|
-
# Touches are associated
|
21
|
+
# Touches are associated with
|
22
22
|
# Used by BareTest::Assertion::Support#touch
|
23
23
|
def self.touch(assertion, thing=nil) # :nodoc:
|
24
24
|
@touch[assertion] ||= Hash.new(0)
|
@@ -72,26 +72,24 @@ module BareTest
|
|
72
72
|
|
73
73
|
# FIXME: incomplete and untested
|
74
74
|
def throws(symbol) # :nodoc:
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
75
|
+
passed = false
|
76
|
+
catch(symbol) {
|
77
|
+
yield
|
78
|
+
failure "Expected the code to throw %p, but nothing was thrown", symbol
|
79
|
+
}
|
80
|
+
return true
|
81
|
+
# throw raises a NameError if no catch with appropriate symbol is set up
|
82
|
+
rescue ArgumentError, NameError => e
|
83
|
+
# Make sure it's not a NameError with a different reason than the throw
|
84
|
+
# ruby 1.8.7: NameError, "uncaught throw `symbol'"
|
85
|
+
# ruby 1.9.1: ArgumentError, "uncaught throw :symbol"
|
86
|
+
threw_instead = e.message[/\Auncaught throw `(.*)'\z/, 1] || e.message[/\Auncaught throw :(.*)\z/, 1]
|
87
|
+
if threw_instead then
|
88
|
+
failure "Expected the code to throw %p, but it threw %p instead", symbol, threw_instead.to_sym
|
89
|
+
else
|
90
|
+
# It was some other name error, reraise
|
89
91
|
raise
|
90
|
-
ensure
|
91
|
-
raise ThrewSomethingElse unless passed
|
92
92
|
end
|
93
|
-
rescue ThrewSomethingElse => e
|
94
|
-
return false
|
95
93
|
end
|
96
94
|
|
97
95
|
# FIXME: incomplete and untested
|
@@ -109,21 +107,28 @@ module BareTest
|
|
109
107
|
# raises :with_message => "bar" do raise "bar" end # => true
|
110
108
|
# raises SomeException, :with_message => "bar"; raise SomeException, "bar" end # => true
|
111
109
|
# raises :with_message => /\Aknown \w+\z/; raise "known unknown" end # => true
|
112
|
-
def raises(
|
110
|
+
def raises(expected_exception_class=nil, with_message=nil, opts={})
|
111
|
+
exception_class = expected_exception_class || StandardError
|
113
112
|
yield
|
114
113
|
rescue exception_class => exception
|
115
|
-
if
|
116
|
-
failure "Expected
|
117
|
-
|
114
|
+
if expected_exception_class && exception.class != expected_exception_class then
|
115
|
+
failure "Expected the code to raise #{expected_exception_class}, but it raised #{exception.class} instead"
|
116
|
+
elsif with_message && !(with_message === exception.message) then
|
117
|
+
failure "Expected the code to raise with the message %p, but the message was %p",
|
118
|
+
with_message, exception.message
|
118
119
|
else
|
119
120
|
true
|
120
121
|
end
|
121
122
|
rescue ::BareTest::Assertion::Failure, *::BareTest::Assertion::PassthroughExceptions
|
122
123
|
::Kernel.raise
|
123
124
|
rescue => exception
|
124
|
-
failure "Expected
|
125
|
+
failure "Expected the code to raise #{expected_exception_class}, but it raised #{exception.class} instead"
|
125
126
|
else
|
126
|
-
|
127
|
+
if expected_exception_class then
|
128
|
+
failure "Expected the code to raise #{expected_exception_class}, but nothing was raised"
|
129
|
+
else
|
130
|
+
failure "Expected the code to raise, but nothing was raised"
|
131
|
+
end
|
127
132
|
end
|
128
133
|
|
129
134
|
# Will raise a Failure if the given block raises.
|
@@ -132,7 +137,7 @@ module BareTest
|
|
132
137
|
rescue ::BareTest::Assertion::Failure, *::BareTest::Assertion::PassthroughExceptions
|
133
138
|
::Kernel.raise
|
134
139
|
rescue Exception => exception
|
135
|
-
failure "Expected
|
140
|
+
failure "Expected the code to raise nothing, but it raised #{exception.class} (#{exception.message})"
|
136
141
|
else
|
137
142
|
true
|
138
143
|
end
|
@@ -141,7 +146,12 @@ module BareTest
|
|
141
146
|
# for example a delta comparison instead, to take care
|
142
147
|
# of the possible rounding differences.
|
143
148
|
def within_delta(a, b, delta)
|
144
|
-
(a-b).abs
|
149
|
+
actual_delta = (a-b).abs
|
150
|
+
if actual_delta >= delta then
|
151
|
+
failure "Expected %p and %p to differ less than %p, but they were different by %p", a, b, delta, actual_delta
|
152
|
+
else
|
153
|
+
true
|
154
|
+
end
|
145
155
|
rescue ::BareTest::Assertion::Failure, *::BareTest::Assertion::PassthroughExceptions
|
146
156
|
::Kernel.raise
|
147
157
|
rescue Exception => e
|
@@ -152,7 +162,7 @@ module BareTest
|
|
152
162
|
# touch marks that it was reached, #touched tests for whether it was reached.
|
153
163
|
#
|
154
164
|
# Example:
|
155
|
-
# assert "Code in a Proc object is executed when invoking #call on it
|
165
|
+
# assert "Code in a Proc object is executed when invoking #call on it" do
|
156
166
|
# a_proc = proc { touch :executed }
|
157
167
|
# a_proc.call
|
158
168
|
# touched(:executed)
|
@@ -170,16 +180,16 @@ module BareTest
|
|
170
180
|
if times then
|
171
181
|
unless touched_times == times then
|
172
182
|
if thing then
|
173
|
-
failure "Expected the code to touch %p %s times, but did %s times
|
183
|
+
failure "Expected the code to touch %p %s times, but did %s times", thing, times, touched_times
|
174
184
|
else
|
175
|
-
failure "Expected the code to touch %s times, but did %s times
|
185
|
+
failure "Expected the code to touch %s times, but did %s times", times, touched_times
|
176
186
|
end
|
177
187
|
end
|
178
188
|
elsif touched_times < 1 then
|
179
189
|
if thing then
|
180
|
-
failure "Expected the code to touch %p, but it was not touched
|
190
|
+
failure "Expected the code to touch %p, but it was not touched", thing
|
181
191
|
else
|
182
|
-
failure "Expected the code to touch, but no touch happened
|
192
|
+
failure "Expected the code to touch, but no touch happened"
|
183
193
|
end
|
184
194
|
end
|
185
195
|
true
|
@@ -202,9 +212,9 @@ module BareTest
|
|
202
212
|
|
203
213
|
unless expected.equal?(actual) then
|
204
214
|
if message then
|
205
|
-
failure "Expected %s to be the same (equal?) as %p but was %p
|
215
|
+
failure "Expected %s to be the same (equal?) as %p but was %p", message, expected, actual
|
206
216
|
else
|
207
|
-
failure "Expected %p but got %p
|
217
|
+
failure "Expected %p but got %p", expected, actual
|
208
218
|
end
|
209
219
|
end
|
210
220
|
true
|
@@ -225,9 +235,9 @@ module BareTest
|
|
225
235
|
|
226
236
|
unless expected.eql?(actual) then
|
227
237
|
if message then
|
228
|
-
failure "Expected %s to be hash-key equal (eql?) to %p but was %p
|
238
|
+
failure "Expected %s to be hash-key equal (eql?) to %p but was %p", message, expected, actual
|
229
239
|
else
|
230
|
-
failure "Expected %p but got %p
|
240
|
+
failure "Expected %p but got %p", expected, actual
|
231
241
|
end
|
232
242
|
end
|
233
243
|
true
|
@@ -248,9 +258,9 @@ module BareTest
|
|
248
258
|
|
249
259
|
unless expected == actual then
|
250
260
|
if message then
|
251
|
-
failure "Expected %s to be order equal (==) to %p but was %p
|
261
|
+
failure "Expected %s to be order equal (==) to %p but was %p", message, expected, actual
|
252
262
|
else
|
253
|
-
failure "Expected %p but got %p
|
263
|
+
failure "Expected %p but got %p", expected, actual
|
254
264
|
end
|
255
265
|
end
|
256
266
|
true
|
@@ -272,8 +282,8 @@ module BareTest
|
|
272
282
|
|
273
283
|
unless expected === actual then
|
274
284
|
failure_with_optional_message \
|
275
|
-
"Expected %s to be case equal (===) to %p but was %p
|
276
|
-
"Expected %p but got %p
|
285
|
+
"Expected %s to be case equal (===) to %p but was %p",
|
286
|
+
"Expected %p but got %p",
|
277
287
|
message, expected, actual
|
278
288
|
end
|
279
289
|
true
|
@@ -299,11 +309,11 @@ module BareTest
|
|
299
309
|
only_in_actual = count.select { |ele, n| n < 0 }.map { |ele, n| ele }
|
300
310
|
if message then
|
301
311
|
failure "Expected %s to have the same items the same number of times, " \
|
302
|
-
"but %p are only in expected, and %p only in actual
|
312
|
+
"but %p are only in expected, and %p only in actual",
|
303
313
|
message, only_in_expected, only_in_actual
|
304
314
|
else
|
305
315
|
failure "Expected %p and %p to have the same items the same number of times, " \
|
306
|
-
"but %p are only in expected, and %p only in actual
|
316
|
+
"but %p are only in expected, and %p only in actual",
|
307
317
|
expected, actual, only_in_expected, only_in_actual
|
308
318
|
end
|
309
319
|
end
|
@@ -330,7 +340,42 @@ module BareTest
|
|
330
340
|
rescue ::BareTest::Assertion::Failure, *::BareTest::Assertion::PassthroughExceptions
|
331
341
|
::Kernel.raise
|
332
342
|
rescue Exception => e
|
333
|
-
failure "Could not test whether %p is a
|
343
|
+
failure "Could not test whether %p is a kind of %p due to %s", actual, expected, e
|
344
|
+
end
|
345
|
+
|
346
|
+
# Raises a Failure if the given object is not an instance of the given class
|
347
|
+
def instance_of(*args)
|
348
|
+
expected, actual, message = extract_args(args, :expected, :actual, :message)
|
349
|
+
unless actual.instance_of?(expected) then
|
350
|
+
failure_with_optional_message \
|
351
|
+
"Expected %1$s to be an instance of %3$p, but was a %4$p",
|
352
|
+
"Expected %2$p to be an instance of %1$p, but was a %3$p",
|
353
|
+
message, expected, actual, actual.class
|
354
|
+
end
|
355
|
+
true
|
356
|
+
|
357
|
+
rescue ::BareTest::Assertion::Failure, *::BareTest::Assertion::PassthroughExceptions
|
358
|
+
::Kernel.raise
|
359
|
+
rescue Exception => e
|
360
|
+
failure "Could not test whether %p is an instance of %p due to %s", actual, expected, e
|
361
|
+
end
|
362
|
+
|
363
|
+
# Raises a Failure if the given object does not respond to all of the given
|
364
|
+
# method names. The method names may be specified as String or Symbol.
|
365
|
+
def respond_to(obj, *methods)
|
366
|
+
not_responded_to = methods.reject { |method_name| obj.respond_to?(method_name) }
|
367
|
+
unless not_responded_to.empty? then
|
368
|
+
must_respond_to = methods.map { |m| m.to_sym.inspect }.join(', ')
|
369
|
+
not_responded_to = not_responded_to.map { |m| m.to_sym.inspect }.join(', ')
|
370
|
+
failure "Expected %1$s to respond to all of %2$s, but it did not respond to %3$s",
|
371
|
+
obj, must_respond_to, not_responded_to
|
372
|
+
end
|
373
|
+
true
|
374
|
+
|
375
|
+
rescue ::BareTest::Assertion::Failure, *::BareTest::Assertion::PassthroughExceptions
|
376
|
+
::Kernel.raise
|
377
|
+
rescue Exception => e
|
378
|
+
failure "Could not test whether %p responds to %p due to %s", obj, methods, e
|
334
379
|
end
|
335
380
|
|
336
381
|
# A method to make raising failures that only optionally have a message easier.
|
@@ -356,7 +401,6 @@ module BareTest
|
|
356
401
|
raise ::BareTest::Assertion::Skip, sprintf(message, *args)
|
357
402
|
end
|
358
403
|
|
359
|
-
private
|
360
404
|
# extract arg allows to use named or positional args
|
361
405
|
#
|
362
406
|
# Example:
|
@@ -384,20 +428,3 @@ module BareTest
|
|
384
428
|
end
|
385
429
|
end # Assertion
|
386
430
|
end # BareTest
|
387
|
-
|
388
|
-
module Enumerable
|
389
|
-
|
390
|
-
# Part of BareTest - require 'baretest/assertion/support'
|
391
|
-
#
|
392
|
-
# Returns true if all elements of self occur the same amount of times in other, regardless
|
393
|
-
# of order. Uses +eql?+ to determine equality.
|
394
|
-
#
|
395
|
-
# Example:
|
396
|
-
# [2,1,3,2].equal_unordered?([3,2,2,1]) # => true
|
397
|
-
def equal_unordered?(other)
|
398
|
-
count = Hash.new(0)
|
399
|
-
other.each { |element| count[element] += 1 }
|
400
|
-
each { |element| count[element] -= 1 }
|
401
|
-
count.all? { |key, value| value.zero? }
|
402
|
-
end
|
403
|
-
end
|
@@ -0,0 +1,268 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright 2009-2010 by Stefan Rusterholz.
|
3
|
+
# All rights reserved.
|
4
|
+
# See LICENSE.txt for permissions.
|
5
|
+
#++
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
require 'baretest/assertion/context'
|
10
|
+
require 'baretest/assertion/failure'
|
11
|
+
require 'baretest/assertion/skip'
|
12
|
+
|
13
|
+
|
14
|
+
|
15
|
+
module BareTest
|
16
|
+
|
17
|
+
# The CommandLine module provides all the functionality the
|
18
|
+
# baretest executable uses in a programmatic way.
|
19
|
+
# It in fact even is what the baretest executable itself uses.
|
20
|
+
module CommandLine
|
21
|
+
|
22
|
+
# Load a formatter (see Run::new)
|
23
|
+
def load_formatter(format)
|
24
|
+
require "baretest/run/#{format}" if String === format
|
25
|
+
BareTest.format["baretest/run/#{format}"]
|
26
|
+
end
|
27
|
+
module_function :load_formatter
|
28
|
+
|
29
|
+
# Run the tests and display information about them.
|
30
|
+
# * arguments: array of dirs/globs of files to load and run as tests
|
31
|
+
# * options: a hash with options (all MUST be provided)
|
32
|
+
#
|
33
|
+
# :format => String - the formatter
|
34
|
+
# :interactive => Boolean - activate interactive mode (drops into irb on failure/error)
|
35
|
+
# :verbose => Boolean - provide verbose output
|
36
|
+
def run(arguments, options)
|
37
|
+
setup_path = nil
|
38
|
+
selectors = BareTest.process_selectors(arguments)
|
39
|
+
options = selectors.merge(options)
|
40
|
+
options[:persistence] ||= Persistence.new
|
41
|
+
|
42
|
+
# Load the setup file, all helper files and all test files
|
43
|
+
BareTest.load_standard_test_files(
|
44
|
+
:verbose => options[:verbose],
|
45
|
+
:setup_path => options[:setup_path],
|
46
|
+
:files => options[:files],
|
47
|
+
:chdir => '.'
|
48
|
+
)
|
49
|
+
|
50
|
+
# Run the tests
|
51
|
+
puts if options[:verbose]
|
52
|
+
ARGV.clear # IRB is being stupid
|
53
|
+
runner = BareTest::Run.new(BareTest.toplevel_suite, options)
|
54
|
+
runner.run_all
|
55
|
+
|
56
|
+
# Return whether all tests ran successful
|
57
|
+
runner.global_status == :success
|
58
|
+
end
|
59
|
+
module_function :run
|
60
|
+
|
61
|
+
# Create a basic skeleton of directories and files to contain baretests
|
62
|
+
# test-suite. Non-destructive (existing files won't be overriden or
|
63
|
+
# deleted).
|
64
|
+
def init(arguments, options)
|
65
|
+
core = %w[
|
66
|
+
test
|
67
|
+
test/external
|
68
|
+
test/helper
|
69
|
+
test/helper/suite
|
70
|
+
test/suite
|
71
|
+
]
|
72
|
+
mirror = {
|
73
|
+
'bin' => %w[test/helper/suite test/suite],
|
74
|
+
'lib' => %w[test/helper/suite test/suite],
|
75
|
+
'rake' => %w[test/helper/suite test/suite],
|
76
|
+
}
|
77
|
+
files = {
|
78
|
+
'test/setup.rb' => <<-END_OF_SETUP.gsub(/^ {10}/, '')
|
79
|
+
BareTest.require_ruby #{RUBY_VERSION.inspect}
|
80
|
+
BareTest.require_baretest #{BareTest::VERSION.to_a.first(3).join('.').inspect}
|
81
|
+
$LOAD_PATH.unshift(File.expand_path("\#{__FILE__}/../../lib")) # Add PROJECT/lib to $LOAD_PATH
|
82
|
+
END_OF_SETUP
|
83
|
+
}
|
84
|
+
|
85
|
+
puts "Creating all directories and files needed in #{File.expand_path('.')}"
|
86
|
+
core.each do |dir|
|
87
|
+
if File.exist?(dir) then
|
88
|
+
puts "Directory #{dir} exists already -- skipping"
|
89
|
+
else
|
90
|
+
puts "Creating #{dir}"
|
91
|
+
Dir.mkdir(dir)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
mirror.each do |path, destinations|
|
95
|
+
if File.exist?(path) then
|
96
|
+
destinations.each do |destination|
|
97
|
+
destination = File.join(destination,path)
|
98
|
+
if File.exist?(destination) then
|
99
|
+
puts "Mirror #{destination} of #{path} exists already -- skipping"
|
100
|
+
else
|
101
|
+
puts "Mirroring #{path} in #{destination}"
|
102
|
+
Dir.mkdir(destination)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
files.each do |path, data|
|
108
|
+
if File.exist?(path) then
|
109
|
+
puts "File #{path} exists already -- skipping"
|
110
|
+
else
|
111
|
+
puts "Writing #{path}"
|
112
|
+
File.open(path, 'wb') do |fh|
|
113
|
+
fh.write(data)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
module_function :init
|
119
|
+
|
120
|
+
# Shows all formats available in run's -f/--format option.
|
121
|
+
def formats(arguments, options)
|
122
|
+
puts "Available formats:"
|
123
|
+
Dir.glob("{#{$LOAD_PATH.join(',')}}/baretest/run/*.rb") { |path|
|
124
|
+
puts "- #{File.basename(path, '.rb')}"
|
125
|
+
}
|
126
|
+
end
|
127
|
+
module_function :formats
|
128
|
+
|
129
|
+
# List the available commands.
|
130
|
+
def commands(arguments, options)
|
131
|
+
colors = $stdout.tty?
|
132
|
+
|
133
|
+
description = <<-END_OF_DESCRIPTION.gsub(/^ {8}/, '') # |<- 80 cols ends here
|
134
|
+
\e[1mCOMMANDS\e[0m
|
135
|
+
|
136
|
+
The following commands are available in baretest:
|
137
|
+
|
138
|
+
\e[1mcommands\e[0m
|
139
|
+
List the available commands.
|
140
|
+
|
141
|
+
\e[1menv\e[0m
|
142
|
+
Show the baretest environment. This contains all data that influences
|
143
|
+
baretests behaviour. That is: ruby version, ruby engine, determined
|
144
|
+
test directory, stored data about this suite etc.
|
145
|
+
|
146
|
+
\e[1mformats\e[0m
|
147
|
+
Shows all formats available in \e[34mrun\e[0m's -f/--format option.
|
148
|
+
|
149
|
+
\e[1mhelp\e[0m
|
150
|
+
Provides help for all commands. Describes options, arguments and env
|
151
|
+
variables each command accepts.
|
152
|
+
|
153
|
+
\e[1minit\e[0m
|
154
|
+
Create a basic skeleton of directories and files to contain baretests test-
|
155
|
+
suite. Non-destructive (existing files won't be overriden or deleted).
|
156
|
+
|
157
|
+
\e[1mrun\e[0m (default command)
|
158
|
+
Run the tests and display information about them.
|
159
|
+
|
160
|
+
\e[1mselectors\e[0m
|
161
|
+
Detailed information about the selectors available to \e[34mrun\e[0m's
|
162
|
+
arguments.
|
163
|
+
|
164
|
+
\e[1mversion\e[0m
|
165
|
+
Show the baretest executable and library versions.
|
166
|
+
|
167
|
+
END_OF_DESCRIPTION
|
168
|
+
#'# |<- 80 cols ends here
|
169
|
+
description.gsub!(/\e.*?m/, '') unless colors
|
170
|
+
|
171
|
+
puts description
|
172
|
+
end
|
173
|
+
module_function :commands
|
174
|
+
|
175
|
+
# Detailed information about the selectors available to run's arguments.
|
176
|
+
def selectors(arguments, options)
|
177
|
+
colors = $stdout.tty?
|
178
|
+
|
179
|
+
description = <<-END_OF_DESCRIPTION.gsub(/^ {8}/, '') # |<- 80 cols ends here
|
180
|
+
\e[1mSELECTORS\e[0m
|
181
|
+
|
182
|
+
\e[1mDescription\e[0m
|
183
|
+
Selectors are used to identify what tests to run. Baretest knows 3 kinds of
|
184
|
+
selectors: globs, tags and last-run-states. All of these can be preceeded
|
185
|
+
with a minus sign (-), to negate the expression.
|
186
|
+
Beware that you must use negated expressions only after a -- separator,
|
187
|
+
as otherwise baretest will try to interpret them as short options (like -f).
|
188
|
+
|
189
|
+
\e[1mExample\e[0m
|
190
|
+
`baretest -- test/suite -test/suite/foo :a -:b #failure -#pending`
|
191
|
+
|
192
|
+
This will run all tests that
|
193
|
+
* Are in the directory test/suite or any of its subdirectories
|
194
|
+
* Are NOT in the directory test/suite/foo, or any of its subdirectories
|
195
|
+
* Have the tag 'a'
|
196
|
+
* Do NOT have the tag 'b'
|
197
|
+
* Terminated with a failure status on the last run
|
198
|
+
* Did NOT terminate with a pending status on the last run
|
199
|
+
|
200
|
+
\e[1mGlobs\e[0m
|
201
|
+
* '**' recursively matches all files and directories
|
202
|
+
* '*' wildcard, matches any amount of any character
|
203
|
+
* '?' wildcard, matches one character
|
204
|
+
* '{a,b,c}' alternation, matches any pattern in the comma separated list
|
205
|
+
* Directories are equivalent to `directory/**/*` patterns
|
206
|
+
|
207
|
+
\e[1mTags\e[0m
|
208
|
+
Tags are preceeded with an :.
|
209
|
+
Examples:
|
210
|
+
baretest :focus
|
211
|
+
baretest -- -:hocus
|
212
|
+
baretest -- :focus :important -:irrelevant -:obsolete
|
213
|
+
|
214
|
+
\e[1mLast-run-status\e[0m
|
215
|
+
Last run states are preceeded with a %.
|
216
|
+
* %success, %failure, %error, %skipped, %pending
|
217
|
+
* %error, %skipped and %pending are a subset of %failure
|
218
|
+
* %pending is a subset of %skipped
|
219
|
+
|
220
|
+
END_OF_DESCRIPTION
|
221
|
+
|
222
|
+
description.gsub!(/\e.*?m/, '') unless colors
|
223
|
+
|
224
|
+
puts description
|
225
|
+
end
|
226
|
+
module_function :selectors
|
227
|
+
|
228
|
+
# Provides help for all commands. Describes options, arguments and env
|
229
|
+
# variables each command accepts.
|
230
|
+
def help(arguments, options)
|
231
|
+
colors = $stdout.tty?
|
232
|
+
|
233
|
+
description = <<-END_OF_DESCRIPTION.gsub(/^ {8}/, '') # |<- 80 cols ends here
|
234
|
+
\e[1mHELP\e[0m
|
235
|
+
|
236
|
+
See `#{$0} commands` for a list of available commands.
|
237
|
+
You can also use `#{$0} COMMAND --help` to get information about
|
238
|
+
the command COMMAND.
|
239
|
+
END_OF_DESCRIPTION
|
240
|
+
|
241
|
+
description.gsub!(/\e.*?m/, '') unless colors
|
242
|
+
|
243
|
+
puts description
|
244
|
+
end
|
245
|
+
module_function :help
|
246
|
+
|
247
|
+
# Show the baretest environment. This contains all data that influences
|
248
|
+
# baretests behaviour. That is: ruby version, ruby engine, determined test
|
249
|
+
# directory, stored data about this suite etc.
|
250
|
+
def env(arguments, options)
|
251
|
+
puts "Versions:",
|
252
|
+
"* executable: #{Version}",
|
253
|
+
"* library: #{BareTest::VERSION}",
|
254
|
+
"* ruby #{RUBY_VERSION}",
|
255
|
+
""
|
256
|
+
end
|
257
|
+
module_function :env
|
258
|
+
|
259
|
+
# Show the baretest executable and library versions.
|
260
|
+
def version(arguments, options)
|
261
|
+
puts "baretest executable version #{Version}",
|
262
|
+
"library version #{BareTest::VERSION}",
|
263
|
+
"ruby version #{RUBY_VERSION}",
|
264
|
+
""
|
265
|
+
end
|
266
|
+
module_function :version
|
267
|
+
end
|
268
|
+
end
|