| |
| //===-- Unittests for user defined integer literals -----------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "src/__support/integer_literals.h" |
| #include "src/__support/macros/properties/types.h" // LIBC_TYPES_HAS_INT128 |
| #include "test/UnitTest/Test.h" |
| |
| using LIBC_NAMESPACE::operator""_u8; |
| using LIBC_NAMESPACE::operator""_u16; |
| using LIBC_NAMESPACE::operator""_u32; |
| using LIBC_NAMESPACE::operator""_u64; |
| using LIBC_NAMESPACE::operator""_u128; |
| using LIBC_NAMESPACE::operator""_u256; |
| |
| TEST(LlvmLibcIntegerLiteralTest, u8) { |
| EXPECT_EQ(uint8_t(0), 0_u8); |
| EXPECT_EQ(uint8_t(UINT8_MAX), 255_u8); |
| EXPECT_EQ(uint8_t(UINT8_MAX), 0xFF_u8); |
| EXPECT_EQ(uint8_t(UINT8_MAX), 0b11111111_u8); |
| } |
| |
| TEST(LlvmLibcIntegerLiteralTest, u16) { |
| EXPECT_EQ(uint16_t(0), 0_u16); |
| EXPECT_EQ(uint16_t(UINT8_MAX), 255_u16); |
| EXPECT_EQ(uint16_t(UINT8_MAX), 0xFF_u16); |
| EXPECT_EQ(uint16_t(UINT8_MAX), 0b11111111_u16); |
| EXPECT_EQ(uint16_t(UINT16_MAX), 65535_u16); |
| EXPECT_EQ(uint16_t(UINT16_MAX), 0xFFFF_u16); |
| EXPECT_EQ(uint16_t(UINT16_MAX), 0b11111111'11111111_u16); |
| } |
| |
| TEST(LlvmLibcIntegerLiteralTest, u32) { |
| EXPECT_EQ(uint32_t(0), 0_u32); |
| EXPECT_EQ(uint32_t(UINT8_MAX), 255_u32); |
| EXPECT_EQ(uint32_t(UINT8_MAX), 0xFF_u32); |
| EXPECT_EQ(uint32_t(UINT8_MAX), 0b11111111_u32); |
| EXPECT_EQ(uint32_t(UINT16_MAX), 65535_u32); |
| EXPECT_EQ(uint32_t(UINT16_MAX), 0xFFFF_u32); |
| EXPECT_EQ(uint32_t(UINT16_MAX), 0b11111111'11111111_u32); |
| EXPECT_EQ(uint32_t(UINT32_MAX), 4294967295_u32); |
| EXPECT_EQ(uint32_t(UINT32_MAX), 0xFFFFFFFF_u32); |
| EXPECT_EQ(uint32_t(UINT32_MAX), 0b1111111111111111'1111111111111111_u32); |
| } |
| |
| TEST(LlvmLibcIntegerLiteralTest, u64) { |
| EXPECT_EQ(uint64_t(0), 0_u64); |
| EXPECT_EQ(uint64_t(UINT8_MAX), 255_u64); |
| EXPECT_EQ(uint64_t(UINT8_MAX), 0xFF_u64); |
| EXPECT_EQ(uint64_t(UINT8_MAX), 0b11111111_u64); |
| EXPECT_EQ(uint64_t(UINT16_MAX), 65535_u64); |
| EXPECT_EQ(uint64_t(UINT16_MAX), 0xFFFF_u64); |
| EXPECT_EQ(uint64_t(UINT16_MAX), 0b11111111'11111111_u64); |
| EXPECT_EQ(uint64_t(UINT32_MAX), 4294967295_u64); |
| EXPECT_EQ(uint64_t(UINT32_MAX), 0xFFFFFFFF_u64); |
| EXPECT_EQ(uint64_t(UINT32_MAX), 0b1111111111111111'1111111111111111_u64); |
| EXPECT_EQ(uint64_t(UINT64_MAX), 18446744073709551615_u64); |
| EXPECT_EQ(uint64_t(UINT64_MAX), 0xFFFFFFFF'FFFFFFFF_u64); |
| EXPECT_EQ( |
| uint64_t(UINT64_MAX), |
| 0b1111111111111111'1111111111111111'1111111111111111'1111111111111111_u64); |
| } |
| |
| TEST(LlvmLibcIntegerLiteralTest, u128) { |
| #ifdef LIBC_TYPES_HAS_INT128 |
| const __uint128_t ZERO = 0; |
| const __uint128_t U8_MAX = UINT8_MAX; |
| const __uint128_t U16_MAX = UINT16_MAX; |
| const __uint128_t U32_MAX = UINT32_MAX; |
| const __uint128_t U64_MAX = UINT64_MAX; |
| const __uint128_t U128_MAX = (U64_MAX << 64) | U64_MAX; |
| #else |
| const UInt128 ZERO = 0; |
| const UInt128 U8_MAX = UINT8_MAX; |
| const UInt128 U16_MAX = UINT16_MAX; |
| const UInt128 U32_MAX = UINT32_MAX; |
| const UInt128 U64_MAX = UINT64_MAX; |
| const UInt128 U128_MAX = (U64_MAX << 64) | U64_MAX; |
| #endif // LIBC_TYPES_HAS_INT128 |
| EXPECT_EQ(ZERO, 0_u128); |
| EXPECT_EQ(U8_MAX, 255_u128); |
| EXPECT_EQ(U8_MAX, 0xFF_u128); |
| EXPECT_EQ(U8_MAX, 0b11111111_u128); |
| EXPECT_EQ(U16_MAX, 65535_u128); |
| EXPECT_EQ(U16_MAX, 0xFFFF_u128); |
| EXPECT_EQ(U16_MAX, 0b11111111'11111111_u128); |
| EXPECT_EQ(U32_MAX, 4294967295_u128); |
| EXPECT_EQ(U32_MAX, 0xFFFFFFFF_u128); |
| EXPECT_EQ(U32_MAX, 0b1111111111111111'1111111111111111_u128); |
| EXPECT_EQ(U64_MAX, 18446744073709551615_u128); |
| EXPECT_EQ(U64_MAX, 0xFFFFFFFF'FFFFFFFF_u128); |
| EXPECT_EQ( |
| U64_MAX, |
| 0b1111111111111111'1111111111111111'1111111111111111'1111111111111111_u128); |
| EXPECT_EQ(U128_MAX, 340282366920938463463374607431768211455_u128); |
| EXPECT_EQ(U128_MAX, 0xFFFFFFFF'FFFFFFFF'FFFFFFFF'FFFFFFFF_u128); |
| EXPECT_EQ( |
| U128_MAX, |
| 0b1111111111111111'1111111111111111'1111111111111111'1111111111111111'1111111111111111'1111111111111111'1111111111111111'1111111111111111_u128); |
| } |
| |
| TEST(LlvmLibcIntegerLiteralTest, u256) { |
| using UInt256 = LIBC_NAMESPACE::UInt<256>; |
| const UInt256 ZERO = 0; |
| const UInt256 U8_MAX = UINT8_MAX; |
| const UInt256 U16_MAX = UINT16_MAX; |
| const UInt256 U32_MAX = UINT32_MAX; |
| const UInt256 U64_MAX = UINT64_MAX; |
| const UInt256 U128_MAX = (U64_MAX << 64) | U64_MAX; |
| const UInt256 U256_MAX = (U128_MAX << 128) | U128_MAX; |
| EXPECT_EQ(ZERO, 0_u256); |
| EXPECT_EQ(U8_MAX, 255_u256); |
| EXPECT_EQ(U8_MAX, 0xFF_u256); |
| EXPECT_EQ(U8_MAX, 0b11111111_u256); |
| EXPECT_EQ(U16_MAX, 65535_u256); |
| EXPECT_EQ(U16_MAX, 0xFFFF_u256); |
| EXPECT_EQ(U16_MAX, 0b11111111'11111111_u256); |
| EXPECT_EQ(U32_MAX, 4294967295_u256); |
| EXPECT_EQ(U32_MAX, 0xFFFFFFFF_u256); |
| EXPECT_EQ(U32_MAX, 0b1111111111111111'1111111111111111_u256); |
| EXPECT_EQ(U64_MAX, 18446744073709551615_u256); |
| EXPECT_EQ(U64_MAX, 0xFFFFFFFF'FFFFFFFF_u256); |
| EXPECT_EQ( |
| U64_MAX, |
| 0b1111111111111111'1111111111111111'1111111111111111'1111111111111111_u256); |
| EXPECT_EQ(U128_MAX, 0xFFFFFFFF'FFFFFFFF'FFFFFFFF'FFFFFFFF_u256); |
| EXPECT_EQ( |
| U256_MAX, |
| 0xFFFFFFFF'FFFFFFFF'FFFFFFFF'FFFFFFFF'FFFFFFFF'FFFFFFFF'FFFFFFFF'FFFFFFFF_u256); |
| } |
| |
| TEST(LlvmLibcIntegerLiteralTest, parse_bigint) { |
| using T = LIBC_NAMESPACE::Int<128>; |
| struct { |
| const char *str; |
| T expected; |
| } constexpr TEST_CASES[] = { |
| {"0", 0}, {"-1", -1}, {"+1", 1}, {"-0xFF", -255}, {"-0b11", -3}, |
| }; |
| for (auto tc : TEST_CASES) { |
| T actual = LIBC_NAMESPACE::parse_bigint<T>(tc.str); |
| EXPECT_EQ(actual, tc.expected); |
| } |
| } |
| |
| TEST(LlvmLibcIntegerLiteralTest, parse_bigint_invalid) { |
| using T = LIBC_NAMESPACE::Int<128>; |
| const T expected; // default construction |
| EXPECT_EQ(LIBC_NAMESPACE::parse_bigint<T>(nullptr), expected); |
| EXPECT_EQ(LIBC_NAMESPACE::parse_bigint<T>(""), expected); |
| } |