1 //===---------------------------------------------------------------------===//
2 // statistics_test - Unit tests for src/statistics.cc
3 //===---------------------------------------------------------------------===//
4
5 #include <tuple>
6
7 #include "../src/internal_macros.h"
8 #include "../src/string_util.h"
9 #include "gtest/gtest.h"
10
11 namespace {
TEST(StringUtilTest,stoul)12 TEST(StringUtilTest, stoul) {
13 {
14 size_t pos = 0;
15 EXPECT_EQ(0ul, benchmark::stoul("0", &pos));
16 EXPECT_EQ(1ul, pos);
17 }
18 {
19 size_t pos = 0;
20 EXPECT_EQ(7ul, benchmark::stoul("7", &pos));
21 EXPECT_EQ(1ul, pos);
22 }
23 {
24 size_t pos = 0;
25 EXPECT_EQ(135ul, benchmark::stoul("135", &pos));
26 EXPECT_EQ(3ul, pos);
27 }
28 #if ULONG_MAX == 0xFFFFFFFFul
29 {
30 size_t pos = 0;
31 EXPECT_EQ(0xFFFFFFFFul, benchmark::stoul("4294967295", &pos));
32 EXPECT_EQ(10ul, pos);
33 }
34 #elif ULONG_MAX == 0xFFFFFFFFFFFFFFFFul
35 {
36 size_t pos = 0;
37 EXPECT_EQ(0xFFFFFFFFFFFFFFFFul,
38 benchmark::stoul("18446744073709551615", &pos));
39 EXPECT_EQ(20ul, pos);
40 }
41 #endif
42 {
43 size_t pos = 0;
44 EXPECT_EQ(10ul, benchmark::stoul("1010", &pos, 2));
45 EXPECT_EQ(4ul, pos);
46 }
47 {
48 size_t pos = 0;
49 EXPECT_EQ(520ul, benchmark::stoul("1010", &pos, 8));
50 EXPECT_EQ(4ul, pos);
51 }
52 {
53 size_t pos = 0;
54 EXPECT_EQ(1010ul, benchmark::stoul("1010", &pos, 10));
55 EXPECT_EQ(4ul, pos);
56 }
57 {
58 size_t pos = 0;
59 EXPECT_EQ(4112ul, benchmark::stoul("1010", &pos, 16));
60 EXPECT_EQ(4ul, pos);
61 }
62 {
63 size_t pos = 0;
64 EXPECT_EQ(0xBEEFul, benchmark::stoul("BEEF", &pos, 16));
65 EXPECT_EQ(4ul, pos);
66 }
67 #ifndef BENCHMARK_HAS_NO_EXCEPTIONS
68 {
69 ASSERT_THROW(std::ignore = benchmark::stoul("this is a test"),
70 std::invalid_argument);
71 }
72 #endif
73 }
74
TEST(StringUtilTest,stoi)75 TEST(StringUtilTest, stoi){{size_t pos = 0;
76 EXPECT_EQ(0, benchmark::stoi("0", &pos));
77 EXPECT_EQ(1ul, pos);
78 } // namespace
79 {
80 size_t pos = 0;
81 EXPECT_EQ(-17, benchmark::stoi("-17", &pos));
82 EXPECT_EQ(3ul, pos);
83 }
84 {
85 size_t pos = 0;
86 EXPECT_EQ(1357, benchmark::stoi("1357", &pos));
87 EXPECT_EQ(4ul, pos);
88 }
89 {
90 size_t pos = 0;
91 EXPECT_EQ(10, benchmark::stoi("1010", &pos, 2));
92 EXPECT_EQ(4ul, pos);
93 }
94 {
95 size_t pos = 0;
96 EXPECT_EQ(520, benchmark::stoi("1010", &pos, 8));
97 EXPECT_EQ(4ul, pos);
98 }
99 {
100 size_t pos = 0;
101 EXPECT_EQ(1010, benchmark::stoi("1010", &pos, 10));
102 EXPECT_EQ(4ul, pos);
103 }
104 {
105 size_t pos = 0;
106 EXPECT_EQ(4112, benchmark::stoi("1010", &pos, 16));
107 EXPECT_EQ(4ul, pos);
108 }
109 {
110 size_t pos = 0;
111 EXPECT_EQ(0xBEEF, benchmark::stoi("BEEF", &pos, 16));
112 EXPECT_EQ(4ul, pos);
113 }
114 #ifndef BENCHMARK_HAS_NO_EXCEPTIONS
115 {
116 ASSERT_THROW(std::ignore = benchmark::stoi("this is a test"),
117 std::invalid_argument);
118 }
119 #endif
120 }
121
TEST(StringUtilTest,stod)122 TEST(StringUtilTest, stod){{size_t pos = 0;
123 EXPECT_EQ(0.0, benchmark::stod("0", &pos));
124 EXPECT_EQ(1ul, pos);
125 }
126 {
127 size_t pos = 0;
128 EXPECT_EQ(-84.0, benchmark::stod("-84", &pos));
129 EXPECT_EQ(3ul, pos);
130 }
131 {
132 size_t pos = 0;
133 EXPECT_EQ(1234.0, benchmark::stod("1234", &pos));
134 EXPECT_EQ(4ul, pos);
135 }
136 {
137 size_t pos = 0;
138 EXPECT_EQ(1.5, benchmark::stod("1.5", &pos));
139 EXPECT_EQ(3ul, pos);
140 }
141 {
142 size_t pos = 0;
143 /* Note: exactly representable as double */
144 EXPECT_EQ(-1.25e+9, benchmark::stod("-1.25e+9", &pos));
145 EXPECT_EQ(8ul, pos);
146 }
147 #ifndef BENCHMARK_HAS_NO_EXCEPTIONS
148 {
149 ASSERT_THROW(std::ignore = benchmark::stod("this is a test"),
150 std::invalid_argument);
151 }
152 #endif
153 }
154
TEST(StringUtilTest,StrSplit)155 TEST(StringUtilTest, StrSplit) {
156 EXPECT_EQ(benchmark::StrSplit("", ','), std::vector<std::string>{});
157 EXPECT_EQ(benchmark::StrSplit("hello", ','),
158 std::vector<std::string>({"hello"}));
159 EXPECT_EQ(benchmark::StrSplit("hello,there,is,more", ','),
160 std::vector<std::string>({"hello", "there", "is", "more"}));
161 }
162
163 } // end namespace
164