/* Self tests for scoped_restore 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 "gdbsupport/scoped_restore.h"

namespace selftests {
namespace scoped_restore_tests {

struct Base {};
struct Derived : Base {};

static int global;

/* Check that we can return a scoped_restore from a function.  Below
   we'll make sure this does the right thing.  */
static scoped_restore_tmpl<int>
make_scoped_restore_global (int value)
{
  return make_scoped_restore (&global, value);
}

static void
run_tests ()
{
  /* Test that single-argument make_scoped_restore restores the
     original value on scope exit.  */
  {
    int integer = 0;
    {
      scoped_restore restore = make_scoped_restore (&integer);
      SELF_CHECK (integer == 0);
      integer = 1;
    }
    SELF_CHECK (integer == 0);
  }

  /* Same, with two-argument make_scoped_restore.  */
  {
    int integer = 0;
    {
      scoped_restore restore = make_scoped_restore (&integer, 1);
      SELF_CHECK (integer == 1);
    }
    SELF_CHECK (integer == 0);
  }

  /* Test releasing a scoped_restore.  */
  {
    int integer = 0;
    {
      scoped_restore restore = make_scoped_restore (&integer, 1);
      SELF_CHECK (integer == 1);
      restore.release ();
    }
    /* The overridden value should persist.  */
    SELF_CHECK (integer == 1);
  }

  /* Test creating a scoped_restore with a value of a type convertible
     to T.  */
  {
    Base *base = nullptr;
    Derived derived;
    {
      scoped_restore restore = make_scoped_restore (&base, &derived);

      SELF_CHECK (base == &derived);
    }
    SELF_CHECK (base == nullptr);
  }

  /* Test calling a function that returns a scoped restore.  Makes
     sure that if the compiler emits a call to the copy ctor, that we
     still do the right thing.  */
  {
    {
      SELF_CHECK (global == 0);
      scoped_restore restore = make_scoped_restore_global (1);
      SELF_CHECK (global == 1);
    }
    SELF_CHECK (global == 0);
  }
}

} /* namespace scoped_restore_tests */
} /* namespace selftests */

void _initialize_scoped_restore_selftests ();
void
_initialize_scoped_restore_selftests ()
{
  selftests::register_test ("scoped_restore",
			    selftests::scoped_restore_tests::run_tests);
}
