brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.8 KiB · 5c626f4 Raw
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