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.
Files changed (146) hide show
  1. data/MIT-LICENSE +21 -0
  2. data/README +71 -0
  3. data/Rakefile +117 -0
  4. data/bin/tap +63 -0
  5. data/lib/tap.rb +15 -0
  6. data/lib/tap/app.rb +739 -0
  7. data/lib/tap/file_task.rb +354 -0
  8. data/lib/tap/generator.rb +29 -0
  9. data/lib/tap/generator/generators/config/USAGE +0 -0
  10. data/lib/tap/generator/generators/config/config_generator.rb +23 -0
  11. data/lib/tap/generator/generators/config/templates/config.erb +2 -0
  12. data/lib/tap/generator/generators/file_task/USAGE +0 -0
  13. data/lib/tap/generator/generators/file_task/file_task_generator.rb +21 -0
  14. data/lib/tap/generator/generators/file_task/templates/task.erb +27 -0
  15. data/lib/tap/generator/generators/file_task/templates/test.erb +12 -0
  16. data/lib/tap/generator/generators/root/USAGE +0 -0
  17. data/lib/tap/generator/generators/root/root_generator.rb +36 -0
  18. data/lib/tap/generator/generators/root/templates/Rakefile +48 -0
  19. data/lib/tap/generator/generators/root/templates/app.yml +19 -0
  20. data/lib/tap/generator/generators/root/templates/config/process_tap_request.yml +4 -0
  21. data/lib/tap/generator/generators/root/templates/lib/process_tap_request.rb +26 -0
  22. data/lib/tap/generator/generators/root/templates/public/images/nav.jpg +0 -0
  23. data/lib/tap/generator/generators/root/templates/public/stylesheets/color.css +57 -0
  24. data/lib/tap/generator/generators/root/templates/public/stylesheets/layout.css +108 -0
  25. data/lib/tap/generator/generators/root/templates/public/stylesheets/normalize.css +40 -0
  26. data/lib/tap/generator/generators/root/templates/public/stylesheets/typography.css +21 -0
  27. data/lib/tap/generator/generators/root/templates/server/config/environment.rb +60 -0
  28. data/lib/tap/generator/generators/root/templates/server/lib/tasks/clear_database_prerequisites.rake +5 -0
  29. data/lib/tap/generator/generators/root/templates/server/test/test_helper.rb +53 -0
  30. data/lib/tap/generator/generators/root/templates/test/tap_test_helper.rb +3 -0
  31. data/lib/tap/generator/generators/root/templates/test/tap_test_suite.rb +4 -0
  32. data/lib/tap/generator/generators/task/USAGE +0 -0
  33. data/lib/tap/generator/generators/task/task_generator.rb +21 -0
  34. data/lib/tap/generator/generators/task/templates/task.erb +21 -0
  35. data/lib/tap/generator/generators/task/templates/test.erb +29 -0
  36. data/lib/tap/generator/generators/workflow/USAGE +0 -0
  37. data/lib/tap/generator/generators/workflow/templates/task.erb +16 -0
  38. data/lib/tap/generator/generators/workflow/templates/test.erb +7 -0
  39. data/lib/tap/generator/generators/workflow/workflow_generator.rb +21 -0
  40. data/lib/tap/generator/options.rb +26 -0
  41. data/lib/tap/generator/usage.rb +26 -0
  42. data/lib/tap/root.rb +275 -0
  43. data/lib/tap/script/console.rb +7 -0
  44. data/lib/tap/script/destroy.rb +8 -0
  45. data/lib/tap/script/generate.rb +8 -0
  46. data/lib/tap/script/run.rb +111 -0
  47. data/lib/tap/script/server.rb +12 -0
  48. data/lib/tap/support/audit.rb +415 -0
  49. data/lib/tap/support/batch_queue.rb +165 -0
  50. data/lib/tap/support/combinator.rb +114 -0
  51. data/lib/tap/support/logger.rb +91 -0
  52. data/lib/tap/support/rap.rb +38 -0
  53. data/lib/tap/support/run_error.rb +20 -0
  54. data/lib/tap/support/template.rb +81 -0
  55. data/lib/tap/support/templater.rb +155 -0
  56. data/lib/tap/support/versions.rb +63 -0
  57. data/lib/tap/task.rb +448 -0
  58. data/lib/tap/test.rb +320 -0
  59. data/lib/tap/test/env_vars.rb +16 -0
  60. data/lib/tap/test/inference_methods.rb +298 -0
  61. data/lib/tap/test/subset_methods.rb +260 -0
  62. data/lib/tap/version.rb +3 -0
  63. data/lib/tap/workflow.rb +73 -0
  64. data/test/app/config/addition_template.yml +6 -0
  65. data/test/app/config/batch.yml +2 -0
  66. data/test/app/config/empty.yml +0 -0
  67. data/test/app/config/erb.yml +1 -0
  68. data/test/app/config/template.yml +6 -0
  69. data/test/app/config/version-0.1.yml +1 -0
  70. data/test/app/config/version.yml +1 -0
  71. data/test/app/lib/app_test_task.rb +2 -0
  72. data/test/app_class_test.rb +33 -0
  73. data/test/app_test.rb +1372 -0
  74. data/test/file_task/config/batch.yml +2 -0
  75. data/test/file_task/config/configured.yml +1 -0
  76. data/test/file_task/old_file_one.txt +0 -0
  77. data/test/file_task/old_file_two.txt +0 -0
  78. data/test/file_task_test.rb +1041 -0
  79. data/test/root/alt_lib/alt_module.rb +4 -0
  80. data/test/root/lib/absolute_alt_filepath.rb +2 -0
  81. data/test/root/lib/alternative_filepath.rb +2 -0
  82. data/test/root/lib/another_module.rb +2 -0
  83. data/test/root/lib/nested/some_module.rb +4 -0
  84. data/test/root/lib/no_module_included.rb +0 -0
  85. data/test/root/lib/some/module.rb +4 -0
  86. data/test/root/lib/some_class.rb +2 -0
  87. data/test/root/lib/some_module.rb +3 -0
  88. data/test/root/load_path/load_path_module.rb +2 -0
  89. data/test/root/load_path/skip_module.rb +2 -0
  90. data/test/root/mtime/older.txt +0 -0
  91. data/test/root/unload/full_path.rb +2 -0
  92. data/test/root/unload/loaded_by_nested.rb +2 -0
  93. data/test/root/unload/nested/nested_load.rb +6 -0
  94. data/test/root/unload/nested/nested_with_ext.rb +4 -0
  95. data/test/root/unload/nested/relative_path.rb +4 -0
  96. data/test/root/unload/older.rb +2 -0
  97. data/test/root/unload/unload_base.rb +9 -0
  98. data/test/root/versions/another.yml +0 -0
  99. data/test/root/versions/file-0.1.2.yml +0 -0
  100. data/test/root/versions/file-0.1.yml +0 -0
  101. data/test/root/versions/file.yml +0 -0
  102. data/test/root_test.rb +483 -0
  103. data/test/support/audit_test.rb +449 -0
  104. data/test/support/batch_queue_test.rb +320 -0
  105. data/test/support/combinator_test.rb +249 -0
  106. data/test/support/logger_test.rb +31 -0
  107. data/test/support/template_test.rb +122 -0
  108. data/test/support/templater/erb.txt +2 -0
  109. data/test/support/templater/erb.yml +2 -0
  110. data/test/support/templater/somefile.txt +2 -0
  111. data/test/support/templater_test.rb +192 -0
  112. data/test/support/versions_test.rb +71 -0
  113. data/test/tap_test_helper.rb +4 -0
  114. data/test/tap_test_suite.rb +4 -0
  115. data/test/task/config/batch.yml +2 -0
  116. data/test/task/config/batched.yml +2 -0
  117. data/test/task/config/configured.yml +1 -0
  118. data/test/task/config/example.yml +1 -0
  119. data/test/task/config/overriding.yml +2 -0
  120. data/test/task/config/task_with_config.yml +1 -0
  121. data/test/task/config/template.yml +4 -0
  122. data/test/task_class_test.rb +118 -0
  123. data/test/task_execute_test.rb +233 -0
  124. data/test/task_test.rb +424 -0
  125. data/test/test/inference_methods/test_assert_expected/expected/file.txt +1 -0
  126. data/test/test/inference_methods/test_assert_expected/expected/folder/file.txt +1 -0
  127. data/test/test/inference_methods/test_assert_expected/input/file.txt +1 -0
  128. data/test/test/inference_methods/test_assert_expected/input/folder/file.txt +1 -0
  129. data/test/test/inference_methods/test_assert_files_exist/input/input_1.txt +0 -0
  130. data/test/test/inference_methods/test_assert_files_exist/input/input_2.txt +0 -0
  131. data/test/test/inference_methods/test_file_compare/expected/output_1.txt +3 -0
  132. data/test/test/inference_methods/test_file_compare/expected/output_2.txt +1 -0
  133. data/test/test/inference_methods/test_file_compare/input/input_1.txt +3 -0
  134. data/test/test/inference_methods/test_file_compare/input/input_2.txt +3 -0
  135. data/test/test/inference_methods/test_infer_glob/expected/file.yml +0 -0
  136. data/test/test/inference_methods/test_infer_glob/expected/file_1.txt +0 -0
  137. data/test/test/inference_methods/test_infer_glob/expected/file_2.txt +0 -0
  138. data/test/test/inference_methods/test_yml_compare/expected/output_1.yml +6 -0
  139. data/test/test/inference_methods/test_yml_compare/expected/output_2.yml +6 -0
  140. data/test/test/inference_methods/test_yml_compare/input/input_1.yml +4 -0
  141. data/test/test/inference_methods/test_yml_compare/input/input_2.yml +4 -0
  142. data/test/test/inference_methods_test.rb +311 -0
  143. data/test/test/subset_methods_test.rb +115 -0
  144. data/test/test_test.rb +233 -0
  145. data/test/workflow_test.rb +108 -0
  146. metadata +274 -0
@@ -0,0 +1,449 @@
1
+ require File.dirname(__FILE__) + '/../tap_test_helper'
2
+ require 'tap/support/audit'
3
+
4
+ class AuditTest < Test::Unit::TestCase
5
+ include Tap::Support
6
+
7
+ attr_reader :audit, :a, :b
8
+
9
+ def setup
10
+ @audit = Audit.new('original')
11
+ @a = setup_audit(:a, :b, :c)
12
+ @b = setup_audit(:x, :y, :z)
13
+ end
14
+
15
+ #
16
+ # class methods tests
17
+ #
18
+
19
+ def test_register_creates_an_audit_for_each_input_as_needed
20
+ registered = Audit.register(1, a, 2)
21
+
22
+ registered.each {|r| assert_equal Audit, r.class}
23
+ assert_equal a.object_id, registered[1].object_id
24
+ assert_equal [1, 'c', 2], registered.collect {|r| r._current}
25
+ end
26
+
27
+ def test_merge_with_multiple_inputs_merges_inputs
28
+ m = Audit.merge(1, a, 2)
29
+
30
+ assert_equal [[1, 'c', 2]], m._values
31
+ assert_equal [[nil, a, nil]], m._sources
32
+ end
33
+
34
+ def test_merge_with_a_single_non_audit_input_returns_new_audit
35
+ m = Audit.merge(1)
36
+
37
+ assert_equal [1], m._values
38
+ assert_equal [nil], m._sources
39
+ end
40
+
41
+ def test_merge_with_a_single_audit_input_returns_fork
42
+ m = Audit.merge(a)
43
+
44
+ assert_not_equal a.object_id, m.object_id
45
+ assert_equal a._values, m._values
46
+ assert_equal a._sources, m._sources
47
+ end
48
+
49
+ def test_merge_with_no_inputs_returns_audit_initialized_to_nil
50
+ m = Audit.merge
51
+
52
+ assert_equal [nil], m._values
53
+ assert_equal [nil], m._sources
54
+ end
55
+
56
+ def test_merge_documentation
57
+ a = Audit.new(1)
58
+ b = Audit.merge(a, 2)
59
+ assert_equal [[1,2]], b._values
60
+ assert_equal [[a, nil]], b._sources
61
+ end
62
+
63
+ #
64
+ # methods to setup audits for testing, and tests of the setup
65
+ #
66
+
67
+ def setup_audit(*sources)
68
+ audit = Audit.new
69
+ sources.each do |source|
70
+ value = case source
71
+ when Array
72
+ source.collect {|s| s.to_s }
73
+ else
74
+ source.to_s
75
+ end
76
+
77
+ audit._record(source, value)
78
+ end
79
+ audit
80
+ end
81
+
82
+ def test_setup
83
+ assert_equal [nil], audit._sources
84
+ assert_equal ['original'], audit._values
85
+ assert_equal 'original', audit._original
86
+ assert_equal 'original', audit._current
87
+
88
+ assert_equal [nil, :a, :b, :c], a._sources
89
+ assert_equal [nil, 'a', 'b', 'c'], a._values
90
+ assert_equal 'c', a._current
91
+ assert_equal nil, a._original
92
+
93
+ assert_equal [nil, :x, :y, :z], b._sources
94
+ assert_equal [nil, 'x', 'y', 'z'], b._values
95
+ assert_equal 'z', b._current
96
+ assert_equal nil, b._original
97
+
98
+ c = setup_audit([a, b, :c])
99
+ assert_equal [nil, [a, b, :c]], c._sources
100
+ assert_equal [nil, [a.to_s, b.to_s, 'c']], c._values
101
+ end
102
+
103
+ #
104
+ # record tests
105
+ #
106
+
107
+ def test_record
108
+ audit._record(:a, 'next')
109
+ audit._record(:b, 'final')
110
+
111
+ assert_equal [nil, :a, :b], audit._sources
112
+ assert_equal ['original', 'next', 'final'], audit._values
113
+ end
114
+
115
+ def test_record_with_arrays_and_audits
116
+ audit._record(:a, a)
117
+ audit._record(:array, [a, b, 'str'])
118
+
119
+ assert_equal [nil, :a, :array], audit._sources
120
+ assert_equal ['original', a, [a, b, 'str']], audit._values
121
+ end
122
+
123
+ def test_record_returns_self
124
+ assert audit._eql( audit._record(:a, 'next') )
125
+ end
126
+
127
+ #
128
+ # original tests
129
+ #
130
+
131
+ def test_original_is_first_recorded_value
132
+ a = Audit.new('a', :a)
133
+ assert_equal 'a', a._original
134
+
135
+ audit._record(:b, 'next')
136
+ assert_equal 'a', a._original
137
+ end
138
+
139
+ def test_original_source_is_original_recorded_source
140
+ a = Audit.new('a', :a)
141
+ assert_equal :a, a._original_source
142
+
143
+ audit._record(:b, 'next')
144
+ assert_equal :a, a._original_source
145
+ end
146
+
147
+ #
148
+ # current tests
149
+ #
150
+
151
+ def test_current_is_last_recorded_value
152
+ audit._record(:a, 'next')
153
+ assert_equal 'next', audit._current
154
+
155
+ audit._record(:a, 'final')
156
+ assert_equal 'final', audit._current
157
+ end
158
+
159
+ def test_current_source_is_last_recorded_source
160
+ audit._record(:a, 'next')
161
+ assert_equal :a, audit._current_source
162
+
163
+ audit._record(:b, 'final')
164
+ assert_equal :b, audit._current_source
165
+ end
166
+
167
+ #
168
+ # last tests
169
+ #
170
+
171
+ def test_last_is_value_of_last_source_equalling_input
172
+ assert_equal 'a', a._last(:a)
173
+
174
+ a._record(:a, 'next')
175
+ assert_equal 'next', a._last(:a)
176
+
177
+ a._record(:b, 'does not affect last :a')
178
+ assert_equal 'next', a._last(:a)
179
+ end
180
+
181
+ def test_index_last_is_index_of_last_source_equalling_input
182
+ assert_equal 1, a._index_last(:a)
183
+
184
+ a._record(:a, 'next')
185
+ assert_equal 4, a._index_last(:a)
186
+
187
+ a._record(:b, 'does not affect last :a')
188
+ assert_equal 4, a._index_last(:a)
189
+ end
190
+
191
+ #
192
+ # input accessor tests
193
+ #
194
+
195
+ def test_input_returns_value_at_index
196
+ assert_equal 'c', a._input(3)
197
+ assert_equal 'c', a._input(-1)
198
+ end
199
+
200
+ def test_input_last_is_value_previous_to_matching_source
201
+ assert_equal nil, a._input_last(:a)
202
+
203
+ a._record(:a, 'next')
204
+ assert_equal 'c', a._input_last(:a)
205
+
206
+ a._record(:b, 'does not affect input last :a')
207
+ assert_equal 'c', a._input_last(:a)
208
+ end
209
+
210
+ #
211
+ # output accessor tests
212
+ #
213
+
214
+ def test_output_is_value_of_next_index
215
+ assert_equal 'c', a._output(2)
216
+ assert_equal 'c', a._output(-2)
217
+
218
+ assert_nil a._output(3)
219
+ assert_nil a._output(-1)
220
+ end
221
+
222
+ def test_output_last_is_value_of_matching_source
223
+ assert_equal 'a', a._output_last(:a)
224
+
225
+ a._record(:a, 'next')
226
+ assert_equal 'next', a._output_last(:a)
227
+
228
+ a._record(:b, 'does not affect output last :a')
229
+ assert_equal 'next', a._output_last(:a)
230
+ end
231
+
232
+ #
233
+ # source trail tests
234
+ #
235
+
236
+ def test_source_trail_helper_method_is_hidden
237
+ assert !a.respond_to?(:source_trail)
238
+ assert_raise(NoMethodError) { a.source_trail }
239
+ end
240
+
241
+ def test_source_trail_returns_all_sources
242
+ a = setup_audit(:a, :b, :c)
243
+
244
+ assert_equal [nil, :a, :b, :c], a._source_trail
245
+ end
246
+
247
+ def test_source_trail_returns_source_trail_when_source_is_an_audit
248
+ c = setup_audit(:p, a, :q)
249
+
250
+ assert_equal [nil, :p, a, :q], c._sources
251
+ assert_equal [nil, :p, [nil, :a, :b, :c], :q], c._source_trail
252
+ end
253
+
254
+ def test_source_trail_resolves_each_member_in_an_arrays_of_sources
255
+ c = setup_audit(:p, [a, b, :q], [:r, :s], :t)
256
+
257
+ assert_equal [nil, :p, [[nil, :a, :b, :c], [nil, :x, :y, :z], :q],[:r, :s], :t], c._source_trail
258
+ end
259
+
260
+ #
261
+ # value trail tests
262
+ #
263
+
264
+ def test_value_trail_helper_method_is_hidden
265
+ assert !a.respond_to?(:value_trail)
266
+ assert_raise(NoMethodError) { a.value_trail }
267
+ end
268
+
269
+ def test_value_trail_returns_all_values
270
+ a = setup_audit(:a, :b, :c)
271
+
272
+ assert_equal [nil, 'a', 'b', 'c'], a._value_trail
273
+ end
274
+
275
+ def test_value_trail_returns_value_trail_when_source_is_an_audit
276
+ c = setup_audit(:p, a, :q)
277
+
278
+ assert_equal [nil, :p, a, :q], c._sources
279
+ assert_equal [nil, 'p', [nil, 'a', 'b', 'c'], 'q'], c._value_trail
280
+ end
281
+
282
+ def test_value_trail_resolves_each_member_in_an_arrays_of_sources
283
+ c = setup_audit(:p, [a, b, :q], [:r, :s], :t)
284
+
285
+ assert_equal [nil, 'p', [[nil, 'a', 'b', 'c'], [nil, 'x', 'y', 'z'], 'q'],['r', 's'], 't'], c._value_trail
286
+ end
287
+
288
+ #
289
+ # merge tests
290
+ #
291
+
292
+ def test_merge_returns_new_audit_with_self_added_to_sources_and_value_as_array_of_current_values
293
+ c = a._merge(b, 'p')
294
+ c._record(:q, 'q')
295
+ c._record(:r, 'r')
296
+
297
+ assert_equal [[a, b, nil], :q, :r], c._sources
298
+ assert_equal [['c', 'z', 'p'], 'q', 'r'], c._values
299
+ assert_equal [[[nil, :a, :b, :c], [nil, :x, :y, :z], nil], :q, :r], c._source_trail
300
+ end
301
+
302
+ def test_merge_with_no_sources_provided_returns_fork
303
+ c = a._merge
304
+
305
+ assert_not_equal a.object_id, c.object_id
306
+ assert_equal a._sources, c._sources
307
+ assert_equal a._values, c._values
308
+ end
309
+
310
+ #
311
+ # test fork
312
+ #
313
+
314
+ def test_fork_returns_audit_with_duplicates_of_sources_and_values
315
+ a = setup_audit(:a, :b, :c)
316
+ b = a._fork
317
+
318
+ assert_equal b._sources, a._sources
319
+ assert_not_equal b._sources.object_id, a._sources.object_id
320
+ assert_equal b._values, a._values
321
+ assert_not_equal b._values.object_id, a._values.object_id
322
+ end
323
+
324
+ def test_forks_can_be_developed_independently
325
+ a = setup_audit(:a, :b)
326
+ b = a._fork
327
+
328
+ a._record(:c, 'c')
329
+ b._record(:d, 'd')
330
+
331
+ assert_equal([nil, :a, :b, :c], a._sources)
332
+ assert_equal([nil, :a, :b, :d], b._sources)
333
+ end
334
+
335
+ #
336
+ # split tests
337
+ #
338
+
339
+ def test_split_records_block_as_source_and_return_as_value
340
+ block = lambda { |current| current += 'ar' }
341
+ c = a._split(&block)
342
+
343
+ assert_equal [a, block], c._sources
344
+ assert_equal [nil, 'car'], c._values
345
+ assert_equal [[nil, :a, :b, :c], block], c._source_trail
346
+ end
347
+
348
+ def test_split_raises_error_if_no_block_given
349
+ assert_raise(LocalJumpError) { a._split }
350
+ end
351
+
352
+ #
353
+ # comparator and method missing test
354
+ #
355
+
356
+ def test_comparators_sent_to_current
357
+ a = Audit.new(1)
358
+ assert a < 2
359
+ assert a > 0
360
+ assert a == 1
361
+ end
362
+
363
+ def test_regexp_match_sent_to_current
364
+ a = Audit.new("abcd")
365
+ assert a =~ /ab(\w)/
366
+ # note: this is not ideal behavior... should be
367
+ #assert_equal 'c', $1
368
+ assert_nil $1
369
+
370
+ assert !(a=~ /q/)
371
+ end
372
+
373
+ def test_regexp_not_match_sent_to_current
374
+ a = Audit.new("abcd")
375
+ assert !(a !~ /ab(\w)/)
376
+ # note: this is not ideal behavior... should be
377
+ #assert_equal 'c', $1
378
+ assert_nil $1
379
+
380
+ assert a !~ /q/
381
+ end
382
+
383
+ def test_missing_methods_sent_to_current
384
+ a = Audit.new("abcd")
385
+ assert "ABCD", a.upcase
386
+
387
+ a = Audit.new(3)
388
+ assert a > 2
389
+ assert a <= 3
390
+ end
391
+
392
+ #
393
+ # documentation tests
394
+ #
395
+
396
+ def test_documentation
397
+ # part 1
398
+ audit = Audit.new(3)
399
+ audit._record(:a, 4)
400
+ audit._record(:b, 5)
401
+ audit._record(:c, 7)
402
+ assert_equal([nil, :a, :b, :c], audit._source_trail)
403
+
404
+ # part 2
405
+ audit = Audit.new(3)
406
+ audit._record(:a, 4)
407
+ fork_b = audit._fork
408
+ fork_c = audit._fork
409
+
410
+ fork_b._record(:b, 5)
411
+ fork_c._record(:c, 6)
412
+ assert_equal([nil, :a, :b], fork_b._source_trail)
413
+ assert_equal([nil, :a, :c], fork_c._source_trail)
414
+
415
+ merged_audit = Audit.merge(fork_b, fork_c)
416
+ merged_audit._record(:d, 11)
417
+ assert_equal([[[nil,:a,:b], [nil,:a,:c]], :d], merged_audit._source_trail)
418
+
419
+ # part 3
420
+ t = Tap::Task.new
421
+ t.on_complete do |results|
422
+ results.each do |result|
423
+
424
+ assert_equal Audit, result.class
425
+ assert_equal "str", result._current
426
+ assert result == "str"
427
+ assert_equal "STR", result.upcase
428
+
429
+ assert !result.kind_of?(String)
430
+ assert result =~ /s(\w+)/
431
+ assert_nil $1
432
+
433
+ end
434
+ end
435
+ t.execute "str"
436
+
437
+ # part 4
438
+ t = Tap::Task.new do |task, input|
439
+ assert_equal Fixnum, input.class
440
+ input += 1
441
+ end
442
+
443
+ results = t.execute(3)
444
+ assert_equal Array, results.class
445
+ assert_equal 1, results.length
446
+ assert_equal Audit, results.first.class
447
+ assert_equal 4, results.first._current
448
+ end
449
+ end
@@ -0,0 +1,320 @@
1
+ require File.join(File.dirname(__FILE__), '../tap_test_helper')
2
+ require 'tap/support/batch_queue'
3
+
4
+ class BatchQueueTest < Test::Unit::TestCase
5
+
6
+ # creates readers to facilitate testing
7
+ module BatchQueueAccessors
8
+ attr_reader :tasks, :inputs
9
+ end
10
+
11
+ attr_accessor :t, :not_executable, :queue
12
+
13
+ def setup
14
+ @t = Tap::Task.new
15
+ @not_executable = Tap::Task.new
16
+ @not_executable.condition {|task, inputs| false}
17
+
18
+ @queue = Tap::Support::BatchQueue.new
19
+ @queue.extend BatchQueueAccessors
20
+ end
21
+
22
+ def test_not_executable_is_not_executable_with_and_without_inputs
23
+ assert !not_executable.executable?([])
24
+ assert !not_executable.executable?([:a,:b,:c])
25
+ end
26
+
27
+ def test_documentation
28
+ t1 = Tap::Task.new
29
+ t2 = Tap::Task.new
30
+
31
+ q = Tap::Support::BatchQueue.new
32
+ q.enq t1, 1
33
+ q.enq t2, :a,:b,:c
34
+ q.enq t1, 2,3
35
+
36
+ assert_equal [t1, [1,2,3]], q.deq
37
+ assert_equal [t2, [:a,:b,:c]], q.deq
38
+ assert_nil q.deq
39
+ end
40
+
41
+ #
42
+ # initialization tests
43
+ #
44
+
45
+ def test_queue_is_empty_and_inputs_and_tasks_cannot_be_accessed
46
+ q = Tap::Support::BatchQueue.new
47
+ assert q.empty?
48
+ assert_raise(NoMethodError) { q.inputs }
49
+ assert_raise(NoMethodError) { q.tasks }
50
+ end
51
+
52
+ #
53
+ # size, length, clear, empty? tests
54
+ #
55
+
56
+ def test_size_and_length_return_number_of_tasks
57
+ assert_equal 0, queue.size
58
+ assert_equal 0, queue.length
59
+
60
+ queue.inputs[t] = [1,2,3]
61
+
62
+ assert_equal 0, queue.size
63
+ assert_equal 0, queue.length
64
+
65
+ queue.tasks << t
66
+
67
+ assert_equal 1, queue.size
68
+ assert_equal 1, queue.length
69
+ end
70
+
71
+ def test_empty_is_true_if_tasks_is_empty
72
+ assert queue.empty?
73
+ queue.inputs[t] = [1,2,3]
74
+ assert queue.empty?
75
+ queue.tasks << t
76
+ assert !queue.empty?
77
+ end
78
+
79
+ def test_clear_resets_tasks_and_inputs
80
+ assert_equal({}, queue.inputs)
81
+ assert_equal [], queue.tasks
82
+
83
+ queue.inputs[t] = [1,2,3]
84
+ queue.tasks << t
85
+ queue.clear
86
+
87
+ assert_equal({}, queue.inputs)
88
+ assert_equal [], queue.tasks
89
+ end
90
+
91
+ #
92
+ # queue test
93
+ #
94
+
95
+ def test_enq_pushes_task_onto_tasks
96
+ t1 = Tap::Task.new
97
+ t2 = Tap::Task.new
98
+ assert_equal [], queue.tasks
99
+
100
+ queue.enq(t1)
101
+ assert_equal [t1], queue.tasks
102
+
103
+ queue.enq(t2)
104
+ assert_equal [t1, t2], queue.tasks
105
+ end
106
+
107
+ def test_enq_concats_inputs_to_inputs
108
+ assert_equal nil, queue.inputs[t]
109
+
110
+ queue.enq(t,1)
111
+ assert_equal [1], queue.inputs[t]
112
+
113
+ queue.enq(t,2,3)
114
+ assert_equal [1,2,3], queue.inputs[t]
115
+ end
116
+
117
+ def test_enq_does_not_push_task_onto_tasks_if_it_is_already_in_the_queue
118
+ t1 = Tap::Task.new
119
+ t2 = Tap::Task.new
120
+ queue.tasks << t1
121
+ queue.tasks << t2
122
+ assert_equal [t1,t2], queue.tasks
123
+
124
+ queue.enq(t1)
125
+ assert_equal [t1,t2], queue.tasks
126
+ end
127
+
128
+ def test_enq_queues_batch_if_task_is_batched
129
+ t.batch << t.dup
130
+ assert_equal [], queue.tasks
131
+
132
+ queue.enq(t)
133
+ assert_equal t.batch, queue.tasks
134
+ end
135
+
136
+ def test_enq_forks_inputs_if_necessary_for_batch
137
+ t.batch << t.dup
138
+
139
+ a = Tap::Support::Audit.new(2)
140
+ queue.enq(t, 1, a)
141
+
142
+ audits = []
143
+ t.batch.each do |task|
144
+ assert_equal [1, a], queue.inputs[task]
145
+ audits << queue.inputs[task].last
146
+ end
147
+
148
+ # if the object ids of these audits are not equal, but they
149
+ # evaluate to equal, we can safely assume they're forked.
150
+ assert_equal 2, audits.length
151
+ assert_equal audits.first, audits.last
152
+ assert_not_equal audits.first.object_id, audits.last.object_id
153
+ end
154
+
155
+ #
156
+ # priority_enq test
157
+ #
158
+
159
+ def test_priority_enq_shifts_task_onto_tasks
160
+ t1 = Tap::Task.new
161
+ t2 = Tap::Task.new
162
+ assert_equal [], queue.tasks
163
+
164
+ queue.priority_enq(t1)
165
+ assert_equal [t1], queue.tasks
166
+
167
+ queue.priority_enq(t2)
168
+ assert_equal [t2, t1], queue.tasks
169
+ end
170
+
171
+ #
172
+ # prioritize test
173
+ #
174
+
175
+ def test_prioritize_moves_task_to_the_front_of_the_queue
176
+ t1 = Tap::Task.new
177
+ t2 = Tap::Task.new
178
+ queue.tasks << t1
179
+ queue.tasks << t2
180
+ assert_equal [t1,t2], queue.tasks
181
+
182
+ queue.prioritize(t2)
183
+ assert_equal [t2,t1], queue.tasks
184
+ end
185
+
186
+ def test_prioritize_does_not_insert_the_task_if_the_task_is_not_in_the_queue
187
+ assert_equal [], queue.tasks
188
+
189
+ queue.prioritize(t)
190
+ assert_equal [], queue.tasks
191
+ end
192
+
193
+ def test_prioritize_prioritizes_each_task_in_a_batch_in_order
194
+ t1 = Tap::Task.new
195
+ t2 = Tap::Task.new
196
+ t2.batch << t2.dup
197
+
198
+ queue.tasks << t1
199
+ queue.tasks.concat t2.batch
200
+
201
+ assert_equal [t1] + t2.batch, queue.tasks
202
+
203
+ queue.prioritize(t2)
204
+ assert_equal t2.batch + [t1], queue.tasks
205
+ end
206
+
207
+ #
208
+ # marginalize test
209
+ #
210
+
211
+ def test_marginalize_moves_task_to_the_front_of_the_queue
212
+ t1 = Tap::Task.new
213
+ t2 = Tap::Task.new
214
+ queue.tasks << t1
215
+ queue.tasks << t2
216
+ assert_equal [t1,t2], queue.tasks
217
+
218
+ queue.marginalize(t1)
219
+ assert_equal [t2,t1], queue.tasks
220
+ end
221
+
222
+ def test_marginalizeoes_not_insert_the_task_if_the_task_is_not_in_the_queue
223
+ assert_equal [], queue.tasks
224
+
225
+ queue.marginalize(t)
226
+ assert_equal [], queue.tasks
227
+ end
228
+
229
+ def test_marginalize_marginalizes_each_task_in_a_batch_in_order
230
+ t1 = Tap::Task.new
231
+ t2 = Tap::Task.new
232
+ t2.batch << t2.dup
233
+
234
+ queue.tasks.concat t2.batch
235
+ queue.tasks << t1
236
+
237
+ assert_equal t2.batch + [t1], queue.tasks
238
+ queue.marginalize(t2)
239
+ assert_equal [t1] + t2.batch, queue.tasks
240
+ end
241
+
242
+ #
243
+ # executable? tests
244
+ #
245
+
246
+ def test_executable_true_if_task_is_executable_with_current_inputs
247
+ t.condition {|task, inputs| inputs && inputs.length > 1 }
248
+
249
+ assert !queue.executable?(t)
250
+ queue.enq t,1
251
+ assert !queue.executable?(t)
252
+ queue.enq t,2
253
+ assert queue.executable?(t)
254
+ end
255
+
256
+ #
257
+ # deq test
258
+ #
259
+
260
+ def test_deq_returns_the_next_executable_task_and_inputs
261
+ queue.enq not_executable, :a,:b,:c
262
+ queue.enq t,1,2,3
263
+
264
+ assert_equal [t, [1,2,3]], queue.deq
265
+ assert !queue.empty?
266
+ end
267
+
268
+ def test_deq_returns_the_specified_task_even_if_not_executable
269
+ queue.enq t,1,2,3
270
+ queue.enq not_executable, :a,:b,:c
271
+
272
+ assert_equal [not_executable, [:a,:b,:c]], queue.deq(not_executable)
273
+ assert !queue.empty?
274
+ end
275
+
276
+ def test_deq_with_no_inputs_returns_empty_array_as_inputs
277
+ queue.enq t
278
+ assert_equal [t, []], queue.deq
279
+ end
280
+
281
+ #
282
+ # peek test
283
+ #
284
+
285
+ def test_peek_returns_the_next_executable_task_and_does_not_dequeue_the_task
286
+ queue.enq not_executable
287
+ queue.enq t
288
+
289
+ assert_equal t, queue.peek
290
+ assert_equal 2, queue.size
291
+ end
292
+
293
+ def test_peek_returns_nil_if_no_tasks_are_executable
294
+ assert_equal nil, queue.peek
295
+
296
+ queue.enq not_executable
297
+
298
+ assert_equal nil, queue.peek
299
+ end
300
+
301
+ #
302
+ # num_executable test
303
+ #
304
+
305
+ def test_num_executable_returns_number_of_queued_executable_tasks
306
+ assert_equal 0, queue.num_executable
307
+ queue.enq not_executable
308
+ assert_equal 0, queue.num_executable
309
+ queue.enq t
310
+ assert_equal 1, queue.num_executable
311
+ end
312
+
313
+ def test_num_not_executable_returns_number_of_queued_non_executable_tasks
314
+ assert_equal 0, queue.num_not_executable
315
+ queue.enq t
316
+ assert_equal 0, queue.num_not_executable
317
+ queue.enq not_executable
318
+ assert_equal 1, queue.num_not_executable
319
+ end
320
+ end