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,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