// Copyright 2013 The Chromium 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 <stddef.h>
#include <stdint.h>

#include <limits>
#include <type_traits>

#if defined(STARBOARD)
// Cobalt might also include the real base that can have conflicts here.
#include "common/third_party/numerics/base_copy/numerics/safe_conversions.h"
#include "common/third_party/numerics/base_copy/numerics/safe_math.h"
#else
#include "base/compiler_specific.h"
#include "base/numerics/safe_conversions.h"
#include "base/numerics/safe_math.h"
#endif

#include "build/build_config.h"
#include "testing/gtest/include/gtest/gtest.h"

#if defined(COMPILER_MSVC) && defined(ARCH_CPU_32_BITS)
#include <mmintrin.h>
#endif

using std::numeric_limits;
using base_copy::CheckedNumeric;
using base_copy::checked_cast;
using base_copy::IsValueInRangeForNumericType;
using base_copy::IsValueNegative;
using base_copy::SizeT;
using base_copy::StrictNumeric;
using base_copy::saturated_cast;
using base_copy::strict_cast;
using base_copy::internal::MaxExponent;
using base_copy::internal::RANGE_VALID;
using base_copy::internal::RANGE_INVALID;
using base_copy::internal::RANGE_OVERFLOW;
using base_copy::internal::RANGE_UNDERFLOW;
using base_copy::internal::SignedIntegerForSize;

// These tests deliberately cause arithmetic overflows. If the compiler is
// aggressive enough, it can const fold these overflows. Disable warnings about
// overflows for const expressions.
#if defined(OS_WIN)
#pragma warning(disable : 4756)
#endif

// This is a helper function for finding the maximum value in Src that can be
// wholy represented as the destination floating-point type.
template <typename Dst, typename Src>
Dst GetMaxConvertibleToFloat()
{
    typedef numeric_limits<Dst> DstLimits;
    typedef numeric_limits<Src> SrcLimits;
    static_assert(SrcLimits::is_specialized, "Source must be numeric.");
    static_assert(DstLimits::is_specialized, "Destination must be numeric.");
    CHECK(DstLimits::is_iec559);

    if (SrcLimits::digits <= DstLimits::digits &&
        MaxExponent<Src>::value <= MaxExponent<Dst>::value)
        return SrcLimits::max();
    Src max = SrcLimits::max() / 2 + (SrcLimits::is_integer ? 1 : 0);
    while (max != static_cast<Src>(static_cast<Dst>(max)))
    {
        max /= 2;
    }
    return static_cast<Dst>(max);
}

// Helper macros to wrap displaying the conversion types and line numbers.
#define TEST_EXPECTED_VALIDITY(expected, actual)                                            \
    EXPECT_EQ(expected, CheckedNumeric<Dst>(actual).IsValid())                              \
        << "Result test: Value " << +(actual).ValueUnsafe() << " as " << dst << " on line " \
        << line;

#define TEST_EXPECTED_SUCCESS(actual) TEST_EXPECTED_VALIDITY(true, actual)
#define TEST_EXPECTED_FAILURE(actual) TEST_EXPECTED_VALIDITY(false, actual)

#define TEST_EXPECTED_VALUE(expected, actual)                                                 \
    EXPECT_EQ(static_cast<Dst>(expected), CheckedNumeric<Dst>(actual).ValueUnsafe())          \
        << "Result test: Value " << +((actual).ValueUnsafe()) << " as " << dst << " on line " \
        << line;

// Signed integer arithmetic.
template <typename Dst>
static void TestSpecializedArithmetic(
    const char *dst,
    int line,
    typename std::enable_if<numeric_limits<Dst>::is_integer && numeric_limits<Dst>::is_signed,
                            int>::type = 0)
{
    typedef numeric_limits<Dst> DstLimits;
    TEST_EXPECTED_FAILURE(-CheckedNumeric<Dst>(DstLimits::min()));
    TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::min()).Abs());
    TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(-1).Abs());

    TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::max()) + -1);
    TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::min()) + -1);
    TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(-DstLimits::max()) + -DstLimits::max());

    TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::min()) - 1);
    TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::min()) - -1);
    TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) - -DstLimits::max());
    TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(-DstLimits::max()) - DstLimits::max());

    TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::min()) * 2);

    TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::min()) / -1);
    TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(-1) / 2);

    // Modulus is legal only for integers.
    TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() % 1);
    TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1);
    TEST_EXPECTED_VALUE(-1, CheckedNumeric<Dst>(-1) % 2);
    TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(-1) % -2);
    TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::min()) % 2);
    TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(DstLimits::max()) % 2);
    // Test all the different modulus combinations.
    TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % CheckedNumeric<Dst>(1));
    TEST_EXPECTED_VALUE(0, 1 % CheckedNumeric<Dst>(1));
    TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1);
    CheckedNumeric<Dst> checked_dst = 1;
    TEST_EXPECTED_VALUE(0, checked_dst %= 1);
}

// Unsigned integer arithmetic.
template <typename Dst>
static void TestSpecializedArithmetic(
    const char *dst,
    int line,
    typename std::enable_if<numeric_limits<Dst>::is_integer && !numeric_limits<Dst>::is_signed,
                            int>::type = 0)
{
    typedef numeric_limits<Dst> DstLimits;
    TEST_EXPECTED_SUCCESS(-CheckedNumeric<Dst>(DstLimits::min()));
    TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::min()).Abs());
    TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::min()) + -1);
    TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::min()) - 1);
    TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::min()) * 2);
    TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) / 2);
    TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::min()).UnsignedAbs());
    TEST_EXPECTED_SUCCESS(CheckedNumeric<typename SignedIntegerForSize<Dst>::type>(
                              std::numeric_limits<typename SignedIntegerForSize<Dst>::type>::min())
                              .UnsignedAbs());

    // Modulus is legal only for integers.
    TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() % 1);
    TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1);
    TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) % 2);
    TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(DstLimits::min()) % 2);
    TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(DstLimits::max()) % 2);
    // Test all the different modulus combinations.
    TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % CheckedNumeric<Dst>(1));
    TEST_EXPECTED_VALUE(0, 1 % CheckedNumeric<Dst>(1));
    TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) % 1);
    CheckedNumeric<Dst> checked_dst = 1;
    TEST_EXPECTED_VALUE(0, checked_dst %= 1);
}

// Floating point arithmetic.
template <typename Dst>
void TestSpecializedArithmetic(
    const char *dst,
    int line,
    typename std::enable_if<numeric_limits<Dst>::is_iec559, int>::type = 0)
{
    typedef numeric_limits<Dst> DstLimits;
    TEST_EXPECTED_SUCCESS(-CheckedNumeric<Dst>(DstLimits::min()));

    TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::min()).Abs());
    TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(-1).Abs());

    TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::min()) + -1);
    TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::max()) + 1);
    TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(-DstLimits::max()) + -DstLimits::max());

    TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) - -DstLimits::max());
    TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(-DstLimits::max()) - DstLimits::max());

    TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::min()) * 2);

    TEST_EXPECTED_VALUE(-0.5, CheckedNumeric<Dst>(-1.0) / 2);
    EXPECT_EQ(static_cast<Dst>(1.0), CheckedNumeric<Dst>(1.0).ValueFloating());
}

// Generic arithmetic tests.
template <typename Dst>
static void TestArithmetic(const char *dst, int line)
{
    typedef numeric_limits<Dst> DstLimits;

    EXPECT_EQ(true, CheckedNumeric<Dst>().IsValid());
    EXPECT_EQ(
        false,
        CheckedNumeric<Dst>(CheckedNumeric<Dst>(DstLimits::max()) * DstLimits::max()).IsValid());
    EXPECT_EQ(static_cast<Dst>(0), CheckedNumeric<Dst>().ValueOrDie());
    EXPECT_EQ(static_cast<Dst>(0), CheckedNumeric<Dst>().ValueOrDefault(1));
    EXPECT_EQ(static_cast<Dst>(1),
              CheckedNumeric<Dst>(CheckedNumeric<Dst>(DstLimits::max()) * DstLimits::max())
                  .ValueOrDefault(1));

    // Test the operator combinations.
    TEST_EXPECTED_VALUE(2, CheckedNumeric<Dst>(1) + CheckedNumeric<Dst>(1));
    TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) - CheckedNumeric<Dst>(1));
    TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) * CheckedNumeric<Dst>(1));
    TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) / CheckedNumeric<Dst>(1));
    TEST_EXPECTED_VALUE(2, 1 + CheckedNumeric<Dst>(1));
    TEST_EXPECTED_VALUE(0, 1 - CheckedNumeric<Dst>(1));
    TEST_EXPECTED_VALUE(1, 1 * CheckedNumeric<Dst>(1));
    TEST_EXPECTED_VALUE(1, 1 / CheckedNumeric<Dst>(1));
    TEST_EXPECTED_VALUE(2, CheckedNumeric<Dst>(1) + 1);
    TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>(1) - 1);
    TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) * 1);
    TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) / 1);
    CheckedNumeric<Dst> checked_dst = 1;
    TEST_EXPECTED_VALUE(2, checked_dst += 1);
    checked_dst = 1;
    TEST_EXPECTED_VALUE(0, checked_dst -= 1);
    checked_dst = 1;
    TEST_EXPECTED_VALUE(1, checked_dst *= 1);
    checked_dst = 1;
    TEST_EXPECTED_VALUE(1, checked_dst /= 1);

    // Generic negation.
    TEST_EXPECTED_VALUE(0, -CheckedNumeric<Dst>());
    TEST_EXPECTED_VALUE(-1, -CheckedNumeric<Dst>(1));
    TEST_EXPECTED_VALUE(1, -CheckedNumeric<Dst>(-1));
    TEST_EXPECTED_VALUE(static_cast<Dst>(DstLimits::max() * -1),
                        -CheckedNumeric<Dst>(DstLimits::max()));

    // Generic absolute value.
    TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>().Abs());
    TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1).Abs());
    TEST_EXPECTED_VALUE(DstLimits::max(), CheckedNumeric<Dst>(DstLimits::max()).Abs());

    // Generic addition.
    TEST_EXPECTED_VALUE(1, (CheckedNumeric<Dst>() + 1));
    TEST_EXPECTED_VALUE(2, (CheckedNumeric<Dst>(1) + 1));
    TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(-1) + 1));
    TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::min()) + 1);
    TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) + DstLimits::max());

    // Generic subtraction.
    TEST_EXPECTED_VALUE(-1, (CheckedNumeric<Dst>() - 1));
    TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(1) - 1));
    TEST_EXPECTED_VALUE(-2, (CheckedNumeric<Dst>(-1) - 1));
    TEST_EXPECTED_SUCCESS(CheckedNumeric<Dst>(DstLimits::max()) - 1);

    // Generic multiplication.
    TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>() * 1));
    TEST_EXPECTED_VALUE(1, (CheckedNumeric<Dst>(1) * 1));
    TEST_EXPECTED_VALUE(-2, (CheckedNumeric<Dst>(-1) * 2));
    TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(0) * 0));
    TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(-1) * 0));
    TEST_EXPECTED_VALUE(0, (CheckedNumeric<Dst>(0) * -1));
    TEST_EXPECTED_FAILURE(CheckedNumeric<Dst>(DstLimits::max()) * DstLimits::max());

    // Generic division.
    TEST_EXPECTED_VALUE(0, CheckedNumeric<Dst>() / 1);
    TEST_EXPECTED_VALUE(1, CheckedNumeric<Dst>(1) / 1);
    TEST_EXPECTED_VALUE(DstLimits::min() / 2, CheckedNumeric<Dst>(DstLimits::min()) / 2);
    TEST_EXPECTED_VALUE(DstLimits::max() / 2, CheckedNumeric<Dst>(DstLimits::max()) / 2);

    TestSpecializedArithmetic<Dst>(dst, line);
}

// Helper macro to wrap displaying the conversion types and line numbers.
#define TEST_ARITHMETIC(Dst) TestArithmetic<Dst>(#Dst, __LINE__)

TEST(SafeNumerics, SignedIntegerMath)
{
    TEST_ARITHMETIC(int8_t);
    TEST_ARITHMETIC(int);
    TEST_ARITHMETIC(intptr_t);
    TEST_ARITHMETIC(intmax_t);
}

TEST(SafeNumerics, UnsignedIntegerMath)
{
    TEST_ARITHMETIC(uint8_t);
    TEST_ARITHMETIC(unsigned int);
    TEST_ARITHMETIC(uintptr_t);
    TEST_ARITHMETIC(uintmax_t);
}

TEST(SafeNumerics, FloatingPointMath)
{
    TEST_ARITHMETIC(float);
    TEST_ARITHMETIC(double);
}

// Enumerates the five different conversions types we need to test.
enum NumericConversionType
{
    SIGN_PRESERVING_VALUE_PRESERVING,
    SIGN_PRESERVING_NARROW,
    SIGN_TO_UNSIGN_WIDEN_OR_EQUAL,
    SIGN_TO_UNSIGN_NARROW,
    UNSIGN_TO_SIGN_NARROW_OR_EQUAL,
};

// Template covering the different conversion tests.
template <typename Dst, typename Src, NumericConversionType conversion>
struct TestNumericConversion
{
};

// EXPECT_EQ wrappers providing specific detail on test failures.
#define TEST_EXPECTED_RANGE(expected, actual)                                                \
    EXPECT_EQ(expected, base_copy::internal::DstRangeRelationToSrcRange<Dst>(actual))             \
        << "Conversion test: " << src << " value " << actual << " to " << dst << " on line " \
        << line;

template <typename Dst, typename Src>
struct TestNumericConversion<Dst, Src, SIGN_PRESERVING_VALUE_PRESERVING>
{
    static void Test(const char *dst, const char *src, int line)
    {
        typedef numeric_limits<Src> SrcLimits;
        typedef numeric_limits<Dst> DstLimits;
        // Integral to floating.
        static_assert(
            (DstLimits::is_iec559 && SrcLimits::is_integer) ||
                // Not floating to integral and...
                (!(DstLimits::is_integer && SrcLimits::is_iec559) &&
                 // Same sign, same numeric, source is narrower or same.
                 ((SrcLimits::is_signed == DstLimits::is_signed && sizeof(Dst) >= sizeof(Src)) ||
                  // Or signed destination and source is smaller
                  (DstLimits::is_signed && sizeof(Dst) > sizeof(Src)))),
            "Comparison must be sign preserving and value preserving");

        const CheckedNumeric<Dst> checked_dst = SrcLimits::max();
        TEST_EXPECTED_SUCCESS(checked_dst);
        if (MaxExponent<Dst>::value > MaxExponent<Src>::value)
        {
            if (MaxExponent<Dst>::value >= MaxExponent<Src>::value * 2 - 1)
            {
                // At least twice larger type.
                TEST_EXPECTED_SUCCESS(SrcLimits::max() * checked_dst);
            }
            else
            {  // Larger, but not at least twice as large.
                TEST_EXPECTED_FAILURE(SrcLimits::max() * checked_dst);
                TEST_EXPECTED_SUCCESS(checked_dst + 1);
            }
        }
        else
        {  // Same width type.
            TEST_EXPECTED_FAILURE(checked_dst + 1);
        }

        TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::max());
        TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1));
        if (SrcLimits::is_iec559)
        {
            TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::max() * static_cast<Src>(-1));
            TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::infinity());
            TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::infinity() * -1);
            TEST_EXPECTED_RANGE(RANGE_INVALID, SrcLimits::quiet_NaN());
        }
        else if (numeric_limits<Src>::is_signed)
        {
            TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(-1));
            TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::min());
        }
    }
};

template <typename Dst, typename Src>
struct TestNumericConversion<Dst, Src, SIGN_PRESERVING_NARROW>
{
    static void Test(const char *dst, const char *src, int line)
    {
        typedef numeric_limits<Src> SrcLimits;
        typedef numeric_limits<Dst> DstLimits;
        static_assert(SrcLimits::is_signed == DstLimits::is_signed,
                      "Destination and source sign must be the same");
        static_assert(sizeof(Dst) < sizeof(Src) || (DstLimits::is_integer && SrcLimits::is_iec559),
                      "Destination must be narrower than source");

        const CheckedNumeric<Dst> checked_dst;
        TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::max());
        TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1));
        TEST_EXPECTED_FAILURE(checked_dst - SrcLimits::max());

        TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max());
        TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1));
        if (SrcLimits::is_iec559)
        {
            TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::max() * -1);
            TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(-1));
            TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::infinity());
            TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::infinity() * -1);
            TEST_EXPECTED_RANGE(RANGE_INVALID, SrcLimits::quiet_NaN());
            if (DstLimits::is_integer)
            {
                if (SrcLimits::digits < DstLimits::digits)
                {
                    TEST_EXPECTED_RANGE(RANGE_OVERFLOW, static_cast<Src>(DstLimits::max()));
                }
                else
                {
                    TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(DstLimits::max()));
                }
                TEST_EXPECTED_RANGE(RANGE_VALID,
                                    static_cast<Src>(GetMaxConvertibleToFloat<Src, Dst>()));
                TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(DstLimits::min()));
            }
        }
        else if (SrcLimits::is_signed)
        {
            TEST_EXPECTED_VALUE(-1, checked_dst - static_cast<Src>(1));
            TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::min());
            TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(-1));
        }
        else
        {
            TEST_EXPECTED_FAILURE(checked_dst - static_cast<Src>(1));
            TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::min());
        }
    }
};

template <typename Dst, typename Src>
struct TestNumericConversion<Dst, Src, SIGN_TO_UNSIGN_WIDEN_OR_EQUAL>
{
    static void Test(const char *dst, const char *src, int line)
    {
        typedef numeric_limits<Src> SrcLimits;
        typedef numeric_limits<Dst> DstLimits;
        static_assert(sizeof(Dst) >= sizeof(Src),
                      "Destination must be equal or wider than source.");
        static_assert(SrcLimits::is_signed, "Source must be signed");
        static_assert(!DstLimits::is_signed, "Destination must be unsigned");

        const CheckedNumeric<Dst> checked_dst;
        TEST_EXPECTED_VALUE(SrcLimits::max(), checked_dst + SrcLimits::max());
        TEST_EXPECTED_FAILURE(checked_dst + static_cast<Src>(-1));
        TEST_EXPECTED_FAILURE(checked_dst + -SrcLimits::max());

        TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::min());
        TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::max());
        TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1));
        TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, static_cast<Src>(-1));
    }
};

template <typename Dst, typename Src>
struct TestNumericConversion<Dst, Src, SIGN_TO_UNSIGN_NARROW>
{
    static void Test(const char *dst, const char *src, int line)
    {
        typedef numeric_limits<Src> SrcLimits;
        typedef numeric_limits<Dst> DstLimits;
        static_assert(
            (DstLimits::is_integer && SrcLimits::is_iec559) || (sizeof(Dst) < sizeof(Src)),
            "Destination must be narrower than source.");
        static_assert(SrcLimits::is_signed, "Source must be signed.");
        static_assert(!DstLimits::is_signed, "Destination must be unsigned.");

        const CheckedNumeric<Dst> checked_dst;
        TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1));
        TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::max());
        TEST_EXPECTED_FAILURE(checked_dst + static_cast<Src>(-1));
        TEST_EXPECTED_FAILURE(checked_dst + -SrcLimits::max());

        TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max());
        TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1));
        TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, static_cast<Src>(-1));
        if (SrcLimits::is_iec559)
        {
            TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::max() * -1);
            TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::infinity());
            TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::infinity() * -1);
            TEST_EXPECTED_RANGE(RANGE_INVALID, SrcLimits::quiet_NaN());
            if (DstLimits::is_integer)
            {
                if (SrcLimits::digits < DstLimits::digits)
                {
                    TEST_EXPECTED_RANGE(RANGE_OVERFLOW, static_cast<Src>(DstLimits::max()));
                }
                else
                {
                    TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(DstLimits::max()));
                }
                TEST_EXPECTED_RANGE(RANGE_VALID,
                                    static_cast<Src>(GetMaxConvertibleToFloat<Src, Dst>()));
                TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(DstLimits::min()));
            }
        }
        else
        {
            TEST_EXPECTED_RANGE(RANGE_UNDERFLOW, SrcLimits::min());
        }
    }
};

template <typename Dst, typename Src>
struct TestNumericConversion<Dst, Src, UNSIGN_TO_SIGN_NARROW_OR_EQUAL>
{
    static void Test(const char *dst, const char *src, int line)
    {
        typedef numeric_limits<Src> SrcLimits;
        typedef numeric_limits<Dst> DstLimits;
        static_assert(sizeof(Dst) <= sizeof(Src),
                      "Destination must be narrower or equal to source.");
        static_assert(!SrcLimits::is_signed, "Source must be unsigned.");
        static_assert(DstLimits::is_signed, "Destination must be signed.");

        const CheckedNumeric<Dst> checked_dst;
        TEST_EXPECTED_VALUE(1, checked_dst + static_cast<Src>(1));
        TEST_EXPECTED_FAILURE(checked_dst + SrcLimits::max());
        TEST_EXPECTED_VALUE(SrcLimits::min(), checked_dst + SrcLimits::min());

        TEST_EXPECTED_RANGE(RANGE_VALID, SrcLimits::min());
        TEST_EXPECTED_RANGE(RANGE_OVERFLOW, SrcLimits::max());
        TEST_EXPECTED_RANGE(RANGE_VALID, static_cast<Src>(1));
    }
};

// Helper macro to wrap displaying the conversion types and line numbers
#define TEST_NUMERIC_CONVERSION(d, s, t) TestNumericConversion<d, s, t>::Test(#d, #s, __LINE__)

TEST(SafeNumerics, IntMinOperations)
{
    TEST_NUMERIC_CONVERSION(int8_t, int8_t, SIGN_PRESERVING_VALUE_PRESERVING);
    TEST_NUMERIC_CONVERSION(uint8_t, uint8_t, SIGN_PRESERVING_VALUE_PRESERVING);

    TEST_NUMERIC_CONVERSION(int8_t, int, SIGN_PRESERVING_NARROW);
    TEST_NUMERIC_CONVERSION(uint8_t, unsigned int, SIGN_PRESERVING_NARROW);
    TEST_NUMERIC_CONVERSION(int8_t, float, SIGN_PRESERVING_NARROW);

    TEST_NUMERIC_CONVERSION(uint8_t, int8_t, SIGN_TO_UNSIGN_WIDEN_OR_EQUAL);

    TEST_NUMERIC_CONVERSION(uint8_t, int, SIGN_TO_UNSIGN_NARROW);
    TEST_NUMERIC_CONVERSION(uint8_t, intmax_t, SIGN_TO_UNSIGN_NARROW);
    TEST_NUMERIC_CONVERSION(uint8_t, float, SIGN_TO_UNSIGN_NARROW);

    TEST_NUMERIC_CONVERSION(int8_t, unsigned int, UNSIGN_TO_SIGN_NARROW_OR_EQUAL);
    TEST_NUMERIC_CONVERSION(int8_t, uintmax_t, UNSIGN_TO_SIGN_NARROW_OR_EQUAL);
}

TEST(SafeNumerics, IntOperations)
{
    TEST_NUMERIC_CONVERSION(int, int, SIGN_PRESERVING_VALUE_PRESERVING);
    TEST_NUMERIC_CONVERSION(unsigned int, unsigned int, SIGN_PRESERVING_VALUE_PRESERVING);
    TEST_NUMERIC_CONVERSION(int, int8_t, SIGN_PRESERVING_VALUE_PRESERVING);
    TEST_NUMERIC_CONVERSION(unsigned int, uint8_t, SIGN_PRESERVING_VALUE_PRESERVING);
    TEST_NUMERIC_CONVERSION(int, uint8_t, SIGN_PRESERVING_VALUE_PRESERVING);

    TEST_NUMERIC_CONVERSION(int, intmax_t, SIGN_PRESERVING_NARROW);
    TEST_NUMERIC_CONVERSION(unsigned int, uintmax_t, SIGN_PRESERVING_NARROW);
    TEST_NUMERIC_CONVERSION(int, float, SIGN_PRESERVING_NARROW);
    TEST_NUMERIC_CONVERSION(int, double, SIGN_PRESERVING_NARROW);

    TEST_NUMERIC_CONVERSION(unsigned int, int, SIGN_TO_UNSIGN_WIDEN_OR_EQUAL);
    TEST_NUMERIC_CONVERSION(unsigned int, int8_t, SIGN_TO_UNSIGN_WIDEN_OR_EQUAL);

    TEST_NUMERIC_CONVERSION(unsigned int, intmax_t, SIGN_TO_UNSIGN_NARROW);
    TEST_NUMERIC_CONVERSION(unsigned int, float, SIGN_TO_UNSIGN_NARROW);
    TEST_NUMERIC_CONVERSION(unsigned int, double, SIGN_TO_UNSIGN_NARROW);

    TEST_NUMERIC_CONVERSION(int, unsigned int, UNSIGN_TO_SIGN_NARROW_OR_EQUAL);
    TEST_NUMERIC_CONVERSION(int, uintmax_t, UNSIGN_TO_SIGN_NARROW_OR_EQUAL);
}

TEST(SafeNumerics, IntMaxOperations)
{
    TEST_NUMERIC_CONVERSION(intmax_t, intmax_t, SIGN_PRESERVING_VALUE_PRESERVING);
    TEST_NUMERIC_CONVERSION(uintmax_t, uintmax_t, SIGN_PRESERVING_VALUE_PRESERVING);
    TEST_NUMERIC_CONVERSION(intmax_t, int, SIGN_PRESERVING_VALUE_PRESERVING);
    TEST_NUMERIC_CONVERSION(uintmax_t, unsigned int, SIGN_PRESERVING_VALUE_PRESERVING);
    TEST_NUMERIC_CONVERSION(intmax_t, unsigned int, SIGN_PRESERVING_VALUE_PRESERVING);
    TEST_NUMERIC_CONVERSION(intmax_t, uint8_t, SIGN_PRESERVING_VALUE_PRESERVING);

    TEST_NUMERIC_CONVERSION(intmax_t, float, SIGN_PRESERVING_NARROW);
    TEST_NUMERIC_CONVERSION(intmax_t, double, SIGN_PRESERVING_NARROW);

    TEST_NUMERIC_CONVERSION(uintmax_t, int, SIGN_TO_UNSIGN_WIDEN_OR_EQUAL);
    TEST_NUMERIC_CONVERSION(uintmax_t, int8_t, SIGN_TO_UNSIGN_WIDEN_OR_EQUAL);

    TEST_NUMERIC_CONVERSION(uintmax_t, float, SIGN_TO_UNSIGN_NARROW);
    TEST_NUMERIC_CONVERSION(uintmax_t, double, SIGN_TO_UNSIGN_NARROW);

    TEST_NUMERIC_CONVERSION(intmax_t, uintmax_t, UNSIGN_TO_SIGN_NARROW_OR_EQUAL);
}

TEST(SafeNumerics, FloatOperations)
{
    TEST_NUMERIC_CONVERSION(float, intmax_t, SIGN_PRESERVING_VALUE_PRESERVING);
    TEST_NUMERIC_CONVERSION(float, uintmax_t, SIGN_PRESERVING_VALUE_PRESERVING);
    TEST_NUMERIC_CONVERSION(float, int, SIGN_PRESERVING_VALUE_PRESERVING);
    TEST_NUMERIC_CONVERSION(float, unsigned int, SIGN_PRESERVING_VALUE_PRESERVING);

    TEST_NUMERIC_CONVERSION(float, double, SIGN_PRESERVING_NARROW);
}

TEST(SafeNumerics, DoubleOperations)
{
    TEST_NUMERIC_CONVERSION(double, intmax_t, SIGN_PRESERVING_VALUE_PRESERVING);
    TEST_NUMERIC_CONVERSION(double, uintmax_t, SIGN_PRESERVING_VALUE_PRESERVING);
    TEST_NUMERIC_CONVERSION(double, int, SIGN_PRESERVING_VALUE_PRESERVING);
    TEST_NUMERIC_CONVERSION(double, unsigned int, SIGN_PRESERVING_VALUE_PRESERVING);
}

TEST(SafeNumerics, SizeTOperations)
{
    TEST_NUMERIC_CONVERSION(size_t, int, SIGN_TO_UNSIGN_WIDEN_OR_EQUAL);
    TEST_NUMERIC_CONVERSION(int, size_t, UNSIGN_TO_SIGN_NARROW_OR_EQUAL);
}

TEST(SafeNumerics, CastTests)
{
// MSVC catches and warns that we're forcing saturation in these tests.
// Since that's intentional, we need to shut this warning off.
#if defined(COMPILER_MSVC)
#pragma warning(disable : 4756)
#endif

    int small_positive      = 1;
    int small_negative      = -1;
    double double_small     = 1.0;
    double double_large     = numeric_limits<double>::max();
    double double_infinity  = numeric_limits<float>::infinity();
    double double_large_int = numeric_limits<int>::max();
    double double_small_int = numeric_limits<int>::min();

    // Just test that the casts compile, since the other tests cover logic.
    EXPECT_EQ(0, checked_cast<int>(static_cast<size_t>(0)));
    EXPECT_EQ(0, strict_cast<int>(static_cast<char>(0)));
    EXPECT_EQ(0, strict_cast<int>(static_cast<unsigned char>(0)));
    EXPECT_EQ(0U, strict_cast<unsigned>(static_cast<unsigned char>(0)));
    EXPECT_EQ(1ULL, static_cast<uint64_t>(StrictNumeric<size_t>(1U)));
    EXPECT_EQ(1ULL, static_cast<uint64_t>(SizeT(1U)));
    EXPECT_EQ(1U, static_cast<size_t>(StrictNumeric<unsigned>(1U)));

    EXPECT_TRUE(CheckedNumeric<uint64_t>(StrictNumeric<unsigned>(1U)).IsValid());
    EXPECT_TRUE(CheckedNumeric<int>(StrictNumeric<unsigned>(1U)).IsValid());
    EXPECT_FALSE(CheckedNumeric<unsigned>(StrictNumeric<int>(-1)).IsValid());

    EXPECT_TRUE(IsValueNegative(-1));
    EXPECT_TRUE(IsValueNegative(numeric_limits<int>::min()));
    EXPECT_FALSE(IsValueNegative(numeric_limits<unsigned>::min()));
    EXPECT_TRUE(IsValueNegative(-numeric_limits<double>::max()));
    EXPECT_FALSE(IsValueNegative(0));
    EXPECT_FALSE(IsValueNegative(1));
    EXPECT_FALSE(IsValueNegative(0u));
    EXPECT_FALSE(IsValueNegative(1u));
    EXPECT_FALSE(IsValueNegative(numeric_limits<int>::max()));
    EXPECT_FALSE(IsValueNegative(numeric_limits<unsigned>::max()));
    EXPECT_FALSE(IsValueNegative(numeric_limits<double>::max()));

    // These casts and coercions will fail to compile:
    // EXPECT_EQ(0, strict_cast<int>(static_cast<size_t>(0)));
    // EXPECT_EQ(0, strict_cast<size_t>(static_cast<int>(0)));
    // EXPECT_EQ(1ULL, StrictNumeric<size_t>(1));
    // EXPECT_EQ(1, StrictNumeric<size_t>(1U));

    // Test various saturation corner cases.
    EXPECT_EQ(saturated_cast<int>(small_negative), static_cast<int>(small_negative));
    EXPECT_EQ(saturated_cast<int>(small_positive), static_cast<int>(small_positive));
    EXPECT_EQ(saturated_cast<unsigned>(small_negative), static_cast<unsigned>(0));
    EXPECT_EQ(saturated_cast<int>(double_small), static_cast<int>(double_small));
    EXPECT_EQ(saturated_cast<int>(double_large), numeric_limits<int>::max());
    EXPECT_EQ(saturated_cast<float>(double_large), double_infinity);
    EXPECT_EQ(saturated_cast<float>(-double_large), -double_infinity);
    EXPECT_EQ(numeric_limits<int>::min(), saturated_cast<int>(double_small_int));
    EXPECT_EQ(numeric_limits<int>::max(), saturated_cast<int>(double_large_int));

    float not_a_number =
        std::numeric_limits<float>::infinity() - std::numeric_limits<float>::infinity();
    EXPECT_TRUE(std::isnan(not_a_number));
    EXPECT_EQ(0, saturated_cast<int>(not_a_number));
}

#if GTEST_HAS_DEATH_TEST

TEST(SafeNumerics, SaturatedCastChecks)
{
    float not_a_number =
        std::numeric_limits<float>::infinity() - std::numeric_limits<float>::infinity();
    EXPECT_TRUE(std::isnan(not_a_number));
    EXPECT_DEATH((saturated_cast<int, base_copy::SaturatedCastNaNBehaviorCheck>(not_a_number)), "");
}

#endif  // GTEST_HAS_DEATH_TEST

TEST(SafeNumerics, IsValueInRangeForNumericType)
{
    EXPECT_TRUE(IsValueInRangeForNumericType<uint32_t>(0));
    EXPECT_TRUE(IsValueInRangeForNumericType<uint32_t>(1));
    EXPECT_TRUE(IsValueInRangeForNumericType<uint32_t>(2));
    EXPECT_FALSE(IsValueInRangeForNumericType<uint32_t>(-1));
    EXPECT_TRUE(IsValueInRangeForNumericType<uint32_t>(0xffffffffu));
    EXPECT_TRUE(IsValueInRangeForNumericType<uint32_t>(UINT64_C(0xffffffff)));
    EXPECT_FALSE(IsValueInRangeForNumericType<uint32_t>(UINT64_C(0x100000000)));
    EXPECT_FALSE(IsValueInRangeForNumericType<uint32_t>(UINT64_C(0x100000001)));
    EXPECT_FALSE(IsValueInRangeForNumericType<uint32_t>(std::numeric_limits<int32_t>::min()));
    EXPECT_FALSE(IsValueInRangeForNumericType<uint32_t>(std::numeric_limits<int64_t>::min()));

    EXPECT_TRUE(IsValueInRangeForNumericType<int32_t>(0));
    EXPECT_TRUE(IsValueInRangeForNumericType<int32_t>(1));
    EXPECT_TRUE(IsValueInRangeForNumericType<int32_t>(2));
    EXPECT_TRUE(IsValueInRangeForNumericType<int32_t>(-1));
    EXPECT_TRUE(IsValueInRangeForNumericType<int32_t>(0x7fffffff));
    EXPECT_TRUE(IsValueInRangeForNumericType<int32_t>(0x7fffffffu));
    EXPECT_FALSE(IsValueInRangeForNumericType<int32_t>(0x80000000u));
    EXPECT_FALSE(IsValueInRangeForNumericType<int32_t>(0xffffffffu));
    EXPECT_FALSE(IsValueInRangeForNumericType<int32_t>(INT64_C(0x80000000)));
    EXPECT_FALSE(IsValueInRangeForNumericType<int32_t>(INT64_C(0xffffffff)));
    EXPECT_FALSE(IsValueInRangeForNumericType<int32_t>(INT64_C(0x100000000)));
    EXPECT_TRUE(IsValueInRangeForNumericType<int32_t>(std::numeric_limits<int32_t>::min()));
    EXPECT_TRUE(IsValueInRangeForNumericType<int32_t>(
        static_cast<int64_t>(std::numeric_limits<int32_t>::min())));
    EXPECT_FALSE(IsValueInRangeForNumericType<int32_t>(
        static_cast<int64_t>(std::numeric_limits<int32_t>::min()) - 1));
    EXPECT_FALSE(IsValueInRangeForNumericType<int32_t>(std::numeric_limits<int64_t>::min()));

    EXPECT_TRUE(IsValueInRangeForNumericType<uint64_t>(0));
    EXPECT_TRUE(IsValueInRangeForNumericType<uint64_t>(1));
    EXPECT_TRUE(IsValueInRangeForNumericType<uint64_t>(2));
    EXPECT_FALSE(IsValueInRangeForNumericType<uint64_t>(-1));
    EXPECT_TRUE(IsValueInRangeForNumericType<uint64_t>(0xffffffffu));
    EXPECT_TRUE(IsValueInRangeForNumericType<uint64_t>(UINT64_C(0xffffffff)));
    EXPECT_TRUE(IsValueInRangeForNumericType<uint64_t>(UINT64_C(0x100000000)));
    EXPECT_TRUE(IsValueInRangeForNumericType<uint64_t>(UINT64_C(0x100000001)));
    EXPECT_FALSE(IsValueInRangeForNumericType<uint64_t>(std::numeric_limits<int32_t>::min()));
    EXPECT_FALSE(IsValueInRangeForNumericType<uint64_t>(INT64_C(-1)));
    EXPECT_FALSE(IsValueInRangeForNumericType<uint64_t>(std::numeric_limits<int64_t>::min()));

    EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(0));
    EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(1));
    EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(2));
    EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(-1));
    EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(0x7fffffff));
    EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(0x7fffffffu));
    EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(0x80000000u));
    EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(0xffffffffu));
    EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(INT64_C(0x80000000)));
    EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(INT64_C(0xffffffff)));
    EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(INT64_C(0x100000000)));
    EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(INT64_C(0x7fffffffffffffff)));
    EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(UINT64_C(0x7fffffffffffffff)));
    EXPECT_FALSE(IsValueInRangeForNumericType<int64_t>(UINT64_C(0x8000000000000000)));
    EXPECT_FALSE(IsValueInRangeForNumericType<int64_t>(UINT64_C(0xffffffffffffffff)));
    EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(std::numeric_limits<int32_t>::min()));
    EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(
        static_cast<int64_t>(std::numeric_limits<int32_t>::min())));
    EXPECT_TRUE(IsValueInRangeForNumericType<int64_t>(std::numeric_limits<int64_t>::min()));
}

TEST(SafeNumerics, CompoundNumericOperations)
{
    CheckedNumeric<int> a = 1;
    CheckedNumeric<int> b = 2;
    CheckedNumeric<int> c = 3;
    CheckedNumeric<int> d = 4;
    a += b;
    EXPECT_EQ(3, a.ValueOrDie());
    a -= c;
    EXPECT_EQ(0, a.ValueOrDie());
    d /= b;
    EXPECT_EQ(2, d.ValueOrDie());
    d *= d;
    EXPECT_EQ(4, d.ValueOrDie());

    CheckedNumeric<int> too_large = std::numeric_limits<int>::max();
    EXPECT_TRUE(too_large.IsValid());
    too_large += d;
    EXPECT_FALSE(too_large.IsValid());
    too_large -= d;
    EXPECT_FALSE(too_large.IsValid());
    too_large /= d;
    EXPECT_FALSE(too_large.IsValid());
}
