/* Self tests for gdb_tilde_expand

   Copyright (C) 2021-2022 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 "gdbsupport/common-defs.h"
#include "gdbsupport/selftest.h"
#include <cstdlib>

#include "gdbsupport/gdb_tilde_expand.h"

namespace selftests {
namespace gdb_tilde_expand_tests {

static void
do_test ()
{
  /* Home directory of the user running the test.  */
  const char *c_home = std::getenv ("HOME");

  /* Skip the test if $HOME is not available in the environment.  */
  if (c_home == nullptr)
    return;

  const std::string home (c_home);

  /* Basic situation.  */
  SELF_CHECK (home == gdb_tilde_expand ("~"));

  /* When given a path that begins by a tilde and refers to a file that
     does not exist, gdb_tilde expand must still be able to do the tilde
     expansion.  */
  SELF_CHECK (gdb_tilde_expand ("~/non/existent/directory")
              == home + "/non/existent/directory");

  /* gdb_tilde_expand only expands tilde and does not try to do any other
     substitution.  */
  SELF_CHECK (gdb_tilde_expand ("~/*/a.out") == home + "/*/a.out");

  /* gdb_tilde_expand does no modification to a non tilde leading path.  */
  SELF_CHECK (gdb_tilde_expand ("/some/abs/path") == "/some/abs/path");
  SELF_CHECK (gdb_tilde_expand ("relative/path") == "relative/path");

  /* If $USER is available in the env variables, check the '~user'
     expansion.  */
  const char *c_user = std::getenv ("USER");
  if (c_user != nullptr)
    {
      const std::string user (c_user);
      SELF_CHECK (gdb_tilde_expand (("~" + user).c_str ()) == home);
      SELF_CHECK (gdb_tilde_expand (("~" + user + "/a/b").c_str ())
                  == home + "/a/b");
    }

  /* Check that an error is thrown when trying to expand home of a unknown
     user.  */
  try
    {
      gdb_tilde_expand ("~no_one_should_have_that_login/a");
      SELF_CHECK (false);
    }
  catch (const gdb_exception_error &e)
    {
      SELF_CHECK (e.error == GENERIC_ERROR);
      SELF_CHECK
        (*e.message
         == "Could not find a match for '~no_one_should_have_that_login'.");
    }
}

} /* namespace gdb_tilde_expand_tests */
} /* namespace selftests */

void _initialize_gdb_tilde_expand_selftests ();
void
_initialize_gdb_tilde_expand_selftests ()
{
  selftests::register_test
    ("gdb_tilde_expand", selftests::gdb_tilde_expand_tests::do_test);
}
