Class: Transpec::Syntax::Have

Inherits:
Syntax
  • Object
show all
Includes:
DynamicAnalysis, Mixin::OwnedMatcher, Mixin::Send
Defined in:
lib/transpec/syntax/have.rb,
lib/transpec/syntax/have/have_record.rb,
lib/transpec/syntax/have/source_builder.rb,
lib/transpec/syntax/have/dynamic_analysis.rb

Defined Under Namespace

Modules: DynamicAnalysis Classes: HaveRecord, SourceBuilder

Constant Summary collapse

QUERY_METHOD_PRIORITIES =

String#count is not query method, and there's no way to determine whether a method is query method. Method#arity and Method#parameters return same results for Array#count (0+ args) and String#count (1+ args).

So I make #size a priority over #count so that #count won't be chosen for String (String responds to #size).

[:size, :count, :length].freeze

Instance Method Summary collapse

Methods included from Mixin::Send

#arg_node, #arg_nodes, #arg_range, #args_range, #method_name, #parentheses_range, #range_after_arg, #range_in_between_receiver_and_selector, #range_in_between_selector_and_arg, #receiver_node, #receiver_range, #selector_range

Methods included from Mixin::OwnedMatcher

#initialize

Methods included from DynamicAnalysis

#register_dynamic_analysis_request

Instance Method Details

#accurate_conversion? ⇒ Boolean

Returns:

  • (Boolean)


98
99
100
# File 'lib/transpec/syntax/have.rb', line 98

def accurate_conversion?
  runtime_subject_data
end

#collection_accessor ⇒ Object



60
61
62
63
64
65
66
# File 'lib/transpec/syntax/have.rb', line 60

def collection_accessor
  if runtime_subject_data(:collection_accessor)
    runtime_subject_data(:collection_accessor).to_sym
  else
    items_name
  end
end

#collection_accessor_is_private? ⇒ Boolean

Returns:

  • (Boolean)


73
74
75
# File 'lib/transpec/syntax/have.rb', line 73

def collection_accessor_is_private?
  runtime_subject_data(:collection_accessor_is_private?)
end

#conversion_target? ⇒ Boolean

Returns:

  • (Boolean)


31
32
33
# File 'lib/transpec/syntax/have.rb', line 31

def conversion_target?
  super && !runtime_subject_data(:project_requires_collection_matcher?)
end

#convert_to_standard_expectation!(parenthesize_matcher_arg = true) ⇒ Object



35
36
37
38
39
# File 'lib/transpec/syntax/have.rb', line 35

def convert_to_standard_expectation!(parenthesize_matcher_arg = true)
  replace(expectation.subject_range, replacement_subject_source) if explicit_subject?
  replace(matcher_range, source_builder.replacement_matcher_source(parenthesize_matcher_arg))
  register_record if explicit_subject?
end

#default_query_method ⇒ Object



85
86
87
# File 'lib/transpec/syntax/have.rb', line 85

def default_query_method
  QUERY_METHOD_PRIORITIES.first
end

#dynamic_analysis_target? ⇒ Boolean

Returns:

  • (Boolean)


25
26
27
28
29
# File 'lib/transpec/syntax/have.rb', line 25

def dynamic_analysis_target?
  super &&
    receiver_node.nil? &&
    [:have, :have_exactly, :have_at_least, :have_at_most].include?(method_name)
end

#explicit_subject? ⇒ Boolean

Returns:

  • (Boolean)


41
42
43
# File 'lib/transpec/syntax/have.rb', line 41

def explicit_subject?
  expectation.respond_to?(:subject_node)
end

#items_method_has_arguments? ⇒ Boolean

Returns:

  • (Boolean)


52
53
54
# File 'lib/transpec/syntax/have.rb', line 52

def items_method_has_arguments?
  items_node.children.size > 2
end

#items_name ⇒ Object



56
57
58
# File 'lib/transpec/syntax/have.rb', line 56

def items_name
  items_node.children[1]
end

#matcher_range ⇒ Object



102
103
104
# File 'lib/transpec/syntax/have.rb', line 102

def matcher_range
  expression_range.join(items_node.loc.expression)
end

#query_method ⇒ Object



77
78
79
80
81
82
83
# File 'lib/transpec/syntax/have.rb', line 77

def query_method
  if (available_query_methods = runtime_subject_data(:available_query_methods))
    (QUERY_METHOD_PRIORITIES & available_query_methods.map(&:to_sym)).first
  else
    default_query_method
  end
end

#replacement_subject_source(base_subject = nil) ⇒ Object



89
90
91
92
# File 'lib/transpec/syntax/have.rb', line 89

def replacement_subject_source(base_subject = nil)
  base_subject ||= expectation.subject_node
  source_builder.replacement_subject_source(base_subject)
end

#size_node ⇒ Object



48
49
50
# File 'lib/transpec/syntax/have.rb', line 48

def size_node
  have_node.children[2]
end

#size_source ⇒ Object



94
95
96
# File 'lib/transpec/syntax/have.rb', line 94

def size_source
  size_node.loc.expression.source
end

#subject_is_owner_of_collection? ⇒ Boolean

Returns:

  • (Boolean)


68
69
70
71
# File 'lib/transpec/syntax/have.rb', line 68

def subject_is_owner_of_collection?
  return true if items_method_has_arguments?
  runtime_subject_data(:collection_accessor)
end