1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
#!/usr/bin/env ruby
#---
# Copyright 2003-2013 by Jim Weirich (jim.weirich@gmail.com).
# All rights reserved.
#
# Permission is granted for use, copying, modification, distribution,
# and distribution of modified versions of this work as long as the
# above copyright notice is included.
#+++
class FlexMock
# A CallValidator checks the list of call records for a particular
# method name and arguments.
class CallValidator
# Does the +calls+ list record a method named +method_name+ with
# +args+. Options include:
#
# * :times => n -- If given, the call should match exactly +n+ times.
# * :and => [] -- A list of argument validations to be run on each
# matching invocation.
# * :on_count => n -- If given, the :and validations on only run on the
# nth invocation.
#
def received?(calls, method_name, args, kw, options)
count = 0
calls.each { |call_record|
if call_record.matches?(method_name, args, kw, options)
count += 1
run_additional_validations(call_record, count, options)
end
}
count_matches?(count, options[:times])
end
private
def additionals(options)
ands = options[:and]
if ands.nil?
[]
elsif ands.is_a?(Proc)
[ands]
else
ands
end
end
def run_additional_validations(call_record, count, options)
if options[:on_count].nil? || count == options[:on_count]
additionals(options).each do |add|
add.call(*call_record.args)
end
end
end
def count_matches?(count, times)
if times
count == times
else
count > 0
end
end
end
end
|