tap 0.8.0 → 0.9.0

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