class Hiptest::NodeModifiers::ParameterTypeAdder

Attributes

call_types[R]

Public Class Methods

add(project) click to toggle source
# File lib/hiptest-publisher/node_modifiers/parameter_type_adder.rb, line 9
def self.add(project)
  self.new.process(project)
end
new() click to toggle source
# File lib/hiptest-publisher/node_modifiers/parameter_type_adder.rb, line 13
def initialize
  @call_types = CallTypes.new
end

Public Instance Methods

add_arguments_from(node, context = nil) click to toggle source
# File lib/hiptest-publisher/node_modifiers/parameter_type_adder.rb, line 66
def add_arguments_from(node, context = nil)
  node.each_sub_nodes(Hiptest::Nodes::Argument) do |argument|
    @call_types.add_argument_type(argument.children[:name], get_type(argument.children[:value], context))
  end
end
gather_actionwords_default_parameters_types(project) click to toggle source
# File lib/hiptest-publisher/node_modifiers/parameter_type_adder.rb, line 40
def gather_actionwords_default_parameters_types(project)
  project.children[:actionwords].children[:actionwords].each do |actionword|
    @call_types.add_callable_item(actionword.children[:name], Hiptest::Nodes::Actionword)
    actionword.each_sub_nodes(Hiptest::Nodes::Parameter) do |parameter|
      default = parameter.children[:default]
      next if default.nil?
      @call_types.add_argument_type(parameter.children[:name], get_type(default))
    end
  end
end
gather_call_argument_types(node) click to toggle source
# File lib/hiptest-publisher/node_modifiers/parameter_type_adder.rb, line 51
def gather_call_argument_types(node)
  node.each_sub_nodes(Hiptest::Nodes::Call) do |call|
    actionword_name = call.children[:actionword]

    @call_types.add_callable_item(actionword_name, Hiptest::Nodes::Actionword)
    add_arguments_from(call, node)
  end
end
gather_scenarios_argument_types(project) click to toggle source
# File lib/hiptest-publisher/node_modifiers/parameter_type_adder.rb, line 33
def gather_scenarios_argument_types(project)
  project.children[:scenarios].children[:scenarios].each do |scenario|
    @call_types.add_callable_item(scenario.children[:name], Hiptest::Nodes::Scenario)
    add_arguments_from(scenario.children[:datatable])
  end
end
process(project) click to toggle source
# File lib/hiptest-publisher/node_modifiers/parameter_type_adder.rb, line 17
def process(project)
  gather_scenarios_argument_types(project)
  gather_actionwords_default_parameters_types(project)

  # To have the most accurate type, the closest calls must be computed
  # first, and deepest calls must be computed last (because they  depend
  # on previous calls types).
  distances_index = Hiptest::ProjectGrapher.distances_index(project)
  distances_index.each_value do |items|  # distances_index items are sorted by distance, from closest to deepest
    items.each do |item|
      write_parameter_types_to_item(item)
      gather_call_argument_types(item)
    end
  end
end
write_parameter_types_to_item(callable_item) click to toggle source
# File lib/hiptest-publisher/node_modifiers/parameter_type_adder.rb, line 60
def write_parameter_types_to_item(callable_item)
  callable_item.each_sub_nodes(Hiptest::Nodes::Parameter) do |parameter|
    parameter.children[:type] = @call_types.type_of(callable_item.children[:name], parameter.children[:name], callable_item.class)
  end
end

Private Instance Methods

get_type(value, context = nil) click to toggle source
# File lib/hiptest-publisher/node_modifiers/parameter_type_adder.rb, line 74
def get_type(value, context = nil)
  case value
    when Hiptest::Nodes::StringLiteral, Hiptest::Nodes::Template then :String
    when Hiptest::Nodes::NumericLiteral then value.children[:value].to_s.include?(".") ? :float : :int
    when Hiptest::Nodes::BooleanLiteral then :bool
    when Hiptest::Nodes::Variable then get_var_value(value.children[:name], context)
    else :null
  end
end
get_var_value(name, context) click to toggle source
# File lib/hiptest-publisher/node_modifiers/parameter_type_adder.rb, line 84
def get_var_value(name, context)
  return :null if context.nil? || context.children[:parameters].nil?

  context.children[:parameters].each do |param|
    if param.children[:name] == name
      return param.children[:type] || :null
    end
  end

  return :null
end