/* SPDX-License-Identifier: BSL-1.0 OR BSD-3-Clause */ #ifndef MPT_BASE_TESTS_SATURATE_CAST_HPP #define MPT_BASE_TESTS_SATURATE_CAST_HPP #include "mpt/base/detect_compiler.hpp" #include "mpt/base/integer.hpp" #include "mpt/base/namespace.hpp" #include "mpt/base/saturate_cast.hpp" #include "mpt/test/test.hpp" #include "mpt/test/test_macros.hpp" #include namespace mpt { inline namespace MPT_INLINE_NS { namespace tests { namespace base { namespace saturate_cast { #if MPT_COMPILER_CLANG #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wglobal-constructors" #endif MPT_TEST_GROUP_INLINE("mpt/base/saturate_cast") #if MPT_COMPILER_CLANG #pragma clang diagnostic pop #endif { // trivials MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(-1), -1); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(0), 0); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(1), 1); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(std::numeric_limits::min()), std::numeric_limits::min()); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(std::numeric_limits::max()), std::numeric_limits::max()); // signed / unsigned MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(std::numeric_limits::min()), std::numeric_limits::min()); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(std::numeric_limits::max()), std::numeric_limits::max()); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(std::numeric_limits::min()), (int32)std::numeric_limits::min()); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(std::numeric_limits::max()), std::numeric_limits::max()); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(std::numeric_limits::min()), (int64)std::numeric_limits::min()); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(std::numeric_limits::max()), std::numeric_limits::max()); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(std::numeric_limits::min()), std::numeric_limits::min()); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(std::numeric_limits::max()), std::numeric_limits::max()); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(std::numeric_limits::min()), std::numeric_limits::min()); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(std::numeric_limits::max()), (uint32)std::numeric_limits::max()); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(std::numeric_limits::min()), std::numeric_limits::min()); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(std::numeric_limits::max()), (uint64)std::numeric_limits::max()); // overflow MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(std::numeric_limits::min() - 1), std::numeric_limits::min()); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(std::numeric_limits::max() + 1), std::numeric_limits::max()); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(std::numeric_limits::min() - int64(1)), std::numeric_limits::min()); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(std::numeric_limits::max() + int64(1)), std::numeric_limits::max()); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(std::numeric_limits::min() - 1), std::numeric_limits::min()); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(std::numeric_limits::max() + 1), (uint16)std::numeric_limits::max() + 1); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(std::numeric_limits::min() - int64(1)), std::numeric_limits::min()); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(std::numeric_limits::max() + int64(1)), (uint32)std::numeric_limits::max() + 1); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(int16(32000)), 127); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(int16(-32000)), -128); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(uint16(32000)), 127); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(uint16(64000)), 127); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(int16(32000)), 255); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(int16(-32000)), 0); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(uint16(32000)), 255); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(uint16(64000)), 255); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(int16(32000)), 32000); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(int16(-32000)), -32000); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(uint16(32000)), 32000); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(uint16(64000)), 32767); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(int16(32000)), 32000); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(int16(-32000)), 0); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(uint16(32000)), 32000); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(uint16(64000)), 64000); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(int16(32000)), 32000); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(int16(-32000)), -32000); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(uint16(32000)), 32000); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(uint16(64000)), 64000); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(int16(32000)), 32000u); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(int16(-32000)), 0u); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(uint16(32000)), 32000u); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(uint16(64000)), 64000u); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(std::numeric_limits::max() - 1), std::numeric_limits::max()); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(std::numeric_limits::max() - 1), std::numeric_limits::max()); MPT_TEST_EXPECT_EQUAL(mpt::saturate_cast(static_cast(std::numeric_limits::max())), std::numeric_limits::max()); } } // namespace saturate_cast } // namespace base } // namespace tests } // namespace MPT_INLINE_NS } // namespace mpt #endif // MPT_BASE_TESTS_SATURATE_CAST_HPP