Sha256: 1e0e867f2909afebfd526e93f1ae01b8b3cabbfe42285a08d444a2c37da1f355

Contents?: true

Size: 1.53 KB

Versions: 3

Compression:

Stored size: 1.53 KB

Contents

module VerifiedDouble
  class MethodSignature
    attr_accessor :args, :class_name, :method, :method_operator, :return_values

    def initialize(attributes = {})
      attributes.each do |name, value|
        self.send "#{name}=", value
      end
    end

    def accepts?(other)
      self.class_name == other.class_name &&
      self.method_operator == other.method_operator &&
      self.method == other.method &&
      self.args.size == other.args.size &&
      (0 ... args.size).all?{|i| self.args[i].accepts?(other.args[i]) } &&
      self.return_values.size == other.return_values.size &&
      (0 ... return_values.size).all?{|i| self.return_values[i].accepts?(other.return_values[i]) }
    end

    def args
      @args ||= []
    end

    def eql?(other)
      to_s.eql?(other.to_s)
    end

    def hash
      to_s.hash
    end

    def recommended_verified_signature
      self.clone.tap do |result|
        result.args = result.args.map{|arg| arg.recommended_value }
        result.return_values = result.return_values.map{|return_value| return_value.recommended_value }
      end
    end

    def return_values
      @return_values ||= []
    end

    def to_s
      args_string = args.map(&:value).map{|v| v || 'nil'}.join(', ')
      return_values_string = return_values.map(&:value).map{|v| v || 'nil'}.join(', ')
      return_values_string = nil if return_values_string.empty?

      result = [
        "#{class_name}#{method_operator}#{method}(#{args_string})",
        return_values_string]
      result.flatten.compact.join("=>")
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
verified_double-0.1.1 lib/verified_double/method_signature.rb
verified_double-0.1.0 lib/verified_double/method_signature.rb
verified_double-0.0.2 lib/verified_double/method_signature.rb