tap 0.7.9 → 0.8.0
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/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
|