xref: /aosp_15_r20/external/abseil-cpp/absl/strings/numbers_test.cc (revision 9356374a3709195abf420251b3e825997ff56c0f)
1*9356374aSAndroid Build Coastguard Worker // Copyright 2017 The Abseil Authors.
2*9356374aSAndroid Build Coastguard Worker //
3*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*9356374aSAndroid Build Coastguard Worker //
7*9356374aSAndroid Build Coastguard Worker //      https://www.apache.org/licenses/LICENSE-2.0
8*9356374aSAndroid Build Coastguard Worker //
9*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*9356374aSAndroid Build Coastguard Worker // limitations under the License.
14*9356374aSAndroid Build Coastguard Worker 
15*9356374aSAndroid Build Coastguard Worker // This file tests string processing functions related to numeric values.
16*9356374aSAndroid Build Coastguard Worker 
17*9356374aSAndroid Build Coastguard Worker #include "absl/strings/numbers.h"
18*9356374aSAndroid Build Coastguard Worker 
19*9356374aSAndroid Build Coastguard Worker #include <sys/types.h>
20*9356374aSAndroid Build Coastguard Worker 
21*9356374aSAndroid Build Coastguard Worker #include <cfenv>  // NOLINT(build/c++11)
22*9356374aSAndroid Build Coastguard Worker #include <cfloat>
23*9356374aSAndroid Build Coastguard Worker #include <cinttypes>
24*9356374aSAndroid Build Coastguard Worker #include <climits>
25*9356374aSAndroid Build Coastguard Worker #include <cmath>
26*9356374aSAndroid Build Coastguard Worker #include <cstddef>
27*9356374aSAndroid Build Coastguard Worker #include <cstdint>
28*9356374aSAndroid Build Coastguard Worker #include <cstdio>
29*9356374aSAndroid Build Coastguard Worker #include <cstdlib>
30*9356374aSAndroid Build Coastguard Worker #include <cstring>
31*9356374aSAndroid Build Coastguard Worker #include <ios>
32*9356374aSAndroid Build Coastguard Worker #include <limits>
33*9356374aSAndroid Build Coastguard Worker #include <numeric>
34*9356374aSAndroid Build Coastguard Worker #include <random>
35*9356374aSAndroid Build Coastguard Worker #include <set>
36*9356374aSAndroid Build Coastguard Worker #include <string>
37*9356374aSAndroid Build Coastguard Worker #include <vector>
38*9356374aSAndroid Build Coastguard Worker 
39*9356374aSAndroid Build Coastguard Worker #include "gmock/gmock.h"
40*9356374aSAndroid Build Coastguard Worker #include "gtest/gtest.h"
41*9356374aSAndroid Build Coastguard Worker #include "absl/log/log.h"
42*9356374aSAndroid Build Coastguard Worker #include "absl/numeric/int128.h"
43*9356374aSAndroid Build Coastguard Worker #include "absl/random/distributions.h"
44*9356374aSAndroid Build Coastguard Worker #include "absl/random/random.h"
45*9356374aSAndroid Build Coastguard Worker #include "absl/strings/internal/numbers_test_common.h"
46*9356374aSAndroid Build Coastguard Worker #include "absl/strings/internal/ostringstream.h"
47*9356374aSAndroid Build Coastguard Worker #include "absl/strings/internal/pow10_helper.h"
48*9356374aSAndroid Build Coastguard Worker #include "absl/strings/str_cat.h"
49*9356374aSAndroid Build Coastguard Worker #include "absl/strings/string_view.h"
50*9356374aSAndroid Build Coastguard Worker 
51*9356374aSAndroid Build Coastguard Worker namespace {
52*9356374aSAndroid Build Coastguard Worker 
53*9356374aSAndroid Build Coastguard Worker using absl::SimpleAtoi;
54*9356374aSAndroid Build Coastguard Worker using absl::SimpleHexAtoi;
55*9356374aSAndroid Build Coastguard Worker using absl::numbers_internal::kSixDigitsToBufferSize;
56*9356374aSAndroid Build Coastguard Worker using absl::numbers_internal::safe_strto32_base;
57*9356374aSAndroid Build Coastguard Worker using absl::numbers_internal::safe_strto64_base;
58*9356374aSAndroid Build Coastguard Worker using absl::numbers_internal::safe_strtou32_base;
59*9356374aSAndroid Build Coastguard Worker using absl::numbers_internal::safe_strtou64_base;
60*9356374aSAndroid Build Coastguard Worker using absl::numbers_internal::SixDigitsToBuffer;
61*9356374aSAndroid Build Coastguard Worker using absl::strings_internal::Itoa;
62*9356374aSAndroid Build Coastguard Worker using absl::strings_internal::strtouint32_test_cases;
63*9356374aSAndroid Build Coastguard Worker using absl::strings_internal::strtouint64_test_cases;
64*9356374aSAndroid Build Coastguard Worker using testing::Eq;
65*9356374aSAndroid Build Coastguard Worker using testing::MatchesRegex;
66*9356374aSAndroid Build Coastguard Worker using testing::Pointee;
67*9356374aSAndroid Build Coastguard Worker 
68*9356374aSAndroid Build Coastguard Worker // Number of floats to test with.
69*9356374aSAndroid Build Coastguard Worker // 5,000,000 is a reasonable default for a test that only takes a few seconds.
70*9356374aSAndroid Build Coastguard Worker // 1,000,000,000+ triggers checking for all possible mantissa values for
71*9356374aSAndroid Build Coastguard Worker // double-precision tests. 2,000,000,000+ triggers checking for every possible
72*9356374aSAndroid Build Coastguard Worker // single-precision float.
73*9356374aSAndroid Build Coastguard Worker const int kFloatNumCases = 5000000;
74*9356374aSAndroid Build Coastguard Worker 
75*9356374aSAndroid Build Coastguard Worker // This is a slow, brute-force routine to compute the exact base-10
76*9356374aSAndroid Build Coastguard Worker // representation of a double-precision floating-point number.  It
77*9356374aSAndroid Build Coastguard Worker // is useful for debugging only.
PerfectDtoa(double d)78*9356374aSAndroid Build Coastguard Worker std::string PerfectDtoa(double d) {
79*9356374aSAndroid Build Coastguard Worker   if (d == 0) return "0";
80*9356374aSAndroid Build Coastguard Worker   if (d < 0) return "-" + PerfectDtoa(-d);
81*9356374aSAndroid Build Coastguard Worker 
82*9356374aSAndroid Build Coastguard Worker   // Basic theory: decompose d into mantissa and exp, where
83*9356374aSAndroid Build Coastguard Worker   // d = mantissa * 2^exp, and exp is as close to zero as possible.
84*9356374aSAndroid Build Coastguard Worker   int64_t mantissa, exp = 0;
85*9356374aSAndroid Build Coastguard Worker   while (d >= 1ULL << 63) ++exp, d *= 0.5;
86*9356374aSAndroid Build Coastguard Worker   while ((mantissa = d) != d) --exp, d *= 2.0;
87*9356374aSAndroid Build Coastguard Worker 
88*9356374aSAndroid Build Coastguard Worker   // Then convert mantissa to ASCII, and either double it (if
89*9356374aSAndroid Build Coastguard Worker   // exp > 0) or halve it (if exp < 0) repeatedly.  "halve it"
90*9356374aSAndroid Build Coastguard Worker   // in this case means multiplying it by five and dividing by 10.
91*9356374aSAndroid Build Coastguard Worker   constexpr int maxlen = 1100;  // worst case is actually 1030 or so.
92*9356374aSAndroid Build Coastguard Worker   char buf[maxlen + 5];
93*9356374aSAndroid Build Coastguard Worker   for (int64_t num = mantissa, pos = maxlen; --pos >= 0;) {
94*9356374aSAndroid Build Coastguard Worker     buf[pos] = '0' + (num % 10);
95*9356374aSAndroid Build Coastguard Worker     num /= 10;
96*9356374aSAndroid Build Coastguard Worker   }
97*9356374aSAndroid Build Coastguard Worker   char* begin = &buf[0];
98*9356374aSAndroid Build Coastguard Worker   char* end = buf + maxlen;
99*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i != exp; i += (exp > 0) ? 1 : -1) {
100*9356374aSAndroid Build Coastguard Worker     int carry = 0;
101*9356374aSAndroid Build Coastguard Worker     for (char* p = end; --p != begin;) {
102*9356374aSAndroid Build Coastguard Worker       int dig = *p - '0';
103*9356374aSAndroid Build Coastguard Worker       dig = dig * (exp > 0 ? 2 : 5) + carry;
104*9356374aSAndroid Build Coastguard Worker       carry = dig / 10;
105*9356374aSAndroid Build Coastguard Worker       dig %= 10;
106*9356374aSAndroid Build Coastguard Worker       *p = '0' + dig;
107*9356374aSAndroid Build Coastguard Worker     }
108*9356374aSAndroid Build Coastguard Worker   }
109*9356374aSAndroid Build Coastguard Worker   if (exp < 0) {
110*9356374aSAndroid Build Coastguard Worker     // "dividing by 10" above means we have to add the decimal point.
111*9356374aSAndroid Build Coastguard Worker     memmove(end + 1 + exp, end + exp, 1 - exp);
112*9356374aSAndroid Build Coastguard Worker     end[exp] = '.';
113*9356374aSAndroid Build Coastguard Worker     ++end;
114*9356374aSAndroid Build Coastguard Worker   }
115*9356374aSAndroid Build Coastguard Worker   while (*begin == '0' && begin[1] != '.') ++begin;
116*9356374aSAndroid Build Coastguard Worker   return {begin, end};
117*9356374aSAndroid Build Coastguard Worker }
118*9356374aSAndroid Build Coastguard Worker 
TEST(ToString,PerfectDtoa)119*9356374aSAndroid Build Coastguard Worker TEST(ToString, PerfectDtoa) {
120*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(PerfectDtoa(1), Eq("1"));
121*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(PerfectDtoa(0.1),
122*9356374aSAndroid Build Coastguard Worker               Eq("0.1000000000000000055511151231257827021181583404541015625"));
123*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(PerfectDtoa(1e24), Eq("999999999999999983222784"));
124*9356374aSAndroid Build Coastguard Worker   EXPECT_THAT(PerfectDtoa(5e-324), MatchesRegex("0.0000.*625"));
125*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 100; ++i) {
126*9356374aSAndroid Build Coastguard Worker     for (double multiplier :
127*9356374aSAndroid Build Coastguard Worker          {1e-300, 1e-200, 1e-100, 0.1, 1.0, 10.0, 1e100, 1e300}) {
128*9356374aSAndroid Build Coastguard Worker       double d = multiplier * i;
129*9356374aSAndroid Build Coastguard Worker       std::string s = PerfectDtoa(d);
130*9356374aSAndroid Build Coastguard Worker       EXPECT_DOUBLE_EQ(d, strtod(s.c_str(), nullptr));
131*9356374aSAndroid Build Coastguard Worker     }
132*9356374aSAndroid Build Coastguard Worker   }
133*9356374aSAndroid Build Coastguard Worker }
134*9356374aSAndroid Build Coastguard Worker 
135*9356374aSAndroid Build Coastguard Worker template <typename integer>
136*9356374aSAndroid Build Coastguard Worker struct MyInteger {
137*9356374aSAndroid Build Coastguard Worker   integer i;
MyInteger__anon93c6f5cf0111::MyInteger138*9356374aSAndroid Build Coastguard Worker   explicit constexpr MyInteger(integer i) : i(i) {}
operator integer__anon93c6f5cf0111::MyInteger139*9356374aSAndroid Build Coastguard Worker   constexpr operator integer() const { return i; }
140*9356374aSAndroid Build Coastguard Worker 
operator +__anon93c6f5cf0111::MyInteger141*9356374aSAndroid Build Coastguard Worker   constexpr MyInteger operator+(MyInteger other) const { return i + other.i; }
operator -__anon93c6f5cf0111::MyInteger142*9356374aSAndroid Build Coastguard Worker   constexpr MyInteger operator-(MyInteger other) const { return i - other.i; }
operator *__anon93c6f5cf0111::MyInteger143*9356374aSAndroid Build Coastguard Worker   constexpr MyInteger operator*(MyInteger other) const { return i * other.i; }
operator /__anon93c6f5cf0111::MyInteger144*9356374aSAndroid Build Coastguard Worker   constexpr MyInteger operator/(MyInteger other) const { return i / other.i; }
145*9356374aSAndroid Build Coastguard Worker 
operator <__anon93c6f5cf0111::MyInteger146*9356374aSAndroid Build Coastguard Worker   constexpr bool operator<(MyInteger other) const { return i < other.i; }
operator <=__anon93c6f5cf0111::MyInteger147*9356374aSAndroid Build Coastguard Worker   constexpr bool operator<=(MyInteger other) const { return i <= other.i; }
operator ==__anon93c6f5cf0111::MyInteger148*9356374aSAndroid Build Coastguard Worker   constexpr bool operator==(MyInteger other) const { return i == other.i; }
operator >=__anon93c6f5cf0111::MyInteger149*9356374aSAndroid Build Coastguard Worker   constexpr bool operator>=(MyInteger other) const { return i >= other.i; }
operator >__anon93c6f5cf0111::MyInteger150*9356374aSAndroid Build Coastguard Worker   constexpr bool operator>(MyInteger other) const { return i > other.i; }
operator !=__anon93c6f5cf0111::MyInteger151*9356374aSAndroid Build Coastguard Worker   constexpr bool operator!=(MyInteger other) const { return i != other.i; }
152*9356374aSAndroid Build Coastguard Worker 
as_integer__anon93c6f5cf0111::MyInteger153*9356374aSAndroid Build Coastguard Worker   integer as_integer() const { return i; }
154*9356374aSAndroid Build Coastguard Worker };
155*9356374aSAndroid Build Coastguard Worker 
156*9356374aSAndroid Build Coastguard Worker typedef MyInteger<int64_t> MyInt64;
157*9356374aSAndroid Build Coastguard Worker typedef MyInteger<uint64_t> MyUInt64;
158*9356374aSAndroid Build Coastguard Worker 
CheckInt32(int32_t x)159*9356374aSAndroid Build Coastguard Worker void CheckInt32(int32_t x) {
160*9356374aSAndroid Build Coastguard Worker   char buffer[absl::numbers_internal::kFastToBufferSize];
161*9356374aSAndroid Build Coastguard Worker   char* actual = absl::numbers_internal::FastIntToBuffer(x, buffer);
162*9356374aSAndroid Build Coastguard Worker   std::string expected = std::to_string(x);
163*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(expected, std::string(buffer, actual)) << " Input " << x;
164*9356374aSAndroid Build Coastguard Worker 
165*9356374aSAndroid Build Coastguard Worker   char* generic_actual = absl::numbers_internal::FastIntToBuffer(x, buffer);
166*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(expected, std::string(buffer, generic_actual)) << " Input " << x;
167*9356374aSAndroid Build Coastguard Worker }
168*9356374aSAndroid Build Coastguard Worker 
CheckInt64(int64_t x)169*9356374aSAndroid Build Coastguard Worker void CheckInt64(int64_t x) {
170*9356374aSAndroid Build Coastguard Worker   char buffer[absl::numbers_internal::kFastToBufferSize + 3];
171*9356374aSAndroid Build Coastguard Worker   buffer[0] = '*';
172*9356374aSAndroid Build Coastguard Worker   buffer[23] = '*';
173*9356374aSAndroid Build Coastguard Worker   buffer[24] = '*';
174*9356374aSAndroid Build Coastguard Worker   char* actual = absl::numbers_internal::FastIntToBuffer(x, &buffer[1]);
175*9356374aSAndroid Build Coastguard Worker   std::string expected = std::to_string(x);
176*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(expected, std::string(&buffer[1], actual)) << " Input " << x;
177*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(buffer[0], '*');
178*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(buffer[23], '*');
179*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(buffer[24], '*');
180*9356374aSAndroid Build Coastguard Worker 
181*9356374aSAndroid Build Coastguard Worker   char* my_actual =
182*9356374aSAndroid Build Coastguard Worker       absl::numbers_internal::FastIntToBuffer(MyInt64(x), &buffer[1]);
183*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(expected, std::string(&buffer[1], my_actual)) << " Input " << x;
184*9356374aSAndroid Build Coastguard Worker }
185*9356374aSAndroid Build Coastguard Worker 
CheckUInt32(uint32_t x)186*9356374aSAndroid Build Coastguard Worker void CheckUInt32(uint32_t x) {
187*9356374aSAndroid Build Coastguard Worker   char buffer[absl::numbers_internal::kFastToBufferSize];
188*9356374aSAndroid Build Coastguard Worker   char* actual = absl::numbers_internal::FastIntToBuffer(x, buffer);
189*9356374aSAndroid Build Coastguard Worker   std::string expected = std::to_string(x);
190*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(expected, std::string(buffer, actual)) << " Input " << x;
191*9356374aSAndroid Build Coastguard Worker 
192*9356374aSAndroid Build Coastguard Worker   char* generic_actual = absl::numbers_internal::FastIntToBuffer(x, buffer);
193*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(expected, std::string(buffer, generic_actual)) << " Input " << x;
194*9356374aSAndroid Build Coastguard Worker }
195*9356374aSAndroid Build Coastguard Worker 
CheckUInt64(uint64_t x)196*9356374aSAndroid Build Coastguard Worker void CheckUInt64(uint64_t x) {
197*9356374aSAndroid Build Coastguard Worker   char buffer[absl::numbers_internal::kFastToBufferSize + 1];
198*9356374aSAndroid Build Coastguard Worker   char* actual = absl::numbers_internal::FastIntToBuffer(x, &buffer[1]);
199*9356374aSAndroid Build Coastguard Worker   std::string expected = std::to_string(x);
200*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(expected, std::string(&buffer[1], actual)) << " Input " << x;
201*9356374aSAndroid Build Coastguard Worker 
202*9356374aSAndroid Build Coastguard Worker   char* generic_actual = absl::numbers_internal::FastIntToBuffer(x, &buffer[1]);
203*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(expected, std::string(&buffer[1], generic_actual))
204*9356374aSAndroid Build Coastguard Worker       << " Input " << x;
205*9356374aSAndroid Build Coastguard Worker 
206*9356374aSAndroid Build Coastguard Worker   char* my_actual =
207*9356374aSAndroid Build Coastguard Worker       absl::numbers_internal::FastIntToBuffer(MyUInt64(x), &buffer[1]);
208*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(expected, std::string(&buffer[1], my_actual)) << " Input " << x;
209*9356374aSAndroid Build Coastguard Worker }
210*9356374aSAndroid Build Coastguard Worker 
CheckHex64(uint64_t v)211*9356374aSAndroid Build Coastguard Worker void CheckHex64(uint64_t v) {
212*9356374aSAndroid Build Coastguard Worker   char expected[16 + 1];
213*9356374aSAndroid Build Coastguard Worker   std::string actual = absl::StrCat(absl::Hex(v, absl::kZeroPad16));
214*9356374aSAndroid Build Coastguard Worker   snprintf(expected, sizeof(expected), "%016" PRIx64, static_cast<uint64_t>(v));
215*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(expected, actual) << " Input " << v;
216*9356374aSAndroid Build Coastguard Worker   actual = absl::StrCat(absl::Hex(v, absl::kSpacePad16));
217*9356374aSAndroid Build Coastguard Worker   snprintf(expected, sizeof(expected), "%16" PRIx64, static_cast<uint64_t>(v));
218*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(expected, actual) << " Input " << v;
219*9356374aSAndroid Build Coastguard Worker }
220*9356374aSAndroid Build Coastguard Worker 
TEST(Numbers,TestFastPrints)221*9356374aSAndroid Build Coastguard Worker TEST(Numbers, TestFastPrints) {
222*9356374aSAndroid Build Coastguard Worker   for (int i = -100; i <= 100; i++) {
223*9356374aSAndroid Build Coastguard Worker     CheckInt32(i);
224*9356374aSAndroid Build Coastguard Worker     CheckInt64(i);
225*9356374aSAndroid Build Coastguard Worker   }
226*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i <= 100; i++) {
227*9356374aSAndroid Build Coastguard Worker     CheckUInt32(i);
228*9356374aSAndroid Build Coastguard Worker     CheckUInt64(i);
229*9356374aSAndroid Build Coastguard Worker   }
230*9356374aSAndroid Build Coastguard Worker   // Test min int to make sure that works
231*9356374aSAndroid Build Coastguard Worker   CheckInt32(INT_MIN);
232*9356374aSAndroid Build Coastguard Worker   CheckInt32(INT_MAX);
233*9356374aSAndroid Build Coastguard Worker   CheckInt64(LONG_MIN);
234*9356374aSAndroid Build Coastguard Worker   CheckInt64(uint64_t{1000000000});
235*9356374aSAndroid Build Coastguard Worker   CheckInt64(uint64_t{9999999999});
236*9356374aSAndroid Build Coastguard Worker   CheckInt64(uint64_t{100000000000000});
237*9356374aSAndroid Build Coastguard Worker   CheckInt64(uint64_t{999999999999999});
238*9356374aSAndroid Build Coastguard Worker   CheckInt64(uint64_t{1000000000000000000});
239*9356374aSAndroid Build Coastguard Worker   CheckInt64(uint64_t{1199999999999999999});
240*9356374aSAndroid Build Coastguard Worker   CheckInt64(int64_t{-700000000000000000});
241*9356374aSAndroid Build Coastguard Worker   CheckInt64(LONG_MAX);
242*9356374aSAndroid Build Coastguard Worker   CheckUInt32(std::numeric_limits<uint32_t>::max());
243*9356374aSAndroid Build Coastguard Worker   CheckUInt64(uint64_t{1000000000});
244*9356374aSAndroid Build Coastguard Worker   CheckUInt64(uint64_t{9999999999});
245*9356374aSAndroid Build Coastguard Worker   CheckUInt64(uint64_t{100000000000000});
246*9356374aSAndroid Build Coastguard Worker   CheckUInt64(uint64_t{999999999999999});
247*9356374aSAndroid Build Coastguard Worker   CheckUInt64(uint64_t{1000000000000000000});
248*9356374aSAndroid Build Coastguard Worker   CheckUInt64(uint64_t{1199999999999999999});
249*9356374aSAndroid Build Coastguard Worker   CheckUInt64(std::numeric_limits<uint64_t>::max());
250*9356374aSAndroid Build Coastguard Worker 
251*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 10000; i++) {
252*9356374aSAndroid Build Coastguard Worker     CheckHex64(i);
253*9356374aSAndroid Build Coastguard Worker   }
254*9356374aSAndroid Build Coastguard Worker   CheckHex64(uint64_t{0x123456789abcdef0});
255*9356374aSAndroid Build Coastguard Worker }
256*9356374aSAndroid Build Coastguard Worker 
257*9356374aSAndroid Build Coastguard Worker template <typename int_type, typename in_val_type>
VerifySimpleAtoiGood(in_val_type in_value,int_type exp_value)258*9356374aSAndroid Build Coastguard Worker void VerifySimpleAtoiGood(in_val_type in_value, int_type exp_value) {
259*9356374aSAndroid Build Coastguard Worker   std::string s;
260*9356374aSAndroid Build Coastguard Worker   // (u)int128 can be streamed but not StrCat'd.
261*9356374aSAndroid Build Coastguard Worker   absl::strings_internal::OStringStream(&s) << in_value;
262*9356374aSAndroid Build Coastguard Worker   int_type x = static_cast<int_type>(~exp_value);
263*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(SimpleAtoi(s, &x))
264*9356374aSAndroid Build Coastguard Worker       << "in_value=" << in_value << " s=" << s << " x=" << x;
265*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(exp_value, x);
266*9356374aSAndroid Build Coastguard Worker   x = static_cast<int_type>(~exp_value);
267*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(SimpleAtoi(s.c_str(), &x));
268*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(exp_value, x);
269*9356374aSAndroid Build Coastguard Worker }
270*9356374aSAndroid Build Coastguard Worker 
271*9356374aSAndroid Build Coastguard Worker template <typename int_type, typename in_val_type>
VerifySimpleAtoiBad(in_val_type in_value)272*9356374aSAndroid Build Coastguard Worker void VerifySimpleAtoiBad(in_val_type in_value) {
273*9356374aSAndroid Build Coastguard Worker   std::string s;
274*9356374aSAndroid Build Coastguard Worker   // (u)int128 can be streamed but not StrCat'd.
275*9356374aSAndroid Build Coastguard Worker   absl::strings_internal::OStringStream(&s) << in_value;
276*9356374aSAndroid Build Coastguard Worker   int_type x;
277*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(SimpleAtoi(s, &x));
278*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(SimpleAtoi(s.c_str(), &x));
279*9356374aSAndroid Build Coastguard Worker }
280*9356374aSAndroid Build Coastguard Worker 
TEST(NumbersTest,Atoi)281*9356374aSAndroid Build Coastguard Worker TEST(NumbersTest, Atoi) {
282*9356374aSAndroid Build Coastguard Worker   // SimpleAtoi(absl::string_view, int32_t)
283*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<int32_t>(0, 0);
284*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<int32_t>(42, 42);
285*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<int32_t>(-42, -42);
286*9356374aSAndroid Build Coastguard Worker 
287*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<int32_t>(std::numeric_limits<int32_t>::min(),
288*9356374aSAndroid Build Coastguard Worker                                 std::numeric_limits<int32_t>::min());
289*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<int32_t>(std::numeric_limits<int32_t>::max(),
290*9356374aSAndroid Build Coastguard Worker                                 std::numeric_limits<int32_t>::max());
291*9356374aSAndroid Build Coastguard Worker 
292*9356374aSAndroid Build Coastguard Worker   // SimpleAtoi(absl::string_view, uint32_t)
293*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<uint32_t>(0, 0);
294*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<uint32_t>(42, 42);
295*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiBad<uint32_t>(-42);
296*9356374aSAndroid Build Coastguard Worker 
297*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiBad<uint32_t>(std::numeric_limits<int32_t>::min());
298*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<uint32_t>(std::numeric_limits<int32_t>::max(),
299*9356374aSAndroid Build Coastguard Worker                                  std::numeric_limits<int32_t>::max());
300*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<uint32_t>(std::numeric_limits<uint32_t>::max(),
301*9356374aSAndroid Build Coastguard Worker                                  std::numeric_limits<uint32_t>::max());
302*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiBad<uint32_t>(std::numeric_limits<int64_t>::min());
303*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiBad<uint32_t>(std::numeric_limits<int64_t>::max());
304*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiBad<uint32_t>(std::numeric_limits<uint64_t>::max());
305*9356374aSAndroid Build Coastguard Worker 
306*9356374aSAndroid Build Coastguard Worker   // SimpleAtoi(absl::string_view, int64_t)
307*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<int64_t>(0, 0);
308*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<int64_t>(42, 42);
309*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<int64_t>(-42, -42);
310*9356374aSAndroid Build Coastguard Worker 
311*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<int64_t>(std::numeric_limits<int32_t>::min(),
312*9356374aSAndroid Build Coastguard Worker                                 std::numeric_limits<int32_t>::min());
313*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<int64_t>(std::numeric_limits<int32_t>::max(),
314*9356374aSAndroid Build Coastguard Worker                                 std::numeric_limits<int32_t>::max());
315*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<int64_t>(std::numeric_limits<uint32_t>::max(),
316*9356374aSAndroid Build Coastguard Worker                                 std::numeric_limits<uint32_t>::max());
317*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<int64_t>(std::numeric_limits<int64_t>::min(),
318*9356374aSAndroid Build Coastguard Worker                                 std::numeric_limits<int64_t>::min());
319*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<int64_t>(std::numeric_limits<int64_t>::max(),
320*9356374aSAndroid Build Coastguard Worker                                 std::numeric_limits<int64_t>::max());
321*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiBad<int64_t>(std::numeric_limits<uint64_t>::max());
322*9356374aSAndroid Build Coastguard Worker 
323*9356374aSAndroid Build Coastguard Worker   // SimpleAtoi(absl::string_view, uint64_t)
324*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<uint64_t>(0, 0);
325*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<uint64_t>(42, 42);
326*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiBad<uint64_t>(-42);
327*9356374aSAndroid Build Coastguard Worker 
328*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiBad<uint64_t>(std::numeric_limits<int32_t>::min());
329*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<uint64_t>(std::numeric_limits<int32_t>::max(),
330*9356374aSAndroid Build Coastguard Worker                                  std::numeric_limits<int32_t>::max());
331*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<uint64_t>(std::numeric_limits<uint32_t>::max(),
332*9356374aSAndroid Build Coastguard Worker                                  std::numeric_limits<uint32_t>::max());
333*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiBad<uint64_t>(std::numeric_limits<int64_t>::min());
334*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<uint64_t>(std::numeric_limits<int64_t>::max(),
335*9356374aSAndroid Build Coastguard Worker                                  std::numeric_limits<int64_t>::max());
336*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<uint64_t>(std::numeric_limits<uint64_t>::max(),
337*9356374aSAndroid Build Coastguard Worker                                  std::numeric_limits<uint64_t>::max());
338*9356374aSAndroid Build Coastguard Worker 
339*9356374aSAndroid Build Coastguard Worker   // SimpleAtoi(absl::string_view, absl::uint128)
340*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<absl::uint128>(0, 0);
341*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<absl::uint128>(42, 42);
342*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiBad<absl::uint128>(-42);
343*9356374aSAndroid Build Coastguard Worker 
344*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiBad<absl::uint128>(std::numeric_limits<int32_t>::min());
345*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<absl::uint128>(std::numeric_limits<int32_t>::max(),
346*9356374aSAndroid Build Coastguard Worker                                       std::numeric_limits<int32_t>::max());
347*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<absl::uint128>(std::numeric_limits<uint32_t>::max(),
348*9356374aSAndroid Build Coastguard Worker                                       std::numeric_limits<uint32_t>::max());
349*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiBad<absl::uint128>(std::numeric_limits<int64_t>::min());
350*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<absl::uint128>(std::numeric_limits<int64_t>::max(),
351*9356374aSAndroid Build Coastguard Worker                                       std::numeric_limits<int64_t>::max());
352*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<absl::uint128>(std::numeric_limits<uint64_t>::max(),
353*9356374aSAndroid Build Coastguard Worker                                       std::numeric_limits<uint64_t>::max());
354*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<absl::uint128>(
355*9356374aSAndroid Build Coastguard Worker       std::numeric_limits<absl::uint128>::max(),
356*9356374aSAndroid Build Coastguard Worker       std::numeric_limits<absl::uint128>::max());
357*9356374aSAndroid Build Coastguard Worker 
358*9356374aSAndroid Build Coastguard Worker   // SimpleAtoi(absl::string_view, absl::int128)
359*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<absl::int128>(0, 0);
360*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<absl::int128>(42, 42);
361*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<absl::int128>(-42, -42);
362*9356374aSAndroid Build Coastguard Worker 
363*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<absl::int128>(std::numeric_limits<int32_t>::min(),
364*9356374aSAndroid Build Coastguard Worker                                       std::numeric_limits<int32_t>::min());
365*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<absl::int128>(std::numeric_limits<int32_t>::max(),
366*9356374aSAndroid Build Coastguard Worker                                       std::numeric_limits<int32_t>::max());
367*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<absl::int128>(std::numeric_limits<uint32_t>::max(),
368*9356374aSAndroid Build Coastguard Worker                                       std::numeric_limits<uint32_t>::max());
369*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<absl::int128>(std::numeric_limits<int64_t>::min(),
370*9356374aSAndroid Build Coastguard Worker                                       std::numeric_limits<int64_t>::min());
371*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<absl::int128>(std::numeric_limits<int64_t>::max(),
372*9356374aSAndroid Build Coastguard Worker                                       std::numeric_limits<int64_t>::max());
373*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<absl::int128>(std::numeric_limits<uint64_t>::max(),
374*9356374aSAndroid Build Coastguard Worker                                       std::numeric_limits<uint64_t>::max());
375*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<absl::int128>(
376*9356374aSAndroid Build Coastguard Worker       std::numeric_limits<absl::int128>::min(),
377*9356374aSAndroid Build Coastguard Worker       std::numeric_limits<absl::int128>::min());
378*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<absl::int128>(
379*9356374aSAndroid Build Coastguard Worker       std::numeric_limits<absl::int128>::max(),
380*9356374aSAndroid Build Coastguard Worker       std::numeric_limits<absl::int128>::max());
381*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiBad<absl::int128>(std::numeric_limits<absl::uint128>::max());
382*9356374aSAndroid Build Coastguard Worker 
383*9356374aSAndroid Build Coastguard Worker   // Some other types
384*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<int>(-42, -42);
385*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<int32_t>(-42, -42);
386*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<uint32_t>(42, 42);
387*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<unsigned int>(42, 42);
388*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<int64_t>(-42, -42);
389*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<long>(-42, -42);  // NOLINT: runtime-int
390*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<uint64_t>(42, 42);
391*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<size_t>(42, 42);
392*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<std::string::size_type>(42, 42);
393*9356374aSAndroid Build Coastguard Worker }
394*9356374aSAndroid Build Coastguard Worker 
TEST(NumbersTest,Atod)395*9356374aSAndroid Build Coastguard Worker TEST(NumbersTest, Atod) {
396*9356374aSAndroid Build Coastguard Worker   // DBL_TRUE_MIN and FLT_TRUE_MIN were not mandated in <cfloat> before C++17.
397*9356374aSAndroid Build Coastguard Worker #if !defined(DBL_TRUE_MIN)
398*9356374aSAndroid Build Coastguard Worker   static constexpr double DBL_TRUE_MIN =
399*9356374aSAndroid Build Coastguard Worker       4.940656458412465441765687928682213723650598026143247644255856825e-324;
400*9356374aSAndroid Build Coastguard Worker #endif
401*9356374aSAndroid Build Coastguard Worker #if !defined(FLT_TRUE_MIN)
402*9356374aSAndroid Build Coastguard Worker   static constexpr float FLT_TRUE_MIN =
403*9356374aSAndroid Build Coastguard Worker       1.401298464324817070923729583289916131280261941876515771757068284e-45f;
404*9356374aSAndroid Build Coastguard Worker #endif
405*9356374aSAndroid Build Coastguard Worker 
406*9356374aSAndroid Build Coastguard Worker   double d;
407*9356374aSAndroid Build Coastguard Worker   float f;
408*9356374aSAndroid Build Coastguard Worker 
409*9356374aSAndroid Build Coastguard Worker   // NaN can be spelled in multiple ways.
410*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("NaN", &d));
411*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::isnan(d));
412*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("nAN", &d));
413*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::isnan(d));
414*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("-nan", &d));
415*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::isnan(d));
416*9356374aSAndroid Build Coastguard Worker 
417*9356374aSAndroid Build Coastguard Worker   // Likewise for Infinity.
418*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("inf", &d));
419*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::isinf(d) && (d > 0));
420*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("+Infinity", &d));
421*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::isinf(d) && (d > 0));
422*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("-INF", &d));
423*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::isinf(d) && (d < 0));
424*9356374aSAndroid Build Coastguard Worker 
425*9356374aSAndroid Build Coastguard Worker   // Parse DBL_MAX. Parsing something more than twice as big should also
426*9356374aSAndroid Build Coastguard Worker   // produce infinity.
427*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("1.7976931348623157e+308", &d));
428*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(d, 1.7976931348623157e+308);
429*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("5e308", &d));
430*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::isinf(d) && (d > 0));
431*9356374aSAndroid Build Coastguard Worker   // Ditto, but for FLT_MAX.
432*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtof("3.4028234663852886e+38", &f));
433*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(f, 3.4028234663852886e+38f);
434*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtof("7e38", &f));
435*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::isinf(f) && (f > 0));
436*9356374aSAndroid Build Coastguard Worker 
437*9356374aSAndroid Build Coastguard Worker   // Parse the largest N such that parsing 1eN produces a finite value and the
438*9356374aSAndroid Build Coastguard Worker   // smallest M = N + 1 such that parsing 1eM produces infinity.
439*9356374aSAndroid Build Coastguard Worker   //
440*9356374aSAndroid Build Coastguard Worker   // The 309 exponent (and 39) confirms the "definition of
441*9356374aSAndroid Build Coastguard Worker   // kEiselLemireMaxExclExp10" comment in charconv.cc.
442*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("1e308", &d));
443*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(d, 1e308);
444*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(std::isinf(d));
445*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("1e309", &d));
446*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::isinf(d));
447*9356374aSAndroid Build Coastguard Worker   // Ditto, but for Atof instead of Atod.
448*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtof("1e38", &f));
449*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(f, 1e38f);
450*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(std::isinf(f));
451*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtof("1e39", &f));
452*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::isinf(f));
453*9356374aSAndroid Build Coastguard Worker 
454*9356374aSAndroid Build Coastguard Worker   // Parse the largest N such that parsing 9.999999999999999999eN, with 19
455*9356374aSAndroid Build Coastguard Worker   // nines, produces a finite value.
456*9356374aSAndroid Build Coastguard Worker   //
457*9356374aSAndroid Build Coastguard Worker   // 9999999999999999999, with 19 nines but no decimal point, is the largest
458*9356374aSAndroid Build Coastguard Worker   // "repeated nines" integer that fits in a uint64_t.
459*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("9.999999999999999999e307", &d));
460*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(d, 9.999999999999999999e307);
461*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(std::isinf(d));
462*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("9.999999999999999999e308", &d));
463*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::isinf(d));
464*9356374aSAndroid Build Coastguard Worker   // Ditto, but for Atof instead of Atod.
465*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtof("9.999999999999999999e37", &f));
466*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(f, 9.999999999999999999e37f);
467*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(std::isinf(f));
468*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtof("9.999999999999999999e38", &f));
469*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::isinf(f));
470*9356374aSAndroid Build Coastguard Worker 
471*9356374aSAndroid Build Coastguard Worker   // Parse DBL_MIN (normal), DBL_TRUE_MIN (subnormal) and (DBL_TRUE_MIN / 10)
472*9356374aSAndroid Build Coastguard Worker   // (effectively zero).
473*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("2.2250738585072014e-308", &d));
474*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(d, 2.2250738585072014e-308);
475*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("4.9406564584124654e-324", &d));
476*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(d, 4.9406564584124654e-324);
477*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("4.9406564584124654e-325", &d));
478*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(d, 0);
479*9356374aSAndroid Build Coastguard Worker   // Ditto, but for FLT_MIN, FLT_TRUE_MIN and (FLT_TRUE_MIN / 10).
480*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtof("1.1754943508222875e-38", &f));
481*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(f, 1.1754943508222875e-38f);
482*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtof("1.4012984643248171e-45", &f));
483*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(f, 1.4012984643248171e-45f);
484*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtof("1.4012984643248171e-46", &f));
485*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(f, 0);
486*9356374aSAndroid Build Coastguard Worker 
487*9356374aSAndroid Build Coastguard Worker   // Parse the largest N (the most negative -N) such that parsing 1e-N produces
488*9356374aSAndroid Build Coastguard Worker   // a normal or subnormal (but still positive) or zero value.
489*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("1e-307", &d));
490*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(d, 1e-307);
491*9356374aSAndroid Build Coastguard Worker   EXPECT_GE(d, DBL_MIN);
492*9356374aSAndroid Build Coastguard Worker   EXPECT_LT(d, DBL_MIN * 10);
493*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("1e-323", &d));
494*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(d, 1e-323);
495*9356374aSAndroid Build Coastguard Worker   EXPECT_GE(d, DBL_TRUE_MIN);
496*9356374aSAndroid Build Coastguard Worker   EXPECT_LT(d, DBL_TRUE_MIN * 10);
497*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("1e-324", &d));
498*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(d, 0);
499*9356374aSAndroid Build Coastguard Worker   // Ditto, but for Atof instead of Atod.
500*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtof("1e-37", &f));
501*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(f, 1e-37f);
502*9356374aSAndroid Build Coastguard Worker   EXPECT_GE(f, FLT_MIN);
503*9356374aSAndroid Build Coastguard Worker   EXPECT_LT(f, FLT_MIN * 10);
504*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtof("1e-45", &f));
505*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(f, 1e-45f);
506*9356374aSAndroid Build Coastguard Worker   EXPECT_GE(f, FLT_TRUE_MIN);
507*9356374aSAndroid Build Coastguard Worker   EXPECT_LT(f, FLT_TRUE_MIN * 10);
508*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtof("1e-46", &f));
509*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(f, 0);
510*9356374aSAndroid Build Coastguard Worker 
511*9356374aSAndroid Build Coastguard Worker   // Parse the largest N (the most negative -N) such that parsing
512*9356374aSAndroid Build Coastguard Worker   // 9.999999999999999999e-N, with 19 nines, produces a normal or subnormal
513*9356374aSAndroid Build Coastguard Worker   // (but still positive) or zero value.
514*9356374aSAndroid Build Coastguard Worker   //
515*9356374aSAndroid Build Coastguard Worker   // 9999999999999999999, with 19 nines but no decimal point, is the largest
516*9356374aSAndroid Build Coastguard Worker   // "repeated nines" integer that fits in a uint64_t.
517*9356374aSAndroid Build Coastguard Worker   //
518*9356374aSAndroid Build Coastguard Worker   // The -324/-325 exponents (and -46/-47) confirms the "definition of
519*9356374aSAndroid Build Coastguard Worker   // kEiselLemireMinInclExp10" comment in charconv.cc.
520*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("9.999999999999999999e-308", &d));
521*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(d, 9.999999999999999999e-308);
522*9356374aSAndroid Build Coastguard Worker   EXPECT_GE(d, DBL_MIN);
523*9356374aSAndroid Build Coastguard Worker   EXPECT_LT(d, DBL_MIN * 10);
524*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("9.999999999999999999e-324", &d));
525*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(d, 9.999999999999999999e-324);
526*9356374aSAndroid Build Coastguard Worker   EXPECT_GE(d, DBL_TRUE_MIN);
527*9356374aSAndroid Build Coastguard Worker   EXPECT_LT(d, DBL_TRUE_MIN * 10);
528*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("9.999999999999999999e-325", &d));
529*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(d, 0);
530*9356374aSAndroid Build Coastguard Worker   // Ditto, but for Atof instead of Atod.
531*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtof("9.999999999999999999e-38", &f));
532*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(f, 9.999999999999999999e-38f);
533*9356374aSAndroid Build Coastguard Worker   EXPECT_GE(f, FLT_MIN);
534*9356374aSAndroid Build Coastguard Worker   EXPECT_LT(f, FLT_MIN * 10);
535*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtof("9.999999999999999999e-46", &f));
536*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(f, 9.999999999999999999e-46f);
537*9356374aSAndroid Build Coastguard Worker   EXPECT_GE(f, FLT_TRUE_MIN);
538*9356374aSAndroid Build Coastguard Worker   EXPECT_LT(f, FLT_TRUE_MIN * 10);
539*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtof("9.999999999999999999e-47", &f));
540*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(f, 0);
541*9356374aSAndroid Build Coastguard Worker 
542*9356374aSAndroid Build Coastguard Worker   // Leading and/or trailing whitespace is OK.
543*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("  \t\r\n  2.718", &d));
544*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(d, 2.718);
545*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("  3.141  ", &d));
546*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(d, 3.141);
547*9356374aSAndroid Build Coastguard Worker 
548*9356374aSAndroid Build Coastguard Worker   // Leading or trailing not-whitespace is not OK.
549*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::SimpleAtod("n 0", &d));
550*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::SimpleAtod("0n ", &d));
551*9356374aSAndroid Build Coastguard Worker 
552*9356374aSAndroid Build Coastguard Worker   // Multiple leading 0s are OK.
553*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("000123", &d));
554*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(d, 123);
555*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("000.456", &d));
556*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(d, 0.456);
557*9356374aSAndroid Build Coastguard Worker 
558*9356374aSAndroid Build Coastguard Worker   // An absent leading 0 (for a fraction < 1) is OK.
559*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod(".5", &d));
560*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(d, 0.5);
561*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("-.707", &d));
562*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(d, -0.707);
563*9356374aSAndroid Build Coastguard Worker 
564*9356374aSAndroid Build Coastguard Worker   // Unary + is OK.
565*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("+6.0221408e+23", &d));
566*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(d, 6.0221408e+23);
567*9356374aSAndroid Build Coastguard Worker 
568*9356374aSAndroid Build Coastguard Worker   // Underscores are not OK.
569*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::SimpleAtod("123_456", &d));
570*9356374aSAndroid Build Coastguard Worker 
571*9356374aSAndroid Build Coastguard Worker   // The decimal separator must be '.' and is never ','.
572*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("8.9", &d));
573*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::SimpleAtod("8,9", &d));
574*9356374aSAndroid Build Coastguard Worker 
575*9356374aSAndroid Build Coastguard Worker   // These examples are called out in the EiselLemire function's comments.
576*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("4503599627370497.5", &d));
577*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(d, 4503599627370497.5);
578*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("1e+23", &d));
579*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(d, 1e+23);
580*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("9223372036854775807", &d));
581*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(d, 9223372036854775807);
582*9356374aSAndroid Build Coastguard Worker   // Ditto, but for Atof instead of Atod.
583*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtof("0.0625", &f));
584*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(f, 0.0625f);
585*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtof("20040229.0", &f));
586*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(f, 20040229.0f);
587*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtof("2147483647.0", &f));
588*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(f, 2147483647.0f);
589*9356374aSAndroid Build Coastguard Worker 
590*9356374aSAndroid Build Coastguard Worker   // Some parsing algorithms don't always round correctly (but absl::SimpleAtod
591*9356374aSAndroid Build Coastguard Worker   // should). This test case comes from
592*9356374aSAndroid Build Coastguard Worker   // https://github.com/serde-rs/json/issues/707
593*9356374aSAndroid Build Coastguard Worker   //
594*9356374aSAndroid Build Coastguard Worker   // See also atod_manual_test.cc for running many more test cases.
595*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("122.416294033786585", &d));
596*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(d, 122.416294033786585);
597*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtof("122.416294033786585", &f));
598*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(f, 122.416294033786585f);
599*9356374aSAndroid Build Coastguard Worker }
600*9356374aSAndroid Build Coastguard Worker 
TEST(NumbersTest,Prefixes)601*9356374aSAndroid Build Coastguard Worker TEST(NumbersTest, Prefixes) {
602*9356374aSAndroid Build Coastguard Worker   double d;
603*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::SimpleAtod("++1", &d));
604*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::SimpleAtod("+-1", &d));
605*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::SimpleAtod("-+1", &d));
606*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::SimpleAtod("--1", &d));
607*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("-1", &d));
608*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(d, -1.);
609*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtod("+1", &d));
610*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(d, +1.);
611*9356374aSAndroid Build Coastguard Worker 
612*9356374aSAndroid Build Coastguard Worker   float f;
613*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::SimpleAtof("++1", &f));
614*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::SimpleAtof("+-1", &f));
615*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::SimpleAtof("-+1", &f));
616*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::SimpleAtof("--1", &f));
617*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtof("-1", &f));
618*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(f, -1.f);
619*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::SimpleAtof("+1", &f));
620*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(f, +1.f);
621*9356374aSAndroid Build Coastguard Worker }
622*9356374aSAndroid Build Coastguard Worker 
TEST(NumbersTest,Atoenum)623*9356374aSAndroid Build Coastguard Worker TEST(NumbersTest, Atoenum) {
624*9356374aSAndroid Build Coastguard Worker   enum E01 {
625*9356374aSAndroid Build Coastguard Worker     E01_zero = 0,
626*9356374aSAndroid Build Coastguard Worker     E01_one = 1,
627*9356374aSAndroid Build Coastguard Worker   };
628*9356374aSAndroid Build Coastguard Worker 
629*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<E01>(E01_zero, E01_zero);
630*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<E01>(E01_one, E01_one);
631*9356374aSAndroid Build Coastguard Worker 
632*9356374aSAndroid Build Coastguard Worker   enum E_101 {
633*9356374aSAndroid Build Coastguard Worker     E_101_minusone = -1,
634*9356374aSAndroid Build Coastguard Worker     E_101_zero = 0,
635*9356374aSAndroid Build Coastguard Worker     E_101_one = 1,
636*9356374aSAndroid Build Coastguard Worker   };
637*9356374aSAndroid Build Coastguard Worker 
638*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<E_101>(E_101_minusone, E_101_minusone);
639*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<E_101>(E_101_zero, E_101_zero);
640*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<E_101>(E_101_one, E_101_one);
641*9356374aSAndroid Build Coastguard Worker 
642*9356374aSAndroid Build Coastguard Worker   enum E_bigint {
643*9356374aSAndroid Build Coastguard Worker     E_bigint_zero = 0,
644*9356374aSAndroid Build Coastguard Worker     E_bigint_one = 1,
645*9356374aSAndroid Build Coastguard Worker     E_bigint_max31 = static_cast<int32_t>(0x7FFFFFFF),
646*9356374aSAndroid Build Coastguard Worker   };
647*9356374aSAndroid Build Coastguard Worker 
648*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<E_bigint>(E_bigint_zero, E_bigint_zero);
649*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<E_bigint>(E_bigint_one, E_bigint_one);
650*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<E_bigint>(E_bigint_max31, E_bigint_max31);
651*9356374aSAndroid Build Coastguard Worker 
652*9356374aSAndroid Build Coastguard Worker   enum E_fullint {
653*9356374aSAndroid Build Coastguard Worker     E_fullint_zero = 0,
654*9356374aSAndroid Build Coastguard Worker     E_fullint_one = 1,
655*9356374aSAndroid Build Coastguard Worker     E_fullint_max31 = static_cast<int32_t>(0x7FFFFFFF),
656*9356374aSAndroid Build Coastguard Worker     E_fullint_min32 = INT32_MIN,
657*9356374aSAndroid Build Coastguard Worker   };
658*9356374aSAndroid Build Coastguard Worker 
659*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<E_fullint>(E_fullint_zero, E_fullint_zero);
660*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<E_fullint>(E_fullint_one, E_fullint_one);
661*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<E_fullint>(E_fullint_max31, E_fullint_max31);
662*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<E_fullint>(E_fullint_min32, E_fullint_min32);
663*9356374aSAndroid Build Coastguard Worker 
664*9356374aSAndroid Build Coastguard Worker   enum E_biguint {
665*9356374aSAndroid Build Coastguard Worker     E_biguint_zero = 0,
666*9356374aSAndroid Build Coastguard Worker     E_biguint_one = 1,
667*9356374aSAndroid Build Coastguard Worker     E_biguint_max31 = static_cast<uint32_t>(0x7FFFFFFF),
668*9356374aSAndroid Build Coastguard Worker     E_biguint_max32 = static_cast<uint32_t>(0xFFFFFFFF),
669*9356374aSAndroid Build Coastguard Worker   };
670*9356374aSAndroid Build Coastguard Worker 
671*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<E_biguint>(E_biguint_zero, E_biguint_zero);
672*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<E_biguint>(E_biguint_one, E_biguint_one);
673*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<E_biguint>(E_biguint_max31, E_biguint_max31);
674*9356374aSAndroid Build Coastguard Worker   VerifySimpleAtoiGood<E_biguint>(E_biguint_max32, E_biguint_max32);
675*9356374aSAndroid Build Coastguard Worker }
676*9356374aSAndroid Build Coastguard Worker 
677*9356374aSAndroid Build Coastguard Worker template <typename int_type, typename in_val_type>
VerifySimpleHexAtoiGood(in_val_type in_value,int_type exp_value)678*9356374aSAndroid Build Coastguard Worker void VerifySimpleHexAtoiGood(in_val_type in_value, int_type exp_value) {
679*9356374aSAndroid Build Coastguard Worker   std::string s;
680*9356374aSAndroid Build Coastguard Worker   // uint128 can be streamed but not StrCat'd
681*9356374aSAndroid Build Coastguard Worker   absl::strings_internal::OStringStream strm(&s);
682*9356374aSAndroid Build Coastguard Worker   if (in_value >= 0) {
683*9356374aSAndroid Build Coastguard Worker     strm << std::hex << in_value;
684*9356374aSAndroid Build Coastguard Worker   } else {
685*9356374aSAndroid Build Coastguard Worker     // Inefficient for small integers, but works with all integral types.
686*9356374aSAndroid Build Coastguard Worker     strm << "-" << std::hex << -absl::uint128(in_value);
687*9356374aSAndroid Build Coastguard Worker   }
688*9356374aSAndroid Build Coastguard Worker   int_type x = static_cast<int_type>(~exp_value);
689*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(SimpleHexAtoi(s, &x))
690*9356374aSAndroid Build Coastguard Worker       << "in_value=" << std::hex << in_value << " s=" << s << " x=" << x;
691*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(exp_value, x);
692*9356374aSAndroid Build Coastguard Worker   x = static_cast<int_type>(~exp_value);
693*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(SimpleHexAtoi(
694*9356374aSAndroid Build Coastguard Worker       s.c_str(), &x));  // NOLINT: readability-redundant-string-conversions
695*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(exp_value, x);
696*9356374aSAndroid Build Coastguard Worker }
697*9356374aSAndroid Build Coastguard Worker 
698*9356374aSAndroid Build Coastguard Worker template <typename int_type, typename in_val_type>
VerifySimpleHexAtoiBad(in_val_type in_value)699*9356374aSAndroid Build Coastguard Worker void VerifySimpleHexAtoiBad(in_val_type in_value) {
700*9356374aSAndroid Build Coastguard Worker   std::string s;
701*9356374aSAndroid Build Coastguard Worker   // uint128 can be streamed but not StrCat'd
702*9356374aSAndroid Build Coastguard Worker   absl::strings_internal::OStringStream strm(&s);
703*9356374aSAndroid Build Coastguard Worker   if (in_value >= 0) {
704*9356374aSAndroid Build Coastguard Worker     strm << std::hex << in_value;
705*9356374aSAndroid Build Coastguard Worker   } else {
706*9356374aSAndroid Build Coastguard Worker     // Inefficient for small integers, but works with all integral types.
707*9356374aSAndroid Build Coastguard Worker     strm << "-" << std::hex << -absl::uint128(in_value);
708*9356374aSAndroid Build Coastguard Worker   }
709*9356374aSAndroid Build Coastguard Worker   int_type x;
710*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(SimpleHexAtoi(s, &x));
711*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(SimpleHexAtoi(
712*9356374aSAndroid Build Coastguard Worker       s.c_str(), &x));  // NOLINT: readability-redundant-string-conversions
713*9356374aSAndroid Build Coastguard Worker }
714*9356374aSAndroid Build Coastguard Worker 
TEST(NumbersTest,HexAtoi)715*9356374aSAndroid Build Coastguard Worker TEST(NumbersTest, HexAtoi) {
716*9356374aSAndroid Build Coastguard Worker   // SimpleHexAtoi(absl::string_view, int32_t)
717*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<int32_t>(0, 0);
718*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<int32_t>(0x42, 0x42);
719*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<int32_t>(-0x42, -0x42);
720*9356374aSAndroid Build Coastguard Worker 
721*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<int32_t>(std::numeric_limits<int32_t>::min(),
722*9356374aSAndroid Build Coastguard Worker                                    std::numeric_limits<int32_t>::min());
723*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<int32_t>(std::numeric_limits<int32_t>::max(),
724*9356374aSAndroid Build Coastguard Worker                                    std::numeric_limits<int32_t>::max());
725*9356374aSAndroid Build Coastguard Worker 
726*9356374aSAndroid Build Coastguard Worker   // SimpleHexAtoi(absl::string_view, uint32_t)
727*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<uint32_t>(0, 0);
728*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<uint32_t>(0x42, 0x42);
729*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiBad<uint32_t>(-0x42);
730*9356374aSAndroid Build Coastguard Worker 
731*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiBad<uint32_t>(std::numeric_limits<int32_t>::min());
732*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<uint32_t>(std::numeric_limits<int32_t>::max(),
733*9356374aSAndroid Build Coastguard Worker                                     std::numeric_limits<int32_t>::max());
734*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<uint32_t>(std::numeric_limits<uint32_t>::max(),
735*9356374aSAndroid Build Coastguard Worker                                     std::numeric_limits<uint32_t>::max());
736*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiBad<uint32_t>(std::numeric_limits<int64_t>::min());
737*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiBad<uint32_t>(std::numeric_limits<int64_t>::max());
738*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiBad<uint32_t>(std::numeric_limits<uint64_t>::max());
739*9356374aSAndroid Build Coastguard Worker 
740*9356374aSAndroid Build Coastguard Worker   // SimpleHexAtoi(absl::string_view, int64_t)
741*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<int64_t>(0, 0);
742*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<int64_t>(0x42, 0x42);
743*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<int64_t>(-0x42, -0x42);
744*9356374aSAndroid Build Coastguard Worker 
745*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<int64_t>(std::numeric_limits<int32_t>::min(),
746*9356374aSAndroid Build Coastguard Worker                                    std::numeric_limits<int32_t>::min());
747*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<int64_t>(std::numeric_limits<int32_t>::max(),
748*9356374aSAndroid Build Coastguard Worker                                    std::numeric_limits<int32_t>::max());
749*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<int64_t>(std::numeric_limits<uint32_t>::max(),
750*9356374aSAndroid Build Coastguard Worker                                    std::numeric_limits<uint32_t>::max());
751*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<int64_t>(std::numeric_limits<int64_t>::min(),
752*9356374aSAndroid Build Coastguard Worker                                    std::numeric_limits<int64_t>::min());
753*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<int64_t>(std::numeric_limits<int64_t>::max(),
754*9356374aSAndroid Build Coastguard Worker                                    std::numeric_limits<int64_t>::max());
755*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiBad<int64_t>(std::numeric_limits<uint64_t>::max());
756*9356374aSAndroid Build Coastguard Worker 
757*9356374aSAndroid Build Coastguard Worker   // SimpleHexAtoi(absl::string_view, uint64_t)
758*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<uint64_t>(0, 0);
759*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<uint64_t>(0x42, 0x42);
760*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiBad<uint64_t>(-0x42);
761*9356374aSAndroid Build Coastguard Worker 
762*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiBad<uint64_t>(std::numeric_limits<int32_t>::min());
763*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<uint64_t>(std::numeric_limits<int32_t>::max(),
764*9356374aSAndroid Build Coastguard Worker                                     std::numeric_limits<int32_t>::max());
765*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<uint64_t>(std::numeric_limits<uint32_t>::max(),
766*9356374aSAndroid Build Coastguard Worker                                     std::numeric_limits<uint32_t>::max());
767*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiBad<uint64_t>(std::numeric_limits<int64_t>::min());
768*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<uint64_t>(std::numeric_limits<int64_t>::max(),
769*9356374aSAndroid Build Coastguard Worker                                     std::numeric_limits<int64_t>::max());
770*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<uint64_t>(std::numeric_limits<uint64_t>::max(),
771*9356374aSAndroid Build Coastguard Worker                                     std::numeric_limits<uint64_t>::max());
772*9356374aSAndroid Build Coastguard Worker 
773*9356374aSAndroid Build Coastguard Worker   // SimpleHexAtoi(absl::string_view, absl::uint128)
774*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<absl::uint128>(0, 0);
775*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<absl::uint128>(0x42, 0x42);
776*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiBad<absl::uint128>(-0x42);
777*9356374aSAndroid Build Coastguard Worker 
778*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiBad<absl::uint128>(std::numeric_limits<int32_t>::min());
779*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<absl::uint128>(std::numeric_limits<int32_t>::max(),
780*9356374aSAndroid Build Coastguard Worker                                          std::numeric_limits<int32_t>::max());
781*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<absl::uint128>(std::numeric_limits<uint32_t>::max(),
782*9356374aSAndroid Build Coastguard Worker                                          std::numeric_limits<uint32_t>::max());
783*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiBad<absl::uint128>(std::numeric_limits<int64_t>::min());
784*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<absl::uint128>(std::numeric_limits<int64_t>::max(),
785*9356374aSAndroid Build Coastguard Worker                                          std::numeric_limits<int64_t>::max());
786*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<absl::uint128>(std::numeric_limits<uint64_t>::max(),
787*9356374aSAndroid Build Coastguard Worker                                          std::numeric_limits<uint64_t>::max());
788*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<absl::uint128>(
789*9356374aSAndroid Build Coastguard Worker       std::numeric_limits<absl::uint128>::max(),
790*9356374aSAndroid Build Coastguard Worker       std::numeric_limits<absl::uint128>::max());
791*9356374aSAndroid Build Coastguard Worker 
792*9356374aSAndroid Build Coastguard Worker   // Some other types
793*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<int>(-0x42, -0x42);
794*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<int32_t>(-0x42, -0x42);
795*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<uint32_t>(0x42, 0x42);
796*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<unsigned int>(0x42, 0x42);
797*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<int64_t>(-0x42, -0x42);
798*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<long>(-0x42, -0x42);  // NOLINT: runtime-int
799*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<uint64_t>(0x42, 0x42);
800*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<size_t>(0x42, 0x42);
801*9356374aSAndroid Build Coastguard Worker   VerifySimpleHexAtoiGood<std::string::size_type>(0x42, 0x42);
802*9356374aSAndroid Build Coastguard Worker 
803*9356374aSAndroid Build Coastguard Worker   // Number prefix
804*9356374aSAndroid Build Coastguard Worker   int32_t value;
805*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto32_base("0x34234324", &value, 16));
806*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0x34234324, value);
807*9356374aSAndroid Build Coastguard Worker 
808*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto32_base("0X34234324", &value, 16));
809*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0x34234324, value);
810*9356374aSAndroid Build Coastguard Worker 
811*9356374aSAndroid Build Coastguard Worker   // ASCII whitespace
812*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto32_base(" \t\n 34234324", &value, 16));
813*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0x34234324, value);
814*9356374aSAndroid Build Coastguard Worker 
815*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto32_base("34234324 \t\n ", &value, 16));
816*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0x34234324, value);
817*9356374aSAndroid Build Coastguard Worker }
818*9356374aSAndroid Build Coastguard Worker 
TEST(stringtest,safe_strto32_base)819*9356374aSAndroid Build Coastguard Worker TEST(stringtest, safe_strto32_base) {
820*9356374aSAndroid Build Coastguard Worker   int32_t value;
821*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto32_base("0x34234324", &value, 16));
822*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0x34234324, value);
823*9356374aSAndroid Build Coastguard Worker 
824*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto32_base("0X34234324", &value, 16));
825*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0x34234324, value);
826*9356374aSAndroid Build Coastguard Worker 
827*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto32_base("34234324", &value, 16));
828*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0x34234324, value);
829*9356374aSAndroid Build Coastguard Worker 
830*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto32_base("0", &value, 16));
831*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, value);
832*9356374aSAndroid Build Coastguard Worker 
833*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto32_base(" \t\n -0x34234324", &value, 16));
834*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-0x34234324, value);
835*9356374aSAndroid Build Coastguard Worker 
836*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto32_base(" \t\n -34234324", &value, 16));
837*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-0x34234324, value);
838*9356374aSAndroid Build Coastguard Worker 
839*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto32_base("7654321", &value, 8));
840*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(07654321, value);
841*9356374aSAndroid Build Coastguard Worker 
842*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto32_base("-01234", &value, 8));
843*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-01234, value);
844*9356374aSAndroid Build Coastguard Worker 
845*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto32_base("1834", &value, 8));
846*9356374aSAndroid Build Coastguard Worker 
847*9356374aSAndroid Build Coastguard Worker   // Autodetect base.
848*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto32_base("0", &value, 0));
849*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, value);
850*9356374aSAndroid Build Coastguard Worker 
851*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto32_base("077", &value, 0));
852*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(077, value);  // Octal interpretation
853*9356374aSAndroid Build Coastguard Worker 
854*9356374aSAndroid Build Coastguard Worker   // Leading zero indicates octal, but then followed by invalid digit.
855*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto32_base("088", &value, 0));
856*9356374aSAndroid Build Coastguard Worker 
857*9356374aSAndroid Build Coastguard Worker   // Leading 0x indicated hex, but then followed by invalid digit.
858*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto32_base("0xG", &value, 0));
859*9356374aSAndroid Build Coastguard Worker 
860*9356374aSAndroid Build Coastguard Worker   // Base-10 version.
861*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto32_base("34234324", &value, 10));
862*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(34234324, value);
863*9356374aSAndroid Build Coastguard Worker 
864*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto32_base("0", &value, 10));
865*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, value);
866*9356374aSAndroid Build Coastguard Worker 
867*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto32_base(" \t\n -34234324", &value, 10));
868*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(-34234324, value);
869*9356374aSAndroid Build Coastguard Worker 
870*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto32_base("34234324 \n\t ", &value, 10));
871*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(34234324, value);
872*9356374aSAndroid Build Coastguard Worker 
873*9356374aSAndroid Build Coastguard Worker   // Invalid ints.
874*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto32_base("", &value, 10));
875*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto32_base("  ", &value, 10));
876*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto32_base("abc", &value, 10));
877*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto32_base("34234324a", &value, 10));
878*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto32_base("34234.3", &value, 10));
879*9356374aSAndroid Build Coastguard Worker 
880*9356374aSAndroid Build Coastguard Worker   // Out of bounds.
881*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto32_base("2147483648", &value, 10));
882*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto32_base("-2147483649", &value, 10));
883*9356374aSAndroid Build Coastguard Worker 
884*9356374aSAndroid Build Coastguard Worker   // String version.
885*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto32_base(std::string("0x1234"), &value, 16));
886*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0x1234, value);
887*9356374aSAndroid Build Coastguard Worker 
888*9356374aSAndroid Build Coastguard Worker   // Base-10 string version.
889*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto32_base("1234", &value, 10));
890*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(1234, value);
891*9356374aSAndroid Build Coastguard Worker }
892*9356374aSAndroid Build Coastguard Worker 
TEST(stringtest,safe_strto32_range)893*9356374aSAndroid Build Coastguard Worker TEST(stringtest, safe_strto32_range) {
894*9356374aSAndroid Build Coastguard Worker   // These tests verify underflow/overflow behaviour.
895*9356374aSAndroid Build Coastguard Worker   int32_t value;
896*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto32_base("2147483648", &value, 10));
897*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(std::numeric_limits<int32_t>::max(), value);
898*9356374aSAndroid Build Coastguard Worker 
899*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto32_base("-2147483648", &value, 10));
900*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(std::numeric_limits<int32_t>::min(), value);
901*9356374aSAndroid Build Coastguard Worker 
902*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto32_base("-2147483649", &value, 10));
903*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(std::numeric_limits<int32_t>::min(), value);
904*9356374aSAndroid Build Coastguard Worker }
905*9356374aSAndroid Build Coastguard Worker 
TEST(stringtest,safe_strto64_range)906*9356374aSAndroid Build Coastguard Worker TEST(stringtest, safe_strto64_range) {
907*9356374aSAndroid Build Coastguard Worker   // These tests verify underflow/overflow behaviour.
908*9356374aSAndroid Build Coastguard Worker   int64_t value;
909*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto64_base("9223372036854775808", &value, 10));
910*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(std::numeric_limits<int64_t>::max(), value);
911*9356374aSAndroid Build Coastguard Worker 
912*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto64_base("-9223372036854775808", &value, 10));
913*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(std::numeric_limits<int64_t>::min(), value);
914*9356374aSAndroid Build Coastguard Worker 
915*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto64_base("-9223372036854775809", &value, 10));
916*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(std::numeric_limits<int64_t>::min(), value);
917*9356374aSAndroid Build Coastguard Worker }
918*9356374aSAndroid Build Coastguard Worker 
TEST(stringtest,safe_strto32_leading_substring)919*9356374aSAndroid Build Coastguard Worker TEST(stringtest, safe_strto32_leading_substring) {
920*9356374aSAndroid Build Coastguard Worker   // These tests verify this comment in numbers.h:
921*9356374aSAndroid Build Coastguard Worker   // On error, returns false, and sets *value to: [...]
922*9356374aSAndroid Build Coastguard Worker   //   conversion of leading substring if available ("123@@@" -> 123)
923*9356374aSAndroid Build Coastguard Worker   //   0 if no leading substring available
924*9356374aSAndroid Build Coastguard Worker   int32_t value;
925*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto32_base("04069@@@", &value, 10));
926*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(4069, value);
927*9356374aSAndroid Build Coastguard Worker 
928*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto32_base("04069@@@", &value, 8));
929*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0406, value);
930*9356374aSAndroid Build Coastguard Worker 
931*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto32_base("04069balloons", &value, 10));
932*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(4069, value);
933*9356374aSAndroid Build Coastguard Worker 
934*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto32_base("04069balloons", &value, 16));
935*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0x4069ba, value);
936*9356374aSAndroid Build Coastguard Worker 
937*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto32_base("@@@", &value, 10));
938*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, value);  // there was no leading substring
939*9356374aSAndroid Build Coastguard Worker }
940*9356374aSAndroid Build Coastguard Worker 
TEST(stringtest,safe_strto64_leading_substring)941*9356374aSAndroid Build Coastguard Worker TEST(stringtest, safe_strto64_leading_substring) {
942*9356374aSAndroid Build Coastguard Worker   // These tests verify this comment in numbers.h:
943*9356374aSAndroid Build Coastguard Worker   // On error, returns false, and sets *value to: [...]
944*9356374aSAndroid Build Coastguard Worker   //   conversion of leading substring if available ("123@@@" -> 123)
945*9356374aSAndroid Build Coastguard Worker   //   0 if no leading substring available
946*9356374aSAndroid Build Coastguard Worker   int64_t value;
947*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto64_base("04069@@@", &value, 10));
948*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(4069, value);
949*9356374aSAndroid Build Coastguard Worker 
950*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto64_base("04069@@@", &value, 8));
951*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0406, value);
952*9356374aSAndroid Build Coastguard Worker 
953*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto64_base("04069balloons", &value, 10));
954*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(4069, value);
955*9356374aSAndroid Build Coastguard Worker 
956*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto64_base("04069balloons", &value, 16));
957*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0x4069ba, value);
958*9356374aSAndroid Build Coastguard Worker 
959*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto64_base("@@@", &value, 10));
960*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, value);  // there was no leading substring
961*9356374aSAndroid Build Coastguard Worker }
962*9356374aSAndroid Build Coastguard Worker 
TEST(stringtest,safe_strto64_base)963*9356374aSAndroid Build Coastguard Worker TEST(stringtest, safe_strto64_base) {
964*9356374aSAndroid Build Coastguard Worker   int64_t value;
965*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto64_base("0x3423432448783446", &value, 16));
966*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(int64_t{0x3423432448783446}, value);
967*9356374aSAndroid Build Coastguard Worker 
968*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto64_base("3423432448783446", &value, 16));
969*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(int64_t{0x3423432448783446}, value);
970*9356374aSAndroid Build Coastguard Worker 
971*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto64_base("0", &value, 16));
972*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, value);
973*9356374aSAndroid Build Coastguard Worker 
974*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto64_base(" \t\n -0x3423432448783446", &value, 16));
975*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(int64_t{-0x3423432448783446}, value);
976*9356374aSAndroid Build Coastguard Worker 
977*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto64_base(" \t\n -3423432448783446", &value, 16));
978*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(int64_t{-0x3423432448783446}, value);
979*9356374aSAndroid Build Coastguard Worker 
980*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto64_base("123456701234567012", &value, 8));
981*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(int64_t{0123456701234567012}, value);
982*9356374aSAndroid Build Coastguard Worker 
983*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto64_base("-017777777777777", &value, 8));
984*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(int64_t{-017777777777777}, value);
985*9356374aSAndroid Build Coastguard Worker 
986*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto64_base("19777777777777", &value, 8));
987*9356374aSAndroid Build Coastguard Worker 
988*9356374aSAndroid Build Coastguard Worker   // Autodetect base.
989*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto64_base("0", &value, 0));
990*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, value);
991*9356374aSAndroid Build Coastguard Worker 
992*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto64_base("077", &value, 0));
993*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(077, value);  // Octal interpretation
994*9356374aSAndroid Build Coastguard Worker 
995*9356374aSAndroid Build Coastguard Worker   // Leading zero indicates octal, but then followed by invalid digit.
996*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto64_base("088", &value, 0));
997*9356374aSAndroid Build Coastguard Worker 
998*9356374aSAndroid Build Coastguard Worker   // Leading 0x indicated hex, but then followed by invalid digit.
999*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto64_base("0xG", &value, 0));
1000*9356374aSAndroid Build Coastguard Worker 
1001*9356374aSAndroid Build Coastguard Worker   // Base-10 version.
1002*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto64_base("34234324487834466", &value, 10));
1003*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(int64_t{34234324487834466}, value);
1004*9356374aSAndroid Build Coastguard Worker 
1005*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto64_base("0", &value, 10));
1006*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0, value);
1007*9356374aSAndroid Build Coastguard Worker 
1008*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto64_base(" \t\n -34234324487834466", &value, 10));
1009*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(int64_t{-34234324487834466}, value);
1010*9356374aSAndroid Build Coastguard Worker 
1011*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto64_base("34234324487834466 \n\t ", &value, 10));
1012*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(int64_t{34234324487834466}, value);
1013*9356374aSAndroid Build Coastguard Worker 
1014*9356374aSAndroid Build Coastguard Worker   // Invalid ints.
1015*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto64_base("", &value, 10));
1016*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto64_base("  ", &value, 10));
1017*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto64_base("abc", &value, 10));
1018*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto64_base("34234324487834466a", &value, 10));
1019*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto64_base("34234487834466.3", &value, 10));
1020*9356374aSAndroid Build Coastguard Worker 
1021*9356374aSAndroid Build Coastguard Worker   // Out of bounds.
1022*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto64_base("9223372036854775808", &value, 10));
1023*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(safe_strto64_base("-9223372036854775809", &value, 10));
1024*9356374aSAndroid Build Coastguard Worker 
1025*9356374aSAndroid Build Coastguard Worker   // String version.
1026*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto64_base(std::string("0x1234"), &value, 16));
1027*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(0x1234, value);
1028*9356374aSAndroid Build Coastguard Worker 
1029*9356374aSAndroid Build Coastguard Worker   // Base-10 string version.
1030*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(safe_strto64_base("1234", &value, 10));
1031*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(1234, value);
1032*9356374aSAndroid Build Coastguard Worker }
1033*9356374aSAndroid Build Coastguard Worker 
1034*9356374aSAndroid Build Coastguard Worker const size_t kNumRandomTests = 10000;
1035*9356374aSAndroid Build Coastguard Worker 
1036*9356374aSAndroid Build Coastguard Worker template <typename IntType>
test_random_integer_parse_base(bool (* parse_func)(absl::string_view,IntType * value,int base))1037*9356374aSAndroid Build Coastguard Worker void test_random_integer_parse_base(bool (*parse_func)(absl::string_view,
1038*9356374aSAndroid Build Coastguard Worker                                                        IntType* value,
1039*9356374aSAndroid Build Coastguard Worker                                                        int base)) {
1040*9356374aSAndroid Build Coastguard Worker   using RandomEngine = std::minstd_rand0;
1041*9356374aSAndroid Build Coastguard Worker   std::random_device rd;
1042*9356374aSAndroid Build Coastguard Worker   RandomEngine rng(rd());
1043*9356374aSAndroid Build Coastguard Worker   std::uniform_int_distribution<IntType> random_int(
1044*9356374aSAndroid Build Coastguard Worker       std::numeric_limits<IntType>::min());
1045*9356374aSAndroid Build Coastguard Worker   std::uniform_int_distribution<int> random_base(2, 35);
1046*9356374aSAndroid Build Coastguard Worker   for (size_t i = 0; i < kNumRandomTests; i++) {
1047*9356374aSAndroid Build Coastguard Worker     IntType value = random_int(rng);
1048*9356374aSAndroid Build Coastguard Worker     int base = random_base(rng);
1049*9356374aSAndroid Build Coastguard Worker     std::string str_value;
1050*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(Itoa<IntType>(value, base, &str_value));
1051*9356374aSAndroid Build Coastguard Worker     IntType parsed_value;
1052*9356374aSAndroid Build Coastguard Worker 
1053*9356374aSAndroid Build Coastguard Worker     // Test successful parse
1054*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(parse_func(str_value, &parsed_value, base));
1055*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(parsed_value, value);
1056*9356374aSAndroid Build Coastguard Worker 
1057*9356374aSAndroid Build Coastguard Worker     // Test overflow
1058*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(
1059*9356374aSAndroid Build Coastguard Worker         parse_func(absl::StrCat(std::numeric_limits<IntType>::max(), value),
1060*9356374aSAndroid Build Coastguard Worker                    &parsed_value, base));
1061*9356374aSAndroid Build Coastguard Worker 
1062*9356374aSAndroid Build Coastguard Worker     // Test underflow
1063*9356374aSAndroid Build Coastguard Worker     if (std::numeric_limits<IntType>::min() < 0) {
1064*9356374aSAndroid Build Coastguard Worker       EXPECT_FALSE(
1065*9356374aSAndroid Build Coastguard Worker           parse_func(absl::StrCat(std::numeric_limits<IntType>::min(), value),
1066*9356374aSAndroid Build Coastguard Worker                      &parsed_value, base));
1067*9356374aSAndroid Build Coastguard Worker     } else {
1068*9356374aSAndroid Build Coastguard Worker       EXPECT_FALSE(parse_func(absl::StrCat("-", value), &parsed_value, base));
1069*9356374aSAndroid Build Coastguard Worker     }
1070*9356374aSAndroid Build Coastguard Worker   }
1071*9356374aSAndroid Build Coastguard Worker }
1072*9356374aSAndroid Build Coastguard Worker 
TEST(stringtest,safe_strto32_random)1073*9356374aSAndroid Build Coastguard Worker TEST(stringtest, safe_strto32_random) {
1074*9356374aSAndroid Build Coastguard Worker   test_random_integer_parse_base<int32_t>(&safe_strto32_base);
1075*9356374aSAndroid Build Coastguard Worker }
TEST(stringtest,safe_strto64_random)1076*9356374aSAndroid Build Coastguard Worker TEST(stringtest, safe_strto64_random) {
1077*9356374aSAndroid Build Coastguard Worker   test_random_integer_parse_base<int64_t>(&safe_strto64_base);
1078*9356374aSAndroid Build Coastguard Worker }
TEST(stringtest,safe_strtou32_random)1079*9356374aSAndroid Build Coastguard Worker TEST(stringtest, safe_strtou32_random) {
1080*9356374aSAndroid Build Coastguard Worker   test_random_integer_parse_base<uint32_t>(&safe_strtou32_base);
1081*9356374aSAndroid Build Coastguard Worker }
TEST(stringtest,safe_strtou64_random)1082*9356374aSAndroid Build Coastguard Worker TEST(stringtest, safe_strtou64_random) {
1083*9356374aSAndroid Build Coastguard Worker   test_random_integer_parse_base<uint64_t>(&safe_strtou64_base);
1084*9356374aSAndroid Build Coastguard Worker }
TEST(stringtest,safe_strtou128_random)1085*9356374aSAndroid Build Coastguard Worker TEST(stringtest, safe_strtou128_random) {
1086*9356374aSAndroid Build Coastguard Worker   // random number generators don't work for uint128, and
1087*9356374aSAndroid Build Coastguard Worker   // uint128 can be streamed but not StrCat'd, so this code must be custom
1088*9356374aSAndroid Build Coastguard Worker   // implemented for uint128, but is generally the same as what's above.
1089*9356374aSAndroid Build Coastguard Worker   // test_random_integer_parse_base<absl::uint128>(
1090*9356374aSAndroid Build Coastguard Worker   //     &absl::numbers_internal::safe_strtou128_base);
1091*9356374aSAndroid Build Coastguard Worker   using RandomEngine = std::minstd_rand0;
1092*9356374aSAndroid Build Coastguard Worker   using IntType = absl::uint128;
1093*9356374aSAndroid Build Coastguard Worker   constexpr auto parse_func = &absl::numbers_internal::safe_strtou128_base;
1094*9356374aSAndroid Build Coastguard Worker 
1095*9356374aSAndroid Build Coastguard Worker   std::random_device rd;
1096*9356374aSAndroid Build Coastguard Worker   RandomEngine rng(rd());
1097*9356374aSAndroid Build Coastguard Worker   std::uniform_int_distribution<uint64_t> random_uint64(
1098*9356374aSAndroid Build Coastguard Worker       std::numeric_limits<uint64_t>::min());
1099*9356374aSAndroid Build Coastguard Worker   std::uniform_int_distribution<int> random_base(2, 35);
1100*9356374aSAndroid Build Coastguard Worker 
1101*9356374aSAndroid Build Coastguard Worker   for (size_t i = 0; i < kNumRandomTests; i++) {
1102*9356374aSAndroid Build Coastguard Worker     IntType value = random_uint64(rng);
1103*9356374aSAndroid Build Coastguard Worker     value = (value << 64) + random_uint64(rng);
1104*9356374aSAndroid Build Coastguard Worker     int base = random_base(rng);
1105*9356374aSAndroid Build Coastguard Worker     std::string str_value;
1106*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(Itoa<IntType>(value, base, &str_value));
1107*9356374aSAndroid Build Coastguard Worker     IntType parsed_value;
1108*9356374aSAndroid Build Coastguard Worker 
1109*9356374aSAndroid Build Coastguard Worker     // Test successful parse
1110*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(parse_func(str_value, &parsed_value, base));
1111*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(parsed_value, value);
1112*9356374aSAndroid Build Coastguard Worker 
1113*9356374aSAndroid Build Coastguard Worker     // Test overflow
1114*9356374aSAndroid Build Coastguard Worker     std::string s;
1115*9356374aSAndroid Build Coastguard Worker     absl::strings_internal::OStringStream(&s)
1116*9356374aSAndroid Build Coastguard Worker         << std::numeric_limits<IntType>::max() << value;
1117*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(parse_func(s, &parsed_value, base));
1118*9356374aSAndroid Build Coastguard Worker 
1119*9356374aSAndroid Build Coastguard Worker     // Test underflow
1120*9356374aSAndroid Build Coastguard Worker     s.clear();
1121*9356374aSAndroid Build Coastguard Worker     absl::strings_internal::OStringStream(&s) << "-" << value;
1122*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(parse_func(s, &parsed_value, base));
1123*9356374aSAndroid Build Coastguard Worker   }
1124*9356374aSAndroid Build Coastguard Worker }
TEST(stringtest,safe_strto128_random)1125*9356374aSAndroid Build Coastguard Worker TEST(stringtest, safe_strto128_random) {
1126*9356374aSAndroid Build Coastguard Worker   // random number generators don't work for int128, and
1127*9356374aSAndroid Build Coastguard Worker   // int128 can be streamed but not StrCat'd, so this code must be custom
1128*9356374aSAndroid Build Coastguard Worker   // implemented for int128, but is generally the same as what's above.
1129*9356374aSAndroid Build Coastguard Worker   // test_random_integer_parse_base<absl::int128>(
1130*9356374aSAndroid Build Coastguard Worker   //     &absl::numbers_internal::safe_strto128_base);
1131*9356374aSAndroid Build Coastguard Worker   using RandomEngine = std::minstd_rand0;
1132*9356374aSAndroid Build Coastguard Worker   using IntType = absl::int128;
1133*9356374aSAndroid Build Coastguard Worker   constexpr auto parse_func = &absl::numbers_internal::safe_strto128_base;
1134*9356374aSAndroid Build Coastguard Worker 
1135*9356374aSAndroid Build Coastguard Worker   std::random_device rd;
1136*9356374aSAndroid Build Coastguard Worker   RandomEngine rng(rd());
1137*9356374aSAndroid Build Coastguard Worker   std::uniform_int_distribution<int64_t> random_int64(
1138*9356374aSAndroid Build Coastguard Worker       std::numeric_limits<int64_t>::min());
1139*9356374aSAndroid Build Coastguard Worker   std::uniform_int_distribution<uint64_t> random_uint64(
1140*9356374aSAndroid Build Coastguard Worker       std::numeric_limits<uint64_t>::min());
1141*9356374aSAndroid Build Coastguard Worker   std::uniform_int_distribution<int> random_base(2, 35);
1142*9356374aSAndroid Build Coastguard Worker 
1143*9356374aSAndroid Build Coastguard Worker   for (size_t i = 0; i < kNumRandomTests; ++i) {
1144*9356374aSAndroid Build Coastguard Worker     int64_t high = random_int64(rng);
1145*9356374aSAndroid Build Coastguard Worker     uint64_t low = random_uint64(rng);
1146*9356374aSAndroid Build Coastguard Worker     IntType value = absl::MakeInt128(high, low);
1147*9356374aSAndroid Build Coastguard Worker 
1148*9356374aSAndroid Build Coastguard Worker     int base = random_base(rng);
1149*9356374aSAndroid Build Coastguard Worker     std::string str_value;
1150*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(Itoa<IntType>(value, base, &str_value));
1151*9356374aSAndroid Build Coastguard Worker     IntType parsed_value;
1152*9356374aSAndroid Build Coastguard Worker 
1153*9356374aSAndroid Build Coastguard Worker     // Test successful parse
1154*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(parse_func(str_value, &parsed_value, base));
1155*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(parsed_value, value);
1156*9356374aSAndroid Build Coastguard Worker 
1157*9356374aSAndroid Build Coastguard Worker     // Test overflow
1158*9356374aSAndroid Build Coastguard Worker     std::string s;
1159*9356374aSAndroid Build Coastguard Worker     absl::strings_internal::OStringStream(&s)
1160*9356374aSAndroid Build Coastguard Worker         << std::numeric_limits<IntType>::max() << value;
1161*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(parse_func(s, &parsed_value, base));
1162*9356374aSAndroid Build Coastguard Worker 
1163*9356374aSAndroid Build Coastguard Worker     // Test underflow
1164*9356374aSAndroid Build Coastguard Worker     s.clear();
1165*9356374aSAndroid Build Coastguard Worker     absl::strings_internal::OStringStream(&s)
1166*9356374aSAndroid Build Coastguard Worker         << std::numeric_limits<IntType>::min() << value;
1167*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(parse_func(s, &parsed_value, base));
1168*9356374aSAndroid Build Coastguard Worker   }
1169*9356374aSAndroid Build Coastguard Worker }
1170*9356374aSAndroid Build Coastguard Worker 
TEST(stringtest,safe_strtou32_base)1171*9356374aSAndroid Build Coastguard Worker TEST(stringtest, safe_strtou32_base) {
1172*9356374aSAndroid Build Coastguard Worker   for (int i = 0; strtouint32_test_cases()[i].str != nullptr; ++i) {
1173*9356374aSAndroid Build Coastguard Worker     const auto& e = strtouint32_test_cases()[i];
1174*9356374aSAndroid Build Coastguard Worker     uint32_t value;
1175*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(e.expect_ok, safe_strtou32_base(e.str, &value, e.base))
1176*9356374aSAndroid Build Coastguard Worker         << "str=\"" << e.str << "\" base=" << e.base;
1177*9356374aSAndroid Build Coastguard Worker     if (e.expect_ok) {
1178*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(e.expected, value) << "i=" << i << " str=\"" << e.str
1179*9356374aSAndroid Build Coastguard Worker                                    << "\" base=" << e.base;
1180*9356374aSAndroid Build Coastguard Worker     }
1181*9356374aSAndroid Build Coastguard Worker   }
1182*9356374aSAndroid Build Coastguard Worker }
1183*9356374aSAndroid Build Coastguard Worker 
TEST(stringtest,safe_strtou32_base_length_delimited)1184*9356374aSAndroid Build Coastguard Worker TEST(stringtest, safe_strtou32_base_length_delimited) {
1185*9356374aSAndroid Build Coastguard Worker   for (int i = 0; strtouint32_test_cases()[i].str != nullptr; ++i) {
1186*9356374aSAndroid Build Coastguard Worker     const auto& e = strtouint32_test_cases()[i];
1187*9356374aSAndroid Build Coastguard Worker     std::string tmp(e.str);
1188*9356374aSAndroid Build Coastguard Worker     tmp.append("12");  // Adds garbage at the end.
1189*9356374aSAndroid Build Coastguard Worker 
1190*9356374aSAndroid Build Coastguard Worker     uint32_t value;
1191*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(e.expect_ok,
1192*9356374aSAndroid Build Coastguard Worker               safe_strtou32_base(absl::string_view(tmp.data(), strlen(e.str)),
1193*9356374aSAndroid Build Coastguard Worker                                  &value, e.base))
1194*9356374aSAndroid Build Coastguard Worker         << "str=\"" << e.str << "\" base=" << e.base;
1195*9356374aSAndroid Build Coastguard Worker     if (e.expect_ok) {
1196*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(e.expected, value) << "i=" << i << " str=" << e.str
1197*9356374aSAndroid Build Coastguard Worker                                    << " base=" << e.base;
1198*9356374aSAndroid Build Coastguard Worker     }
1199*9356374aSAndroid Build Coastguard Worker   }
1200*9356374aSAndroid Build Coastguard Worker }
1201*9356374aSAndroid Build Coastguard Worker 
TEST(stringtest,safe_strtou64_base)1202*9356374aSAndroid Build Coastguard Worker TEST(stringtest, safe_strtou64_base) {
1203*9356374aSAndroid Build Coastguard Worker   for (int i = 0; strtouint64_test_cases()[i].str != nullptr; ++i) {
1204*9356374aSAndroid Build Coastguard Worker     const auto& e = strtouint64_test_cases()[i];
1205*9356374aSAndroid Build Coastguard Worker     uint64_t value;
1206*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(e.expect_ok, safe_strtou64_base(e.str, &value, e.base))
1207*9356374aSAndroid Build Coastguard Worker         << "str=\"" << e.str << "\" base=" << e.base;
1208*9356374aSAndroid Build Coastguard Worker     if (e.expect_ok) {
1209*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(e.expected, value) << "str=" << e.str << " base=" << e.base;
1210*9356374aSAndroid Build Coastguard Worker     }
1211*9356374aSAndroid Build Coastguard Worker   }
1212*9356374aSAndroid Build Coastguard Worker }
1213*9356374aSAndroid Build Coastguard Worker 
TEST(stringtest,safe_strtou64_base_length_delimited)1214*9356374aSAndroid Build Coastguard Worker TEST(stringtest, safe_strtou64_base_length_delimited) {
1215*9356374aSAndroid Build Coastguard Worker   for (int i = 0; strtouint64_test_cases()[i].str != nullptr; ++i) {
1216*9356374aSAndroid Build Coastguard Worker     const auto& e = strtouint64_test_cases()[i];
1217*9356374aSAndroid Build Coastguard Worker     std::string tmp(e.str);
1218*9356374aSAndroid Build Coastguard Worker     tmp.append("12");  // Adds garbage at the end.
1219*9356374aSAndroid Build Coastguard Worker 
1220*9356374aSAndroid Build Coastguard Worker     uint64_t value;
1221*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(e.expect_ok,
1222*9356374aSAndroid Build Coastguard Worker               safe_strtou64_base(absl::string_view(tmp.data(), strlen(e.str)),
1223*9356374aSAndroid Build Coastguard Worker                                  &value, e.base))
1224*9356374aSAndroid Build Coastguard Worker         << "str=\"" << e.str << "\" base=" << e.base;
1225*9356374aSAndroid Build Coastguard Worker     if (e.expect_ok) {
1226*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(e.expected, value) << "str=\"" << e.str << "\" base=" << e.base;
1227*9356374aSAndroid Build Coastguard Worker     }
1228*9356374aSAndroid Build Coastguard Worker   }
1229*9356374aSAndroid Build Coastguard Worker }
1230*9356374aSAndroid Build Coastguard Worker 
1231*9356374aSAndroid Build Coastguard Worker // feenableexcept() and fedisableexcept() are extensions supported by some libc
1232*9356374aSAndroid Build Coastguard Worker // implementations.
1233*9356374aSAndroid Build Coastguard Worker #if defined(__GLIBC__) || defined(__BIONIC__)
1234*9356374aSAndroid Build Coastguard Worker #define ABSL_HAVE_FEENABLEEXCEPT 1
1235*9356374aSAndroid Build Coastguard Worker #define ABSL_HAVE_FEDISABLEEXCEPT 1
1236*9356374aSAndroid Build Coastguard Worker #endif
1237*9356374aSAndroid Build Coastguard Worker 
1238*9356374aSAndroid Build Coastguard Worker class SimpleDtoaTest : public testing::Test {
1239*9356374aSAndroid Build Coastguard Worker  protected:
SetUp()1240*9356374aSAndroid Build Coastguard Worker   void SetUp() override {
1241*9356374aSAndroid Build Coastguard Worker     // Store the current floating point env & clear away any pending exceptions.
1242*9356374aSAndroid Build Coastguard Worker     feholdexcept(&fp_env_);
1243*9356374aSAndroid Build Coastguard Worker #ifdef ABSL_HAVE_FEENABLEEXCEPT
1244*9356374aSAndroid Build Coastguard Worker     // Turn on floating point exceptions.
1245*9356374aSAndroid Build Coastguard Worker     feenableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW);
1246*9356374aSAndroid Build Coastguard Worker #endif
1247*9356374aSAndroid Build Coastguard Worker   }
1248*9356374aSAndroid Build Coastguard Worker 
TearDown()1249*9356374aSAndroid Build Coastguard Worker   void TearDown() override {
1250*9356374aSAndroid Build Coastguard Worker     // Restore the floating point environment to the original state.
1251*9356374aSAndroid Build Coastguard Worker     // In theory fedisableexcept is unnecessary; fesetenv will also do it.
1252*9356374aSAndroid Build Coastguard Worker     // In practice, our toolchains have subtle bugs.
1253*9356374aSAndroid Build Coastguard Worker #ifdef ABSL_HAVE_FEDISABLEEXCEPT
1254*9356374aSAndroid Build Coastguard Worker     fedisableexcept(FE_DIVBYZERO | FE_INVALID | FE_OVERFLOW);
1255*9356374aSAndroid Build Coastguard Worker #endif
1256*9356374aSAndroid Build Coastguard Worker     fesetenv(&fp_env_);
1257*9356374aSAndroid Build Coastguard Worker   }
1258*9356374aSAndroid Build Coastguard Worker 
ToNineDigits(double value)1259*9356374aSAndroid Build Coastguard Worker   std::string ToNineDigits(double value) {
1260*9356374aSAndroid Build Coastguard Worker     char buffer[16];  // more than enough for %.9g
1261*9356374aSAndroid Build Coastguard Worker     snprintf(buffer, sizeof(buffer), "%.9g", value);
1262*9356374aSAndroid Build Coastguard Worker     return buffer;
1263*9356374aSAndroid Build Coastguard Worker   }
1264*9356374aSAndroid Build Coastguard Worker 
1265*9356374aSAndroid Build Coastguard Worker   fenv_t fp_env_;
1266*9356374aSAndroid Build Coastguard Worker };
1267*9356374aSAndroid Build Coastguard Worker 
1268*9356374aSAndroid Build Coastguard Worker // Run the given runnable functor for "cases" test cases, chosen over the
1269*9356374aSAndroid Build Coastguard Worker // available range of float.  pi and e and 1/e are seeded, and then all
1270*9356374aSAndroid Build Coastguard Worker // available integer powers of 2 and 10 are multiplied against them.  In
1271*9356374aSAndroid Build Coastguard Worker // addition to trying all those values, we try the next higher and next lower
1272*9356374aSAndroid Build Coastguard Worker // float, and then we add additional test cases evenly distributed between them.
1273*9356374aSAndroid Build Coastguard Worker // Each test case is passed to runnable as both a positive and negative value.
1274*9356374aSAndroid Build Coastguard Worker template <typename R>
ExhaustiveFloat(uint32_t cases,R && runnable)1275*9356374aSAndroid Build Coastguard Worker void ExhaustiveFloat(uint32_t cases, R&& runnable) {
1276*9356374aSAndroid Build Coastguard Worker   runnable(0.0f);
1277*9356374aSAndroid Build Coastguard Worker   runnable(-0.0f);
1278*9356374aSAndroid Build Coastguard Worker   if (cases >= 2e9) {  // more than 2 billion?  Might as well run them all.
1279*9356374aSAndroid Build Coastguard Worker     for (float f = 0; f < std::numeric_limits<float>::max(); ) {
1280*9356374aSAndroid Build Coastguard Worker       f = nextafterf(f, std::numeric_limits<float>::max());
1281*9356374aSAndroid Build Coastguard Worker       runnable(-f);
1282*9356374aSAndroid Build Coastguard Worker       runnable(f);
1283*9356374aSAndroid Build Coastguard Worker     }
1284*9356374aSAndroid Build Coastguard Worker     return;
1285*9356374aSAndroid Build Coastguard Worker   }
1286*9356374aSAndroid Build Coastguard Worker   std::set<float> floats = {3.4028234e38f};
1287*9356374aSAndroid Build Coastguard Worker   for (float f : {1.0, 3.14159265, 2.718281828, 1 / 2.718281828}) {
1288*9356374aSAndroid Build Coastguard Worker     for (float testf = f; testf != 0; testf *= 0.1f) floats.insert(testf);
1289*9356374aSAndroid Build Coastguard Worker     for (float testf = f; testf != 0; testf *= 0.5f) floats.insert(testf);
1290*9356374aSAndroid Build Coastguard Worker     for (float testf = f; testf < 3e38f / 2; testf *= 2.0f)
1291*9356374aSAndroid Build Coastguard Worker       floats.insert(testf);
1292*9356374aSAndroid Build Coastguard Worker     for (float testf = f; testf < 3e38f / 10; testf *= 10) floats.insert(testf);
1293*9356374aSAndroid Build Coastguard Worker   }
1294*9356374aSAndroid Build Coastguard Worker 
1295*9356374aSAndroid Build Coastguard Worker   float last = *floats.begin();
1296*9356374aSAndroid Build Coastguard Worker 
1297*9356374aSAndroid Build Coastguard Worker   runnable(last);
1298*9356374aSAndroid Build Coastguard Worker   runnable(-last);
1299*9356374aSAndroid Build Coastguard Worker   int iters_per_float = cases / floats.size();
1300*9356374aSAndroid Build Coastguard Worker   if (iters_per_float == 0) iters_per_float = 1;
1301*9356374aSAndroid Build Coastguard Worker   for (float f : floats) {
1302*9356374aSAndroid Build Coastguard Worker     if (f == last) continue;
1303*9356374aSAndroid Build Coastguard Worker     float testf = std::nextafter(last, std::numeric_limits<float>::max());
1304*9356374aSAndroid Build Coastguard Worker     runnable(testf);
1305*9356374aSAndroid Build Coastguard Worker     runnable(-testf);
1306*9356374aSAndroid Build Coastguard Worker     last = testf;
1307*9356374aSAndroid Build Coastguard Worker     if (f == last) continue;
1308*9356374aSAndroid Build Coastguard Worker     double step = (double{f} - last) / iters_per_float;
1309*9356374aSAndroid Build Coastguard Worker     for (double d = last + step; d < f; d += step) {
1310*9356374aSAndroid Build Coastguard Worker       testf = d;
1311*9356374aSAndroid Build Coastguard Worker       if (testf != last) {
1312*9356374aSAndroid Build Coastguard Worker         runnable(testf);
1313*9356374aSAndroid Build Coastguard Worker         runnable(-testf);
1314*9356374aSAndroid Build Coastguard Worker         last = testf;
1315*9356374aSAndroid Build Coastguard Worker       }
1316*9356374aSAndroid Build Coastguard Worker     }
1317*9356374aSAndroid Build Coastguard Worker     testf = std::nextafter(f, 0.0f);
1318*9356374aSAndroid Build Coastguard Worker     if (testf > last) {
1319*9356374aSAndroid Build Coastguard Worker       runnable(testf);
1320*9356374aSAndroid Build Coastguard Worker       runnable(-testf);
1321*9356374aSAndroid Build Coastguard Worker       last = testf;
1322*9356374aSAndroid Build Coastguard Worker     }
1323*9356374aSAndroid Build Coastguard Worker     if (f != last) {
1324*9356374aSAndroid Build Coastguard Worker       runnable(f);
1325*9356374aSAndroid Build Coastguard Worker       runnable(-f);
1326*9356374aSAndroid Build Coastguard Worker       last = f;
1327*9356374aSAndroid Build Coastguard Worker     }
1328*9356374aSAndroid Build Coastguard Worker   }
1329*9356374aSAndroid Build Coastguard Worker }
1330*9356374aSAndroid Build Coastguard Worker 
TEST_F(SimpleDtoaTest,ExhaustiveDoubleToSixDigits)1331*9356374aSAndroid Build Coastguard Worker TEST_F(SimpleDtoaTest, ExhaustiveDoubleToSixDigits) {
1332*9356374aSAndroid Build Coastguard Worker   uint64_t test_count = 0;
1333*9356374aSAndroid Build Coastguard Worker   std::vector<double> mismatches;
1334*9356374aSAndroid Build Coastguard Worker   auto checker = [&](double d) {
1335*9356374aSAndroid Build Coastguard Worker     if (d != d) return;  // rule out NaNs
1336*9356374aSAndroid Build Coastguard Worker     ++test_count;
1337*9356374aSAndroid Build Coastguard Worker     char sixdigitsbuf[kSixDigitsToBufferSize] = {0};
1338*9356374aSAndroid Build Coastguard Worker     SixDigitsToBuffer(d, sixdigitsbuf);
1339*9356374aSAndroid Build Coastguard Worker     char snprintfbuf[kSixDigitsToBufferSize] = {0};
1340*9356374aSAndroid Build Coastguard Worker     snprintf(snprintfbuf, kSixDigitsToBufferSize, "%g", d);
1341*9356374aSAndroid Build Coastguard Worker     if (strcmp(sixdigitsbuf, snprintfbuf) != 0) {
1342*9356374aSAndroid Build Coastguard Worker       mismatches.push_back(d);
1343*9356374aSAndroid Build Coastguard Worker       if (mismatches.size() < 10) {
1344*9356374aSAndroid Build Coastguard Worker         LOG(ERROR) << "Six-digit failure with double.  d=" << d
1345*9356374aSAndroid Build Coastguard Worker                    << " sixdigits=" << sixdigitsbuf
1346*9356374aSAndroid Build Coastguard Worker                    << " printf(%g)=" << snprintfbuf;
1347*9356374aSAndroid Build Coastguard Worker       }
1348*9356374aSAndroid Build Coastguard Worker     }
1349*9356374aSAndroid Build Coastguard Worker   };
1350*9356374aSAndroid Build Coastguard Worker   // Some quick sanity checks...
1351*9356374aSAndroid Build Coastguard Worker   checker(5e-324);
1352*9356374aSAndroid Build Coastguard Worker   checker(1e-308);
1353*9356374aSAndroid Build Coastguard Worker   checker(1.0);
1354*9356374aSAndroid Build Coastguard Worker   checker(1.000005);
1355*9356374aSAndroid Build Coastguard Worker   checker(1.7976931348623157e308);
1356*9356374aSAndroid Build Coastguard Worker   checker(0.00390625);
1357*9356374aSAndroid Build Coastguard Worker #ifndef _MSC_VER
1358*9356374aSAndroid Build Coastguard Worker   // on MSVC, snprintf() rounds it to 0.00195313. SixDigitsToBuffer() rounds it
1359*9356374aSAndroid Build Coastguard Worker   // to 0.00195312 (round half to even).
1360*9356374aSAndroid Build Coastguard Worker   checker(0.001953125);
1361*9356374aSAndroid Build Coastguard Worker #endif
1362*9356374aSAndroid Build Coastguard Worker   checker(0.005859375);
1363*9356374aSAndroid Build Coastguard Worker   // Some cases where the rounding is very very close
1364*9356374aSAndroid Build Coastguard Worker   checker(1.089095e-15);
1365*9356374aSAndroid Build Coastguard Worker   checker(3.274195e-55);
1366*9356374aSAndroid Build Coastguard Worker   checker(6.534355e-146);
1367*9356374aSAndroid Build Coastguard Worker   checker(2.920845e+234);
1368*9356374aSAndroid Build Coastguard Worker 
1369*9356374aSAndroid Build Coastguard Worker   if (mismatches.empty()) {
1370*9356374aSAndroid Build Coastguard Worker     test_count = 0;
1371*9356374aSAndroid Build Coastguard Worker     ExhaustiveFloat(kFloatNumCases, checker);
1372*9356374aSAndroid Build Coastguard Worker 
1373*9356374aSAndroid Build Coastguard Worker     test_count = 0;
1374*9356374aSAndroid Build Coastguard Worker     std::vector<int> digit_testcases{
1375*9356374aSAndroid Build Coastguard Worker         100000, 100001, 100002, 100005, 100010, 100020, 100050, 100100,  // misc
1376*9356374aSAndroid Build Coastguard Worker         195312, 195313,  // 1.953125 is a case where we round down, just barely.
1377*9356374aSAndroid Build Coastguard Worker         200000, 500000, 800000,  // misc mid-range cases
1378*9356374aSAndroid Build Coastguard Worker         585937, 585938,  // 5.859375 is a case where we round up, just barely.
1379*9356374aSAndroid Build Coastguard Worker         900000, 990000, 999000, 999900, 999990, 999996, 999997, 999998, 999999};
1380*9356374aSAndroid Build Coastguard Worker     if (kFloatNumCases >= 1e9) {
1381*9356374aSAndroid Build Coastguard Worker       // If at least 1 billion test cases were requested, user wants an
1382*9356374aSAndroid Build Coastguard Worker       // exhaustive test. So let's test all mantissas, too.
1383*9356374aSAndroid Build Coastguard Worker       constexpr int min_mantissa = 100000, max_mantissa = 999999;
1384*9356374aSAndroid Build Coastguard Worker       digit_testcases.resize(max_mantissa - min_mantissa + 1);
1385*9356374aSAndroid Build Coastguard Worker       std::iota(digit_testcases.begin(), digit_testcases.end(), min_mantissa);
1386*9356374aSAndroid Build Coastguard Worker     }
1387*9356374aSAndroid Build Coastguard Worker 
1388*9356374aSAndroid Build Coastguard Worker     for (int exponent = -324; exponent <= 308; ++exponent) {
1389*9356374aSAndroid Build Coastguard Worker       double powten = absl::strings_internal::Pow10(exponent);
1390*9356374aSAndroid Build Coastguard Worker       if (powten == 0) powten = 5e-324;
1391*9356374aSAndroid Build Coastguard Worker       if (kFloatNumCases >= 1e9) {
1392*9356374aSAndroid Build Coastguard Worker         // The exhaustive test takes a very long time, so log progress.
1393*9356374aSAndroid Build Coastguard Worker         char buf[kSixDigitsToBufferSize];
1394*9356374aSAndroid Build Coastguard Worker         LOG(INFO) << "Exp " << exponent << " powten=" << powten << "(" << powten
1395*9356374aSAndroid Build Coastguard Worker                   << ") ("
1396*9356374aSAndroid Build Coastguard Worker                   << absl::string_view(buf, SixDigitsToBuffer(powten, buf))
1397*9356374aSAndroid Build Coastguard Worker                   << ")";
1398*9356374aSAndroid Build Coastguard Worker       }
1399*9356374aSAndroid Build Coastguard Worker       for (int digits : digit_testcases) {
1400*9356374aSAndroid Build Coastguard Worker         if (exponent == 308 && digits >= 179769) break;  // don't overflow!
1401*9356374aSAndroid Build Coastguard Worker         double digiform = (digits + 0.5) * 0.00001;
1402*9356374aSAndroid Build Coastguard Worker         double testval = digiform * powten;
1403*9356374aSAndroid Build Coastguard Worker         double pretestval = nextafter(testval, 0);
1404*9356374aSAndroid Build Coastguard Worker         double posttestval = nextafter(testval, 1.7976931348623157e308);
1405*9356374aSAndroid Build Coastguard Worker         checker(testval);
1406*9356374aSAndroid Build Coastguard Worker         checker(pretestval);
1407*9356374aSAndroid Build Coastguard Worker         checker(posttestval);
1408*9356374aSAndroid Build Coastguard Worker       }
1409*9356374aSAndroid Build Coastguard Worker     }
1410*9356374aSAndroid Build Coastguard Worker   } else {
1411*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(mismatches.size(), 0);
1412*9356374aSAndroid Build Coastguard Worker     for (size_t i = 0; i < mismatches.size(); ++i) {
1413*9356374aSAndroid Build Coastguard Worker       if (i > 100) i = mismatches.size() - 1;
1414*9356374aSAndroid Build Coastguard Worker       double d = mismatches[i];
1415*9356374aSAndroid Build Coastguard Worker       char sixdigitsbuf[kSixDigitsToBufferSize] = {0};
1416*9356374aSAndroid Build Coastguard Worker       SixDigitsToBuffer(d, sixdigitsbuf);
1417*9356374aSAndroid Build Coastguard Worker       char snprintfbuf[kSixDigitsToBufferSize] = {0};
1418*9356374aSAndroid Build Coastguard Worker       snprintf(snprintfbuf, kSixDigitsToBufferSize, "%g", d);
1419*9356374aSAndroid Build Coastguard Worker       double before = nextafter(d, 0.0);
1420*9356374aSAndroid Build Coastguard Worker       double after = nextafter(d, 1.7976931348623157e308);
1421*9356374aSAndroid Build Coastguard Worker       char b1[32], b2[kSixDigitsToBufferSize];
1422*9356374aSAndroid Build Coastguard Worker       LOG(ERROR) << "Mismatch #" << i << "  d=" << d << " (" << ToNineDigits(d)
1423*9356374aSAndroid Build Coastguard Worker                  << ") sixdigits='" << sixdigitsbuf << "' snprintf='"
1424*9356374aSAndroid Build Coastguard Worker                  << snprintfbuf << "' Before.=" << PerfectDtoa(before) << " "
1425*9356374aSAndroid Build Coastguard Worker                  << (SixDigitsToBuffer(before, b2), b2) << " vs snprintf="
1426*9356374aSAndroid Build Coastguard Worker                  << (snprintf(b1, sizeof(b1), "%g", before), b1)
1427*9356374aSAndroid Build Coastguard Worker                  << " Perfect=" << PerfectDtoa(d) << " "
1428*9356374aSAndroid Build Coastguard Worker                  << (SixDigitsToBuffer(d, b2), b2)
1429*9356374aSAndroid Build Coastguard Worker                  << " vs snprintf=" << (snprintf(b1, sizeof(b1), "%g", d), b1)
1430*9356374aSAndroid Build Coastguard Worker                  << " After.=." << PerfectDtoa(after) << " "
1431*9356374aSAndroid Build Coastguard Worker                  << (SixDigitsToBuffer(after, b2), b2) << " vs snprintf="
1432*9356374aSAndroid Build Coastguard Worker                  << (snprintf(b1, sizeof(b1), "%g", after), b1);
1433*9356374aSAndroid Build Coastguard Worker     }
1434*9356374aSAndroid Build Coastguard Worker   }
1435*9356374aSAndroid Build Coastguard Worker }
1436*9356374aSAndroid Build Coastguard Worker 
TEST(StrToInt32,Partial)1437*9356374aSAndroid Build Coastguard Worker TEST(StrToInt32, Partial) {
1438*9356374aSAndroid Build Coastguard Worker   struct Int32TestLine {
1439*9356374aSAndroid Build Coastguard Worker     std::string input;
1440*9356374aSAndroid Build Coastguard Worker     bool status;
1441*9356374aSAndroid Build Coastguard Worker     int32_t value;
1442*9356374aSAndroid Build Coastguard Worker   };
1443*9356374aSAndroid Build Coastguard Worker   const int32_t int32_min = std::numeric_limits<int32_t>::min();
1444*9356374aSAndroid Build Coastguard Worker   const int32_t int32_max = std::numeric_limits<int32_t>::max();
1445*9356374aSAndroid Build Coastguard Worker   Int32TestLine int32_test_line[] = {
1446*9356374aSAndroid Build Coastguard Worker       {"", false, 0},
1447*9356374aSAndroid Build Coastguard Worker       {" ", false, 0},
1448*9356374aSAndroid Build Coastguard Worker       {"-", false, 0},
1449*9356374aSAndroid Build Coastguard Worker       {"123@@@", false, 123},
1450*9356374aSAndroid Build Coastguard Worker       {absl::StrCat(int32_min, int32_max), false, int32_min},
1451*9356374aSAndroid Build Coastguard Worker       {absl::StrCat(int32_max, int32_max), false, int32_max},
1452*9356374aSAndroid Build Coastguard Worker   };
1453*9356374aSAndroid Build Coastguard Worker 
1454*9356374aSAndroid Build Coastguard Worker   for (const Int32TestLine& test_line : int32_test_line) {
1455*9356374aSAndroid Build Coastguard Worker     int32_t value = -2;
1456*9356374aSAndroid Build Coastguard Worker     bool status = safe_strto32_base(test_line.input, &value, 10);
1457*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(test_line.status, status) << test_line.input;
1458*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(test_line.value, value) << test_line.input;
1459*9356374aSAndroid Build Coastguard Worker     value = -2;
1460*9356374aSAndroid Build Coastguard Worker     status = safe_strto32_base(test_line.input, &value, 10);
1461*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(test_line.status, status) << test_line.input;
1462*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(test_line.value, value) << test_line.input;
1463*9356374aSAndroid Build Coastguard Worker     value = -2;
1464*9356374aSAndroid Build Coastguard Worker     status = safe_strto32_base(absl::string_view(test_line.input), &value, 10);
1465*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(test_line.status, status) << test_line.input;
1466*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(test_line.value, value) << test_line.input;
1467*9356374aSAndroid Build Coastguard Worker   }
1468*9356374aSAndroid Build Coastguard Worker }
1469*9356374aSAndroid Build Coastguard Worker 
TEST(StrToUint32,Partial)1470*9356374aSAndroid Build Coastguard Worker TEST(StrToUint32, Partial) {
1471*9356374aSAndroid Build Coastguard Worker   struct Uint32TestLine {
1472*9356374aSAndroid Build Coastguard Worker     std::string input;
1473*9356374aSAndroid Build Coastguard Worker     bool status;
1474*9356374aSAndroid Build Coastguard Worker     uint32_t value;
1475*9356374aSAndroid Build Coastguard Worker   };
1476*9356374aSAndroid Build Coastguard Worker   const uint32_t uint32_max = std::numeric_limits<uint32_t>::max();
1477*9356374aSAndroid Build Coastguard Worker   Uint32TestLine uint32_test_line[] = {
1478*9356374aSAndroid Build Coastguard Worker       {"", false, 0},
1479*9356374aSAndroid Build Coastguard Worker       {" ", false, 0},
1480*9356374aSAndroid Build Coastguard Worker       {"-", false, 0},
1481*9356374aSAndroid Build Coastguard Worker       {"123@@@", false, 123},
1482*9356374aSAndroid Build Coastguard Worker       {absl::StrCat(uint32_max, uint32_max), false, uint32_max},
1483*9356374aSAndroid Build Coastguard Worker   };
1484*9356374aSAndroid Build Coastguard Worker 
1485*9356374aSAndroid Build Coastguard Worker   for (const Uint32TestLine& test_line : uint32_test_line) {
1486*9356374aSAndroid Build Coastguard Worker     uint32_t value = 2;
1487*9356374aSAndroid Build Coastguard Worker     bool status = safe_strtou32_base(test_line.input, &value, 10);
1488*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(test_line.status, status) << test_line.input;
1489*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(test_line.value, value) << test_line.input;
1490*9356374aSAndroid Build Coastguard Worker     value = 2;
1491*9356374aSAndroid Build Coastguard Worker     status = safe_strtou32_base(test_line.input, &value, 10);
1492*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(test_line.status, status) << test_line.input;
1493*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(test_line.value, value) << test_line.input;
1494*9356374aSAndroid Build Coastguard Worker     value = 2;
1495*9356374aSAndroid Build Coastguard Worker     status = safe_strtou32_base(absl::string_view(test_line.input), &value, 10);
1496*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(test_line.status, status) << test_line.input;
1497*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(test_line.value, value) << test_line.input;
1498*9356374aSAndroid Build Coastguard Worker   }
1499*9356374aSAndroid Build Coastguard Worker }
1500*9356374aSAndroid Build Coastguard Worker 
TEST(StrToInt64,Partial)1501*9356374aSAndroid Build Coastguard Worker TEST(StrToInt64, Partial) {
1502*9356374aSAndroid Build Coastguard Worker   struct Int64TestLine {
1503*9356374aSAndroid Build Coastguard Worker     std::string input;
1504*9356374aSAndroid Build Coastguard Worker     bool status;
1505*9356374aSAndroid Build Coastguard Worker     int64_t value;
1506*9356374aSAndroid Build Coastguard Worker   };
1507*9356374aSAndroid Build Coastguard Worker   const int64_t int64_min = std::numeric_limits<int64_t>::min();
1508*9356374aSAndroid Build Coastguard Worker   const int64_t int64_max = std::numeric_limits<int64_t>::max();
1509*9356374aSAndroid Build Coastguard Worker   Int64TestLine int64_test_line[] = {
1510*9356374aSAndroid Build Coastguard Worker       {"", false, 0},
1511*9356374aSAndroid Build Coastguard Worker       {" ", false, 0},
1512*9356374aSAndroid Build Coastguard Worker       {"-", false, 0},
1513*9356374aSAndroid Build Coastguard Worker       {"123@@@", false, 123},
1514*9356374aSAndroid Build Coastguard Worker       {absl::StrCat(int64_min, int64_max), false, int64_min},
1515*9356374aSAndroid Build Coastguard Worker       {absl::StrCat(int64_max, int64_max), false, int64_max},
1516*9356374aSAndroid Build Coastguard Worker   };
1517*9356374aSAndroid Build Coastguard Worker 
1518*9356374aSAndroid Build Coastguard Worker   for (const Int64TestLine& test_line : int64_test_line) {
1519*9356374aSAndroid Build Coastguard Worker     int64_t value = -2;
1520*9356374aSAndroid Build Coastguard Worker     bool status = safe_strto64_base(test_line.input, &value, 10);
1521*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(test_line.status, status) << test_line.input;
1522*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(test_line.value, value) << test_line.input;
1523*9356374aSAndroid Build Coastguard Worker     value = -2;
1524*9356374aSAndroid Build Coastguard Worker     status = safe_strto64_base(test_line.input, &value, 10);
1525*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(test_line.status, status) << test_line.input;
1526*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(test_line.value, value) << test_line.input;
1527*9356374aSAndroid Build Coastguard Worker     value = -2;
1528*9356374aSAndroid Build Coastguard Worker     status = safe_strto64_base(absl::string_view(test_line.input), &value, 10);
1529*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(test_line.status, status) << test_line.input;
1530*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(test_line.value, value) << test_line.input;
1531*9356374aSAndroid Build Coastguard Worker   }
1532*9356374aSAndroid Build Coastguard Worker }
1533*9356374aSAndroid Build Coastguard Worker 
TEST(StrToUint64,Partial)1534*9356374aSAndroid Build Coastguard Worker TEST(StrToUint64, Partial) {
1535*9356374aSAndroid Build Coastguard Worker   struct Uint64TestLine {
1536*9356374aSAndroid Build Coastguard Worker     std::string input;
1537*9356374aSAndroid Build Coastguard Worker     bool status;
1538*9356374aSAndroid Build Coastguard Worker     uint64_t value;
1539*9356374aSAndroid Build Coastguard Worker   };
1540*9356374aSAndroid Build Coastguard Worker   const uint64_t uint64_max = std::numeric_limits<uint64_t>::max();
1541*9356374aSAndroid Build Coastguard Worker   Uint64TestLine uint64_test_line[] = {
1542*9356374aSAndroid Build Coastguard Worker       {"", false, 0},
1543*9356374aSAndroid Build Coastguard Worker       {" ", false, 0},
1544*9356374aSAndroid Build Coastguard Worker       {"-", false, 0},
1545*9356374aSAndroid Build Coastguard Worker       {"123@@@", false, 123},
1546*9356374aSAndroid Build Coastguard Worker       {absl::StrCat(uint64_max, uint64_max), false, uint64_max},
1547*9356374aSAndroid Build Coastguard Worker   };
1548*9356374aSAndroid Build Coastguard Worker 
1549*9356374aSAndroid Build Coastguard Worker   for (const Uint64TestLine& test_line : uint64_test_line) {
1550*9356374aSAndroid Build Coastguard Worker     uint64_t value = 2;
1551*9356374aSAndroid Build Coastguard Worker     bool status = safe_strtou64_base(test_line.input, &value, 10);
1552*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(test_line.status, status) << test_line.input;
1553*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(test_line.value, value) << test_line.input;
1554*9356374aSAndroid Build Coastguard Worker     value = 2;
1555*9356374aSAndroid Build Coastguard Worker     status = safe_strtou64_base(test_line.input, &value, 10);
1556*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(test_line.status, status) << test_line.input;
1557*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(test_line.value, value) << test_line.input;
1558*9356374aSAndroid Build Coastguard Worker     value = 2;
1559*9356374aSAndroid Build Coastguard Worker     status = safe_strtou64_base(absl::string_view(test_line.input), &value, 10);
1560*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(test_line.status, status) << test_line.input;
1561*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(test_line.value, value) << test_line.input;
1562*9356374aSAndroid Build Coastguard Worker   }
1563*9356374aSAndroid Build Coastguard Worker }
1564*9356374aSAndroid Build Coastguard Worker 
TEST(StrToInt32Base,PrefixOnly)1565*9356374aSAndroid Build Coastguard Worker TEST(StrToInt32Base, PrefixOnly) {
1566*9356374aSAndroid Build Coastguard Worker   struct Int32TestLine {
1567*9356374aSAndroid Build Coastguard Worker     std::string input;
1568*9356374aSAndroid Build Coastguard Worker     bool status;
1569*9356374aSAndroid Build Coastguard Worker     int32_t value;
1570*9356374aSAndroid Build Coastguard Worker   };
1571*9356374aSAndroid Build Coastguard Worker   Int32TestLine int32_test_line[] = {
1572*9356374aSAndroid Build Coastguard Worker     { "", false, 0 },
1573*9356374aSAndroid Build Coastguard Worker     { "-", false, 0 },
1574*9356374aSAndroid Build Coastguard Worker     { "-0", true, 0 },
1575*9356374aSAndroid Build Coastguard Worker     { "0", true, 0 },
1576*9356374aSAndroid Build Coastguard Worker     { "0x", false, 0 },
1577*9356374aSAndroid Build Coastguard Worker     { "-0x", false, 0 },
1578*9356374aSAndroid Build Coastguard Worker   };
1579*9356374aSAndroid Build Coastguard Worker   const int base_array[] = { 0, 2, 8, 10, 16 };
1580*9356374aSAndroid Build Coastguard Worker 
1581*9356374aSAndroid Build Coastguard Worker   for (const Int32TestLine& line : int32_test_line) {
1582*9356374aSAndroid Build Coastguard Worker     for (const int base : base_array) {
1583*9356374aSAndroid Build Coastguard Worker       int32_t value = 2;
1584*9356374aSAndroid Build Coastguard Worker       bool status = safe_strto32_base(line.input.c_str(), &value, base);
1585*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(line.status, status) << line.input << " " << base;
1586*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(line.value, value) << line.input << " " << base;
1587*9356374aSAndroid Build Coastguard Worker       value = 2;
1588*9356374aSAndroid Build Coastguard Worker       status = safe_strto32_base(line.input, &value, base);
1589*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(line.status, status) << line.input << " " << base;
1590*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(line.value, value) << line.input << " " << base;
1591*9356374aSAndroid Build Coastguard Worker       value = 2;
1592*9356374aSAndroid Build Coastguard Worker       status = safe_strto32_base(absl::string_view(line.input), &value, base);
1593*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(line.status, status) << line.input << " " << base;
1594*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(line.value, value) << line.input << " " << base;
1595*9356374aSAndroid Build Coastguard Worker     }
1596*9356374aSAndroid Build Coastguard Worker   }
1597*9356374aSAndroid Build Coastguard Worker }
1598*9356374aSAndroid Build Coastguard Worker 
TEST(StrToUint32Base,PrefixOnly)1599*9356374aSAndroid Build Coastguard Worker TEST(StrToUint32Base, PrefixOnly) {
1600*9356374aSAndroid Build Coastguard Worker   struct Uint32TestLine {
1601*9356374aSAndroid Build Coastguard Worker     std::string input;
1602*9356374aSAndroid Build Coastguard Worker     bool status;
1603*9356374aSAndroid Build Coastguard Worker     uint32_t value;
1604*9356374aSAndroid Build Coastguard Worker   };
1605*9356374aSAndroid Build Coastguard Worker   Uint32TestLine uint32_test_line[] = {
1606*9356374aSAndroid Build Coastguard Worker     { "", false, 0 },
1607*9356374aSAndroid Build Coastguard Worker     { "0", true, 0 },
1608*9356374aSAndroid Build Coastguard Worker     { "0x", false, 0 },
1609*9356374aSAndroid Build Coastguard Worker   };
1610*9356374aSAndroid Build Coastguard Worker   const int base_array[] = { 0, 2, 8, 10, 16 };
1611*9356374aSAndroid Build Coastguard Worker 
1612*9356374aSAndroid Build Coastguard Worker   for (const Uint32TestLine& line : uint32_test_line) {
1613*9356374aSAndroid Build Coastguard Worker     for (const int base : base_array) {
1614*9356374aSAndroid Build Coastguard Worker       uint32_t value = 2;
1615*9356374aSAndroid Build Coastguard Worker       bool status = safe_strtou32_base(line.input.c_str(), &value, base);
1616*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(line.status, status) << line.input << " " << base;
1617*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(line.value, value) << line.input << " " << base;
1618*9356374aSAndroid Build Coastguard Worker       value = 2;
1619*9356374aSAndroid Build Coastguard Worker       status = safe_strtou32_base(line.input, &value, base);
1620*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(line.status, status) << line.input << " " << base;
1621*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(line.value, value) << line.input << " " << base;
1622*9356374aSAndroid Build Coastguard Worker       value = 2;
1623*9356374aSAndroid Build Coastguard Worker       status = safe_strtou32_base(absl::string_view(line.input), &value, base);
1624*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(line.status, status) << line.input << " " << base;
1625*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(line.value, value) << line.input << " " << base;
1626*9356374aSAndroid Build Coastguard Worker     }
1627*9356374aSAndroid Build Coastguard Worker   }
1628*9356374aSAndroid Build Coastguard Worker }
1629*9356374aSAndroid Build Coastguard Worker 
TEST(StrToInt64Base,PrefixOnly)1630*9356374aSAndroid Build Coastguard Worker TEST(StrToInt64Base, PrefixOnly) {
1631*9356374aSAndroid Build Coastguard Worker   struct Int64TestLine {
1632*9356374aSAndroid Build Coastguard Worker     std::string input;
1633*9356374aSAndroid Build Coastguard Worker     bool status;
1634*9356374aSAndroid Build Coastguard Worker     int64_t value;
1635*9356374aSAndroid Build Coastguard Worker   };
1636*9356374aSAndroid Build Coastguard Worker   Int64TestLine int64_test_line[] = {
1637*9356374aSAndroid Build Coastguard Worker     { "", false, 0 },
1638*9356374aSAndroid Build Coastguard Worker     { "-", false, 0 },
1639*9356374aSAndroid Build Coastguard Worker     { "-0", true, 0 },
1640*9356374aSAndroid Build Coastguard Worker     { "0", true, 0 },
1641*9356374aSAndroid Build Coastguard Worker     { "0x", false, 0 },
1642*9356374aSAndroid Build Coastguard Worker     { "-0x", false, 0 },
1643*9356374aSAndroid Build Coastguard Worker   };
1644*9356374aSAndroid Build Coastguard Worker   const int base_array[] = { 0, 2, 8, 10, 16 };
1645*9356374aSAndroid Build Coastguard Worker 
1646*9356374aSAndroid Build Coastguard Worker   for (const Int64TestLine& line : int64_test_line) {
1647*9356374aSAndroid Build Coastguard Worker     for (const int base : base_array) {
1648*9356374aSAndroid Build Coastguard Worker       int64_t value = 2;
1649*9356374aSAndroid Build Coastguard Worker       bool status = safe_strto64_base(line.input.c_str(), &value, base);
1650*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(line.status, status) << line.input << " " << base;
1651*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(line.value, value) << line.input << " " << base;
1652*9356374aSAndroid Build Coastguard Worker       value = 2;
1653*9356374aSAndroid Build Coastguard Worker       status = safe_strto64_base(line.input, &value, base);
1654*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(line.status, status) << line.input << " " << base;
1655*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(line.value, value) << line.input << " " << base;
1656*9356374aSAndroid Build Coastguard Worker       value = 2;
1657*9356374aSAndroid Build Coastguard Worker       status = safe_strto64_base(absl::string_view(line.input), &value, base);
1658*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(line.status, status) << line.input << " " << base;
1659*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(line.value, value) << line.input << " " << base;
1660*9356374aSAndroid Build Coastguard Worker     }
1661*9356374aSAndroid Build Coastguard Worker   }
1662*9356374aSAndroid Build Coastguard Worker }
1663*9356374aSAndroid Build Coastguard Worker 
TEST(StrToUint64Base,PrefixOnly)1664*9356374aSAndroid Build Coastguard Worker TEST(StrToUint64Base, PrefixOnly) {
1665*9356374aSAndroid Build Coastguard Worker   struct Uint64TestLine {
1666*9356374aSAndroid Build Coastguard Worker     std::string input;
1667*9356374aSAndroid Build Coastguard Worker     bool status;
1668*9356374aSAndroid Build Coastguard Worker     uint64_t value;
1669*9356374aSAndroid Build Coastguard Worker   };
1670*9356374aSAndroid Build Coastguard Worker   Uint64TestLine uint64_test_line[] = {
1671*9356374aSAndroid Build Coastguard Worker     { "", false, 0 },
1672*9356374aSAndroid Build Coastguard Worker     { "0", true, 0 },
1673*9356374aSAndroid Build Coastguard Worker     { "0x", false, 0 },
1674*9356374aSAndroid Build Coastguard Worker   };
1675*9356374aSAndroid Build Coastguard Worker   const int base_array[] = { 0, 2, 8, 10, 16 };
1676*9356374aSAndroid Build Coastguard Worker 
1677*9356374aSAndroid Build Coastguard Worker   for (const Uint64TestLine& line : uint64_test_line) {
1678*9356374aSAndroid Build Coastguard Worker     for (const int base : base_array) {
1679*9356374aSAndroid Build Coastguard Worker       uint64_t value = 2;
1680*9356374aSAndroid Build Coastguard Worker       bool status = safe_strtou64_base(line.input.c_str(), &value, base);
1681*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(line.status, status) << line.input << " " << base;
1682*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(line.value, value) << line.input << " " << base;
1683*9356374aSAndroid Build Coastguard Worker       value = 2;
1684*9356374aSAndroid Build Coastguard Worker       status = safe_strtou64_base(line.input, &value, base);
1685*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(line.status, status) << line.input << " " << base;
1686*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(line.value, value) << line.input << " " << base;
1687*9356374aSAndroid Build Coastguard Worker       value = 2;
1688*9356374aSAndroid Build Coastguard Worker       status = safe_strtou64_base(absl::string_view(line.input), &value, base);
1689*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(line.status, status) << line.input << " " << base;
1690*9356374aSAndroid Build Coastguard Worker       EXPECT_EQ(line.value, value) << line.input << " " << base;
1691*9356374aSAndroid Build Coastguard Worker     }
1692*9356374aSAndroid Build Coastguard Worker   }
1693*9356374aSAndroid Build Coastguard Worker }
1694*9356374aSAndroid Build Coastguard Worker 
TestFastHexToBufferZeroPad16(uint64_t v)1695*9356374aSAndroid Build Coastguard Worker void TestFastHexToBufferZeroPad16(uint64_t v) {
1696*9356374aSAndroid Build Coastguard Worker   char buf[16];
1697*9356374aSAndroid Build Coastguard Worker   auto digits = absl::numbers_internal::FastHexToBufferZeroPad16(v, buf);
1698*9356374aSAndroid Build Coastguard Worker   absl::string_view res(buf, 16);
1699*9356374aSAndroid Build Coastguard Worker   char buf2[17];
1700*9356374aSAndroid Build Coastguard Worker   snprintf(buf2, sizeof(buf2), "%016" PRIx64, v);
1701*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(res, buf2) << v;
1702*9356374aSAndroid Build Coastguard Worker   size_t expected_digits = snprintf(buf2, sizeof(buf2), "%" PRIx64, v);
1703*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(digits, expected_digits) << v;
1704*9356374aSAndroid Build Coastguard Worker }
1705*9356374aSAndroid Build Coastguard Worker 
TEST(FastHexToBufferZeroPad16,Smoke)1706*9356374aSAndroid Build Coastguard Worker TEST(FastHexToBufferZeroPad16, Smoke) {
1707*9356374aSAndroid Build Coastguard Worker   TestFastHexToBufferZeroPad16(std::numeric_limits<uint64_t>::min());
1708*9356374aSAndroid Build Coastguard Worker   TestFastHexToBufferZeroPad16(std::numeric_limits<uint64_t>::max());
1709*9356374aSAndroid Build Coastguard Worker   TestFastHexToBufferZeroPad16(std::numeric_limits<int64_t>::min());
1710*9356374aSAndroid Build Coastguard Worker   TestFastHexToBufferZeroPad16(std::numeric_limits<int64_t>::max());
1711*9356374aSAndroid Build Coastguard Worker   absl::BitGen rng;
1712*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < 100000; ++i) {
1713*9356374aSAndroid Build Coastguard Worker     TestFastHexToBufferZeroPad16(
1714*9356374aSAndroid Build Coastguard Worker         absl::LogUniform(rng, std::numeric_limits<uint64_t>::min(),
1715*9356374aSAndroid Build Coastguard Worker                          std::numeric_limits<uint64_t>::max()));
1716*9356374aSAndroid Build Coastguard Worker   }
1717*9356374aSAndroid Build Coastguard Worker }
1718*9356374aSAndroid Build Coastguard Worker 
1719*9356374aSAndroid Build Coastguard Worker template <typename Int>
ExpectWritesNull()1720*9356374aSAndroid Build Coastguard Worker void ExpectWritesNull() {
1721*9356374aSAndroid Build Coastguard Worker   {
1722*9356374aSAndroid Build Coastguard Worker     char buf[absl::numbers_internal::kFastToBufferSize];
1723*9356374aSAndroid Build Coastguard Worker     Int x = std::numeric_limits<Int>::min();
1724*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(absl::numbers_internal::FastIntToBuffer(x, buf), Pointee('\0'));
1725*9356374aSAndroid Build Coastguard Worker   }
1726*9356374aSAndroid Build Coastguard Worker   {
1727*9356374aSAndroid Build Coastguard Worker     char buf[absl::numbers_internal::kFastToBufferSize];
1728*9356374aSAndroid Build Coastguard Worker     Int x = std::numeric_limits<Int>::max();
1729*9356374aSAndroid Build Coastguard Worker     EXPECT_THAT(absl::numbers_internal::FastIntToBuffer(x, buf), Pointee('\0'));
1730*9356374aSAndroid Build Coastguard Worker   }
1731*9356374aSAndroid Build Coastguard Worker }
1732*9356374aSAndroid Build Coastguard Worker 
TEST(FastIntToBuffer,WritesNull)1733*9356374aSAndroid Build Coastguard Worker TEST(FastIntToBuffer, WritesNull) {
1734*9356374aSAndroid Build Coastguard Worker   ExpectWritesNull<int32_t>();
1735*9356374aSAndroid Build Coastguard Worker   ExpectWritesNull<uint32_t>();
1736*9356374aSAndroid Build Coastguard Worker   ExpectWritesNull<int64_t>();
1737*9356374aSAndroid Build Coastguard Worker   ExpectWritesNull<uint32_t>();
1738*9356374aSAndroid Build Coastguard Worker }
1739*9356374aSAndroid Build Coastguard Worker 
1740*9356374aSAndroid Build Coastguard Worker }  // namespace
1741