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