15dda2efdSMircea Trofin //===---------------------------------------------------------------------===//
2*a5b79717SMircea Trofin // string_util_test - Unit tests for src/string_util.cc
35dda2efdSMircea Trofin //===---------------------------------------------------------------------===//
45dda2efdSMircea Trofin
5*a5b79717SMircea Trofin #include <tuple>
6*a5b79717SMircea Trofin
75dda2efdSMircea Trofin #include "../src/internal_macros.h"
8a290770fSMircea Trofin #include "../src/string_util.h"
9*a5b79717SMircea Trofin #include "gmock/gmock.h"
105dda2efdSMircea Trofin #include "gtest/gtest.h"
115dda2efdSMircea Trofin
125dda2efdSMircea Trofin namespace {
TEST(StringUtilTest,stoul)135dda2efdSMircea Trofin TEST(StringUtilTest, stoul) {
145dda2efdSMircea Trofin {
155dda2efdSMircea Trofin size_t pos = 0;
165dda2efdSMircea Trofin EXPECT_EQ(0ul, benchmark::stoul("0", &pos));
175dda2efdSMircea Trofin EXPECT_EQ(1ul, pos);
185dda2efdSMircea Trofin }
195dda2efdSMircea Trofin {
205dda2efdSMircea Trofin size_t pos = 0;
215dda2efdSMircea Trofin EXPECT_EQ(7ul, benchmark::stoul("7", &pos));
225dda2efdSMircea Trofin EXPECT_EQ(1ul, pos);
235dda2efdSMircea Trofin }
245dda2efdSMircea Trofin {
255dda2efdSMircea Trofin size_t pos = 0;
265dda2efdSMircea Trofin EXPECT_EQ(135ul, benchmark::stoul("135", &pos));
275dda2efdSMircea Trofin EXPECT_EQ(3ul, pos);
285dda2efdSMircea Trofin }
295dda2efdSMircea Trofin #if ULONG_MAX == 0xFFFFFFFFul
305dda2efdSMircea Trofin {
315dda2efdSMircea Trofin size_t pos = 0;
325dda2efdSMircea Trofin EXPECT_EQ(0xFFFFFFFFul, benchmark::stoul("4294967295", &pos));
335dda2efdSMircea Trofin EXPECT_EQ(10ul, pos);
345dda2efdSMircea Trofin }
355dda2efdSMircea Trofin #elif ULONG_MAX == 0xFFFFFFFFFFFFFFFFul
365dda2efdSMircea Trofin {
375dda2efdSMircea Trofin size_t pos = 0;
38a290770fSMircea Trofin EXPECT_EQ(0xFFFFFFFFFFFFFFFFul,
39a290770fSMircea Trofin benchmark::stoul("18446744073709551615", &pos));
405dda2efdSMircea Trofin EXPECT_EQ(20ul, pos);
415dda2efdSMircea Trofin }
425dda2efdSMircea Trofin #endif
435dda2efdSMircea Trofin {
445dda2efdSMircea Trofin size_t pos = 0;
455dda2efdSMircea Trofin EXPECT_EQ(10ul, benchmark::stoul("1010", &pos, 2));
465dda2efdSMircea Trofin EXPECT_EQ(4ul, pos);
475dda2efdSMircea Trofin }
485dda2efdSMircea Trofin {
495dda2efdSMircea Trofin size_t pos = 0;
505dda2efdSMircea Trofin EXPECT_EQ(520ul, benchmark::stoul("1010", &pos, 8));
515dda2efdSMircea Trofin EXPECT_EQ(4ul, pos);
525dda2efdSMircea Trofin }
535dda2efdSMircea Trofin {
545dda2efdSMircea Trofin size_t pos = 0;
555dda2efdSMircea Trofin EXPECT_EQ(1010ul, benchmark::stoul("1010", &pos, 10));
565dda2efdSMircea Trofin EXPECT_EQ(4ul, pos);
575dda2efdSMircea Trofin }
585dda2efdSMircea Trofin {
595dda2efdSMircea Trofin size_t pos = 0;
605dda2efdSMircea Trofin EXPECT_EQ(4112ul, benchmark::stoul("1010", &pos, 16));
615dda2efdSMircea Trofin EXPECT_EQ(4ul, pos);
625dda2efdSMircea Trofin }
635dda2efdSMircea Trofin {
645dda2efdSMircea Trofin size_t pos = 0;
655dda2efdSMircea Trofin EXPECT_EQ(0xBEEFul, benchmark::stoul("BEEF", &pos, 16));
665dda2efdSMircea Trofin EXPECT_EQ(4ul, pos);
675dda2efdSMircea Trofin }
685dda2efdSMircea Trofin #ifndef BENCHMARK_HAS_NO_EXCEPTIONS
69*a5b79717SMircea Trofin {
70*a5b79717SMircea Trofin ASSERT_THROW(std::ignore = benchmark::stoul("this is a test"),
71*a5b79717SMircea Trofin std::invalid_argument);
72*a5b79717SMircea Trofin }
735dda2efdSMircea Trofin #endif
745dda2efdSMircea Trofin }
755dda2efdSMircea Trofin
TEST(StringUtilTest,stoi)76a290770fSMircea Trofin TEST(StringUtilTest, stoi){{size_t pos = 0;
775dda2efdSMircea Trofin EXPECT_EQ(0, benchmark::stoi("0", &pos));
785dda2efdSMircea Trofin EXPECT_EQ(1ul, pos);
79a290770fSMircea Trofin } // namespace
805dda2efdSMircea Trofin {
815dda2efdSMircea Trofin size_t pos = 0;
825dda2efdSMircea Trofin EXPECT_EQ(-17, benchmark::stoi("-17", &pos));
835dda2efdSMircea Trofin EXPECT_EQ(3ul, pos);
845dda2efdSMircea Trofin }
855dda2efdSMircea Trofin {
865dda2efdSMircea Trofin size_t pos = 0;
875dda2efdSMircea Trofin EXPECT_EQ(1357, benchmark::stoi("1357", &pos));
885dda2efdSMircea Trofin EXPECT_EQ(4ul, pos);
895dda2efdSMircea Trofin }
905dda2efdSMircea Trofin {
915dda2efdSMircea Trofin size_t pos = 0;
925dda2efdSMircea Trofin EXPECT_EQ(10, benchmark::stoi("1010", &pos, 2));
935dda2efdSMircea Trofin EXPECT_EQ(4ul, pos);
945dda2efdSMircea Trofin }
955dda2efdSMircea Trofin {
965dda2efdSMircea Trofin size_t pos = 0;
975dda2efdSMircea Trofin EXPECT_EQ(520, benchmark::stoi("1010", &pos, 8));
985dda2efdSMircea Trofin EXPECT_EQ(4ul, pos);
995dda2efdSMircea Trofin }
1005dda2efdSMircea Trofin {
1015dda2efdSMircea Trofin size_t pos = 0;
1025dda2efdSMircea Trofin EXPECT_EQ(1010, benchmark::stoi("1010", &pos, 10));
1035dda2efdSMircea Trofin EXPECT_EQ(4ul, pos);
1045dda2efdSMircea Trofin }
1055dda2efdSMircea Trofin {
1065dda2efdSMircea Trofin size_t pos = 0;
1075dda2efdSMircea Trofin EXPECT_EQ(4112, benchmark::stoi("1010", &pos, 16));
1085dda2efdSMircea Trofin EXPECT_EQ(4ul, pos);
1095dda2efdSMircea Trofin }
1105dda2efdSMircea Trofin {
1115dda2efdSMircea Trofin size_t pos = 0;
1125dda2efdSMircea Trofin EXPECT_EQ(0xBEEF, benchmark::stoi("BEEF", &pos, 16));
1135dda2efdSMircea Trofin EXPECT_EQ(4ul, pos);
1145dda2efdSMircea Trofin }
1155dda2efdSMircea Trofin #ifndef BENCHMARK_HAS_NO_EXCEPTIONS
116*a5b79717SMircea Trofin {
117*a5b79717SMircea Trofin ASSERT_THROW(std::ignore = benchmark::stoi("this is a test"),
118*a5b79717SMircea Trofin std::invalid_argument);
119*a5b79717SMircea Trofin }
1205dda2efdSMircea Trofin #endif
1215dda2efdSMircea Trofin }
1225dda2efdSMircea Trofin
TEST(StringUtilTest,stod)123a290770fSMircea Trofin TEST(StringUtilTest, stod){{size_t pos = 0;
1245dda2efdSMircea Trofin EXPECT_EQ(0.0, benchmark::stod("0", &pos));
1255dda2efdSMircea Trofin EXPECT_EQ(1ul, pos);
1265dda2efdSMircea Trofin }
1275dda2efdSMircea Trofin {
1285dda2efdSMircea Trofin size_t pos = 0;
1295dda2efdSMircea Trofin EXPECT_EQ(-84.0, benchmark::stod("-84", &pos));
1305dda2efdSMircea Trofin EXPECT_EQ(3ul, pos);
1315dda2efdSMircea Trofin }
1325dda2efdSMircea Trofin {
1335dda2efdSMircea Trofin size_t pos = 0;
1345dda2efdSMircea Trofin EXPECT_EQ(1234.0, benchmark::stod("1234", &pos));
1355dda2efdSMircea Trofin EXPECT_EQ(4ul, pos);
1365dda2efdSMircea Trofin }
1375dda2efdSMircea Trofin {
1385dda2efdSMircea Trofin size_t pos = 0;
1395dda2efdSMircea Trofin EXPECT_EQ(1.5, benchmark::stod("1.5", &pos));
1405dda2efdSMircea Trofin EXPECT_EQ(3ul, pos);
1415dda2efdSMircea Trofin }
1425dda2efdSMircea Trofin {
1435dda2efdSMircea Trofin size_t pos = 0;
1445dda2efdSMircea Trofin /* Note: exactly representable as double */
1455dda2efdSMircea Trofin EXPECT_EQ(-1.25e+9, benchmark::stod("-1.25e+9", &pos));
1465dda2efdSMircea Trofin EXPECT_EQ(8ul, pos);
1475dda2efdSMircea Trofin }
1485dda2efdSMircea Trofin #ifndef BENCHMARK_HAS_NO_EXCEPTIONS
149*a5b79717SMircea Trofin {
150*a5b79717SMircea Trofin ASSERT_THROW(std::ignore = benchmark::stod("this is a test"),
151*a5b79717SMircea Trofin std::invalid_argument);
152*a5b79717SMircea Trofin }
1535dda2efdSMircea Trofin #endif
1545dda2efdSMircea Trofin }
1555dda2efdSMircea Trofin
TEST(StringUtilTest,StrSplit)1565dda2efdSMircea Trofin TEST(StringUtilTest, StrSplit) {
1575dda2efdSMircea Trofin EXPECT_EQ(benchmark::StrSplit("", ','), std::vector<std::string>{});
1585dda2efdSMircea Trofin EXPECT_EQ(benchmark::StrSplit("hello", ','),
1595dda2efdSMircea Trofin std::vector<std::string>({"hello"}));
1605dda2efdSMircea Trofin EXPECT_EQ(benchmark::StrSplit("hello,there,is,more", ','),
1615dda2efdSMircea Trofin std::vector<std::string>({"hello", "there", "is", "more"}));
1625dda2efdSMircea Trofin }
1635dda2efdSMircea Trofin
164*a5b79717SMircea Trofin using HumanReadableFixture = ::testing::TestWithParam<
165*a5b79717SMircea Trofin std::tuple<double, benchmark::Counter::OneK, std::string>>;
166*a5b79717SMircea Trofin
167*a5b79717SMircea Trofin INSTANTIATE_TEST_SUITE_P(
168*a5b79717SMircea Trofin HumanReadableTests, HumanReadableFixture,
169*a5b79717SMircea Trofin ::testing::Values(
170*a5b79717SMircea Trofin std::make_tuple(0.0, benchmark::Counter::kIs1024, "0"),
171*a5b79717SMircea Trofin std::make_tuple(999.0, benchmark::Counter::kIs1024, "999"),
172*a5b79717SMircea Trofin std::make_tuple(1000.0, benchmark::Counter::kIs1024, "1000"),
173*a5b79717SMircea Trofin std::make_tuple(1024.0, benchmark::Counter::kIs1024, "1Ki"),
174*a5b79717SMircea Trofin std::make_tuple(1000 * 1000.0, benchmark::Counter::kIs1024,
175*a5b79717SMircea Trofin "976\\.56.Ki"),
176*a5b79717SMircea Trofin std::make_tuple(1024 * 1024.0, benchmark::Counter::kIs1024, "1Mi"),
177*a5b79717SMircea Trofin std::make_tuple(1000 * 1000 * 1000.0, benchmark::Counter::kIs1024,
178*a5b79717SMircea Trofin "953\\.674Mi"),
179*a5b79717SMircea Trofin std::make_tuple(1024 * 1024 * 1024.0, benchmark::Counter::kIs1024,
180*a5b79717SMircea Trofin "1Gi"),
181*a5b79717SMircea Trofin std::make_tuple(0.0, benchmark::Counter::kIs1000, "0"),
182*a5b79717SMircea Trofin std::make_tuple(999.0, benchmark::Counter::kIs1000, "999"),
183*a5b79717SMircea Trofin std::make_tuple(1000.0, benchmark::Counter::kIs1000, "1k"),
184*a5b79717SMircea Trofin std::make_tuple(1024.0, benchmark::Counter::kIs1000, "1.024k"),
185*a5b79717SMircea Trofin std::make_tuple(1000 * 1000.0, benchmark::Counter::kIs1000, "1M"),
186*a5b79717SMircea Trofin std::make_tuple(1024 * 1024.0, benchmark::Counter::kIs1000,
187*a5b79717SMircea Trofin "1\\.04858M"),
188*a5b79717SMircea Trofin std::make_tuple(1000 * 1000 * 1000.0, benchmark::Counter::kIs1000,
189*a5b79717SMircea Trofin "1G"),
190*a5b79717SMircea Trofin std::make_tuple(1024 * 1024 * 1024.0, benchmark::Counter::kIs1000,
191*a5b79717SMircea Trofin "1\\.07374G")));
192*a5b79717SMircea Trofin
TEST_P(HumanReadableFixture,HumanReadableNumber)193*a5b79717SMircea Trofin TEST_P(HumanReadableFixture, HumanReadableNumber) {
194*a5b79717SMircea Trofin std::string str = benchmark::HumanReadableNumber(std::get<0>(GetParam()),
195*a5b79717SMircea Trofin std::get<1>(GetParam()));
196*a5b79717SMircea Trofin ASSERT_THAT(str, ::testing::MatchesRegex(std::get<2>(GetParam())));
197*a5b79717SMircea Trofin }
198*a5b79717SMircea Trofin
1995dda2efdSMircea Trofin } // end namespace
200