test_bench-isolated 0 → 2.0.0.0
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_isolated/test_bench/cli.rb +298 -0
- data/lib/test_bench_isolated/test_bench/controls/file.rb +7 -0
- data/lib/test_bench_isolated/test_bench/controls/path.rb +7 -0
- data/lib/test_bench_isolated/test_bench/controls/random.rb +9 -0
- data/lib/test_bench_isolated/test_bench/controls/result.rb +7 -0
- data/lib/test_bench_isolated/test_bench/controls/stdin.rb +29 -0
- data/lib/test_bench_isolated/test_bench/controls.rb +11 -0
- data/lib/test_bench_isolated/test_bench/fixture/actuate/class.rb +97 -0
- data/lib/test_bench_isolated/test_bench/fixture/actuate/object.rb +93 -0
- data/lib/test_bench_isolated/test_bench/fixture/controls/exception.rb +9 -0
- data/lib/test_bench_isolated/test_bench/fixture/controls/fixture/class.rb +88 -0
- data/lib/test_bench_isolated/test_bench/fixture/controls/fixture/object/modules.rb +41 -0
- data/lib/test_bench_isolated/test_bench/fixture/controls/fixture/object.rb +33 -0
- data/lib/test_bench_isolated/test_bench/fixture/controls/fixture.rb +29 -0
- data/lib/test_bench_isolated/test_bench/fixture/controls/output.rb +9 -0
- data/lib/test_bench_isolated/test_bench/fixture/controls/random.rb +9 -0
- data/lib/test_bench_isolated/test_bench/fixture/controls/result.rb +9 -0
- data/lib/test_bench_isolated/test_bench/fixture/controls/title.rb +9 -0
- data/lib/test_bench_isolated/test_bench/fixture/controls.rb +13 -0
- data/lib/test_bench_isolated/test_bench/fixture/evaluate.rb +31 -0
- data/lib/test_bench_isolated/test_bench/fixture/fixture.rb +201 -0
- data/lib/test_bench_isolated/test_bench/fixture.rb +8 -0
- data/lib/test_bench_isolated/test_bench/output/controls/data.rb +51 -0
- data/lib/test_bench_isolated/test_bench/output/controls/device.rb +29 -0
- data/lib/test_bench_isolated/test_bench/output/controls/event.rb +9 -0
- data/lib/test_bench_isolated/test_bench/output/controls/output.rb +36 -0
- data/lib/test_bench_isolated/test_bench/output/controls/random.rb +9 -0
- data/lib/test_bench_isolated/test_bench/output/controls/style.rb +33 -0
- data/lib/test_bench_isolated/test_bench/output/controls/styling.rb +29 -0
- data/lib/test_bench_isolated/test_bench/output/controls/text.rb +19 -0
- data/lib/test_bench_isolated/test_bench/output/controls.rb +10 -0
- data/lib/test_bench_isolated/test_bench/output/device/null.rb +21 -0
- data/lib/test_bench_isolated/test_bench/output/device/substitute.rb +60 -0
- data/lib/test_bench_isolated/test_bench/output/digest.rb +115 -0
- data/lib/test_bench_isolated/test_bench/output/output.rb +68 -0
- data/lib/test_bench_isolated/test_bench/output/writer/buffer.rb +59 -0
- data/lib/test_bench_isolated/test_bench/output/writer/defaults.rb +13 -0
- data/lib/test_bench_isolated/test_bench/output/writer/style.rb +52 -0
- data/lib/test_bench_isolated/test_bench/output/writer/substitute.rb +40 -0
- data/lib/test_bench_isolated/test_bench/output/writer.rb +212 -0
- data/lib/test_bench_isolated/test_bench/output.rb +14 -0
- data/lib/test_bench_isolated/test_bench/random/controls/seed.rb +27 -0
- data/lib/test_bench_isolated/test_bench/random/controls.rb +1 -0
- data/lib/test_bench_isolated/test_bench/random/random.rb +170 -0
- data/lib/test_bench_isolated/test_bench/random.rb +1 -0
- data/lib/test_bench_isolated/test_bench/run/controls/directory.rb +72 -0
- data/lib/test_bench_isolated/test_bench/run/controls/event_data.rb +9 -0
- data/lib/test_bench_isolated/test_bench/run/controls/events/event_data.rb +11 -0
- data/lib/test_bench_isolated/test_bench/run/controls/events/file_crashed.rb +111 -0
- data/lib/test_bench_isolated/test_bench/run/controls/events/file_finished.rb +58 -0
- data/lib/test_bench_isolated/test_bench/run/controls/events/file_started.rb +49 -0
- data/lib/test_bench_isolated/test_bench/run/controls/events/finished.rb +58 -0
- data/lib/test_bench_isolated/test_bench/run/controls/events/session.rb +11 -0
- data/lib/test_bench_isolated/test_bench/run/controls/events/started.rb +49 -0
- data/lib/test_bench_isolated/test_bench/run/controls/exception.rb +103 -0
- data/lib/test_bench_isolated/test_bench/run/controls/executor.rb +58 -0
- data/lib/test_bench_isolated/test_bench/run/controls/file/create.rb +71 -0
- data/lib/test_bench_isolated/test_bench/run/controls/file/pattern.rb +35 -0
- data/lib/test_bench_isolated/test_bench/run/controls/file.rb +182 -0
- data/lib/test_bench_isolated/test_bench/run/controls/path.rb +17 -0
- data/lib/test_bench_isolated/test_bench/run/controls/process_id.rb +9 -0
- data/lib/test_bench_isolated/test_bench/run/controls/random.rb +9 -0
- data/lib/test_bench_isolated/test_bench/run/controls/result.rb +9 -0
- data/lib/test_bench_isolated/test_bench/run/controls/time.rb +9 -0
- data/lib/test_bench_isolated/test_bench/run/controls.rb +26 -0
- data/lib/test_bench_isolated/test_bench/run/events.rb +14 -0
- data/lib/test_bench_isolated/test_bench/run/executor/serial.rb +36 -0
- data/lib/test_bench_isolated/test_bench/run/executor/substitute.rb +47 -0
- data/lib/test_bench_isolated/test_bench/run/executor.rb +46 -0
- data/lib/test_bench_isolated/test_bench/run/file.rb +83 -0
- data/lib/test_bench_isolated/test_bench/run/get_files/substitute.rb +48 -0
- data/lib/test_bench_isolated/test_bench/run/get_files.rb +78 -0
- data/lib/test_bench_isolated/test_bench/run/output/file.rb +137 -0
- data/lib/test_bench_isolated/test_bench/run/output/summary/error.rb +141 -0
- data/lib/test_bench_isolated/test_bench/run/output/summary.rb +184 -0
- data/lib/test_bench_isolated/test_bench/run/run.rb +156 -0
- data/lib/test_bench_isolated/test_bench/run.rb +18 -0
- data/lib/test_bench_isolated/test_bench/session/controls/comment.rb +107 -0
- data/lib/test_bench_isolated/test_bench/session/controls/detail.rb +93 -0
- data/lib/test_bench_isolated/test_bench/session/controls/event.rb +9 -0
- data/lib/test_bench_isolated/test_bench/session/controls/events/commented.rb +112 -0
- data/lib/test_bench_isolated/test_bench/session/controls/events/context_finished.rb +72 -0
- data/lib/test_bench_isolated/test_bench/session/controls/events/context_skipped.rb +49 -0
- data/lib/test_bench_isolated/test_bench/session/controls/events/context_started.rb +66 -0
- data/lib/test_bench_isolated/test_bench/session/controls/events/detailed.rb +112 -0
- data/lib/test_bench_isolated/test_bench/session/controls/events/event_data.rb +11 -0
- data/lib/test_bench_isolated/test_bench/session/controls/events/failed.rb +49 -0
- data/lib/test_bench_isolated/test_bench/session/controls/events/fixture_finished.rb +55 -0
- data/lib/test_bench_isolated/test_bench/session/controls/events/fixture_started.rb +49 -0
- data/lib/test_bench_isolated/test_bench/session/controls/events/test_finished.rb +72 -0
- data/lib/test_bench_isolated/test_bench/session/controls/events/test_skipped.rb +49 -0
- data/lib/test_bench_isolated/test_bench/session/controls/events/test_started.rb +66 -0
- data/lib/test_bench_isolated/test_bench/session/controls/events.rb +35 -0
- data/lib/test_bench_isolated/test_bench/session/controls/exception.rb +47 -0
- data/lib/test_bench_isolated/test_bench/session/controls/failure.rb +21 -0
- data/lib/test_bench_isolated/test_bench/session/controls/fixture.rb +21 -0
- data/lib/test_bench_isolated/test_bench/session/controls/output/detail.rb +31 -0
- data/lib/test_bench_isolated/test_bench/session/controls/output.rb +57 -0
- data/lib/test_bench_isolated/test_bench/session/controls/process_id.rb +9 -0
- data/lib/test_bench_isolated/test_bench/session/controls/random.rb +9 -0
- data/lib/test_bench_isolated/test_bench/session/controls/result.rb +25 -0
- data/lib/test_bench_isolated/test_bench/session/controls/substitute/path.rb +35 -0
- data/lib/test_bench_isolated/test_bench/session/controls/time.rb +9 -0
- data/lib/test_bench_isolated/test_bench/session/controls/title.rb +41 -0
- data/lib/test_bench_isolated/test_bench/session/controls.rb +36 -0
- data/lib/test_bench_isolated/test_bench/session/events.rb +27 -0
- data/lib/test_bench_isolated/test_bench/session/output/get.rb +29 -0
- data/lib/test_bench_isolated/test_bench/session/output/writer/buffer/interactive/viewport.rb +167 -0
- data/lib/test_bench_isolated/test_bench/session/output/writer/buffer/interactive.rb +141 -0
- data/lib/test_bench_isolated/test_bench/session/output/writer/buffer.rb +29 -0
- data/lib/test_bench_isolated/test_bench/session/output/writer/defaults.rb +19 -0
- data/lib/test_bench_isolated/test_bench/session/output/writer/substitute.rb +19 -0
- data/lib/test_bench_isolated/test_bench/session/output/writer.rb +97 -0
- data/lib/test_bench_isolated/test_bench/session/output.rb +377 -0
- data/lib/test_bench_isolated/test_bench/session/projection.rb +30 -0
- data/lib/test_bench_isolated/test_bench/session/session.rb +220 -0
- data/lib/test_bench_isolated/test_bench/session/store.rb +61 -0
- data/lib/test_bench_isolated/test_bench/session/substitute/path.rb +65 -0
- data/lib/test_bench_isolated/test_bench/session/substitute/sink.rb +114 -0
- data/lib/test_bench_isolated/test_bench/session/substitute.rb +120 -0
- data/lib/test_bench_isolated/test_bench/session.rb +22 -0
- data/lib/test_bench_isolated/test_bench/telemetry/controls/event/event_data.rb +17 -0
- data/lib/test_bench_isolated/test_bench/telemetry/controls/event/metadata.rb +72 -0
- data/lib/test_bench_isolated/test_bench/telemetry/controls/event.rb +140 -0
- data/lib/test_bench_isolated/test_bench/telemetry/controls/event_data.rb +131 -0
- data/lib/test_bench_isolated/test_bench/telemetry/controls/file.rb +86 -0
- data/lib/test_bench_isolated/test_bench/telemetry/controls/handler.rb +83 -0
- data/lib/test_bench_isolated/test_bench/telemetry/controls/process_id.rb +21 -0
- data/lib/test_bench_isolated/test_bench/telemetry/controls/projection/receiver.rb +33 -0
- data/lib/test_bench_isolated/test_bench/telemetry/controls/projection.rb +86 -0
- data/lib/test_bench_isolated/test_bench/telemetry/controls/random.rb +9 -0
- data/lib/test_bench_isolated/test_bench/telemetry/controls/sink.rb +35 -0
- data/lib/test_bench_isolated/test_bench/telemetry/controls/time.rb +125 -0
- data/lib/test_bench_isolated/test_bench/telemetry/controls.rb +17 -0
- data/lib/test_bench_isolated/test_bench/telemetry/event.rb +108 -0
- data/lib/test_bench_isolated/test_bench/telemetry/event_data/serialization.rb +172 -0
- data/lib/test_bench_isolated/test_bench/telemetry/event_data.rb +15 -0
- data/lib/test_bench_isolated/test_bench/telemetry/sink/file.rb +33 -0
- data/lib/test_bench_isolated/test_bench/telemetry/sink/handler/event_registry.rb +44 -0
- data/lib/test_bench_isolated/test_bench/telemetry/sink/handler.rb +128 -0
- data/lib/test_bench_isolated/test_bench/telemetry/sink/projection.rb +134 -0
- data/lib/test_bench_isolated/test_bench/telemetry/sink.rb +13 -0
- data/lib/test_bench_isolated/test_bench/telemetry/substitute/sink.rb +85 -0
- data/lib/test_bench_isolated/test_bench/telemetry/substitute.rb +34 -0
- data/lib/test_bench_isolated/test_bench/telemetry/telemetry.rb +111 -0
- data/lib/test_bench_isolated/test_bench/telemetry.rb +17 -0
- data/lib/test_bench_isolated/test_bench/test_bench.rb +56 -0
- data/lib/test_bench_isolated/test_bench.rb +5 -0
- data/script/bench +5 -0
- metadata +156 -7
- data/lib/test_bench/bootstrap.rb +0 -328
@@ -0,0 +1,48 @@
|
|
1
|
+
module TestBenchIsolated
|
2
|
+
module TestBench
|
3
|
+
class Run
|
4
|
+
class GetFiles
|
5
|
+
module Substitute
|
6
|
+
def self.build
|
7
|
+
GetFiles.new
|
8
|
+
end
|
9
|
+
|
10
|
+
class GetFiles
|
11
|
+
attr_accessor :file_error
|
12
|
+
def file_error? = !!file_error
|
13
|
+
|
14
|
+
def files
|
15
|
+
@files ||= []
|
16
|
+
end
|
17
|
+
attr_writer :files
|
18
|
+
alias :set_files :files=
|
19
|
+
|
20
|
+
def paths
|
21
|
+
@paths ||= []
|
22
|
+
end
|
23
|
+
|
24
|
+
def file_error!
|
25
|
+
self.file_error = true
|
26
|
+
end
|
27
|
+
|
28
|
+
def call(path, *paths, &block)
|
29
|
+
[path, *paths].each do |path|
|
30
|
+
self.paths << path
|
31
|
+
end
|
32
|
+
|
33
|
+
if file_error?
|
34
|
+
raise FileError
|
35
|
+
end
|
36
|
+
|
37
|
+
files.each(&block)
|
38
|
+
end
|
39
|
+
|
40
|
+
def path?(path)
|
41
|
+
paths.include?(path)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
module TestBenchIsolated
|
2
|
+
module TestBench
|
3
|
+
class Run
|
4
|
+
class GetFiles
|
5
|
+
FileError = Class.new(RuntimeError)
|
6
|
+
|
7
|
+
attr_reader :exclude_patterns
|
8
|
+
|
9
|
+
def initialize(exclude_patterns)
|
10
|
+
@exclude_patterns = exclude_patterns
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.build(exclude: nil)
|
14
|
+
exclude_patterns = exclude
|
15
|
+
exclude_patterns ||= Defaults.exclude_patterns
|
16
|
+
|
17
|
+
if exclude_patterns.instance_of?(String)
|
18
|
+
exclude_patterns = exclude_patterns.split(',')
|
19
|
+
end
|
20
|
+
|
21
|
+
new(exclude_patterns)
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.call(path, *paths, exclude: nil, &block)
|
25
|
+
instance = build(exclude:)
|
26
|
+
instance.(path, *paths, &block)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.configure(receiver, exclude: nil, attr_name: nil)
|
30
|
+
attr_name ||= :get_files
|
31
|
+
|
32
|
+
instance = build(exclude:)
|
33
|
+
receiver.public_send(:"#{attr_name}=", instance)
|
34
|
+
end
|
35
|
+
|
36
|
+
def call(path, *paths, &block)
|
37
|
+
paths = [path, *paths]
|
38
|
+
|
39
|
+
paths.each do |path|
|
40
|
+
if ::File.extname(path).empty?
|
41
|
+
pattern = ::File.join(path, '**/*.rb')
|
42
|
+
else
|
43
|
+
pattern = path
|
44
|
+
end
|
45
|
+
|
46
|
+
assure_extant(path)
|
47
|
+
|
48
|
+
Dir.glob(pattern).each do |file|
|
49
|
+
excluded = exclude_patterns.any? do |exclude_pattern|
|
50
|
+
exclude_pattern = ::File.join('*', exclude_pattern)
|
51
|
+
|
52
|
+
::File.fnmatch?(exclude_pattern, file, ::File::FNM_EXTGLOB)
|
53
|
+
end
|
54
|
+
|
55
|
+
if excluded
|
56
|
+
next
|
57
|
+
end
|
58
|
+
|
59
|
+
block.(file)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def assure_extant(path)
|
65
|
+
::File.stat(path)
|
66
|
+
rescue Errno::ENOENT => enoent
|
67
|
+
raise FileError, enoent.message
|
68
|
+
end
|
69
|
+
|
70
|
+
module Defaults
|
71
|
+
def self.exclude_patterns
|
72
|
+
ENV.fetch('TEST_BENCH_EXCLUDE_FILE_PATTERN', '*_init.rb')
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,137 @@
|
|
1
|
+
module TestBenchIsolated
|
2
|
+
module TestBench
|
3
|
+
class Run
|
4
|
+
module Output
|
5
|
+
class File
|
6
|
+
Error = Class.new(RuntimeError)
|
7
|
+
|
8
|
+
include TestBench::Output
|
9
|
+
include Events
|
10
|
+
|
11
|
+
def session_output
|
12
|
+
@session_output ||= TestBench::Output::Substitute.build
|
13
|
+
end
|
14
|
+
attr_writer :session_output
|
15
|
+
|
16
|
+
def pended_events
|
17
|
+
@pended_events ||= {}
|
18
|
+
end
|
19
|
+
attr_writer :pended_events
|
20
|
+
|
21
|
+
def only_failure
|
22
|
+
@only_failure.nil? ?
|
23
|
+
@only_failure = Defaults.only_failure :
|
24
|
+
@only_failure
|
25
|
+
end
|
26
|
+
alias :only_failure? :only_failure
|
27
|
+
attr_writer :only_failure
|
28
|
+
|
29
|
+
def configure(...)
|
30
|
+
TestBench::Session::Output::Writer.configure(self, ...)
|
31
|
+
|
32
|
+
Session::Output.configure(self, writer:, attr_name: :session_output)
|
33
|
+
end
|
34
|
+
|
35
|
+
handle FileStarted do |file_started|
|
36
|
+
process_id = file_started.metadata.process_id
|
37
|
+
|
38
|
+
start(process_id)
|
39
|
+
end
|
40
|
+
|
41
|
+
handle FileFinished do |file_finished|
|
42
|
+
process_id = file_finished.metadata.process_id
|
43
|
+
result = file_finished.result
|
44
|
+
file = file_finished.file
|
45
|
+
|
46
|
+
finish(process_id, result, file)
|
47
|
+
end
|
48
|
+
|
49
|
+
handle FileCrashed do |file_crashed|
|
50
|
+
process_id = file_crashed.metadata.process_id
|
51
|
+
file = file_crashed.file
|
52
|
+
|
53
|
+
result = false
|
54
|
+
|
55
|
+
finish(process_id, result, file)
|
56
|
+
end
|
57
|
+
|
58
|
+
handle Started do
|
59
|
+
end
|
60
|
+
|
61
|
+
handle Finished do
|
62
|
+
end
|
63
|
+
|
64
|
+
def finish(process_id, result, file)
|
65
|
+
events = pended_events.delete(process_id)
|
66
|
+
|
67
|
+
if only_failure && result
|
68
|
+
return
|
69
|
+
end
|
70
|
+
|
71
|
+
writer.puts("Running #{file}")
|
72
|
+
|
73
|
+
writer_sequence = writer.sequence
|
74
|
+
|
75
|
+
events ||= []
|
76
|
+
events.each do |event_data|
|
77
|
+
session_output.receive(event_data)
|
78
|
+
end
|
79
|
+
|
80
|
+
if writer.current?(writer_sequence)
|
81
|
+
writer.
|
82
|
+
style(:faint).
|
83
|
+
puts("(Nothing written)")
|
84
|
+
|
85
|
+
writer.puts
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def handle_event_data(event_data)
|
90
|
+
pend(event_data)
|
91
|
+
end
|
92
|
+
|
93
|
+
def pend_event(event_data)
|
94
|
+
process_id = event_data.process_id
|
95
|
+
|
96
|
+
if not started?(process_id)
|
97
|
+
start(process_id)
|
98
|
+
end
|
99
|
+
|
100
|
+
pended_events = self.pended_events[process_id]
|
101
|
+
pended_events << event_data
|
102
|
+
end
|
103
|
+
alias :pend :pend_event
|
104
|
+
|
105
|
+
def pended_event?(event_data)
|
106
|
+
process_id = event_data.process_id
|
107
|
+
|
108
|
+
pended_events = self.pended_events.fetch(process_id) do
|
109
|
+
return false
|
110
|
+
end
|
111
|
+
|
112
|
+
pended_events.include?(event_data)
|
113
|
+
end
|
114
|
+
alias :pended? :pended_event?
|
115
|
+
|
116
|
+
def start(process_id)
|
117
|
+
if started?(process_id)
|
118
|
+
raise Error, "Process already started (Process ID: #{process_id})"
|
119
|
+
end
|
120
|
+
|
121
|
+
pended_events[process_id] = []
|
122
|
+
end
|
123
|
+
|
124
|
+
def started?(process_id)
|
125
|
+
pended_events.key?(process_id)
|
126
|
+
end
|
127
|
+
|
128
|
+
module Defaults
|
129
|
+
def self.only_failure
|
130
|
+
ENV.fetch('TEST_BENCH_ONLY_FAILURE', 'off') == 'on'
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
module TestBenchIsolated
|
2
|
+
module TestBench
|
3
|
+
class Run
|
4
|
+
module Output
|
5
|
+
class Summary
|
6
|
+
class Error
|
7
|
+
StateError = Class.new(RuntimeError)
|
8
|
+
|
9
|
+
include TestBench::Output
|
10
|
+
include Events
|
11
|
+
|
12
|
+
attr_accessor :current_file
|
13
|
+
|
14
|
+
def failure_summary
|
15
|
+
@failure_summary ||= {}
|
16
|
+
end
|
17
|
+
attr_writer :failure_summary
|
18
|
+
|
19
|
+
handle FileStarted do |file_started|
|
20
|
+
file = file_started.file
|
21
|
+
|
22
|
+
start_file(file)
|
23
|
+
end
|
24
|
+
|
25
|
+
handle Session::Events::Failed do
|
26
|
+
current_file.record_failure
|
27
|
+
end
|
28
|
+
|
29
|
+
handle FileFinished do |file_finished|
|
30
|
+
file = file_finished.file
|
31
|
+
result = file_finished.result
|
32
|
+
|
33
|
+
finish_file(file, result)
|
34
|
+
end
|
35
|
+
|
36
|
+
handle FileCrashed do |file_crashed|
|
37
|
+
file = file_crashed.file
|
38
|
+
|
39
|
+
error_message = file_crashed.error_message
|
40
|
+
|
41
|
+
finish_file(file, error_message:)
|
42
|
+
end
|
43
|
+
|
44
|
+
handle Finished do |finished|
|
45
|
+
if not failure_summary.empty?
|
46
|
+
print_summary
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def print_summary
|
51
|
+
writer.style(:bold, :underline, :red).puts("Failure Summary:")
|
52
|
+
|
53
|
+
failure_summary.each_value do |file_record|
|
54
|
+
file, failures, error_message = file_record.to_a
|
55
|
+
|
56
|
+
writer
|
57
|
+
.style(:faint, :red)
|
58
|
+
.print("-")
|
59
|
+
.style(:reset_intensity, :bold)
|
60
|
+
.print(" #{file}")
|
61
|
+
.style(:reset_intensity)
|
62
|
+
.print(":")
|
63
|
+
|
64
|
+
if failures > 0
|
65
|
+
writer.print(" %i failure%s" % [
|
66
|
+
failures,
|
67
|
+
failures == 1 ? '' : 's'
|
68
|
+
])
|
69
|
+
|
70
|
+
if not error_message.nil?
|
71
|
+
writer.print(".")
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
if not error_message.nil?
|
76
|
+
writer.puts(" File crashed, error:")
|
77
|
+
|
78
|
+
writer.style(:red).puts(" #{error_message}")
|
79
|
+
else
|
80
|
+
writer.puts
|
81
|
+
end
|
82
|
+
|
83
|
+
writer.puts
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def start_file(file)
|
88
|
+
if not current_file.nil?
|
89
|
+
raise StateError, "Already started file #{current_file.file.inspect} (File: #{file.inspect})"
|
90
|
+
end
|
91
|
+
|
92
|
+
file = File.build(file)
|
93
|
+
|
94
|
+
self.current_file = file
|
95
|
+
end
|
96
|
+
|
97
|
+
def finish_file(file, result=nil, error_message: nil)
|
98
|
+
result ||= false
|
99
|
+
|
100
|
+
if not current_file?(file)
|
101
|
+
raise StateError, "Cannot finish file #{file.inspect} (Current File: #{current_file&.file.inspect})"
|
102
|
+
end
|
103
|
+
|
104
|
+
if not result
|
105
|
+
if not error_message.nil?
|
106
|
+
current_file.error_message = error_message
|
107
|
+
end
|
108
|
+
|
109
|
+
failure_summary[file] = current_file
|
110
|
+
end
|
111
|
+
|
112
|
+
self.current_file = nil
|
113
|
+
end
|
114
|
+
|
115
|
+
def current_file?(file=nil)
|
116
|
+
return false if current_file.nil?
|
117
|
+
|
118
|
+
if not file.nil?
|
119
|
+
file == current_file.file
|
120
|
+
else
|
121
|
+
true
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
File = Struct.new(:file, :failures, :error_message) do
|
126
|
+
def self.build(file)
|
127
|
+
failures = 0
|
128
|
+
|
129
|
+
new(file, failures)
|
130
|
+
end
|
131
|
+
|
132
|
+
def record_failure
|
133
|
+
self.failures += 1
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
@@ -0,0 +1,184 @@
|
|
1
|
+
module TestBenchIsolated
|
2
|
+
module TestBench
|
3
|
+
class Run
|
4
|
+
module Output
|
5
|
+
class Summary
|
6
|
+
StateError = Class.new(RuntimeError)
|
7
|
+
|
8
|
+
include TestBench::Output
|
9
|
+
include Session::Events
|
10
|
+
include Events
|
11
|
+
|
12
|
+
def tests_finished
|
13
|
+
@tests_finished ||= 0
|
14
|
+
end
|
15
|
+
attr_writer :tests_finished
|
16
|
+
|
17
|
+
def tests_passed
|
18
|
+
@tests_passed ||= 0
|
19
|
+
end
|
20
|
+
attr_writer :tests_passed
|
21
|
+
|
22
|
+
def tests_failed
|
23
|
+
@tests_failed ||= 0
|
24
|
+
end
|
25
|
+
attr_writer :tests_failed
|
26
|
+
|
27
|
+
def tests_skipped
|
28
|
+
@tests_skipped ||= 0
|
29
|
+
end
|
30
|
+
attr_writer :tests_skipped
|
31
|
+
|
32
|
+
def contexts_skipped
|
33
|
+
@contexts_skipped ||= 0
|
34
|
+
end
|
35
|
+
attr_writer :contexts_skipped
|
36
|
+
|
37
|
+
def files_finished
|
38
|
+
@files_finished ||= 0
|
39
|
+
end
|
40
|
+
attr_writer :files_finished
|
41
|
+
|
42
|
+
def files_crashed
|
43
|
+
@files_crashed ||= 0
|
44
|
+
end
|
45
|
+
attr_writer :files_crashed
|
46
|
+
|
47
|
+
attr_accessor :start_time
|
48
|
+
attr_accessor :finish_time
|
49
|
+
attr_accessor :elapsed_time
|
50
|
+
|
51
|
+
handle TestFinished do |test_finished|
|
52
|
+
self.tests_finished += 1
|
53
|
+
|
54
|
+
if test_finished.result
|
55
|
+
self.tests_passed += 1
|
56
|
+
else
|
57
|
+
self.tests_failed += 1
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
handle TestSkipped do
|
62
|
+
self.tests_skipped += 1
|
63
|
+
end
|
64
|
+
|
65
|
+
handle ContextSkipped do
|
66
|
+
self.contexts_skipped += 1
|
67
|
+
end
|
68
|
+
|
69
|
+
handle FileFinished do
|
70
|
+
self.files_finished += 1
|
71
|
+
end
|
72
|
+
|
73
|
+
handle FileCrashed do
|
74
|
+
self.files_crashed += 1
|
75
|
+
end
|
76
|
+
|
77
|
+
handle Started do |started|
|
78
|
+
start_time = started.metadata.time
|
79
|
+
|
80
|
+
self.start_time = start_time
|
81
|
+
end
|
82
|
+
|
83
|
+
handle Finished do |finished|
|
84
|
+
finish_time = finished.metadata.time
|
85
|
+
|
86
|
+
record_finish_time(finish_time)
|
87
|
+
|
88
|
+
finish
|
89
|
+
end
|
90
|
+
|
91
|
+
def record_finish_time(finish_time)
|
92
|
+
if start_time.nil?
|
93
|
+
raise StateError, "Start time isn't set"
|
94
|
+
end
|
95
|
+
|
96
|
+
self.finish_time = finish_time
|
97
|
+
|
98
|
+
elapsed_time = finish_time - start_time
|
99
|
+
self.elapsed_time = elapsed_time
|
100
|
+
end
|
101
|
+
|
102
|
+
def finish
|
103
|
+
writer.print("Finished running %i file%s, " % [
|
104
|
+
files_finished,
|
105
|
+
files_finished == 1 ? '' : 's'
|
106
|
+
])
|
107
|
+
|
108
|
+
if files_crashed > 0
|
109
|
+
writer
|
110
|
+
.style(:bold, :red)
|
111
|
+
.puts("%i file%s crashed" % [
|
112
|
+
files_crashed,
|
113
|
+
files_crashed == 1 ? '' : 's'
|
114
|
+
])
|
115
|
+
else
|
116
|
+
writer.puts("0 files crashed")
|
117
|
+
end
|
118
|
+
|
119
|
+
writer.print("Ran %i test%s" % [
|
120
|
+
tests_finished,
|
121
|
+
tests_finished == 1 ? '' : 's'
|
122
|
+
])
|
123
|
+
|
124
|
+
if not elapsed_time.nil?
|
125
|
+
tests_per_second = tests_finished / elapsed_time
|
126
|
+
writer.print(" in %0.3fs (%i test%s/second)" % [
|
127
|
+
elapsed_time,
|
128
|
+
tests_per_second,
|
129
|
+
tests_finished == 1 ? '' : 's'
|
130
|
+
])
|
131
|
+
end
|
132
|
+
writer.puts
|
133
|
+
|
134
|
+
skip_count = tests_skipped + contexts_skipped
|
135
|
+
|
136
|
+
if tests_passed > 0
|
137
|
+
if skip_count.zero? && tests_failed.zero?
|
138
|
+
writer.style(:bold)
|
139
|
+
end
|
140
|
+
|
141
|
+
writer
|
142
|
+
.style(:green)
|
143
|
+
.print("#{tests_passed} passed")
|
144
|
+
.style(:reset_fg)
|
145
|
+
|
146
|
+
if skip_count.zero? && tests_failed.zero?
|
147
|
+
writer.style(:reset_intensity)
|
148
|
+
end
|
149
|
+
else
|
150
|
+
writer
|
151
|
+
.style(:bold, :faint, :italic)
|
152
|
+
.print("0 passed")
|
153
|
+
.style(:reset_italic, :reset_intensity)
|
154
|
+
end
|
155
|
+
writer.print(", ")
|
156
|
+
|
157
|
+
if skip_count.zero?
|
158
|
+
writer.print("0 skipped")
|
159
|
+
else
|
160
|
+
writer
|
161
|
+
.style(:bold, :yellow)
|
162
|
+
.print("%i%s skipped" % [
|
163
|
+
skip_count,
|
164
|
+
contexts_skipped > 0 ? '+' : ''
|
165
|
+
])
|
166
|
+
.style(:reset_fg, :reset_intensity)
|
167
|
+
end
|
168
|
+
writer.print(", ")
|
169
|
+
|
170
|
+
if tests_failed > 0
|
171
|
+
writer
|
172
|
+
.style(:bold, :red)
|
173
|
+
.puts("#{tests_failed} failed")
|
174
|
+
else
|
175
|
+
writer.puts("0 failed")
|
176
|
+
end
|
177
|
+
|
178
|
+
writer.puts
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|