tap 0.8.0 → 0.9.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.
Files changed (185) hide show
  1. data/Basic Overview +151 -0
  2. data/Command Reference +99 -0
  3. data/History +24 -0
  4. data/MIT-LICENSE +1 -1
  5. data/README +29 -57
  6. data/Rakefile +30 -37
  7. data/Tutorial +243 -191
  8. data/bin/tap +66 -35
  9. data/lib/tap.rb +47 -29
  10. data/lib/tap/app.rb +700 -342
  11. data/lib/tap/{script → cmd}/console.rb +0 -0
  12. data/lib/tap/{script → cmd}/destroy.rb +0 -0
  13. data/lib/tap/{script → cmd}/generate.rb +0 -0
  14. data/lib/tap/cmd/run.rb +156 -0
  15. data/lib/tap/constants.rb +4 -0
  16. data/lib/tap/dump.rb +57 -0
  17. data/lib/tap/env.rb +316 -0
  18. data/lib/tap/file_task.rb +106 -109
  19. data/lib/tap/generator.rb +4 -1
  20. data/lib/tap/generator/generators/command/USAGE +6 -0
  21. data/lib/tap/generator/generators/command/command_generator.rb +17 -0
  22. data/lib/tap/generator/generators/{script/templates/script.erb → command/templates/command.erb} +10 -10
  23. data/lib/tap/generator/generators/config/USAGE +21 -0
  24. data/lib/tap/generator/generators/config/config_generator.rb +17 -7
  25. data/lib/tap/generator/generators/file_task/USAGE +3 -0
  26. data/lib/tap/generator/generators/file_task/file_task_generator.rb +16 -0
  27. data/lib/tap/generator/generators/file_task/templates/file.txt +2 -0
  28. data/lib/tap/generator/generators/file_task/templates/file.yml +3 -0
  29. data/lib/tap/generator/generators/file_task/templates/task.erb +26 -20
  30. data/lib/tap/generator/generators/file_task/templates/test.erb +20 -10
  31. data/lib/tap/generator/generators/generator/generator_generator.rb +1 -1
  32. data/lib/tap/generator/generators/generator/templates/generator.erb +21 -12
  33. data/lib/tap/generator/generators/root/templates/Rakefile +33 -24
  34. data/lib/tap/generator/generators/root/templates/tap.yml +28 -31
  35. data/lib/tap/generator/generators/root/templates/test/tap_test_helper.rb +1 -0
  36. data/lib/tap/generator/generators/task/USAGE +3 -0
  37. data/lib/tap/generator/generators/task/task_generator.rb +18 -5
  38. data/lib/tap/generator/generators/task/templates/task.erb +7 -12
  39. data/lib/tap/generator/generators/task/templates/test.erb +10 -11
  40. data/lib/tap/generator/generators/workflow/templates/task.erb +1 -1
  41. data/lib/tap/generator/generators/workflow/templates/test.erb +1 -1
  42. data/lib/tap/patches/rake/rake_test_loader.rb +8 -0
  43. data/lib/tap/patches/rake/testtask.rb +55 -0
  44. data/lib/tap/patches/ruby19/backtrace_filter.rb +51 -0
  45. data/lib/tap/patches/ruby19/parsedate.rb +16 -0
  46. data/lib/tap/root.rb +172 -67
  47. data/lib/tap/script.rb +70 -336
  48. data/lib/tap/support/aggregator.rb +55 -0
  49. data/lib/tap/support/audit.rb +281 -280
  50. data/lib/tap/support/batchable.rb +59 -0
  51. data/lib/tap/support/class_configuration.rb +279 -0
  52. data/lib/tap/support/configurable.rb +92 -0
  53. data/lib/tap/support/configurable_methods.rb +296 -0
  54. data/lib/tap/support/executable.rb +98 -0
  55. data/lib/tap/support/executable_queue.rb +82 -0
  56. data/lib/tap/support/logger.rb +9 -15
  57. data/lib/tap/support/rake.rb +43 -54
  58. data/lib/tap/support/run_error.rb +32 -13
  59. data/lib/tap/support/shell_utils.rb +47 -0
  60. data/lib/tap/support/tdoc.rb +9 -8
  61. data/lib/tap/support/tdoc/config_attr.rb +40 -16
  62. data/lib/tap/support/validation.rb +77 -0
  63. data/lib/tap/support/versions.rb +36 -36
  64. data/lib/tap/task.rb +276 -482
  65. data/lib/tap/test.rb +20 -261
  66. data/lib/tap/test/env_vars.rb +7 -5
  67. data/lib/tap/test/file_methods.rb +126 -121
  68. data/lib/tap/test/subset_methods.rb +86 -45
  69. data/lib/tap/test/tap_methods.rb +271 -0
  70. data/lib/tap/workflow.rb +174 -46
  71. data/test/app/config/another/task.yml +1 -0
  72. data/test/app/config/erb.yml +2 -1
  73. data/test/app/config/some/task.yml +1 -0
  74. data/test/app/config/template.yml +2 -6
  75. data/test/app_test.rb +1241 -1008
  76. data/test/env/test_configure/recurse_a.yml +2 -0
  77. data/test/env/test_configure/recurse_b.yml +2 -0
  78. data/test/env/test_configure/tap.yml +23 -0
  79. data/test/env/test_load_env_config/dir/tap.yml +3 -0
  80. data/test/env/test_load_env_config/recurse_a.yml +2 -0
  81. data/test/env/test_load_env_config/recurse_b.yml +2 -0
  82. data/test/env/test_load_env_config/tap.yml +3 -0
  83. data/test/env_test.rb +198 -0
  84. data/test/file_task_test.rb +70 -53
  85. data/{lib/tap/generator/generators/package/USAGE → test/root/file.txt} +0 -0
  86. data/test/root_test.rb +621 -454
  87. data/test/script_test.rb +38 -174
  88. data/test/support/aggregator_test.rb +99 -0
  89. data/test/support/audit_test.rb +409 -416
  90. data/test/support/batchable_test.rb +74 -0
  91. data/test/support/{task_configuration_test.rb → class_configuration_test.rb} +106 -47
  92. data/test/{task/config/overriding.yml → support/configurable/config/configured.yml} +0 -0
  93. data/test/support/configurable_test.rb +295 -0
  94. data/test/support/executable_queue_test.rb +103 -0
  95. data/test/support/executable_test.rb +38 -0
  96. data/test/support/logger_test.rb +17 -17
  97. data/test/support/rake_test.rb +4 -2
  98. data/test/support/shell_utils_test.rb +24 -0
  99. data/test/support/tdoc_test.rb +265 -258
  100. data/test/support/validation_test.rb +54 -0
  101. data/test/support/versions_test.rb +38 -38
  102. data/test/tap_test_helper.rb +19 -5
  103. data/test/tap_test_suite.rb +5 -2
  104. data/test/task_base_test.rb +13 -104
  105. data/test/task_syntax_test.rb +300 -0
  106. data/test/task_test.rb +258 -381
  107. data/test/test/env_vars_test.rb +40 -40
  108. data/test/test/file_methods/{test_assert_output_files_equal → test_assert_files}/expected/one.txt +0 -0
  109. data/test/test/file_methods/{test_assert_output_files_equal → test_assert_files}/expected/two.txt +0 -0
  110. data/test/test/file_methods/{test_assert_output_files_equal → test_assert_files}/input/one.txt +0 -0
  111. data/test/test/file_methods/{test_assert_output_files_equal → test_assert_files}/input/two.txt +0 -0
  112. data/test/test/{test_file_task_test → file_methods/test_assert_files_can_have_no_expected_files_if_specified}/input/one.txt +0 -0
  113. data/test/test/{test_file_task_test → file_methods/test_assert_files_can_have_no_expected_files_if_specified}/input/two.txt +0 -0
  114. data/test/test/file_methods/test_assert_files_fails_for_different_content/expected/one.txt +1 -0
  115. data/test/test/{test_file_task_test → file_methods/test_assert_files_fails_for_different_content}/expected/two.txt +0 -0
  116. data/test/test/file_methods/test_assert_files_fails_for_different_content/input/one.txt +1 -0
  117. data/test/test/file_methods/test_assert_files_fails_for_different_content/input/two.txt +1 -0
  118. data/test/test/{test_file_task_test → file_methods/test_assert_files_fails_for_missing_expected_file}/expected/one.txt +0 -0
  119. data/test/test/file_methods/test_assert_files_fails_for_missing_expected_file/input/one.txt +1 -0
  120. data/test/test/file_methods/test_assert_files_fails_for_missing_expected_file/input/two.txt +1 -0
  121. data/test/test/file_methods/test_assert_files_fails_for_missing_output_file/expected/one.txt +1 -0
  122. data/test/test/file_methods/test_assert_files_fails_for_missing_output_file/expected/two.txt +1 -0
  123. data/test/test/file_methods/test_assert_files_fails_for_missing_output_file/input/one.txt +1 -0
  124. data/test/test/file_methods/test_assert_files_fails_for_missing_output_file/input/two.txt +1 -0
  125. data/test/test/file_methods/test_assert_files_fails_for_no_expected_files/input/one.txt +1 -0
  126. data/test/test/file_methods/test_assert_files_fails_for_no_expected_files/input/two.txt +1 -0
  127. data/test/test/file_methods_doc/test_sub/expected/one.txt +1 -0
  128. data/test/test/file_methods_doc/test_sub/expected/two.txt +1 -0
  129. data/test/test/file_methods_doc/test_sub/input/one.txt +1 -0
  130. data/test/test/file_methods_doc/test_sub/input/two.txt +1 -0
  131. data/test/test/file_methods_doc_test.rb +29 -0
  132. data/test/test/file_methods_test.rb +214 -143
  133. data/test/test/subset_methods_test.rb +111 -115
  134. data/test/test/{test_assert_expected_result_files → tap_methods/test_assert_files}/expected/task/name/a.txt +0 -0
  135. data/test/test/{test_assert_expected_result_files → tap_methods/test_assert_files}/expected/task/name/b.txt +0 -0
  136. data/test/test/{test_assert_expected_result_files → tap_methods/test_assert_files}/input/a.txt +0 -0
  137. data/test/test/{test_assert_expected_result_files → tap_methods/test_assert_files}/input/b.txt +0 -0
  138. data/test/test/tap_methods_test.rb +399 -0
  139. data/test/workflow_test.rb +101 -91
  140. metadata +86 -70
  141. data/lib/tap/generator/generators/package/package_generator.rb +0 -38
  142. data/lib/tap/generator/generators/package/templates/package.erb +0 -186
  143. data/lib/tap/generator/generators/script/USAGE +0 -0
  144. data/lib/tap/generator/generators/script/script_generator.rb +0 -17
  145. data/lib/tap/script/run.rb +0 -154
  146. data/lib/tap/support/batch_queue.rb +0 -162
  147. data/lib/tap/support/combinator.rb +0 -114
  148. data/lib/tap/support/task_configuration.rb +0 -169
  149. data/lib/tap/support/template.rb +0 -81
  150. data/lib/tap/support/templater.rb +0 -155
  151. data/lib/tap/version.rb +0 -4
  152. data/test/app/config/addition_template.yml +0 -6
  153. data/test/app_class_test.rb +0 -33
  154. data/test/check/binding_eval.rb +0 -23
  155. data/test/check/define_method_check.rb +0 -22
  156. data/test/check/dependencies_check.rb +0 -175
  157. data/test/check/inheritance_check.rb +0 -22
  158. data/test/support/batch_queue_test.rb +0 -320
  159. data/test/support/combinator_test.rb +0 -249
  160. data/test/support/template_test.rb +0 -122
  161. data/test/support/templater/erb.txt +0 -2
  162. data/test/support/templater/erb.yml +0 -2
  163. data/test/support/templater/somefile.txt +0 -2
  164. data/test/support/templater_test.rb +0 -192
  165. data/test/task/config/template.yml +0 -4
  166. data/test/task_class_test.rb +0 -170
  167. data/test/task_execute_test.rb +0 -262
  168. data/test/test/file_methods/test_assert_expected/expected/file.txt +0 -1
  169. data/test/test/file_methods/test_assert_expected/expected/folder/file.txt +0 -1
  170. data/test/test/file_methods/test_assert_expected/input/file.txt +0 -1
  171. data/test/test/file_methods/test_assert_expected/input/folder/file.txt +0 -1
  172. data/test/test/file_methods/test_assert_files_exist/input/input_1.txt +0 -0
  173. data/test/test/file_methods/test_assert_files_exist/input/input_2.txt +0 -0
  174. data/test/test/file_methods/test_file_compare/expected/output_1.txt +0 -3
  175. data/test/test/file_methods/test_file_compare/expected/output_2.txt +0 -1
  176. data/test/test/file_methods/test_file_compare/input/input_1.txt +0 -3
  177. data/test/test/file_methods/test_file_compare/input/input_2.txt +0 -3
  178. data/test/test/file_methods/test_infer_glob/expected/file.yml +0 -0
  179. data/test/test/file_methods/test_infer_glob/expected/file_1.txt +0 -0
  180. data/test/test/file_methods/test_infer_glob/expected/file_2.txt +0 -0
  181. data/test/test/file_methods/test_yml_compare/expected/output_1.yml +0 -6
  182. data/test/test/file_methods/test_yml_compare/expected/output_2.yml +0 -6
  183. data/test/test/file_methods/test_yml_compare/input/input_1.yml +0 -4
  184. data/test/test/file_methods/test_yml_compare/input/input_2.yml +0 -4
  185. data/test/test_test.rb +0 -373
@@ -1,4 +0,0 @@
1
- module Tap
2
- VERSION="0.8.0"
3
- HOMEPAGE="http://tap.rubyforge.org"
4
- end
@@ -1,6 +0,0 @@
1
- factor0: 0
2
-
3
- variations!:
4
- - factor1: 10
5
- - factor0: 1
6
- factor1: 20
@@ -1,33 +0,0 @@
1
- require File.join(File.dirname(__FILE__), 'tap_test_helper')
2
- require 'tap/app'
3
-
4
- class AppClassTest < Test::Unit::TestCase
5
- include Tap
6
-
7
- #
8
- # instance tests
9
- #
10
-
11
- def test_instance_returns_current_instance_or_a_default_app
12
- a = App.new
13
- App.instance = a
14
- assert_equal a, App.instance
15
-
16
- App.instance = nil
17
- assert_equal App, App.instance.class
18
- end
19
-
20
- #
21
- # parse_yaml tests
22
- #
23
-
24
- def test_parse_yaml_loads_arg_if_arg_matches_yaml_document_string
25
- string = "---\nkey: value"
26
- assert_equal({"key" => "value"}, App.parse_yaml(string))
27
- end
28
-
29
- def test_parse_yaml_returns_arg_unless_matches_yaml_document_string
30
- string = "key: value"
31
- assert_equal("key: value", App.parse_yaml(string))
32
- end
33
- end
@@ -1,23 +0,0 @@
1
- # this checks to see that you can unset and reset
2
- # constants and retain the functionality of the
3
- # constant.
4
-
5
- module TestMod
6
- CONST = 1
7
-
8
- module_function
9
-
10
- def function
11
- puts "in function"
12
- end
13
- end
14
-
15
- class Object
16
- old_ruby_token = remove_const(:TestMod)
17
- const_set(:NewName, old_ruby_token )
18
- end
19
-
20
- puts NewName::CONST
21
- puts NewName.function
22
-
23
- puts "done"
@@ -1,22 +0,0 @@
1
- require 'test/unit'
2
-
3
- class ClassConfigurationTest < Test::Unit::TestCase
4
- class A
5
- class << self
6
- def define_class_defined_method
7
- define_method('class_defined_method') do
8
- self
9
- end
10
- end
11
- end
12
-
13
- define_class_defined_method
14
- end
15
-
16
- def test_self_in_define_method
17
- a = A.new
18
-
19
- assert a.respond_to?(:class_defined_method)
20
- assert_equal a, a.class_defined_method
21
- end
22
- end
@@ -1,175 +0,0 @@
1
- require 'active_support'
2
- require 'fileutils'
3
- require 'test/unit'
4
-
5
- class DependenciesCheck < Test::Unit::TestCase
6
-
7
- def teardown
8
- FileUtils.rm_r(dep_dir)
9
- end
10
-
11
- def dep_dir
12
- File.join( File.dirname(__FILE__), "dependencies" )
13
- end
14
-
15
- #
16
- # make files
17
- #
18
-
19
- def filepath(class_name)
20
- File.join(dep_dir, class_name.underscore + ".rb")
21
- end
22
-
23
- def make_file(class_name, content)
24
- path = filepath(class_name)
25
- FileUtils.mkdir(File.dirname(path)) unless File.exists?(File.dirname(path))
26
- File.open(path, "w") do |file|
27
- file << content
28
- end
29
- class_name.underscore
30
- end
31
-
32
- def make_module_file(class_name)
33
- make_file class_name, %Q{
34
- module #{class_name.camelize}
35
- end}
36
- end
37
-
38
- def make_unloadable_file(class_name)
39
- make_file class_name, %Q{
40
- module #{class_name.camelize}
41
- unloadable
42
- end}
43
- end
44
-
45
- #
46
- # dependencies check
47
- #
48
-
49
- def test_dependencies
50
- pre_load = make_module_file "PreLoad"
51
- pre_load_unloadable = make_unloadable_file "PreLoadUnloadable"
52
- pre_loader = make_file("PreLoader", "require 'pre_load_required'\nrequire 'pre_load_required_unloadable'")
53
- pre_load_required = make_module_file "PreLoadRequired"
54
- pre_load_required_unloadable = make_unloadable_file "PreLoadRequiredUnloadable"
55
- pre_load_consts = ["PreLoad", "PreLoadUnloadable", "PreLoadRequired", "PreLoadRequiredUnloadable"]
56
-
57
- post_load = make_module_file "PostLoad"
58
- post_load_unloadable = make_unloadable_file "PostLoadUnloadable"
59
- post_loader = make_file("PostLoader", "require 'post_load_required'\nrequire 'post_load_required_unloadable'")
60
- post_load_required = make_module_file "PostLoadRequired"
61
- post_load_required_unloadable = make_unloadable_file "PostLoadRequiredUnloadable"
62
- post_load_consts = ["PostLoad", "PostLoadUnloadable", "PostLoadRequired", "PostLoadRequiredUnloadable"]
63
-
64
- assert_equal 10, Dir.glob( File.join( dep_dir, "*") ).length
65
-
66
- # can't load if not on load path
67
- assert_raise(MissingSourceFile) do
68
- require pre_load
69
- end
70
-
71
- $:.unshift dep_dir
72
- assert_nothing_raised do
73
- require pre_load
74
- require pre_load_unloadable
75
- require pre_loader
76
- end
77
-
78
- pre_load_consts.each {|const| assert Object.const_defined?(const)}
79
- post_load_consts.each {|const| assert !Object.const_defined?(const)}
80
-
81
- # now set Dependencies to load from dep_dir
82
- Dependencies.load_paths << dep_dir
83
-
84
- # PostLoad constants will be autoloaded as missing constants by Dependencies
85
- assert PostLoad
86
- assert PostLoadUnloadable
87
- assert PostLoadRequired
88
- assert PostLoadRequiredUnloadable
89
-
90
- pre_load_consts.each {|const| assert Object.const_defined?(const)}
91
- post_load_consts.each {|const| assert Object.const_defined?(const)}
92
-
93
- # post load modules are cleared, and pre-unloadable modules.
94
- # other modules are not cleared
95
- Dependencies.clear
96
-
97
- ["PreLoad", "PreLoadRequired"].each {|const| assert Object.const_defined?(const)}
98
- ["PreLoadUnloadable", "PreLoadRequiredUnloadable"].each {|const| assert !Object.const_defined?(const)}
99
- post_load_consts.each {|const| assert !Object.const_defined?(const)}
100
-
101
- # calling the missing modules reloads them
102
- assert PreLoadUnloadable
103
- assert PreLoadRequiredUnloadable
104
-
105
- assert PostLoad
106
- assert PostLoadUnloadable
107
- assert PostLoadRequired
108
- assert PostLoadRequiredUnloadable
109
-
110
- pre_load_consts.each {|const| assert Object.const_defined?(const)}
111
- post_load_consts.each {|const| assert Object.const_defined?(const)}
112
-
113
- # As before, post load modules should be cleared, and pre-unloadable modules
114
- Dependencies.clear
115
-
116
- ["PreLoad", "PreLoadRequired"].each {|const| assert Object.const_defined?(const)}
117
- ["PreLoadUnloadable", "PreLoadRequiredUnloadable"].each {|const| assert !Object.const_defined?(const)}
118
- post_load_consts.each {|const| assert !Object.const_defined?(const)}
119
-
120
- # requiring files will NOT restore pre-loads by themselves...
121
- # but it will restore post load requires, because they haven't
122
- # been required yet
123
- assert_nothing_raised do
124
- require pre_load
125
- require pre_load_unloadable
126
- require pre_loader
127
-
128
- require post_load
129
- require post_load_unloadable
130
- require post_loader
131
- end
132
-
133
- ["PreLoad", "PreLoadRequired"].each {|const| assert Object.const_defined?(const)}
134
- ["PreLoadUnloadable", "PreLoadRequiredUnloadable"].each {|const| assert !Object.const_defined?(const)}
135
- post_load_consts.each {|const| assert Object.const_defined?(const)}
136
-
137
- # Now, ONLY unloadable modules will be cleared -- the others were loaded
138
- # using require, and NOT Dependencies autoloading
139
- Dependencies.clear
140
-
141
- ["PreLoad", "PreLoadRequired"].each {|const| assert Object.const_defined?(const)}
142
- ["PreLoadUnloadable", "PreLoadRequiredUnloadable"].each {|const| assert !Object.const_defined?(const)}
143
- ["PostLoad", "PostLoadRequired"].each {|const| assert Object.const_defined?(const)}
144
- ["PostLoadUnloadable", "PostLoadRequiredUnloadable"].each {|const| assert !Object.const_defined?(const)}
145
-
146
- # Now, requiring files will NOT restore any modules because
147
- # the files have already been required
148
- assert_nothing_raised do
149
- require pre_load
150
- require pre_load_unloadable
151
- require pre_loader
152
-
153
- require post_load
154
- require post_load_unloadable
155
- require post_loader
156
- end
157
-
158
- ["PreLoad", "PreLoadRequired"].each {|const| assert Object.const_defined?(const)}
159
- ["PreLoadUnloadable", "PreLoadRequiredUnloadable"].each {|const| assert !Object.const_defined?(const)}
160
- ["PostLoad", "PostLoadRequired"].each {|const| assert Object.const_defined?(const)}
161
- ["PostLoadUnloadable", "PostLoadRequiredUnloadable"].each {|const| assert !Object.const_defined?(const)}
162
-
163
- # but again... calling the missing modules reloads them, so even
164
- # though the require doesn't work, you shold be good because you
165
- # won't be accessing the module without calling it. (right?)
166
- assert PreLoadUnloadable
167
- assert PreLoadRequiredUnloadable
168
- assert PostLoadUnloadable
169
- assert PostLoadRequiredUnloadable
170
-
171
- pre_load_consts.each {|const| assert Object.const_defined?(const)}
172
- post_load_consts.each {|const| assert Object.const_defined?(const)}
173
- end
174
-
175
- end
@@ -1,22 +0,0 @@
1
- require 'active_support'
2
- require 'test/unit'
3
-
4
- class ClassConfigurationTest < Test::Unit::TestCase
5
- class A
6
- write_inheritable_attribute(:hash, {})
7
- class_inheritable_reader(:hash)
8
-
9
- self.hash[:one] = 'one'
10
- end
11
-
12
- class B < A
13
- self.hash[:one] = 1
14
- end
15
-
16
- def test_inheritance
17
- assert_not_equal A.hash, B.hash
18
-
19
- assert_equal 'one', A.hash[:one]
20
- assert_equal 1, B.hash[:one]
21
- end
22
- end
@@ -1,320 +0,0 @@
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