# frozen_string_literal: true# Released under the MIT License.# Copyright, 2022, by Samuel Williams.require_relative'respond_to'moduleSusclassReceiveCALL_ORIGINAL=Object.newdefinitialize(base,method)@base=base@method=method@times=Times.new@arguments=nil@options=nil@block=nil@returning=CALL_ORIGINALenddefprint(output)output.write("receive ",:variable,@method.to_s,:reset," ")enddefwith_arguments(*arguments)@arguments=WithArguments.new(arguments)returnselfenddefwith_options(*options)@options=WithOptions.new(options)returnselfenddefwith_block@block=WithBlock.newreturnselfenddefonce@times=Times.new(Be.new(:==,1))enddeftwice@times=Times.new(Be.new(:==,2))enddefwith_call_count(predicate)@times=Times.new(predicate)enddefand_return(*returning)ifreturning.size==1@returning=returning.firstelse@returning=returningendreturnselfenddefvalidate(mock,assertions,arguments,options,block)@arguments.call(assertions,arguments)if@arguments@options.call(assertions,options)if@options@block.call(assertions,block)if@blockenddefcall(assertions,subject)assertions.nested(self)do|assertions|mock=@base.mock(subject)called=0ifcall_original?mock.before(@method)do|*arguments,**options,&block|called+=1validate(mock,assertions,arguments,options,block)endelsemock.replace(@method)do|*arguments,**options,&block|called+=1validate(mock,assertions,arguments,options,block)next@returningendendif@timesassertions.deferdo@times.call(assertions,called)endendendenddefcall_original?@returning==CALL_ORIGINALendclassWithArgumentsdefinitialize(arguments)@arguments=argumentsenddefprint(output)output.write("with arguments ",:variable,@arguments.inspect)enddefcall(assertions,subject)assertions.nested(self)do|assertions|Expect.new(assertions,subject).to(Be==@arguments)endendendclassWithOptionsdefinitialize(options)@options=optionsenddefprint(output)output.write("with options ",:variable,@options.inspect)enddefcall(assertions,subject)assertions.nested(self)do|assertions|Expect.new(assertions,subject).to(Be.new(:include?,@options))endendendclassWithBlockdefprint(output)output.write("with block")enddefcall(assertions,subject)assertions.nested(self)do|assertions|Expect.new(assertions,subject).not.to(Be==nil)endendendclassTimesONCE=Be.new(:==,1)definitialize(condition=ONCE)@condition=conditionenddefprint(output)output.write("with call count ",@condition)enddefcall(assertions,subject)assertions.nested(self)do|assertions|Expect.new(assertions,subject).to(@condition)endendendendclassBasedefreceive(method)Receive.new(self,method)endendend