103232350SGuillaume Chatelet //===-- Unittests for user defined integer literals -----------------------===// 203232350SGuillaume Chatelet // 303232350SGuillaume Chatelet // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 403232350SGuillaume Chatelet // See https://llvm.org/LICENSE.txt for license information. 503232350SGuillaume Chatelet // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 603232350SGuillaume Chatelet // 703232350SGuillaume Chatelet //===----------------------------------------------------------------------===// 803232350SGuillaume Chatelet 903232350SGuillaume Chatelet #include "src/__support/integer_literals.h" 1023c397c7SGuillaume Chatelet #include "src/__support/macros/properties/types.h" // LIBC_TYPES_HAS_INT128 1103232350SGuillaume Chatelet #include "test/UnitTest/Test.h" 1203232350SGuillaume Chatelet 1303232350SGuillaume Chatelet using LIBC_NAMESPACE::operator""_u8; 1403232350SGuillaume Chatelet using LIBC_NAMESPACE::operator""_u16; 1503232350SGuillaume Chatelet using LIBC_NAMESPACE::operator""_u32; 1603232350SGuillaume Chatelet using LIBC_NAMESPACE::operator""_u64; 1703232350SGuillaume Chatelet using LIBC_NAMESPACE::operator""_u128; 1803232350SGuillaume Chatelet using LIBC_NAMESPACE::operator""_u256; 1903232350SGuillaume Chatelet 2003232350SGuillaume Chatelet TEST(LlvmLibcIntegerLiteralTest, u8) { 2103232350SGuillaume Chatelet EXPECT_EQ(uint8_t(0), 0_u8); 2203232350SGuillaume Chatelet EXPECT_EQ(uint8_t(UINT8_MAX), 255_u8); 2303232350SGuillaume Chatelet EXPECT_EQ(uint8_t(UINT8_MAX), 0xFF_u8); 2403232350SGuillaume Chatelet EXPECT_EQ(uint8_t(UINT8_MAX), 0b11111111_u8); 2503232350SGuillaume Chatelet } 2603232350SGuillaume Chatelet 2703232350SGuillaume Chatelet TEST(LlvmLibcIntegerLiteralTest, u16) { 2803232350SGuillaume Chatelet EXPECT_EQ(uint16_t(0), 0_u16); 2903232350SGuillaume Chatelet EXPECT_EQ(uint16_t(UINT8_MAX), 255_u16); 3003232350SGuillaume Chatelet EXPECT_EQ(uint16_t(UINT8_MAX), 0xFF_u16); 3103232350SGuillaume Chatelet EXPECT_EQ(uint16_t(UINT8_MAX), 0b11111111_u16); 3203232350SGuillaume Chatelet EXPECT_EQ(uint16_t(UINT16_MAX), 65535_u16); 3303232350SGuillaume Chatelet EXPECT_EQ(uint16_t(UINT16_MAX), 0xFFFF_u16); 3403232350SGuillaume Chatelet EXPECT_EQ(uint16_t(UINT16_MAX), 0b11111111'11111111_u16); 3503232350SGuillaume Chatelet } 3603232350SGuillaume Chatelet 3703232350SGuillaume Chatelet TEST(LlvmLibcIntegerLiteralTest, u32) { 3803232350SGuillaume Chatelet EXPECT_EQ(uint32_t(0), 0_u32); 3903232350SGuillaume Chatelet EXPECT_EQ(uint32_t(UINT8_MAX), 255_u32); 4003232350SGuillaume Chatelet EXPECT_EQ(uint32_t(UINT8_MAX), 0xFF_u32); 4103232350SGuillaume Chatelet EXPECT_EQ(uint32_t(UINT8_MAX), 0b11111111_u32); 4203232350SGuillaume Chatelet EXPECT_EQ(uint32_t(UINT16_MAX), 65535_u32); 4303232350SGuillaume Chatelet EXPECT_EQ(uint32_t(UINT16_MAX), 0xFFFF_u32); 4403232350SGuillaume Chatelet EXPECT_EQ(uint32_t(UINT16_MAX), 0b11111111'11111111_u32); 4503232350SGuillaume Chatelet EXPECT_EQ(uint32_t(UINT32_MAX), 4294967295_u32); 4603232350SGuillaume Chatelet EXPECT_EQ(uint32_t(UINT32_MAX), 0xFFFFFFFF_u32); 4703232350SGuillaume Chatelet EXPECT_EQ(uint32_t(UINT32_MAX), 0b1111111111111111'1111111111111111_u32); 4803232350SGuillaume Chatelet } 4903232350SGuillaume Chatelet 5003232350SGuillaume Chatelet TEST(LlvmLibcIntegerLiteralTest, u64) { 5103232350SGuillaume Chatelet EXPECT_EQ(uint64_t(0), 0_u64); 5203232350SGuillaume Chatelet EXPECT_EQ(uint64_t(UINT8_MAX), 255_u64); 5303232350SGuillaume Chatelet EXPECT_EQ(uint64_t(UINT8_MAX), 0xFF_u64); 5403232350SGuillaume Chatelet EXPECT_EQ(uint64_t(UINT8_MAX), 0b11111111_u64); 5503232350SGuillaume Chatelet EXPECT_EQ(uint64_t(UINT16_MAX), 65535_u64); 5603232350SGuillaume Chatelet EXPECT_EQ(uint64_t(UINT16_MAX), 0xFFFF_u64); 5703232350SGuillaume Chatelet EXPECT_EQ(uint64_t(UINT16_MAX), 0b11111111'11111111_u64); 5803232350SGuillaume Chatelet EXPECT_EQ(uint64_t(UINT32_MAX), 4294967295_u64); 5903232350SGuillaume Chatelet EXPECT_EQ(uint64_t(UINT32_MAX), 0xFFFFFFFF_u64); 6003232350SGuillaume Chatelet EXPECT_EQ(uint64_t(UINT32_MAX), 0b1111111111111111'1111111111111111_u64); 6103232350SGuillaume Chatelet EXPECT_EQ(uint64_t(UINT64_MAX), 18446744073709551615_u64); 6203232350SGuillaume Chatelet EXPECT_EQ(uint64_t(UINT64_MAX), 0xFFFFFFFF'FFFFFFFF_u64); 6303232350SGuillaume Chatelet EXPECT_EQ( 6403232350SGuillaume Chatelet uint64_t(UINT64_MAX), 6503232350SGuillaume Chatelet 0b1111111111111111'1111111111111111'1111111111111111'1111111111111111_u64); 6603232350SGuillaume Chatelet } 6703232350SGuillaume Chatelet 6803232350SGuillaume Chatelet TEST(LlvmLibcIntegerLiteralTest, u128) { 6923c397c7SGuillaume Chatelet #ifdef LIBC_TYPES_HAS_INT128 7003232350SGuillaume Chatelet const __uint128_t ZERO = 0; 7103232350SGuillaume Chatelet const __uint128_t U8_MAX = UINT8_MAX; 7203232350SGuillaume Chatelet const __uint128_t U16_MAX = UINT16_MAX; 7303232350SGuillaume Chatelet const __uint128_t U32_MAX = UINT32_MAX; 7403232350SGuillaume Chatelet const __uint128_t U64_MAX = UINT64_MAX; 7503232350SGuillaume Chatelet const __uint128_t U128_MAX = (U64_MAX << 64) | U64_MAX; 7603232350SGuillaume Chatelet #else 7703232350SGuillaume Chatelet const UInt128 ZERO = 0; 7803232350SGuillaume Chatelet const UInt128 U8_MAX = UINT8_MAX; 7903232350SGuillaume Chatelet const UInt128 U16_MAX = UINT16_MAX; 8003232350SGuillaume Chatelet const UInt128 U32_MAX = UINT32_MAX; 8103232350SGuillaume Chatelet const UInt128 U64_MAX = UINT64_MAX; 8203232350SGuillaume Chatelet const UInt128 U128_MAX = (U64_MAX << 64) | U64_MAX; 8323c397c7SGuillaume Chatelet #endif // LIBC_TYPES_HAS_INT128 8403232350SGuillaume Chatelet EXPECT_EQ(ZERO, 0_u128); 8503232350SGuillaume Chatelet EXPECT_EQ(U8_MAX, 255_u128); 8603232350SGuillaume Chatelet EXPECT_EQ(U8_MAX, 0xFF_u128); 8703232350SGuillaume Chatelet EXPECT_EQ(U8_MAX, 0b11111111_u128); 8803232350SGuillaume Chatelet EXPECT_EQ(U16_MAX, 65535_u128); 8903232350SGuillaume Chatelet EXPECT_EQ(U16_MAX, 0xFFFF_u128); 9003232350SGuillaume Chatelet EXPECT_EQ(U16_MAX, 0b11111111'11111111_u128); 9103232350SGuillaume Chatelet EXPECT_EQ(U32_MAX, 4294967295_u128); 9203232350SGuillaume Chatelet EXPECT_EQ(U32_MAX, 0xFFFFFFFF_u128); 9303232350SGuillaume Chatelet EXPECT_EQ(U32_MAX, 0b1111111111111111'1111111111111111_u128); 9403232350SGuillaume Chatelet EXPECT_EQ(U64_MAX, 18446744073709551615_u128); 9503232350SGuillaume Chatelet EXPECT_EQ(U64_MAX, 0xFFFFFFFF'FFFFFFFF_u128); 9603232350SGuillaume Chatelet EXPECT_EQ( 9703232350SGuillaume Chatelet U64_MAX, 9803232350SGuillaume Chatelet 0b1111111111111111'1111111111111111'1111111111111111'1111111111111111_u128); 9903232350SGuillaume Chatelet EXPECT_EQ(U128_MAX, 340282366920938463463374607431768211455_u128); 10003232350SGuillaume Chatelet EXPECT_EQ(U128_MAX, 0xFFFFFFFF'FFFFFFFF'FFFFFFFF'FFFFFFFF_u128); 10103232350SGuillaume Chatelet EXPECT_EQ( 10203232350SGuillaume Chatelet U128_MAX, 10303232350SGuillaume Chatelet 0b1111111111111111'1111111111111111'1111111111111111'1111111111111111'1111111111111111'1111111111111111'1111111111111111'1111111111111111_u128); 10403232350SGuillaume Chatelet } 10503232350SGuillaume Chatelet 10603232350SGuillaume Chatelet TEST(LlvmLibcIntegerLiteralTest, u256) { 1076a8e6c9aSGuillaume Chatelet using UInt256 = LIBC_NAMESPACE::UInt<256>; 10803232350SGuillaume Chatelet const UInt256 ZERO = 0; 10903232350SGuillaume Chatelet const UInt256 U8_MAX = UINT8_MAX; 11003232350SGuillaume Chatelet const UInt256 U16_MAX = UINT16_MAX; 11103232350SGuillaume Chatelet const UInt256 U32_MAX = UINT32_MAX; 11203232350SGuillaume Chatelet const UInt256 U64_MAX = UINT64_MAX; 11303232350SGuillaume Chatelet const UInt256 U128_MAX = (U64_MAX << 64) | U64_MAX; 11403232350SGuillaume Chatelet const UInt256 U256_MAX = (U128_MAX << 128) | U128_MAX; 11503232350SGuillaume Chatelet EXPECT_EQ(ZERO, 0_u256); 11603232350SGuillaume Chatelet EXPECT_EQ(U8_MAX, 255_u256); 11703232350SGuillaume Chatelet EXPECT_EQ(U8_MAX, 0xFF_u256); 11803232350SGuillaume Chatelet EXPECT_EQ(U8_MAX, 0b11111111_u256); 11903232350SGuillaume Chatelet EXPECT_EQ(U16_MAX, 65535_u256); 12003232350SGuillaume Chatelet EXPECT_EQ(U16_MAX, 0xFFFF_u256); 12103232350SGuillaume Chatelet EXPECT_EQ(U16_MAX, 0b11111111'11111111_u256); 12203232350SGuillaume Chatelet EXPECT_EQ(U32_MAX, 4294967295_u256); 12303232350SGuillaume Chatelet EXPECT_EQ(U32_MAX, 0xFFFFFFFF_u256); 12403232350SGuillaume Chatelet EXPECT_EQ(U32_MAX, 0b1111111111111111'1111111111111111_u256); 12503232350SGuillaume Chatelet EXPECT_EQ(U64_MAX, 18446744073709551615_u256); 12603232350SGuillaume Chatelet EXPECT_EQ(U64_MAX, 0xFFFFFFFF'FFFFFFFF_u256); 12703232350SGuillaume Chatelet EXPECT_EQ( 12803232350SGuillaume Chatelet U64_MAX, 12903232350SGuillaume Chatelet 0b1111111111111111'1111111111111111'1111111111111111'1111111111111111_u256); 13003232350SGuillaume Chatelet EXPECT_EQ(U128_MAX, 0xFFFFFFFF'FFFFFFFF'FFFFFFFF'FFFFFFFF_u256); 13103232350SGuillaume Chatelet EXPECT_EQ( 13203232350SGuillaume Chatelet U256_MAX, 13303232350SGuillaume Chatelet 0xFFFFFFFF'FFFFFFFF'FFFFFFFF'FFFFFFFF'FFFFFFFF'FFFFFFFF'FFFFFFFF'FFFFFFFF_u256); 13403232350SGuillaume Chatelet } 135*71c3f5d6SGuillaume Chatelet 136*71c3f5d6SGuillaume Chatelet TEST(LlvmLibcIntegerLiteralTest, parse_bigint) { 137*71c3f5d6SGuillaume Chatelet using T = LIBC_NAMESPACE::Int<128>; 138*71c3f5d6SGuillaume Chatelet struct { 139*71c3f5d6SGuillaume Chatelet const char *str; 140*71c3f5d6SGuillaume Chatelet T expected; 141*71c3f5d6SGuillaume Chatelet } constexpr TEST_CASES[] = { 142*71c3f5d6SGuillaume Chatelet {"0", 0}, {"-1", -1}, {"+1", 1}, {"-0xFF", -255}, {"-0b11", -3}, 143*71c3f5d6SGuillaume Chatelet }; 144*71c3f5d6SGuillaume Chatelet for (auto tc : TEST_CASES) { 145*71c3f5d6SGuillaume Chatelet T actual = LIBC_NAMESPACE::parse_bigint<T>(tc.str); 146*71c3f5d6SGuillaume Chatelet EXPECT_EQ(actual, tc.expected); 147*71c3f5d6SGuillaume Chatelet } 148*71c3f5d6SGuillaume Chatelet } 149*71c3f5d6SGuillaume Chatelet 150*71c3f5d6SGuillaume Chatelet TEST(LlvmLibcIntegerLiteralTest, parse_bigint_invalid) { 151*71c3f5d6SGuillaume Chatelet using T = LIBC_NAMESPACE::Int<128>; 152*71c3f5d6SGuillaume Chatelet const T expected; // default construction 153*71c3f5d6SGuillaume Chatelet EXPECT_EQ(LIBC_NAMESPACE::parse_bigint<T>(nullptr), expected); 154*71c3f5d6SGuillaume Chatelet EXPECT_EQ(LIBC_NAMESPACE::parse_bigint<T>(""), expected); 155*71c3f5d6SGuillaume Chatelet } 156