/* Self tests for ui_file

   Copyright (C) 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 "defs.h"
#include "gdbsupport/selftest.h"
#include "ui-file.h"

namespace selftests {
namespace file {

static void
check_one (const char *str, int quoter, const char *result)
{
  string_file out;
  out.putstr (str, quoter);
  SELF_CHECK (out.string () == result);
}

static void
run_tests ()
{
  check_one ("basic stuff: \\", '\\',
	     "basic stuff: \\\\");
  check_one ("more basic stuff: \\Q", 'Q',
	     "more basic stuff: \\\\\\Q");
  check_one ("more basic stuff: \\Q", '\0',
	     "more basic stuff: \\Q");

  check_one ("weird stuff: \x1f\x90\n\b\t\f\r\033\007", '\\',
	     "weird stuff: \\037\\220\\n\\b\\t\\f\\r\\e\\a");

  scoped_restore save_7 = make_scoped_restore (&sevenbit_strings, true);
  check_one ("more weird stuff: \xa5", '\\',
	     "more weird stuff: \\245");
}

} /* namespace file*/
} /* namespace selftests */

void _initialize_ui_file_selftest ();
void
_initialize_ui_file_selftest ()
{
  selftests::register_test ("ui-file",
			    selftests::file::run_tests);
}
