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