shard-spectator/src/spectator/example_group.cr

98 lines
2.1 KiB
Crystal
Raw Normal View History

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 examples = [] of Example
getter groups = [] of 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) ->
@before_all_hooks_run = false
@after_all_hooks_run = false
def initialize(@what, @parent = nil)
if (parent = @parent)
parent.groups << self
end
end
def all_examples
add_examples
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
protected def add_examples(array = [] of Example)
array.concat(@examples)
groups.each do |group|
group.add_examples(array)
end
array
2018-08-19 07:15:32 +00:00
end
end
end