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