test_bench 1.2.0.10 → 2.0.0.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/lib/test_bench/cli.rb +268 -18
  3. data/lib/test_bench/controls/file.rb +5 -0
  4. data/lib/test_bench/controls/path.rb +1 -11
  5. data/lib/test_bench/controls/random.rb +7 -0
  6. data/lib/test_bench/controls/result.rb +1 -1
  7. data/lib/test_bench/controls/stdin.rb +27 -0
  8. data/lib/test_bench/controls.rb +7 -24
  9. data/lib/test_bench/test_bench.rb +23 -77
  10. data/lib/test_bench.rb +1 -35
  11. metadata +16 -55
  12. data/lib/test_bench/cli/parse_arguments.rb +0 -181
  13. data/lib/test_bench/controls/caller_location.rb +0 -5
  14. data/lib/test_bench/controls/depth.rb +0 -21
  15. data/lib/test_bench/controls/device.rb +0 -27
  16. data/lib/test_bench/controls/directory.rb +0 -15
  17. data/lib/test_bench/controls/error.rb +0 -35
  18. data/lib/test_bench/controls/fixture.rb +0 -29
  19. data/lib/test_bench/controls/output/batch_data.rb +0 -52
  20. data/lib/test_bench/controls/output/detail_setting.rb +0 -29
  21. data/lib/test_bench/controls/output/escape_code.rb +0 -23
  22. data/lib/test_bench/controls/output/exercise.rb +0 -7
  23. data/lib/test_bench/controls/output/log_level.rb +0 -7
  24. data/lib/test_bench/controls/output/newline_character.rb +0 -16
  25. data/lib/test_bench/controls/output/print_error.rb +0 -19
  26. data/lib/test_bench/controls/output/styling.rb +0 -29
  27. data/lib/test_bench/controls/output/summary/error.rb +0 -28
  28. data/lib/test_bench/controls/output/summary/session.rb +0 -20
  29. data/lib/test_bench/controls/pattern.rb +0 -33
  30. data/lib/test_bench/controls/test_file.rb +0 -5
  31. data/lib/test_bench/controls/time.rb +0 -89
  32. data/lib/test_bench/deactivation_variants.rb +0 -11
  33. data/lib/test_bench/environment/boolean.rb +0 -40
  34. data/lib/test_bench/fixtures/configure_receiver.rb +0 -80
  35. data/lib/test_bench/fixtures.rb +0 -5
  36. data/lib/test_bench/output/batch_data.rb +0 -17
  37. data/lib/test_bench/output/buffer.rb +0 -114
  38. data/lib/test_bench/output/log.rb +0 -27
  39. data/lib/test_bench/output/print_error.rb +0 -163
  40. data/lib/test_bench/output/raw.rb +0 -363
  41. data/lib/test_bench/output/summary/session.rb +0 -94
  42. data/lib/test_bench/output/summary.rb +0 -146
  43. data/lib/test_bench/output/timer/substitute.rb +0 -45
  44. data/lib/test_bench/output/timer.rb +0 -75
  45. data/lib/test_bench/output/writer/dependency.rb +0 -12
  46. data/lib/test_bench/output/writer/sgr.rb +0 -54
  47. data/lib/test_bench/output/writer/substitute.rb +0 -38
  48. data/lib/test_bench/output/writer.rb +0 -192
  49. data/lib/test_bench/output.rb +0 -21
  50. data/lib/test_bench/run/substitute.rb +0 -36
  51. data/lib/test_bench/run.rb +0 -113
  52. data/script/bench +0 -19
@@ -1,363 +0,0 @@
1
- module TestBench
2
- module Output
3
- class Raw
4
- Error = Class.new(RuntimeError)
5
-
6
- include Fixture::Output
7
- include Writer::Dependency
8
-
9
- include PrintError
10
-
11
- def verbose
12
- instance_variable_defined?(:@verbose) ?
13
- @verbose :
14
- @verbose = Defaults.verbose
15
- end
16
- attr_writer :verbose
17
- alias_method :verbose?, :verbose
18
-
19
- def detail_setting
20
- @detail_setting ||= Defaults.detail
21
- end
22
- attr_writer :detail_setting
23
-
24
- attr_accessor :current_batch
25
-
26
- def batch_starting(batch_data)
27
- if batch_data.depth.zero?
28
- self.current_batch = batch_data
29
- end
30
- end
31
-
32
- def batch_finished(batch_data)
33
- if batch_data.depth.zero?
34
- self.current_batch = nil
35
- end
36
- end
37
-
38
- def previous_byte_offset
39
- @previous_byte_offset ||= 0
40
- end
41
- attr_writer :previous_byte_offset
42
-
43
- def configure(verbose: nil, detail: nil, omit_backtrace_pattern: nil, reverse_backtraces: nil, writer: nil, device: nil, styling: nil)
44
- unless detail.nil?
45
- self.class.assure_detail_setting(detail)
46
- end
47
-
48
- self.detail_setting = detail unless detail.nil?
49
- self.verbose = verbose unless verbose.nil?
50
-
51
- self.omit_backtrace_pattern = omit_backtrace_pattern unless omit_backtrace_pattern.nil?
52
- self.reverse_backtraces = reverse_backtraces unless reverse_backtraces.nil?
53
-
54
- Writer.configure(self, writer: writer, styling: styling, device: device)
55
- end
56
-
57
- def self.build(verbose: nil, detail: nil, omit_backtrace_pattern: nil, reverse_backtraces: nil, writer: nil, device: nil, styling: nil)
58
- instance = new
59
- instance.configure(verbose: verbose, detail: detail, omit_backtrace_pattern: omit_backtrace_pattern, reverse_backtraces: reverse_backtraces, writer: writer, device: device, styling: styling)
60
- instance
61
- end
62
-
63
- def self.configure(receiver, attr_name: nil, **args)
64
- attr_name ||= :raw_output
65
-
66
- instance = build(**args)
67
- receiver.public_send(:"#{attr_name}=", instance)
68
- instance
69
- end
70
-
71
- def detail?(result=nil)
72
- result ||= current_batch&.result
73
-
74
- case detail_setting
75
- when :failure
76
- result != true
77
- when :on
78
- true
79
- when :off
80
- false
81
- end
82
- end
83
-
84
- def enter_context(title, batch_data: nil)
85
- batch_starting(batch_data) unless batch_data.nil?
86
-
87
- return if title.nil?
88
-
89
- writer
90
- .indent
91
- .escape_code(:green)
92
- .text(title)
93
- .escape_code(:reset_fg)
94
- .newline
95
-
96
- writer.increase_indentation
97
- end
98
-
99
- def exit_context(title, result, batch_data: nil)
100
- return if title.nil?
101
-
102
- writer.decrease_indentation
103
-
104
- if verbose?
105
- text = "Finished context #{title.inspect} (Result: #{result_text(result)})"
106
-
107
- color = result ? :green : :red
108
-
109
- writer
110
- .indent
111
- .escape_code(:faint).escape_code(:italic).escape_code(color)
112
- .text(text)
113
- .escape_code(:reset_fg).escape_code(:reset_italic).escape_code(:reset_intensity)
114
- .newline
115
- end
116
-
117
- if writer.indentation_depth.zero?
118
- writer.newline
119
- end
120
-
121
- ensure
122
- batch_finished(batch_data) unless batch_data.nil?
123
- end
124
-
125
- def skip_context(title)
126
- return if title.nil?
127
-
128
- writer
129
- .indent
130
- .escape_code(:yellow)
131
- .text(title)
132
- .escape_code(:reset_fg)
133
- .newline
134
- end
135
-
136
- def start_test(title, batch_data: nil)
137
- batch_starting(batch_data) unless batch_data.nil?
138
-
139
- batch_data = nil if verbose
140
-
141
- if batch_data&.passed? && title.nil?
142
- return
143
- end
144
-
145
- if batch_data.nil?
146
- if title.nil?
147
- text = "Starting test"
148
- else
149
- text = "Starting test #{title.inspect}"
150
- end
151
-
152
- writer
153
- .indent
154
- .escape_code(:faint)
155
- .escape_code(:italic)
156
- .escape_code(:blue)
157
- .text(text)
158
- .escape_code(:reset_fg)
159
- .escape_code(:reset_italic)
160
- .escape_code(:reset_intensity)
161
- .newline
162
-
163
- else
164
- result = batch_data.result
165
-
166
- print_test_result(title, result)
167
- end
168
-
169
- writer.increase_indentation
170
- end
171
-
172
- def finish_test(title, result, batch_data: nil)
173
- batch_data = nil if verbose?
174
-
175
- if batch_data&.passed? && title.nil?
176
- return
177
- end
178
-
179
- writer.decrease_indentation
180
-
181
- if batch_data.nil?
182
- print_test_result(title, result)
183
- end
184
-
185
- ensure
186
- batch_finished(batch_data) unless batch_data.nil?
187
- end
188
-
189
- def print_test_result(title, result)
190
- title ||= default_test_title
191
-
192
- if writer.styling?
193
- text = title
194
- elsif result
195
- text = title
196
- else
197
- text = "#{title} (failed)"
198
- end
199
-
200
- color = result ? :green : :red
201
-
202
- writer.indent
203
-
204
- if result
205
- writer.escape_code(:green)
206
- else
207
- writer.escape_code(:bold).escape_code(:red)
208
- end
209
-
210
- writer.text(text)
211
-
212
- writer.escape_code(:reset_fg)
213
- unless result
214
- writer.escape_code(:reset_intensity)
215
- end
216
-
217
- writer.newline
218
- end
219
-
220
- def skip_test(title)
221
- title ||= default_test_title
222
-
223
- if writer.styling?
224
- text = title
225
- else
226
- text = "#{title} (skipped)"
227
- end
228
-
229
- writer
230
- .indent
231
- .escape_code(:yellow)
232
- .text(text)
233
- .escape_code(:reset_fg)
234
- .newline
235
- end
236
-
237
- def start_fixture(fixture, batch_data: nil)
238
- batch_starting(batch_data) unless batch_data.nil?
239
-
240
- return unless verbose?
241
-
242
- fixture_class = fixture.class.inspect
243
-
244
- text = "Starting fixture (Fixture: #{fixture_class})"
245
-
246
- writer
247
- .indent
248
- .escape_code(:blue)
249
- .text(text)
250
- .escape_code(:reset_fg)
251
- .newline
252
-
253
- writer.increase_indentation
254
- end
255
-
256
- def finish_fixture(fixture, result, batch_data: nil)
257
- return unless verbose?
258
-
259
- fixture_class = fixture.class.inspect
260
-
261
- text = "Finished fixture (Fixture: #{fixture_class}, Result: #{result_text(result)})"
262
-
263
- writer.decrease_indentation
264
-
265
- writer
266
- .indent
267
- .escape_code(:magenta)
268
- .text(text)
269
- .escape_code(:reset_fg)
270
- .newline
271
-
272
- ensure
273
- batch_finished(batch_data) unless batch_data.nil?
274
- end
275
-
276
- def error(error)
277
- print_error(error)
278
- end
279
-
280
- def comment(text)
281
- writer
282
- .indent
283
- .text(text)
284
- .newline
285
- end
286
-
287
- def detail(text)
288
- return unless verbose? || detail?
289
-
290
- if verbose? && !detail?
291
- text = "(detail omitted: #{text})"
292
- end
293
-
294
- writer
295
- .indent
296
- .text(text)
297
- .newline
298
- end
299
-
300
- def enter_file(path)
301
- text = "Running #{path}"
302
-
303
- writer.text(text).newline
304
-
305
- self.previous_byte_offset = writer.byte_offset
306
- end
307
-
308
- def exit_file(path, result)
309
- unless writer.byte_offset > previous_byte_offset
310
- writer
311
- .escape_code(:faint)
312
- .text("(Nothing written)")
313
- .escape_code(:reset_intensity)
314
- .newline
315
-
316
- writer.newline
317
- end
318
- end
319
-
320
- def result_text(result)
321
- result ? 'pass' : 'failure'
322
- end
323
-
324
- def default_test_title
325
- 'Test'
326
- end
327
-
328
- def self.assure_detail_setting(detail_setting)
329
- unless detail_settings.include?(detail_setting)
330
- raise Error, "Invalid detail setting #{detail_setting.inspect} (Valid values: #{detail_settings.map(&:inspect).join(', ')})"
331
- end
332
- end
333
-
334
- def self.detail_settings
335
- [
336
- :failure,
337
- :on,
338
- :off
339
- ]
340
- end
341
-
342
- def self.default_detail_setting
343
- detail_settings.fetch(0)
344
- end
345
-
346
- module Defaults
347
- def self.verbose
348
- Environment::Boolean.fetch('TEST_BENCH_VERBOSE', false)
349
- end
350
-
351
- def self.detail
352
- detail = ::ENV['TEST_BENCH_DETAIL']
353
-
354
- if detail.nil?
355
- Raw.default_detail_setting
356
- else
357
- detail.to_sym
358
- end
359
- end
360
- end
361
- end
362
- end
363
- end
@@ -1,94 +0,0 @@
1
- module TestBench
2
- module Output
3
- class Summary
4
- module Session
5
- def self.call(file_count: nil, test_count: nil, pass_count: nil, skip_count: nil, failure_count: nil, error_count: nil, elapsed_time: nil, writer: nil)
6
- file_count ||= 0
7
- test_count ||= 0
8
- pass_count ||= 0
9
- skip_count ||= 0
10
- failure_count ||= 0
11
- error_count ||= 0
12
- elapsed_time ||= 0
13
- writer ||= Writer.build
14
-
15
- failed = error_count > 0
16
-
17
- if elapsed_time.nonzero?
18
- tests_per_second = test_count / elapsed_time
19
- end
20
-
21
- if failed
22
- writer.escape_code(:red)
23
- end
24
-
25
- writer
26
- .text("Finished running #{numeric_label(file_count, 'file')}")
27
- .newline
28
- .text("Ran %s in %.3fs (%.1f tests/second)" % [
29
- numeric_label(test_count, 'test'),
30
- elapsed_time,
31
- tests_per_second || 0])
32
- .newline
33
-
34
- if pass_count.nonzero? && !failed
35
- writer
36
- .escape_code(:green)
37
- .text("#{pass_count} passed")
38
- .escape_code(:reset_fg)
39
- else
40
- writer.text("#{pass_count} passed")
41
- end
42
-
43
- writer.text(", ")
44
-
45
- if skip_count.nonzero? && !failed
46
- writer
47
- .escape_code(:yellow)
48
- .text("#{skip_count} skipped")
49
- .escape_code(:reset_fg)
50
- else
51
- writer.text("#{skip_count} skipped")
52
- end
53
-
54
- writer.text(", ")
55
-
56
- if failure_count.nonzero?
57
- writer
58
- .escape_code(:bold)
59
- .text("#{failure_count} failed")
60
- .escape_code(:reset_intensity)
61
- else
62
- writer.text("0 failed")
63
- end
64
-
65
- writer.text(", ")
66
-
67
- if failed
68
- writer
69
- .escape_code(:bold)
70
- .text(numeric_label(error_count, 'total error'))
71
- .escape_code(:reset_intensity)
72
- .escape_code(:reset_fg)
73
- else
74
- writer.text("0 total errors")
75
- end
76
-
77
- 2.times do
78
- writer.newline
79
- end
80
- end
81
-
82
- def self.numeric_label(number, label, plural_text=nil)
83
- plural_text ||= 's'
84
-
85
- if number == 1
86
- "#{number} #{label}"
87
- else
88
- "#{number} #{label}#{plural_text}"
89
- end
90
- end
91
- end
92
- end
93
- end
94
- end
@@ -1,146 +0,0 @@
1
- module TestBench
2
- module Output
3
- class Summary
4
- include Fixture::Output
5
-
6
- include Writer::Dependency
7
-
8
- def file_count
9
- @file_count ||= 0
10
- end
11
- attr_writer :file_count
12
-
13
- def test_count
14
- @test_count ||= 0
15
- end
16
- attr_writer :test_count
17
-
18
- def pass_count
19
- @pass_count ||= 0
20
- end
21
- attr_writer :pass_count
22
-
23
- def skip_count
24
- @skip_count ||= 0
25
- end
26
- attr_writer :skip_count
27
-
28
- def failure_count
29
- @failure_count ||= 0
30
- end
31
- attr_writer :failure_count
32
-
33
- def error_count
34
- @error_count ||= 0
35
- end
36
- attr_writer :error_count
37
-
38
- def elapsed_time
39
- @elapsed_time ||= 0
40
- end
41
- attr_writer :elapsed_time
42
-
43
- def timer
44
- @timer ||= Timer::Substitute.build
45
- end
46
- attr_writer :timer
47
-
48
- def errors_by_file
49
- @errors_by_file ||= Hash.new do |hash, key|
50
- hash[key] = []
51
- end
52
- end
53
- attr_writer :errors_by_file
54
-
55
- attr_accessor :current_file
56
-
57
- def configure(writer: nil, device: nil, styling: nil)
58
- Writer.configure(self, writer: writer, device: device, styling: styling)
59
- Timer.configure(self)
60
- end
61
-
62
- def self.build(writer: nil, device: nil, styling: nil)
63
- instance = new
64
- instance.configure(writer: writer, device: device, styling: styling)
65
- instance
66
- end
67
-
68
- def enter_file(file)
69
- timer.start
70
-
71
- self.current_file = file
72
- end
73
-
74
- def exit_file(_, _)
75
- elapsed_time = timer.stop
76
-
77
- self.elapsed_time += elapsed_time
78
-
79
- self.file_count += 1
80
- end
81
-
82
- def finish_test(_, result)
83
- self.test_count += 1
84
-
85
- if result
86
- self.pass_count += 1
87
- else
88
- self.failure_count += 1
89
- end
90
- end
91
-
92
- def skip_test(_)
93
- self.skip_count += 1
94
- end
95
-
96
- def error(error)
97
- errors_by_file[current_file] << error
98
-
99
- self.error_count += 1
100
- end
101
-
102
- def finish(_)
103
- error_summary
104
-
105
- session_summary
106
- end
107
-
108
- def session_summary
109
- Session.(file_count: file_count, test_count: test_count, pass_count: pass_count, skip_count: skip_count, failure_count: failure_count, error_count: error_count, elapsed_time: elapsed_time, writer: writer)
110
- end
111
-
112
- def error_summary
113
- return if errors_by_file.empty?
114
-
115
- writer
116
- .escape_code(:bold)
117
- .escape_code(:red)
118
- .text('Error Summary:')
119
- .escape_code(:reset_intensity)
120
- .escape_code(:reset_fg)
121
- .newline
122
-
123
- errors_by_file.each do |file, errors|
124
- error_count = errors.count
125
-
126
- writer
127
- .text(error_count.to_s.rjust(4, ' '))
128
- .text(": #{file}")
129
- .newline
130
-
131
- errors.each do |error|
132
- writer
133
- .text(' ')
134
- .escape_code(:red)
135
-
136
- PrintError.error_message(error, writer: writer)
137
-
138
- writer.escape_code(:reset_fg)
139
- end
140
- end
141
-
142
- writer.newline
143
- end
144
- end
145
- end
146
- end
@@ -1,45 +0,0 @@
1
- module TestBench
2
- module Output
3
- class Timer
4
- module Substitute
5
- def self.build
6
- Timer.new
7
- end
8
-
9
- class Timer < Timer
10
- def elapsed_time
11
- @elapsed_time ||= 0.0
12
- end
13
- attr_writer :elapsed_time
14
-
15
- def mode
16
- @mode ||= Mode.stopped
17
- end
18
- attr_writer :mode
19
-
20
- def start(_=nil)
21
- if mode == Mode.running
22
- raise Error, "Timer has already started"
23
- end
24
-
25
- self.mode = Mode.running
26
- end
27
-
28
- def stop(_=nil)
29
- if mode == Mode.stopped
30
- raise Error, "Timer has not started"
31
- end
32
-
33
- self.mode = Mode.stopped
34
-
35
- elapsed_time.round(3)
36
- end
37
-
38
- def set(elapsed_time)
39
- self.elapsed_time = elapsed_time
40
- end
41
- end
42
- end
43
- end
44
- end
45
- end
@@ -1,75 +0,0 @@
1
- module TestBench
2
- module Output
3
- class Timer
4
- Error = Class.new(RuntimeError)
5
-
6
- attr_accessor :start_time
7
-
8
- def self.configure(receiver, attr_name: nil)
9
- attr_name ||= :timer
10
-
11
- instance = new
12
- receiver.public_send(:"#{attr_name}=", instance)
13
- instance
14
- end
15
-
16
- def start(now=nil)
17
- now ||= ::Time.now.utc
18
-
19
- if mode == Mode.running
20
- raise Error, "Timer has already started (Start Time: #{start_time})"
21
- end
22
-
23
- self.start_time = now
24
- end
25
-
26
- def stop(now=nil)
27
- now ||= ::Time.now.utc
28
-
29
- if mode == Mode.stopped
30
- raise Error, "Timer has not started"
31
- end
32
-
33
- start_time = reset
34
-
35
- elapsed = now - start_time
36
-
37
- elapsed.round(3)
38
- end
39
-
40
- def running?
41
- mode == Mode.running
42
- end
43
-
44
- def stopped?
45
- mode == Mode.stopped
46
- end
47
-
48
- def mode
49
- if start_time.nil?
50
- Mode.stopped
51
- else
52
- Mode.running
53
- end
54
- end
55
-
56
- def reset
57
- previous_start_time = self.start_time
58
-
59
- self.start_time = nil
60
-
61
- previous_start_time
62
- end
63
-
64
- module Mode
65
- def self.running
66
- :running
67
- end
68
-
69
- def self.stopped
70
- :stopped
71
- end
72
- end
73
- end
74
- end
75
- end