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