test_bench-isolated 0 → 2.0.0.0

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 (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,172 @@
1
+ module TestBenchIsolated
2
+ module TestBench
3
+ class Telemetry
4
+ class EventData
5
+ module Serialization
6
+ Error = Class.new(RuntimeError)
7
+
8
+ def self.dump(event_data)
9
+ type = event_data.type.to_s
10
+ process_id = dump_value(event_data.process_id)
11
+ time = dump_value(event_data.time)
12
+ data = event_data.data
13
+
14
+ text = String.new(encoding: 'BINARY')
15
+
16
+ text << type
17
+
18
+ text << "\t"
19
+ text << process_id
20
+
21
+ text << "\t"
22
+ text << time
23
+
24
+ data.each do |value|
25
+ text << "\t"
26
+ text << dump_value(value)
27
+ end
28
+
29
+ text << "\r\n"
30
+ text
31
+ end
32
+
33
+ def self.dump_value(value)
34
+ case value
35
+ when Integer
36
+ value.to_s
37
+ when Time
38
+ value.strftime('%Y-%m-%dT%H:%M:%S.%NZ')
39
+ when NilClass
40
+ ''
41
+ when TrueClass, FalseClass
42
+ value.to_s
43
+ when String
44
+ value.dump
45
+ end
46
+ end
47
+
48
+ def self.load(text)
49
+ match_data = Pattern.match(text)
50
+ if match_data.nil?
51
+ raise Error, "Cannot deserialize #{text.inspect}"
52
+ end
53
+
54
+ type = match_data['type'].to_sym
55
+ process_id = load_value(match_data['process_id'])
56
+ time = load_value(match_data['time_attribute'])
57
+
58
+ event_data = EventData.new
59
+ event_data.type = type
60
+ event_data.process_id = process_id
61
+ event_data.time = time
62
+ event_data.data = []
63
+
64
+ data_text = match_data['data']
65
+
66
+ data_text.insert(0, "\t")
67
+ data_text.scan(/\t([^\t]*)/) do |(value_text)|
68
+ value = load_value(value_text)
69
+ event_data.data << value
70
+ end
71
+
72
+ event_data
73
+ end
74
+
75
+ def self.load_value(value_text)
76
+ match_data = Pattern.match_value(value_text)
77
+
78
+ if match_data['integer']
79
+ Integer(value_text)
80
+ elsif match_data['time']
81
+ year = match_data['year'].to_i
82
+ month = match_data['month'].to_i
83
+ day = match_data['day'].to_i
84
+ hour = match_data['hour'].to_i
85
+ minute = match_data['minute'].to_i
86
+ second = match_data['second'].to_i
87
+
88
+ nanosecond = match_data['nanosecond'].to_i
89
+ usec = Rational(nanosecond, 1_000)
90
+
91
+ Time.utc(year, month, day, hour, minute, second, usec)
92
+ elsif match_data['nil']
93
+ nil
94
+ elsif match_data['true']
95
+ true
96
+ elsif match_data['false']
97
+ false
98
+ elsif match_data['string']
99
+ value_text.undump
100
+ end
101
+ end
102
+
103
+ module Pattern
104
+ def self.match(data)
105
+ event_data.match(data)
106
+ end
107
+
108
+ def self.match_value(value_text)
109
+ value_pattern.match(value_text)
110
+ end
111
+
112
+ def self.event_data
113
+ @event_data ||= %r{\A#{type}\t#{process_id}\t#{time_attribute}\t#{data}\r\n\z}
114
+ end
115
+
116
+ def self.type
117
+ %r{(?<type>[A-Z][[:alnum:]]+)}
118
+ end
119
+
120
+ def self.process_id
121
+ %r{(?<process_id>#{integer})}
122
+ end
123
+
124
+ def self.value_pattern
125
+ @value_pattern ||= %r{\A#{value}\z}
126
+ end
127
+
128
+ def self.time_attribute
129
+ %r{(?<time_attribute>#{time})}
130
+ end
131
+
132
+ def self.data
133
+ %r{(?<data>#{value}(?:\t#{value})*)}
134
+ end
135
+
136
+ def self.value
137
+ %r{#{integer}|#{time}|#{self.nil}|#{boolean}|#{string}}
138
+ end
139
+
140
+ def self.integer
141
+ %r{(?<integer>[[:digit:]]+)}
142
+ end
143
+
144
+ def self.time
145
+ year = %r{(?<year>[[:digit:]]{4})}
146
+ month = %r{(?<month>[[:digit:]]{2})}
147
+ day = %r{(?<day>[[:digit:]]{2})}
148
+ hour = %r{(?<hour>[[:digit:]]{2})}
149
+ minute = %r{(?<minute>[[:digit:]]{2})}
150
+ second = %r{(?<second>[[:digit:]]{2})}
151
+ nanosecond = %r{(?<nanosecond>[[:digit:]]{9})}
152
+
153
+ %r{(?<time>#{year}-#{month}-#{day}T#{hour}:#{minute}:#{second}\.#{nanosecond}Z)}
154
+ end
155
+
156
+ def self.nil
157
+ %r{(?<nil>(?=[\t\r\z])?)}
158
+ end
159
+
160
+ def self.boolean
161
+ %r{(?<true>true)|(?<false>false)}
162
+ end
163
+
164
+ def self.string
165
+ %r{(?<string>".*")}
166
+ end
167
+ end
168
+ end
169
+ end
170
+ end
171
+ end
172
+ end
@@ -0,0 +1,15 @@
1
+ module TestBenchIsolated
2
+ module TestBench
3
+ class Telemetry
4
+ EventData = Struct.new(:type, :process_id, :time, :data) do
5
+ def self.load(text)
6
+ EventData::Serialization.load(text)
7
+ end
8
+
9
+ def dump
10
+ EventData::Serialization.dump(self)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,33 @@
1
+ module TestBenchIsolated
2
+ module TestBench
3
+ class Telemetry
4
+ module Sink
5
+ class File
6
+ include Sink
7
+
8
+ attr_reader :io
9
+
10
+ def initialize(io)
11
+ @io = io
12
+ end
13
+
14
+ def self.open(path, &block)
15
+ ::File.open(path, 'w') do |io|
16
+ instance = new(io)
17
+
18
+ block.(instance, io)
19
+
20
+ return instance
21
+ end
22
+ end
23
+
24
+ def receive(event_data)
25
+ text = event_data.dump
26
+
27
+ io.write(text)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,44 @@
1
+ module TestBenchIsolated
2
+ module TestBench
3
+ class Telemetry
4
+ module Sink
5
+ module Handler
6
+ class EventRegistry
7
+ Error = Class.new(RuntimeError)
8
+
9
+ def event_classes
10
+ @event_classes ||= {}
11
+ end
12
+ attr_writer :event_classes
13
+
14
+ def event_types
15
+ event_classes.keys
16
+ end
17
+
18
+ def get(event_type)
19
+ event_classes.fetch(event_type) do
20
+ raise Error, "#{event_type} isn't registered"
21
+ end
22
+ end
23
+
24
+ def register(event_class)
25
+ if registered?(event_class)
26
+ raise Error, "#{event_class} is already registered"
27
+ end
28
+
29
+ event_type = event_class.event_type
30
+
31
+ event_classes[event_type] = event_class
32
+ end
33
+
34
+ def registered?(event_class)
35
+ event_type = event_class.event_type
36
+
37
+ event_classes.key?(event_type)
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,128 @@
1
+ module TestBenchIsolated
2
+ module TestBench
3
+ class Telemetry
4
+ module Sink
5
+ module Handler
6
+ def self.included(cls)
7
+ cls.class_exec do
8
+ include Sink
9
+ include Receive
10
+
11
+ extend HandlerMethod
12
+ extend HandleMacro
13
+ end
14
+ end
15
+
16
+ module Receive
17
+ def receive(event_data)
18
+ handle(event_data)
19
+ end
20
+ end
21
+
22
+ def handle(event_or_event_data)
23
+ handles = handle?(event_or_event_data)
24
+
25
+ if handles
26
+ if event_or_event_data.is_a?(Event)
27
+ event = event_or_event_data
28
+ else
29
+ event_data = event_or_event_data
30
+ event_type = event_data.type
31
+ event_class = self.class.event_registry.get(event_type)
32
+
33
+ event = Event::Import.(event_data, event_class)
34
+ end
35
+
36
+ handler_method = handler_method(event)
37
+
38
+ if method(handler_method).parameters.any?
39
+ __send__(handler_method, event)
40
+ else
41
+ __send__(handler_method)
42
+ end
43
+
44
+ event
45
+ elsif respond_to?(:handle_event_data)
46
+ if event_or_event_data.is_a?(Event)
47
+ event_data = Event::Export.(event_or_event_data)
48
+ else
49
+ event_data = event_or_event_data
50
+ end
51
+
52
+ handle_event_data(event_data)
53
+
54
+ event_data
55
+ else
56
+ nil
57
+ end
58
+ end
59
+
60
+ def handle?(...)
61
+ handler_method = handler_method(...)
62
+
63
+ not handler_method.nil?
64
+ end
65
+
66
+ def handler_method(event_or_event_data)
67
+ handler_method = self.class.handler_method(event_or_event_data)
68
+
69
+ if respond_to?(handler_method)
70
+ handler_method
71
+ else
72
+ nil
73
+ end
74
+ end
75
+
76
+ module HandleMacro
77
+ def handle_macro(event_class, &block)
78
+ event_registry.register(event_class)
79
+
80
+ event_type = event_class.event_type
81
+
82
+ handler_method = HandlerMethod.get(event_type)
83
+
84
+ define_method(handler_method, &block)
85
+ end
86
+ alias :handle :handle_macro
87
+
88
+ def event_registry
89
+ @event_registry ||= EventRegistry.new
90
+ end
91
+ end
92
+
93
+ module HandlerMethod
94
+ def handler_method(event_or_event_data)
95
+ if event_or_event_data.is_a?(Event)
96
+ event = event_or_event_data
97
+ event_type = event.event_type
98
+ else
99
+ event_data = event_or_event_data
100
+ event_type = event_data.type
101
+ end
102
+
103
+ HandlerMethod.get(event_type)
104
+ end
105
+
106
+ def self.get(event_type)
107
+ handler_methods[event_type]
108
+ end
109
+
110
+ def self.handler_methods
111
+ @handler_methods ||= Hash.new do |handler_methods, event_type|
112
+ handler_method = get!(event_type)
113
+
114
+ handler_methods[event_type] = handler_method
115
+ end
116
+ end
117
+
118
+ def self.get!(event_type)
119
+ event_name = Event::EventName.get(event_type)
120
+
121
+ :"handle_#{event_name}"
122
+ end
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,134 @@
1
+ module TestBenchIsolated
2
+ module TestBench
3
+ class Telemetry
4
+ module Sink
5
+ module Projection
6
+ def self.included(cls)
7
+ cls.class_exec do
8
+ include Sink
9
+ include Receive
10
+
11
+ extend ReceiverNameMacro
12
+
13
+ extend ApplyMethod
14
+ extend ApplyMacro
15
+ end
16
+ end
17
+
18
+ attr_accessor :receiver
19
+
20
+ def initialize(receiver)
21
+ @receiver = receiver
22
+ end
23
+
24
+ module Receive
25
+ def receive(event_data)
26
+ apply(event_data)
27
+ end
28
+ end
29
+
30
+ def apply(event_or_event_data)
31
+ applies = apply?(event_or_event_data)
32
+
33
+ if applies
34
+ if event_or_event_data.is_a?(Event)
35
+ event = event_or_event_data
36
+ else
37
+ event_data = event_or_event_data
38
+ event_type = event_data.type
39
+ event_class = self.class.event_registry.get(event_type)
40
+
41
+ event = Event::Import.(event_data, event_class)
42
+ end
43
+
44
+ apply_method = apply_method(event)
45
+
46
+ if method(apply_method).parameters.any?
47
+ __send__(apply_method, event)
48
+ else
49
+ __send__(apply_method)
50
+ end
51
+
52
+ event
53
+ elsif respond_to?(:apply_event_data)
54
+ if event_or_event_data.is_a?(Event)
55
+ event_data = Event::Export.(event_or_event_data)
56
+ else
57
+ event_data = event_or_event_data
58
+ end
59
+
60
+ apply_event_data(event_data)
61
+
62
+ event_data
63
+ else
64
+ nil
65
+ end
66
+ end
67
+ alias :call :apply
68
+
69
+ def apply?(...)
70
+ apply_method = apply_method(...)
71
+
72
+ not apply_method.nil?
73
+ end
74
+
75
+ def apply_method(event_or_event_data)
76
+ apply_method = self.class.apply_method(event_or_event_data)
77
+
78
+ if respond_to?(apply_method)
79
+ apply_method
80
+ else
81
+ nil
82
+ end
83
+ end
84
+
85
+ module ReceiverNameMacro
86
+ def receiver_name_macro(receiver_name)
87
+ define_method(receiver_name) do
88
+ receiver
89
+ end
90
+ end
91
+ alias :receiver_name :receiver_name_macro
92
+ end
93
+
94
+ module ApplyMacro
95
+ def apply_macro(event_class, &block)
96
+ event_registry.register(event_class)
97
+
98
+ event_type = event_class.event_type
99
+
100
+ apply_method = ApplyMethod.get(event_type)
101
+
102
+ define_method(apply_method, &block)
103
+ end
104
+ alias :apply :apply_macro
105
+
106
+ def event_registry
107
+ @event_registry ||= Handler::EventRegistry.new
108
+ end
109
+ end
110
+
111
+ module ApplyMethod
112
+ def apply_method(event_or_event_data)
113
+ if event_or_event_data.is_a?(Event)
114
+ event = event_or_event_data
115
+ event_type = event.event_type
116
+ else
117
+ event_data = event_or_event_data
118
+ event_type = event_data.type
119
+ end
120
+
121
+ ApplyMethod.get(event_type)
122
+ end
123
+
124
+ def self.get(event_type)
125
+ event_name = Event::EventName.get(event_type)
126
+
127
+ :"apply_#{event_name}"
128
+ end
129
+ end
130
+ end
131
+ end
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,13 @@
1
+ module TestBenchIsolated
2
+ module TestBench
3
+ class Telemetry
4
+ module Sink
5
+ ReceiveError = Class.new(RuntimeError)
6
+
7
+ def receive(event_data)
8
+ raise ReceiveError, "Sink #{self.class} doesn't implement receive"
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,85 @@
1
+ module TestBenchIsolated
2
+ module TestBench
3
+ class Telemetry
4
+ module Substitute
5
+ class Sink
6
+ MatchError = Class.new(RuntimeError)
7
+
8
+ include Telemetry::Sink
9
+
10
+ def self.read(path)
11
+ file_text = ::File.read(path)
12
+
13
+ instance = new
14
+
15
+ file_text.each_line do |event_data_text|
16
+ event_data = Telemetry::EventData.load(event_data_text)
17
+
18
+ instance.receive(event_data)
19
+ end
20
+
21
+ instance
22
+ end
23
+
24
+ def received_events
25
+ @received_events ||= []
26
+ end
27
+
28
+ def receive(event_data)
29
+ received_events << event_data
30
+ end
31
+
32
+ def received?(event_data)
33
+ received_events.include?(event_data)
34
+ end
35
+
36
+ def one_event?(...)
37
+ !one_event(...).nil?
38
+ end
39
+
40
+ def one_event(...)
41
+ events = events(...)
42
+
43
+ if events.count > 1
44
+ event_type = events.first.event_type
45
+ raise MatchError, "More than one event matches (Type: #{event_type.inspect}, Matching Events: #{events.count})"
46
+ end
47
+
48
+ events.first
49
+ end
50
+
51
+ def any_event?(...)
52
+ events(...).any?
53
+ end
54
+ alias :event? :any_event?
55
+
56
+ def events(event_class, **attributes)
57
+ event_type = event_class.event_type
58
+
59
+ events = []
60
+
61
+ received_events.each do |event_data|
62
+ event_types_correspond = event_data.type == event_type
63
+
64
+ if event_types_correspond
65
+ event = Event::Import.(event_data, event_class)
66
+
67
+ attributes_correspond = attributes.all? do |attribute, compare_value|
68
+ value = event.public_send(attribute)
69
+
70
+ value == compare_value
71
+ end
72
+
73
+ if attributes_correspond
74
+ events << event
75
+ end
76
+ end
77
+ end
78
+
79
+ events
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,34 @@
1
+ module TestBenchIsolated
2
+ module TestBench
3
+ class Telemetry
4
+ module Substitute
5
+ def self.build
6
+ Telemetry.build
7
+ end
8
+
9
+ class Telemetry < Telemetry
10
+ attr_accessor :process_id
11
+ attr_accessor :current_time
12
+
13
+ def sink
14
+ @sink ||= Substitute::Sink.new
15
+ end
16
+ attr_writer :sink
17
+
18
+ def self.build
19
+ instance = new
20
+ instance.register(instance.sink)
21
+ instance
22
+ end
23
+
24
+ def one_event?(...) = sink.one_event?(...)
25
+ def one_event(...) = sink.one_event(...)
26
+ def any_event?(...) = sink.any_event?(...)
27
+ alias :event? :any_event?
28
+ def events(...) = sink.events(...)
29
+ def recorded?(...) = sink.received?(...)
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end