shard-spectator/src/spectator/example.cr

63 lines
1.8 KiB
Crystal
Raw Normal View History

require "./example_component"
2018-08-19 07:15:32 +00:00
module Spectator
# Base class for all types of examples.
# Concrete types must implement the `#run_impl, `#what`, `#instance`, and `#source` methods.
abstract class Example < ExampleComponent
# Indicates whether the example has already been run.
2018-09-13 03:31:44 +00:00
getter? finished = false
# Group that the example belongs to.
2018-09-23 18:16:38 +00:00
getter group : ExampleGroup
2018-09-11 03:51:14 +00:00
2019-01-01 23:40:04 +00:00
# Retrieves the internal wrapped instance.
abstract def instance
# Source where the example originated from.
abstract def source : Source
# Runs the example code.
# A result is returned, which represents the outcome of the test.
# An example can be run only once.
# An exception is raised if an attempt is made to run it more than once.
def run : Result
raise "Attempted to run example more than once (#{self})" if finished?
@finished = true
2018-10-20 00:50:21 +00:00
run_impl
end
# Implementation-specific for running the example code.
2018-10-20 00:50:21 +00:00
private abstract def run_impl : Result
# Creates the base of the example.
# The group should be the example group the example belongs to.
def initialize(@group)
end
# Indicates there is only one example to run.
def example_count
1
end
# Retrieve the current example.
def [](index : Int)
self
end
# String representation of the example.
# This consists of the groups the example is in and the description.
# The string can be given to end-users to identify the example.
2018-09-24 02:24:28 +00:00
def to_s(io)
@group.to_s(io)
io << ' ' unless symbolic? && @group.symbolic?
io << what
2018-09-24 02:24:28 +00:00
end
# Creates the JSON representation of the example,
# which is just its name.
def to_json(json : ::JSON::Builder)
json.string(to_s)
end
2018-08-19 07:15:32 +00:00
end
end