diff --git a/src/spectator/internals/harness.cr b/src/spectator/internals/harness.cr new file mode 100644 index 0000000..65d76d9 --- /dev/null +++ b/src/spectator/internals/harness.cr @@ -0,0 +1,45 @@ +module Spectator::Internals + # Helper class that acts as a gateway between example code and the test framework. + # Every example run must be called with `#run`. + # This sets up the harness so that the example code can use it. + # The test framework does the following: + # ``` + # result = Harness.run(example) + # # Do something with the result. + # ``` + # Then from the example code, the harness can be accessed via `#current` like so: + # ``` + # harness = ::Spectator::Internals::Harness.current + # # Do something with the harness. + # ``` + # Of course, the end-user shouldn't see this or work directly with the harness. + # Instead, methods the user calls can access it. + # For instance, an expectation reporting a result. + class Harness + # Retrieves the harness for the current running example. + class_getter! current : self + + # Wraps an example with a harness and runs the example. + # The `#current` harness will be set + # prior to running the example, and reset after. + # The `example` argument will be the example to run. + # The result returned from `Example#run` will be returned. + def self.run(example : Example) : Result + @@current = new(example) + result = example.run + @@current = nil + result + end + + # Retrieves the current running example. + getter example : Example + + # Provides access to the expectation reporter. + getter reporter = Expectations::ExpectationReporter.new + + # Creates a new harness. + # The example the harness is for should be passed in. + private def initialize(@example) + end + end +end