test_bench-isolated 0 → 2.0.0.1

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.
Files changed (153) hide show
  1. checksums.yaml +4 -4
  2. data/lib/test_bench/isolated.rb +1 -0
  3. data/lib/test_bench_isolated/test_bench/cli.rb +298 -0
  4. data/lib/test_bench_isolated/test_bench/controls/file.rb +7 -0
  5. data/lib/test_bench_isolated/test_bench/controls/path.rb +7 -0
  6. data/lib/test_bench_isolated/test_bench/controls/random.rb +9 -0
  7. data/lib/test_bench_isolated/test_bench/controls/result.rb +7 -0
  8. data/lib/test_bench_isolated/test_bench/controls/stdin.rb +29 -0
  9. data/lib/test_bench_isolated/test_bench/controls.rb +11 -0
  10. data/lib/test_bench_isolated/test_bench/fixture/actuate/class.rb +97 -0
  11. data/lib/test_bench_isolated/test_bench/fixture/actuate/object.rb +93 -0
  12. data/lib/test_bench_isolated/test_bench/fixture/controls/exception.rb +9 -0
  13. data/lib/test_bench_isolated/test_bench/fixture/controls/fixture/class.rb +88 -0
  14. data/lib/test_bench_isolated/test_bench/fixture/controls/fixture/object/modules.rb +41 -0
  15. data/lib/test_bench_isolated/test_bench/fixture/controls/fixture/object.rb +33 -0
  16. data/lib/test_bench_isolated/test_bench/fixture/controls/fixture.rb +29 -0
  17. data/lib/test_bench_isolated/test_bench/fixture/controls/output.rb +9 -0
  18. data/lib/test_bench_isolated/test_bench/fixture/controls/random.rb +9 -0
  19. data/lib/test_bench_isolated/test_bench/fixture/controls/result.rb +9 -0
  20. data/lib/test_bench_isolated/test_bench/fixture/controls/title.rb +9 -0
  21. data/lib/test_bench_isolated/test_bench/fixture/controls.rb +13 -0
  22. data/lib/test_bench_isolated/test_bench/fixture/evaluate.rb +31 -0
  23. data/lib/test_bench_isolated/test_bench/fixture/fixture.rb +201 -0
  24. data/lib/test_bench_isolated/test_bench/fixture.rb +8 -0
  25. data/lib/test_bench_isolated/test_bench/output/controls/data.rb +51 -0
  26. data/lib/test_bench_isolated/test_bench/output/controls/device.rb +29 -0
  27. data/lib/test_bench_isolated/test_bench/output/controls/event.rb +9 -0
  28. data/lib/test_bench_isolated/test_bench/output/controls/output.rb +36 -0
  29. data/lib/test_bench_isolated/test_bench/output/controls/random.rb +9 -0
  30. data/lib/test_bench_isolated/test_bench/output/controls/style.rb +33 -0
  31. data/lib/test_bench_isolated/test_bench/output/controls/styling.rb +29 -0
  32. data/lib/test_bench_isolated/test_bench/output/controls/text.rb +19 -0
  33. data/lib/test_bench_isolated/test_bench/output/controls.rb +10 -0
  34. data/lib/test_bench_isolated/test_bench/output/device/null.rb +21 -0
  35. data/lib/test_bench_isolated/test_bench/output/device/substitute.rb +60 -0
  36. data/lib/test_bench_isolated/test_bench/output/digest.rb +115 -0
  37. data/lib/test_bench_isolated/test_bench/output/output.rb +68 -0
  38. data/lib/test_bench_isolated/test_bench/output/writer/buffer.rb +59 -0
  39. data/lib/test_bench_isolated/test_bench/output/writer/defaults.rb +13 -0
  40. data/lib/test_bench_isolated/test_bench/output/writer/style.rb +52 -0
  41. data/lib/test_bench_isolated/test_bench/output/writer/substitute.rb +40 -0
  42. data/lib/test_bench_isolated/test_bench/output/writer.rb +212 -0
  43. data/lib/test_bench_isolated/test_bench/output.rb +14 -0
  44. data/lib/test_bench_isolated/test_bench/random/controls/seed.rb +27 -0
  45. data/lib/test_bench_isolated/test_bench/random/controls.rb +1 -0
  46. data/lib/test_bench_isolated/test_bench/random/random.rb +170 -0
  47. data/lib/test_bench_isolated/test_bench/random.rb +1 -0
  48. data/lib/test_bench_isolated/test_bench/run/controls/directory.rb +72 -0
  49. data/lib/test_bench_isolated/test_bench/run/controls/event_data.rb +9 -0
  50. data/lib/test_bench_isolated/test_bench/run/controls/events/event_data.rb +11 -0
  51. data/lib/test_bench_isolated/test_bench/run/controls/events/file_crashed.rb +111 -0
  52. data/lib/test_bench_isolated/test_bench/run/controls/events/file_finished.rb +58 -0
  53. data/lib/test_bench_isolated/test_bench/run/controls/events/file_started.rb +49 -0
  54. data/lib/test_bench_isolated/test_bench/run/controls/events/finished.rb +58 -0
  55. data/lib/test_bench_isolated/test_bench/run/controls/events/session.rb +11 -0
  56. data/lib/test_bench_isolated/test_bench/run/controls/events/started.rb +49 -0
  57. data/lib/test_bench_isolated/test_bench/run/controls/exception.rb +103 -0
  58. data/lib/test_bench_isolated/test_bench/run/controls/executor.rb +58 -0
  59. data/lib/test_bench_isolated/test_bench/run/controls/file/create.rb +71 -0
  60. data/lib/test_bench_isolated/test_bench/run/controls/file/pattern.rb +35 -0
  61. data/lib/test_bench_isolated/test_bench/run/controls/file.rb +182 -0
  62. data/lib/test_bench_isolated/test_bench/run/controls/path.rb +17 -0
  63. data/lib/test_bench_isolated/test_bench/run/controls/process_id.rb +9 -0
  64. data/lib/test_bench_isolated/test_bench/run/controls/random.rb +9 -0
  65. data/lib/test_bench_isolated/test_bench/run/controls/result.rb +9 -0
  66. data/lib/test_bench_isolated/test_bench/run/controls/time.rb +9 -0
  67. data/lib/test_bench_isolated/test_bench/run/controls.rb +26 -0
  68. data/lib/test_bench_isolated/test_bench/run/events.rb +14 -0
  69. data/lib/test_bench_isolated/test_bench/run/executor/serial.rb +36 -0
  70. data/lib/test_bench_isolated/test_bench/run/executor/substitute.rb +47 -0
  71. data/lib/test_bench_isolated/test_bench/run/executor.rb +46 -0
  72. data/lib/test_bench_isolated/test_bench/run/file.rb +83 -0
  73. data/lib/test_bench_isolated/test_bench/run/get_files/substitute.rb +48 -0
  74. data/lib/test_bench_isolated/test_bench/run/get_files.rb +78 -0
  75. data/lib/test_bench_isolated/test_bench/run/output/file.rb +137 -0
  76. data/lib/test_bench_isolated/test_bench/run/output/summary/error.rb +141 -0
  77. data/lib/test_bench_isolated/test_bench/run/output/summary.rb +184 -0
  78. data/lib/test_bench_isolated/test_bench/run/run.rb +156 -0
  79. data/lib/test_bench_isolated/test_bench/run.rb +18 -0
  80. data/lib/test_bench_isolated/test_bench/session/controls/comment.rb +107 -0
  81. data/lib/test_bench_isolated/test_bench/session/controls/detail.rb +93 -0
  82. data/lib/test_bench_isolated/test_bench/session/controls/event.rb +9 -0
  83. data/lib/test_bench_isolated/test_bench/session/controls/events/commented.rb +112 -0
  84. data/lib/test_bench_isolated/test_bench/session/controls/events/context_finished.rb +72 -0
  85. data/lib/test_bench_isolated/test_bench/session/controls/events/context_skipped.rb +49 -0
  86. data/lib/test_bench_isolated/test_bench/session/controls/events/context_started.rb +66 -0
  87. data/lib/test_bench_isolated/test_bench/session/controls/events/detailed.rb +112 -0
  88. data/lib/test_bench_isolated/test_bench/session/controls/events/event_data.rb +11 -0
  89. data/lib/test_bench_isolated/test_bench/session/controls/events/failed.rb +49 -0
  90. data/lib/test_bench_isolated/test_bench/session/controls/events/fixture_finished.rb +55 -0
  91. data/lib/test_bench_isolated/test_bench/session/controls/events/fixture_started.rb +49 -0
  92. data/lib/test_bench_isolated/test_bench/session/controls/events/test_finished.rb +72 -0
  93. data/lib/test_bench_isolated/test_bench/session/controls/events/test_skipped.rb +49 -0
  94. data/lib/test_bench_isolated/test_bench/session/controls/events/test_started.rb +66 -0
  95. data/lib/test_bench_isolated/test_bench/session/controls/events.rb +35 -0
  96. data/lib/test_bench_isolated/test_bench/session/controls/exception.rb +47 -0
  97. data/lib/test_bench_isolated/test_bench/session/controls/failure.rb +21 -0
  98. data/lib/test_bench_isolated/test_bench/session/controls/fixture.rb +21 -0
  99. data/lib/test_bench_isolated/test_bench/session/controls/output/detail.rb +31 -0
  100. data/lib/test_bench_isolated/test_bench/session/controls/output.rb +57 -0
  101. data/lib/test_bench_isolated/test_bench/session/controls/process_id.rb +9 -0
  102. data/lib/test_bench_isolated/test_bench/session/controls/random.rb +9 -0
  103. data/lib/test_bench_isolated/test_bench/session/controls/result.rb +25 -0
  104. data/lib/test_bench_isolated/test_bench/session/controls/substitute/path.rb +35 -0
  105. data/lib/test_bench_isolated/test_bench/session/controls/time.rb +9 -0
  106. data/lib/test_bench_isolated/test_bench/session/controls/title.rb +41 -0
  107. data/lib/test_bench_isolated/test_bench/session/controls.rb +36 -0
  108. data/lib/test_bench_isolated/test_bench/session/events.rb +27 -0
  109. data/lib/test_bench_isolated/test_bench/session/output/get.rb +29 -0
  110. data/lib/test_bench_isolated/test_bench/session/output/writer/buffer/interactive/viewport.rb +167 -0
  111. data/lib/test_bench_isolated/test_bench/session/output/writer/buffer/interactive.rb +141 -0
  112. data/lib/test_bench_isolated/test_bench/session/output/writer/buffer.rb +29 -0
  113. data/lib/test_bench_isolated/test_bench/session/output/writer/defaults.rb +19 -0
  114. data/lib/test_bench_isolated/test_bench/session/output/writer/substitute.rb +19 -0
  115. data/lib/test_bench_isolated/test_bench/session/output/writer.rb +97 -0
  116. data/lib/test_bench_isolated/test_bench/session/output.rb +377 -0
  117. data/lib/test_bench_isolated/test_bench/session/projection.rb +30 -0
  118. data/lib/test_bench_isolated/test_bench/session/session.rb +220 -0
  119. data/lib/test_bench_isolated/test_bench/session/store.rb +61 -0
  120. data/lib/test_bench_isolated/test_bench/session/substitute/path.rb +65 -0
  121. data/lib/test_bench_isolated/test_bench/session/substitute/sink.rb +114 -0
  122. data/lib/test_bench_isolated/test_bench/session/substitute.rb +120 -0
  123. data/lib/test_bench_isolated/test_bench/session.rb +22 -0
  124. data/lib/test_bench_isolated/test_bench/telemetry/controls/event/event_data.rb +17 -0
  125. data/lib/test_bench_isolated/test_bench/telemetry/controls/event/metadata.rb +72 -0
  126. data/lib/test_bench_isolated/test_bench/telemetry/controls/event.rb +140 -0
  127. data/lib/test_bench_isolated/test_bench/telemetry/controls/event_data.rb +131 -0
  128. data/lib/test_bench_isolated/test_bench/telemetry/controls/file.rb +86 -0
  129. data/lib/test_bench_isolated/test_bench/telemetry/controls/handler.rb +83 -0
  130. data/lib/test_bench_isolated/test_bench/telemetry/controls/process_id.rb +21 -0
  131. data/lib/test_bench_isolated/test_bench/telemetry/controls/projection/receiver.rb +33 -0
  132. data/lib/test_bench_isolated/test_bench/telemetry/controls/projection.rb +86 -0
  133. data/lib/test_bench_isolated/test_bench/telemetry/controls/random.rb +9 -0
  134. data/lib/test_bench_isolated/test_bench/telemetry/controls/sink.rb +35 -0
  135. data/lib/test_bench_isolated/test_bench/telemetry/controls/time.rb +125 -0
  136. data/lib/test_bench_isolated/test_bench/telemetry/controls.rb +17 -0
  137. data/lib/test_bench_isolated/test_bench/telemetry/event.rb +108 -0
  138. data/lib/test_bench_isolated/test_bench/telemetry/event_data/serialization.rb +172 -0
  139. data/lib/test_bench_isolated/test_bench/telemetry/event_data.rb +15 -0
  140. data/lib/test_bench_isolated/test_bench/telemetry/sink/file.rb +33 -0
  141. data/lib/test_bench_isolated/test_bench/telemetry/sink/handler/event_registry.rb +44 -0
  142. data/lib/test_bench_isolated/test_bench/telemetry/sink/handler.rb +128 -0
  143. data/lib/test_bench_isolated/test_bench/telemetry/sink/projection.rb +134 -0
  144. data/lib/test_bench_isolated/test_bench/telemetry/sink.rb +13 -0
  145. data/lib/test_bench_isolated/test_bench/telemetry/substitute/sink.rb +85 -0
  146. data/lib/test_bench_isolated/test_bench/telemetry/substitute.rb +34 -0
  147. data/lib/test_bench_isolated/test_bench/telemetry/telemetry.rb +111 -0
  148. data/lib/test_bench_isolated/test_bench/telemetry.rb +17 -0
  149. data/lib/test_bench_isolated/test_bench/test_bench.rb +56 -0
  150. data/lib/test_bench_isolated/test_bench.rb +5 -0
  151. data/script/bench +5 -0
  152. metadata +157 -7
  153. 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