class TestBench::Fixture::Session

Constants

Abort
Error

Attributes

assertion_counter[W]
error_policy[W]
failure_counter[W]
finished[W]
output[W]
skip_counter[W]
started[W]

Public Class Methods

build(output: nil, error_policy: nil) click to toggle source
# File lib/test_bench/fixture/session.rb, line 48
def self.build(output: nil, error_policy: nil)
  instance = new

  if output.nil?
    Output::Log.configure(instance)
  else
    instance.output = output
  end

  ErrorPolicy.configure(instance, policy: error_policy)

  instance
end
configure(receiver, session: nil, output: nil, error_policy: nil, attr_name: nil) click to toggle source
# File lib/test_bench/fixture/session.rb, line 62
def self.configure(receiver, session: nil, output: nil, error_policy: nil, attr_name: nil)
  attr_name ||= :session

  if session.nil?
    instance = build(output: output, error_policy: error_policy)
  else
    instance = session
  end

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

  instance
end

Public Instance Methods

assert(value, caller_location: nil) click to toggle source
# File lib/test_bench/fixture/session.rb, line 108
def assert(value, caller_location: nil)
  caller_location ||= caller[0]

  result = value ? true : false

  self.assertion_counter += 1

  output.assert(result, caller_location)

  unless result
    assertion_failure = AssertionFailure.build(caller_location)
    raise assertion_failure
  end

  result
end
assertion_counter() click to toggle source
# File lib/test_bench/fixture/session.rb, line 7
def assertion_counter
  @assertion_counter ||= 0
end
comment(text) click to toggle source
# File lib/test_bench/fixture/session.rb, line 100
def comment(text)
  output.comment(text)
end
context(title=nil, &block) click to toggle source
# File lib/test_bench/fixture/session.rb, line 166
def context(title=nil, &block)
  if block.nil?
    record_skip
    output.skip_context(title)
    return
  end

  output.enter_context(title)

  evaluate(block) do |result|
    output.exit_context(title, result)
  end
end
detail(text) click to toggle source
# File lib/test_bench/fixture/session.rb, line 104
def detail(text)
  output.detail(text)
end
error_policy() click to toggle source
# File lib/test_bench/fixture/session.rb, line 38
def error_policy
  @error_policy ||= ErrorPolicy::RescueAssert.new
end
evaluate(action, &block) click to toggle source
# File lib/test_bench/fixture/session.rb, line 206
def evaluate(action, &block)
  previous_failure_counter = self.failure_counter

  begin
    action.()

  rescue Abort

  rescue => error
    record_failure

    output.error(error)

    error_policy.(error)
    error = nil

  ensure
    result = failure_counter == previous_failure_counter

    block.(result, error) unless block.nil?
  end

  result
end
fail!()
Alias for: record_failure
failed?() click to toggle source
# File lib/test_bench/fixture/session.rb, line 236
def failed?
  failure_counter.nonzero? ? true : false
end
failure_counter() click to toggle source
# File lib/test_bench/fixture/session.rb, line 12
def failure_counter
  @failure_counter ||= 0
end
finish() click to toggle source
# File lib/test_bench/fixture/session.rb, line 86
def finish
  if finished
    raise Error, "Session has already finished"
  end

  self.finished = true

  result = !failed?

  output.finish(result)

  result
end
finished() click to toggle source
# File lib/test_bench/fixture/session.rb, line 30
def finished
  instance_variable_defined?(:@finished) ?
    @finished :
    @finished = false
end
Also aliased as: finished?
finished?()
Alias for: finished
fixture(fixture, &block) click to toggle source
# File lib/test_bench/fixture/session.rb, line 180
def fixture(fixture, &block)
  if block.nil? && !fixture.respond_to?(:call)
    raise Error, "Block must be given when a fixture does not respond to #call"
  end

  actions = []

  if fixture.respond_to?(:call)
    actions << fixture
  end

  unless block.nil?
    actions << proc { block.(fixture) }
  end

  output.start_fixture(fixture)

  action = proc { actions.each(&:call) }

  result = evaluate(action) do |result|
    output.finish_fixture(fixture, result)
  end

  result
end
load(path) click to toggle source
# File lib/test_bench/fixture/session.rb, line 125
def load(path)
  output.enter_file(path)

  result = false

  Kernel.load(path)

  result = true

ensure

  output.exit_file(path, result)
end
output() click to toggle source
# File lib/test_bench/fixture/session.rb, line 43
def output
  @output ||= Output::Substitute.build
end
record_failure() click to toggle source
# File lib/test_bench/fixture/session.rb, line 231
def record_failure
  self.failure_counter += 1
end
Also aliased as: fail!
record_skip() click to toggle source
# File lib/test_bench/fixture/session.rb, line 240
def record_skip
  self.skip_counter += 1
end
skip_counter() click to toggle source
# File lib/test_bench/fixture/session.rb, line 17
def skip_counter
  @skip_counter ||= 0
end
skipped?() click to toggle source
# File lib/test_bench/fixture/session.rb, line 244
def skipped?
  skip_counter.nonzero? ? true : false
end
start() click to toggle source
# File lib/test_bench/fixture/session.rb, line 76
def start
  if started
    raise Error, "Session has already been started"
  end

  self.started = true

  output.start
end
started() click to toggle source
# File lib/test_bench/fixture/session.rb, line 22
def started
  instance_variable_defined?(:@started) ?
    @started :
    @started = false
end
Also aliased as: started?
started?()
Alias for: started
test(title=nil, &block) click to toggle source
# File lib/test_bench/fixture/session.rb, line 139
def test(title=nil, &block)
  if block.nil?
    record_skip
    output.skip_test(title)
    return
  end

  output.start_test(title)

  previous_failure_counter = self.failure_counter
  previous_assertion_counter = self.assertion_counter

  action = ->{
    block.()

    if failure_counter == previous_failure_counter
      if assertion_counter == previous_assertion_counter
        raise Error, "Test did not perform an assertion"
      end
    end
  }

  evaluate(action) do |result|
    output.finish_test(title, result)
  end
end