diff --git a/src/spectator/mocks/double.cr b/src/spectator/mocks/double.cr index 8562ca6..ad35dda 100644 --- a/src/spectator/mocks/double.cr +++ b/src/spectator/mocks/double.cr @@ -103,6 +103,11 @@ module Spectator @stubs.unshift(stub) end + protected def _spectator_remove_stub(stub : Stub) : Nil + Log.debug { "Removing stub #{stub} from #{_spectator_stubbed_name}" } + @stubs.delete(stub) + end + protected def _spectator_clear_stubs : Nil Log.debug { "Clearing stubs for #{_spectator_stubbed_name}" } @stubs.clear diff --git a/src/spectator/mocks/mock.cr b/src/spectator/mocks/mock.cr index 174d183..901d088 100644 --- a/src/spectator/mocks/mock.cr +++ b/src/spectator/mocks/mock.cr @@ -50,6 +50,10 @@ module Spectator end {% end %} + def _spectator_remove_stub(stub : ::Spectator::Stub) : Nil + @_spectator_stubs.try &.delete(stub) + end + def _spectator_clear_stubs : Nil @_spectator_stubs = nil end @@ -139,6 +143,10 @@ module Spectator entry.stubs end + def _spectator_remove_stub(stub : ::Spectator::Stub) : Nil + @@_spectator_mock_registry[self]?.try &.stubs.delete(stub) + end + def _spectator_clear_stubs : Nil @@_spectator_mock_registry.delete(self) end diff --git a/src/spectator/mocks/mocked.cr b/src/spectator/mocks/mocked.cr index be25ef0..280eef8 100644 --- a/src/spectator/mocks/mocked.cr +++ b/src/spectator/mocks/mocked.cr @@ -26,6 +26,10 @@ module Spectator _spectator_stubs.unshift(stub) end + def _spectator_remove_stub(stub : Stub) : Nil + _spectator_stubs.delete(stub) + end + def _spectator_clear_stubs : Nil _spectator_stubs.clear end diff --git a/src/spectator/mocks/reference_mock_registry.cr b/src/spectator/mocks/reference_mock_registry.cr index 20481f0..84227d1 100644 --- a/src/spectator/mocks/reference_mock_registry.cr +++ b/src/spectator/mocks/reference_mock_registry.cr @@ -25,6 +25,12 @@ module Spectator @entries[key] end + # Retrieves all stubs defined for a mocked object or nil if the object isn't mocked yet. + def []?(object : Reference) + key = Box.box(object) + @entries[key]? + end + # Retrieves all stubs defined for a mocked object. # # Yields to the block on the first retrieval. diff --git a/src/spectator/mocks/stubbable.cr b/src/spectator/mocks/stubbable.cr index aa02976..26bfea9 100644 --- a/src/spectator/mocks/stubbable.cr +++ b/src/spectator/mocks/stubbable.cr @@ -28,6 +28,9 @@ module Spectator # Defines a stub to change the behavior of a method. abstract def _spectator_define_stub(stub : Stub) : Nil + # Removes a specific, previously defined stub. + abstract def _spectator_remove_stub(stub : Stub) : Nil + # Clears all previously defined stubs. abstract def _spectator_clear_stubs : Nil diff --git a/src/spectator/mocks/stubbed_type.cr b/src/spectator/mocks/stubbed_type.cr index a5588ee..5362b84 100644 --- a/src/spectator/mocks/stubbed_type.cr +++ b/src/spectator/mocks/stubbed_type.cr @@ -20,6 +20,10 @@ module Spectator _spectator_stubs.unshift(stub) end + def _spectator_remove_stub(stub : Stub) : Nil + _spectator_stubs.delete(stub) + end + def _spectator_clear_stubs : Nil _spectator_stubs.clear end diff --git a/src/spectator/mocks/value_mock_registry.cr b/src/spectator/mocks/value_mock_registry.cr index 5763509..1efd0b0 100644 --- a/src/spectator/mocks/value_mock_registry.cr +++ b/src/spectator/mocks/value_mock_registry.cr @@ -29,6 +29,12 @@ module Spectator @entries[key] end + # Retrieves all stubs defined for a mocked object or nil if the object isn't mocked yet. + def []?(object : T) + key = value_bytes(object) + @entries[key]? + end + # Retrieves all stubs defined for a mocked object. # # Yields to the block on the first retrieval.