/* * Copyright 2017 The WebRTC Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #include "rtc_base/string_to_number.h" #include #include #include #include "absl/strings/string_view.h" #include "absl/types/optional.h" #include "test/gtest.h" namespace rtc { namespace { // clang-format off using IntegerTypes = ::testing::Types; // clang-format on template class BasicNumberTest : public ::testing::Test {}; TYPED_TEST_SUITE_P(BasicNumberTest); TYPED_TEST_P(BasicNumberTest, TestValidNumbers) { using T = TypeParam; constexpr T min_value = std::numeric_limits::lowest(); constexpr T max_value = std::numeric_limits::max(); constexpr T zero_value = 0; const std::string min_string = std::to_string(min_value); const std::string max_string = std::to_string(max_value); EXPECT_EQ(min_value, StringToNumber(min_string)); EXPECT_EQ(min_value, StringToNumber(min_string.c_str())); EXPECT_EQ(max_value, StringToNumber(max_string)); EXPECT_EQ(max_value, StringToNumber(max_string.c_str())); EXPECT_EQ(zero_value, StringToNumber("0")); EXPECT_EQ(zero_value, StringToNumber("-0")); EXPECT_EQ(zero_value, StringToNumber(std::string("-0000000000000"))); } TYPED_TEST_P(BasicNumberTest, TestInvalidNumbers) { using T = TypeParam; // Value ranges aren't strictly enforced in this test, since that would either // require doctoring specific strings for each data type, which is a hassle // across platforms, or to be able to do addition of values larger than the // largest type, which is another hassle. constexpr T min_value = std::numeric_limits::lowest(); constexpr T max_value = std::numeric_limits::max(); // If the type supports negative values, make the large negative value // approximately ten times larger. If the type is unsigned, just use -2. const std::string too_low_string = (min_value == 0) ? "-2" : (std::to_string(min_value) + "1"); // Make the large value approximately ten times larger than the maximum. const std::string too_large_string = std::to_string(max_value) + "1"; EXPECT_EQ(absl::nullopt, StringToNumber(too_low_string)); EXPECT_EQ(absl::nullopt, StringToNumber(too_low_string.c_str())); EXPECT_EQ(absl::nullopt, StringToNumber(too_large_string)); EXPECT_EQ(absl::nullopt, StringToNumber(too_large_string.c_str())); } TYPED_TEST_P(BasicNumberTest, TestInvalidInputs) { using T = TypeParam; const char kInvalidCharArray[] = "Invalid string containing 47"; const char kPlusMinusCharArray[] = "+-100"; const char kNumberFollowedByCruft[] = "640x480"; const char kEmbeddedNul[] = {'1', '2', '\0', '3', '4'}; const char kBeginningEmbeddedNul[] = {'\0', '1', '2', '3', '4'}; const char kTrailingEmbeddedNul[] = {'1', '2', '3', '4', '\0'}; EXPECT_EQ(absl::nullopt, StringToNumber(kInvalidCharArray)); EXPECT_EQ(absl::nullopt, StringToNumber(std::string(kInvalidCharArray))); EXPECT_EQ(absl::nullopt, StringToNumber(kPlusMinusCharArray)); EXPECT_EQ(absl::nullopt, StringToNumber(std::string(kPlusMinusCharArray))); EXPECT_EQ(absl::nullopt, StringToNumber(kNumberFollowedByCruft)); EXPECT_EQ(absl::nullopt, StringToNumber(std::string(kNumberFollowedByCruft))); EXPECT_EQ(absl::nullopt, StringToNumber(" 5")); EXPECT_EQ(absl::nullopt, StringToNumber(" - 5")); EXPECT_EQ(absl::nullopt, StringToNumber("- 5")); EXPECT_EQ(absl::nullopt, StringToNumber(" -5")); EXPECT_EQ(absl::nullopt, StringToNumber("5 ")); // Test various types of empty inputs EXPECT_EQ(absl::nullopt, StringToNumber({nullptr, 0})); EXPECT_EQ(absl::nullopt, StringToNumber("")); EXPECT_EQ(absl::nullopt, StringToNumber(std::string())); EXPECT_EQ(absl::nullopt, StringToNumber(std::string(""))); EXPECT_EQ(absl::nullopt, StringToNumber(absl::string_view())); EXPECT_EQ(absl::nullopt, StringToNumber(absl::string_view(nullptr, 0))); EXPECT_EQ(absl::nullopt, StringToNumber(absl::string_view(""))); // Test strings with embedded nuls. EXPECT_EQ(absl::nullopt, StringToNumber(absl::string_view( kEmbeddedNul, sizeof(kEmbeddedNul)))); EXPECT_EQ(absl::nullopt, StringToNumber(absl::string_view( kBeginningEmbeddedNul, sizeof(kBeginningEmbeddedNul)))); EXPECT_EQ(absl::nullopt, StringToNumber(absl::string_view(kTrailingEmbeddedNul, sizeof(kTrailingEmbeddedNul)))); } REGISTER_TYPED_TEST_SUITE_P(BasicNumberTest, TestValidNumbers, TestInvalidNumbers, TestInvalidInputs); } // namespace INSTANTIATE_TYPED_TEST_SUITE_P(StringToNumberTest_Integers, BasicNumberTest, IntegerTypes); TEST(StringToNumberTest, TestSpecificValues) { EXPECT_EQ(absl::nullopt, StringToNumber("256")); EXPECT_EQ(absl::nullopt, StringToNumber("-256")); EXPECT_EQ(absl::nullopt, StringToNumber("256")); EXPECT_EQ(absl::nullopt, StringToNumber("-256")); } } // namespace rtc