/*
 * Copyright (C) 2012 Intel Corporation
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 * THE POSSIBILITY OF SUCH DAMAGE.
 */

#include "wtf/MathExtras.h"

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

namespace WTF {

TEST(MathExtrasTest, Lrint)
{
    EXPECT_EQ(-8, lrint(-7.5));
    EXPECT_EQ(-8, lrint(-8.5));
    EXPECT_EQ(0, lrint(-0.5));
    EXPECT_EQ(0, lrint(0.5));
    EXPECT_EQ(0, lrint(-0.5));
    EXPECT_EQ(1, lrint(1.3));
    EXPECT_EQ(2, lrint(1.7));
    EXPECT_EQ(0, lrint(0));
    EXPECT_EQ(0, lrint(-0));
    if (sizeof(long int) == 8) {
        // Largest double number with 0.5 precision and one halfway rounding case below.
        EXPECT_EQ(pow(2.0, 52), lrint(pow(2.0, 52) - 0.5));
        EXPECT_EQ(pow(2.0, 52) - 2, lrint(pow(2.0, 52) - 1.5));
        // Smallest double number with 0.5 precision and one halfway rounding case above.
        EXPECT_EQ(-pow(2.0, 52), lrint(-pow(2.0, 52) + 0.5));
        EXPECT_EQ(-pow(2.0, 52) + 2, lrint(-pow(2.0, 52) + 1.5));
    }
}

TEST(MathExtrasTest, clampToIntLong)
{
    if (sizeof(long) == sizeof(int))
        return;

    long maxInt = std::numeric_limits<int>::max();
    long minInt = std::numeric_limits<int>::min();
    long overflowInt = maxInt + 1;
    long underflowInt = minInt - 1;

    EXPECT_GT(overflowInt, maxInt);
    EXPECT_LT(underflowInt, minInt);

    EXPECT_EQ(maxInt, clampTo<int>(maxInt));
    EXPECT_EQ(minInt, clampTo<int>(minInt));

    EXPECT_EQ(maxInt, clampTo<int>(overflowInt));
    EXPECT_EQ(minInt, clampTo<int>(underflowInt));
}

TEST(MathExtrasTest, clampToIntLongLong)
{
    long long maxInt = std::numeric_limits<int>::max();
    long long minInt = std::numeric_limits<int>::min();
    long long overflowInt = maxInt + 1;
    long long underflowInt = minInt - 1;

    EXPECT_GT(overflowInt, maxInt);
    EXPECT_LT(underflowInt, minInt);

    EXPECT_EQ(maxInt, clampTo<int>(maxInt));
    EXPECT_EQ(minInt, clampTo<int>(minInt));

    EXPECT_EQ(maxInt, clampTo<int>(overflowInt));
    EXPECT_EQ(minInt, clampTo<int>(underflowInt));
}

TEST(MathExtrasTest, clampToIntFloat)
{
    float maxInt = static_cast<float>(std::numeric_limits<int>::max());
    float minInt = static_cast<float>(std::numeric_limits<int>::min());
    float overflowInt = maxInt * 1.1f;
    float underflowInt = minInt * 1.1f;

    EXPECT_GT(overflowInt, maxInt);
    EXPECT_LT(underflowInt, minInt);

    EXPECT_EQ(maxInt, clampTo<int>(maxInt));
    EXPECT_EQ(minInt, clampTo<int>(minInt));

    EXPECT_EQ(maxInt, clampTo<int>(overflowInt));
    EXPECT_EQ(minInt, clampTo<int>(underflowInt));

    // This value and the value one greater are typically represented the same
    // way when stored in a 32-bit float.  Make sure clamping does not cause us
    // to erroneously jump to the larger value.
    int nearFloatPrecisionLimit = 2147483520;
    EXPECT_EQ(nearFloatPrecisionLimit, clampTo<int>(static_cast<float>(nearFloatPrecisionLimit), 0, nearFloatPrecisionLimit + 1));
    EXPECT_EQ(-nearFloatPrecisionLimit, clampTo<int>(static_cast<float>(-nearFloatPrecisionLimit), -nearFloatPrecisionLimit - 1, 0));
}

TEST(MathExtrasTest, clampToIntDouble)
{
    int maxInt = std::numeric_limits<int>::max();
    int minInt = std::numeric_limits<int>::min();
    double almostOverflowInt = maxInt - 0.5;
    double overflowInt = maxInt + 0.5;
    double almostUnderflowInt = minInt + 0.5;
    double underflowInt = minInt - 0.5;

    EXPECT_LT(almostOverflowInt, maxInt);
    EXPECT_GT(overflowInt, maxInt);
    EXPECT_GT(almostUnderflowInt, minInt);
    EXPECT_LT(underflowInt, minInt);

    EXPECT_EQ(maxInt, clampTo<int>(static_cast<double>(maxInt)));
    EXPECT_EQ(minInt, clampTo<int>(static_cast<double>(minInt)));

    EXPECT_EQ(maxInt - 1, clampTo<int>(almostOverflowInt));
    EXPECT_EQ(maxInt, clampTo<int>(overflowInt));
    EXPECT_EQ(minInt + 1, clampTo<int>(almostUnderflowInt));
    EXPECT_EQ(minInt, clampTo<int>(underflowInt));
}

TEST(MathExtrasTest, clampToFloatDouble)
{
    double maxFloat = std::numeric_limits<float>::max();
    double minFloat = -maxFloat;
    double overflowFloat = maxFloat * 1.1;
    double underflowFloat = minFloat * 1.1;

    EXPECT_GT(overflowFloat, maxFloat);
    EXPECT_LT(underflowFloat, minFloat);

    EXPECT_EQ(maxFloat, clampTo<float>(maxFloat));
    EXPECT_EQ(minFloat, clampTo<float>(minFloat));

    EXPECT_EQ(maxFloat, clampTo<float>(overflowFloat));
    EXPECT_EQ(minFloat, clampTo<float>(underflowFloat));

    EXPECT_EQ(maxFloat, clampTo<float>(std::numeric_limits<float>::infinity()));
    EXPECT_EQ(minFloat, clampTo<float>(-std::numeric_limits<float>::infinity()));
}

TEST(MathExtrasTest, clampToDouble)
{
    EXPECT_EQ(0.0, clampTo<double>(0));
    EXPECT_EQ(0.0, clampTo<double>(0.0f));
    EXPECT_EQ(0.0, clampTo<double>(0ULL));
    EXPECT_EQ(3.5, clampTo<double>(std::numeric_limits<unsigned long long>::max(), 0.0, 3.5));
}

TEST(MathExtrasText, clampToLongLongDouble)
{
    double overflowLL = static_cast<double>(std::numeric_limits<long long>::max()) * 2;
    EXPECT_EQ(std::numeric_limits<long long>::max(), clampTo<long long>(overflowLL));
    EXPECT_EQ(std::numeric_limits<long long>::min(), clampTo<long long>(-overflowLL));
}

TEST(MathExtrasText, clampToUnsignedLongLongDouble)
{
    double overflowULL = static_cast<double>(std::numeric_limits<unsigned long long>::max()) * 2;
    EXPECT_EQ(std::numeric_limits<unsigned long long>::max(), clampTo<unsigned long long>(overflowULL));
    EXPECT_EQ(std::numeric_limits<unsigned long long>::min(), clampTo<unsigned long long>(-overflowULL));
}

TEST(MathExtrasTest, clampToUnsignedUnsignedLong)
{
    if (sizeof(unsigned long) == sizeof(unsigned))
        return;

    unsigned long maxUnsigned = std::numeric_limits<unsigned>::max();
    unsigned long overflowUnsigned = maxUnsigned + 1;

    EXPECT_GT(overflowUnsigned, maxUnsigned);

    EXPECT_EQ(maxUnsigned, clampTo<unsigned>(maxUnsigned));

    EXPECT_EQ(maxUnsigned, clampTo<unsigned>(overflowUnsigned));
    EXPECT_EQ(0u, clampTo<unsigned>(-1));
}

TEST(MathExtrasTest, clampToUnsignedUnsignedLongLong)
{
    unsigned long long maxUnsigned = std::numeric_limits<unsigned>::max();
    unsigned long long overflowUnsigned = maxUnsigned + 1;

    EXPECT_GT(overflowUnsigned, maxUnsigned);

    EXPECT_EQ(maxUnsigned, clampTo<unsigned>(maxUnsigned));

    EXPECT_EQ(maxUnsigned, clampTo<unsigned>(overflowUnsigned));
    EXPECT_EQ(0u, clampTo<unsigned>(-1));
}

TEST(MathExtrasTest, clampToLongLongUnsignedLongLong)
{
    long long maxLongLongLL = std::numeric_limits<long long>::max();
    unsigned long long maxLongLongULL = maxLongLongLL;
    unsigned long long overflowLongLong = maxLongLongULL + 1;

    EXPECT_GT(overflowLongLong, maxLongLongULL);

    EXPECT_EQ(maxLongLongLL, clampTo<long long>(maxLongLongULL));
    EXPECT_EQ(maxLongLongLL - 1, clampTo<long long>(maxLongLongULL - 1));
    EXPECT_EQ(maxLongLongLL, clampTo<long long>(overflowLongLong));

    EXPECT_EQ(-3LL, clampTo<long long>(2ULL, -5LL, -3LL));
}

TEST(MathExtrasTest, clampToUnsignedLongLongInt)
{
    EXPECT_EQ(0ULL, clampTo<unsigned long long>(-1));
    EXPECT_EQ(0ULL, clampTo<unsigned long long>(0));
    EXPECT_EQ(1ULL, clampTo<unsigned long long>(1));
}

TEST(MathExtrasTest, clampToUnsignedLongLongUnsignedLongLong)
{
    EXPECT_EQ(0ULL, clampTo<unsigned long long>(0ULL));
    EXPECT_EQ(1ULL, clampTo<unsigned long long>(0ULL, 1ULL, 2ULL));
    EXPECT_EQ(2ULL, clampTo<unsigned long long>(3ULL, 1ULL, 2ULL));
    EXPECT_EQ(0xFFFFFFFFFFFFFFF5ULL, clampTo<unsigned long long>(0xFFFFFFFFFFFFFFF5ULL));
}

// Make sure that various +-inf cases are handled properly (they aren't
// by default on VS).
TEST(MathExtrasTest, infinityMath)
{
    double posInf = std::numeric_limits<double>::infinity();
    double negInf = -std::numeric_limits<double>::infinity();
    double nan = std::numeric_limits<double>::quiet_NaN();

    EXPECT_EQ(M_PI_4, atan2(posInf, posInf));
    EXPECT_EQ(3.0 * M_PI_4, atan2(posInf, negInf));
    EXPECT_EQ(-M_PI_4, atan2(negInf, posInf));
    EXPECT_EQ(-3.0 * M_PI_4, atan2(negInf, negInf));

    EXPECT_EQ(0.0, fmod(0.0, posInf));
    EXPECT_EQ(7.0, fmod(7.0, posInf));
    EXPECT_EQ(-7.0, fmod(-7.0, posInf));
    EXPECT_EQ(0.0, fmod(0.0, negInf));
    EXPECT_EQ(7.0, fmod(7.0, negInf));
    EXPECT_EQ(-7.0, fmod(-7.0, negInf));

    EXPECT_EQ(1.0, pow(5.0, 0.0));
    EXPECT_EQ(1.0, pow(-5.0, 0.0));
    EXPECT_EQ(1.0, pow(nan, 0.0));
}

} // namespace WTF
