tap 0.7.9 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History +28 -0
- data/MIT-LICENSE +1 -1
- data/README +71 -43
- data/Rakefile +81 -64
- data/Tutorial +235 -0
- data/bin/tap +80 -44
- data/lib/tap.rb +41 -12
- data/lib/tap/app.rb +243 -246
- data/lib/tap/file_task.rb +357 -118
- data/lib/tap/generator.rb +88 -29
- data/lib/tap/generator/generators/config/config_generator.rb +4 -2
- data/lib/tap/generator/generators/config/templates/config.erb +1 -2
- data/lib/tap/generator/generators/file_task/file_task_generator.rb +3 -18
- data/lib/tap/generator/generators/file_task/templates/task.erb +22 -15
- data/lib/tap/generator/generators/file_task/templates/test.erb +13 -2
- data/{test/test/inference_methods/test_assert_files_exist/input/input_1.txt → lib/tap/generator/generators/generator/USAGE} +0 -0
- data/lib/tap/generator/generators/generator/generator_generator.rb +21 -0
- data/lib/tap/generator/generators/generator/templates/generator.erb +23 -0
- data/lib/tap/generator/generators/generator/templates/usage.erb +1 -0
- data/{test/test/inference_methods/test_assert_files_exist/input/input_2.txt → lib/tap/generator/generators/package/USAGE} +0 -0
- data/lib/tap/generator/generators/package/package_generator.rb +38 -0
- data/lib/tap/generator/generators/package/templates/package.erb +186 -0
- data/lib/tap/generator/generators/root/root_generator.rb +14 -9
- data/lib/tap/generator/generators/root/templates/Rakefile +20 -14
- data/{test/test/inference_methods/test_infer_glob/expected/file.yml → lib/tap/generator/generators/root/templates/ReadMe.txt} +0 -0
- data/lib/tap/generator/generators/root/templates/tap.yml +82 -0
- data/lib/tap/generator/generators/root/templates/test/tap_test_helper.rb +0 -1
- data/lib/tap/generator/generators/root/templates/test/tap_test_suite.rb +2 -1
- data/{test/test/inference_methods/test_infer_glob/expected/file_1.txt → lib/tap/generator/generators/script/USAGE} +0 -0
- data/lib/tap/generator/generators/script/script_generator.rb +17 -0
- data/lib/tap/generator/generators/script/templates/script.erb +42 -0
- data/lib/tap/generator/generators/task/task_generator.rb +1 -1
- data/lib/tap/generator/generators/task/templates/task.erb +24 -16
- data/lib/tap/generator/generators/task/templates/test.erb +13 -17
- data/lib/tap/generator/generators/workflow/templates/task.erb +10 -10
- data/lib/tap/generator/generators/workflow/templates/test.erb +1 -1
- data/lib/tap/generator/generators/workflow/workflow_generator.rb +3 -18
- data/lib/tap/root.rb +108 -146
- data/lib/tap/script.rb +362 -0
- data/lib/tap/script/console.rb +28 -0
- data/lib/tap/script/destroy.rb +13 -1
- data/lib/tap/script/generate.rb +13 -1
- data/lib/tap/script/run.rb +100 -57
- data/lib/tap/support/batch_queue.rb +0 -3
- data/lib/tap/support/logger.rb +6 -3
- data/lib/tap/support/rake.rb +54 -0
- data/lib/tap/support/task_configuration.rb +169 -0
- data/lib/tap/support/tdoc.rb +198 -0
- data/lib/tap/support/tdoc/config_attr.rb +338 -0
- data/lib/tap/support/tdoc/tdoc_html_generator.rb +38 -0
- data/lib/tap/support/tdoc/tdoc_html_template.rb +42 -0
- data/lib/tap/support/versions.rb +33 -1
- data/lib/tap/task.rb +339 -227
- data/lib/tap/test.rb +86 -128
- data/lib/tap/test/env_vars.rb +16 -5
- data/lib/tap/test/file_methods.rb +373 -0
- data/lib/tap/test/subset_methods.rb +299 -180
- data/lib/tap/version.rb +2 -1
- data/lib/tap/workflow.rb +2 -0
- data/test/app/lib/app_test_task.rb +1 -0
- data/test/app_test.rb +327 -83
- data/test/check/binding_eval.rb +23 -0
- data/test/check/define_method_check.rb +22 -0
- data/test/check/dependencies_check.rb +175 -0
- data/test/check/inheritance_check.rb +22 -0
- data/test/file_task_test.rb +524 -291
- data/test/{test/inference_methods/test_infer_glob/expected/file_2.txt → root/glob/one.txt} +0 -0
- data/test/root/glob/two.txt +0 -0
- data/test/root_test.rb +330 -262
- data/test/script_test.rb +194 -0
- data/test/support/audit_test.rb +5 -2
- data/test/support/combinator_test.rb +10 -10
- data/test/support/rake_test.rb +35 -0
- data/test/support/task_configuration_test.rb +272 -0
- data/test/support/tdoc_test.rb +363 -0
- data/test/support/templater_test.rb +2 -2
- data/test/support/versions_test.rb +32 -0
- data/test/tap_test_helper.rb +39 -0
- data/test/task_base_test.rb +115 -0
- data/test/task_class_test.rb +56 -4
- data/test/task_execute_test.rb +29 -0
- data/test/task_test.rb +89 -70
- data/test/test/env_vars_test.rb +48 -0
- data/test/test/{inference_methods → file_methods}/test_assert_expected/expected/file.txt +0 -0
- data/test/test/{inference_methods → file_methods}/test_assert_expected/expected/folder/file.txt +0 -0
- data/test/test/{inference_methods → file_methods}/test_assert_expected/input/file.txt +0 -0
- data/test/test/{inference_methods → file_methods}/test_assert_expected/input/folder/file.txt +0 -0
- data/test/test/file_methods/test_assert_files_exist/input/input_1.txt +0 -0
- data/test/test/file_methods/test_assert_files_exist/input/input_2.txt +0 -0
- data/test/test/file_methods/test_assert_output_files_equal/expected/one.txt +1 -0
- data/test/test/file_methods/test_assert_output_files_equal/expected/two.txt +1 -0
- data/test/test/file_methods/test_assert_output_files_equal/input/one.txt +1 -0
- data/test/test/file_methods/test_assert_output_files_equal/input/two.txt +1 -0
- data/test/test/{inference_methods → file_methods}/test_file_compare/expected/output_1.txt +0 -0
- data/test/test/{inference_methods → file_methods}/test_file_compare/expected/output_2.txt +0 -0
- data/test/test/{inference_methods → file_methods}/test_file_compare/input/input_1.txt +0 -0
- data/test/test/{inference_methods → file_methods}/test_file_compare/input/input_2.txt +0 -0
- data/test/test/file_methods/test_infer_glob/expected/file.yml +0 -0
- data/test/test/file_methods/test_infer_glob/expected/file_1.txt +0 -0
- data/test/test/file_methods/test_infer_glob/expected/file_2.txt +0 -0
- data/test/test/file_methods/test_method_glob/expected/file.yml +0 -0
- data/test/test/file_methods/test_method_glob/expected/file_1.txt +0 -0
- data/test/test/file_methods/test_method_glob/expected/file_2.txt +0 -0
- data/test/test/{inference_methods → file_methods}/test_yml_compare/expected/output_1.yml +0 -0
- data/test/test/{inference_methods → file_methods}/test_yml_compare/expected/output_2.yml +0 -0
- data/test/test/{inference_methods → file_methods}/test_yml_compare/input/input_1.yml +0 -0
- data/test/test/{inference_methods → file_methods}/test_yml_compare/input/input_2.yml +0 -0
- data/test/test/file_methods_test.rb +204 -0
- data/test/test/subset_methods_test.rb +93 -33
- data/test/test/test_assert_expected_result_files/expected/task/name/a.txt +1 -0
- data/test/test/test_assert_expected_result_files/expected/task/name/b.txt +1 -0
- data/test/test/test_assert_expected_result_files/input/a.txt +1 -0
- data/test/test/test_assert_expected_result_files/input/b.txt +1 -0
- data/test/test/test_file_task_test/expected/one.txt +1 -0
- data/test/test/test_file_task_test/expected/two.txt +1 -0
- data/test/test/test_file_task_test/input/one.txt +1 -0
- data/test/test/test_file_task_test/input/two.txt +1 -0
- data/test/test_test.rb +143 -3
- data/test/workflow_test.rb +2 -0
- data/vendor/rails_generator.rb +56 -0
- data/vendor/rails_generator/base.rb +263 -0
- data/vendor/rails_generator/commands.rb +581 -0
- data/vendor/rails_generator/generated_attribute.rb +42 -0
- data/vendor/rails_generator/lookup.rb +209 -0
- data/vendor/rails_generator/manifest.rb +53 -0
- data/vendor/rails_generator/options.rb +143 -0
- data/vendor/rails_generator/scripts.rb +83 -0
- data/vendor/rails_generator/scripts/destroy.rb +7 -0
- data/vendor/rails_generator/scripts/generate.rb +7 -0
- data/vendor/rails_generator/scripts/update.rb +12 -0
- data/vendor/rails_generator/simple_logger.rb +46 -0
- data/vendor/rails_generator/spec.rb +44 -0
- metadata +180 -196
- data/lib/tap/generator/generators/root/templates/app.yml +0 -19
- data/lib/tap/generator/generators/root/templates/config/process_tap_request.yml +0 -4
- data/lib/tap/generator/generators/root/templates/lib/process_tap_request.rb +0 -26
- data/lib/tap/generator/generators/root/templates/public/images/nav.jpg +0 -0
- data/lib/tap/generator/generators/root/templates/public/stylesheets/color.css +0 -57
- data/lib/tap/generator/generators/root/templates/public/stylesheets/layout.css +0 -108
- data/lib/tap/generator/generators/root/templates/public/stylesheets/normalize.css +0 -40
- data/lib/tap/generator/generators/root/templates/public/stylesheets/typography.css +0 -21
- data/lib/tap/generator/generators/root/templates/server/config/environment.rb +0 -60
- data/lib/tap/generator/generators/root/templates/server/lib/tasks/clear_database_prerequisites.rake +0 -5
- data/lib/tap/generator/generators/root/templates/server/test/test_helper.rb +0 -53
- data/lib/tap/script/server.rb +0 -12
- data/lib/tap/support/rap.rb +0 -38
- data/lib/tap/test/inference_methods.rb +0 -298
- data/test/task/config/task_with_config.yml +0 -1
- data/test/test/inference_methods_test.rb +0 -311
@@ -5,25 +5,106 @@ require 'tap/test/env_vars'
|
|
5
5
|
|
6
6
|
module Test # :nodoc:
|
7
7
|
module Unit # :nodoc:
|
8
|
-
|
8
|
+
# Methods extending TestCase. See the TestTutorial for more information.
|
9
|
+
class TestCase
|
9
10
|
class << self
|
11
|
+
include Tap::Test::EnvVars
|
12
|
+
|
13
|
+
# Passes conditions to subclass
|
14
|
+
def inherited(subclass) # :nodoc:
|
15
|
+
super
|
16
|
+
subclass_conditions = conditions.inject({}) do |memo, (key, value)|
|
17
|
+
memo.update(key => (value.dup rescue value))
|
18
|
+
end
|
19
|
+
subclass.instance_variable_set("@conditions", subclass_conditions)
|
20
|
+
|
21
|
+
# subclass_inputs = prompt_inputs.inject({}) do |memo, (key, value)|
|
22
|
+
# memo.update(key => (value.dup rescue value))
|
23
|
+
# end
|
24
|
+
# subclass.instance_variable_set("@prompt_inputs", subclass_inputs)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Experimental -- The idea is to provide a way to prompt once for inputs
|
28
|
+
# that get used multiple times in a test. Perhaps create accessors
|
29
|
+
# automatically?
|
30
|
+
|
31
|
+
# def prompt_inputs
|
32
|
+
# @prompt_inputs ||= {}
|
33
|
+
# end
|
34
|
+
|
35
|
+
# def require_inputs(*keys, &block)
|
36
|
+
# if run_subset?("PROMPT")
|
37
|
+
# puts "\n#{name} requires inputs -- Enter values or 'skip'."
|
38
|
+
|
39
|
+
# argv = ARGV.dup
|
40
|
+
# begin
|
41
|
+
# ARGV.clear
|
42
|
+
# keys.collect do |key|
|
43
|
+
# print "#{key}: "
|
44
|
+
# value = gets.strip
|
45
|
+
# if value =~ /skip/i
|
46
|
+
# skip_test "missing inputs"
|
47
|
+
# break
|
48
|
+
# end
|
49
|
+
# prompt_inputs[key] = value
|
50
|
+
# end
|
51
|
+
# ensure
|
52
|
+
# ARGV.clear
|
53
|
+
# ARGV.concat(argv)
|
54
|
+
# end
|
55
|
+
# else
|
56
|
+
# skip_test "prompt test"
|
57
|
+
# end
|
58
|
+
# end
|
59
|
+
|
60
|
+
#
|
61
|
+
# conditions
|
62
|
+
#
|
10
63
|
|
11
|
-
#
|
12
|
-
|
64
|
+
# A hash of defined conditions
|
65
|
+
def conditions
|
66
|
+
@conditions ||= {}
|
67
|
+
end
|
68
|
+
|
69
|
+
# Defines a condition block and associated message.
|
70
|
+
# Raises an error if no condition block is given.
|
71
|
+
def condition(name, msg=nil, &block)
|
72
|
+
raise "no condition block given" unless block_given?
|
73
|
+
conditions[name.to_sym] = [msg, block]
|
74
|
+
end
|
75
|
+
|
76
|
+
# Returns true if the all blocks for the named conditions return true.
|
13
77
|
#
|
14
|
-
#
|
78
|
+
# condition(:is_true) { true }
|
79
|
+
# condition(:is_false) { false }
|
80
|
+
# satisfied?(:is_true) # => true
|
81
|
+
# satisfied?(:is_true, :is_false) # => false
|
15
82
|
#
|
16
|
-
|
17
|
-
|
18
|
-
# end
|
19
|
-
def require_platform(*platforms, &block)
|
20
|
-
@platforms = platforms
|
21
|
-
yield if block_given? && match_platform?(*@platforms)
|
83
|
+
def satisfied?(*conditions)
|
84
|
+
unsatisfied_conditions(*conditions).empty?
|
22
85
|
end
|
23
|
-
|
86
|
+
|
87
|
+
# Returns an array of the unsatified conditions. Raises
|
88
|
+
# an error if the named condition has not been defined.
|
89
|
+
#
|
90
|
+
# condition(:is_true) { true }
|
91
|
+
# condition(:is_false) { false }
|
92
|
+
# unsatisfied_conditions(:is_true, :is_false) # => [:is_false]
|
93
|
+
#
|
94
|
+
def unsatisfied_conditions(*conditions)
|
95
|
+
conditions = self.conditions.keys if conditions.empty?
|
96
|
+
unsatified = []
|
97
|
+
conditions.each do |condition|
|
98
|
+
raise "Unknown condition: #{condition}" unless self.conditions.has_key?(condition)
|
99
|
+
unsatified << condition unless (self.conditions[condition.to_sym].last.call() ? true : false)
|
100
|
+
end
|
101
|
+
unsatified
|
102
|
+
end
|
103
|
+
|
24
104
|
# Returns true if RUBY_PLATFORM matches one of the specfied
|
25
|
-
# platforms. Use the prefix 'non_' to specify any plaform
|
26
|
-
# specified platform (ex: 'non_mswin')
|
105
|
+
# platforms. Use the prefix 'non_' to specify any plaform
|
106
|
+
# except the specified platform (ex: 'non_mswin'). Returns
|
107
|
+
# true if no platforms are specified.
|
27
108
|
#
|
28
109
|
# Some common platforms:
|
29
110
|
# - mswin:: Windows
|
@@ -39,8 +120,44 @@ module Test # :nodoc:
|
|
39
120
|
|
40
121
|
true
|
41
122
|
end
|
123
|
+
|
124
|
+
# Returns true if the subset type or 'ALL' is specified in ENV
|
125
|
+
def run_subset?(type)
|
126
|
+
env_true?(type) || env_true?("ALL") ? true : false
|
127
|
+
end
|
128
|
+
|
129
|
+
#
|
130
|
+
# Methods for skipping a test suite
|
131
|
+
#
|
132
|
+
attr_accessor :run_test_suite
|
133
|
+
|
134
|
+
# Returns run_test_suite, or true if run_test_suite is not set.
|
135
|
+
def run_test_suite?
|
136
|
+
run_test_suite.nil? ? true : run_test_suite
|
137
|
+
end
|
138
|
+
|
139
|
+
# Causes a test suite to be skipped. If a message is given, it will
|
140
|
+
# print and notify the user the test suite has been skipped.
|
141
|
+
def skip_test(msg=nil)
|
142
|
+
@run_test_suite = false
|
143
|
+
|
144
|
+
# experimental -- perhaps use this so that a test can be skipped
|
145
|
+
# for multiple reasons?
|
146
|
+
(@skip_messages ||= []) << msg unless msg.nil?
|
147
|
+
end
|
42
148
|
|
43
149
|
alias :original_suite :suite
|
150
|
+
|
151
|
+
# Modifies the default suite method to include/exclude tests based on platform.
|
152
|
+
def suite # :nodoc:
|
153
|
+
if run_test_suite?
|
154
|
+
original_suite
|
155
|
+
else
|
156
|
+
@skip_messages ||= []
|
157
|
+
puts "Skipping #{name}: #{@skip_messages.join(', ')}" unless @skip_messages.empty?
|
158
|
+
Test::Unit::TestSuite.new(name)
|
159
|
+
end
|
160
|
+
end
|
44
161
|
end
|
45
162
|
end
|
46
163
|
end
|
@@ -48,196 +165,149 @@ end
|
|
48
165
|
|
49
166
|
module Tap
|
50
167
|
module Test
|
168
|
+
|
169
|
+
# Ideally you always run all of your tests and they all run and pass everywhere. In
|
170
|
+
# practice it's useful to suppress the execution of some tests -- long running tests,
|
171
|
+
# tests specific for a given platform, or tests that depend on some condition, such
|
172
|
+
# as the version of some third-party software your code interacts with.
|
173
|
+
#
|
174
|
+
# SubsetMethods extends TestCase with methods for defining conditions that can be
|
175
|
+
# used to conditionally perform some action, or skip a test suite entirely. When
|
176
|
+
# you include SubsetMethods within a specific TestCase, additional methods are
|
177
|
+
# made available for filtering tests.
|
178
|
+
#
|
179
|
+
# require 'tap/test/subset_methods'
|
180
|
+
# class Test::Unit::TestCase
|
181
|
+
# # only true if running on windows
|
182
|
+
# condition(:windows) { match_platform?('mswin') }
|
183
|
+
#
|
184
|
+
# # only true if running on anything but windows
|
185
|
+
# condition(:non_windows) { match_platform?('non_mswin') }
|
186
|
+
# end
|
187
|
+
#
|
188
|
+
# class AfterHoursTest < Test::Unit::TestCase
|
189
|
+
# # only true between 6pm and 6am
|
190
|
+
# # (maybe you're not allowed to tie up a computer until after hours)
|
191
|
+
# condition(:afterhours) { Time.now > 18 || Time.now < 6 }
|
192
|
+
#
|
193
|
+
# skip_test unless satisfied?(:windows, :afterhours)
|
194
|
+
# end
|
195
|
+
#
|
196
|
+
# AfterHoursTest will only run between the hours of 6pm and 6am, on a Windows platform.
|
197
|
+
# These conditions can be used in specific tests, when only some tests need to be skipped.
|
198
|
+
#
|
199
|
+
# class RunOnlyAFewTest < Test::Unit::TestCase
|
200
|
+
# include SubsetMethods
|
201
|
+
# include Benchmark
|
202
|
+
#
|
203
|
+
# def test_runs_all_the_time
|
204
|
+
# assert true
|
205
|
+
# end
|
206
|
+
#
|
207
|
+
# def test_runs_only_if_afterhours_condition_is_true
|
208
|
+
# condition_test(:afterhours) do
|
209
|
+
# ...
|
210
|
+
# end
|
211
|
+
# end
|
212
|
+
#
|
213
|
+
# def test_runs_only_when_EXTENDED_is_true
|
214
|
+
# extended_test do
|
215
|
+
# ...
|
216
|
+
# end
|
217
|
+
# end
|
218
|
+
#
|
219
|
+
# def test_runs_only_when_BENCHMARK_is_true
|
220
|
+
# benchmark_test do |x|
|
221
|
+
# x.report("init speed") { 10000.times { Object.new } }
|
222
|
+
# end
|
223
|
+
# end
|
224
|
+
# end
|
225
|
+
#
|
226
|
+
# In the example, EXTENDED and BENCHMARK refer to environment (ENV) variables.
|
227
|
+
# ENV variables can be set from the command line like so:
|
228
|
+
#
|
229
|
+
# % tap run test extended=true
|
230
|
+
# % tap run test BENCHMARK=true
|
231
|
+
#
|
232
|
+
# In so far as SubsetMethods is concerned, the environment variables are case-insensitive.
|
233
|
+
# To run all tests that get switched using an environment variable, set ALL=true.
|
234
|
+
#
|
235
|
+
# == Class Methods
|
236
|
+
#
|
237
|
+
# See Test::Unit::TestCase for documentation of the class methods added by SubsetMethods
|
51
238
|
module SubsetMethods
|
52
239
|
include Tap::Test::EnvVars
|
240
|
+
|
241
|
+
def satisfied?(*conditions)
|
242
|
+
self.class.satisfied?(*conditions)
|
243
|
+
end
|
53
244
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
else
|
58
|
-
# if platforms are specfied for the tests and the platform does NOT
|
59
|
-
# match, remake the suite to skip all tests.
|
60
|
-
method_names = public_instance_methods(true)
|
61
|
-
suite = Test::Unit::TestSuite.new(name)
|
62
|
-
method_names.each do |method_name|
|
63
|
-
catch(:invalid_test) do
|
64
|
-
suite << new('on_test_skipped') if method_name =~ /^test/
|
65
|
-
end
|
66
|
-
end
|
67
|
-
suite
|
68
|
-
end
|
245
|
+
# Returns true if the subset type or 'ALL' is specified in ENV
|
246
|
+
def run_subset?(type)
|
247
|
+
self.class.run_subset?(type)
|
69
248
|
end
|
70
249
|
|
71
|
-
#
|
72
|
-
#
|
73
|
-
def
|
74
|
-
if
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
# Subset test declaration for extended tests -- type: EXTENDED
|
82
|
-
# Prints 'x' unless run.
|
83
|
-
def extended_test(&block)
|
84
|
-
subset_test("EXTENDED", "x", &block)
|
85
|
-
end
|
86
|
-
|
87
|
-
# Subset test declaration for benchmark tests -- type: BENCHMARK
|
88
|
-
# Prints 'b' unless run.
|
89
|
-
def benchmark_test(length=10, &block)
|
90
|
-
subset_test("BENCHMARK") do
|
91
|
-
puts
|
92
|
-
puts calling_method
|
93
|
-
bm(length) do |x|
|
94
|
-
yield(x)
|
95
|
-
end
|
96
|
-
end
|
250
|
+
# Returns true if the pretty-print string for obj matches the regexp specified in env_var(type).
|
251
|
+
# Returns the default value if 'ALL' is specified in ENV or type is not specified in ENV.
|
252
|
+
def match_regexp?(type, obj, default=true)
|
253
|
+
return true if env_true?("ALL")
|
254
|
+
return default unless env(type)
|
255
|
+
|
256
|
+
PP.singleline_pp(obj, '') =~ Regexp.new(env(type)) ? true : false
|
97
257
|
end
|
98
258
|
|
99
|
-
#
|
100
|
-
# be
|
101
|
-
# specified by providing a regexp in CASE; the testcase will run if the pretty-print of
|
102
|
-
# the testcase matches the provided regexp. Example:
|
259
|
+
# Platform-specific test. Useful for specifying test that should only
|
260
|
+
# be run on a subset of platforms. Prints ' ' if the test is not run.
|
103
261
|
#
|
104
|
-
#
|
105
|
-
#
|
106
|
-
# '[1, 2, 3]' => 'the pretty print of the array',
|
107
|
-
# 'another testcase' => 'some third testcase'
|
108
|
-
# ).do |testcase, expected|
|
109
|
-
# ...your test code...
|
262
|
+
# def test_only_on_windows
|
263
|
+
# platform_test('mswin') { ... }
|
110
264
|
# end
|
111
265
|
#
|
112
|
-
#
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
yield(testcase, expected) if match_regexp?("CASE", testcase)
|
119
|
-
end
|
266
|
+
# See TestCase#match_platform? for matching details.
|
267
|
+
def platform_test(*platforms)
|
268
|
+
if self.class.match_platform?(*platforms)
|
269
|
+
yield
|
270
|
+
else
|
271
|
+
print ' '
|
120
272
|
end
|
121
273
|
end
|
122
|
-
|
123
|
-
#
|
124
|
-
#
|
125
|
-
#
|
126
|
-
#
|
274
|
+
|
275
|
+
# Conditonal test. Only runs if the named conditions are satisfied.
|
276
|
+
# If no conditons are explicitly set, only runs if all conditions
|
277
|
+
# are satisfied.
|
278
|
+
#
|
279
|
+
# condition(:is_true) { true }
|
280
|
+
# condition(:is_false) { false }
|
127
281
|
#
|
128
|
-
#
|
129
|
-
#
|
130
|
-
# '[1, 2, 3]',
|
131
|
-
# 'another testcase'
|
132
|
-
# ).do |testcase|
|
133
|
-
# ...your test code...
|
282
|
+
# def test_only_if_true_is_satisfied
|
283
|
+
# condition_test(:is_true) { # runs }
|
134
284
|
# end
|
135
285
|
#
|
136
|
-
#
|
137
|
-
#
|
138
|
-
# ENV['CASE']='another' => only last test runs
|
139
|
-
def acase_test(*array)
|
140
|
-
if match_regexp?("CASE_TEST", calling_method)
|
141
|
-
array.each do |testcase|
|
142
|
-
yield(testcase) if match_regexp?("CASE", testcase)
|
143
|
-
end
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
|
148
|
-
# Subset test declaration for prompt tests -- type: PROMPT
|
149
|
-
# Prints 'p' unless run.
|
150
|
-
#
|
151
|
-
# Useful for tests that require user input. If run, then this test will
|
152
|
-
# prompt the user for an input for each item in the array. The results
|
153
|
-
# are collected in a hash and passed to the block.
|
154
|
-
#
|
155
|
-
# Example:
|
156
|
-
#
|
157
|
-
# def test_something_important
|
158
|
-
# prompt_test(:a, :b, :c).do |config|
|
159
|
-
# ...your test code...
|
160
|
-
# end
|
286
|
+
# def test_only_if_all_conditions_are_satisfied
|
287
|
+
# condition_test { # does not run }
|
161
288
|
# end
|
162
289
|
#
|
163
|
-
#
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
def prompt_test(*array, &block)
|
171
|
-
subset_test("PROMPT", "p") do
|
172
|
-
puts "\n#{calling_method} -- Enter values or 'skip'."
|
173
|
-
|
174
|
-
config = {}
|
175
|
-
array.each do |key|
|
176
|
-
print "#{key}: "
|
177
|
-
value = gets.strip
|
178
|
-
flunk "skipped test" if value =~ /skip/i
|
179
|
-
|
180
|
-
config[key] = value
|
181
|
-
end
|
182
|
-
|
183
|
-
yield(config)
|
290
|
+
# See TestCase#condition for more details.
|
291
|
+
def condition_test(*conditions)
|
292
|
+
unsatisfied_conditions = self.class.unsatisfied_conditions(*conditions)
|
293
|
+
if unsatisfied_conditions.empty?
|
294
|
+
yield
|
295
|
+
else
|
296
|
+
print ' '
|
184
297
|
end
|
185
298
|
end
|
186
|
-
|
187
|
-
protected
|
188
|
-
|
189
|
-
# Formats the input by using singleline_pp
|
190
|
-
def spp(input, str='')
|
191
|
-
PP.singleline_pp(input, str)
|
192
|
-
end
|
193
|
-
|
194
|
-
# Required for platform tests
|
195
|
-
def on_test_skipped
|
196
|
-
print ' '
|
197
|
-
end
|
198
|
-
|
199
|
-
# Returns true if the env_var(var) is set and matches /^true%/i
|
200
|
-
def env_true?(var)
|
201
|
-
env(var) && env(var) =~ /^true$/i
|
202
|
-
end
|
203
|
-
|
204
|
-
# Returns true if the subset type or 'ALL' is specified in ENV
|
205
|
-
def run_subset?(type)
|
206
|
-
env_true?(type) || env_true?("ALL") ? true : false
|
207
|
-
end
|
208
|
-
|
209
|
-
# Returns true if the pretty-print string for obj matches the regexp specified in env_var(type).
|
210
|
-
# Returns the default value if 'ALL' is specified in ENV or type is not specified in ENV.
|
211
|
-
def match_regexp?(type, obj, default=true)
|
212
|
-
return true if env_true?("ALL")
|
213
|
-
return default unless env(type)
|
214
|
-
|
215
|
-
spp(obj) =~ Regexp.new(env(type)) ? true : false
|
216
|
-
end
|
217
|
-
|
218
|
-
# Calling method iterates over the call stack, and returns the first calling
|
219
|
-
# method name that matches the input pattern (by default /^test/)
|
220
|
-
def calling_method(pattern=/^test/)
|
221
|
-
0.upto(caller.length) do |i|
|
222
|
-
caller[i] =~ /:in `(.*)'$/
|
223
|
-
method_name = $1
|
224
|
-
return method_name if method_name =~ pattern
|
225
|
-
end
|
226
299
|
|
227
|
-
''
|
228
|
-
end
|
229
|
-
|
230
300
|
# Basic method for a subset test. The provided block will run if:
|
231
301
|
# - The subset type or 'ALL' is specified in ENV
|
232
302
|
# - The calling method matches the regexp provided in the "TYPE_TEST" ENV variable
|
233
303
|
#
|
234
304
|
# Otherwise the block will be skipped and +skip+ will be printed. By default skip
|
235
305
|
# is the first letter of +type+.
|
236
|
-
def subset_test(type, skip=type[0..0].downcase
|
306
|
+
def subset_test(type, skip=type[0..0].downcase)
|
237
307
|
type = type.upcase
|
238
308
|
type_test = "#{type}_TEST"
|
239
309
|
if run_subset?(type) || env(type_test)
|
240
|
-
if match_regexp?(type_test,
|
310
|
+
if match_regexp?(type_test, method_name)
|
241
311
|
yield
|
242
312
|
else
|
243
313
|
print skip
|
@@ -247,12 +317,61 @@ module Tap
|
|
247
317
|
end
|
248
318
|
end
|
249
319
|
|
250
|
-
#
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
320
|
+
# Declares a subset_test for the ENV variable 'EXTENDED'.
|
321
|
+
# Prints 'x' if the test is not run.
|
322
|
+
#
|
323
|
+
# def test_some_long_process
|
324
|
+
# extended_test { ... }
|
325
|
+
# end
|
326
|
+
def extended_test(&block)
|
327
|
+
subset_test("EXTENDED", "x", &block)
|
328
|
+
end
|
329
|
+
|
330
|
+
# Declares a subset_test for the ENV variable 'BENCHMARK'. If run,
|
331
|
+
# benchmark_test sets up benchmarking using the bm method using the
|
332
|
+
# input length and block. As a result you MUST 'include Benchmark'
|
333
|
+
# in the test class. Prints 'b' if the test is not run.
|
334
|
+
#
|
335
|
+
# include Benchmark
|
336
|
+
# def test_speed
|
337
|
+
# benchmark_test(10) {|x| ... }
|
338
|
+
# end
|
339
|
+
def benchmark_test(length=10, &block)
|
340
|
+
subset_test("BENCHMARK") do
|
341
|
+
puts
|
342
|
+
puts method_name
|
343
|
+
bm(length, &block)
|
344
|
+
end
|
345
|
+
end
|
346
|
+
|
347
|
+
# Declares a subset_test for the ENV variable 'PROMPT'. When run, prompts
|
348
|
+
# the user for each input specified in array. Inputs will then be passed
|
349
|
+
# as a hash to the block. Prints 'p' unless run.
|
350
|
+
#
|
351
|
+
# def test_requiring_inputs
|
352
|
+
# prompt_test(:a, :b, :c) {|a, b, c| ... }
|
353
|
+
# end
|
354
|
+
#
|
355
|
+
# If run, the command line prompt will be like the following:
|
356
|
+
#
|
357
|
+
# test_requiring_inputs: Enter values or 'skip'
|
358
|
+
# a: avalue
|
359
|
+
# b: bvalue
|
360
|
+
# c: cvalue
|
361
|
+
#
|
362
|
+
# The block recieves ['avalue', 'bvalue', 'cvalue'].
|
363
|
+
def prompt_test(*keys, &block)
|
364
|
+
subset_test("PROMPT", "p") do
|
365
|
+
puts "\n#{method_name} -- Enter values or 'skip'."
|
366
|
+
|
367
|
+
values = keys.collect do |key|
|
368
|
+
print "#{key}: "
|
369
|
+
value = gets.strip
|
370
|
+
flunk "skipped test" if value =~ /skip/i
|
371
|
+
value
|
372
|
+
end
|
373
|
+
|
374
|
+
yield(*values)
|
256
375
|
end
|
257
376
|
end
|
258
377
|
end
|