moduleSpecmoduleMocksclassBaseExpectationattr_reader:symdefinitialize(error_generator,expectation_ordering,expected_from,sym,method_block,expected_received_count=1,opts={})@error_generator=error_generator@error_generator.opts=opts@expected_from=expected_from@sym=sym@method_block=method_block@return_block=nil@actual_received_count=0@expected_received_count=expected_received_count@args_expectation=ArgumentExpectation.new([AnyArgsConstraint.new])@consecutive=false@exception_to_raise=nil@symbol_to_throw=nil@order_group=expectation_ordering@at_least=nil@at_most=nil@args_to_yield=[]enddefexpected_args@args_expectation.argsenddefand_return(*values,&return_block)Kernel::raiseAmbiguousReturnErrorunless@method_block.nil?casevalues.sizewhen0thenvalue=nilwhen1thenvalue=values[0]elsevalue=values@consecutive=true@expected_received_count=values.sizeif!ignoring_args?&&@expected_received_count<values.sizeend@return_block=block_given??return_block:lambda{value}# Ruby 1.9 - see where this is used below@ignore_args=!block_given?end# :call-seq:# and_raise()# and_raise(Exception) #any exception class# and_raise(exception) #any exception object## == Warning## When you pass an exception class, the MessageExpectation will# raise an instance of it, creating it with +new+. If the exception# class initializer requires any parameters, you must pass in an# instance and not the class.defand_raise(exception=Exception)@exception_to_raise=exceptionenddefand_throw(symbol)@symbol_to_throw=symbolenddefand_yield(*args)@args_to_yield<<argsselfenddefmatches(sym,args)@sym==symand@args_expectation.check_args(args)enddefinvoke(args,block)if@expected_received_count==0@actual_received_count+=1@error_generator.raise_expectation_error@sym,@expected_received_count,@actual_received_count,*argsend@order_group.handle_order_constraintselfbeginKernel::raise@exception_to_raiseunless@exception_to_raise.nil?Kernel::throw@symbol_to_throwunless@symbol_to_throw.nil?if!@method_block.nil?default_return_val=invoke_method_block(args)elsif@args_to_yield.size>0default_return_val=invoke_with_yield(block)elsedefault_return_val=nilendif@consecutivereturninvoke_consecutive_return_block(args,block)elsif@return_blockreturninvoke_return_block(args,block)elsereturndefault_return_valendensure@actual_received_count+=1endendprotecteddefinvoke_method_block(args)begin@method_block.call(*args)rescue=>detail@error_generator.raise_block_failed_error@sym,detail.messageendenddefinvoke_with_yield(block)ifblock.nil?@error_generator.raise_missing_block_error@args_to_yieldendvalue=nil@args_to_yield.eachdo|args_to_yield_this_time|ifblock.arity>-1&&args_to_yield_this_time.length!=block.arity@error_generator.raise_wrong_arity_errorargs_to_yield_this_time,block.arityendvalue=block.call(*args_to_yield_this_time)endvalueenddefinvoke_consecutive_return_block(args,block)args<<blockunlessblock.nil?value=@return_block.call(*args)index=[@actual_received_count,value.size-1].minvalue[index]enddefinvoke_return_block(args,block)args<<blockunlessblock.nil?# Ruby 1.9 - when we set @return_block to return values# regardless of arguments, any arguments will result in# a "wrong number of arguments" errorif@ignore_args@return_block.call()else@return_block.call(*args)endendendclassMessageExpectation<BaseExpectationdefmatches_name_but_not_args(sym,args)@sym==symandnot@args_expectation.check_args(args)enddefverify_messages_receivedreturnifexpected_messages_received?generate_errorrescueSpec::Mocks::MockExpectationError=>errorerror.backtrace.insert(0,@expected_from)Kernel::raiseerrorenddefexpected_messages_received?ignoring_args?||matches_exact_count?||matches_at_least_count?||matches_at_most_count?enddefignoring_args?@expected_received_count==:anyenddefmatches_at_least_count?@at_least&&@actual_received_count>=@expected_received_countenddefmatches_at_most_count?@at_most&&@actual_received_count<=@expected_received_countenddefmatches_exact_count?@expected_received_count==@actual_received_countenddefsimilar_messages@similar_messages||=[]enddefadvise(args,block)similar_messages<<argsenddefgenerate_errorifsimilar_messages.empty?@error_generator.raise_expectation_error(@sym,@expected_received_count,@actual_received_count,*@args_expectation.args)else@error_generator.raise_unexpected_message_args_error(self,*@similar_messages.first)endenddefwith(*args,&block)@args_expectation=ArgumentExpectation.new(args,&block)selfenddefexactly(n)set_expected_received_count:exactly,nselfenddefat_least(n)set_expected_received_count:at_least,nselfenddefat_most(n)set_expected_received_count:at_most,nselfenddeftimes(&block)@method_block=blockifblockselfenddefany_number_of_times(&block)@method_block=blockifblock@expected_received_count=:anyselfenddefnever@expected_received_count=0selfenddefonce(&block)@method_block=blockifblock@expected_received_count=1selfenddeftwice(&block)@method_block=blockifblock@expected_received_count=2selfenddefordered(&block)@method_block=blockifblock@order_group.register(self)@ordered=trueselfenddefnegative_expectation_for?(sym)returnfalseendprotecteddefset_expected_received_count(relativity,n)@at_least=(relativity==:at_least)@at_most=(relativity==:at_most)@expected_received_count=casenwhenNumericnwhen:once1when:twice2endendendclassNegativeMessageExpectation<MessageExpectationdefinitialize(message,expectation_ordering,expected_from,sym,method_block)super(message,expectation_ordering,expected_from,sym,method_block,0)enddefnegative_expectation_for?(sym)return@sym==symendendendend