test_bench 1.0.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.
- checksums.yaml +7 -0
- data/lib/test_bench.rb +37 -0
- data/lib/test_bench/cli.rb +43 -0
- data/lib/test_bench/cli/parse_arguments.rb +168 -0
- data/lib/test_bench/controls.rb +22 -0
- data/lib/test_bench/controls/caller_location.rb +5 -0
- data/lib/test_bench/controls/depth.rb +21 -0
- data/lib/test_bench/controls/device.rb +27 -0
- data/lib/test_bench/controls/directory.rb +15 -0
- data/lib/test_bench/controls/error.rb +35 -0
- data/lib/test_bench/controls/fixture.rb +29 -0
- data/lib/test_bench/controls/output/escape_code.rb +23 -0
- data/lib/test_bench/controls/output/newline_character.rb +11 -0
- data/lib/test_bench/controls/output/print_error.rb +19 -0
- data/lib/test_bench/controls/output/styling.rb +29 -0
- data/lib/test_bench/controls/output/summary/error.rb +44 -0
- data/lib/test_bench/controls/output/summary/run.rb +59 -0
- data/lib/test_bench/controls/path.rb +15 -0
- data/lib/test_bench/controls/pattern.rb +29 -0
- data/lib/test_bench/controls/result.rb +5 -0
- data/lib/test_bench/controls/test_file.rb +5 -0
- data/lib/test_bench/controls/time.rb +61 -0
- data/lib/test_bench/deactivation_variants.rb +21 -0
- data/lib/test_bench/environment/boolean.rb +40 -0
- data/lib/test_bench/fixtures.rb +3 -0
- data/lib/test_bench/fixtures/configure_receiver.rb +80 -0
- data/lib/test_bench/output.rb +9 -0
- data/lib/test_bench/output/build.rb +57 -0
- data/lib/test_bench/output/levels/debug.rb +229 -0
- data/lib/test_bench/output/levels/failure.rb +31 -0
- data/lib/test_bench/output/levels/none.rb +13 -0
- data/lib/test_bench/output/levels/pass.rb +274 -0
- data/lib/test_bench/output/levels/summary.rb +21 -0
- data/lib/test_bench/output/print_error.rb +163 -0
- data/lib/test_bench/output/summary/error.rb +77 -0
- data/lib/test_bench/output/summary/run.rb +102 -0
- data/lib/test_bench/output/summary/run/print.rb +98 -0
- data/lib/test_bench/output/timer.rb +75 -0
- data/lib/test_bench/output/timer/substitute.rb +45 -0
- data/lib/test_bench/output/writer.rb +192 -0
- data/lib/test_bench/output/writer/dependency.rb +12 -0
- data/lib/test_bench/output/writer/sgr.rb +54 -0
- data/lib/test_bench/output/writer/substitute.rb +38 -0
- data/lib/test_bench/run.rb +103 -0
- data/lib/test_bench/run/substitute.rb +36 -0
- data/lib/test_bench/test_bench.rb +76 -0
- data/script/bench +19 -0
- metadata +117 -0
@@ -0,0 +1,19 @@
|
|
1
|
+
module TestBench
|
2
|
+
module Controls
|
3
|
+
module Output
|
4
|
+
module PrintError
|
5
|
+
def self.example(omit_backtrace_pattern: nil, reverse_backtraces: nil, writer: nil)
|
6
|
+
print_error = Example.new
|
7
|
+
print_error.omit_backtrace_pattern = omit_backtrace_pattern unless omit_backtrace_pattern.nil?
|
8
|
+
print_error.reverse_backtraces = reverse_backtraces unless reverse_backtraces.nil?
|
9
|
+
print_error.writer = writer unless writer.nil?
|
10
|
+
print_error
|
11
|
+
end
|
12
|
+
|
13
|
+
class Example
|
14
|
+
include TestBench::Output::PrintError
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module TestBench
|
2
|
+
module Controls
|
3
|
+
module Output
|
4
|
+
module Styling
|
5
|
+
def self.example
|
6
|
+
detect
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.detect
|
10
|
+
:detect
|
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_styling_setting
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module TestBench
|
2
|
+
module Controls
|
3
|
+
module Output
|
4
|
+
module Summary
|
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
|
+
module Text
|
23
|
+
def self.example
|
24
|
+
<<~TEXT
|
25
|
+
Error Summary:
|
26
|
+
1: #{file}
|
27
|
+
#{error.backtrace[0]}: #{error} (#{error.class})
|
28
|
+
|
29
|
+
TEXT
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.file
|
33
|
+
TestFile.filename
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.error
|
37
|
+
Controls::Error.example
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module TestBench
|
2
|
+
module Controls
|
3
|
+
module Output
|
4
|
+
module Summary
|
5
|
+
module Run
|
6
|
+
def self.example(writer: nil, timer: nil)
|
7
|
+
run_summary = Example.new
|
8
|
+
run_summary.writer = writer unless writer.nil?
|
9
|
+
run_summary.timer = timer unless timer.nil?
|
10
|
+
run_summary
|
11
|
+
end
|
12
|
+
|
13
|
+
class Example
|
14
|
+
include TestBench::Fixture::Output
|
15
|
+
include TestBench::Output::Summary::Run
|
16
|
+
|
17
|
+
TestBench::Fixture::Output.instance_methods.each do |method|
|
18
|
+
define_method(method) do |*|
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module Text
|
24
|
+
def self.example
|
25
|
+
<<~TEXT
|
26
|
+
Finished running 0 files
|
27
|
+
Ran 0 tests in 0.000s (0.0 tests/second)
|
28
|
+
0 passed, 0 skipped, 0 failed, 0 total errors
|
29
|
+
|
30
|
+
TEXT
|
31
|
+
end
|
32
|
+
|
33
|
+
module Pass
|
34
|
+
def self.example
|
35
|
+
<<~TEXT
|
36
|
+
Finished running 1 file
|
37
|
+
Ran 1 test in 0.000s (0.0 tests/second)
|
38
|
+
1 passed, 0 skipped, 0 failed, 0 total errors
|
39
|
+
|
40
|
+
TEXT
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
module Failure
|
45
|
+
def self.example
|
46
|
+
<<~TEXT
|
47
|
+
Finished running 1 file
|
48
|
+
Ran 1 test in 0.000s (0.0 tests/second)
|
49
|
+
0 passed, 0 skipped, 1 failed, 1 total error
|
50
|
+
|
51
|
+
TEXT
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module TestBench
|
2
|
+
module Controls
|
3
|
+
module Pattern
|
4
|
+
def self.example
|
5
|
+
/#{text}/
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.text
|
9
|
+
'some-pattern'
|
10
|
+
end
|
11
|
+
|
12
|
+
module None
|
13
|
+
def self.example
|
14
|
+
/#{text}/
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.text
|
18
|
+
'\z.'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
module Invalid
|
23
|
+
def self.text
|
24
|
+
'('
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module TestBench
|
2
|
+
module Controls
|
3
|
+
module Time
|
4
|
+
def self.example(seconds_offset: nil)
|
5
|
+
seconds_offset ||= 0
|
6
|
+
|
7
|
+
year = self.year
|
8
|
+
month = self.month
|
9
|
+
day = self.day
|
10
|
+
|
11
|
+
hours = self.hours
|
12
|
+
minutes = self.minutes
|
13
|
+
seconds = self.seconds + seconds_offset
|
14
|
+
|
15
|
+
tz_offset = self.tz_offset
|
16
|
+
|
17
|
+
::Time.new(year, month, day, hours, minutes, seconds, tz_offset)
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.year
|
21
|
+
2000
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.month
|
25
|
+
1
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.day
|
29
|
+
1
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.hours
|
33
|
+
11
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.minutes
|
37
|
+
11
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.seconds
|
41
|
+
11.0
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.tz_offset
|
45
|
+
0
|
46
|
+
end
|
47
|
+
|
48
|
+
module Elapsed
|
49
|
+
def self.example
|
50
|
+
1.111
|
51
|
+
end
|
52
|
+
|
53
|
+
module Text
|
54
|
+
def self.example
|
55
|
+
"1.111s"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module TestBench
|
2
|
+
module DeactivationVariants
|
3
|
+
def _context(title=nil, &block)
|
4
|
+
test_session.fail! if Defaults.fail_session
|
5
|
+
|
6
|
+
context(title)
|
7
|
+
end
|
8
|
+
|
9
|
+
def _test(title=nil, &block)
|
10
|
+
test_session.fail! if Defaults.fail_session
|
11
|
+
|
12
|
+
test(title)
|
13
|
+
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
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module TestBench
|
2
|
+
module Environment
|
3
|
+
module Boolean
|
4
|
+
Error = Class.new(RuntimeError)
|
5
|
+
|
6
|
+
def self.fetch(env_var, default_value=nil, env: nil)
|
7
|
+
value = get(env_var, env: env)
|
8
|
+
|
9
|
+
return default_value if value.nil?
|
10
|
+
|
11
|
+
value
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.get(env_var, env: nil)
|
15
|
+
env ||= ::ENV
|
16
|
+
|
17
|
+
return nil unless env.key?(env_var)
|
18
|
+
|
19
|
+
text_value = env.fetch(env_var)
|
20
|
+
|
21
|
+
case text_value
|
22
|
+
when true_pattern
|
23
|
+
true
|
24
|
+
when false_pattern
|
25
|
+
false
|
26
|
+
else
|
27
|
+
raise Error, "Invalid boolean value for ENV variable #{env_var.inspect} (Value: #{text_value.inspect})"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.true_pattern
|
32
|
+
@true_pattern ||= %r{\A(?:on|yes|y|true|t|1)\z}ni
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.false_pattern
|
36
|
+
@false_pattern ||= %r{\A(?:off|no|n|false|f|0)\z}ni
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module TestBench
|
2
|
+
module Fixtures
|
3
|
+
class ConfigureReceiver
|
4
|
+
include TestBench::Fixture
|
5
|
+
|
6
|
+
attr_reader :cls
|
7
|
+
attr_reader :default_attr_name
|
8
|
+
|
9
|
+
def args
|
10
|
+
@args ||= []
|
11
|
+
end
|
12
|
+
|
13
|
+
def kwargs
|
14
|
+
@kwargs ||= {}
|
15
|
+
end
|
16
|
+
|
17
|
+
def initialize(cls, default_attr_name, args=nil, kwargs=nil)
|
18
|
+
@cls = cls
|
19
|
+
@default_attr_name = default_attr_name
|
20
|
+
@args = args
|
21
|
+
@kwargs = kwargs
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.build(cls, *args, attr_name:, **kwargs)
|
25
|
+
new(cls, attr_name, args, kwargs)
|
26
|
+
end
|
27
|
+
|
28
|
+
def call
|
29
|
+
test "Responds to configure" do
|
30
|
+
assert(cls.respond_to?(:configure))
|
31
|
+
end or return
|
32
|
+
|
33
|
+
context do
|
34
|
+
receiver = OpenStruct.new
|
35
|
+
|
36
|
+
instance = configure(receiver)
|
37
|
+
|
38
|
+
test "Attribute is set on receiver" do
|
39
|
+
refute(receiver.public_send(default_attr_name).nil?)
|
40
|
+
end
|
41
|
+
|
42
|
+
test "Returns the instance that was assigned" do
|
43
|
+
assert(receiver.public_send(default_attr_name).equal?(instance))
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context "Optional Attribute Name" do
|
48
|
+
context "Given" do
|
49
|
+
receiver = OpenStruct.new
|
50
|
+
attr_name = :given_attr_name
|
51
|
+
|
52
|
+
configure(receiver, attr_name: attr_name)
|
53
|
+
|
54
|
+
test "Given attribute is set on receiver (Attribute: #{attr_name})" do
|
55
|
+
refute(receiver.public_send(attr_name).nil?)
|
56
|
+
end
|
57
|
+
|
58
|
+
test "Default attribute is not set on receiver" do
|
59
|
+
assert(receiver.public_send(default_attr_name).nil?)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
context "Omitted" do
|
64
|
+
receiver = OpenStruct.new
|
65
|
+
|
66
|
+
configure(receiver)
|
67
|
+
|
68
|
+
test "Default attribute is set on receiver (Attribute: #{default_attr_name})" do
|
69
|
+
refute(receiver.public_send(default_attr_name).nil?)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def configure(receiver, attr_name: nil)
|
76
|
+
cls.configure(receiver, *args, attr_name: attr_name, **kwargs)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|