// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <assert.h>
#include <inttypes.h>
#include <limits.h>
#include <signal.h>
#include <stdint.h>
#include <wchar.h>

#include <zxtest/zxtest.h>

// stdint.h defines the following types:
// Fixed width types:
// int8_t
// int16_t
// int32_t
// int64_t
// uint8_t
// uint16_t
// uint32_t
// uint64_t

// Minimum width types:
// int_least8_t
// int_least16_t
// int_least32_t
// int_least64_t
// uint_least8_t
// uint_least16_t
// uint_least32_t
// uint_least64_t

// Fast minimum width types:
// int_fast8_t
// int_fast16_t
// int_fast32_t
// int_fast64_t
// uint_fast8_t
// uint_fast16_t
// uint_fast32_t
// uint_fast64_t

// Pointer-sized types:
// intptr_t
// uintptr_t

// Maximum-width types:
// intmax_t
// uintmax_t

// stddef.h defines the following types:
// ptrdiff_t
// size_t
// wchar_t

// signal.h defines the following type:
// sig_atomic_t

// Test sizes.
static_assert(CHAR_BIT == 8, "");

static_assert(sizeof(int8_t) == 1, "");
static_assert(sizeof(int16_t) == 2, "");
static_assert(sizeof(int32_t) == 4, "");
static_assert(sizeof(int64_t) == 8, "");
static_assert(sizeof(uint8_t) == 1, "");
static_assert(sizeof(uint16_t) == 2, "");
static_assert(sizeof(uint32_t) == 4, "");
static_assert(sizeof(uint64_t) == 8, "");

static_assert(sizeof(int_least8_t) >= 1, "");
static_assert(sizeof(int_least16_t) >= 2, "");
static_assert(sizeof(int_least32_t) >= 4, "");
static_assert(sizeof(int_least64_t) >= 8, "");
static_assert(sizeof(uint_least8_t) >= 1, "");
static_assert(sizeof(uint_least16_t) >= 2, "");
static_assert(sizeof(uint_least32_t) >= 4, "");
static_assert(sizeof(uint_least64_t) >= 8, "");

static_assert(sizeof(int_fast8_t) >= 1, "");
static_assert(sizeof(int_fast16_t) >= 2, "");
static_assert(sizeof(int_fast32_t) >= 4, "");
static_assert(sizeof(int_fast64_t) >= 8, "");
static_assert(sizeof(uint_fast8_t) >= 1, "");
static_assert(sizeof(uint_fast16_t) >= 2, "");
static_assert(sizeof(uint_fast32_t) >= 4, "");
static_assert(sizeof(uint_fast64_t) >= 8, "");

static_assert(sizeof(intptr_t) == sizeof(void*), "");
static_assert(sizeof(uintptr_t) == sizeof(void*), "");

static_assert(sizeof(intmax_t) == 8, "");
static_assert(sizeof(uintmax_t) == 8, "");

static_assert(sizeof(ptrdiff_t) == sizeof(void*), "");
static_assert(sizeof(size_t) == sizeof(void*), "");

// No interesting guarantees can be made about the sizes of these:
// wchar_t
// sig_atomic_t

#define IS_SIGNED(type) ((type)(-1) < (type)(0))

// Check maximums.
#define CHECK_MAX_TYPE(type, TYPE, max_t, MAX) \
  ((max_t)TYPE##_MAX == (MAX >> (CHAR_BIT * (sizeof(max_t) - sizeof(type)))))

#define CHECK_MAX_UNSIGNED(type, TYPE) CHECK_MAX_TYPE(type, TYPE, uintmax_t, UINTMAX_MAX)
#define CHECK_MAX_SIGNED(type, TYPE) CHECK_MAX_TYPE(type, TYPE, intmax_t, INTMAX_MAX)

#define CHECK_MAX(type, TYPE)                                                                    \
  static_assert(IS_SIGNED(type) ? CHECK_MAX_SIGNED(type, TYPE) : CHECK_MAX_UNSIGNED(type, TYPE), \
                "")

CHECK_MAX(int8_t, INT8);
CHECK_MAX(int16_t, INT16);
CHECK_MAX(int32_t, INT32);
CHECK_MAX(int64_t, INT64);
CHECK_MAX(uint8_t, UINT8);
CHECK_MAX(uint16_t, UINT16);
CHECK_MAX(uint32_t, UINT32);
CHECK_MAX(uint64_t, UINT64);

CHECK_MAX(int_least8_t, INT_LEAST8);
CHECK_MAX(int_least16_t, INT_LEAST16);
CHECK_MAX(int_least32_t, INT_LEAST32);
CHECK_MAX(int_least64_t, INT_LEAST64);
CHECK_MAX(uint_least8_t, UINT_LEAST8);
CHECK_MAX(uint_least16_t, UINT_LEAST16);
CHECK_MAX(uint_least32_t, UINT_LEAST32);
CHECK_MAX(uint_least64_t, UINT_LEAST64);

CHECK_MAX(int_fast8_t, INT_FAST8);
CHECK_MAX(int_fast16_t, INT_FAST16);
CHECK_MAX(int_fast32_t, INT_FAST32);
CHECK_MAX(int_fast64_t, INT_FAST64);
CHECK_MAX(uint_fast8_t, UINT_FAST8);
CHECK_MAX(uint_fast16_t, UINT_FAST16);
CHECK_MAX(uint_fast32_t, UINT_FAST32);
CHECK_MAX(uint_fast64_t, UINT_FAST64);

CHECK_MAX(intptr_t, INTPTR);
CHECK_MAX(uintptr_t, UINTPTR);

CHECK_MAX(intmax_t, INTMAX);
CHECK_MAX(uintmax_t, UINTMAX);

CHECK_MAX(ptrdiff_t, PTRDIFF);
CHECK_MAX(size_t, SIZE);
CHECK_MAX(wchar_t, WCHAR);

CHECK_MAX(sig_atomic_t, SIG_ATOMIC);

// Check minimums.
#define CHECK_MIN_TYPE(type, TYPE) \
  ((intmax_t)TYPE##_MIN == (INTMAX_MIN >> (CHAR_BIT * (sizeof(intmax_t) - sizeof(type)))))

#define CHECK_MIN(type, TYPE) static_assert(CHECK_MIN_TYPE(type, TYPE), "")

CHECK_MIN(int8_t, INT8);
CHECK_MIN(int16_t, INT16);
CHECK_MIN(int32_t, INT32);
CHECK_MIN(int64_t, INT64);

CHECK_MIN(int_least8_t, INT_LEAST8);
CHECK_MIN(int_least16_t, INT_LEAST16);
CHECK_MIN(int_least32_t, INT_LEAST32);
CHECK_MIN(int_least64_t, INT_LEAST64);

CHECK_MIN(int_fast8_t, INT_FAST8);
CHECK_MIN(int_fast16_t, INT_FAST16);
CHECK_MIN(int_fast32_t, INT_FAST32);
CHECK_MIN(int_fast64_t, INT_FAST64);

CHECK_MIN(intptr_t, INTPTR);

CHECK_MIN(intmax_t, INTMAX);

CHECK_MIN(ptrdiff_t, PTRDIFF);
static_assert(IS_SIGNED(wchar_t) ? CHECK_MIN_TYPE(wchar_t, WCHAR) : (WCHAR_MIN == 0), "");

static_assert(IS_SIGNED(sig_atomic_t) ? CHECK_MIN_TYPE(sig_atomic_t, SIG_ATOMIC)
                                      : (SIG_ATOMIC_MIN == 0),
              "");

// The INTN_C and UINTN_C macros expand into integer constants
// "corresponding to the type int_leastN_t" and "uint_leastN_t"
// respectively.

static_assert(INT8_C(0) == 0, "");
static_assert(INT8_C(-0x7f - 1) == -0x7f - 1, "");
static_assert(INT8_C(0x7f) == 0x7f, "");

static_assert(INT16_C(0) == 0, "");
static_assert(INT16_C(-0x7fff - 1) == -0x7fff - 1, "");
static_assert(INT16_C(0x7fff) == 0x7fff, "");

static_assert(INT32_C(0) == 0, "");
static_assert(INT32_C(-0x7fffffff - 1) == -0x7fffffff - 1, "");
static_assert(INT32_C(0x7fffffff) == 0x7fffffff, "");

static_assert(INT64_C(0) == 0, "");
static_assert(INT64_C(-0x7fffffffffffffff - 1) == -0x7fffffffffffffff - 1, "");
static_assert(INT64_C(0x7fffffffffffffff) == 0x7fffffffffffffff, "");

static_assert(UINT8_C(0) == 0, "");
static_assert(UINT8_C(0xff) == 0xff, "");

static_assert(UINT16_C(0) == 0, "");
static_assert(UINT16_C(0xffff) == 0xffff, "");

static_assert(UINT32_C(0) == 0, "");
static_assert(UINT32_C(0xffffffff) == 0xffffffff, "");

static_assert(UINT64_C(0) == 0, "");
static_assert(UINT64_C(0xffffffffffffffff) == 0xffffffffffffffff, "");

// Unlike the above, the INTMAX_C and UINTMAX_C macros explicitly
// produce values of type intmax_t and uintmax_t respectively, not
// just compatible values.

// In C, we settle for just comparing for equality.

static_assert(INTMAX_C(0) == 0, "");
static_assert(INTMAX_C(-0xffffffffffffffff - 1) == -0xffffffffffffffff - 1, "");
static_assert(INTMAX_C(0x7fffffffffffffff) == 0x7fffffffffffffff, "");

static_assert(UINTMAX_C(0) == 0, "");
static_assert(UINTMAX_C(0xffffffffffffffff) == 0xffffffffffffffff, "");

// Check PRI* and SCN* format strings.
#define LAST(fmt) (fmt[strlen(fmt) - 1])

// Signed format specifiers.
#define CHECK_d(fmt) EXPECT_EQ(LAST(fmt), 'd', "incorrect format specifier")
#define CHECK_i(fmt) EXPECT_EQ(LAST(fmt), 'i', "incorrect format specifier")

// Unsigned format specifiers. Note that X is only used by printf, and
// not also by scanf.
#define CHECK_o(fmt) EXPECT_EQ(LAST(fmt), 'o', "incorrect format specifier")
#define CHECK_u(fmt) EXPECT_EQ(LAST(fmt), 'u', "incorrect format specifier")
#define CHECK_x(fmt) EXPECT_EQ(LAST(fmt), 'x', "incorrect format specifier")
#define CHECK_X(fmt) EXPECT_EQ(LAST(fmt), 'X', "incorrect format specifier")

#define CHECK_FORMAT_STRINGS(pri, scn, pcheck, scheck, type, max)     \
  do {                                                                \
    pcheck(pri);                                                      \
    scheck(scn);                                                      \
    char buf[256] = {0};                                              \
    ASSERT_GT(snprintf(buf, sizeof(buf), "%" pri, (type)max), 1, ""); \
    type n = (type)0;                                                 \
    ASSERT_EQ(sscanf(buf, "%" scn, &n), 1, "");                       \
    ASSERT_EQ(n, max, "");                                            \
  } while (0)

#define CHECK_SIGNED_FORMATS(size, type, max)                                  \
  do {                                                                         \
    CHECK_FORMAT_STRINGS(PRId##size, SCNd##size, CHECK_d, CHECK_d, type, max); \
    CHECK_FORMAT_STRINGS(PRIi##size, SCNi##size, CHECK_i, CHECK_i, type, max); \
  } while (0)

// Since X is not used by scanf (only x), the last line has PRIX but
// SCNx (upper and lower case).
#define CHECK_UNSIGNED_FORMATS(size, type, max)                                \
  do {                                                                         \
    CHECK_FORMAT_STRINGS(PRIo##size, SCNo##size, CHECK_o, CHECK_o, type, max); \
    CHECK_FORMAT_STRINGS(PRIu##size, SCNu##size, CHECK_u, CHECK_u, type, max); \
    CHECK_FORMAT_STRINGS(PRIx##size, SCNx##size, CHECK_x, CHECK_x, type, max); \
    CHECK_FORMAT_STRINGS(PRIX##size, SCNx##size, CHECK_X, CHECK_x, type, max); \
  } while (0)

#define CHECK_FORMATS(size, type, max)         \
  do {                                         \
    if (IS_SIGNED(type)) {                     \
      CHECK_SIGNED_FORMATS(size, type, max);   \
    } else {                                   \
      CHECK_UNSIGNED_FORMATS(size, type, max); \
    }                                          \
  } while (0)

TEST(IntTypesC, FormatSpecifiers) {
  CHECK_FORMATS(8, int8_t, INT8_MAX);
  CHECK_FORMATS(16, int16_t, INT16_MAX);
  CHECK_FORMATS(32, int32_t, INT32_MAX);
  CHECK_FORMATS(64, int64_t, INT64_MAX);
  CHECK_FORMATS(8, uint8_t, UINT8_MAX);
  CHECK_FORMATS(16, uint16_t, UINT16_MAX);
  CHECK_FORMATS(32, uint32_t, UINT32_MAX);
  CHECK_FORMATS(64, uint64_t, UINT64_MAX);

  CHECK_FORMATS(FAST8, int_fast8_t, INT_FAST8_MAX);
  CHECK_FORMATS(FAST16, int_fast16_t, INT_FAST16_MAX);
  CHECK_FORMATS(FAST32, int_fast32_t, INT_FAST32_MAX);
  CHECK_FORMATS(FAST64, int_fast64_t, INT_FAST64_MAX);
  CHECK_FORMATS(FAST8, uint_fast8_t, UINT_FAST8_MAX);
  CHECK_FORMATS(FAST16, uint_fast16_t, UINT_FAST16_MAX);
  CHECK_FORMATS(FAST32, uint_fast32_t, UINT_FAST32_MAX);
  CHECK_FORMATS(FAST64, uint_fast64_t, UINT_FAST64_MAX);

  CHECK_FORMATS(LEAST8, int_least8_t, INT_LEAST8_MAX);
  CHECK_FORMATS(LEAST16, int_least16_t, INT_LEAST16_MAX);
  CHECK_FORMATS(LEAST32, int_least32_t, INT_LEAST32_MAX);
  CHECK_FORMATS(LEAST64, int_least64_t, INT_LEAST64_MAX);
  CHECK_FORMATS(LEAST8, uint_least8_t, UINT_LEAST8_MAX);
  CHECK_FORMATS(LEAST16, uint_least16_t, UINT_LEAST16_MAX);
  CHECK_FORMATS(LEAST32, uint_least32_t, UINT_LEAST32_MAX);
  CHECK_FORMATS(LEAST64, uint_least64_t, UINT_LEAST64_MAX);

  CHECK_FORMATS(PTR, intptr_t, INTPTR_MAX);
  CHECK_FORMATS(PTR, uintptr_t, UINTPTR_MAX);

  // Note that these are definined in addition to %j
  CHECK_FORMATS(MAX, intmax_t, INTMAX_MAX);
  CHECK_FORMATS(MAX, uintmax_t, UINTMAX_MAX);

  // ptrdiff_t is simply %t.
  // size_t is simply %z.
  // wchar_t is simply %sl.

  // No particular format specifier or macro is defined for sig_atomic_t.
}
