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