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

   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 "gdbsupport/packed.h"

namespace selftests {
namespace packed_tests {

enum test_enum
{
  TE_A = 1,
  TE_B = 2,
  TE_C = 3,
  TE_D = 4,
};

gdb_static_assert (sizeof (packed<test_enum, 1>) == 1);
gdb_static_assert (sizeof (packed<test_enum, 2>) == 2);
gdb_static_assert (sizeof (packed<test_enum, 3>) == 3);
gdb_static_assert (sizeof (packed<test_enum, 4>) == 4);

gdb_static_assert (alignof (packed<test_enum, 1>) == 1);
gdb_static_assert (alignof (packed<test_enum, 2>) == 1);
gdb_static_assert (alignof (packed<test_enum, 3>) == 1);
gdb_static_assert (alignof (packed<test_enum, 4>) == 1);

/* Triviality checks.  */
#define CHECK_TRAIT(TRAIT)			\
  static_assert (std::TRAIT<packed<test_enum, 1>>::value, "")

#if HAVE_IS_TRIVIALLY_COPYABLE

CHECK_TRAIT (is_trivially_copyable);
CHECK_TRAIT (is_trivially_copy_constructible);
CHECK_TRAIT (is_trivially_move_constructible);
CHECK_TRAIT (is_trivially_copy_assignable);
CHECK_TRAIT (is_trivially_move_assignable);

#endif

#undef CHECK_TRAIT

/* Entry point.  */

static void
run_tests ()
{
  typedef packed<unsigned int, 2> packed_2;

  packed_2 p1;
  packed_2 p2 (0x0102);
  p1 = 0x0102;

  SELF_CHECK (p1 == p1);
  SELF_CHECK (p1 == p2);
  SELF_CHECK (p1 == 0x0102);
  SELF_CHECK (0x0102 == p1);

  SELF_CHECK (p1 != 0);
  SELF_CHECK (0 != p1);

  SELF_CHECK (p1 != 0x0103);
  SELF_CHECK (0x0103 != p1);

  SELF_CHECK (p1 != 0x01020102);
  SELF_CHECK (0x01020102 != p1);

  SELF_CHECK (p1 != 0x01020000);
  SELF_CHECK (0x01020000 != p1);

  /* Check truncation.  */
  p1 = 0x030102;
  SELF_CHECK (p1 == 0x0102);
  SELF_CHECK (p1 != 0x030102);

  /* Check that the custom std::atomic/packed/T relational operators
     work as intended.  No need for fully comprehensive tests, as all
     operators are defined in the same way, via a macro.  We just want
     to make sure that we can compare atomic-wrapped packed, with
     packed, and with the packed underlying type.  */

  std::atomic<packed<unsigned int, 2>> atomic_packed_2 (0x0102);

  SELF_CHECK (atomic_packed_2 == atomic_packed_2);
  SELF_CHECK (atomic_packed_2 == p1);
  SELF_CHECK (p1 == atomic_packed_2);
  SELF_CHECK (atomic_packed_2 == 0x0102u);
  SELF_CHECK (0x0102u == atomic_packed_2);

  SELF_CHECK (atomic_packed_2 >= 0x0102u);
  SELF_CHECK (atomic_packed_2 <= 0x0102u);
  SELF_CHECK (atomic_packed_2 > 0u);
  SELF_CHECK (atomic_packed_2 < 0x0103u);
  SELF_CHECK (atomic_packed_2 >= 0u);
  SELF_CHECK (atomic_packed_2 <= 0x0102u);
  SELF_CHECK (!(atomic_packed_2 > 0x0102u));
  SELF_CHECK (!(atomic_packed_2 < 0x0102u));

  /* Check std::atomic<packed> truncation behaves the same as without
     std::atomic.  */
  atomic_packed_2 = 0x030102;
  SELF_CHECK (atomic_packed_2 == 0x0102u);
  SELF_CHECK (atomic_packed_2 != 0x030102u);
}

} /* namespace packed_tests */
} /* namespace selftests */

void _initialize_packed_selftests ();
void
_initialize_packed_selftests ()
{
  selftests::register_test ("packed", selftests::packed_tests::run_tests);
}
