test_bench 1.2.0.10 → 2.0.0.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/test_bench/cli.rb +268 -18
- data/lib/test_bench/controls/file.rb +5 -0
- data/lib/test_bench/controls/path.rb +1 -11
- data/lib/test_bench/controls/random.rb +7 -0
- data/lib/test_bench/controls/result.rb +1 -1
- data/lib/test_bench/controls/stdin.rb +27 -0
- data/lib/test_bench/controls.rb +7 -24
- data/lib/test_bench/test_bench.rb +23 -77
- data/lib/test_bench.rb +1 -35
- metadata +16 -55
- data/lib/test_bench/cli/parse_arguments.rb +0 -181
- data/lib/test_bench/controls/caller_location.rb +0 -5
- data/lib/test_bench/controls/depth.rb +0 -21
- data/lib/test_bench/controls/device.rb +0 -27
- data/lib/test_bench/controls/directory.rb +0 -15
- data/lib/test_bench/controls/error.rb +0 -35
- data/lib/test_bench/controls/fixture.rb +0 -29
- data/lib/test_bench/controls/output/batch_data.rb +0 -52
- data/lib/test_bench/controls/output/detail_setting.rb +0 -29
- data/lib/test_bench/controls/output/escape_code.rb +0 -23
- data/lib/test_bench/controls/output/exercise.rb +0 -7
- data/lib/test_bench/controls/output/log_level.rb +0 -7
- data/lib/test_bench/controls/output/newline_character.rb +0 -16
- data/lib/test_bench/controls/output/print_error.rb +0 -19
- data/lib/test_bench/controls/output/styling.rb +0 -29
- data/lib/test_bench/controls/output/summary/error.rb +0 -28
- data/lib/test_bench/controls/output/summary/session.rb +0 -20
- data/lib/test_bench/controls/pattern.rb +0 -33
- data/lib/test_bench/controls/test_file.rb +0 -5
- data/lib/test_bench/controls/time.rb +0 -89
- data/lib/test_bench/deactivation_variants.rb +0 -11
- data/lib/test_bench/environment/boolean.rb +0 -40
- data/lib/test_bench/fixtures/configure_receiver.rb +0 -80
- data/lib/test_bench/fixtures.rb +0 -5
- data/lib/test_bench/output/batch_data.rb +0 -17
- data/lib/test_bench/output/buffer.rb +0 -114
- data/lib/test_bench/output/log.rb +0 -27
- data/lib/test_bench/output/print_error.rb +0 -163
- data/lib/test_bench/output/raw.rb +0 -363
- data/lib/test_bench/output/summary/session.rb +0 -94
- data/lib/test_bench/output/summary.rb +0 -146
- data/lib/test_bench/output/timer/substitute.rb +0 -45
- data/lib/test_bench/output/timer.rb +0 -75
- data/lib/test_bench/output/writer/dependency.rb +0 -12
- data/lib/test_bench/output/writer/sgr.rb +0 -54
- data/lib/test_bench/output/writer/substitute.rb +0 -38
- data/lib/test_bench/output/writer.rb +0 -192
- data/lib/test_bench/output.rb +0 -21
- data/lib/test_bench/run/substitute.rb +0 -36
- data/lib/test_bench/run.rb +0 -113
- data/script/bench +0 -19
@@ -1,33 +0,0 @@
|
|
1
|
-
module TestBench
|
2
|
-
module Controls
|
3
|
-
module Pattern
|
4
|
-
def self.example(text=nil)
|
5
|
-
text ||= self.text
|
6
|
-
|
7
|
-
escaped_text = Regexp.escape(text)
|
8
|
-
|
9
|
-
Regexp.new(escaped_text)
|
10
|
-
end
|
11
|
-
|
12
|
-
def self.text
|
13
|
-
'some-pattern'
|
14
|
-
end
|
15
|
-
|
16
|
-
module None
|
17
|
-
def self.example
|
18
|
-
/#{text}/
|
19
|
-
end
|
20
|
-
|
21
|
-
def self.text
|
22
|
-
'\z.'
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
module Invalid
|
27
|
-
def self.text
|
28
|
-
'('
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
@@ -1,89 +0,0 @@
|
|
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
|
-
if not RUBY_ENGINE == 'mruby'
|
16
|
-
tz_offset = self.tz_offset
|
17
|
-
|
18
|
-
final_argument = tz_offset
|
19
|
-
else
|
20
|
-
seconds, subseconds = seconds.divmod(1)
|
21
|
-
|
22
|
-
microseconds = subseconds * 1_000_000
|
23
|
-
|
24
|
-
final_argument = microseconds
|
25
|
-
end
|
26
|
-
|
27
|
-
::Time.new(year, month, day, hours, minutes, seconds, final_argument)
|
28
|
-
end
|
29
|
-
|
30
|
-
def self.year
|
31
|
-
2000
|
32
|
-
end
|
33
|
-
|
34
|
-
def self.month
|
35
|
-
1
|
36
|
-
end
|
37
|
-
|
38
|
-
def self.day
|
39
|
-
1
|
40
|
-
end
|
41
|
-
|
42
|
-
def self.hours
|
43
|
-
11
|
44
|
-
end
|
45
|
-
|
46
|
-
def self.minutes
|
47
|
-
11
|
48
|
-
end
|
49
|
-
|
50
|
-
def self.seconds
|
51
|
-
11.0
|
52
|
-
end
|
53
|
-
|
54
|
-
def self.tz_offset
|
55
|
-
0
|
56
|
-
end
|
57
|
-
|
58
|
-
module Elapsed
|
59
|
-
def self.example
|
60
|
-
1.111
|
61
|
-
end
|
62
|
-
|
63
|
-
module Text
|
64
|
-
def self.example
|
65
|
-
"1.111s"
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
module PerSecond
|
70
|
-
def self.example
|
71
|
-
elapsed_time = Elapsed.example
|
72
|
-
|
73
|
-
Rational(ocurrences, elapsed_time)
|
74
|
-
end
|
75
|
-
|
76
|
-
def self.ocurrences
|
77
|
-
1
|
78
|
-
end
|
79
|
-
|
80
|
-
module Text
|
81
|
-
def self.example
|
82
|
-
"0.9"
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
@@ -1,40 +0,0 @@
|
|
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
|
@@ -1,80 +0,0 @@
|
|
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
|
data/lib/test_bench/fixtures.rb
DELETED
@@ -1,114 +0,0 @@
|
|
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 = super
|
45
|
-
|
46
|
-
record.extend(Record)
|
47
|
-
|
48
|
-
case signal
|
49
|
-
when :enter_context, :start_test, :start_fixture
|
50
|
-
start_batch(record)
|
51
|
-
|
52
|
-
when :exit_context, :finish_test, :finish_fixture
|
53
|
-
result = record.data.last
|
54
|
-
|
55
|
-
finish_batch(record, result)
|
56
|
-
end
|
57
|
-
|
58
|
-
record
|
59
|
-
end
|
60
|
-
|
61
|
-
def start_batch(record)
|
62
|
-
record.start_batch(stack_depth)
|
63
|
-
|
64
|
-
stack.push(record)
|
65
|
-
end
|
66
|
-
|
67
|
-
def finish_batch(final_record, result)
|
68
|
-
first_record = stack.pop
|
69
|
-
|
70
|
-
batch_data = first_record.batch_data
|
71
|
-
batch_data.result = result
|
72
|
-
|
73
|
-
final_record.batch_data = first_record.batch_data
|
74
|
-
end
|
75
|
-
|
76
|
-
def flush
|
77
|
-
records.each do |record|
|
78
|
-
record.forward(raw_output)
|
79
|
-
end
|
80
|
-
|
81
|
-
records.clear
|
82
|
-
end
|
83
|
-
|
84
|
-
def buffering?
|
85
|
-
stack_depth.nonzero?
|
86
|
-
end
|
87
|
-
|
88
|
-
def stack_depth
|
89
|
-
stack.length
|
90
|
-
end
|
91
|
-
|
92
|
-
module Record
|
93
|
-
attr_accessor :batch_data
|
94
|
-
|
95
|
-
def forward(raw_output)
|
96
|
-
return super if batch_data.nil?
|
97
|
-
|
98
|
-
raw_output.public_send(signal, *data, batch_data: batch_data)
|
99
|
-
end
|
100
|
-
|
101
|
-
def start_batch(depth)
|
102
|
-
batch_data = Output::BatchData.new
|
103
|
-
batch_data.depth = depth
|
104
|
-
|
105
|
-
self.batch_data = batch_data
|
106
|
-
end
|
107
|
-
|
108
|
-
def finish_batch(result)
|
109
|
-
batch_data.result = result
|
110
|
-
end
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
114
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
module TestBench
|
2
|
-
module Output
|
3
|
-
module Log
|
4
|
-
def self.build(device=nil, level: nil)
|
5
|
-
level ||= Defaults.level
|
6
|
-
|
7
|
-
Fixture::Output::Log.build(device, level: level)
|
8
|
-
end
|
9
|
-
|
10
|
-
def self.default_level
|
11
|
-
:fatal
|
12
|
-
end
|
13
|
-
|
14
|
-
module Defaults
|
15
|
-
def self.level
|
16
|
-
level_text = ::ENV['TEST_BENCH_LOG_LEVEL']
|
17
|
-
|
18
|
-
if level_text.nil?
|
19
|
-
Log.default_level
|
20
|
-
else
|
21
|
-
level_text.to_sym
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
@@ -1,163 +0,0 @@
|
|
1
|
-
module TestBench
|
2
|
-
module Output
|
3
|
-
module PrintError
|
4
|
-
include Writer::Dependency
|
5
|
-
|
6
|
-
def omit_backtrace_pattern
|
7
|
-
@omit_backtrace_pattern ||= Defaults.omit_backtrace_pattern
|
8
|
-
end
|
9
|
-
attr_writer :omit_backtrace_pattern
|
10
|
-
|
11
|
-
def reverse_backtraces
|
12
|
-
instance_variable_defined?(:@reverse_backtraces) ?
|
13
|
-
@reverse_backtraces :
|
14
|
-
@reverse_backtraces = Defaults.reverse_backtraces
|
15
|
-
end
|
16
|
-
attr_writer :reverse_backtraces
|
17
|
-
|
18
|
-
def print_error(error)
|
19
|
-
PrintError.(error, writer: writer, omit_backtrace_pattern: omit_backtrace_pattern, reverse_backtraces: reverse_backtraces)
|
20
|
-
end
|
21
|
-
|
22
|
-
def self.call(error, writer: nil, omit_backtrace_pattern: nil, reverse_backtraces: nil)
|
23
|
-
writer ||= Writer.build
|
24
|
-
omit_backtrace_pattern ||= Defaults.omit_backtrace_pattern
|
25
|
-
reverse_backtraces = Defaults.reverse_backtraces if reverse_backtraces.nil?
|
26
|
-
|
27
|
-
writer.escape_code(:red)
|
28
|
-
|
29
|
-
if reverse_backtraces && error.backtrace.length > 1
|
30
|
-
writer
|
31
|
-
.indent
|
32
|
-
.escape_code(:bold)
|
33
|
-
.text("Traceback")
|
34
|
-
.escape_code(:reset_intensity)
|
35
|
-
.text(" (most recent call last):")
|
36
|
-
.newline
|
37
|
-
end
|
38
|
-
|
39
|
-
error(error, writer: writer, omit_backtrace_pattern: omit_backtrace_pattern, reverse_backtraces: reverse_backtraces)
|
40
|
-
|
41
|
-
writer
|
42
|
-
.escape_code(:reset_fg)
|
43
|
-
.sync
|
44
|
-
end
|
45
|
-
|
46
|
-
def self.error(error, writer: nil, omit_backtrace_pattern: nil, reverse_backtraces: nil)
|
47
|
-
reverse_backtraces = self.reverse_backtraces if reverse_backtraces.nil?
|
48
|
-
|
49
|
-
if reverse_backtraces
|
50
|
-
error_cause(error, writer: writer, omit_backtrace_pattern: omit_backtrace_pattern, reverse_backtraces: reverse_backtraces)
|
51
|
-
error_backtrace(error, writer: writer, omit_backtrace_pattern: omit_backtrace_pattern, reverse_backtraces: reverse_backtraces)
|
52
|
-
error_message(error, writer: writer)
|
53
|
-
else
|
54
|
-
error_message(error, writer: writer)
|
55
|
-
error_backtrace(error, writer: writer, omit_backtrace_pattern: omit_backtrace_pattern, reverse_backtraces: reverse_backtraces)
|
56
|
-
error_cause(error, writer: writer, omit_backtrace_pattern: omit_backtrace_pattern, reverse_backtraces: reverse_backtraces)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
def self.error_cause(error, **args)
|
61
|
-
error(error.cause, **args) unless error.cause.nil?
|
62
|
-
end
|
63
|
-
|
64
|
-
def self.error_message(error, writer: nil)
|
65
|
-
caller_location = error.backtrace[0]
|
66
|
-
|
67
|
-
message = error.message
|
68
|
-
|
69
|
-
error_class = error.class.name
|
70
|
-
|
71
|
-
writer
|
72
|
-
.indent
|
73
|
-
.text("#{caller_location}: ")
|
74
|
-
.escape_code(:bold)
|
75
|
-
.text("#{message} (")
|
76
|
-
.escape_code(:underline)
|
77
|
-
.text(error_class)
|
78
|
-
.escape_code(:reset_underline)
|
79
|
-
.text(")")
|
80
|
-
.escape_code(:reset_intensity)
|
81
|
-
.newline
|
82
|
-
end
|
83
|
-
|
84
|
-
def self.error_backtrace(error, writer: nil, omit_backtrace_pattern: nil, reverse_backtraces: nil)
|
85
|
-
writer ||= self.writer
|
86
|
-
omit_backtrace_pattern ||= self.omit_backtrace_pattern
|
87
|
-
reverse_backtraces = self.reverse_backtraces if reverse_backtraces.nil?
|
88
|
-
|
89
|
-
omitting = false
|
90
|
-
|
91
|
-
backtrace = error.backtrace[1..-1]
|
92
|
-
|
93
|
-
unless reverse_backtraces
|
94
|
-
backtrace_iterator = backtrace.each.with_index
|
95
|
-
else
|
96
|
-
frame_count = backtrace.count
|
97
|
-
|
98
|
-
number_width = frame_count.to_s.each_char.count
|
99
|
-
|
100
|
-
backtrace_iterator = backtrace.reverse_each.map.with_index do |location, index|
|
101
|
-
ordinal = frame_count - index
|
102
|
-
|
103
|
-
ordinal = ordinal.to_s.rjust(number_width, ' ')
|
104
|
-
|
105
|
-
[location, ordinal]
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
backtrace_iterator.each do |location, ordinal|
|
110
|
-
omit = omit_backtrace_pattern.match?(location)
|
111
|
-
|
112
|
-
next if omit && omitting
|
113
|
-
|
114
|
-
writer
|
115
|
-
.text("\t")
|
116
|
-
.indent
|
117
|
-
|
118
|
-
if omit
|
119
|
-
omitting = true
|
120
|
-
|
121
|
-
if reverse_backtraces
|
122
|
-
ordinal.gsub!(/[[:digit:]]/, '?')
|
123
|
-
|
124
|
-
writer.text("#{ordinal}: ")
|
125
|
-
end
|
126
|
-
|
127
|
-
writer
|
128
|
-
.escape_code(:faint)
|
129
|
-
.escape_code(:italic)
|
130
|
-
.text('*omitted*')
|
131
|
-
.escape_code(:reset_italic)
|
132
|
-
.escape_code(:reset_intensity)
|
133
|
-
|
134
|
-
else
|
135
|
-
omitting = false
|
136
|
-
|
137
|
-
if reverse_backtraces
|
138
|
-
writer.text("#{ordinal}: ")
|
139
|
-
end
|
140
|
-
|
141
|
-
writer.text("from #{location}")
|
142
|
-
end
|
143
|
-
|
144
|
-
writer.newline
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
module Defaults
|
149
|
-
def self.omit_backtrace_pattern
|
150
|
-
pattern = ENV.fetch('TEST_BENCH_OMIT_BACKTRACE_PATTERN') do
|
151
|
-
'test_bench'
|
152
|
-
end
|
153
|
-
|
154
|
-
Regexp.new(pattern)
|
155
|
-
end
|
156
|
-
|
157
|
-
def self.reverse_backtraces
|
158
|
-
Environment::Boolean.fetch('TEST_BENCH_REVERSE_BACKTRACES', false)
|
159
|
-
end
|
160
|
-
end
|
161
|
-
end
|
162
|
-
end
|
163
|
-
end
|