/* Self tests for lookup_name_info for GDB, the GNU debugger.

   Copyright (C) 2017-2021 Free Software Foundation, Inc.

   This file is part of GDB.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */

#include "defs.h"
#include "gdbsupport/selftest.h"
#include "symtab.h"

namespace selftests {
namespace lookup_name {

/* Check that removing parameter info out of NAME produces EXPECTED.
   COMPLETION_MODE indicates whether we're testing normal and
   completion mode.  FILE and LINE are used to provide better test
   location information in case the check fails.  */

static void
check_make_paramless (const char *file, int line,
		      enum language lang,
		      const char *name, const char *expected,
		      bool completion_mode)
{
  lookup_name_info lookup_name (name, symbol_name_match_type::FULL,
				completion_mode, true /* ignore_parameters */);
  const char *result = lookup_name.language_lookup_name (lang);

  if (strcmp (result, expected) != 0)
    {
      error (_("%s:%d: make-paramless self-test failed: (completion=%d, lang=%d) "
	       "\"%s\" -> \"%s\", expected \"%s\""),
	     file, line, completion_mode, lang, name,
	     result, expected);
    }
}

static void
run_tests ()
{
  /* Helper for CHECK and CHECK_INCOMPL.  */
#define CHECK_1(INCOMPLETE, LANG, NAME, EXPECTED)			\
  do									\
    {									\
      check_make_paramless (__FILE__, __LINE__,				\
			    LANG, NAME,					\
			    (INCOMPLETE) ? "" : (EXPECTED), false);	\
      check_make_paramless (__FILE__, __LINE__,				\
			    LANG, NAME, EXPECTED, true);		\
    }									\
  while (0)

  /* Check that removing parameter info out of NAME produces EXPECTED.
     Checks both normal and completion modes.  */
#define CHECK(LANG, NAME, EXPECTED)		\
  CHECK_1(false, LANG, NAME, EXPECTED)

  /* Similar, but used when NAME is incomplete -- i.e., NAME has
     unbalanced parentheses.  In this case, looking for the exact name
     should fail / return empty.  */
#define CHECK_INCOMPL(LANG, NAME, EXPECTED)				\
  CHECK_1 (true, LANG, NAME, EXPECTED)

  /* None of these languages support function overloading like C++
     does, so building a nameless lookup name ends up being just the
     same as any other lookup name.  Mainly this serves as smoke test
     that C++-specific code doesn't mess up with other languages that
     use some other scoping character ('.' vs '::').  */
  CHECK (language_ada, "pck.ada_hello", "pck__ada_hello");
  CHECK (language_go, "pck.go_hello", "pck.go_hello");
  CHECK (language_fortran, "mod::func", "mod::func");

  /* D does support function overloading similar to C++, but we're
     missing support for stripping parameters.  At least make sure the
     input name is preserved unmodified.  */
  CHECK (language_d, "pck.d_hello", "pck.d_hello");

  /* Just a few basic tests to make sure
     lookup_name_info::make_paramless is well integrated with
     cp_remove_params_if_any.  gdb/cp-support.c has comprehensive
     testing of C++ specifics.  */
  CHECK (language_cplus, "function()", "function");
  CHECK (language_cplus, "function() const", "function");
  CHECK (language_cplus, "A::B::C()", "A::B::C");
  CHECK (language_cplus, "A::B::C", "A::B::C");

#undef CHECK
#undef CHECK_INCOMPL
}

}} // namespace selftests::lookup_name

void _initialize_lookup_name_info_selftests ();
void
_initialize_lookup_name_info_selftests ()
{
  selftests::register_test ("lookup_name_info",
			    selftests::lookup_name::run_tests);
}
