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,60 @@
1
+ module TestBenchIsolated
2
+ module TestBench
3
+ module Output
4
+ module Device
5
+ module Substitute
6
+ def self.build
7
+ Device.new
8
+ end
9
+
10
+ class Device
11
+ def written_data
12
+ @written_data ||= String.new
13
+ end
14
+ attr_writer :written_data
15
+
16
+ def flushed_data
17
+ @flushed_data ||= String.new
18
+ end
19
+ attr_writer :flushed_data
20
+
21
+ attr_accessor :tty
22
+ def tty? = !!tty
23
+
24
+ def write(data)
25
+ bytes_written = data.bytesize
26
+
27
+ written_data << data
28
+
29
+ bytes_written
30
+ end
31
+
32
+ def flush
33
+ flushed_data << written_data
34
+ end
35
+
36
+ def written?(data=nil)
37
+ if data.nil?
38
+ !written_data.empty?
39
+ else
40
+ written_data == data
41
+ end
42
+ end
43
+
44
+ def flushed?(data=nil)
45
+ if data.nil?
46
+ !flushed_data.empty?
47
+ else
48
+ flushed_data == data
49
+ end
50
+ end
51
+
52
+ def tty!
53
+ self.tty = true
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,115 @@
1
+ module TestBenchIsolated
2
+ module TestBench
3
+ module Output
4
+ class Digest
5
+ def last_digest
6
+ @last_digest ||= 0
7
+ end
8
+ attr_writer :last_digest
9
+
10
+ def buffer
11
+ @buffer ||= String.new(encoding: 'BINARY', capacity: Defaults.size_bytes * 2)
12
+ end
13
+ attr_writer :buffer
14
+
15
+ def self.digest(data)
16
+ instance = new
17
+ instance.update(data)
18
+ instance.digest
19
+ end
20
+
21
+ def self.configure(receiver, inert: nil, attr_name: nil)
22
+ attr_name ||= :digest
23
+ inert = true if inert.nil?
24
+
25
+ if inert
26
+ instance = Null.new
27
+ else
28
+ instance = self.new
29
+ end
30
+
31
+ receiver.public_send(:"#{attr_name}=", instance)
32
+ end
33
+
34
+ def clone
35
+ cloned_digest = Digest.new
36
+ cloned_digest.last_digest = last_digest
37
+ cloned_digest.buffer << buffer
38
+ cloned_digest
39
+ end
40
+
41
+ def update(data)
42
+ digest_size_bytes = Defaults.size_bytes
43
+
44
+ (0..data.bytesize).step(digest_size_bytes).each do |position|
45
+ next_bytes = data.byteslice(position, digest_size_bytes)
46
+ next_bytes.force_encoding('BINARY')
47
+
48
+ buffer << next_bytes
49
+
50
+ if buffer.length >= digest_size_bytes
51
+ self.last_digest = digest
52
+
53
+ buffer.slice!(0, 8)
54
+ end
55
+ end
56
+
57
+ digest
58
+ end
59
+
60
+ def digest
61
+ buffer_bytes = buffer.unpack('C*')[0...8]
62
+
63
+ buffer_int64 = buffer_bytes.reduce(0) do |int64, byte|
64
+ (int64 << 8) | byte
65
+ end
66
+
67
+ (last_digest + buffer_int64) % (256 ** Defaults.size_bytes - 1)
68
+ end
69
+ alias :value :digest
70
+ alias :to_i :digest
71
+
72
+ def digest?(data)
73
+ other_digest = self.class.digest(data)
74
+
75
+ digest == other_digest
76
+ end
77
+
78
+ def format
79
+ self.class.format(value)
80
+ end
81
+ alias :to_s :format
82
+
83
+ def self.format(digest)
84
+ if digest < 0
85
+ # 0x8000...
86
+ sign_mask = 0x1 << (8 * Defaults.size_bytes - 1)
87
+ # 0x7FFF...
88
+ mask = (256 ** Defaults.size_bytes - 1) ^ sign_mask
89
+
90
+ digest_uint64 = ~digest & mask | sign_mask
91
+ else
92
+ digest_uint64 = digest
93
+ end
94
+
95
+ "0x%016X" % digest_uint64
96
+ end
97
+
98
+ class Null
99
+ def update(_data)
100
+ end
101
+
102
+ def digest?(_data)
103
+ false
104
+ end
105
+ end
106
+
107
+ module Defaults
108
+ def self.size_bytes
109
+ 8
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,68 @@
1
+ module TestBenchIsolated
2
+ module TestBench
3
+ module Output
4
+ def self.included(cls)
5
+ cls.class_exec do
6
+ include Telemetry::Sink::Handler
7
+
8
+ extend Build
9
+ extend RegisterTelemetry
10
+ extend Configure
11
+ end
12
+ end
13
+
14
+ def writer
15
+ @writer ||= Writer::Substitute.build
16
+ end
17
+ attr_writer :writer
18
+
19
+ def configure(writer: nil, device: nil, styling: nil)
20
+ Writer.configure(self, writer:, device:, styling:)
21
+ end
22
+
23
+ module Build
24
+ def build(writer: nil, device: nil, styling: nil, **arguments)
25
+ instance = new
26
+ instance.configure(writer:, device:, styling:, **arguments)
27
+ instance
28
+ end
29
+ end
30
+
31
+ module RegisterTelemetry
32
+ def register_telemetry(telemetry, **arguments)
33
+ instance = build(**arguments)
34
+ telemetry.register(instance)
35
+ instance
36
+ end
37
+ alias :register :register_telemetry
38
+ end
39
+
40
+ module Configure
41
+ def configure(receiver, attr_name: nil, **arguments)
42
+ attr_name ||= :output
43
+
44
+ instance = build(**arguments)
45
+ receiver.public_send(:"#{attr_name}=", instance)
46
+ end
47
+ end
48
+
49
+ module Substitute
50
+ def self.build
51
+ Output.new
52
+ end
53
+
54
+ class Output < Telemetry::Substitute::Sink
55
+ def handle(event_or_event_data)
56
+ if event_or_event_data.is_a?(Telemetry::Event)
57
+ event_data = Telemetry::Event::Export.(event_or_event_data)
58
+ else
59
+ event_data = event_or_event_data
60
+ end
61
+
62
+ receive(event_data)
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,59 @@
1
+ module TestBenchIsolated
2
+ module TestBench
3
+ module Output
4
+ class Writer
5
+ class Buffer
6
+ attr_accessor :limit
7
+
8
+ def contents
9
+ @contents ||= String.new
10
+ end
11
+ attr_writer :contents
12
+
13
+ def self.build
14
+ instance = new
15
+ instance.limit = 0
16
+ instance
17
+ end
18
+
19
+ def self.configure(receiver, attr_name: nil)
20
+ attr_name ||= :buffer
21
+
22
+ instance = build
23
+ receiver.public_send(:"#{attr_name}=", instance)
24
+ end
25
+
26
+ def receive(data)
27
+ bytes = data.bytesize
28
+
29
+ if not limit.nil?
30
+ final_size = contents.bytesize + bytes
31
+
32
+ if final_size > limit
33
+ bytes = limit - contents.bytesize
34
+
35
+ data = data[0...bytes]
36
+ end
37
+ end
38
+
39
+ contents << data
40
+
41
+ bytes
42
+ end
43
+
44
+ def limit?
45
+ !limit.nil?
46
+ end
47
+
48
+ def flush(*devices)
49
+ devices.each do |device|
50
+ device.write(contents)
51
+ end
52
+
53
+ contents.clear
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,13 @@
1
+ module TestBenchIsolated
2
+ module TestBench
3
+ module Output
4
+ class Writer
5
+ module Defaults
6
+ def self.device
7
+ STDOUT
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,52 @@
1
+ module TestBenchIsolated
2
+ module TestBench
3
+ module Output
4
+ class Writer
5
+ module Style
6
+ Error = Class.new(RuntimeError)
7
+
8
+ def self.control_code(style)
9
+ control_codes.fetch(style) do
10
+ raise Error, "Invalid style #{style.inspect}"
11
+ end
12
+ end
13
+
14
+ def self.control_codes
15
+ @sgr_codes ||= {
16
+ :reset => '0',
17
+
18
+ :bold => '1',
19
+ :faint => '2',
20
+ :italic => '3',
21
+ :underline => '4',
22
+
23
+ :reset_intensity => '22',
24
+ :reset_italic => '23',
25
+ :reset_underline => '24',
26
+
27
+ :black => '30',
28
+ :red => '31',
29
+ :green => '32',
30
+ :yellow => '33',
31
+ :blue => '34',
32
+ :magenta => '35',
33
+ :cyan => '36',
34
+ :white => '37',
35
+ :reset_fg => '39',
36
+
37
+ :black_bg => '40',
38
+ :red_bg => '41',
39
+ :green_bg => '42',
40
+ :yellow_bg => '43',
41
+ :blue_bg => '44',
42
+ :magenta_bg => '45',
43
+ :cyan_bg => '46',
44
+ :white_bg => '47',
45
+ :reset_bg => '49'
46
+ }
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,40 @@
1
+ module TestBenchIsolated
2
+ module TestBench
3
+ module Output
4
+ class Writer
5
+ module Substitute
6
+ def self.build
7
+ Writer.build
8
+ end
9
+
10
+ def self.included(cls)
11
+ cls.class_exec do
12
+ extend Build
13
+ end
14
+ end
15
+
16
+ def written_data
17
+ device.written_data
18
+ end
19
+ alias :written_text :written_data
20
+
21
+ def styling!
22
+ self.styling_policy = Styling.on
23
+ end
24
+
25
+ module Build
26
+ def build
27
+ instance = new
28
+ instance.buffer.limit = 0
29
+ instance
30
+ end
31
+ end
32
+
33
+ class Writer < Writer
34
+ include Substitute
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,212 @@
1
+ module TestBenchIsolated
2
+ module TestBench
3
+ module Output
4
+ class Writer
5
+ def device
6
+ @device ||= Device::Substitute.build
7
+ end
8
+ attr_writer :device
9
+
10
+ def styling_policy
11
+ @styling_policy ||= Styling.default
12
+ end
13
+ alias :styling :styling_policy
14
+ attr_writer :styling_policy
15
+
16
+ def digest
17
+ @digest ||= Digest.new
18
+ end
19
+ attr_writer :digest
20
+
21
+ def sequence
22
+ @sequence ||= 0
23
+ end
24
+ attr_writer :sequence
25
+
26
+ def column_sequence
27
+ @column_sequence ||= 0
28
+ end
29
+ attr_writer :column_sequence
30
+
31
+ def buffer
32
+ @buffer ||= Buffer.new
33
+ end
34
+ attr_writer :buffer
35
+
36
+ def configure
37
+ Buffer.configure(self)
38
+ end
39
+
40
+ def self.build(device=nil, styling: nil, inert_digest: nil)
41
+ device ||= Defaults.device
42
+
43
+ instance = new
44
+ instance.device = device
45
+ instance.styling_policy = styling
46
+
47
+ Digest.configure(instance, inert: inert_digest)
48
+
49
+ instance.configure
50
+
51
+ instance
52
+ end
53
+
54
+ def self.configure(receiver, writer: nil, styling: nil, inert_digest: nil, device: nil, attr_name: nil)
55
+ attr_name ||= :writer
56
+
57
+ if not writer.nil?
58
+ instance = writer
59
+ else
60
+ instance = build(device, styling:, inert_digest:)
61
+ end
62
+
63
+ receiver.public_send(:"#{attr_name}=", instance)
64
+ end
65
+
66
+ def sync
67
+ @sync.nil? ? @sync = true : @sync
68
+ end
69
+
70
+ def tty
71
+ @tty.nil? ? @tty = device_tty? : @tty
72
+ end
73
+ attr_writer :tty
74
+ alias :tty? :tty
75
+
76
+ def puts(text=nil)
77
+ if not text.nil?
78
+ text = text.chomp
79
+
80
+ print(text)
81
+ end
82
+
83
+ style(:reset)
84
+
85
+ if tty?
86
+ write("\e[0K")
87
+ end
88
+
89
+ write("\n")
90
+
91
+ self.column_sequence = 0
92
+ end
93
+
94
+ def style(style, *additional_styles)
95
+ control_code = Style.control_code(style)
96
+ control_codes = [control_code]
97
+
98
+ additional_styles.each do |style|
99
+ control_code = Style.control_code(style)
100
+ control_codes << control_code
101
+ end
102
+
103
+ if styling?
104
+ write("\e[#{control_codes.join(';')}m")
105
+ end
106
+
107
+ self
108
+ end
109
+
110
+ def print(text)
111
+ self.column_sequence += text.length
112
+
113
+ write(text)
114
+
115
+ self
116
+ end
117
+
118
+ def write(data)
119
+ if sync
120
+ bytes_written = write!(data)
121
+ else
122
+ bytes_written = buffer.receive(data)
123
+ end
124
+
125
+ self.sequence += bytes_written
126
+
127
+ data = data[0...bytes_written]
128
+ digest.update(data)
129
+
130
+ bytes_written
131
+ end
132
+
133
+ def write!(data)
134
+ device.write(data)
135
+
136
+ data.bytesize
137
+ end
138
+
139
+ def device_tty?
140
+ device.tty?
141
+ end
142
+
143
+ def flush
144
+ buffer.flush(device)
145
+ end
146
+
147
+ def sync=(sync)
148
+ @sync = sync
149
+
150
+ if sync
151
+ flush
152
+ end
153
+ end
154
+
155
+ def written?(data=nil)
156
+ if data.nil?
157
+ sequence > 0
158
+ else
159
+ digest.digest?(data)
160
+ end
161
+ end
162
+
163
+ def current?(sequence)
164
+ sequence >= self.sequence
165
+ end
166
+
167
+ def styling?
168
+ Styling.styling?(styling_policy, tty?)
169
+ end
170
+
171
+ module Styling
172
+ Error = Class.new(RuntimeError)
173
+
174
+ def self.styling?(policy, console)
175
+ assure_styling(policy, console)
176
+ end
177
+
178
+ def self.assure_styling(policy, console=nil)
179
+ console ||= false
180
+
181
+ case policy
182
+ when on
183
+ true
184
+ when off
185
+ false
186
+ when detect
187
+ console ? true : false
188
+ else
189
+ raise Error, "Unknown styling policy #{policy.inspect}"
190
+ end
191
+ end
192
+
193
+ def self.on = :on
194
+ def self.off = :off
195
+ def self.detect = :detect
196
+
197
+ def self.default
198
+ policy = ENV.fetch('TEST_BENCH_OUTPUT_STYLING') do
199
+ return default!
200
+ end
201
+
202
+ policy.to_sym
203
+ end
204
+
205
+ def self.default!
206
+ :detect
207
+ end
208
+ end
209
+ end
210
+ end
211
+ end
212
+ end
@@ -0,0 +1,14 @@
1
+ require 'test_bench_isolated/test_bench/telemetry'
2
+
3
+ require 'test_bench_isolated/test_bench/output/digest'
4
+
5
+ require 'test_bench_isolated/test_bench/output/device/null'
6
+ require 'test_bench_isolated/test_bench/output/device/substitute'
7
+
8
+ require 'test_bench_isolated/test_bench/output/writer/buffer'
9
+ require 'test_bench_isolated/test_bench/output/writer'
10
+ require 'test_bench_isolated/test_bench/output/writer/style'
11
+ require 'test_bench_isolated/test_bench/output/writer/substitute'
12
+ require 'test_bench_isolated/test_bench/output/writer/defaults'
13
+
14
+ require 'test_bench_isolated/test_bench/output/output'
@@ -0,0 +1,27 @@
1
+ module TestBenchIsolated
2
+ module TestBench
3
+ class Random
4
+ module Controls
5
+ module Seed
6
+ def self.example
7
+ 0x1111_1111_1111_1111
8
+ end
9
+
10
+ def self.text
11
+ example.to_s(36)
12
+ end
13
+
14
+ module Namespace
15
+ def self.example
16
+ 'some-seed-namespace'
17
+ end
18
+
19
+ def self.other_example
20
+ 'some-other-seed-namespace'
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1 @@
1
+ require 'test_bench_isolated/test_bench/random/controls/seed'