module T::Props::GeneratedCodeValidation

def self.validate_deserialize(source)

def self.validate_deserialize(source)
  parsed = parse(source)
  # def %<name>(hash)
  #   ...
  # end
  assert_equal(:def, parsed.type)
  name, args, body = parsed.children
  assert_equal(:__t_props_generated_deserialize, name)
  assert_equal(s(:args, s(:arg, :hash)), args)
  assert_equal(:begin, body.type)
  init, *prop_clauses, ret = body.children
  # found = %<prop_count>
  # ...
  # found
  assert_equal(:lvasgn, init.type)
  init_name, init_val = init.children
  assert_equal(:found, init_name)
  assert_equal(:int, init_val.type)
  assert_equal(s(:lvar, :found), ret)
  prop_clauses.each_with_index do |clause, i|
    if i.even?
      validate_deserialize_hash_read(clause)
    else
      validate_deserialize_ivar_set(clause)
    end
  end
end