/usr/lib/ruby/vendor_ruby/rspec/expectations/expectation_target.rb is in ruby-rspec-expectations 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 | module RSpec
module Expectations
# Wraps the target of an expectation.
#
# @example
# expect(something) # => ExpectationTarget wrapping something
# expect { do_something } # => ExpectationTarget wrapping the block
#
# # used with `to`
# expect(actual).to eq(3)
#
# # with `not_to`
# expect(actual).not_to eq(3)
#
# @note `ExpectationTarget` is not intended to be instantiated
# directly by users. Use `expect` instead.
class ExpectationTarget
# @private
# Used as a sentinel value to be able to tell when the user
# did not pass an argument. We can't use `nil` for that because
# `nil` is a valid value to pass.
UndefinedValue = Module.new
# @api private
def initialize(value)
@target = value
end
# @private
def self.for(value, block)
if UndefinedValue.equal?(value)
unless block
raise ArgumentError, "You must pass either an argument or a block to `expect`."
end
BlockExpectationTarget.new(block)
elsif block
raise ArgumentError, "You cannot pass both an argument and a block to `expect`."
else
new(value)
end
end
# Runs the given expectation, passing if `matcher` returns true.
# @example
# expect(value).to eq(5)
# expect { perform }.to raise_error
# @param [Matcher]
# matcher
# @param [String or Proc] message optional message to display when the expectation fails
# @return [Boolean] true if the expectation succeeds (else raises)
# @see RSpec::Matchers
def to(matcher=nil, message=nil, &block)
prevent_operator_matchers(:to) unless matcher
RSpec::Expectations::PositiveExpectationHandler.handle_matcher(@target, matcher, message, &block)
end
# Runs the given expectation, passing if `matcher` returns false.
# @example
# expect(value).not_to eq(5)
# @param [Matcher]
# matcher
# @param [String or Proc] message optional message to display when the expectation fails
# @return [Boolean] false if the negative expectation succeeds (else raises)
# @see RSpec::Matchers
def not_to(matcher=nil, message=nil, &block)
prevent_operator_matchers(:not_to) unless matcher
RSpec::Expectations::NegativeExpectationHandler.handle_matcher(@target, matcher, message, &block)
end
alias to_not not_to
private
def prevent_operator_matchers(verb)
raise ArgumentError, "The expect syntax does not support operator matchers, " \
"so you must pass a matcher to `##{verb}`."
end
end
# @private
# Validates the provided matcher to ensure it supports block
# expectations, in order to avoid user confusion when they
# use a block thinking the expectation will be on the return
# value of the block rather than the block itself.
class BlockExpectationTarget < ExpectationTarget
def to(matcher, message=nil, &block)
enforce_block_expectation(matcher)
super
end
def not_to(matcher, message=nil, &block)
enforce_block_expectation(matcher)
super
end
alias to_not not_to
private
def enforce_block_expectation(matcher)
return if supports_block_expectations?(matcher)
raise ExpectationNotMetError, "You must pass an argument rather than a block to use the provided " \
"matcher (#{RSpec::Support::ObjectFormatter.format(matcher)}), or the matcher must implement " \
"`supports_block_expectations?`."
end
def supports_block_expectations?(matcher)
matcher.supports_block_expectations?
rescue NoMethodError
false
end
end
end
end
|