/*
 * Copyright (C) 2011 Apple Inc. All rights reserved.
 *
 * 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 "config.h"
#include <wtf/CheckedArithmetic.h>

namespace TestWebKitAPI {

#define CheckedArithmeticTest(type, coerceLiteral, MixedSignednessTest) \
    TEST(WTF, Checked_##type) \
    { \
        Checked<type, RecordOverflow> value; \
        EXPECT_EQ(coerceLiteral(0), value.unsafeGet()); \
        EXPECT_EQ(std::numeric_limits<type>::max(), (value + std::numeric_limits<type>::max()).unsafeGet()); \
        EXPECT_EQ(std::numeric_limits<type>::max(), (std::numeric_limits<type>::max() + value).unsafeGet()); \
        EXPECT_EQ(std::numeric_limits<type>::min(), (value + std::numeric_limits<type>::min()).unsafeGet()); \
        EXPECT_EQ(std::numeric_limits<type>::min(), (std::numeric_limits<type>::min() + value).unsafeGet()); \
        EXPECT_EQ(coerceLiteral(0), (value * coerceLiteral(0)).unsafeGet()); \
        EXPECT_EQ(coerceLiteral(0), (coerceLiteral(0) * value).unsafeGet()); \
        EXPECT_EQ(coerceLiteral(0), (value * value).unsafeGet()); \
        EXPECT_EQ(coerceLiteral(0), (value - coerceLiteral(0)).unsafeGet()); \
        EXPECT_EQ(coerceLiteral(0), (coerceLiteral(0) - value).unsafeGet()); \
        EXPECT_EQ(coerceLiteral(0), (value - value).unsafeGet()); \
        EXPECT_EQ(coerceLiteral(0), (value++).unsafeGet()); \
        EXPECT_EQ(coerceLiteral(1), (value--).unsafeGet()); \
        EXPECT_EQ(coerceLiteral(1), (++value).unsafeGet()); \
        EXPECT_EQ(coerceLiteral(0), (--value).unsafeGet()); \
        EXPECT_EQ(coerceLiteral(10), (value += coerceLiteral(10)).unsafeGet()); \
        EXPECT_EQ(coerceLiteral(10), value.unsafeGet()); \
        EXPECT_EQ(coerceLiteral(100), (value *= coerceLiteral(10)).unsafeGet()); \
        EXPECT_EQ(coerceLiteral(100), value.unsafeGet()); \
        EXPECT_EQ(coerceLiteral(0), (value -= coerceLiteral(100)).unsafeGet()); \
        EXPECT_EQ(coerceLiteral(0), value.unsafeGet()); \
        value = 10; \
        EXPECT_EQ(coerceLiteral(10), value.unsafeGet()); \
        EXPECT_EQ(coerceLiteral(0), (value - coerceLiteral(10)).unsafeGet()); \
        EXPECT_EQ(coerceLiteral(10), value.unsafeGet()); \
        value = std::numeric_limits<type>::min(); \
        EXPECT_EQ(true, (Checked<type, RecordOverflow>(value - coerceLiteral(1))).hasOverflowed()); \
        EXPECT_EQ(true, !((value--).hasOverflowed())); \
        EXPECT_EQ(true, value.hasOverflowed()); \
        value = std::numeric_limits<type>::max(); \
        EXPECT_EQ(true, !value.hasOverflowed()); \
        EXPECT_EQ(true, (Checked<type, RecordOverflow>(value + coerceLiteral(1))).hasOverflowed()); \
        EXPECT_EQ(true, !(value++).hasOverflowed()); \
        EXPECT_EQ(true, value.hasOverflowed()); \
        value = std::numeric_limits<type>::max(); \
        EXPECT_EQ(true, (value += coerceLiteral(1)).hasOverflowed()); \
        EXPECT_EQ(true, value.hasOverflowed()); \
        value = 10; \
        MixedSignednessTest(EXPECT_EQ(coerceLiteral(0), (value + -10).unsafeGet())); \
        MixedSignednessTest(EXPECT_EQ(0U, (value - 10U).unsafeGet())); \
        MixedSignednessTest(EXPECT_EQ(coerceLiteral(0), (-10 + value).unsafeGet())); \
        MixedSignednessTest(EXPECT_EQ(0U, (10U - value).unsafeGet())); \
        value = std::numeric_limits<type>::min(); \
        MixedSignednessTest(EXPECT_EQ(true, (Checked<type, RecordOverflow>(value - 1)).hasOverflowed())); \
        MixedSignednessTest(EXPECT_EQ(true, !(value--).hasOverflowed())); \
        MixedSignednessTest(EXPECT_EQ(true, value.hasOverflowed())); \
        value = std::numeric_limits<type>::max(); \
        MixedSignednessTest(EXPECT_EQ(true, !value.hasOverflowed())); \
        MixedSignednessTest(EXPECT_EQ(true, (Checked<type, RecordOverflow>(value + 1)).hasOverflowed())); \
        MixedSignednessTest(EXPECT_EQ(true, !(value++).hasOverflowed())); \
        MixedSignednessTest(EXPECT_EQ(true, value.hasOverflowed())); \
        value = std::numeric_limits<type>::max(); \
        MixedSignednessTest(EXPECT_EQ(true, (value += 1).hasOverflowed())); \
        MixedSignednessTest(EXPECT_EQ(true, value.hasOverflowed())); \
        value = std::numeric_limits<type>::min(); \
        MixedSignednessTest(EXPECT_EQ(true, (value - 1U).hasOverflowed())); \
        MixedSignednessTest(EXPECT_EQ(true, !(value--).hasOverflowed())); \
        MixedSignednessTest(EXPECT_EQ(true, value.hasOverflowed())); \
        value = std::numeric_limits<type>::max(); \
        MixedSignednessTest(EXPECT_EQ(true, !value.hasOverflowed())); \
        MixedSignednessTest(EXPECT_EQ(true, (Checked<type, RecordOverflow>(value + 1U)).hasOverflowed())); \
        MixedSignednessTest(EXPECT_EQ(true, !(value++).hasOverflowed())); \
        MixedSignednessTest(EXPECT_EQ(true, value.hasOverflowed())); \
        value = std::numeric_limits<type>::max(); \
        MixedSignednessTest(EXPECT_EQ(true, (value += 1U).hasOverflowed())); \
        MixedSignednessTest(EXPECT_EQ(true, value.hasOverflowed())); \
    }

#define CoerceLiteralToUnsigned(x) x##U
#define CoerceLiteralNop(x) x
#define AllowMixedSignednessTest(x) x
#define IgnoreMixedSignednessTest(x)
CheckedArithmeticTest(int8_t, CoerceLiteralNop, IgnoreMixedSignednessTest)
CheckedArithmeticTest(int16_t, CoerceLiteralNop, IgnoreMixedSignednessTest)
CheckedArithmeticTest(int32_t, CoerceLiteralNop, AllowMixedSignednessTest)
CheckedArithmeticTest(uint32_t, CoerceLiteralToUnsigned, AllowMixedSignednessTest)
CheckedArithmeticTest(int64_t, CoerceLiteralNop, IgnoreMixedSignednessTest)
CheckedArithmeticTest(uint64_t, CoerceLiteralToUnsigned, IgnoreMixedSignednessTest)

} // namespace TestWebKitAPI
