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,377 @@
1
+ module TestBenchIsolated
2
+ module TestBench
3
+ class Session
4
+ class Output
5
+ include TestBench::Output
6
+ include Events
7
+
8
+ def pending_writer
9
+ @pending_writer ||= Writer::Substitute.build
10
+ end
11
+ attr_writer :pending_writer
12
+
13
+ def passing_writer
14
+ @passing_writer ||= Writer::Substitute.build
15
+ end
16
+ attr_writer :passing_writer
17
+
18
+ def failing_writer
19
+ @failing_writer ||= Writer::Substitute.build
20
+ end
21
+ attr_writer :failing_writer
22
+
23
+ def failures
24
+ @failures ||= 0
25
+ end
26
+ attr_writer :failures
27
+
28
+ def mode
29
+ @mode ||= Mode.initial
30
+ end
31
+ attr_writer :mode
32
+
33
+ def branch_count
34
+ @branch_count ||= 0
35
+ end
36
+ attr_writer :branch_count
37
+
38
+ def detail_policy
39
+ @detail_policy ||= Detail.default
40
+ end
41
+ alias :detail :detail_policy
42
+ attr_writer :detail_policy
43
+
44
+ def configure(detail: nil, **arguments)
45
+ if not detail.nil?
46
+ self.detail_policy = detail
47
+ end
48
+
49
+ Writer.configure(self, **arguments, attr_name: :pending_writer)
50
+ end
51
+
52
+ def receive(event_data)
53
+ case event_data.type
54
+ when ContextStarted.event_type, TestStarted.event_type
55
+ branch
56
+ end
57
+
58
+ if initial?
59
+ handle(event_data)
60
+
61
+ else
62
+ self.mode = Mode.failing
63
+ handle(event_data)
64
+
65
+ self.mode = Mode.passing
66
+ handle(event_data)
67
+
68
+ self.mode = Mode.pending
69
+ handle(event_data)
70
+ end
71
+
72
+ case event_data.type
73
+ when ContextFinished.event_type, TestFinished.event_type
74
+ _title, result = event_data.data
75
+ merge(result)
76
+ end
77
+ end
78
+
79
+ handle ContextStarted do |context_started|
80
+ title = context_started.title
81
+
82
+ if not title.nil?
83
+ writer.
84
+ indent.
85
+ style(:green).
86
+ puts(title)
87
+
88
+ writer.indent!
89
+
90
+ if branch_count == 1
91
+ self.failures = 0
92
+ end
93
+ end
94
+ end
95
+
96
+ handle ContextFinished do |context_finished|
97
+ title = context_finished.title
98
+
99
+ if not title.nil?
100
+ writer.deindent!
101
+
102
+ if branch_count == 1
103
+ writer.puts
104
+
105
+ if failing? && failures > 0
106
+ writer.
107
+ style(:bold, :red).
108
+ puts("Failure#{'s' if not failures == 1}: #{failures}")
109
+
110
+ writer.puts
111
+ end
112
+ end
113
+ end
114
+ end
115
+
116
+ handle ContextSkipped do |context_skipped|
117
+ title = context_skipped.title
118
+
119
+ if not writer.styling?
120
+ title = "#{title} (skipped)"
121
+ end
122
+
123
+ writer.
124
+ indent.
125
+ style(:yellow).
126
+ puts(title)
127
+ end
128
+
129
+ handle TestStarted do |test_started|
130
+ title = test_started.title
131
+
132
+ if title.nil?
133
+ if passing?
134
+ return
135
+ else
136
+ title = 'Test'
137
+ end
138
+ end
139
+
140
+ writer.indent
141
+
142
+ if passing?
143
+ writer.style(:green)
144
+ elsif failing?
145
+ if not writer.styling?
146
+ title = "#{title} (failed)"
147
+ end
148
+
149
+ writer.style(:bold, :red)
150
+ elsif pending?
151
+ writer.style(:faint)
152
+ end
153
+
154
+ writer.puts(title)
155
+
156
+ writer.indent!
157
+ end
158
+
159
+ handle TestFinished do |test_finished|
160
+ title = test_finished.title
161
+
162
+ if passing? && title.nil?
163
+ return
164
+ end
165
+
166
+ writer.deindent!
167
+ end
168
+
169
+ handle TestSkipped do |test_skipped|
170
+ title = test_skipped.title
171
+
172
+ if not writer.styling?
173
+ title = "#{title} (skipped)"
174
+ end
175
+
176
+ writer.
177
+ indent.
178
+ style(:yellow).
179
+ puts(title)
180
+ end
181
+
182
+ handle Failed do |failed|
183
+ message = failed.message
184
+
185
+ if failing?
186
+ self.failures += 1
187
+ end
188
+
189
+ writer
190
+ .indent
191
+ .style(:red)
192
+ .puts(message)
193
+ end
194
+
195
+ handle Detailed do |detailed|
196
+ if not detail?
197
+ return
198
+ end
199
+
200
+ text = detailed.text
201
+ quote = detailed.quote
202
+ heading = detailed.heading
203
+
204
+ comment(text, quote, heading)
205
+ end
206
+
207
+ handle Commented do |commented|
208
+ text = commented.text
209
+ quote = commented.quote
210
+ heading = commented.heading
211
+
212
+ comment(text, quote, heading)
213
+ end
214
+
215
+ def comment(text, quote, heading)
216
+ if not heading.nil?
217
+ writer.
218
+ indent.
219
+ style(:bold, :underline).
220
+ puts(heading)
221
+
222
+ if not writer.styling?
223
+ writer.
224
+ indent.
225
+ puts('- - -')
226
+ end
227
+ end
228
+
229
+ if text.empty?
230
+ writer.
231
+ indent.
232
+ style(:faint, :italic).
233
+ puts('(empty)')
234
+ return
235
+ end
236
+
237
+ if not quote
238
+ writer.
239
+ indent.
240
+ puts(text)
241
+ else
242
+ text.each_line(chomp: true) do |line|
243
+ writer.
244
+ indent.
245
+ style(:faint).
246
+ print('> ').
247
+ style(:reset_intensity).
248
+ puts(line)
249
+ end
250
+ end
251
+ end
252
+
253
+ def current_writer
254
+ if initial? || pending?
255
+ pending_writer
256
+ elsif passing?
257
+ passing_writer
258
+ elsif failing?
259
+ failing_writer
260
+ end
261
+ end
262
+ alias :writer :current_writer
263
+
264
+ def branch
265
+ if branch_count.zero?
266
+ self.mode = Mode.pending
267
+
268
+ pending_writer.sync = false
269
+
270
+ parent_writer = pending_writer
271
+ else
272
+ parent_writer = passing_writer
273
+ end
274
+
275
+ self.branch_count += 1
276
+
277
+ self.passing_writer, self.failing_writer = parent_writer.branch
278
+ end
279
+
280
+ def merge(result)
281
+ self.branch_count -= 1
282
+
283
+ if not branched?
284
+ pending_writer.sync = true
285
+
286
+ self.mode = Mode.initial
287
+ end
288
+
289
+ if result
290
+ writer = passing_writer
291
+ else
292
+ writer = failing_writer
293
+ end
294
+
295
+ writer.flush
296
+
297
+ self.passing_writer = writer.device
298
+ self.failing_writer = writer.alternate_device
299
+ end
300
+
301
+ def branched?
302
+ branch_count > 0
303
+ end
304
+
305
+ def initial?
306
+ mode == Mode.initial
307
+ end
308
+
309
+ def pending?
310
+ mode == Mode.pending
311
+ end
312
+
313
+ def passing?
314
+ mode == Mode.passing
315
+ end
316
+
317
+ def failing?
318
+ mode == Mode.failing
319
+ end
320
+
321
+ def detail?
322
+ Detail.detail?(detail_policy, mode)
323
+ end
324
+
325
+ module Mode
326
+ def self.initial = :initial
327
+ def self.pending = :pending
328
+ def self.passing = :passing
329
+ def self.failing = :failing
330
+ end
331
+
332
+ module Detail
333
+ Error = Class.new(RuntimeError)
334
+
335
+ def self.detail?(policy, mode)
336
+ assure_detail(policy, mode)
337
+ end
338
+
339
+ def self.assure_detail(policy, mode=nil)
340
+ mode ||= Mode.initial
341
+
342
+ case policy
343
+ when on
344
+ true
345
+ when off
346
+ false
347
+ when failure
348
+ if mode == Mode.failing || mode == Mode.initial
349
+ true
350
+ else
351
+ false
352
+ end
353
+ else
354
+ raise Error, "Unknown detail policy #{policy.inspect}"
355
+ end
356
+ end
357
+
358
+ def self.on = :on
359
+ def self.off = :off
360
+ def self.failure = :failure
361
+
362
+ def self.default
363
+ policy = ENV.fetch('TEST_BENCH_DETAIL') do
364
+ return default!
365
+ end
366
+
367
+ policy.to_sym
368
+ end
369
+
370
+ def self.default!
371
+ :failure
372
+ end
373
+ end
374
+ end
375
+ end
376
+ end
377
+ end
@@ -0,0 +1,30 @@
1
+ module TestBenchIsolated
2
+ module TestBench
3
+ class Session
4
+ class Projection
5
+ include Telemetry::Sink::Projection
6
+ include Events
7
+
8
+ receiver_name :session
9
+
10
+ apply Failed do
11
+ session.record_failure
12
+ end
13
+
14
+ apply TestSkipped do
15
+ session.record_skip
16
+ end
17
+
18
+ apply ContextSkipped do
19
+ session.record_skip
20
+ end
21
+
22
+ apply TestFinished do |test_finished|
23
+ if test_finished.result
24
+ session.record_assertion
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,220 @@
1
+ module TestBenchIsolated
2
+ module TestBench
3
+ class Session
4
+ Failure = Class.new(RuntimeError)
5
+ Abort = Class.new(Failure)
6
+
7
+ def telemetry
8
+ @telemetry ||= TestBench::Telemetry::Substitute.build
9
+ end
10
+ attr_writer :telemetry
11
+
12
+ def failure_sequence
13
+ @failure_sequence ||= 0
14
+ end
15
+ attr_writer :failure_sequence
16
+
17
+ def assertion_sequence
18
+ @assertion_sequence ||= 0
19
+ end
20
+ attr_writer :assertion_sequence
21
+
22
+ def skip_sequence
23
+ @skip_sequence ||= 0
24
+ end
25
+ attr_writer :skip_sequence
26
+
27
+ def self.build(&block)
28
+ instance = new
29
+
30
+ Telemetry.configure(instance)
31
+
32
+ if not block.nil?
33
+ block.(instance.telemetry)
34
+ end
35
+
36
+ instance
37
+ end
38
+
39
+ def self.configure(receiver, session: nil, attr_name: nil, &block)
40
+ session ||= Store.fetch
41
+ attr_name ||= :session
42
+
43
+ instance = session
44
+ receiver.public_send(:"#{attr_name}=", instance)
45
+ end
46
+
47
+ def passed?
48
+ asserted? && !failed? && !skipped?
49
+ end
50
+
51
+ def fixture(name, &block)
52
+ original_failure_sequence = failure_sequence
53
+
54
+ record_event(Events::FixtureStarted.new(name))
55
+
56
+ begin
57
+ block.()
58
+
59
+ rescue Failure
60
+
61
+ ensure
62
+ result = !failed?(original_failure_sequence)
63
+
64
+ record_event(Events::FixtureFinished.new(name, result))
65
+ end
66
+
67
+ result
68
+ end
69
+
70
+ def detail(text, quote, heading=nil)
71
+ record_event(Events::Detailed.new(text, quote, heading))
72
+ end
73
+
74
+ def comment(text, quote, heading=nil)
75
+ record_event(Events::Commented.new(text, quote, heading))
76
+ end
77
+
78
+ def context!(...)
79
+ if context(...) == false
80
+ message = Session.abort_message
81
+ raise Abort, message
82
+ end
83
+ end
84
+
85
+ def context(title=nil, &block)
86
+ if block.nil?
87
+ record_skip
88
+ record_event(Events::ContextSkipped.new(title))
89
+ return
90
+ end
91
+
92
+ original_failure_sequence = failure_sequence
93
+
94
+ record_event(Events::ContextStarted.new(title))
95
+
96
+ begin
97
+ block.()
98
+
99
+ rescue Failure
100
+
101
+ ensure
102
+ result = !failed?(original_failure_sequence)
103
+
104
+ record_event(Events::ContextFinished.new(title, result))
105
+ end
106
+
107
+ result
108
+ end
109
+
110
+ def test!(...)
111
+ if test(...) == false
112
+ message = Session.abort_message
113
+ raise Abort, message
114
+ end
115
+ end
116
+
117
+ def test(title=nil, &block)
118
+ if block.nil?
119
+ record_skip
120
+ record_event(Events::TestSkipped.new(title))
121
+ return
122
+ end
123
+
124
+ original_failure_sequence = failure_sequence
125
+ original_assertion_sequence = assertion_sequence
126
+
127
+ record_event(Events::TestStarted.new(title))
128
+
129
+ begin
130
+ block.()
131
+
132
+ result = !failed?(original_failure_sequence)
133
+
134
+ if result
135
+ if not asserted?(original_assertion_sequence)
136
+ failure_message = Session.no_assertion_message
137
+ fail(failure_message)
138
+ end
139
+ end
140
+
141
+ rescue Failure
142
+ result = false
143
+
144
+ ensure
145
+ record_event(Events::TestFinished.new(title, result))
146
+ end
147
+
148
+ result
149
+ end
150
+
151
+ def assert(result)
152
+ failure_message = Session.assertion_failure_message
153
+
154
+ record_assertion
155
+
156
+ if result == false
157
+ fail(failure_message)
158
+ end
159
+ end
160
+
161
+ def fail(message=nil)
162
+ message ||= self.class.default_failure_message
163
+
164
+ record_failure
165
+
166
+ record_event(Events::Failed.new(message))
167
+
168
+ raise Failure, message
169
+ end
170
+
171
+ def asserted?(compare_sequence=nil)
172
+ compare_sequence ||= 0
173
+
174
+ compare_sequence != assertion_sequence
175
+ end
176
+
177
+ def record_assertion
178
+ self.assertion_sequence += 1
179
+ end
180
+
181
+ def failed?(compare_sequence=nil)
182
+ compare_sequence ||= 0
183
+
184
+ compare_sequence != failure_sequence
185
+ end
186
+
187
+ def record_event(event)
188
+ telemetry.record(event)
189
+ end
190
+
191
+ def record_failure
192
+ self.failure_sequence += 1
193
+ end
194
+
195
+ def skipped?
196
+ skip_sequence != 0
197
+ end
198
+
199
+ def record_skip
200
+ self.skip_sequence += 1
201
+ end
202
+
203
+ def self.default_failure_message
204
+ 'Failed'
205
+ end
206
+
207
+ def self.assertion_failure_message
208
+ "Assertion failed"
209
+ end
210
+
211
+ def self.abort_message
212
+ "Abort"
213
+ end
214
+
215
+ def self.no_assertion_message
216
+ "Test didn't perform an assertion"
217
+ end
218
+ end
219
+ end
220
+ end
@@ -0,0 +1,61 @@
1
+ module TestBenchIsolated
2
+ module TestBench
3
+ class Session
4
+ class Store
5
+ PutError = Class.new(RuntimeError)
6
+
7
+ attr_accessor :put_session
8
+
9
+ def self.configure(receiver, attr_name: nil)
10
+ attr_name ||= :session_store
11
+
12
+ receiver.public_send(:"#{attr_name}=", instance)
13
+ end
14
+
15
+ def self.instance
16
+ @instance ||= new
17
+ end
18
+
19
+ def self.put(...) = instance.put(...)
20
+ def self.put?(...) = instance.put?(...)
21
+ def self.reset(...) = instance.reset(...)
22
+ def self.get(...) = instance.get(...)
23
+ def self.fetch(...) = instance.fetch(...)
24
+
25
+ def put(session)
26
+ if not put_session.nil?
27
+ raise PutError, "Already put a session"
28
+ end
29
+
30
+ self.put_session = session
31
+ end
32
+
33
+ def put?(session=nil)
34
+ if not session.nil?
35
+ put_session == session
36
+ else
37
+ !put_session.nil?
38
+ end
39
+ end
40
+
41
+ def reset(session=nil)
42
+ self.put_session = session
43
+ end
44
+
45
+ def get
46
+ put_session
47
+ end
48
+
49
+ def fetch
50
+ self.put_session ||= new_session
51
+ end
52
+
53
+ def new_session
54
+ Session.build do |telemetry|
55
+ Output.register_telemetry(telemetry)
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end