Blame mfbt/tests/TestDefineEnum.cpp

Packit f0b94e
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
Packit f0b94e
   /* vim: set ts=8 sts=2 et sw=2 tw=80: */
Packit f0b94e
/* This Source Code Form is subject to the terms of the Mozilla Public
Packit f0b94e
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
Packit f0b94e
 * You can obtain one at http://mozilla.org/MPL/2.0/. */
Packit f0b94e
Packit f0b94e
#include "mozilla/DefineEnum.h"
Packit f0b94e
Packit f0b94e
// Sanity test for MOZ_DEFINE_ENUM.
Packit f0b94e
Packit f0b94e
MOZ_DEFINE_ENUM(TestEnum1, (EnumeratorA, EnumeratorB, EnumeratorC));
Packit f0b94e
Packit f0b94e
static_assert(EnumeratorA == 0, "Unexpected enumerator value");
Packit f0b94e
static_assert(EnumeratorB == 1, "Unexpected enumerator value");
Packit f0b94e
static_assert(EnumeratorC == 2, "Unexpected enumerator value");
Packit f0b94e
static_assert(kHighestTestEnum1 == EnumeratorC, "Incorrect highest value");
Packit f0b94e
static_assert(kTestEnum1Count == 3, "Incorrect enumerator count");
Packit f0b94e
Packit f0b94e
// Sanity test for MOZ_DEFINE_ENUM_CLASS.
Packit f0b94e
Packit f0b94e
MOZ_DEFINE_ENUM_CLASS(TestEnum2, (A, B, C));
Packit f0b94e
Packit f0b94e
static_assert(TestEnum2::A == TestEnum2(0), "Unexpected enumerator value");
Packit f0b94e
static_assert(TestEnum2::B == TestEnum2(1), "Unexpected enumerator value");
Packit f0b94e
static_assert(TestEnum2::C == TestEnum2(2), "Unexpected enumerator value");
Packit f0b94e
static_assert(kHighestTestEnum2 == TestEnum2::C, "Incorrect highest value");
Packit f0b94e
static_assert(kTestEnum2Count == 3, "Incorrect enumerator count");
Packit f0b94e
Packit f0b94e
// TODO: Test that the _WITH_BASE variants generate enumerators with the
Packit f0b94e
//       correct underlying types. To do this, we need an |UnderlyingType|
Packit f0b94e
//       type trait, which needs compiler support (recent versions of
Packit f0b94e
//       compilers in the GCC family provide an |__underlying_type| builtin
Packit f0b94e
//       for this purpose.
Packit f0b94e
Packit f0b94e
// Sanity test for MOZ_DEFINE_ENUM[_CLASS]_AT_CLASS_SCOPE.
Packit f0b94e
Packit f0b94e
struct TestClass {
Packit f0b94e
  // clang-format off
Packit f0b94e
  MOZ_DEFINE_ENUM_AT_CLASS_SCOPE(
Packit f0b94e
    TestEnum3, (
Packit f0b94e
      EnumeratorA,
Packit f0b94e
      EnumeratorB,
Packit f0b94e
      EnumeratorC
Packit f0b94e
  ));
Packit f0b94e
Packit f0b94e
  MOZ_DEFINE_ENUM_CLASS_AT_CLASS_SCOPE(
Packit f0b94e
    TestEnum4, (
Packit f0b94e
      A,
Packit f0b94e
      B,
Packit f0b94e
      C
Packit f0b94e
  ));
Packit f0b94e
  // clang-format on
Packit f0b94e
Packit f0b94e
  static_assert(EnumeratorA == 0, "Unexpected enumerator value");
Packit f0b94e
  static_assert(EnumeratorB == 1, "Unexpected enumerator value");
Packit f0b94e
  static_assert(EnumeratorC == 2, "Unexpected enumerator value");
Packit f0b94e
  static_assert(sHighestTestEnum3 == EnumeratorC, "Incorrect highest value");
Packit f0b94e
  static_assert(sTestEnum3Count == 3, "Incorrect enumerator count");
Packit f0b94e
Packit f0b94e
  static_assert(TestEnum4::A == TestEnum4(0), "Unexpected enumerator value");
Packit f0b94e
  static_assert(TestEnum4::B == TestEnum4(1), "Unexpected enumerator value");
Packit f0b94e
  static_assert(TestEnum4::C == TestEnum4(2), "Unexpected enumerator value");
Packit f0b94e
  static_assert(sHighestTestEnum4 == TestEnum4::C, "Incorrect highest value");
Packit f0b94e
  static_assert(sTestEnum4Count == 3, "Incorrect enumerator count");
Packit f0b94e
};
Packit f0b94e
Packit f0b94e
Packit f0b94e
// Test that MOZ_DEFINE_ENUM doesn't allow giving enumerators initializers.
Packit f0b94e
Packit f0b94e
#ifdef CONFIRM_COMPILATION_ERRORS
Packit f0b94e
MOZ_DEFINE_ENUM_CLASS(EnumWithInitializer1, (A = -1, B, C))
Packit f0b94e
MOZ_DEFINE_ENUM_CLASS(EnumWithInitializer2, (A = 1, B, C))
Packit f0b94e
MOZ_DEFINE_ENUM_CLASS(EnumWithInitializer3, (A, B = 6, C))
Packit f0b94e
#endif
Packit f0b94e
Packit f0b94e
int
Packit f0b94e
main()
Packit f0b94e
{
Packit f0b94e
  // Nothing to do here, all tests are static_asserts.
Packit f0b94e
  return 0;
Packit f0b94e
}