mirror of
https://gitea.invidious.io/iv-org/shard-spectator.git
synced 2024-08-15 00:53:35 +00:00
Implement TAP formatter
This commit is contained in:
parent
40e189a1d1
commit
7215e28d75
2 changed files with 99 additions and 0 deletions
32
src/spectator/formatting/components/tap_profile.cr
Normal file
32
src/spectator/formatting/components/tap_profile.cr
Normal file
|
@ -0,0 +1,32 @@
|
|||
require "../../profile"
|
||||
require "./runtime"
|
||||
|
||||
module Spectator::Formatting::Components
|
||||
struct TAPProfile
|
||||
def initialize(@profile : Spectator::Profile)
|
||||
end
|
||||
|
||||
def to_s(io)
|
||||
io << "# Top "
|
||||
io << @profile.size
|
||||
io << " slowest examples ("
|
||||
io << Runtime.new(@profile.time)
|
||||
io << ", "
|
||||
io << @profile.percentage.round(2)
|
||||
io.puts "% of total time):"
|
||||
|
||||
@profile.each do |example|
|
||||
example_profile(io, example)
|
||||
end
|
||||
end
|
||||
|
||||
private def example_profile(io, example)
|
||||
io << "# "
|
||||
io.puts example
|
||||
io << "# "
|
||||
io << Runtime.new(example.result.elapsed)
|
||||
io << ' '
|
||||
io.puts example.location
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1,6 +1,73 @@
|
|||
require "./formatter"
|
||||
|
||||
module Spectator::Formatting
|
||||
# Produces TAP output from test results.
|
||||
# See: https://testanything.org/
|
||||
# Version 12 of the specification is used.
|
||||
class TAPFormatter < Formatter
|
||||
@counter = 0
|
||||
|
||||
# Creates the formatter.
|
||||
def initialize(@io : IO = STDOUT)
|
||||
end
|
||||
|
||||
# Invoked when the test suite begins.
|
||||
def start(notification)
|
||||
@io << "1.."
|
||||
@io.puts notification.example_count
|
||||
end
|
||||
|
||||
# Invoked just after an example completes.
|
||||
def example_finished(_notification)
|
||||
@counter += 1
|
||||
end
|
||||
|
||||
# Invoked after an example completes successfully.
|
||||
def example_passed(notification)
|
||||
@io << "ok "
|
||||
@io << @counter
|
||||
@io << " - "
|
||||
@io.puts notification.example
|
||||
end
|
||||
|
||||
# Invoked after an example is skipped or marked as pending.
|
||||
def example_pending(notification)
|
||||
@io << "not ok " # TODO: Skipped tests should report ok.
|
||||
@io << @counter
|
||||
@io << " - "
|
||||
@io << notification.example
|
||||
@io << " # TODO "
|
||||
@io.puts "No reason given" # TODO: Get reason from result.
|
||||
end
|
||||
|
||||
# Invoked after an example fails.
|
||||
def example_failed(notification)
|
||||
@io << "not ok "
|
||||
@io << @counter
|
||||
@io << " - "
|
||||
@io.puts notification.example
|
||||
end
|
||||
|
||||
# Invoked after an example fails from an unexpected error.
|
||||
def example_error(notification)
|
||||
example_failed(notification)
|
||||
end
|
||||
|
||||
# Called whenever the example or framework produces a message.
|
||||
# This is typically used for logging.
|
||||
def message(notification)
|
||||
@io << "# "
|
||||
@io.puts notification.message
|
||||
end
|
||||
|
||||
# Invoked after testing completes with profiling information.
|
||||
def dump_profile(notification)
|
||||
@io << Components::TAPProfile.new(notification.profile)
|
||||
end
|
||||
|
||||
# Invoked after testing completes with summarized information from the test suite.
|
||||
def dump_summary(notification)
|
||||
@io.puts "Bail out!" if notification.report.counts.remaining?
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue