From 52ef5e5ced3cfbfe51335de58f12059929e0439f Mon Sep 17 00:00:00 2001 From: Michael Miller Date: Sun, 15 Sep 2019 10:40:53 -0600 Subject: [PATCH] Some DSL methods for hooks --- src/spectator/dsl/hooks.cr | 35 +++++++++++++++++++ src/spectator/spec_builder.cr | 4 +-- .../spec_builder/example_group_builder.cr | 25 +++++++++++++ 3 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 src/spectator/dsl/hooks.cr diff --git a/src/spectator/dsl/hooks.cr b/src/spectator/dsl/hooks.cr new file mode 100644 index 0000000..bc110d4 --- /dev/null +++ b/src/spectator/dsl/hooks.cr @@ -0,0 +1,35 @@ +module Spectator + module DSL + macro before_each(&block) + def %hook : Nil + {{block.body}} + end + + ::Spectator::SpecBuilder.add_before_each_hook { |test| test.as({{@type.id}}).%hook } + end + + macro after_each(&block) + def %hook : Nil + {{block.body}} + end + + ::Spectator::SpecBuilder.add_after_each_hook { |test| test.as({{@type.id}}).%hook } + end + + macro before_all(&block) + ::Spectator::SpecBuilder.add_before_all_hook {{block}} + end + + macro after_all(&block) + ::Spectator::SpecBuilder.add_after_all_hook {{block}} + end + + macro around_each(&block) + def %hook({{block.args.splat}}) : Nil + {{block.body}} + end + + # TODO: Handle wrapping proc and test together. + end + end +end diff --git a/src/spectator/spec_builder.cr b/src/spectator/spec_builder.cr index 88f1673..9978535 100644 --- a/src/spectator/spec_builder.cr +++ b/src/spectator/spec_builder.cr @@ -56,7 +56,7 @@ module Spectator end # Adds a block of code to run before each example in the current group. - def add_before_each_hook(&block : ->) : Nil + def add_before_each_hook(&block : TestMethod) : Nil @@stack.current.add_before_each_hook(block) end @@ -66,7 +66,7 @@ module Spectator end # Adds a block of code to run after each example in the current group. - def add_after_each_hook(&block : ->) : Nil + def add_after_each_hook(&block : TestMethod) : Nil @@stack.current.add_after_each_hook(block) end diff --git a/src/spectator/spec_builder/example_group_builder.cr b/src/spectator/spec_builder/example_group_builder.cr index 69d91a8..6f317cd 100644 --- a/src/spectator/spec_builder/example_group_builder.cr +++ b/src/spectator/spec_builder/example_group_builder.cr @@ -6,8 +6,33 @@ module Spectator::SpecBuilder private getter children = [] of Child + @before_each_hooks = Deque(TestMethod).new + @after_each_hooks = Deque(TestMethod).new + @before_all_hooks = Deque(->).new + @after_all_hooks = Deque(->).new + def add_child(child : Child) @children << child end + + def add_before_each_hook(hook : TestMethod) + @before_each_hooks << hook + end + + def add_after_each_hook(hook : TestMethod) + @after_each_hooks << hook + end + + def add_before_all_hook(hook : ->) + @before_all_hooks << hook + end + + def add_after_all_hook(hook : ->) + @after_all_hooks << hook + end + + private def build_hooks + ExampleHooks.empty + end end end