test_bench_legacy 1.3.5
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.
- checksums.yaml +7 -0
- data/bin/bench +10 -0
- data/lib/test_bench.rb +37 -0
- data/lib/test_bench/activate.rb +3 -0
- data/lib/test_bench/assert.rb +58 -0
- data/lib/test_bench/assert/failed.rb +25 -0
- data/lib/test_bench/assert/proc.rb +24 -0
- data/lib/test_bench/assert/refute.rb +9 -0
- data/lib/test_bench/cli.rb +4 -0
- data/lib/test_bench/cli/cli.rb +108 -0
- data/lib/test_bench/controls.rb +16 -0
- data/lib/test_bench/controls/binding.rb +17 -0
- data/lib/test_bench/controls/clock/elapsed.rb +41 -0
- data/lib/test_bench/controls/clock/reference.rb +15 -0
- data/lib/test_bench/controls/dir_substitute.rb +58 -0
- data/lib/test_bench/controls/error.rb +63 -0
- data/lib/test_bench/controls/executor/substitute.rb +27 -0
- data/lib/test_bench/controls/expand_path.rb +23 -0
- data/lib/test_bench/controls/fixture.rb +36 -0
- data/lib/test_bench/controls/kernel_substitute.rb +72 -0
- data/lib/test_bench/controls/output.rb +106 -0
- data/lib/test_bench/controls/path.rb +11 -0
- data/lib/test_bench/controls/result.rb +64 -0
- data/lib/test_bench/controls/telemetry.rb +23 -0
- data/lib/test_bench/controls/test_script.rb +23 -0
- data/lib/test_bench/executor.rb +45 -0
- data/lib/test_bench/expand_path.rb +44 -0
- data/lib/test_bench/fixture.rb +17 -0
- data/lib/test_bench/output.rb +169 -0
- data/lib/test_bench/output/assertions.rb +43 -0
- data/lib/test_bench/output/palette.rb +59 -0
- data/lib/test_bench/output/writer.rb +94 -0
- data/lib/test_bench/output/writer/assertions.rb +29 -0
- data/lib/test_bench/output/writer/assertions/line.rb +76 -0
- data/lib/test_bench/registry.rb +32 -0
- data/lib/test_bench/result.rb +71 -0
- data/lib/test_bench/result/assertions.rb +11 -0
- data/lib/test_bench/result/null.rb +12 -0
- data/lib/test_bench/runner.rb +59 -0
- data/lib/test_bench/settings.rb +62 -0
- data/lib/test_bench/settings/defaults.rb +29 -0
- data/lib/test_bench/settings/environment.rb +124 -0
- data/lib/test_bench/settings/registry.rb +17 -0
- data/lib/test_bench/structure.rb +89 -0
- data/lib/test_bench/telemetry.rb +130 -0
- data/lib/test_bench/telemetry/assertions.rb +85 -0
- data/lib/test_bench/telemetry/registry.rb +17 -0
- data/lib/test_bench/telemetry/subscription.rb +23 -0
- data/lib/test_bench/test_bench.rb +33 -0
- metadata +94 -0
@@ -0,0 +1,29 @@
|
|
1
|
+
module TestBench
|
2
|
+
class Output
|
3
|
+
class Writer
|
4
|
+
module Assertions
|
5
|
+
def raw_text
|
6
|
+
device.rewind
|
7
|
+
device.read
|
8
|
+
end
|
9
|
+
|
10
|
+
def wrote? expected_prose
|
11
|
+
raw_text == expected_prose
|
12
|
+
end
|
13
|
+
|
14
|
+
def wrote_line? *arguments
|
15
|
+
raw_text.each_line.any? do |line_text|
|
16
|
+
line = Line.parse line_text
|
17
|
+
return true if line.(*arguments)
|
18
|
+
end
|
19
|
+
|
20
|
+
false
|
21
|
+
end
|
22
|
+
|
23
|
+
def wrote_nothing?
|
24
|
+
raw_text.empty?
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module TestBench
|
2
|
+
class Output
|
3
|
+
class Writer
|
4
|
+
module Assertions
|
5
|
+
class Line
|
6
|
+
IgnoreParameter = Object.new
|
7
|
+
|
8
|
+
attr_reader :match
|
9
|
+
|
10
|
+
def initialize match
|
11
|
+
@match = match
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.parse line
|
15
|
+
match = Pattern.match line
|
16
|
+
new match
|
17
|
+
end
|
18
|
+
|
19
|
+
def call expected_prose, bg: IgnoreParameter, fg: IgnoreParameter, indentation: IgnoreParameter
|
20
|
+
return unless match
|
21
|
+
|
22
|
+
return unless prose? expected_prose
|
23
|
+
return unless foreground_color? fg unless fg == IgnoreParameter
|
24
|
+
return unless background_color? bg unless bg == IgnoreParameter
|
25
|
+
return unless indentation? indentation unless indentation == IgnoreParameter
|
26
|
+
|
27
|
+
true
|
28
|
+
end
|
29
|
+
|
30
|
+
def background_color? bg
|
31
|
+
if bg.nil?
|
32
|
+
match['bg'].nil?
|
33
|
+
else
|
34
|
+
_, code = Palette.get bg
|
35
|
+
match['bg'].to_i == code + 40
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def foreground_color? fg
|
40
|
+
if fg.nil?
|
41
|
+
match['fg'].nil? and match['brightness'].nil?
|
42
|
+
else
|
43
|
+
brightness, code = Palette.get fg
|
44
|
+
match['fg'].to_i == code + 30 and
|
45
|
+
match['brightness'].to_i == brightness
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def indentation? indentation
|
50
|
+
match['indentation'].to_s == ' ' * indentation
|
51
|
+
end
|
52
|
+
|
53
|
+
def prose? expected_prose
|
54
|
+
match['prose'] == expected_prose
|
55
|
+
end
|
56
|
+
|
57
|
+
Pattern = %r{
|
58
|
+
\A
|
59
|
+
(?<indentation>[[:space:]]{2})*
|
60
|
+
(?<color>
|
61
|
+
\e\[
|
62
|
+
(?:(?<brightness>[01])|(?<fg>3[0-7])|(?<bg>4[0-7]))
|
63
|
+
(?:
|
64
|
+
;(?:(?<brightness>[01])|(?<fg>3[0-7])|(?<bg>4[0-7]))
|
65
|
+
){0,2}
|
66
|
+
m
|
67
|
+
)?
|
68
|
+
(?<prose>[^\e\n]+)
|
69
|
+
(?:\e\[0m)?
|
70
|
+
\Z
|
71
|
+
}x
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module TestBench
|
2
|
+
class Registry
|
3
|
+
attr_reader :factory
|
4
|
+
|
5
|
+
def initialize factory
|
6
|
+
@factory = factory
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.build &block
|
10
|
+
factory = block
|
11
|
+
new factory
|
12
|
+
end
|
13
|
+
|
14
|
+
def key binding
|
15
|
+
binding.receiver.object_id
|
16
|
+
end
|
17
|
+
|
18
|
+
def get binding
|
19
|
+
key = self.key binding
|
20
|
+
table[key] ||= factory.()
|
21
|
+
end
|
22
|
+
|
23
|
+
def set binding, value
|
24
|
+
key = self.key binding
|
25
|
+
table[key] = value
|
26
|
+
end
|
27
|
+
|
28
|
+
def table
|
29
|
+
@table ||= {}
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module TestBench
|
2
|
+
class Result < Struct.new :files, :passes, :failures, :skips, :assertions, :errors, :start_time, :stop_time
|
3
|
+
attr_writer :clock
|
4
|
+
|
5
|
+
def self.build
|
6
|
+
instance = new [], 0, 0, 0, 0, 0
|
7
|
+
instance.started
|
8
|
+
instance
|
9
|
+
end
|
10
|
+
|
11
|
+
def asserted
|
12
|
+
self.assertions += 1
|
13
|
+
end
|
14
|
+
|
15
|
+
def clock
|
16
|
+
@clock ||= Time
|
17
|
+
end
|
18
|
+
|
19
|
+
def elapsed_time
|
20
|
+
stop_time - start_time
|
21
|
+
end
|
22
|
+
|
23
|
+
def error_raised error
|
24
|
+
self.errors += 1
|
25
|
+
end
|
26
|
+
|
27
|
+
def failed?
|
28
|
+
not passed?
|
29
|
+
end
|
30
|
+
|
31
|
+
def file_finished file
|
32
|
+
files << file
|
33
|
+
end
|
34
|
+
|
35
|
+
def finished
|
36
|
+
self.stop_time ||= clock.now
|
37
|
+
end
|
38
|
+
alias_method :run_finished, :finished
|
39
|
+
|
40
|
+
def passed?
|
41
|
+
failures.zero? and errors.zero?
|
42
|
+
end
|
43
|
+
|
44
|
+
def started
|
45
|
+
self.start_time = clock.now
|
46
|
+
end
|
47
|
+
alias_method :run_started, :started
|
48
|
+
|
49
|
+
def test_failed prose
|
50
|
+
self.failures += 1
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_passed prose
|
54
|
+
self.passes += 1
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_skipped prose
|
58
|
+
self.skips += 1
|
59
|
+
end
|
60
|
+
|
61
|
+
def tests
|
62
|
+
failures + passes + skips
|
63
|
+
end
|
64
|
+
|
65
|
+
def tests_per_second
|
66
|
+
elapsed_time = self.elapsed_time
|
67
|
+
elapsed_time = elapsed_time.next_float if elapsed_time.zero?
|
68
|
+
Rational tests, elapsed_time
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module TestBench
|
2
|
+
class Runner
|
3
|
+
attr_writer :executor
|
4
|
+
attr_writer :expand_path
|
5
|
+
attr_reader :paths
|
6
|
+
attr_reader :telemetry
|
7
|
+
|
8
|
+
def initialize paths, telemetry
|
9
|
+
@paths = paths
|
10
|
+
@telemetry = telemetry
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.build paths, root_directory, exclude_pattern: nil
|
14
|
+
telemetry = Telemetry::Registry.get TOPLEVEL_BINDING
|
15
|
+
|
16
|
+
instance = new paths, telemetry
|
17
|
+
instance.executor = Executor.build
|
18
|
+
instance.expand_path = ExpandPath.build root_directory, exclude_pattern
|
19
|
+
instance
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.call paths, root_directory=nil, exclude_pattern: nil
|
23
|
+
paths = Array paths
|
24
|
+
root_directory ||= File.dirname caller_locations[0].path
|
25
|
+
|
26
|
+
instance = build paths, root_directory, :exclude_pattern => exclude_pattern
|
27
|
+
instance.()
|
28
|
+
end
|
29
|
+
|
30
|
+
def call
|
31
|
+
telemetry.run_started
|
32
|
+
|
33
|
+
files = gather_files
|
34
|
+
execute files
|
35
|
+
return telemetry.passed?
|
36
|
+
|
37
|
+
ensure
|
38
|
+
telemetry.run_finished
|
39
|
+
end
|
40
|
+
|
41
|
+
def gather_files
|
42
|
+
paths.flat_map do |path|
|
43
|
+
Array expand_path.(path)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def execute files
|
48
|
+
executor.(files)
|
49
|
+
end
|
50
|
+
|
51
|
+
def executor
|
52
|
+
@executor ||= Executor.build
|
53
|
+
end
|
54
|
+
|
55
|
+
def expand_path
|
56
|
+
@expand_path ||= proc do [] end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module TestBench
|
2
|
+
class Settings
|
3
|
+
attr_writer :abort_on_error
|
4
|
+
attr_writer :exclude_pattern
|
5
|
+
attr_writer :writer
|
6
|
+
attr_writer :record_telemetry
|
7
|
+
attr_writer :reverse_backtraces
|
8
|
+
attr_writer :tests_dir
|
9
|
+
|
10
|
+
def abort_on_error
|
11
|
+
nil_coalesce :@abort_on_error, Defaults.abort_on_error
|
12
|
+
end
|
13
|
+
|
14
|
+
def color
|
15
|
+
writer.color
|
16
|
+
end
|
17
|
+
|
18
|
+
def color= value
|
19
|
+
writer.color = value
|
20
|
+
end
|
21
|
+
|
22
|
+
def exclude_pattern
|
23
|
+
nil_coalesce :@exclude_pattern, Defaults.exclude_pattern
|
24
|
+
end
|
25
|
+
|
26
|
+
def lower_verbosity
|
27
|
+
writer.lower_verbosity
|
28
|
+
end
|
29
|
+
|
30
|
+
def nil_coalesce ivar, default_value
|
31
|
+
if instance_variable_defined? ivar
|
32
|
+
instance_variable_get ivar
|
33
|
+
else
|
34
|
+
instance_variable_set ivar, default_value
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def raise_verbosity
|
39
|
+
writer.raise_verbosity
|
40
|
+
end
|
41
|
+
|
42
|
+
def record_telemetry
|
43
|
+
nil_coalesce :@record_telemetry, Defaults.record_telemetry
|
44
|
+
end
|
45
|
+
|
46
|
+
def reverse_backtraces
|
47
|
+
nil_coalesce :@reverse_backtraces, Defaults.reverse_backtraces
|
48
|
+
end
|
49
|
+
|
50
|
+
def tests_dir
|
51
|
+
nil_coalesce :@tests_dir, Defaults.tests_dir
|
52
|
+
end
|
53
|
+
|
54
|
+
def writer
|
55
|
+
@writer ||= Output::Writer.new
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.toplevel
|
59
|
+
Registry.get TOPLEVEL_BINDING
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module TestBench
|
2
|
+
class Settings
|
3
|
+
module Defaults
|
4
|
+
def self.abort_on_error
|
5
|
+
false
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.color
|
9
|
+
nil
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.exclude_pattern
|
13
|
+
"_init\\.rb$"
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.record_telemetry
|
17
|
+
false
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.reverse_backtraces
|
21
|
+
false
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.tests_dir
|
25
|
+
'tests'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
module TestBench
|
2
|
+
class Settings
|
3
|
+
class Environment
|
4
|
+
attr_reader :settings
|
5
|
+
attr_writer :env
|
6
|
+
|
7
|
+
def initialize settings
|
8
|
+
@settings = settings
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.build settings, env=nil
|
12
|
+
env ||= ENV
|
13
|
+
|
14
|
+
instance = new settings
|
15
|
+
instance.env = env
|
16
|
+
instance
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.call *arguments
|
20
|
+
instance = build(*arguments)
|
21
|
+
instance.()
|
22
|
+
end
|
23
|
+
|
24
|
+
def call
|
25
|
+
abort_on_error
|
26
|
+
color
|
27
|
+
exclude_pattern
|
28
|
+
reverse_backtraces
|
29
|
+
quiet
|
30
|
+
record_telemetry
|
31
|
+
tests_dir
|
32
|
+
verbose
|
33
|
+
end
|
34
|
+
|
35
|
+
def activated? value
|
36
|
+
if affirmative_pattern.match value
|
37
|
+
true
|
38
|
+
elsif value.nil? or negative_pattern.match value
|
39
|
+
false
|
40
|
+
else
|
41
|
+
invalid_boolean value
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def affirmative_pattern
|
46
|
+
@@affirmative_pattern ||= %r{\A(?:on|yes|y|1)\z}i
|
47
|
+
end
|
48
|
+
|
49
|
+
def color
|
50
|
+
if deactivated? env['TEST_BENCH_COLOR']
|
51
|
+
settings.color = false
|
52
|
+
elsif activated? env['TEST_BENCH_COLOR']
|
53
|
+
settings.color = true
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def deactivated? value
|
58
|
+
if negative_pattern.match value
|
59
|
+
true
|
60
|
+
elsif value.nil? or affirmative_pattern.match value
|
61
|
+
false
|
62
|
+
else
|
63
|
+
invalid_boolean value
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def env
|
68
|
+
@env ||= {}
|
69
|
+
end
|
70
|
+
|
71
|
+
def abort_on_error
|
72
|
+
if activated? env['TEST_BENCH_ABORT_ON_ERROR']
|
73
|
+
settings.abort_on_error = true
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def exclude_pattern
|
78
|
+
if pattern = env['TEST_BENCH_EXCLUDE_PATTERN']
|
79
|
+
settings.exclude_pattern = pattern
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def invalid_boolean value
|
84
|
+
raise ArgumentError, %{Invalid boolean value #{value.inspect}; values that are toggled can be set via "on" or "off", "yes" or "no", "y" or "n", or "0" or "1".}
|
85
|
+
end
|
86
|
+
|
87
|
+
def negative_pattern
|
88
|
+
@@negative_pattern ||= %r{\A(?:off|no|n|0)\z}i
|
89
|
+
end
|
90
|
+
|
91
|
+
def record_telemetry
|
92
|
+
if activated? env['TEST_BENCH_RECORD_TELEMETRY']
|
93
|
+
settings.record_telemetry = true
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def reverse_backtraces
|
98
|
+
if activated? env['TEST_BENCH_REVERSE_BACKTRACES']
|
99
|
+
settings.reverse_backtraces = true
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def quiet
|
104
|
+
if activated? env['TEST_BENCH_QUIET']
|
105
|
+
settings.lower_verbosity
|
106
|
+
settings.lower_verbosity
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def tests_dir
|
111
|
+
tests_dir = env['TEST_BENCH_TESTS_DIR']
|
112
|
+
|
113
|
+
settings.tests_dir = tests_dir if tests_dir
|
114
|
+
end
|
115
|
+
|
116
|
+
def verbose
|
117
|
+
if activated? env['TEST_BENCH_VERBOSE']
|
118
|
+
settings.raise_verbosity
|
119
|
+
settings.raise_verbosity
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|