1*dbb99499SAndroid Build Coastguard Worker //===---------------------------------------------------------------------===//
2*dbb99499SAndroid Build Coastguard Worker // string_util_test - Unit tests for src/string_util.cc
3*dbb99499SAndroid Build Coastguard Worker //===---------------------------------------------------------------------===//
4*dbb99499SAndroid Build Coastguard Worker
5*dbb99499SAndroid Build Coastguard Worker #include <tuple>
6*dbb99499SAndroid Build Coastguard Worker
7*dbb99499SAndroid Build Coastguard Worker #include "../src/internal_macros.h"
8*dbb99499SAndroid Build Coastguard Worker #include "../src/string_util.h"
9*dbb99499SAndroid Build Coastguard Worker #include "gmock/gmock.h"
10*dbb99499SAndroid Build Coastguard Worker #include "gtest/gtest.h"
11*dbb99499SAndroid Build Coastguard Worker
12*dbb99499SAndroid Build Coastguard Worker namespace {
TEST(StringUtilTest,stoul)13*dbb99499SAndroid Build Coastguard Worker TEST(StringUtilTest, stoul) {
14*dbb99499SAndroid Build Coastguard Worker {
15*dbb99499SAndroid Build Coastguard Worker size_t pos = 0;
16*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(0ul, benchmark::stoul("0", &pos));
17*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(1ul, pos);
18*dbb99499SAndroid Build Coastguard Worker }
19*dbb99499SAndroid Build Coastguard Worker {
20*dbb99499SAndroid Build Coastguard Worker size_t pos = 0;
21*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(7ul, benchmark::stoul("7", &pos));
22*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(1ul, pos);
23*dbb99499SAndroid Build Coastguard Worker }
24*dbb99499SAndroid Build Coastguard Worker {
25*dbb99499SAndroid Build Coastguard Worker size_t pos = 0;
26*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(135ul, benchmark::stoul("135", &pos));
27*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(3ul, pos);
28*dbb99499SAndroid Build Coastguard Worker }
29*dbb99499SAndroid Build Coastguard Worker #if ULONG_MAX == 0xFFFFFFFFul
30*dbb99499SAndroid Build Coastguard Worker {
31*dbb99499SAndroid Build Coastguard Worker size_t pos = 0;
32*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(0xFFFFFFFFul, benchmark::stoul("4294967295", &pos));
33*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(10ul, pos);
34*dbb99499SAndroid Build Coastguard Worker }
35*dbb99499SAndroid Build Coastguard Worker #elif ULONG_MAX == 0xFFFFFFFFFFFFFFFFul
36*dbb99499SAndroid Build Coastguard Worker {
37*dbb99499SAndroid Build Coastguard Worker size_t pos = 0;
38*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(0xFFFFFFFFFFFFFFFFul,
39*dbb99499SAndroid Build Coastguard Worker benchmark::stoul("18446744073709551615", &pos));
40*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(20ul, pos);
41*dbb99499SAndroid Build Coastguard Worker }
42*dbb99499SAndroid Build Coastguard Worker #endif
43*dbb99499SAndroid Build Coastguard Worker {
44*dbb99499SAndroid Build Coastguard Worker size_t pos = 0;
45*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(10ul, benchmark::stoul("1010", &pos, 2));
46*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(4ul, pos);
47*dbb99499SAndroid Build Coastguard Worker }
48*dbb99499SAndroid Build Coastguard Worker {
49*dbb99499SAndroid Build Coastguard Worker size_t pos = 0;
50*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(520ul, benchmark::stoul("1010", &pos, 8));
51*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(4ul, pos);
52*dbb99499SAndroid Build Coastguard Worker }
53*dbb99499SAndroid Build Coastguard Worker {
54*dbb99499SAndroid Build Coastguard Worker size_t pos = 0;
55*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(1010ul, benchmark::stoul("1010", &pos, 10));
56*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(4ul, pos);
57*dbb99499SAndroid Build Coastguard Worker }
58*dbb99499SAndroid Build Coastguard Worker {
59*dbb99499SAndroid Build Coastguard Worker size_t pos = 0;
60*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(4112ul, benchmark::stoul("1010", &pos, 16));
61*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(4ul, pos);
62*dbb99499SAndroid Build Coastguard Worker }
63*dbb99499SAndroid Build Coastguard Worker {
64*dbb99499SAndroid Build Coastguard Worker size_t pos = 0;
65*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(0xBEEFul, benchmark::stoul("BEEF", &pos, 16));
66*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(4ul, pos);
67*dbb99499SAndroid Build Coastguard Worker }
68*dbb99499SAndroid Build Coastguard Worker #ifndef BENCHMARK_HAS_NO_EXCEPTIONS
69*dbb99499SAndroid Build Coastguard Worker {
70*dbb99499SAndroid Build Coastguard Worker ASSERT_THROW(std::ignore = benchmark::stoul("this is a test"),
71*dbb99499SAndroid Build Coastguard Worker std::invalid_argument);
72*dbb99499SAndroid Build Coastguard Worker }
73*dbb99499SAndroid Build Coastguard Worker #endif
74*dbb99499SAndroid Build Coastguard Worker }
75*dbb99499SAndroid Build Coastguard Worker
TEST(StringUtilTest,stoi)76*dbb99499SAndroid Build Coastguard Worker TEST(StringUtilTest, stoi){{size_t pos = 0;
77*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(0, benchmark::stoi("0", &pos));
78*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(1ul, pos);
79*dbb99499SAndroid Build Coastguard Worker } // namespace
80*dbb99499SAndroid Build Coastguard Worker {
81*dbb99499SAndroid Build Coastguard Worker size_t pos = 0;
82*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(-17, benchmark::stoi("-17", &pos));
83*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(3ul, pos);
84*dbb99499SAndroid Build Coastguard Worker }
85*dbb99499SAndroid Build Coastguard Worker {
86*dbb99499SAndroid Build Coastguard Worker size_t pos = 0;
87*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(1357, benchmark::stoi("1357", &pos));
88*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(4ul, pos);
89*dbb99499SAndroid Build Coastguard Worker }
90*dbb99499SAndroid Build Coastguard Worker {
91*dbb99499SAndroid Build Coastguard Worker size_t pos = 0;
92*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(10, benchmark::stoi("1010", &pos, 2));
93*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(4ul, pos);
94*dbb99499SAndroid Build Coastguard Worker }
95*dbb99499SAndroid Build Coastguard Worker {
96*dbb99499SAndroid Build Coastguard Worker size_t pos = 0;
97*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(520, benchmark::stoi("1010", &pos, 8));
98*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(4ul, pos);
99*dbb99499SAndroid Build Coastguard Worker }
100*dbb99499SAndroid Build Coastguard Worker {
101*dbb99499SAndroid Build Coastguard Worker size_t pos = 0;
102*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(1010, benchmark::stoi("1010", &pos, 10));
103*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(4ul, pos);
104*dbb99499SAndroid Build Coastguard Worker }
105*dbb99499SAndroid Build Coastguard Worker {
106*dbb99499SAndroid Build Coastguard Worker size_t pos = 0;
107*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(4112, benchmark::stoi("1010", &pos, 16));
108*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(4ul, pos);
109*dbb99499SAndroid Build Coastguard Worker }
110*dbb99499SAndroid Build Coastguard Worker {
111*dbb99499SAndroid Build Coastguard Worker size_t pos = 0;
112*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(0xBEEF, benchmark::stoi("BEEF", &pos, 16));
113*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(4ul, pos);
114*dbb99499SAndroid Build Coastguard Worker }
115*dbb99499SAndroid Build Coastguard Worker #ifndef BENCHMARK_HAS_NO_EXCEPTIONS
116*dbb99499SAndroid Build Coastguard Worker {
117*dbb99499SAndroid Build Coastguard Worker ASSERT_THROW(std::ignore = benchmark::stoi("this is a test"),
118*dbb99499SAndroid Build Coastguard Worker std::invalid_argument);
119*dbb99499SAndroid Build Coastguard Worker }
120*dbb99499SAndroid Build Coastguard Worker #endif
121*dbb99499SAndroid Build Coastguard Worker }
122*dbb99499SAndroid Build Coastguard Worker
TEST(StringUtilTest,stod)123*dbb99499SAndroid Build Coastguard Worker TEST(StringUtilTest, stod){{size_t pos = 0;
124*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(0.0, benchmark::stod("0", &pos));
125*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(1ul, pos);
126*dbb99499SAndroid Build Coastguard Worker }
127*dbb99499SAndroid Build Coastguard Worker {
128*dbb99499SAndroid Build Coastguard Worker size_t pos = 0;
129*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(-84.0, benchmark::stod("-84", &pos));
130*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(3ul, pos);
131*dbb99499SAndroid Build Coastguard Worker }
132*dbb99499SAndroid Build Coastguard Worker {
133*dbb99499SAndroid Build Coastguard Worker size_t pos = 0;
134*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(1234.0, benchmark::stod("1234", &pos));
135*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(4ul, pos);
136*dbb99499SAndroid Build Coastguard Worker }
137*dbb99499SAndroid Build Coastguard Worker {
138*dbb99499SAndroid Build Coastguard Worker size_t pos = 0;
139*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(1.5, benchmark::stod("1.5", &pos));
140*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(3ul, pos);
141*dbb99499SAndroid Build Coastguard Worker }
142*dbb99499SAndroid Build Coastguard Worker {
143*dbb99499SAndroid Build Coastguard Worker size_t pos = 0;
144*dbb99499SAndroid Build Coastguard Worker /* Note: exactly representable as double */
145*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(-1.25e+9, benchmark::stod("-1.25e+9", &pos));
146*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(8ul, pos);
147*dbb99499SAndroid Build Coastguard Worker }
148*dbb99499SAndroid Build Coastguard Worker #ifndef BENCHMARK_HAS_NO_EXCEPTIONS
149*dbb99499SAndroid Build Coastguard Worker {
150*dbb99499SAndroid Build Coastguard Worker ASSERT_THROW(std::ignore = benchmark::stod("this is a test"),
151*dbb99499SAndroid Build Coastguard Worker std::invalid_argument);
152*dbb99499SAndroid Build Coastguard Worker }
153*dbb99499SAndroid Build Coastguard Worker #endif
154*dbb99499SAndroid Build Coastguard Worker }
155*dbb99499SAndroid Build Coastguard Worker
TEST(StringUtilTest,StrSplit)156*dbb99499SAndroid Build Coastguard Worker TEST(StringUtilTest, StrSplit) {
157*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(benchmark::StrSplit("", ','), std::vector<std::string>{});
158*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(benchmark::StrSplit("hello", ','),
159*dbb99499SAndroid Build Coastguard Worker std::vector<std::string>({"hello"}));
160*dbb99499SAndroid Build Coastguard Worker EXPECT_EQ(benchmark::StrSplit("hello,there,is,more", ','),
161*dbb99499SAndroid Build Coastguard Worker std::vector<std::string>({"hello", "there", "is", "more"}));
162*dbb99499SAndroid Build Coastguard Worker }
163*dbb99499SAndroid Build Coastguard Worker
164*dbb99499SAndroid Build Coastguard Worker using HumanReadableFixture = ::testing::TestWithParam<
165*dbb99499SAndroid Build Coastguard Worker std::tuple<double, benchmark::Counter::OneK, std::string>>;
166*dbb99499SAndroid Build Coastguard Worker
167*dbb99499SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(
168*dbb99499SAndroid Build Coastguard Worker HumanReadableTests, HumanReadableFixture,
169*dbb99499SAndroid Build Coastguard Worker ::testing::Values(
170*dbb99499SAndroid Build Coastguard Worker std::make_tuple(0.0, benchmark::Counter::kIs1024, "0"),
171*dbb99499SAndroid Build Coastguard Worker std::make_tuple(999.0, benchmark::Counter::kIs1024, "999"),
172*dbb99499SAndroid Build Coastguard Worker std::make_tuple(1000.0, benchmark::Counter::kIs1024, "1000"),
173*dbb99499SAndroid Build Coastguard Worker std::make_tuple(1024.0, benchmark::Counter::kIs1024, "1Ki"),
174*dbb99499SAndroid Build Coastguard Worker std::make_tuple(1000 * 1000.0, benchmark::Counter::kIs1024,
175*dbb99499SAndroid Build Coastguard Worker "976\\.56.Ki"),
176*dbb99499SAndroid Build Coastguard Worker std::make_tuple(1024 * 1024.0, benchmark::Counter::kIs1024, "1Mi"),
177*dbb99499SAndroid Build Coastguard Worker std::make_tuple(1000 * 1000 * 1000.0, benchmark::Counter::kIs1024,
178*dbb99499SAndroid Build Coastguard Worker "953\\.674Mi"),
179*dbb99499SAndroid Build Coastguard Worker std::make_tuple(1024 * 1024 * 1024.0, benchmark::Counter::kIs1024,
180*dbb99499SAndroid Build Coastguard Worker "1Gi"),
181*dbb99499SAndroid Build Coastguard Worker std::make_tuple(0.0, benchmark::Counter::kIs1000, "0"),
182*dbb99499SAndroid Build Coastguard Worker std::make_tuple(999.0, benchmark::Counter::kIs1000, "999"),
183*dbb99499SAndroid Build Coastguard Worker std::make_tuple(1000.0, benchmark::Counter::kIs1000, "1k"),
184*dbb99499SAndroid Build Coastguard Worker std::make_tuple(1024.0, benchmark::Counter::kIs1000, "1.024k"),
185*dbb99499SAndroid Build Coastguard Worker std::make_tuple(1000 * 1000.0, benchmark::Counter::kIs1000, "1M"),
186*dbb99499SAndroid Build Coastguard Worker std::make_tuple(1024 * 1024.0, benchmark::Counter::kIs1000,
187*dbb99499SAndroid Build Coastguard Worker "1\\.04858M"),
188*dbb99499SAndroid Build Coastguard Worker std::make_tuple(1000 * 1000 * 1000.0, benchmark::Counter::kIs1000,
189*dbb99499SAndroid Build Coastguard Worker "1G"),
190*dbb99499SAndroid Build Coastguard Worker std::make_tuple(1024 * 1024 * 1024.0, benchmark::Counter::kIs1000,
191*dbb99499SAndroid Build Coastguard Worker "1\\.07374G")));
192*dbb99499SAndroid Build Coastguard Worker
TEST_P(HumanReadableFixture,HumanReadableNumber)193*dbb99499SAndroid Build Coastguard Worker TEST_P(HumanReadableFixture, HumanReadableNumber) {
194*dbb99499SAndroid Build Coastguard Worker std::string str = benchmark::HumanReadableNumber(std::get<0>(GetParam()),
195*dbb99499SAndroid Build Coastguard Worker std::get<1>(GetParam()));
196*dbb99499SAndroid Build Coastguard Worker ASSERT_THAT(str, ::testing::MatchesRegex(std::get<2>(GetParam())));
197*dbb99499SAndroid Build Coastguard Worker }
198*dbb99499SAndroid Build Coastguard Worker
199*dbb99499SAndroid Build Coastguard Worker } // end namespace
200