brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.8 KiB · e5ac1d6 Raw
242 lines · cpp
1//===-- Unittests for str_to_integer --------------------------------------===//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/str_to_integer.h"10#include <stddef.h>11 12#include "test/UnitTest/Test.h"13 14// This file is for testing the src_len argument and other internal interface15// features. Primary testing is done in stdlib/StrolTest.cpp through the public16// interface.17 18TEST(LlvmLibcStrToIntegerTest, SimpleLength) {19  auto result = LIBC_NAMESPACE::internal::strtointeger<int>("12345", 10, 10);20  EXPECT_FALSE(result.has_error());21  EXPECT_EQ(result.parsed_len, ptrdiff_t(5));22  ASSERT_EQ(result.value, 12345);23 24  result = LIBC_NAMESPACE::internal::strtointeger<int>("12345", 10, 2);25  EXPECT_FALSE(result.has_error());26  EXPECT_EQ(result.parsed_len, ptrdiff_t(2));27  ASSERT_EQ(result.value, 12);28 29  result = LIBC_NAMESPACE::internal::strtointeger<int>("12345", 10, 0);30  EXPECT_FALSE(result.has_error());31  EXPECT_EQ(result.parsed_len, ptrdiff_t(0));32  ASSERT_EQ(result.value, 0);33}34 35TEST(LlvmLibcStrToIntegerTest, LeadingSpaces) {36  auto result =37      LIBC_NAMESPACE::internal::strtointeger<int>("     12345", 10, 15);38  EXPECT_FALSE(result.has_error());39  EXPECT_EQ(result.parsed_len, ptrdiff_t(10));40  ASSERT_EQ(result.value, 12345);41 42  result = LIBC_NAMESPACE::internal::strtointeger<int>("     12345", 10, 10);43  EXPECT_FALSE(result.has_error());44  EXPECT_EQ(result.parsed_len, ptrdiff_t(10));45  ASSERT_EQ(result.value, 12345);46 47  result = LIBC_NAMESPACE::internal::strtointeger<int>("     12345", 10, 7);48  EXPECT_FALSE(result.has_error());49  EXPECT_EQ(result.parsed_len, ptrdiff_t(7));50  ASSERT_EQ(result.value, 12);51 52  // Use a non-null-terminated buffer to test for possible OOB access.53  char buf[5] = {' ', ' ', ' ', ' ', ' '};54  result = LIBC_NAMESPACE::internal::strtointeger<int>(buf, 10, 5);55  EXPECT_FALSE(result.has_error());56  EXPECT_EQ(result.parsed_len, ptrdiff_t(0));57  ASSERT_EQ(result.value, 0);58 59  result = LIBC_NAMESPACE::internal::strtointeger<int>(buf, 10, 0);60  EXPECT_FALSE(result.has_error());61  EXPECT_EQ(result.parsed_len, ptrdiff_t(0));62  ASSERT_EQ(result.value, 0);63}64 65TEST(LlvmLibcStrToIntegerTest, LeadingSign) {66  auto result = LIBC_NAMESPACE::internal::strtointeger<int>("+12345", 10, 10);67  EXPECT_FALSE(result.has_error());68  EXPECT_EQ(result.parsed_len, ptrdiff_t(6));69  ASSERT_EQ(result.value, 12345);70 71  result = LIBC_NAMESPACE::internal::strtointeger<int>("-12345", 10, 10);72  EXPECT_FALSE(result.has_error());73  EXPECT_EQ(result.parsed_len, ptrdiff_t(6));74  ASSERT_EQ(result.value, -12345);75 76  result = LIBC_NAMESPACE::internal::strtointeger<int>("+12345", 10, 6);77  EXPECT_FALSE(result.has_error());78  EXPECT_EQ(result.parsed_len, ptrdiff_t(6));79  ASSERT_EQ(result.value, 12345);80 81  result = LIBC_NAMESPACE::internal::strtointeger<int>("-12345", 10, 6);82  EXPECT_FALSE(result.has_error());83  EXPECT_EQ(result.parsed_len, ptrdiff_t(6));84  ASSERT_EQ(result.value, -12345);85 86  result = LIBC_NAMESPACE::internal::strtointeger<int>("+12345", 10, 3);87  EXPECT_FALSE(result.has_error());88  EXPECT_EQ(result.parsed_len, ptrdiff_t(3));89  ASSERT_EQ(result.value, 12);90 91  result = LIBC_NAMESPACE::internal::strtointeger<int>("-12345", 10, 3);92  EXPECT_FALSE(result.has_error());93  EXPECT_EQ(result.parsed_len, ptrdiff_t(3));94  ASSERT_EQ(result.value, -12);95 96  result = LIBC_NAMESPACE::internal::strtointeger<int>("+12345", 10, 1);97  EXPECT_FALSE(result.has_error());98  EXPECT_EQ(result.parsed_len, ptrdiff_t(0));99  ASSERT_EQ(result.value, 0);100 101  result = LIBC_NAMESPACE::internal::strtointeger<int>("-12345", 10, 1);102  EXPECT_FALSE(result.has_error());103  EXPECT_EQ(result.parsed_len, ptrdiff_t(0));104  ASSERT_EQ(result.value, 0);105 106  result = LIBC_NAMESPACE::internal::strtointeger<int>("+12345", 10, 0);107  EXPECT_FALSE(result.has_error());108  EXPECT_EQ(result.parsed_len, ptrdiff_t(0));109  ASSERT_EQ(result.value, 0);110 111  result = LIBC_NAMESPACE::internal::strtointeger<int>("-12345", 10, 0);112  EXPECT_FALSE(result.has_error());113  EXPECT_EQ(result.parsed_len, ptrdiff_t(0));114  ASSERT_EQ(result.value, 0);115}116 117TEST(LlvmLibcStrToIntegerTest, Base16PrefixAutoSelect) {118  auto result = LIBC_NAMESPACE::internal::strtointeger<int>("0x12345", 0, 10);119  EXPECT_FALSE(result.has_error());120  EXPECT_EQ(result.parsed_len, ptrdiff_t(7));121  ASSERT_EQ(result.value, 0x12345);122 123  result = LIBC_NAMESPACE::internal::strtointeger<int>("0x12345", 0, 7);124  EXPECT_FALSE(result.has_error());125  EXPECT_EQ(result.parsed_len, ptrdiff_t(7));126  ASSERT_EQ(result.value, 0x12345);127 128  result = LIBC_NAMESPACE::internal::strtointeger<int>("0x12345", 0, 5);129  EXPECT_FALSE(result.has_error());130  EXPECT_EQ(result.parsed_len, ptrdiff_t(5));131  ASSERT_EQ(result.value, 0x123);132 133  result = LIBC_NAMESPACE::internal::strtointeger<int>("0x12345", 0, 2);134  EXPECT_FALSE(result.has_error());135  EXPECT_EQ(result.parsed_len, ptrdiff_t(1));136  ASSERT_EQ(result.value, 0);137 138  result = LIBC_NAMESPACE::internal::strtointeger<int>("0x12345", 0, 0);139  EXPECT_FALSE(result.has_error());140  EXPECT_EQ(result.parsed_len, ptrdiff_t(0));141  ASSERT_EQ(result.value, 0);142}143 144TEST(LlvmLibcStrToIntegerTest, Base16PrefixManualSelect) {145  auto result = LIBC_NAMESPACE::internal::strtointeger<int>("0x12345", 16, 10);146  EXPECT_FALSE(result.has_error());147  EXPECT_EQ(result.parsed_len, ptrdiff_t(7));148  ASSERT_EQ(result.value, 0x12345);149 150  result = LIBC_NAMESPACE::internal::strtointeger<int>("0x12345", 16, 7);151  EXPECT_FALSE(result.has_error());152  EXPECT_EQ(result.parsed_len, ptrdiff_t(7));153  ASSERT_EQ(result.value, 0x12345);154 155  result = LIBC_NAMESPACE::internal::strtointeger<int>("0x12345", 16, 5);156  EXPECT_FALSE(result.has_error());157  EXPECT_EQ(result.parsed_len, ptrdiff_t(5));158  ASSERT_EQ(result.value, 0x123);159 160  result = LIBC_NAMESPACE::internal::strtointeger<int>("0x12345", 16, 2);161  EXPECT_FALSE(result.has_error());162  EXPECT_EQ(result.parsed_len, ptrdiff_t(1));163  ASSERT_EQ(result.value, 0);164 165  result = LIBC_NAMESPACE::internal::strtointeger<int>("0x12345", 16, 0);166  EXPECT_FALSE(result.has_error());167  EXPECT_EQ(result.parsed_len, ptrdiff_t(0));168  ASSERT_EQ(result.value, 0);169}170 171TEST(LlvmLibcStrToIntegerTest, Base8PrefixAutoSelect) {172  auto result = LIBC_NAMESPACE::internal::strtointeger<int>("012345", 0, 10);173  EXPECT_FALSE(result.has_error());174  EXPECT_EQ(result.parsed_len, ptrdiff_t(6));175  ASSERT_EQ(result.value, 012345);176 177  result = LIBC_NAMESPACE::internal::strtointeger<int>("012345", 0, 6);178  EXPECT_FALSE(result.has_error());179  EXPECT_EQ(result.parsed_len, ptrdiff_t(6));180  ASSERT_EQ(result.value, 012345);181 182  result = LIBC_NAMESPACE::internal::strtointeger<int>("012345", 0, 4);183  EXPECT_FALSE(result.has_error());184  EXPECT_EQ(result.parsed_len, ptrdiff_t(4));185  ASSERT_EQ(result.value, 0123);186 187  result = LIBC_NAMESPACE::internal::strtointeger<int>("012345", 0, 1);188  EXPECT_FALSE(result.has_error());189  EXPECT_EQ(result.parsed_len, ptrdiff_t(1));190  ASSERT_EQ(result.value, 0);191 192  result = LIBC_NAMESPACE::internal::strtointeger<int>("012345", 0, 0);193  EXPECT_FALSE(result.has_error());194  EXPECT_EQ(result.parsed_len, ptrdiff_t(0));195  ASSERT_EQ(result.value, 0);196}197 198TEST(LlvmLibcStrToIntegerTest, Base8PrefixManualSelect) {199  auto result = LIBC_NAMESPACE::internal::strtointeger<int>("012345", 8, 10);200  EXPECT_FALSE(result.has_error());201  EXPECT_EQ(result.parsed_len, ptrdiff_t(6));202  ASSERT_EQ(result.value, 012345);203 204  result = LIBC_NAMESPACE::internal::strtointeger<int>("012345", 8, 6);205  EXPECT_FALSE(result.has_error());206  EXPECT_EQ(result.parsed_len, ptrdiff_t(6));207  ASSERT_EQ(result.value, 012345);208 209  result = LIBC_NAMESPACE::internal::strtointeger<int>("012345", 8, 4);210  EXPECT_FALSE(result.has_error());211  EXPECT_EQ(result.parsed_len, ptrdiff_t(4));212  ASSERT_EQ(result.value, 0123);213 214  result = LIBC_NAMESPACE::internal::strtointeger<int>("012345", 8, 1);215  EXPECT_FALSE(result.has_error());216  EXPECT_EQ(result.parsed_len, ptrdiff_t(1));217  ASSERT_EQ(result.value, 0);218 219  result = LIBC_NAMESPACE::internal::strtointeger<int>("012345", 8, 0);220  EXPECT_FALSE(result.has_error());221  EXPECT_EQ(result.parsed_len, ptrdiff_t(0));222  ASSERT_EQ(result.value, 0);223}224 225TEST(LlvmLibcStrToIntegerTest, CombinedTests) {226  auto result =227      LIBC_NAMESPACE::internal::strtointeger<int>("    -0x123", 0, 10);228  EXPECT_FALSE(result.has_error());229  EXPECT_EQ(result.parsed_len, ptrdiff_t(10));230  ASSERT_EQ(result.value, -0x123);231 232  result = LIBC_NAMESPACE::internal::strtointeger<int>("    -0x123", 0, 8);233  EXPECT_FALSE(result.has_error());234  EXPECT_EQ(result.parsed_len, ptrdiff_t(8));235  ASSERT_EQ(result.value, -0x1);236 237  result = LIBC_NAMESPACE::internal::strtointeger<int>("    -0x123", 0, 7);238  EXPECT_FALSE(result.has_error());239  EXPECT_EQ(result.parsed_len, ptrdiff_t(6));240  ASSERT_EQ(result.value, 0);241}242