Class: TestBench::Session

Inherits:
Object
  • Object
show all
Defined in:
lib/test_bench/session/store.rb,
lib/test_bench/session/events.rb,
lib/test_bench/session/output.rb,
lib/test_bench/session/session.rb,
lib/test_bench/session/output/get.rb,
lib/test_bench/session/projection.rb,
lib/test_bench/session/substitute.rb,
lib/test_bench/session/controls/time.rb,
lib/test_bench/session/output/writer.rb,
lib/test_bench/session/controls/event.rb,
lib/test_bench/session/controls/title.rb,
lib/test_bench/session/controls/detail.rb,
lib/test_bench/session/controls/events.rb,
lib/test_bench/session/controls/output.rb,
lib/test_bench/session/controls/random.rb,
lib/test_bench/session/controls/result.rb,
lib/test_bench/session/substitute/path.rb,
lib/test_bench/session/substitute/sink.rb,
lib/test_bench/session/controls/comment.rb,
lib/test_bench/session/controls/failure.rb,
lib/test_bench/session/controls/fixture.rb,
lib/test_bench/session/controls/exception.rb,
lib/test_bench/session/controls/process_id.rb,
lib/test_bench/session/output/writer/buffer.rb,
lib/test_bench/session/controls/events/failed.rb,
lib/test_bench/session/controls/output/detail.rb,
lib/test_bench/session/output/writer/defaults.rb,
lib/test_bench/session/controls/telemetry_sink.rb,
lib/test_bench/session/controls/events/detailed.rb,
lib/test_bench/session/controls/substitute/path.rb,
lib/test_bench/session/output/writer/substitute.rb,
lib/test_bench/session/controls/events/commented.rb,
lib/test_bench/session/controls/events/event_data.rb,
lib/test_bench/session/controls/events/test_skipped.rb,
lib/test_bench/session/controls/events/test_started.rb,
lib/test_bench/session/controls/events/test_finished.rb,
lib/test_bench/session/controls/events/context_skipped.rb,
lib/test_bench/session/controls/events/context_started.rb,
lib/test_bench/session/controls/events/fixture_started.rb,
lib/test_bench/session/controls/events/context_finished.rb,
lib/test_bench/session/controls/events/fixture_finished.rb,
lib/test_bench/session/output/writer/buffer/interactive.rb,
lib/test_bench/session/output/writer/buffer/interactive/viewport.rb

Direct Known Subclasses

Substitute::Session

Defined Under Namespace

Modules: Controls, Defaults, Events, Substitute Classes: Output, Projection, Store

Constant Summary collapse

Failure =
Class.new(RuntimeError)
Abort =
Class.new(Failure)

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#assertion_sequenceObject



16
17
18
# File 'lib/test_bench/session/session.rb', line 16

def assertion_sequence
  @assertion_sequence ||= 0
end

#failure_sequenceObject



11
12
13
# File 'lib/test_bench/session/session.rb', line 11

def failure_sequence
  @failure_sequence ||= 0
end

#skip_sequenceObject



21
22
23
# File 'lib/test_bench/session/session.rb', line 21

def skip_sequence
  @skip_sequence ||= 0
end

#telemetryObject



6
7
8
# File 'lib/test_bench/session/session.rb', line 6

def telemetry
  @telemetry ||= TestBench::Telemetry::Substitute.build
end

Class Method Details

.abort_messageObject



247
248
249
# File 'lib/test_bench/session/session.rb', line 247

def self.abort_message
  "Abort"
end

.assertion_failure_messageObject



243
244
245
# File 'lib/test_bench/session/session.rb', line 243

def self.assertion_failure_message
  "Assertion failed"
end

.build(&block) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
# File 'lib/test_bench/session/session.rb', line 26

def self.build(&block)
  instance = new

  Telemetry.configure(instance)

  if not block.nil?
    block.(instance.telemetry)
  end

  instance
end

.configure(receiver, session: nil, attr_name: nil, &block) ⇒ Object



38
39
40
41
42
43
44
# File 'lib/test_bench/session/session.rb', line 38

def self.configure(receiver, session: nil, attr_name: nil, &block)
  session ||= Store.fetch
  attr_name ||= :session

  instance = session
  receiver.public_send(:"#{attr_name}=", instance)
end

.default_failure_messageObject



239
240
241
# File 'lib/test_bench/session/session.rb', line 239

def self.default_failure_message
  'Failed'
end

.no_assertion_messageObject



251
252
253
# File 'lib/test_bench/session/session.rb', line 251

def self.no_assertion_message
  "Test didn't perform an assertion"
end

Instance Method Details

#assert(result) ⇒ Object



183
184
185
186
187
188
189
190
191
# File 'lib/test_bench/session/session.rb', line 183

def assert(result)
  failure_message = Session.assertion_failure_message

  record_assertion

  if result == false
    fail(failure_message)
  end
end

#asserted?(compare_sequence = nil) ⇒ Boolean

Returns:

  • (Boolean)


203
204
205
206
207
# File 'lib/test_bench/session/session.rb', line 203

def asserted?(compare_sequence=nil)
  compare_sequence ||= 0

  compare_sequence != assertion_sequence
end

#comment(text, quote, heading = nil) ⇒ Object



106
107
108
# File 'lib/test_bench/session/session.rb', line 106

def comment(text, quote, heading=nil)
  record_event(Events::Commented.new(text, quote, heading))
end

#context(title = nil, &block) ⇒ Object



117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/test_bench/session/session.rb', line 117

def context(title=nil, &block)
  if block.nil?
    record_skip
    record_event(Events::ContextSkipped.new(title))
    return
  end

  original_failure_sequence = failure_sequence

  record_event(Events::ContextStarted.new(title))

  begin
    block.()

  rescue Failure

  ensure
    result = !failed?(original_failure_sequence)

    record_event(Events::ContextFinished.new(title, result))
  end

  result
end

#context!Object



110
111
112
113
114
115
# File 'lib/test_bench/session/session.rb', line 110

def context!(...)
  if context(...) == false
    message = Session.abort_message
    raise Abort, message
  end
end

#detail(text, quote, heading = nil) ⇒ Object



102
103
104
# File 'lib/test_bench/session/session.rb', line 102

def detail(text, quote, heading=nil)
  record_event(Events::Detailed.new(text, quote, heading))
end

#fail(message = nil) ⇒ Object

Raises:



193
194
195
196
197
198
199
200
201
# File 'lib/test_bench/session/session.rb', line 193

def fail(message=nil)
  message ||= self.class.default_failure_message

  record_failure

  record_event(Events::Failed.new(message))

  raise Failure, message
end

#failed?(compare_sequence = nil) ⇒ Boolean

Returns:

  • (Boolean)


217
218
219
220
221
# File 'lib/test_bench/session/session.rb', line 217

def failed?(compare_sequence=nil)
  compare_sequence ||= 0

  compare_sequence != failure_sequence
end

#fixture(name, &block) ⇒ Object



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/test_bench/session/session.rb', line 83

def fixture(name, &block)
  original_failure_sequence = failure_sequence

  record_event(Events::FixtureStarted.new(name))

  begin
    block.()

  rescue Failure

  ensure
    result = !failed?(original_failure_sequence)

    record_event(Events::FixtureFinished.new(name, result))
  end

  result
end

#inspectObject



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/test_bench/session/session.rb', line 46

def inspect
  text = self.to_s

  instance_variables = self.instance_variables - [:@telemetry]

  instance_variables.each_with_index do |name, index|
    ivar_text = String.new

    if index > 0
      ivar_text << ','
    end

    value = instance_variable_get(name)
    value = value.inspect

    ivar_text << " #{name}=#{value}"

    text.insert(-2, ivar_text)
  end

  text
end

#passed?Boolean

Returns:

  • (Boolean)


69
70
71
72
73
74
75
76
77
# File 'lib/test_bench/session/session.rb', line 69

def passed?
  if failed?
    false
  elsif require_passing_test?
    asserted? && !skipped?
  else
    true
  end
end

#record_assertionObject



213
214
215
# File 'lib/test_bench/session/session.rb', line 213

def record_assertion
  self.assertion_sequence += 1
end

#record_event(event) ⇒ Object



223
224
225
# File 'lib/test_bench/session/session.rb', line 223

def record_event(event)
  telemetry.record(event)
end

#record_failureObject



227
228
229
# File 'lib/test_bench/session/session.rb', line 227

def record_failure
  self.failure_sequence += 1
end

#record_skipObject



235
236
237
# File 'lib/test_bench/session/session.rb', line 235

def record_skip
  self.skip_sequence += 1
end

#register_telemetry_sink(telemetry_sink) ⇒ Object



209
210
211
# File 'lib/test_bench/session/session.rb', line 209

def register_telemetry_sink(telemetry_sink)
  telemetry.register(telemetry_sink)
end

#require_passing_test?Boolean

Returns:

  • (Boolean)


79
80
81
# File 'lib/test_bench/session/session.rb', line 79

def require_passing_test?
  Defaults.require_passing_tests
end

#skipped?Boolean

Returns:

  • (Boolean)


231
232
233
# File 'lib/test_bench/session/session.rb', line 231

def skipped?
  skip_sequence != 0
end

#test(title = nil, &block) ⇒ Object



149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
# File 'lib/test_bench/session/session.rb', line 149

def test(title=nil, &block)
  if block.nil?
    record_skip
    record_event(Events::TestSkipped.new(title))
    return
  end

  original_failure_sequence = failure_sequence
  original_assertion_sequence = assertion_sequence

  record_event(Events::TestStarted.new(title))

  begin
    block.()

    result = !failed?(original_failure_sequence)

    if result
      if not asserted?(original_assertion_sequence)
        failure_message = Session.no_assertion_message
        fail(failure_message)
      end
    end

  rescue Failure
    result = false

  ensure
    record_event(Events::TestFinished.new(title, result))
  end

  result
end

#test!Object



142
143
144
145
146
147
# File 'lib/test_bench/session/session.rb', line 142

def test!(...)
  if test(...) == false
    message = Session.abort_message
    raise Abort, message
  end
end