2021-02-13 05:46:22 +00:00
|
|
|
require "../location"
|
2020-11-09 05:21:52 +00:00
|
|
|
require "./builder"
|
|
|
|
|
2020-11-08 05:04:37 +00:00
|
|
|
module Spectator::DSL
|
|
|
|
# DSL methods for adding custom logic to key times of the spec execution.
|
|
|
|
module Hooks
|
2021-01-09 20:17:42 +00:00
|
|
|
# Defines a macro to create an example group hook.
|
|
|
|
# The *type* indicates when the hook runs and must be a method on `Spectator::DSL::Builder`.
|
|
|
|
macro define_example_group_hook(type)
|
|
|
|
macro {{type.id}}(&block)
|
|
|
|
\{% raise "Missing block for '{{type.id}}' hook" unless block %}
|
|
|
|
\{% raise "Cannot use '{{type.id}}' inside of a test block" if @def %}
|
|
|
|
|
2021-02-10 05:40:15 +00:00
|
|
|
private def self.\%hook : Nil
|
2021-01-09 20:17:42 +00:00
|
|
|
\{{block.body}}
|
|
|
|
end
|
|
|
|
|
|
|
|
::Spectator::DSL::Builder.{{type.id}}(
|
2021-02-13 05:46:22 +00:00
|
|
|
::Spectator::Location.new(\{{block.filename}}, \{{block.line_number}})
|
2021-01-30 19:26:29 +00:00
|
|
|
) { \%hook }
|
2020-11-08 05:04:37 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2021-01-09 20:17:42 +00:00
|
|
|
# Defines a macro to create an example hook.
|
|
|
|
# The *type* indicates when the hook runs and must be a method on `Spectator::DSL::Builder`.
|
|
|
|
macro define_example_hook(type)
|
|
|
|
macro {{type.id}}(&block)
|
|
|
|
\{% raise "Missing block for '{{type.id}}' hook" unless block %}
|
2021-01-09 20:34:15 +00:00
|
|
|
\{% raise "Block argument count '{{type.id}}' hook must be 0..1" if block.args.size > 1 %}
|
2021-01-09 20:17:42 +00:00
|
|
|
\{% raise "Cannot use '{{type.id}}' inside of a test block" if @def %}
|
2019-09-15 16:40:53 +00:00
|
|
|
|
2021-02-10 05:40:15 +00:00
|
|
|
private def \%hook(\{{block.args.splat}}) : Nil
|
2021-01-09 20:17:42 +00:00
|
|
|
\{{block.body}}
|
|
|
|
end
|
2020-11-15 18:22:06 +00:00
|
|
|
|
2021-01-09 20:17:42 +00:00
|
|
|
::Spectator::DSL::Builder.{{type.id}}(
|
2021-02-13 05:46:22 +00:00
|
|
|
::Spectator::Location.new(\{{block.filename}}, \{{block.line_number}})
|
2021-01-09 20:34:15 +00:00
|
|
|
) do |example|
|
|
|
|
example.with_context(\{{@type.name}}) do
|
|
|
|
\{% if block.args.empty? %}
|
|
|
|
\%hook
|
|
|
|
\{% else %}
|
|
|
|
\%hook(example)
|
|
|
|
\{% end %}
|
|
|
|
end
|
|
|
|
end
|
2020-11-15 18:22:06 +00:00
|
|
|
end
|
2019-09-27 03:37:29 +00:00
|
|
|
end
|
|
|
|
|
2021-01-09 20:17:42 +00:00
|
|
|
# Defines a block of code that will be invoked once before any examples in the group.
|
|
|
|
# The block will not run in the context of the current running example.
|
|
|
|
# This means that values defined by `let` and `subject` are not available.
|
|
|
|
define_example_group_hook :before_all
|
|
|
|
|
|
|
|
# Defines a block of code that will be invoked once after all examples in the group.
|
|
|
|
# The block will not run in the context of the current running example.
|
|
|
|
# This means that values defined by `let` and `subject` are not available.
|
|
|
|
define_example_group_hook :after_all
|
|
|
|
|
|
|
|
# Defines a block of code that will be invoked before every example in the group.
|
|
|
|
# The block will be run in the context of the current running example.
|
|
|
|
# This means that values defined by `let` and `subject` are available.
|
|
|
|
define_example_hook :before_each
|
|
|
|
|
|
|
|
# Defines a block of code that will be invoked after every example in the group.
|
|
|
|
# The block will be run in the context of the current running example.
|
|
|
|
# This means that values defined by `let` and `subject` are available.
|
|
|
|
define_example_hook :after_each
|
2021-01-16 23:47:40 +00:00
|
|
|
|
|
|
|
# Defines a block of code that will be invoked around every example in the group.
|
|
|
|
# The block will be run in the context of the current running example.
|
|
|
|
# This means that values defined by `let` and `subject` are available.
|
|
|
|
#
|
|
|
|
# The block will execute before the example.
|
|
|
|
# An `Example::Procsy` is passed to the block.
|
|
|
|
# The `Example::Procsy#run` method should be called to ensure the example runs.
|
|
|
|
# More code can run afterwards (in the block).
|
|
|
|
define_example_hook :around_each
|
2019-09-15 16:40:53 +00:00
|
|
|
end
|
|
|
|
end
|