test_bench 1.0.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +7 -0
  2. data/lib/test_bench.rb +37 -0
  3. data/lib/test_bench/cli.rb +43 -0
  4. data/lib/test_bench/cli/parse_arguments.rb +168 -0
  5. data/lib/test_bench/controls.rb +22 -0
  6. data/lib/test_bench/controls/caller_location.rb +5 -0
  7. data/lib/test_bench/controls/depth.rb +21 -0
  8. data/lib/test_bench/controls/device.rb +27 -0
  9. data/lib/test_bench/controls/directory.rb +15 -0
  10. data/lib/test_bench/controls/error.rb +35 -0
  11. data/lib/test_bench/controls/fixture.rb +29 -0
  12. data/lib/test_bench/controls/output/escape_code.rb +23 -0
  13. data/lib/test_bench/controls/output/newline_character.rb +11 -0
  14. data/lib/test_bench/controls/output/print_error.rb +19 -0
  15. data/lib/test_bench/controls/output/styling.rb +29 -0
  16. data/lib/test_bench/controls/output/summary/error.rb +44 -0
  17. data/lib/test_bench/controls/output/summary/run.rb +59 -0
  18. data/lib/test_bench/controls/path.rb +15 -0
  19. data/lib/test_bench/controls/pattern.rb +29 -0
  20. data/lib/test_bench/controls/result.rb +5 -0
  21. data/lib/test_bench/controls/test_file.rb +5 -0
  22. data/lib/test_bench/controls/time.rb +61 -0
  23. data/lib/test_bench/deactivation_variants.rb +21 -0
  24. data/lib/test_bench/environment/boolean.rb +40 -0
  25. data/lib/test_bench/fixtures.rb +3 -0
  26. data/lib/test_bench/fixtures/configure_receiver.rb +80 -0
  27. data/lib/test_bench/output.rb +9 -0
  28. data/lib/test_bench/output/build.rb +57 -0
  29. data/lib/test_bench/output/levels/debug.rb +229 -0
  30. data/lib/test_bench/output/levels/failure.rb +31 -0
  31. data/lib/test_bench/output/levels/none.rb +13 -0
  32. data/lib/test_bench/output/levels/pass.rb +274 -0
  33. data/lib/test_bench/output/levels/summary.rb +21 -0
  34. data/lib/test_bench/output/print_error.rb +163 -0
  35. data/lib/test_bench/output/summary/error.rb +77 -0
  36. data/lib/test_bench/output/summary/run.rb +102 -0
  37. data/lib/test_bench/output/summary/run/print.rb +98 -0
  38. data/lib/test_bench/output/timer.rb +75 -0
  39. data/lib/test_bench/output/timer/substitute.rb +45 -0
  40. data/lib/test_bench/output/writer.rb +192 -0
  41. data/lib/test_bench/output/writer/dependency.rb +12 -0
  42. data/lib/test_bench/output/writer/sgr.rb +54 -0
  43. data/lib/test_bench/output/writer/substitute.rb +38 -0
  44. data/lib/test_bench/run.rb +103 -0
  45. data/lib/test_bench/run/substitute.rb +36 -0
  46. data/lib/test_bench/test_bench.rb +76 -0
  47. data/script/bench +19 -0
  48. metadata +117 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: '0359bdc17397c6a467d757d2c50851ebe475625536e04ebbb2e65b1bb804d3fd'
4
+ data.tar.gz: 4db8e6a9084c79383349d9eaafd9b88911316174654ce0c26a91e68fff2e6868
5
+ SHA512:
6
+ metadata.gz: 2fb8769efb25591f4eb2bbc1c3b1c0a5b185bb5a3853c224ca8998467564023196a0142413f4380d19d9dd26ecd6e5fd93d91f74034a3852dd567b527277266c
7
+ data.tar.gz: 48252b7032528645d743e4a1f52faaf95f61763c17c6ad4078d1f208610f529a2acff4318f5446efb140df63a9323df3d08b0fdd7c5e56f0824db7af8bcc46cd
data/lib/test_bench.rb ADDED
@@ -0,0 +1,37 @@
1
+ require 'optionparser'
2
+
3
+ require 'test_bench/fixture'
4
+
5
+ require 'test_bench/environment/boolean'
6
+
7
+ require 'test_bench/output/writer'
8
+ require 'test_bench/output/writer/sgr'
9
+ require 'test_bench/output/writer/substitute'
10
+ require 'test_bench/output/writer/dependency'
11
+
12
+ require 'test_bench/output/timer'
13
+ require 'test_bench/output/timer/substitute'
14
+
15
+ require 'test_bench/output/print_error'
16
+
17
+ require 'test_bench/output/summary/run/print'
18
+ require 'test_bench/output/summary/run'
19
+ require 'test_bench/output/summary/error'
20
+
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'
26
+
27
+ require 'test_bench/output/build'
28
+ require 'test_bench/output'
29
+
30
+ require 'test_bench/test_bench'
31
+ require 'test_bench/deactivation_variants'
32
+
33
+ require 'test_bench/run'
34
+ require 'test_bench/run/substitute'
35
+
36
+ require 'test_bench/cli/parse_arguments'
37
+ require 'test_bench/cli'
@@ -0,0 +1,43 @@
1
+ module TestBench
2
+ module CLI
3
+ def self.call(tests_directory=nil, **runner_args)
4
+ tests_directory ||= Defaults.tests_directory
5
+
6
+ path_arguments = ParseArguments.()
7
+
8
+ read_stdin = $stdin.stat.pipe?
9
+
10
+ if read_stdin && $stdin.eof?
11
+ warn "$stdin is a pipe, but no data was written to it; no test files will be run"
12
+ end
13
+
14
+ Run.(**runner_args) do |run|
15
+ if read_stdin
16
+ until $stdin.eof?
17
+ path = $stdin.gets.chomp
18
+
19
+ next if path.empty?
20
+
21
+ run.path(path)
22
+ end
23
+ end
24
+
25
+ if path_arguments.empty?
26
+ unless read_stdin
27
+ run.path(tests_directory)
28
+ end
29
+ else
30
+ path_arguments.each do |path|
31
+ run.path(path)
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ module Defaults
38
+ def self.tests_directory
39
+ ENV.fetch('TEST_BENCH_TESTS_DIRECTORY', 'test/automated')
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,168 @@
1
+ module TestBench
2
+ module CLI
3
+ class ParseArguments
4
+ Error = Class.new(RuntimeError)
5
+
6
+ attr_reader :argv
7
+
8
+ def env
9
+ @env ||= {}
10
+ end
11
+ attr_writer :env
12
+
13
+ def output_device
14
+ @output_device ||= StringIO.new
15
+ end
16
+ attr_writer :output_device
17
+
18
+ def initialize(argv)
19
+ @argv = argv
20
+ end
21
+
22
+ def self.build(argv=nil, env: nil)
23
+ argv ||= ::ARGV
24
+ env ||= ::ENV
25
+
26
+ instance = new(argv)
27
+ instance.output_device = Output::Writer::Defaults.device
28
+ instance.env = env
29
+ instance
30
+ end
31
+
32
+ def self.call(argv=nil, env: nil)
33
+ instance = build(argv, env: env)
34
+ instance.()
35
+ end
36
+
37
+ def call
38
+ option_parser.parse(argv)
39
+ end
40
+
41
+ def option_parser
42
+ @option_parser ||= OptionParser.new do |parser|
43
+ parser.banner = "Usage: #{self.class.program_name} [options] [paths]"
44
+
45
+ parser.separator('')
46
+ parser.separator("Informational Options")
47
+
48
+ parser.on('-h', '--help', "Print this help message and exit successfully") do
49
+ output_device.puts(parser.help)
50
+
51
+ exit(true)
52
+ end
53
+
54
+ parser.on('-V', '--version', "Print version and exit successfully") do
55
+ output_device.puts <<~TEXT
56
+ test-bench (#{self.class.program_name}) version #{self.class.version}
57
+ TEXT
58
+
59
+ exit(true)
60
+ end
61
+
62
+ parser.separator('')
63
+ parser.separator("Configuration Options")
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|
66
+ env['TEST_BENCH_ABORT_ON_ERROR'] = abort_on_error ? 'on' : 'off'
67
+ end
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|
70
+ if pattern_text == false
71
+ pattern_text = self.none_pattern
72
+ end
73
+
74
+ assure_pattern(pattern_text)
75
+
76
+ env['TEST_BENCH_EXCLUDE_FILE_PATTERN'] = pattern_text
77
+ end
78
+
79
+ parser.on('-o', '--[no-]omit-backtrace PATTERN', %{Omit backtrace frames matching PATTERN (Default: #{Output::PrintError::Defaults.omit_backtrace_pattern.inspect})}) do |pattern_text|
80
+ if pattern_text == false
81
+ pattern_text = self.none_pattern
82
+ end
83
+
84
+ assure_pattern(pattern_text)
85
+
86
+ env['TEST_BENCH_OMIT_BACKTRACE_PATTERN'] = pattern_text
87
+ end
88
+
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|
98
+ styling_text ||= 'on'
99
+
100
+ styling_setting = styling_text.to_sym
101
+
102
+ Output::Writer.assure_styling_setting(styling_setting)
103
+
104
+ env['TEST_BENCH_OUTPUT_STYLING'] = styling_text
105
+ end
106
+
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|
108
+ env['TEST_BENCH_FAIL_DEACTIVATED_TESTS'] = !permit_deactivated_tests ? 'on' : 'off'
109
+ end
110
+
111
+ parser.on('-r', '--[no-]reverse-backtraces', %{Reverse order of backtraces when printing errors (Default: #{Output::PrintError::Defaults.reverse_backtraces ? 'on' : 'off'})}) do |reverse_backtraces|
112
+ env['TEST_BENCH_REVERSE_BACKTRACES'] = reverse_backtraces ? 'on' : 'off'
113
+ end
114
+
115
+ parser.separator(<<~TEXT)
116
+
117
+ Paths to test files (and directories containing test files) can be given after any command line arguments or via STDIN (or both).
118
+ If no paths are given, a default path (#{Defaults.tests_directory}) is scanned for test files.
119
+
120
+ The following environment variables can also control execution:
121
+
122
+ #{parser.summary_indent}TEST_BENCH_ABORT_ON_ERROR Same as -a or --abort-on-error
123
+ #{parser.summary_indent}TEST_BENCH_EXCLUDE_FILE_PATTERN Same as -x or --exclude-file-pattern
124
+ #{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
+ #{parser.summary_indent}TEST_BENCH_OUTPUT_STYLING Same as -s or --output-styling
127
+ #{parser.summary_indent}TEST_BENCH_FAIL_DEACTIVATED_TESTS Opposite of -p or --permit-deactivated-tests
128
+ #{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.
134
+
135
+ TEXT
136
+ end
137
+ end
138
+
139
+ def assure_pattern(pattern_text)
140
+ Regexp.new(pattern_text)
141
+ rescue RegexpError
142
+ raise Error, "Invalid regular expression pattern (Pattern: #{pattern_text.inspect})"
143
+ end
144
+
145
+ def none_pattern
146
+ /\z./
147
+ end
148
+
149
+ def self.program_name
150
+ $PROGRAM_NAME
151
+ end
152
+
153
+ def self.version
154
+ if defined?(Gem)
155
+ spec = Gem.loaded_specs['test_bench']
156
+ end
157
+
158
+ spec&.version || '(unknown)'
159
+ end
160
+
161
+ module Defaults
162
+ def self.tests_directory
163
+ ENV.fetch('TEST_BENCH_TESTS_DIRECTORY', 'test/automated')
164
+ end
165
+ end
166
+ end
167
+ end
168
+ end
@@ -0,0 +1,22 @@
1
+ require 'securerandom'
2
+
3
+ require 'test_bench/fixture/controls'
4
+
5
+ require 'test_bench/controls/caller_location'
6
+ require 'test_bench/controls/depth'
7
+ require 'test_bench/controls/device'
8
+ require 'test_bench/controls/directory'
9
+ require 'test_bench/controls/error'
10
+ require 'test_bench/controls/fixture'
11
+ require 'test_bench/controls/path'
12
+ require 'test_bench/controls/pattern'
13
+ require 'test_bench/controls/result'
14
+ require 'test_bench/controls/test_file'
15
+ require 'test_bench/controls/time'
16
+
17
+ require 'test_bench/controls/output/escape_code'
18
+ require 'test_bench/controls/output/newline_character'
19
+ require 'test_bench/controls/output/styling'
20
+ require 'test_bench/controls/output/print_error'
21
+ require 'test_bench/controls/output/summary/run'
22
+ require 'test_bench/controls/output/summary/error'
@@ -0,0 +1,5 @@
1
+ module TestBench
2
+ module Controls
3
+ CallerLocation = TestBench::Fixture::Controls::CallerLocation
4
+ end
5
+ end
@@ -0,0 +1,21 @@
1
+ module TestBench
2
+ module Controls
3
+ module Depth
4
+ def self.example
5
+ Nested.example
6
+ end
7
+
8
+ module Nested
9
+ def self.example
10
+ 2
11
+ end
12
+ end
13
+
14
+ module Outermost
15
+ def self.example
16
+ 0
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,27 @@
1
+ module TestBench
2
+ module Controls
3
+ module Device
4
+ def self.example
5
+ Interactive.example
6
+ end
7
+
8
+ module Interactive
9
+ def self.example
10
+ device = Non.example
11
+
12
+ def device.tty?
13
+ true
14
+ end
15
+
16
+ device
17
+ end
18
+
19
+ module Non
20
+ def self.example
21
+ StringIO.new
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,15 @@
1
+ module TestBench
2
+ module Controls
3
+ module Directory
4
+ def self.example
5
+ Dir.mktmpdir
6
+ end
7
+
8
+ module NonExistent
9
+ def self.example
10
+ "/tmp/#{SecureRandom.hex(7)}"
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,35 @@
1
+ module TestBench
2
+ module Controls
3
+ Error = TestBench::Fixture::Controls::Error
4
+
5
+ module Error
6
+ module Text
7
+ def self.example(message=nil, indentation_depth: nil)
8
+ indentation_depth ||= 0
9
+
10
+ indent = ' ' * indentation_depth
11
+
12
+ error = Error.example(message)
13
+
14
+ <<~TEXT
15
+ #{indent}#{error.backtrace[0]}: #{error.message} (#{error.class.name})
16
+ \t#{indent}from #{error.backtrace[1]}
17
+ \t#{indent}from #{error.backtrace[2]}
18
+ TEXT
19
+ end
20
+
21
+ module Assertion
22
+ def self.example(caller_location: nil)
23
+ caller_location ||= CallerLocation.example
24
+
25
+ assertion_failure = TestBench::Fixture::AssertionFailure.build(caller_location)
26
+
27
+ <<~TEXT
28
+ #{assertion_failure.backtrace[0]}: #{assertion_failure.message} (#{assertion_failure.class.name})
29
+ TEXT
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,29 @@
1
+ module TestBench
2
+ module Controls
3
+ module Fixture
4
+ def self.example(output=nil, error_policy: nil)
5
+ error_policy ||= self.error_policy
6
+
7
+ fixture = Example.new
8
+
9
+ TestBench::Fixture::ErrorPolicy.configure(fixture.test_session, policy: error_policy)
10
+
11
+ unless output.nil?
12
+ fixture.test_session.output = output
13
+ end
14
+
15
+ fixture
16
+ end
17
+
18
+ def self.example_class(&block)
19
+ TestBench::Fixture::Controls::Fixture.example_class(&block)
20
+ end
21
+
22
+ def self.error_policy
23
+ :rescue
24
+ end
25
+
26
+ Example = example_class
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,23 @@
1
+ module TestBench
2
+ module Controls
3
+ module Output
4
+ module EscapeCode
5
+ def self.example
6
+ '1'
7
+ end
8
+
9
+ module ID
10
+ def self.example
11
+ :bold
12
+ end
13
+
14
+ module Unknown
15
+ def self.example
16
+ :unknown
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end