test_bench 1.0.0.0 → 1.2.0.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 (35) hide show
  1. checksums.yaml +4 -4
  2. data/lib/test_bench.rb +9 -9
  3. data/lib/test_bench/cli.rb +2 -2
  4. data/lib/test_bench/cli/parse_arguments.rb +33 -20
  5. data/lib/test_bench/controls.rb +5 -1
  6. data/lib/test_bench/controls/output/batch_data.rb +52 -0
  7. data/lib/test_bench/controls/output/detail_setting.rb +29 -0
  8. data/lib/test_bench/controls/output/exercise.rb +7 -0
  9. data/lib/test_bench/controls/output/log_level.rb +7 -0
  10. data/lib/test_bench/controls/output/summary/error.rb +0 -16
  11. data/lib/test_bench/controls/output/summary/session.rb +20 -0
  12. data/lib/test_bench/controls/pattern.rb +6 -2
  13. data/lib/test_bench/controls/time.rb +18 -0
  14. data/lib/test_bench/deactivation_variants.rb +0 -10
  15. data/lib/test_bench/output.rb +14 -2
  16. data/lib/test_bench/output/batch_data.rb +17 -0
  17. data/lib/test_bench/output/buffer.rb +112 -0
  18. data/lib/test_bench/output/log.rb +27 -0
  19. data/lib/test_bench/output/raw.rb +353 -0
  20. data/lib/test_bench/output/summary.rb +146 -0
  21. data/lib/test_bench/output/summary/session.rb +94 -0
  22. data/lib/test_bench/output/writer.rb +2 -2
  23. data/lib/test_bench/run.rb +9 -9
  24. data/lib/test_bench/test_bench.rb +31 -3
  25. metadata +18 -17
  26. data/lib/test_bench/controls/output/summary/run.rb +0 -59
  27. data/lib/test_bench/output/build.rb +0 -57
  28. data/lib/test_bench/output/levels/debug.rb +0 -229
  29. data/lib/test_bench/output/levels/failure.rb +0 -31
  30. data/lib/test_bench/output/levels/none.rb +0 -13
  31. data/lib/test_bench/output/levels/pass.rb +0 -274
  32. data/lib/test_bench/output/levels/summary.rb +0 -21
  33. data/lib/test_bench/output/summary/error.rb +0 -77
  34. data/lib/test_bench/output/summary/run.rb +0 -102
  35. data/lib/test_bench/output/summary/run/print.rb +0 -98
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '0359bdc17397c6a467d757d2c50851ebe475625536e04ebbb2e65b1bb804d3fd'
4
- data.tar.gz: 4db8e6a9084c79383349d9eaafd9b88911316174654ce0c26a91e68fff2e6868
3
+ metadata.gz: afaeab0cc192ef871046e2b2080e87f9ae413a0da8a55e2893e240f76369c87e
4
+ data.tar.gz: 9cca5db44320b3956cbb8754251703087024411d274e608a2d731ce6c7a2729d
5
5
  SHA512:
6
- metadata.gz: 2fb8769efb25591f4eb2bbc1c3b1c0a5b185bb5a3853c224ca8998467564023196a0142413f4380d19d9dd26ecd6e5fd93d91f74034a3852dd567b527277266c
7
- data.tar.gz: 48252b7032528645d743e4a1f52faaf95f61763c17c6ad4078d1f208610f529a2acff4318f5446efb140df63a9323df3d08b0fdd7c5e56f0824db7af8bcc46cd
6
+ metadata.gz: 80da06a441f1f3a547a62ee37fbf36f1d6c1c9541bd240c82fc94d7d380da1f6ddf717d6a626c5f50161488dfe4178057e14c59183ad751660bf8627fc322db4
7
+ data.tar.gz: 42d0355bb4f6c81a1819da5cfffa1fd41ece43b1f1a2e14600e5f52a9ef53f11a10309c792862bef9557bfe62a5e44a644883dda4b427b362fd813f8c2361c0b
@@ -14,17 +14,17 @@ require 'test_bench/output/timer/substitute'
14
14
 
15
15
  require 'test_bench/output/print_error'
16
16
 
17
- require 'test_bench/output/summary/run/print'
18
- require 'test_bench/output/summary/run'
19
- require 'test_bench/output/summary/error'
17
+ require 'test_bench/output/summary'
18
+ require 'test_bench/output/summary/session'
20
19
 
21
- require 'test_bench/output/levels/none'
22
- require 'test_bench/output/levels/summary'
23
- require 'test_bench/output/levels/failure'
24
- require 'test_bench/output/levels/debug'
25
- require 'test_bench/output/levels/pass'
20
+ require 'test_bench/output/batch_data'
21
+
22
+ require 'test_bench/output/raw'
23
+
24
+ require 'test_bench/output/buffer'
25
+
26
+ require 'test_bench/output/log'
26
27
 
27
- require 'test_bench/output/build'
28
28
  require 'test_bench/output'
29
29
 
30
30
  require 'test_bench/test_bench'
@@ -1,6 +1,6 @@
1
1
  module TestBench
2
2
  module CLI
3
- def self.call(tests_directory=nil, **runner_args)
3
+ def self.call(tests_directory=nil, exclude_file_pattern: nil)
4
4
  tests_directory ||= Defaults.tests_directory
5
5
 
6
6
  path_arguments = ParseArguments.()
@@ -11,7 +11,7 @@ module TestBench
11
11
  warn "$stdin is a pipe, but no data was written to it; no test files will be run"
12
12
  end
13
13
 
14
- Run.(**runner_args) do |run|
14
+ Run.(exclude: exclude_file_pattern) do |run|
15
15
  if read_stdin
16
16
  until $stdin.eof?
17
17
  path = $stdin.gets.chomp
@@ -62,11 +62,23 @@ module TestBench
62
62
  parser.separator('')
63
63
  parser.separator("Configuration Options")
64
64
 
65
- parser.on('-a', '--[no-]abort-on-error', %{Exit immediately after any test failure or error (Default: #{Session::Defaults.abort_on_error ? 'on' : 'off'})}) do |abort_on_error|
65
+ parser.on('-a', '--[no-]abort-on-error', %{Exit immediately after any test failure or error (Default: #{TestBench::Defaults.abort_on_error ? 'on' : 'off'})}) do |abort_on_error|
66
66
  env['TEST_BENCH_ABORT_ON_ERROR'] = abort_on_error ? 'on' : 'off'
67
67
  end
68
68
 
69
- parser.on('-x', '--[no-]exclude PATTERN', %{Do not execute test files matching PATTERN (Default: #{Run::Defaults.exclude_file_pattern.inspect})}) do |pattern_text|
69
+ parser.on('-d', '--[no-]detail [DETAIL]', %{Always show (or hide) details (Default: #{Output::Raw::Defaults.detail})}) do |detail|
70
+ if detail.nil?
71
+ detail = 'on'
72
+ elsif detail == true
73
+ detail = 'on'
74
+ elsif detail == false
75
+ detail = 'off'
76
+ end
77
+
78
+ env['TEST_BENCH_DETAIL'] = detail
79
+ end
80
+
81
+ parser.on('-x', '--[no-]exclude PATTERN', %{Do not execute test files matching PATTERN (Default: #{Run::Defaults.exclude_pattern.inspect})}) do |pattern_text|
70
82
  if pattern_text == false
71
83
  pattern_text = self.none_pattern
72
84
  end
@@ -76,6 +88,14 @@ module TestBench
76
88
  env['TEST_BENCH_EXCLUDE_FILE_PATTERN'] = pattern_text
77
89
  end
78
90
 
91
+ parser.on('-l', '--log-level LEVEL', %{Set the internal logging level to LEVEL (Default: #{Output::Log::Defaults.level})}) do |level_text|
92
+ level = level_text.to_sym
93
+
94
+ Fixture::Output::Log.assure_level(level)
95
+
96
+ env['TEST_BENCH_LOG_LEVEL'] = level_text
97
+ end
98
+
79
99
  parser.on('-o', '--[no-]omit-backtrace PATTERN', %{Omit backtrace frames matching PATTERN (Default: #{Output::PrintError::Defaults.omit_backtrace_pattern.inspect})}) do |pattern_text|
80
100
  if pattern_text == false
81
101
  pattern_text = self.none_pattern
@@ -86,25 +106,17 @@ module TestBench
86
106
  env['TEST_BENCH_OMIT_BACKTRACE_PATTERN'] = pattern_text
87
107
  end
88
108
 
89
- parser.on('-l', '--output-level [none|summary|failure|pass|debug]', %{Sets output level (Default: #{Output::Build::Defaults.level})}) do |level_text|
90
- level = level_text.to_sym
91
-
92
- Output::Build.assure_level(level)
93
-
94
- env['TEST_BENCH_OUTPUT_LEVEL'] = level_text
95
- end
96
-
97
- parser.on('-s', '--output-styling [on|off|detect]', %{Render output coloring and font styling escape codes (Default: #{Output::Writer::Defaults.styling_setting})}) do |styling_text|
109
+ parser.on('-s', '--output-styling [on|off|detect]', %{Render output coloring and font styling escape codes (Default: #{Output::Writer::Defaults.styling})}) do |styling_text|
98
110
  styling_text ||= 'on'
99
111
 
100
- styling_setting = styling_text.to_sym
112
+ styling = styling_text.to_sym
101
113
 
102
- Output::Writer.assure_styling_setting(styling_setting)
114
+ Output::Writer.assure_styling_setting(styling)
103
115
 
104
116
  env['TEST_BENCH_OUTPUT_STYLING'] = styling_text
105
117
  end
106
118
 
107
- parser.on('-p', '--[no-]permit-deactivated-tests', %{Do not fail the test run if there are deactivated tests or contexts, e.g. _test or _context (Default: #{!DeactivationVariants::Defaults.fail_session ? 'on' : 'off'})}) do |permit_deactivated_tests|
119
+ parser.on('-p', '--[no-]permit-deactivated-tests', %{Do not fail the test run if there are deactivated tests or contexts, e.g. _test or _context (Default: #{!TestBench::Defaults.fail_deactivated_tests ? 'on' : 'off'})}) do |permit_deactivated_tests|
108
120
  env['TEST_BENCH_FAIL_DEACTIVATED_TESTS'] = !permit_deactivated_tests ? 'on' : 'off'
109
121
  end
110
122
 
@@ -112,6 +124,10 @@ module TestBench
112
124
  env['TEST_BENCH_REVERSE_BACKTRACES'] = reverse_backtraces ? 'on' : 'off'
113
125
  end
114
126
 
127
+ parser.on('-v', '--[no-]verbose', %{Increase output verbosity (Default: #{Output::Raw::Defaults.verbose ? 'on' : 'off'})}) do |verbose|
128
+ env['TEST_BENCH_VERBOSE'] = verbose ? 'on' : 'off'
129
+ end
130
+
115
131
  parser.separator(<<~TEXT)
116
132
 
117
133
  Paths to test files (and directories containing test files) can be given after any command line arguments or via STDIN (or both).
@@ -120,17 +136,14 @@ module TestBench
120
136
  The following environment variables can also control execution:
121
137
 
122
138
  #{parser.summary_indent}TEST_BENCH_ABORT_ON_ERROR Same as -a or --abort-on-error
139
+ #{parser.summary_indent}TEST_BENCH_DETAIL Same as -d or --detail
123
140
  #{parser.summary_indent}TEST_BENCH_EXCLUDE_FILE_PATTERN Same as -x or --exclude-file-pattern
141
+ #{parser.summary_indent}TEST_BENCH_LOG_LEVEL Same as -l or --log-level
124
142
  #{parser.summary_indent}TEST_BENCH_OMIT_BACKTRACE_PATTERN Same as -o or --omit-backtrace-pattern
125
- #{parser.summary_indent}TEST_BENCH_OUTPUT_LEVEL Same as -l or --output-level
126
143
  #{parser.summary_indent}TEST_BENCH_OUTPUT_STYLING Same as -s or --output-styling
127
144
  #{parser.summary_indent}TEST_BENCH_FAIL_DEACTIVATED_TESTS Opposite of -p or --permit-deactivated-tests
128
145
  #{parser.summary_indent}TEST_BENCH_REVERSE_BACKTRACES Same as -r or --reverse-backtraces
129
-
130
- TEXT
131
-
132
- parser.separator(<<~TEXT)
133
- Finally, the VERBOSE environment variable can set the output level to debug. If given, VERBOSE will take precedence over TEST_BENCH_OUTPUT_STYLING.
146
+ #{parser.summary_indent}TEST_BENCH_VERBOSE Same as -v or --reverse-backtraces
134
147
 
135
148
  TEXT
136
149
  end
@@ -18,5 +18,9 @@ require 'test_bench/controls/output/escape_code'
18
18
  require 'test_bench/controls/output/newline_character'
19
19
  require 'test_bench/controls/output/styling'
20
20
  require 'test_bench/controls/output/print_error'
21
- require 'test_bench/controls/output/summary/run'
21
+ require 'test_bench/controls/output/exercise'
22
+ require 'test_bench/controls/output/summary/session'
22
23
  require 'test_bench/controls/output/summary/error'
24
+ require 'test_bench/controls/output/batch_data'
25
+ require 'test_bench/controls/output/detail_setting'
26
+ require 'test_bench/controls/output/log_level'
@@ -0,0 +1,52 @@
1
+ module TestBench
2
+ module Controls
3
+ module Output
4
+ module BatchData
5
+ def self.example(result: nil, depth: nil)
6
+ result = self.result if result.nil?
7
+ depth ||= self.depth
8
+
9
+ TestBench::Output::BatchData.new(result, depth)
10
+ end
11
+
12
+ def self.result
13
+ Pass.result
14
+ end
15
+
16
+ def self.depth
17
+ 1
18
+ end
19
+
20
+ module Pass
21
+ def self.example(depth: nil)
22
+ BatchData.example(result: result, depth: depth)
23
+ end
24
+
25
+ def self.result
26
+ Result::Pass.example
27
+ end
28
+ end
29
+
30
+ module Failure
31
+ def self.example(depth: nil)
32
+ BatchData.example(result: result, depth: depth)
33
+ end
34
+
35
+ def self.result
36
+ Result::Failure.example
37
+ end
38
+ end
39
+
40
+ module Toplevel
41
+ def self.example(result: nil)
42
+ BatchData.example(depth: depth, result: result)
43
+ end
44
+
45
+ def self.depth
46
+ 0
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,29 @@
1
+ module TestBench
2
+ module Controls
3
+ module Output
4
+ module DetailSetting
5
+ def self.example
6
+ failure
7
+ end
8
+
9
+ def self.failure
10
+ :failure
11
+ end
12
+
13
+ def self.on
14
+ :on
15
+ end
16
+
17
+ def self.off
18
+ :off
19
+ end
20
+
21
+ module Invalid
22
+ def self.example
23
+ :not_a_detail_setting
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,7 @@
1
+ module TestBench
2
+ module Controls
3
+ module Output
4
+ Exercise = TestBench::Fixture::Controls::Output::Exercise
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ module TestBench
2
+ module Controls
3
+ module Output
4
+ LogLevel = TestBench::Fixture::Controls::Output::Log::Level
5
+ end
6
+ end
7
+ end
@@ -3,22 +3,6 @@ module TestBench
3
3
  module Output
4
4
  module Summary
5
5
  module Error
6
- def self.example(writer: nil)
7
- error_summary = Example.new
8
- error_summary.writer = writer unless writer.nil?
9
- error_summary
10
- end
11
-
12
- class Example
13
- include TestBench::Fixture::Output
14
- include TestBench::Output::Summary::Error
15
-
16
- TestBench::Fixture::Output.instance_methods.each do |method|
17
- define_method(method) do |*|
18
- end
19
- end
20
- end
21
-
22
6
  module Text
23
7
  def self.example
24
8
  <<~TEXT
@@ -0,0 +1,20 @@
1
+ module TestBench
2
+ module Controls
3
+ module Output
4
+ module Summary
5
+ module Session
6
+ module Text
7
+ def self.example
8
+ <<~TEXT
9
+ Finished running 0 files
10
+ Ran 0 tests in 0.000s (0.0 tests/second)
11
+ 0 passed, 0 skipped, 0 failed, 0 total errors
12
+
13
+ TEXT
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,8 +1,12 @@
1
1
  module TestBench
2
2
  module Controls
3
3
  module Pattern
4
- def self.example
5
- /#{text}/
4
+ def self.example(text=nil)
5
+ text ||= self.text
6
+
7
+ escaped_text = Regexp.escape(text)
8
+
9
+ Regexp.new(escaped_text)
6
10
  end
7
11
 
8
12
  def self.text
@@ -55,6 +55,24 @@ module TestBench
55
55
  "1.111s"
56
56
  end
57
57
  end
58
+
59
+ module PerSecond
60
+ def self.example
61
+ elapsed_time = Elapsed.example
62
+
63
+ Rational(ocurrences, elapsed_time)
64
+ end
65
+
66
+ def self.ocurrences
67
+ 1
68
+ end
69
+
70
+ module Text
71
+ def self.example
72
+ "0.9"
73
+ end
74
+ end
75
+ end
58
76
  end
59
77
  end
60
78
  end
@@ -1,21 +1,11 @@
1
1
  module TestBench
2
2
  module DeactivationVariants
3
3
  def _context(title=nil, &block)
4
- test_session.fail! if Defaults.fail_session
5
-
6
4
  context(title)
7
5
  end
8
6
 
9
7
  def _test(title=nil, &block)
10
- test_session.fail! if Defaults.fail_session
11
-
12
8
  test(title)
13
9
  end
14
-
15
- module Defaults
16
- def self.fail_session
17
- Environment::Boolean.fetch('TEST_BENCH_FAIL_DEACTIVATED_TESTS', true)
18
- end
19
- end
20
10
  end
21
11
  end
@@ -1,7 +1,19 @@
1
1
  module TestBench
2
2
  module Output
3
- def self.build(**args)
4
- Build.(**args)
3
+ def self.build(log_level: nil, writer: nil, device: nil, styling: nil, **buffer_output_args)
4
+ summary = Summary.build(writer: writer, device: device, styling: styling)
5
+
6
+ log_output = Log.build(level: log_level)
7
+
8
+ writer = summary.writer
9
+
10
+ buffer_output = Buffer.build(writer: writer, **buffer_output_args)
11
+
12
+ Fixture::Output::Multiple.build(
13
+ log_output,
14
+ buffer_output,
15
+ summary
16
+ )
5
17
  end
6
18
 
7
19
  Substitute = Fixture::Output::Substitute
@@ -0,0 +1,17 @@
1
+ module TestBench
2
+ module Output
3
+ BatchData = Struct.new(:result, :depth) do
4
+ def passed?
5
+ result
6
+ end
7
+
8
+ def failed?
9
+ !result
10
+ end
11
+
12
+ def toplevel?
13
+ depth.zero?
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,112 @@
1
+ module TestBench
2
+ module Output
3
+ class Buffer < Fixture::Output::Capture
4
+ attr_accessor :writer
5
+
6
+ def raw_output
7
+ @raw_output ||= Raw.new
8
+ end
9
+ attr_writer :raw_output
10
+
11
+ def stack
12
+ @stack ||= []
13
+ end
14
+
15
+ def self.build(verbose: nil, detail: nil, omit_backtrace_pattern: nil, reverse_backtraces: nil, writer: nil, device: nil, styling: nil)
16
+ instance = new
17
+
18
+ raw_output = Raw.configure(instance, verbose: verbose, detail: detail, omit_backtrace_pattern: omit_backtrace_pattern, reverse_backtraces: reverse_backtraces, writer: writer, device: device, styling: styling)
19
+
20
+ instance.writer = raw_output.writer
21
+
22
+ instance
23
+ end
24
+
25
+ def exit_context(*)
26
+ super
27
+
28
+ flush unless buffering?
29
+ end
30
+
31
+ def finish_test(*)
32
+ super
33
+
34
+ flush unless buffering?
35
+ end
36
+
37
+ def finish_fixture(*)
38
+ super
39
+
40
+ flush unless buffering?
41
+ end
42
+
43
+ def new_record(signal, data)
44
+ record = Record.new(signal, data)
45
+
46
+ case signal
47
+ when :enter_context, :start_test, :start_fixture
48
+ start_batch(record)
49
+
50
+ when :exit_context, :finish_test, :finish_fixture
51
+ result = record.data.last
52
+
53
+ finish_batch(record, result)
54
+ end
55
+
56
+ record
57
+ end
58
+
59
+ def start_batch(record)
60
+ record.start_batch(stack_depth)
61
+
62
+ stack.push(record)
63
+ end
64
+
65
+ def finish_batch(final_record, result)
66
+ first_record = stack.pop
67
+
68
+ batch_data = first_record.batch_data
69
+ batch_data.result = result
70
+
71
+ final_record.batch_data = first_record.batch_data
72
+ end
73
+
74
+ def flush
75
+ records.each do |record|
76
+ record.forward(raw_output)
77
+ end
78
+
79
+ records.clear
80
+ end
81
+
82
+ def buffering?
83
+ stack_depth.nonzero?
84
+ end
85
+
86
+ def stack_depth
87
+ stack.length
88
+ end
89
+
90
+ class Record < Fixture::Output::Capture::Record
91
+ attr_accessor :batch_data
92
+
93
+ def forward(raw_output)
94
+ return super if batch_data.nil?
95
+
96
+ raw_output.public_send(signal, *data, batch_data: batch_data)
97
+ end
98
+
99
+ def start_batch(depth)
100
+ batch_data = Output::BatchData.new
101
+ batch_data.depth = depth
102
+
103
+ self.batch_data = batch_data
104
+ end
105
+
106
+ def finish_batch(result)
107
+ batch_data.result = result
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end