baretest 0.2.4 → 0.4.0.pre1
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/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
|