test_bench-isolated 0 → 2.0.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (152) hide show
  1. checksums.yaml +4 -4
  2. data/lib/test_bench_isolated/test_bench/cli.rb +298 -0
  3. data/lib/test_bench_isolated/test_bench/controls/file.rb +7 -0
  4. data/lib/test_bench_isolated/test_bench/controls/path.rb +7 -0
  5. data/lib/test_bench_isolated/test_bench/controls/random.rb +9 -0
  6. data/lib/test_bench_isolated/test_bench/controls/result.rb +7 -0
  7. data/lib/test_bench_isolated/test_bench/controls/stdin.rb +29 -0
  8. data/lib/test_bench_isolated/test_bench/controls.rb +11 -0
  9. data/lib/test_bench_isolated/test_bench/fixture/actuate/class.rb +97 -0
  10. data/lib/test_bench_isolated/test_bench/fixture/actuate/object.rb +93 -0
  11. data/lib/test_bench_isolated/test_bench/fixture/controls/exception.rb +9 -0
  12. data/lib/test_bench_isolated/test_bench/fixture/controls/fixture/class.rb +88 -0
  13. data/lib/test_bench_isolated/test_bench/fixture/controls/fixture/object/modules.rb +41 -0
  14. data/lib/test_bench_isolated/test_bench/fixture/controls/fixture/object.rb +33 -0
  15. data/lib/test_bench_isolated/test_bench/fixture/controls/fixture.rb +29 -0
  16. data/lib/test_bench_isolated/test_bench/fixture/controls/output.rb +9 -0
  17. data/lib/test_bench_isolated/test_bench/fixture/controls/random.rb +9 -0
  18. data/lib/test_bench_isolated/test_bench/fixture/controls/result.rb +9 -0
  19. data/lib/test_bench_isolated/test_bench/fixture/controls/title.rb +9 -0
  20. data/lib/test_bench_isolated/test_bench/fixture/controls.rb +13 -0
  21. data/lib/test_bench_isolated/test_bench/fixture/evaluate.rb +31 -0
  22. data/lib/test_bench_isolated/test_bench/fixture/fixture.rb +201 -0
  23. data/lib/test_bench_isolated/test_bench/fixture.rb +8 -0
  24. data/lib/test_bench_isolated/test_bench/output/controls/data.rb +51 -0
  25. data/lib/test_bench_isolated/test_bench/output/controls/device.rb +29 -0
  26. data/lib/test_bench_isolated/test_bench/output/controls/event.rb +9 -0
  27. data/lib/test_bench_isolated/test_bench/output/controls/output.rb +36 -0
  28. data/lib/test_bench_isolated/test_bench/output/controls/random.rb +9 -0
  29. data/lib/test_bench_isolated/test_bench/output/controls/style.rb +33 -0
  30. data/lib/test_bench_isolated/test_bench/output/controls/styling.rb +29 -0
  31. data/lib/test_bench_isolated/test_bench/output/controls/text.rb +19 -0
  32. data/lib/test_bench_isolated/test_bench/output/controls.rb +10 -0
  33. data/lib/test_bench_isolated/test_bench/output/device/null.rb +21 -0
  34. data/lib/test_bench_isolated/test_bench/output/device/substitute.rb +60 -0
  35. data/lib/test_bench_isolated/test_bench/output/digest.rb +115 -0
  36. data/lib/test_bench_isolated/test_bench/output/output.rb +68 -0
  37. data/lib/test_bench_isolated/test_bench/output/writer/buffer.rb +59 -0
  38. data/lib/test_bench_isolated/test_bench/output/writer/defaults.rb +13 -0
  39. data/lib/test_bench_isolated/test_bench/output/writer/style.rb +52 -0
  40. data/lib/test_bench_isolated/test_bench/output/writer/substitute.rb +40 -0
  41. data/lib/test_bench_isolated/test_bench/output/writer.rb +212 -0
  42. data/lib/test_bench_isolated/test_bench/output.rb +14 -0
  43. data/lib/test_bench_isolated/test_bench/random/controls/seed.rb +27 -0
  44. data/lib/test_bench_isolated/test_bench/random/controls.rb +1 -0
  45. data/lib/test_bench_isolated/test_bench/random/random.rb +170 -0
  46. data/lib/test_bench_isolated/test_bench/random.rb +1 -0
  47. data/lib/test_bench_isolated/test_bench/run/controls/directory.rb +72 -0
  48. data/lib/test_bench_isolated/test_bench/run/controls/event_data.rb +9 -0
  49. data/lib/test_bench_isolated/test_bench/run/controls/events/event_data.rb +11 -0
  50. data/lib/test_bench_isolated/test_bench/run/controls/events/file_crashed.rb +111 -0
  51. data/lib/test_bench_isolated/test_bench/run/controls/events/file_finished.rb +58 -0
  52. data/lib/test_bench_isolated/test_bench/run/controls/events/file_started.rb +49 -0
  53. data/lib/test_bench_isolated/test_bench/run/controls/events/finished.rb +58 -0
  54. data/lib/test_bench_isolated/test_bench/run/controls/events/session.rb +11 -0
  55. data/lib/test_bench_isolated/test_bench/run/controls/events/started.rb +49 -0
  56. data/lib/test_bench_isolated/test_bench/run/controls/exception.rb +103 -0
  57. data/lib/test_bench_isolated/test_bench/run/controls/executor.rb +58 -0
  58. data/lib/test_bench_isolated/test_bench/run/controls/file/create.rb +71 -0
  59. data/lib/test_bench_isolated/test_bench/run/controls/file/pattern.rb +35 -0
  60. data/lib/test_bench_isolated/test_bench/run/controls/file.rb +182 -0
  61. data/lib/test_bench_isolated/test_bench/run/controls/path.rb +17 -0
  62. data/lib/test_bench_isolated/test_bench/run/controls/process_id.rb +9 -0
  63. data/lib/test_bench_isolated/test_bench/run/controls/random.rb +9 -0
  64. data/lib/test_bench_isolated/test_bench/run/controls/result.rb +9 -0
  65. data/lib/test_bench_isolated/test_bench/run/controls/time.rb +9 -0
  66. data/lib/test_bench_isolated/test_bench/run/controls.rb +26 -0
  67. data/lib/test_bench_isolated/test_bench/run/events.rb +14 -0
  68. data/lib/test_bench_isolated/test_bench/run/executor/serial.rb +36 -0
  69. data/lib/test_bench_isolated/test_bench/run/executor/substitute.rb +47 -0
  70. data/lib/test_bench_isolated/test_bench/run/executor.rb +46 -0
  71. data/lib/test_bench_isolated/test_bench/run/file.rb +83 -0
  72. data/lib/test_bench_isolated/test_bench/run/get_files/substitute.rb +48 -0
  73. data/lib/test_bench_isolated/test_bench/run/get_files.rb +78 -0
  74. data/lib/test_bench_isolated/test_bench/run/output/file.rb +137 -0
  75. data/lib/test_bench_isolated/test_bench/run/output/summary/error.rb +141 -0
  76. data/lib/test_bench_isolated/test_bench/run/output/summary.rb +184 -0
  77. data/lib/test_bench_isolated/test_bench/run/run.rb +156 -0
  78. data/lib/test_bench_isolated/test_bench/run.rb +18 -0
  79. data/lib/test_bench_isolated/test_bench/session/controls/comment.rb +107 -0
  80. data/lib/test_bench_isolated/test_bench/session/controls/detail.rb +93 -0
  81. data/lib/test_bench_isolated/test_bench/session/controls/event.rb +9 -0
  82. data/lib/test_bench_isolated/test_bench/session/controls/events/commented.rb +112 -0
  83. data/lib/test_bench_isolated/test_bench/session/controls/events/context_finished.rb +72 -0
  84. data/lib/test_bench_isolated/test_bench/session/controls/events/context_skipped.rb +49 -0
  85. data/lib/test_bench_isolated/test_bench/session/controls/events/context_started.rb +66 -0
  86. data/lib/test_bench_isolated/test_bench/session/controls/events/detailed.rb +112 -0
  87. data/lib/test_bench_isolated/test_bench/session/controls/events/event_data.rb +11 -0
  88. data/lib/test_bench_isolated/test_bench/session/controls/events/failed.rb +49 -0
  89. data/lib/test_bench_isolated/test_bench/session/controls/events/fixture_finished.rb +55 -0
  90. data/lib/test_bench_isolated/test_bench/session/controls/events/fixture_started.rb +49 -0
  91. data/lib/test_bench_isolated/test_bench/session/controls/events/test_finished.rb +72 -0
  92. data/lib/test_bench_isolated/test_bench/session/controls/events/test_skipped.rb +49 -0
  93. data/lib/test_bench_isolated/test_bench/session/controls/events/test_started.rb +66 -0
  94. data/lib/test_bench_isolated/test_bench/session/controls/events.rb +35 -0
  95. data/lib/test_bench_isolated/test_bench/session/controls/exception.rb +47 -0
  96. data/lib/test_bench_isolated/test_bench/session/controls/failure.rb +21 -0
  97. data/lib/test_bench_isolated/test_bench/session/controls/fixture.rb +21 -0
  98. data/lib/test_bench_isolated/test_bench/session/controls/output/detail.rb +31 -0
  99. data/lib/test_bench_isolated/test_bench/session/controls/output.rb +57 -0
  100. data/lib/test_bench_isolated/test_bench/session/controls/process_id.rb +9 -0
  101. data/lib/test_bench_isolated/test_bench/session/controls/random.rb +9 -0
  102. data/lib/test_bench_isolated/test_bench/session/controls/result.rb +25 -0
  103. data/lib/test_bench_isolated/test_bench/session/controls/substitute/path.rb +35 -0
  104. data/lib/test_bench_isolated/test_bench/session/controls/time.rb +9 -0
  105. data/lib/test_bench_isolated/test_bench/session/controls/title.rb +41 -0
  106. data/lib/test_bench_isolated/test_bench/session/controls.rb +36 -0
  107. data/lib/test_bench_isolated/test_bench/session/events.rb +27 -0
  108. data/lib/test_bench_isolated/test_bench/session/output/get.rb +29 -0
  109. data/lib/test_bench_isolated/test_bench/session/output/writer/buffer/interactive/viewport.rb +167 -0
  110. data/lib/test_bench_isolated/test_bench/session/output/writer/buffer/interactive.rb +141 -0
  111. data/lib/test_bench_isolated/test_bench/session/output/writer/buffer.rb +29 -0
  112. data/lib/test_bench_isolated/test_bench/session/output/writer/defaults.rb +19 -0
  113. data/lib/test_bench_isolated/test_bench/session/output/writer/substitute.rb +19 -0
  114. data/lib/test_bench_isolated/test_bench/session/output/writer.rb +97 -0
  115. data/lib/test_bench_isolated/test_bench/session/output.rb +377 -0
  116. data/lib/test_bench_isolated/test_bench/session/projection.rb +30 -0
  117. data/lib/test_bench_isolated/test_bench/session/session.rb +220 -0
  118. data/lib/test_bench_isolated/test_bench/session/store.rb +61 -0
  119. data/lib/test_bench_isolated/test_bench/session/substitute/path.rb +65 -0
  120. data/lib/test_bench_isolated/test_bench/session/substitute/sink.rb +114 -0
  121. data/lib/test_bench_isolated/test_bench/session/substitute.rb +120 -0
  122. data/lib/test_bench_isolated/test_bench/session.rb +22 -0
  123. data/lib/test_bench_isolated/test_bench/telemetry/controls/event/event_data.rb +17 -0
  124. data/lib/test_bench_isolated/test_bench/telemetry/controls/event/metadata.rb +72 -0
  125. data/lib/test_bench_isolated/test_bench/telemetry/controls/event.rb +140 -0
  126. data/lib/test_bench_isolated/test_bench/telemetry/controls/event_data.rb +131 -0
  127. data/lib/test_bench_isolated/test_bench/telemetry/controls/file.rb +86 -0
  128. data/lib/test_bench_isolated/test_bench/telemetry/controls/handler.rb +83 -0
  129. data/lib/test_bench_isolated/test_bench/telemetry/controls/process_id.rb +21 -0
  130. data/lib/test_bench_isolated/test_bench/telemetry/controls/projection/receiver.rb +33 -0
  131. data/lib/test_bench_isolated/test_bench/telemetry/controls/projection.rb +86 -0
  132. data/lib/test_bench_isolated/test_bench/telemetry/controls/random.rb +9 -0
  133. data/lib/test_bench_isolated/test_bench/telemetry/controls/sink.rb +35 -0
  134. data/lib/test_bench_isolated/test_bench/telemetry/controls/time.rb +125 -0
  135. data/lib/test_bench_isolated/test_bench/telemetry/controls.rb +17 -0
  136. data/lib/test_bench_isolated/test_bench/telemetry/event.rb +108 -0
  137. data/lib/test_bench_isolated/test_bench/telemetry/event_data/serialization.rb +172 -0
  138. data/lib/test_bench_isolated/test_bench/telemetry/event_data.rb +15 -0
  139. data/lib/test_bench_isolated/test_bench/telemetry/sink/file.rb +33 -0
  140. data/lib/test_bench_isolated/test_bench/telemetry/sink/handler/event_registry.rb +44 -0
  141. data/lib/test_bench_isolated/test_bench/telemetry/sink/handler.rb +128 -0
  142. data/lib/test_bench_isolated/test_bench/telemetry/sink/projection.rb +134 -0
  143. data/lib/test_bench_isolated/test_bench/telemetry/sink.rb +13 -0
  144. data/lib/test_bench_isolated/test_bench/telemetry/substitute/sink.rb +85 -0
  145. data/lib/test_bench_isolated/test_bench/telemetry/substitute.rb +34 -0
  146. data/lib/test_bench_isolated/test_bench/telemetry/telemetry.rb +111 -0
  147. data/lib/test_bench_isolated/test_bench/telemetry.rb +17 -0
  148. data/lib/test_bench_isolated/test_bench/test_bench.rb +56 -0
  149. data/lib/test_bench_isolated/test_bench.rb +5 -0
  150. data/script/bench +5 -0
  151. metadata +156 -7
  152. data/lib/test_bench/bootstrap.rb +0 -328
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2f36ae682bd15d3af0f189c7df3337bcdf5acf84e8e809ce2f05d273a5d8129a
4
- data.tar.gz: 42d939f0f13bde2fe3808a9dfbbe4415c9026480bf6fa0f90b977682615f8274
3
+ metadata.gz: f481a604aa280b59333588ed3473d30c0ca272f732133952a54ee2d833914fad
4
+ data.tar.gz: 3aa29f7077ea35970b3e263bee0d6cff7dfd00f2221d39bb491cfebcfecef260
5
5
  SHA512:
6
- metadata.gz: 35eb7d285e7d39f4b690191053915a347062d60d40e659080329a582ef7d85ddbea59342085ca4b3b0fbb849482739c33a77fd281216b1ef60255fe6abc6e605
7
- data.tar.gz: 1c3da22303afc2fc9f674381edb53de250b4e4746afdeef47952ebe2cad13b7e4aceb8821eb8a841b9bb58ffc6da6502e73f00cb09b5d2c1c9f79a73171adb4f
6
+ metadata.gz: b482e2e30289919565e2a2995809ee8c188cc20be58985bc2ff7e53721866c02376f3bdb480211de1ce3b691c97e5ed543a7a101b6f4e8d11759f6c6ce3d15f1
7
+ data.tar.gz: 119daa3855015ce6d2de5438cf99f70f8969dc0f96c21d8a644f9844b05572d8b23590bfa6c05d96ca4edf3e0073d1f5d31cee7a246465416f156f2069457ace
@@ -0,0 +1,298 @@
1
+ module TestBenchIsolated
2
+ module TestBench
3
+ class CLI
4
+ ArgumentError = Class.new(RuntimeError)
5
+
6
+ attr_reader :arguments
7
+
8
+ attr_accessor :exit_code
9
+
10
+ def env
11
+ @env ||= {}
12
+ end
13
+ attr_writer :env
14
+
15
+ def program_name
16
+ @program_name ||= Defaults.program_name
17
+ end
18
+ attr_writer :program_name
19
+
20
+ def version
21
+ @version ||= Defaults.version
22
+ end
23
+ attr_writer :version
24
+
25
+ def stdin
26
+ @stdin ||= STDIN
27
+ end
28
+ attr_writer :stdin
29
+
30
+ def writer
31
+ @writer ||= Output::Writer::Substitute.build
32
+ end
33
+ attr_writer :writer
34
+
35
+ def run
36
+ @run ||= Run::Substitute.build
37
+ end
38
+ attr_writer :run
39
+
40
+ def random
41
+ @random ||= Random::Substitute.build
42
+ end
43
+ attr_writer :random
44
+
45
+ def initialize(*arguments)
46
+ @arguments = arguments
47
+ end
48
+
49
+ def self.build(arguments=nil, env: nil)
50
+ arguments ||= ::ARGV
51
+ env ||= ::ENV
52
+
53
+ instance = new(*arguments)
54
+ instance.env = env
55
+ Output::Writer.configure(instance)
56
+ Run.configure(instance)
57
+ Random.configure(instance)
58
+ instance
59
+ end
60
+
61
+ def self.call(arguments=nil, env: nil)
62
+ instance = build(arguments, env:)
63
+
64
+ session = instance.run.session
65
+ Session::Store.reset(session)
66
+
67
+ exit_code = instance.()
68
+
69
+ exit(exit_code)
70
+ end
71
+
72
+ def call
73
+ parse_arguments
74
+
75
+ if exit_code?
76
+ return exit_code
77
+ end
78
+
79
+ writer.puts(RUBY_DESCRIPTION)
80
+ writer.puts("Random Seed: #{random.seed.to_s(36)}")
81
+ writer.puts
82
+
83
+ default_path = Defaults.tests_directory
84
+
85
+ result = run.! do |run|
86
+ if not stdin.tty?
87
+ until stdin.eof?
88
+ path = stdin.gets(chomp: true)
89
+
90
+ next if path.empty?
91
+
92
+ run << path
93
+ end
94
+ end
95
+
96
+ arguments.each do |path|
97
+ run << path
98
+ end
99
+
100
+ if not run.ran?
101
+ run << default_path
102
+ end
103
+ end
104
+
105
+ self.exit_code = self.class.exit_code(result)
106
+
107
+ exit_code
108
+ end
109
+
110
+ def parse_arguments
111
+ argument_index = 0
112
+
113
+ until argument_index == arguments.count
114
+ next_argument = next_argument(argument_index)
115
+
116
+ if not next_argument.start_with?('-')
117
+ argument_index += 1
118
+ next
119
+ end
120
+
121
+ switch = next_argument!(argument_index)
122
+
123
+ case switch
124
+ when '--'
125
+ break
126
+
127
+ when '-h', '--help'
128
+ print_help_text
129
+
130
+ self.exit_code = 0
131
+
132
+ when '-v', '--version'
133
+ writer.puts "TestBench Version: #{version}"
134
+
135
+ self.exit_code = 0
136
+
137
+ when '-d', '--detail', '--no-detail'
138
+ if not negated?(switch)
139
+ detail_policy_text = 'on'
140
+ else
141
+ detail_policy_text = 'off'
142
+ end
143
+
144
+ detail_policy = detail_policy_text.to_sym
145
+ Session::Output::Detail.assure_detail(detail_policy)
146
+
147
+ env['TEST_BENCH_DETAIL'] = detail_policy_text
148
+
149
+ when '-x', '--exclude', '--no-exclude'
150
+ if not negated?(switch)
151
+ exclude_file_pattern_text = switch_value!(argument_index, switch)
152
+ else
153
+ exclude_file_pattern_text = ''
154
+ end
155
+
156
+ env['TEST_BENCH_EXCLUDE_FILE_PATTERN'] = exclude_file_pattern_text
157
+
158
+ when '-f', '--only-failure', '--no-only-failure'
159
+ if not negated?(switch)
160
+ only_failure_text = 'on'
161
+ else
162
+ only_failure_text = 'off'
163
+ end
164
+
165
+ env['TEST_BENCH_ONLY_FAILURE'] = only_failure_text
166
+
167
+ when '-o', '--output-styling'
168
+ output_styling_text = switch_value(argument_index) do
169
+ 'on'
170
+ end
171
+
172
+ output_styling = output_styling_text.to_sym
173
+ Output::Writer::Styling.assure_styling(output_styling)
174
+
175
+ env['TEST_BENCH_OUTPUT_STYLING'] = output_styling_text
176
+
177
+ when '-s', '--seed'
178
+ seed_text = switch_value!(argument_index, switch)
179
+
180
+ begin
181
+ Integer(seed_text)
182
+ rescue
183
+ raise ArgumentError, "Seed switch must be an integer (Seed: #{seed_text.inspect})"
184
+ end
185
+
186
+ env['TEST_BENCH_SEED'] = seed_text
187
+
188
+ when '-r', '--require'
189
+ library = switch_value!(argument_index, switch)
190
+
191
+ require library
192
+
193
+ else
194
+ raise ArgumentError, "Unknown switch #{switch.inspect}"
195
+ end
196
+ end
197
+ end
198
+
199
+ def print_help_text
200
+ writer.write <<~TEXT
201
+ Usage: #{program_name} [options] [paths]
202
+
203
+ Informational Options:
204
+ \t-h, --help Print this help message and exit successfully
205
+ \t-v, --version Print version and exit successfully
206
+
207
+ Configuration Options:
208
+ \t-d, --[no]detail Always show (or hide) details (Default: #{Session::Output::Detail.default})
209
+ \t-x, --[no-]exclude PATTERN Do not execute test files matching PATTERN (Default: #{Run::GetFiles::Defaults.exclude_file_pattern.inspect})
210
+ \t-f, --[no-]only-failure Don't display output for test files that pass (Default: #{Run::Output::File::Defaults.only_failure ? 'on' : 'off'})
211
+ \t-o, --output-styling [on|off|detect]
212
+ \t Render output coloring and font styling escape codes (Default: #{Output::Writer::Styling.default})
213
+ \t-s, --seed NUMBER Sets pseudo-random number seed (Default: not set)
214
+
215
+ Other Options:
216
+ \t-r, --require LIBRARY Require LIBRARY before running any files
217
+
218
+ Paths to test files (and directories containing test files) can be given after any command line arguments or via STDIN (or both).
219
+
220
+ If no paths are given, a default path (#{Defaults.tests_directory}) is scanned for test files.
221
+
222
+ The following environment variables can also control execution:
223
+
224
+ \tTEST_BENCH_DETAIL Same as -d or --detail
225
+ \tTEST_BENCH_EXCLUDE_FILE_PATTERN Same as -x or --exclude-file-pattern
226
+ \tTEST_BENCH_ONLY_FAILURE Same as -f or --only-failure
227
+ \tTEST_BENCH_OUTPUT_STYLING Same as -o or --output-styling
228
+ \tTEST_BENCH_SEED Same as -s or --seed
229
+
230
+ TEXT
231
+ end
232
+
233
+ def negated?(switch)
234
+ switch.start_with?('--no-')
235
+ end
236
+
237
+ def exit_code?
238
+ !exit_code.nil?
239
+ end
240
+
241
+ def switch_value!(argument_index, argument)
242
+ switch_value(argument_index) do
243
+ raise ArgumentError, "Argument #{argument.inspect} requires an argument"
244
+ end
245
+ end
246
+
247
+ def switch_value(argument_index, &no_value_action)
248
+ next_value = next_argument(argument_index)
249
+
250
+ if next_value.nil? || next_value.start_with?('-')
251
+ switch_value = nil
252
+
253
+ return no_value_action.()
254
+ else
255
+ switch_value = next_argument!(argument_index)
256
+
257
+ return switch_value
258
+ end
259
+ end
260
+
261
+ def next_argument(argument_index)
262
+ arguments[argument_index]
263
+ end
264
+
265
+ def next_argument!(argument_index)
266
+ arguments.delete_at(argument_index)
267
+ end
268
+
269
+ def self.exit_code(result)
270
+ if result == true
271
+ 0
272
+ elsif result == false
273
+ 1
274
+ else
275
+ 2
276
+ end
277
+ end
278
+
279
+ module Defaults
280
+ def self.tests_directory
281
+ ENV.fetch('TEST_BENCH_TESTS_DIRECTORY', 'test/automated')
282
+ end
283
+
284
+ def self.program_name
285
+ $PROGRAM_NAME || 'bench'
286
+ end
287
+
288
+ def self.version
289
+ if Object.const_defined?(:Gem)
290
+ spec = Gem.loaded_specs['test_bench']
291
+ end
292
+
293
+ spec&.version || '(unknown)'
294
+ end
295
+ end
296
+ end
297
+ end
298
+ end
@@ -0,0 +1,7 @@
1
+ module TestBenchIsolated
2
+ module TestBench
3
+ module Controls
4
+ File = Run::Controls::File
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module TestBenchIsolated
2
+ module TestBench
3
+ module Controls
4
+ Path = Run::Controls::Path
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ module TestBenchIsolated
2
+ module TestBench
3
+ module Controls
4
+ module Random
5
+ Seed = TestBench::Random::Controls::Seed
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,7 @@
1
+ module TestBenchIsolated
2
+ module TestBench
3
+ module Controls
4
+ Result = Run::Controls::Result
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,29 @@
1
+ module TestBenchIsolated
2
+ module TestBench
3
+ module Controls
4
+ module Stdin
5
+ module Create
6
+ def self.call(*paths)
7
+ if paths.empty?
8
+ paths = Path.examples
9
+ end
10
+
11
+ contents = <<~TEXT
12
+ #{paths.join("\n")}
13
+ TEXT
14
+
15
+ file = File::Create.(contents:)
16
+
17
+ ::File.open(file, 'r')
18
+ end
19
+
20
+ def self.contents
21
+ <<~TEXT
22
+ #{Path.example}
23
+ TEXT
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,11 @@
1
+ require 'test_bench_isolated/test_bench/random/controls'
2
+ require 'test_bench_isolated/test_bench/run/controls'
3
+
4
+ require 'test_bench_isolated/test_bench/controls/result'
5
+
6
+ require 'test_bench_isolated/test_bench/controls/path'
7
+
8
+ require 'test_bench_isolated/test_bench/controls/file'
9
+ require 'test_bench_isolated/test_bench/controls/stdin'
10
+
11
+ require 'test_bench_isolated/test_bench/controls/random'
@@ -0,0 +1,97 @@
1
+ module TestBenchIsolated
2
+ module TestBench
3
+ module Fixture
4
+ module Actuate
5
+ module Class
6
+ Error = ::Class.new(RuntimeError)
7
+
8
+ def self.call(fixture_class, *, session: nil, **, &block)
9
+ if test_block?(fixture_class)
10
+ test_block = block
11
+ else
12
+ block_actuator = block
13
+ end
14
+
15
+ fixture = build_fixture(fixture_class, *, **, &test_block)
16
+
17
+ Session.configure(fixture, session:, attr_name: :test_session)
18
+
19
+ actuate(fixture, &block_actuator)
20
+
21
+ fixture
22
+ end
23
+
24
+ def self.actuate(fixture, &block_actuator)
25
+ if fixture.respond_to?(:call)
26
+ fixture_actuator = fixture
27
+ end
28
+
29
+ if block_actuator && fixture_actuator
30
+ raise Error, "Block argument given to fixture that has an actuator (Fixture Class: #{fixture.class})"
31
+ end
32
+
33
+ if block_actuator.nil? && fixture_actuator.nil?
34
+ raise Error, "No actuator"
35
+ end
36
+
37
+ if not block_actuator.nil?
38
+ block_actuator.(fixture)
39
+ else
40
+ fixture_actuator.()
41
+ end
42
+ end
43
+
44
+ def self.build_fixture(fixture_class, ...)
45
+ constructor = constructor(fixture_class)
46
+
47
+ fixture_class.public_send(constructor, ...)
48
+ end
49
+
50
+ def self.test_block?(fixture_class)
51
+ assure_fixture(fixture_class)
52
+
53
+ constructor = constructor(fixture_class)
54
+
55
+ if constructor == :build
56
+ constructor_method = fixture_class.method(:build)
57
+ else
58
+ constructor_method = fixture_class.instance_method(:initialize)
59
+ end
60
+
61
+ constructor_parameters = constructor_method.parameters
62
+
63
+ constructor_parameters.any? do |(type, _)|
64
+ type == :block
65
+ end
66
+ end
67
+
68
+ def self.constructor(fixture_class)
69
+ assure_fixture(fixture_class)
70
+
71
+ if fixture_class.respond_to?(:build)
72
+ :build
73
+ else
74
+ :new
75
+ end
76
+ end
77
+
78
+ def self.assure_fixture(fixture_class)
79
+ is_class = fixture_class.instance_of?(::Class)
80
+
81
+ if not is_class
82
+ raise Error, "Not a class (Class: #{fixture_class})"
83
+ end
84
+
85
+ if is_class
86
+ is_fixture_class = fixture_class.included_modules.include?(Fixture)
87
+ end
88
+
89
+ if not is_fixture_class
90
+ raise Error, "Not a fixture class (Class: #{fixture_class})"
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,93 @@
1
+ module TestBenchIsolated
2
+ module TestBench
3
+ module Fixture
4
+ module Actuate
5
+ module Object
6
+ ModuleError = ::Class.new(RuntimeError)
7
+
8
+ def self.call(object, *modules, session: nil, &block_actuator)
9
+ extend(object, *modules)
10
+
11
+ Session.configure(object, session:, attr_name: :test_session)
12
+
13
+ block_actuator.(object)
14
+ end
15
+
16
+ def self.extend(object, *modules)
17
+ if modules.empty?
18
+ fixture_modules = fixture_modules(object)
19
+ else
20
+ fixture_modules = modules.map do |mod|
21
+ assure_included(object, mod)
22
+
23
+ fixture_module(mod)
24
+ end
25
+ end
26
+
27
+ if fixture_modules.empty?
28
+ raise ModuleError, "No Fixture modules found -- #{object.inspect}"
29
+ end
30
+
31
+ fixture_modules.each do |fixture_module|
32
+ object.extend(fixture_module)
33
+ end
34
+
35
+ object.extend(Fixture)
36
+ end
37
+
38
+ def self.assure_included(object, mod)
39
+ if not object.is_a?(mod)
40
+ raise ModuleError, "Object doesn't include module -- #{mod.inspect}"
41
+ end
42
+ end
43
+
44
+ def self.fixture_modules(object)
45
+ fixture_modules = []
46
+
47
+ targets = included_modules(object)
48
+
49
+ targets << object
50
+
51
+ targets.select do |target|
52
+ if fixture_module?(target)
53
+ fixture_module = fixture_module(target)
54
+ fixture_modules << fixture_module
55
+ end
56
+ end
57
+
58
+ fixture_modules
59
+ end
60
+
61
+ def self.fixture_module(object)
62
+ if not fixture_module?(object)
63
+ raise ModuleError, "Couldn't resolve a Fixture module -- #{object.inspect}"
64
+ end
65
+
66
+ target = fixture_module_target(object)
67
+
68
+ target.const_get(:Fixture, false)
69
+ end
70
+
71
+ def self.fixture_module?(object)
72
+ target = fixture_module_target(object)
73
+
74
+ target.const_defined?(:Fixture, false)
75
+ end
76
+
77
+ def self.fixture_module_target(object)
78
+ if object.is_a?(Module)
79
+ object
80
+ else
81
+ object.class
82
+ end
83
+ end
84
+
85
+ def self.included_modules(object)
86
+ modules = (object.class.included_modules | object.singleton_class.included_modules) - ::Object.included_modules
87
+ modules.sort_by(&:name)
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,9 @@
1
+ module TestBenchIsolated
2
+ module TestBench
3
+ module Fixture
4
+ module Controls
5
+ Exception = TestBench::Session::Controls::Exception
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,88 @@
1
+ module TestBenchIsolated
2
+ module TestBench
3
+ module Fixture
4
+ module Controls
5
+ module Fixture
6
+ module Class
7
+ Example = Fixture::Example
8
+
9
+ class BuildMethod
10
+ include TestBench::Fixture
11
+
12
+ attr_accessor :some_argument
13
+ attr_accessor :some_keyword_argument
14
+
15
+ def self.build(some_argument=nil, some_keyword_argument: nil)
16
+ instance = new
17
+ instance.some_argument = some_argument
18
+ instance.some_keyword_argument = some_keyword_argument
19
+ instance
20
+ end
21
+ end
22
+
23
+ class NoBuildMethod
24
+ include TestBench::Fixture
25
+
26
+ attr_reader :some_argument
27
+ attr_reader :some_keyword_argument
28
+
29
+ def initialize(some_argument=nil, some_keyword_argument: nil)
30
+ @some_argument = some_argument
31
+ @some_keyword_argument = some_keyword_argument
32
+ end
33
+ end
34
+
35
+ class TestBlock
36
+ include TestBench::Fixture
37
+
38
+ attr_reader :test_block
39
+
40
+ def initialize(&test_block)
41
+ @test_block = test_block
42
+ end
43
+
44
+ NoBuildMethod = TestBlock
45
+
46
+ class BuildMethod
47
+ include TestBench::Fixture
48
+
49
+ attr_reader :test_block
50
+
51
+ def initialize(test_block)
52
+ @test_block = test_block
53
+ end
54
+
55
+ def self.build(&test_block)
56
+ new(test_block)
57
+ end
58
+ end
59
+
60
+ None = Fixture::Class::BuildMethod
61
+ end
62
+
63
+ class Actuator
64
+ include TestBench::Fixture
65
+
66
+ attr_accessor :actuated
67
+ def actuated? = !!actuated
68
+
69
+ def call
70
+ self.actuated = true
71
+ end
72
+
73
+ class TestBlock < Actuator
74
+ attr_reader :test_block
75
+
76
+ def initialize(&test_block)
77
+ @test_block = test_block
78
+ end
79
+ end
80
+ end
81
+
82
+ NoActuator = Example
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end