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