lib/rr/method_dispatches/method_dispatch.rb
module RR
module MethodDispatches
class MethodDispatch < BaseMethodDispatch
attr_reader :double_injection, :subject
def initialize(double_injection, subject, args, kwargs, block)
@double_injection = double_injection
@subject = subject
@args = args
@kwargs = kwargs
@block = block
@double = find_double_to_attempt
end
def call
space.record_call(subject, method_name, args, kwargs, block)
if double
double.method_call(args, kwargs)
call_yields
return_value_1 = call_implementation
return_value_2 = extract_subject_from_return_value(return_value_1)
if after_call_proc
extract_subject_from_return_value(after_call_proc.call(return_value_2))
else
return_value_2
end
else
double_not_found_error
end
end
def call_original_method
if subject_has_original_method?
if KeywordArguments.fully_supported?
subject.__send__(original_method_alias_name, *args, **kwargs, &block)
else
subject.__send__(original_method_alias_name, *args, &block)
end
elsif subject_has_original_method_missing?
call_original_method_missing
else
if KeywordArguments.fully_supported?
subject.__send__(:method_missing, method_name, *args, **kwargs, &block)
else
subject.__send__(:method_missing, method_name, *args, &block)
end
end
end
protected
def call_implementation
if implementation_is_original_method?
call_original_method
else
if implementation
if KeywordArguments.fully_supported?
implementation.call(*args, **kwargs, &block)
else
implementation.call(*args, &block)
end
else
nil
end
end
end
def_delegators :definition, :implementation
def_delegators :double_injection, :subject_has_original_method?, :subject_has_original_method_missing?, :method_name, :original_method_alias_name
end
end
end