tap 0.7.9
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/MIT-LICENSE +21 -0
- data/README +71 -0
- data/Rakefile +117 -0
- data/bin/tap +63 -0
- data/lib/tap.rb +15 -0
- data/lib/tap/app.rb +739 -0
- data/lib/tap/file_task.rb +354 -0
- data/lib/tap/generator.rb +29 -0
- data/lib/tap/generator/generators/config/USAGE +0 -0
- data/lib/tap/generator/generators/config/config_generator.rb +23 -0
- data/lib/tap/generator/generators/config/templates/config.erb +2 -0
- data/lib/tap/generator/generators/file_task/USAGE +0 -0
- data/lib/tap/generator/generators/file_task/file_task_generator.rb +21 -0
- data/lib/tap/generator/generators/file_task/templates/task.erb +27 -0
- data/lib/tap/generator/generators/file_task/templates/test.erb +12 -0
- data/lib/tap/generator/generators/root/USAGE +0 -0
- data/lib/tap/generator/generators/root/root_generator.rb +36 -0
- data/lib/tap/generator/generators/root/templates/Rakefile +48 -0
- data/lib/tap/generator/generators/root/templates/app.yml +19 -0
- data/lib/tap/generator/generators/root/templates/config/process_tap_request.yml +4 -0
- data/lib/tap/generator/generators/root/templates/lib/process_tap_request.rb +26 -0
- data/lib/tap/generator/generators/root/templates/public/images/nav.jpg +0 -0
- data/lib/tap/generator/generators/root/templates/public/stylesheets/color.css +57 -0
- data/lib/tap/generator/generators/root/templates/public/stylesheets/layout.css +108 -0
- data/lib/tap/generator/generators/root/templates/public/stylesheets/normalize.css +40 -0
- data/lib/tap/generator/generators/root/templates/public/stylesheets/typography.css +21 -0
- data/lib/tap/generator/generators/root/templates/server/config/environment.rb +60 -0
- data/lib/tap/generator/generators/root/templates/server/lib/tasks/clear_database_prerequisites.rake +5 -0
- data/lib/tap/generator/generators/root/templates/server/test/test_helper.rb +53 -0
- data/lib/tap/generator/generators/root/templates/test/tap_test_helper.rb +3 -0
- data/lib/tap/generator/generators/root/templates/test/tap_test_suite.rb +4 -0
- data/lib/tap/generator/generators/task/USAGE +0 -0
- data/lib/tap/generator/generators/task/task_generator.rb +21 -0
- data/lib/tap/generator/generators/task/templates/task.erb +21 -0
- data/lib/tap/generator/generators/task/templates/test.erb +29 -0
- data/lib/tap/generator/generators/workflow/USAGE +0 -0
- data/lib/tap/generator/generators/workflow/templates/task.erb +16 -0
- data/lib/tap/generator/generators/workflow/templates/test.erb +7 -0
- data/lib/tap/generator/generators/workflow/workflow_generator.rb +21 -0
- data/lib/tap/generator/options.rb +26 -0
- data/lib/tap/generator/usage.rb +26 -0
- data/lib/tap/root.rb +275 -0
- data/lib/tap/script/console.rb +7 -0
- data/lib/tap/script/destroy.rb +8 -0
- data/lib/tap/script/generate.rb +8 -0
- data/lib/tap/script/run.rb +111 -0
- data/lib/tap/script/server.rb +12 -0
- data/lib/tap/support/audit.rb +415 -0
- data/lib/tap/support/batch_queue.rb +165 -0
- data/lib/tap/support/combinator.rb +114 -0
- data/lib/tap/support/logger.rb +91 -0
- data/lib/tap/support/rap.rb +38 -0
- data/lib/tap/support/run_error.rb +20 -0
- data/lib/tap/support/template.rb +81 -0
- data/lib/tap/support/templater.rb +155 -0
- data/lib/tap/support/versions.rb +63 -0
- data/lib/tap/task.rb +448 -0
- data/lib/tap/test.rb +320 -0
- data/lib/tap/test/env_vars.rb +16 -0
- data/lib/tap/test/inference_methods.rb +298 -0
- data/lib/tap/test/subset_methods.rb +260 -0
- data/lib/tap/version.rb +3 -0
- data/lib/tap/workflow.rb +73 -0
- data/test/app/config/addition_template.yml +6 -0
- data/test/app/config/batch.yml +2 -0
- data/test/app/config/empty.yml +0 -0
- data/test/app/config/erb.yml +1 -0
- data/test/app/config/template.yml +6 -0
- data/test/app/config/version-0.1.yml +1 -0
- data/test/app/config/version.yml +1 -0
- data/test/app/lib/app_test_task.rb +2 -0
- data/test/app_class_test.rb +33 -0
- data/test/app_test.rb +1372 -0
- data/test/file_task/config/batch.yml +2 -0
- data/test/file_task/config/configured.yml +1 -0
- data/test/file_task/old_file_one.txt +0 -0
- data/test/file_task/old_file_two.txt +0 -0
- data/test/file_task_test.rb +1041 -0
- data/test/root/alt_lib/alt_module.rb +4 -0
- data/test/root/lib/absolute_alt_filepath.rb +2 -0
- data/test/root/lib/alternative_filepath.rb +2 -0
- data/test/root/lib/another_module.rb +2 -0
- data/test/root/lib/nested/some_module.rb +4 -0
- data/test/root/lib/no_module_included.rb +0 -0
- data/test/root/lib/some/module.rb +4 -0
- data/test/root/lib/some_class.rb +2 -0
- data/test/root/lib/some_module.rb +3 -0
- data/test/root/load_path/load_path_module.rb +2 -0
- data/test/root/load_path/skip_module.rb +2 -0
- data/test/root/mtime/older.txt +0 -0
- data/test/root/unload/full_path.rb +2 -0
- data/test/root/unload/loaded_by_nested.rb +2 -0
- data/test/root/unload/nested/nested_load.rb +6 -0
- data/test/root/unload/nested/nested_with_ext.rb +4 -0
- data/test/root/unload/nested/relative_path.rb +4 -0
- data/test/root/unload/older.rb +2 -0
- data/test/root/unload/unload_base.rb +9 -0
- data/test/root/versions/another.yml +0 -0
- data/test/root/versions/file-0.1.2.yml +0 -0
- data/test/root/versions/file-0.1.yml +0 -0
- data/test/root/versions/file.yml +0 -0
- data/test/root_test.rb +483 -0
- data/test/support/audit_test.rb +449 -0
- data/test/support/batch_queue_test.rb +320 -0
- data/test/support/combinator_test.rb +249 -0
- data/test/support/logger_test.rb +31 -0
- data/test/support/template_test.rb +122 -0
- data/test/support/templater/erb.txt +2 -0
- data/test/support/templater/erb.yml +2 -0
- data/test/support/templater/somefile.txt +2 -0
- data/test/support/templater_test.rb +192 -0
- data/test/support/versions_test.rb +71 -0
- data/test/tap_test_helper.rb +4 -0
- data/test/tap_test_suite.rb +4 -0
- data/test/task/config/batch.yml +2 -0
- data/test/task/config/batched.yml +2 -0
- data/test/task/config/configured.yml +1 -0
- data/test/task/config/example.yml +1 -0
- data/test/task/config/overriding.yml +2 -0
- data/test/task/config/task_with_config.yml +1 -0
- data/test/task/config/template.yml +4 -0
- data/test/task_class_test.rb +118 -0
- data/test/task_execute_test.rb +233 -0
- data/test/task_test.rb +424 -0
- data/test/test/inference_methods/test_assert_expected/expected/file.txt +1 -0
- data/test/test/inference_methods/test_assert_expected/expected/folder/file.txt +1 -0
- data/test/test/inference_methods/test_assert_expected/input/file.txt +1 -0
- data/test/test/inference_methods/test_assert_expected/input/folder/file.txt +1 -0
- data/test/test/inference_methods/test_assert_files_exist/input/input_1.txt +0 -0
- data/test/test/inference_methods/test_assert_files_exist/input/input_2.txt +0 -0
- data/test/test/inference_methods/test_file_compare/expected/output_1.txt +3 -0
- data/test/test/inference_methods/test_file_compare/expected/output_2.txt +1 -0
- data/test/test/inference_methods/test_file_compare/input/input_1.txt +3 -0
- data/test/test/inference_methods/test_file_compare/input/input_2.txt +3 -0
- data/test/test/inference_methods/test_infer_glob/expected/file.yml +0 -0
- data/test/test/inference_methods/test_infer_glob/expected/file_1.txt +0 -0
- data/test/test/inference_methods/test_infer_glob/expected/file_2.txt +0 -0
- data/test/test/inference_methods/test_yml_compare/expected/output_1.yml +6 -0
- data/test/test/inference_methods/test_yml_compare/expected/output_2.yml +6 -0
- data/test/test/inference_methods/test_yml_compare/input/input_1.yml +4 -0
- data/test/test/inference_methods/test_yml_compare/input/input_2.yml +4 -0
- data/test/test/inference_methods_test.rb +311 -0
- data/test/test/subset_methods_test.rb +115 -0
- data/test/test_test.rb +233 -0
- data/test/workflow_test.rb +108 -0
- metadata +274 -0
data/test/task_test.rb
ADDED
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'tap_test_helper')
|
|
2
|
+
require 'tap/task'
|
|
3
|
+
|
|
4
|
+
# used in documentation test
|
|
5
|
+
class ConfiguredTask < Tap::Task
|
|
6
|
+
set_default_config :one => 'one', :two => 'two'
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
class TaskTest < Test::Unit::TestCase
|
|
10
|
+
include Tap
|
|
11
|
+
include Benchmark
|
|
12
|
+
|
|
13
|
+
acts_as_tap_test
|
|
14
|
+
attr_accessor :t
|
|
15
|
+
|
|
16
|
+
def setup
|
|
17
|
+
super
|
|
18
|
+
@t = Task.new
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def test_documentation
|
|
22
|
+
t = ConfiguredTask.new
|
|
23
|
+
assert_equal({:one => 'one', :two => 'two'}, t.config)
|
|
24
|
+
assert_equal("configured_task", t.name)
|
|
25
|
+
assert_equal(File.join(app[:config], "configured_task.yml"), t.config_file)
|
|
26
|
+
|
|
27
|
+
###
|
|
28
|
+
# [/path/to/app/config/example.yml]
|
|
29
|
+
# one: ONE
|
|
30
|
+
|
|
31
|
+
t = ConfiguredTask.new "example", :three => 'three'
|
|
32
|
+
assert_equal("example", t.name)
|
|
33
|
+
assert_equal(File.join(app[:config], "example.yml"), t.config_file)
|
|
34
|
+
assert_equal({:one => 'ONE', :two => 'two', :three => 'three'}, t.config)
|
|
35
|
+
|
|
36
|
+
###
|
|
37
|
+
runlist = []
|
|
38
|
+
t1 = Task.new {|task, input| runlist << input}
|
|
39
|
+
t1.enq 1
|
|
40
|
+
t1.enq 2,3
|
|
41
|
+
t1.app.run
|
|
42
|
+
|
|
43
|
+
assert_equal([1,2,3], runlist)
|
|
44
|
+
|
|
45
|
+
###
|
|
46
|
+
runlist = []
|
|
47
|
+
assert_equal([t1], t1.batch)
|
|
48
|
+
t2 = t1.create_batch_task
|
|
49
|
+
assert_equal([t1, t2], t1.batch)
|
|
50
|
+
|
|
51
|
+
t1.enq 1
|
|
52
|
+
t2.enq 2,3
|
|
53
|
+
t1.app.run
|
|
54
|
+
|
|
55
|
+
assert_equal([1,2,3, 1,2,3], runlist)
|
|
56
|
+
|
|
57
|
+
####
|
|
58
|
+
# [/path/to/app/config/batch.yml]
|
|
59
|
+
# - one: ONE
|
|
60
|
+
# - one: ANOTHER ONE
|
|
61
|
+
|
|
62
|
+
t = ConfiguredTask.new "batch"
|
|
63
|
+
assert_equal(2, t.batch.size)
|
|
64
|
+
t1, t2 = t.batch
|
|
65
|
+
|
|
66
|
+
assert_equal("batch", t1.name)
|
|
67
|
+
assert_equal({:one => 'ONE'}, t1.config_template)
|
|
68
|
+
assert_equal({:one => 'ONE', :two => 'two'}, t1.config)
|
|
69
|
+
|
|
70
|
+
assert_equal("batch", t2.name)
|
|
71
|
+
assert_equal({:one => 'ANOTHER ONE'}, t2.config_template)
|
|
72
|
+
assert_equal({:one => 'ANOTHER ONE', :two => 'two'}, t2.config)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
####
|
|
76
|
+
# [/path/to/app/config/template.yml]
|
|
77
|
+
# one: ONE
|
|
78
|
+
# variations!:
|
|
79
|
+
# - two: TWO
|
|
80
|
+
# - three: THREE
|
|
81
|
+
|
|
82
|
+
t = ConfiguredTask.new "template"
|
|
83
|
+
assert_equal(2, t.batch.size)
|
|
84
|
+
t1, t2 = t.batch
|
|
85
|
+
|
|
86
|
+
assert_equal({:one => 'ONE', :two => 'TWO'}, t1.config)
|
|
87
|
+
assert_equal({:one => 'ONE', :two => 'two', :three => 'THREE'}, t2.config)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
#
|
|
91
|
+
# initialization tests
|
|
92
|
+
#
|
|
93
|
+
|
|
94
|
+
def test_default_task_initialization
|
|
95
|
+
assert_equal App.instance, t.app
|
|
96
|
+
assert_equal [], t.results
|
|
97
|
+
assert_equal({}, t.config)
|
|
98
|
+
assert_equal({}, t.config_template)
|
|
99
|
+
assert_equal [t], t.batch
|
|
100
|
+
assert_nil t.condition_block
|
|
101
|
+
assert_nil t.task_block
|
|
102
|
+
assert_nil t.on_complete_block
|
|
103
|
+
assert !t.multithread
|
|
104
|
+
assert t.iterate
|
|
105
|
+
assert_equal "tap/task", t.name
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def test_task_init_speed
|
|
109
|
+
benchmark_test do |x|
|
|
110
|
+
x.report("10k") { 10000.times { Task.new } }
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def test_by_default_tasks_share_application_instance
|
|
115
|
+
t1 = Task.new
|
|
116
|
+
t2 = Task.new
|
|
117
|
+
|
|
118
|
+
assert_equal t1.app, t2.app
|
|
119
|
+
assert_equal App.instance, t1.app
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
class NamedTask < Task
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def test_name_is_initialized_to_task_class_underscored
|
|
126
|
+
t = NamedTask.new
|
|
127
|
+
assert_equal "task_test/named_task", t.name
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def test_name_configs_app_and_task_block_are_set_from_initialize
|
|
131
|
+
a = App.new
|
|
132
|
+
b = lambda {}
|
|
133
|
+
|
|
134
|
+
t = Task.new("name", {:key => 'value'}, a, &b)
|
|
135
|
+
assert_equal "name", t.name
|
|
136
|
+
assert_equal({:key => 'value'}, t.config)
|
|
137
|
+
assert_equal a, t.app
|
|
138
|
+
assert_equal b, t.task_block
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def test_config_template_is_loaded_from_config_file
|
|
142
|
+
t = Task.new "configured"
|
|
143
|
+
assert File.exists?(t.config_file)
|
|
144
|
+
assert_equal "key: value", File.read(t.config_file)
|
|
145
|
+
assert_equal({:key => 'value'}, t.config_template)
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def test_batched_tasks_are_defined_with_corresponding_config_template_for_batched_config_files
|
|
149
|
+
t = Task.new "batched"
|
|
150
|
+
assert File.exists?(t.config_file)
|
|
151
|
+
assert_equal "- key: first\n- key: second", File.read(t.config_file)
|
|
152
|
+
|
|
153
|
+
assert_equal 2, t.batch.size
|
|
154
|
+
|
|
155
|
+
t1, t2 = t.batch
|
|
156
|
+
assert_equal({:key => 'first'}, t1.config_template)
|
|
157
|
+
assert_equal({:key => 'second'}, t2.config_template)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def test_configs_are_merged_to_each_batched_task
|
|
161
|
+
t = Task.new "batched", :another => 'value'
|
|
162
|
+
t1, t2 = t.batch
|
|
163
|
+
assert_equal({:key => 'first', :another => 'value'}, t1.config)
|
|
164
|
+
assert_equal({:key => 'second', :another => 'value'}, t2.config)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
#
|
|
168
|
+
# create_batch_task test
|
|
169
|
+
#
|
|
170
|
+
|
|
171
|
+
def test_created_batch_tasks_are_added_to_and_share_the_same_batch
|
|
172
|
+
assert_equal [t], t.batch
|
|
173
|
+
|
|
174
|
+
t1 = t.create_batch_task
|
|
175
|
+
t2 = t1.create_batch_task
|
|
176
|
+
|
|
177
|
+
assert_equal [t, t1, t2], t.batch
|
|
178
|
+
assert_equal t.batch.object_id, t1.batch.object_id
|
|
179
|
+
assert_equal t.batch.object_id, t2.batch.object_id
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def test_create_batch_task_uses_input_template_and_overrides
|
|
183
|
+
t = TaskWithDefaultConfig.new "overriding", :three => 3
|
|
184
|
+
assert_equal({:one => 'one', :two => 'two', :three => 'three'}, t.class.default_config)
|
|
185
|
+
assert_equal({:two => 'TWO', :three => 'THREE'}, t.config_template)
|
|
186
|
+
assert_equal({:one => 'one', :two => 'TWO', :three => 3}, t.config)
|
|
187
|
+
|
|
188
|
+
t1 = t.create_batch_task
|
|
189
|
+
assert_equal({}, t1.config_template)
|
|
190
|
+
assert_equal({:one => 'one', :two => 'two', :three => 'three'}, t1.config)
|
|
191
|
+
|
|
192
|
+
t2 = t.create_batch_task({:two => "TWO", :three => "THREE"}, {:three => 3})
|
|
193
|
+
assert_equal({:two => "TWO", :three => "THREE"}, t2.config_template)
|
|
194
|
+
assert_equal({:one => 'one', :two => 'TWO', :three => 3}, t2.config)
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
#
|
|
198
|
+
# batched? test
|
|
199
|
+
#
|
|
200
|
+
|
|
201
|
+
def test_batched_returns_true_if_batch_size_is_greater_than_one
|
|
202
|
+
assert !t.batched?
|
|
203
|
+
assert_equal 1, t.batch.size
|
|
204
|
+
|
|
205
|
+
t1 = t.create_batch_task
|
|
206
|
+
|
|
207
|
+
assert t.batched?
|
|
208
|
+
assert t1.batched?
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
#
|
|
212
|
+
# batch_index test
|
|
213
|
+
#
|
|
214
|
+
|
|
215
|
+
def test_batch_index_returns_the_index_of_the_task_in_batch
|
|
216
|
+
t1 = t.create_batch_task
|
|
217
|
+
|
|
218
|
+
assert_equal [t, t1], t.batch
|
|
219
|
+
assert_equal 0, t.batch_index
|
|
220
|
+
assert_equal 1, t1.batch_index
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
#
|
|
224
|
+
# config_file test
|
|
225
|
+
#
|
|
226
|
+
|
|
227
|
+
def test_config_file_returns_yml_filepath_for_name_relative_to_app_config_dir
|
|
228
|
+
assert_equal File.join(t.app['config'], t.name + ".yml"), t.config_file
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
#
|
|
232
|
+
# multithread test
|
|
233
|
+
#
|
|
234
|
+
|
|
235
|
+
def test_multithread_returns_value_of_multithread
|
|
236
|
+
t.multithread = false
|
|
237
|
+
assert !t.multithread?
|
|
238
|
+
t.multithread = true
|
|
239
|
+
assert t.multithread?
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
#
|
|
243
|
+
# iterate test
|
|
244
|
+
#
|
|
245
|
+
|
|
246
|
+
def test_iterate_defaults_to_class_iterative_variable
|
|
247
|
+
assert Task.iterative
|
|
248
|
+
assert t.iterate?
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
def test_iterate_can_be_set
|
|
252
|
+
t.iterate = false
|
|
253
|
+
assert !t.iterate?
|
|
254
|
+
t.iterate = true
|
|
255
|
+
assert t.iterate?
|
|
256
|
+
end
|
|
257
|
+
|
|
258
|
+
#
|
|
259
|
+
# configuration tests
|
|
260
|
+
#
|
|
261
|
+
|
|
262
|
+
class TaskWithDefaultConfig < Task
|
|
263
|
+
set_default_config :one => 'one', :two => 'two', :three => 'three'
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
def test_config_sets_config
|
|
267
|
+
assert_equal({}, t.config)
|
|
268
|
+
t.config = {:key => 'value'}
|
|
269
|
+
assert_equal({:key => 'value'}, t.config)
|
|
270
|
+
end
|
|
271
|
+
|
|
272
|
+
def test_config_merges_class_defaults_and_config_template_and_inputs_in_order
|
|
273
|
+
t = TaskWithDefaultConfig.new "overriding"
|
|
274
|
+
assert_equal({:one => 'one', :two => 'two', :three => 'three'}, t.class.default_config)
|
|
275
|
+
assert_equal({:two => 'TWO', :three => 'THREE'}, t.config_template)
|
|
276
|
+
|
|
277
|
+
t.config = {:three => 3}
|
|
278
|
+
assert_equal({:one => 'one', :two => 'TWO', :three => 3}, t.config)
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
def test_nil_is_treated_as_empty_hash
|
|
282
|
+
t = TaskWithDefaultConfig.new "overriding"
|
|
283
|
+
assert_equal({:one => 'one', :two => 'two', :three => 'three'}, t.class.default_config)
|
|
284
|
+
assert_equal({:two => 'TWO', :three => 'THREE'}, t.config_template)
|
|
285
|
+
|
|
286
|
+
t.config[:three] = 3
|
|
287
|
+
assert_equal({:one => 'one', :two => 'TWO', :three => 3}, t.config)
|
|
288
|
+
|
|
289
|
+
t.config = nil
|
|
290
|
+
assert_equal({:one => 'one', :two => 'TWO', :three => 'THREE'}, t.config)
|
|
291
|
+
end
|
|
292
|
+
|
|
293
|
+
#
|
|
294
|
+
# condition block test
|
|
295
|
+
#
|
|
296
|
+
|
|
297
|
+
def test_condition_sets_condition_block
|
|
298
|
+
block = lambda {}
|
|
299
|
+
t.condition(&block)
|
|
300
|
+
assert_equal block, t.condition_block
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
def test_condition_can_only_be_set_once
|
|
304
|
+
t.condition {}
|
|
305
|
+
assert_raise(RuntimeError) { t.condition {} }
|
|
306
|
+
assert_raise(RuntimeError) { t.condition }
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
#
|
|
310
|
+
# executable? test
|
|
311
|
+
#
|
|
312
|
+
|
|
313
|
+
def test_executable_evaluates_condition_block_with_inputs
|
|
314
|
+
t.condition do |task, inputs|
|
|
315
|
+
inputs == [1,2,3]
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
assert t.executable?([1,2,3])
|
|
319
|
+
assert !t.executable?(1)
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
def test_executable_returns_true_if_condition_block_is_nil
|
|
323
|
+
assert_nil t.condition_block
|
|
324
|
+
assert t.executable?(nil)
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
#
|
|
328
|
+
# on_complete block test
|
|
329
|
+
#
|
|
330
|
+
|
|
331
|
+
def test_on_complete_sets_on_complete_block
|
|
332
|
+
block = lambda {}
|
|
333
|
+
t.on_complete(&block)
|
|
334
|
+
assert_equal block, t.on_complete_block
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
def test_on_complete_can_only_be_set_once
|
|
338
|
+
t.on_complete {}
|
|
339
|
+
assert_raise(RuntimeError) { t.on_complete {} }
|
|
340
|
+
assert_raise(RuntimeError) { t.on_complete }
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
#
|
|
344
|
+
# queue test
|
|
345
|
+
#
|
|
346
|
+
|
|
347
|
+
def test_queue_enqueues_task_to_app_queue_with_inputs
|
|
348
|
+
assert t.app.queue.empty?
|
|
349
|
+
|
|
350
|
+
t.enq 1
|
|
351
|
+
|
|
352
|
+
assert_equal 1, t.app.queue.size
|
|
353
|
+
assert_equal [t, [1]], t.app.queue.deq
|
|
354
|
+
|
|
355
|
+
t.enq 1
|
|
356
|
+
t.enq 2
|
|
357
|
+
|
|
358
|
+
assert_equal [t, [1,2]], t.app.queue.deq
|
|
359
|
+
end
|
|
360
|
+
|
|
361
|
+
#
|
|
362
|
+
# process test
|
|
363
|
+
#
|
|
364
|
+
|
|
365
|
+
def test_process_calls_task_block_with_input
|
|
366
|
+
b = lambda do |task, input|
|
|
367
|
+
runlist << input
|
|
368
|
+
input += 1
|
|
369
|
+
end
|
|
370
|
+
t = Task.new(&b)
|
|
371
|
+
|
|
372
|
+
assert_equal b, t.task_block
|
|
373
|
+
assert_equal 2, t.process(1)
|
|
374
|
+
assert_equal [1], runlist
|
|
375
|
+
end
|
|
376
|
+
|
|
377
|
+
def test_process_returns_input_if_task_block_is_not_set
|
|
378
|
+
t = Task.new
|
|
379
|
+
|
|
380
|
+
assert_nil t.task_block
|
|
381
|
+
assert_equal 1, t.process(1)
|
|
382
|
+
end
|
|
383
|
+
|
|
384
|
+
#
|
|
385
|
+
# synchronize tests
|
|
386
|
+
#
|
|
387
|
+
|
|
388
|
+
def test_tasks_publically_respond_to_synchronize
|
|
389
|
+
assert t.respond_to?(:synchronize)
|
|
390
|
+
was_in_block = false
|
|
391
|
+
t.synchronize { was_in_block = true }
|
|
392
|
+
assert was_in_block
|
|
393
|
+
end
|
|
394
|
+
|
|
395
|
+
def test_duplicate_tasks_are_monitored_separately
|
|
396
|
+
extended_test do
|
|
397
|
+
count = 0
|
|
398
|
+
max_count = 0
|
|
399
|
+
|
|
400
|
+
t1 = Task.new do |task, inputs|
|
|
401
|
+
task.synchronize do
|
|
402
|
+
count += 1
|
|
403
|
+
|
|
404
|
+
# max count will be 2 if both tasks execute
|
|
405
|
+
# simultaneously (ie they are monitored
|
|
406
|
+
# separately)
|
|
407
|
+
max_count = count if count > max_count
|
|
408
|
+
sleep 0.1
|
|
409
|
+
count -= 1
|
|
410
|
+
end
|
|
411
|
+
end
|
|
412
|
+
t2 = t1.dup
|
|
413
|
+
|
|
414
|
+
th_1 = Thread.new { t1.execute nil }
|
|
415
|
+
th_2 = Thread.new { t2.execute nil }
|
|
416
|
+
|
|
417
|
+
th_1.join
|
|
418
|
+
th_2.join
|
|
419
|
+
|
|
420
|
+
assert_equal 0, count
|
|
421
|
+
assert_equal 2, max_count
|
|
422
|
+
end
|
|
423
|
+
end
|
|
424
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
folder/file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
folder/file
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
different content
|