2018-08-19 07:15:32 +00:00
|
|
|
require "./example"
|
|
|
|
|
|
|
|
module Spectator
|
|
|
|
class ExampleGroup
|
2018-09-15 16:45:47 +00:00
|
|
|
ROOT = ExampleGroup.new("ROOT")
|
2018-08-19 07:15:32 +00:00
|
|
|
|
2018-09-15 16:45:47 +00:00
|
|
|
getter what : String
|
|
|
|
getter parent : ExampleGroup?
|
|
|
|
getter before_all_hooks = [] of ->
|
|
|
|
getter before_each_hooks = [] of ->
|
|
|
|
getter after_all_hooks = [] of ->
|
|
|
|
getter after_each_hooks = [] of ->
|
|
|
|
getter around_each_hooks = [] of Proc(Nil) ->
|
2018-09-20 01:31:50 +00:00
|
|
|
getter children = [] of Example | ExampleGroup
|
2018-09-15 16:45:47 +00:00
|
|
|
|
|
|
|
@before_all_hooks_run = false
|
|
|
|
@after_all_hooks_run = false
|
|
|
|
|
|
|
|
def initialize(@what, @parent = nil)
|
|
|
|
if (parent = @parent)
|
2018-09-20 01:31:50 +00:00
|
|
|
parent.children << self
|
2018-09-15 16:45:47 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-09-20 01:31:50 +00:00
|
|
|
def examples : Enumerable(Example)
|
|
|
|
@children.select { |child| child.is_a?(Example) }.map { |child| child.unsafe_as(Example) }
|
|
|
|
end
|
|
|
|
|
|
|
|
def groups : Enumerable(ExampleGroup)
|
|
|
|
@children.select { |child| child.is_a?(ExampleGroup) }.map { |child| child.unsafe_as(ExampleGroup) }
|
|
|
|
end
|
|
|
|
|
2018-09-15 16:45:47 +00:00
|
|
|
def all_examples
|
2018-09-20 01:31:50 +00:00
|
|
|
Array(Example).new.tap do |array|
|
|
|
|
add_examples(array)
|
|
|
|
end
|
2018-09-15 16:45:47 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def run_before_all_hooks
|
|
|
|
if (parent = @parent)
|
|
|
|
parent.run_before_all_hooks
|
|
|
|
end
|
|
|
|
unless @before_all_hooks_run
|
|
|
|
@before_all_hooks.each do |hook|
|
|
|
|
hook.call
|
|
|
|
end
|
|
|
|
@before_all_hooks_run = true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def run_before_each_hooks
|
|
|
|
if (parent = @parent)
|
|
|
|
parent.run_before_each_hooks
|
|
|
|
end
|
|
|
|
@before_each_hooks.each do |hook|
|
|
|
|
hook.call
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def run_after_all_hooks
|
|
|
|
unless @after_all_hooks_run
|
|
|
|
if all_examples.all?(&.finished?)
|
|
|
|
@after_all_hooks.each do |hook|
|
|
|
|
hook.call
|
|
|
|
end
|
|
|
|
@after_all_hooks_run = true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
if (parent = @parent)
|
|
|
|
parent.run_after_all_hooks
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def run_after_each_hooks
|
|
|
|
@after_each_hooks.each do |hook|
|
|
|
|
hook.call
|
|
|
|
end
|
|
|
|
if (parent = @parent)
|
|
|
|
parent.run_after_each_hooks
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def wrap_around_each_hooks(&block : ->)
|
|
|
|
wrapper = block
|
|
|
|
@around_each_hooks.reverse_each do |hook|
|
|
|
|
wrapper = wrap_proc(hook, wrapper)
|
|
|
|
end
|
|
|
|
if (parent = @parent)
|
|
|
|
wrapper = parent.wrap_around_each_hooks(&wrapper)
|
|
|
|
end
|
|
|
|
wrapper
|
|
|
|
end
|
|
|
|
|
|
|
|
private def wrap_proc(inner : Proc(Nil) ->, wrapper : ->)
|
|
|
|
-> { inner.call(wrapper) }
|
|
|
|
end
|
|
|
|
|
2018-09-20 01:31:50 +00:00
|
|
|
protected def add_examples(array : Array(Example))
|
|
|
|
@children.each do |child|
|
|
|
|
if child.is_a?(Example)
|
|
|
|
array << child
|
|
|
|
else
|
|
|
|
child.add_examples(array)
|
|
|
|
end
|
2018-09-15 16:45:47 +00:00
|
|
|
end
|
2018-08-19 07:15:32 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|