tap 0.7.9

Sign up to get free protection for your applications and to get access to all the features.
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