test_bench_legacy 1.3.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|