156 lines · cpp
1//===-- Unittests for user defined integer literals -----------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "src/__support/integer_literals.h"10#include "src/__support/macros/properties/types.h" // LIBC_TYPES_HAS_INT12811#include "test/UnitTest/Test.h"12 13using LIBC_NAMESPACE::operator""_u8;14using LIBC_NAMESPACE::operator""_u16;15using LIBC_NAMESPACE::operator""_u32;16using LIBC_NAMESPACE::operator""_u64;17using LIBC_NAMESPACE::operator""_u128;18using LIBC_NAMESPACE::operator""_u256;19 20TEST(LlvmLibcIntegerLiteralTest, u8) {21 EXPECT_EQ(uint8_t(0), 0_u8);22 EXPECT_EQ(uint8_t(UINT8_MAX), 255_u8);23 EXPECT_EQ(uint8_t(UINT8_MAX), 0xFF_u8);24 EXPECT_EQ(uint8_t(UINT8_MAX), 0b11111111_u8);25}26 27TEST(LlvmLibcIntegerLiteralTest, u16) {28 EXPECT_EQ(uint16_t(0), 0_u16);29 EXPECT_EQ(uint16_t(UINT8_MAX), 255_u16);30 EXPECT_EQ(uint16_t(UINT8_MAX), 0xFF_u16);31 EXPECT_EQ(uint16_t(UINT8_MAX), 0b11111111_u16);32 EXPECT_EQ(uint16_t(UINT16_MAX), 65535_u16);33 EXPECT_EQ(uint16_t(UINT16_MAX), 0xFFFF_u16);34 EXPECT_EQ(uint16_t(UINT16_MAX), 0b11111111'11111111_u16);35}36 37TEST(LlvmLibcIntegerLiteralTest, u32) {38 EXPECT_EQ(uint32_t(0), 0_u32);39 EXPECT_EQ(uint32_t(UINT8_MAX), 255_u32);40 EXPECT_EQ(uint32_t(UINT8_MAX), 0xFF_u32);41 EXPECT_EQ(uint32_t(UINT8_MAX), 0b11111111_u32);42 EXPECT_EQ(uint32_t(UINT16_MAX), 65535_u32);43 EXPECT_EQ(uint32_t(UINT16_MAX), 0xFFFF_u32);44 EXPECT_EQ(uint32_t(UINT16_MAX), 0b11111111'11111111_u32);45 EXPECT_EQ(uint32_t(UINT32_MAX), 4294967295_u32);46 EXPECT_EQ(uint32_t(UINT32_MAX), 0xFFFFFFFF_u32);47 EXPECT_EQ(uint32_t(UINT32_MAX), 0b1111111111111111'1111111111111111_u32);48}49 50TEST(LlvmLibcIntegerLiteralTest, u64) {51 EXPECT_EQ(uint64_t(0), 0_u64);52 EXPECT_EQ(uint64_t(UINT8_MAX), 255_u64);53 EXPECT_EQ(uint64_t(UINT8_MAX), 0xFF_u64);54 EXPECT_EQ(uint64_t(UINT8_MAX), 0b11111111_u64);55 EXPECT_EQ(uint64_t(UINT16_MAX), 65535_u64);56 EXPECT_EQ(uint64_t(UINT16_MAX), 0xFFFF_u64);57 EXPECT_EQ(uint64_t(UINT16_MAX), 0b11111111'11111111_u64);58 EXPECT_EQ(uint64_t(UINT32_MAX), 4294967295_u64);59 EXPECT_EQ(uint64_t(UINT32_MAX), 0xFFFFFFFF_u64);60 EXPECT_EQ(uint64_t(UINT32_MAX), 0b1111111111111111'1111111111111111_u64);61 EXPECT_EQ(uint64_t(UINT64_MAX), 18446744073709551615_u64);62 EXPECT_EQ(uint64_t(UINT64_MAX), 0xFFFFFFFF'FFFFFFFF_u64);63 EXPECT_EQ(64 uint64_t(UINT64_MAX),65 0b1111111111111111'1111111111111111'1111111111111111'1111111111111111_u64);66}67 68TEST(LlvmLibcIntegerLiteralTest, u128) {69#ifdef LIBC_TYPES_HAS_INT12870 const __uint128_t ZERO = 0;71 const __uint128_t U8_MAX = UINT8_MAX;72 const __uint128_t U16_MAX = UINT16_MAX;73 const __uint128_t U32_MAX = UINT32_MAX;74 const __uint128_t U64_MAX = UINT64_MAX;75 const __uint128_t U128_MAX = (U64_MAX << 64) | U64_MAX;76#else77 const UInt128 ZERO = 0;78 const UInt128 U8_MAX = UINT8_MAX;79 const UInt128 U16_MAX = UINT16_MAX;80 const UInt128 U32_MAX = UINT32_MAX;81 const UInt128 U64_MAX = UINT64_MAX;82 const UInt128 U128_MAX = (U64_MAX << 64) | U64_MAX;83#endif // LIBC_TYPES_HAS_INT12884 EXPECT_EQ(ZERO, 0_u128);85 EXPECT_EQ(U8_MAX, 255_u128);86 EXPECT_EQ(U8_MAX, 0xFF_u128);87 EXPECT_EQ(U8_MAX, 0b11111111_u128);88 EXPECT_EQ(U16_MAX, 65535_u128);89 EXPECT_EQ(U16_MAX, 0xFFFF_u128);90 EXPECT_EQ(U16_MAX, 0b11111111'11111111_u128);91 EXPECT_EQ(U32_MAX, 4294967295_u128);92 EXPECT_EQ(U32_MAX, 0xFFFFFFFF_u128);93 EXPECT_EQ(U32_MAX, 0b1111111111111111'1111111111111111_u128);94 EXPECT_EQ(U64_MAX, 18446744073709551615_u128);95 EXPECT_EQ(U64_MAX, 0xFFFFFFFF'FFFFFFFF_u128);96 EXPECT_EQ(97 U64_MAX,98 0b1111111111111111'1111111111111111'1111111111111111'1111111111111111_u128);99 EXPECT_EQ(U128_MAX, 340282366920938463463374607431768211455_u128);100 EXPECT_EQ(U128_MAX, 0xFFFFFFFF'FFFFFFFF'FFFFFFFF'FFFFFFFF_u128);101 EXPECT_EQ(102 U128_MAX,103 0b1111111111111111'1111111111111111'1111111111111111'1111111111111111'1111111111111111'1111111111111111'1111111111111111'1111111111111111_u128);104}105 106TEST(LlvmLibcIntegerLiteralTest, u256) {107 using UInt256 = LIBC_NAMESPACE::UInt<256>;108 const UInt256 ZERO = 0;109 const UInt256 U8_MAX = UINT8_MAX;110 const UInt256 U16_MAX = UINT16_MAX;111 const UInt256 U32_MAX = UINT32_MAX;112 const UInt256 U64_MAX = UINT64_MAX;113 const UInt256 U128_MAX = (U64_MAX << 64) | U64_MAX;114 const UInt256 U256_MAX = (U128_MAX << 128) | U128_MAX;115 EXPECT_EQ(ZERO, 0_u256);116 EXPECT_EQ(U8_MAX, 255_u256);117 EXPECT_EQ(U8_MAX, 0xFF_u256);118 EXPECT_EQ(U8_MAX, 0b11111111_u256);119 EXPECT_EQ(U16_MAX, 65535_u256);120 EXPECT_EQ(U16_MAX, 0xFFFF_u256);121 EXPECT_EQ(U16_MAX, 0b11111111'11111111_u256);122 EXPECT_EQ(U32_MAX, 4294967295_u256);123 EXPECT_EQ(U32_MAX, 0xFFFFFFFF_u256);124 EXPECT_EQ(U32_MAX, 0b1111111111111111'1111111111111111_u256);125 EXPECT_EQ(U64_MAX, 18446744073709551615_u256);126 EXPECT_EQ(U64_MAX, 0xFFFFFFFF'FFFFFFFF_u256);127 EXPECT_EQ(128 U64_MAX,129 0b1111111111111111'1111111111111111'1111111111111111'1111111111111111_u256);130 EXPECT_EQ(U128_MAX, 0xFFFFFFFF'FFFFFFFF'FFFFFFFF'FFFFFFFF_u256);131 EXPECT_EQ(132 U256_MAX,133 0xFFFFFFFF'FFFFFFFF'FFFFFFFF'FFFFFFFF'FFFFFFFF'FFFFFFFF'FFFFFFFF'FFFFFFFF_u256);134}135 136TEST(LlvmLibcIntegerLiteralTest, parse_bigint) {137 using T = LIBC_NAMESPACE::Int<128>;138 struct {139 const char *str;140 T expected;141 } constexpr TEST_CASES[] = {142 {"0", 0}, {"-1", -1}, {"+1", 1}, {"-0xFF", -255}, {"-0b11", -3},143 };144 for (auto tc : TEST_CASES) {145 T actual = LIBC_NAMESPACE::parse_bigint<T>(tc.str);146 EXPECT_EQ(actual, tc.expected);147 }148}149 150TEST(LlvmLibcIntegerLiteralTest, parse_bigint_invalid) {151 using T = LIBC_NAMESPACE::Int<128>;152 const T expected; // default construction153 EXPECT_EQ(LIBC_NAMESPACE::parse_bigint<T>(nullptr), expected);154 EXPECT_EQ(LIBC_NAMESPACE::parse_bigint<T>(""), expected);155}156