From 9ac612120108ec3e73e9ce37e1dfd08d49a715ce Mon Sep 17 00:00:00 2001 From: Michael Miller Date: Thu, 1 Oct 2020 18:23:28 -0600 Subject: [PATCH] New stub syntax to support operator methods Works like: stub :[], index : Int32 { 42 } Addresses https://github.com/icy-arctic-fox/spectator/issues/14 --- src/spectator/mocks/double.cr | 17 ++++++++++++++++- src/spectator/mocks/stubs.cr | 17 ++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/spectator/mocks/double.cr b/src/spectator/mocks/double.cr index ef17e84..cd11aea 100644 --- a/src/spectator/mocks/double.cr +++ b/src/spectator/mocks/double.cr @@ -7,7 +7,7 @@ module Spectator::Mocks def initialize(@spectator_double_name : String, @null = false) end - private macro stub(definition, &block) + private macro stub(definition, *types, &block) {% name = nil params = nil @@ -44,6 +44,21 @@ module Spectator::Mocks params = [] of MacroId args = [] of MacroId body = block + elsif definition.is_a?(SymbolLiteral) # stub :foo, arg : Int32 + name = definition.id + named = false + params = types + if params.last.is_a?(Call) + body = params.last.block + params[-1] = params.last.name + end + args = params.map do |p| + n = p.is_a?(TypeDeclaration) ? p.var : p.id + r = named ? "#{n}: #{n}".id : n + named = true if n.starts_with?('*') + r + end + body = block unless body else raise "Unrecognized stub format" end diff --git a/src/spectator/mocks/stubs.cr b/src/spectator/mocks/stubs.cr index d18c3ab..23a54ee 100644 --- a/src/spectator/mocks/stubs.cr +++ b/src/spectator/mocks/stubs.cr @@ -1,6 +1,6 @@ module Spectator::Mocks module Stubs - private macro stub(definition, _file = __FILE__, _line = __LINE__, &block) + private macro stub(definition, *types, _file = __FILE__, _line = __LINE__, &block) {% receiver = nil name = nil @@ -30,6 +30,21 @@ module Spectator::Mocks params = [] of MacroId args = [] of MacroId body = block + elsif definition.is_a?(SymbolLiteral) # stub :foo, arg : Int32 + name = definition.id + named = false + params = types + if params.last.is_a?(Call) + body = params.last.block + params[-1] = params.last.name + end + args = params.map do |p| + n = p.is_a?(TypeDeclaration) ? p.var : p.id + r = named ? "#{n}: #{n}".id : n + named = true if n.starts_with?('*') + r + end + body = block unless body else raise "Unrecognized stub format" end