/usr/lib/ruby/vendor_ruby/rspec/mocks/matchers/have_received.rb is in ruby-rspec-mocks 3.4.0c3e0m1s1-1ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | module RSpec
module Mocks
module Matchers
# @private
class HaveReceived
COUNT_CONSTRAINTS = %w[exactly at_least at_most times once twice thrice]
ARGS_CONSTRAINTS = %w[with]
CONSTRAINTS = COUNT_CONSTRAINTS + ARGS_CONSTRAINTS + %w[ordered]
def initialize(method_name, &block)
@method_name = method_name
@block = block
@constraints = []
@subject = nil
end
def name
"have_received"
end
def matches?(subject, &block)
@block ||= block
@subject = subject
@expectation = expect
mock_proxy.ensure_implemented(@method_name)
expected_messages_received_in_order?
end
def does_not_match?(subject)
@subject = subject
ensure_count_unconstrained
@expectation = expect.never
mock_proxy.ensure_implemented(@method_name)
expected_messages_received_in_order?
end
def failure_message
capture_failure_message
end
def failure_message_when_negated
capture_failure_message
end
def description
(@expectation ||= expect).description_for("have received")
end
CONSTRAINTS.each do |expectation|
define_method expectation do |*args|
@constraints << [expectation, *args]
self
end
end
def setup_expectation(subject, &block)
notify_failure_message unless matches?(subject, &block)
end
def setup_negative_expectation(subject, &block)
notify_failure_message unless does_not_match?(subject, &block)
end
def setup_allowance(_subject, &_block)
disallow("allow", " as it would have no effect")
end
def setup_any_instance_allowance(_subject, &_block)
disallow("allow_any_instance_of")
end
def setup_any_instance_expectation(_subject, &_block)
disallow("expect_any_instance_of")
end
private
def disallow(type, reason="")
RSpec::Mocks.error_generator.raise_have_received_disallowed(type, reason)
end
def expect
expectation = mock_proxy.build_expectation(@method_name)
apply_constraints_to expectation
expectation
end
def apply_constraints_to(expectation)
@constraints.each do |constraint|
expectation.send(*constraint)
end
end
def ensure_count_unconstrained
return unless count_constraint
RSpec::Mocks.error_generator.raise_cant_constrain_count_for_negated_have_received_error(count_constraint)
end
def count_constraint
@constraints.map(&:first).find do |constraint|
COUNT_CONSTRAINTS.include?(constraint)
end
end
def capture_failure_message
RSpec::Support.with_failure_notifier(Proc.new { |err, _opt| return err.message }) do
notify_failure_message
end
end
def notify_failure_message
mock_proxy.check_for_unexpected_arguments(@expectation)
@expectation.generate_error
end
def expected_messages_received_in_order?
mock_proxy.replay_received_message_on @expectation, &@block
@expectation.expected_messages_received? && @expectation.ensure_expected_ordering_received!
end
def mock_proxy
RSpec::Mocks.space.proxy_for(@subject)
end
end
end
end
end
|