From 078058ad058cc73a4da948c14396f5b873e445f8 Mon Sep 17 00:00:00 2001 From: Michael Miller Date: Sat, 30 Jan 2021 20:38:09 -0700 Subject: [PATCH] Fix various issues with subjects All tests in crystal spec pass! --- src/spectator/dsl/groups.cr | 13 +++++++------ src/spectator/dsl/values.cr | 20 ++++++++++++++------ 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/spectator/dsl/groups.cr b/src/spectator/dsl/groups.cr index 0bb8bfd..3dc353b 100644 --- a/src/spectator/dsl/groups.cr +++ b/src/spectator/dsl/groups.cr @@ -1,6 +1,7 @@ require "../source" require "./builder" require "./tags" +require "./values" module Spectator::DSL # DSL methods and macros for creating example groups. @@ -89,13 +90,13 @@ module Spectator::DSL {{described_type}} end - private def _spectator_implicit_subject - {% if described_type < Reference || described_type < Value %} - described_class.new - {% else %} + {% if described_type < Reference || described_type < Value %} + subject { described_class.new } + {% else %} + private def subject described_class - {% end %} - end + end + {% end %} {% else %} private def _spectator_implicit_subject {{what}} diff --git a/src/spectator/dsl/values.cr b/src/spectator/dsl/values.cr index 6f0435d..b079f2e 100644 --- a/src/spectator/dsl/values.cr +++ b/src/spectator/dsl/values.cr @@ -53,11 +53,15 @@ module Spectator::DSL # The block is evaluated only the first time the subject is referenced # and the return value is saved for subsequent calls. macro subject(name, &block) - subject {{block}} + {% raise "Block required for 'subject'" unless block %} + {% raise "Cannot use 'subject' inside of a test block" if @def %} + {% raise "Block argument count for 'subject' must be 0..1" if block.args.size > 1 %} + + let({{name.id}}) {{block}} {% if name.id != :subject.id %} - def {{name.id}} - subject + def subject + {{name.id}} end {% end %} end @@ -80,11 +84,15 @@ module Spectator::DSL # The block is evaluated once before the example runs # and the return value is saved for subsequent calls. macro subject!(name, &block) - subject! {{block}} + {% raise "Block required for 'subject!'" unless block %} + {% raise "Cannot use 'subject!' inside of a test block" if @def %} + {% raise "Block argument count for 'subject!' must be 0..1" if block.args.size > 1 %} + + let!({{name.id}}) {{block}} {% if name.id != :subject.id %} - def {{name.id}} - subject + def subject + {{name.id}} end {% end %} end