summaryrefslogtreecommitdiff
path: root/src/mongo/base/parse_number_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/base/parse_number_test.cpp')
-rw-r--r--src/mongo/base/parse_number_test.cpp460
1 files changed, 225 insertions, 235 deletions
diff --git a/src/mongo/base/parse_number_test.cpp b/src/mongo/base/parse_number_test.cpp
index ecbad5086e9..4bc4aa2763c 100644
--- a/src/mongo/base/parse_number_test.cpp
+++ b/src/mongo/base/parse_number_test.cpp
@@ -37,276 +37,266 @@
#include "mongo/util/mongoutils/str.h" // for str::stream()!
#include "mongo/unittest/unittest.h"
-#define ASSERT_PARSES(TYPE, INPUT_STRING, EXPECTED_VALUE) do { \
- TYPE v; \
- ASSERT_OK(parseNumberFromString(INPUT_STRING, &v)); \
- ASSERT_EQUALS(static_cast<TYPE>(EXPECTED_VALUE), v); \
+#define ASSERT_PARSES(TYPE, INPUT_STRING, EXPECTED_VALUE) \
+ do { \
+ TYPE v; \
+ ASSERT_OK(parseNumberFromString(INPUT_STRING, &v)); \
+ ASSERT_EQUALS(static_cast<TYPE>(EXPECTED_VALUE), v); \
} while (false)
-#define ASSERT_PARSES_WITH_BASE(TYPE, INPUT_STRING, BASE, EXPECTED_VALUE) do { \
- TYPE v; \
+#define ASSERT_PARSES_WITH_BASE(TYPE, INPUT_STRING, BASE, EXPECTED_VALUE) \
+ do { \
+ TYPE v; \
ASSERT_OK(parseNumberFromStringWithBase(INPUT_STRING, BASE, &v)); \
- ASSERT_EQUALS(static_cast<TYPE>(EXPECTED_VALUE), v); \
+ ASSERT_EQUALS(static_cast<TYPE>(EXPECTED_VALUE), v); \
} while (false)
namespace mongo {
namespace {
- template <typename _NumberType>
- class CommonNumberParsingTests {
- public:
- typedef _NumberType NumberType;
- typedef std::numeric_limits<NumberType> Limits;
+template <typename _NumberType>
+class CommonNumberParsingTests {
+public:
+ typedef _NumberType NumberType;
+ typedef std::numeric_limits<NumberType> Limits;
- static void TestRejectingBadBases() {
- NumberType ignored;
- ASSERT_EQUALS(ErrorCodes::BadValue, parseNumberFromStringWithBase("0", -1, &ignored));
- ASSERT_EQUALS(ErrorCodes::BadValue, parseNumberFromStringWithBase("10", 1, &ignored));
- ASSERT_EQUALS(ErrorCodes::BadValue, parseNumberFromStringWithBase("-10", 37, &ignored));
- ASSERT_EQUALS(ErrorCodes::BadValue, parseNumberFromStringWithBase(" ", -1, &ignored));
- ASSERT_EQUALS(ErrorCodes::BadValue, parseNumberFromStringWithBase("f", 37, &ignored));
- ASSERT_EQUALS(ErrorCodes::BadValue, parseNumberFromStringWithBase("^%", -1, &ignored));
- }
-
- static void TestParsingNonNegatives() {
- ASSERT_PARSES(NumberType, "10", 10);
- ASSERT_PARSES(NumberType, "0", 0);
- ASSERT_PARSES(NumberType, "1", 1);
- ASSERT_PARSES(NumberType, "0xff", 0xff);
- ASSERT_PARSES(NumberType, "077", 077);
- }
+ static void TestRejectingBadBases() {
+ NumberType ignored;
+ ASSERT_EQUALS(ErrorCodes::BadValue, parseNumberFromStringWithBase("0", -1, &ignored));
+ ASSERT_EQUALS(ErrorCodes::BadValue, parseNumberFromStringWithBase("10", 1, &ignored));
+ ASSERT_EQUALS(ErrorCodes::BadValue, parseNumberFromStringWithBase("-10", 37, &ignored));
+ ASSERT_EQUALS(ErrorCodes::BadValue, parseNumberFromStringWithBase(" ", -1, &ignored));
+ ASSERT_EQUALS(ErrorCodes::BadValue, parseNumberFromStringWithBase("f", 37, &ignored));
+ ASSERT_EQUALS(ErrorCodes::BadValue, parseNumberFromStringWithBase("^%", -1, &ignored));
+ }
- static void TestParsingNegatives() {
- if (Limits::is_signed) {
- ASSERT_PARSES(NumberType, "-10", -10);
- ASSERT_PARSES(NumberType, "-0xff", -0xff);
- ASSERT_PARSES(NumberType, "-077", -077);
- }
- else {
- NumberType ignored;
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("-10", &ignored));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("-0xff", &ignored));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("-077", &ignored));
- }
- }
+ static void TestParsingNonNegatives() {
+ ASSERT_PARSES(NumberType, "10", 10);
+ ASSERT_PARSES(NumberType, "0", 0);
+ ASSERT_PARSES(NumberType, "1", 1);
+ ASSERT_PARSES(NumberType, "0xff", 0xff);
+ ASSERT_PARSES(NumberType, "077", 077);
+ }
- static void TestParsingGarbage() {
+ static void TestParsingNegatives() {
+ if (Limits::is_signed) {
+ ASSERT_PARSES(NumberType, "-10", -10);
+ ASSERT_PARSES(NumberType, "-0xff", -0xff);
+ ASSERT_PARSES(NumberType, "-077", -077);
+ } else {
NumberType ignored;
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("", &ignored));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString(" ", &ignored));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString(" 10", &ignored));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("15b", &ignored));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("--10", &ignored));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("+-10", &ignored));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("++10", &ignored));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("--10", &ignored));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("0x+10", &ignored));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("0x-10", &ignored));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("0+10", &ignored));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("0-10", &ignored));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("1+10", &ignored));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("1-10", &ignored));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("48*3", &ignored));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("0x", &ignored));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("+", &ignored));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("-", &ignored));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("+0x", &ignored));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("-0x", &ignored));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("-10", &ignored));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("-0xff", &ignored));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("-077", &ignored));
}
+ }
- static void TestParsingWithExplicitBase() {
- NumberType x;
- ASSERT_PARSES_WITH_BASE(NumberType, "15b", 16, 0x15b);
- ASSERT_PARSES_WITH_BASE(NumberType, "77", 8, 077);
- ASSERT_PARSES_WITH_BASE(NumberType, "z", 36, 35);
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("1b", 10, &x));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("80", 8, &x));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("0X", 16, &x));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("0x", 16, &x));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("0x", 8, &x));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("0X", 8, &x));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("0x", 10, &x));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("0X", 10, &x));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("+0X", 16, &x));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("+0x", 16, &x));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("+0x", 8, &x));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("+0X", 8, &x));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("+0x", 10, &x));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("+0X", 10, &x));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("-0X", 16, &x));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("-0x", 16, &x));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("-0x", 8, &x));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("-0X", 8, &x));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("-0x", 10, &x));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("-0X", 10, &x));
- }
+ static void TestParsingGarbage() {
+ NumberType ignored;
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("", &ignored));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString(" ", &ignored));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString(" 10", &ignored));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("15b", &ignored));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("--10", &ignored));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("+-10", &ignored));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("++10", &ignored));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("--10", &ignored));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("0x+10", &ignored));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("0x-10", &ignored));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("0+10", &ignored));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("0-10", &ignored));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("1+10", &ignored));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("1-10", &ignored));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("48*3", &ignored));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("0x", &ignored));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("+", &ignored));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("-", &ignored));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("+0x", &ignored));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("-0x", &ignored));
+ }
- static void TestParsingLimits() {
- using namespace mongoutils;
- NumberType ignored;
- ASSERT_PARSES(NumberType, std::string(str::stream() << Limits::max()), Limits::max());
- ASSERT_PARSES(NumberType, std::string(str::stream() << Limits::min()), Limits::min());
- ASSERT_EQUALS(ErrorCodes::FailedToParse,
- parseNumberFromString(std::string(str::stream() << Limits::max() << '0'), &ignored));
+ static void TestParsingWithExplicitBase() {
+ NumberType x;
+ ASSERT_PARSES_WITH_BASE(NumberType, "15b", 16, 0x15b);
+ ASSERT_PARSES_WITH_BASE(NumberType, "77", 8, 077);
+ ASSERT_PARSES_WITH_BASE(NumberType, "z", 36, 35);
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("1b", 10, &x));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("80", 8, &x));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("0X", 16, &x));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("0x", 16, &x));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("0x", 8, &x));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("0X", 8, &x));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("0x", 10, &x));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("0X", 10, &x));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("+0X", 16, &x));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("+0x", 16, &x));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("+0x", 8, &x));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("+0X", 8, &x));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("+0x", 10, &x));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("+0X", 10, &x));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("-0X", 16, &x));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("-0x", 16, &x));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("-0x", 8, &x));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("-0X", 8, &x));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("-0x", 10, &x));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromStringWithBase("-0X", 10, &x));
+ }
- if (Limits::is_signed)
- ASSERT_EQUALS(
- ErrorCodes::FailedToParse,
- parseNumberFromString(std::string(str::stream() << Limits::min() << '0'), &ignored));
- }
- };
+ static void TestParsingLimits() {
+ using namespace mongoutils;
+ NumberType ignored;
+ ASSERT_PARSES(NumberType, std::string(str::stream() << Limits::max()), Limits::max());
+ ASSERT_PARSES(NumberType, std::string(str::stream() << Limits::min()), Limits::min());
+ ASSERT_EQUALS(
+ ErrorCodes::FailedToParse,
+ parseNumberFromString(std::string(str::stream() << Limits::max() << '0'), &ignored));
-#define GENERAL_NUMBER_TESTS(SHORT_NAME, TYPE) \
- class ParseNumberTests##SHORT_NAME : public unittest::Test { \
- public: \
- typedef CommonNumberParsingTests<TYPE> TestFns; \
- }; \
- TEST_F(ParseNumberTests##SHORT_NAME, RejectBadBases) { \
- TestFns::TestRejectingBadBases(); \
- } \
- TEST_F(ParseNumberTests##SHORT_NAME, ParseNonNegatives) { \
- TestFns::TestParsingNonNegatives(); \
- } \
- TEST_F(ParseNumberTests##SHORT_NAME, ParseNegatives) { \
- TestFns::TestParsingNegatives(); \
- } \
- TEST_F(ParseNumberTests##SHORT_NAME, ParseGarbage) { \
- TestFns::TestParsingGarbage(); \
- } \
- TEST_F(ParseNumberTests##SHORT_NAME, ParseWithExplicitBase) { \
- TestFns::TestParsingWithExplicitBase(); \
- } \
- TEST_F(ParseNumberTests##SHORT_NAME, TestParsingLimits) { \
- TestFns::TestParsingLimits(); \
+ if (Limits::is_signed)
+ ASSERT_EQUALS(ErrorCodes::FailedToParse,
+ parseNumberFromString(std::string(str::stream() << Limits::min() << '0'),
+ &ignored));
}
+};
- GENERAL_NUMBER_TESTS(Short, short)
- GENERAL_NUMBER_TESTS(Int, int)
- GENERAL_NUMBER_TESTS(Long, long)
- GENERAL_NUMBER_TESTS(LongLong, long long)
- GENERAL_NUMBER_TESTS(UnsignedShort, unsigned short)
- GENERAL_NUMBER_TESTS(UnsignedInt, unsigned int)
- GENERAL_NUMBER_TESTS(UnsignedLong, unsigned long)
- GENERAL_NUMBER_TESTS(UnsignedLongLong, unsigned long long)
- GENERAL_NUMBER_TESTS(Int16, int16_t);
- GENERAL_NUMBER_TESTS(Int32, int32_t);
- GENERAL_NUMBER_TESTS(Int64, int64_t);
- GENERAL_NUMBER_TESTS(UInt16, uint16_t);
- GENERAL_NUMBER_TESTS(UInt32, uint32_t);
- GENERAL_NUMBER_TESTS(UInt64, uint64_t);
-
- TEST(ParseNumber, NotNullTerminated) {
- ASSERT_PARSES(int, StringData("1234", 3), 123);
+#define GENERAL_NUMBER_TESTS(SHORT_NAME, TYPE) \
+ class ParseNumberTests##SHORT_NAME : public unittest::Test { \
+ public: \
+ typedef CommonNumberParsingTests<TYPE> TestFns; \
+ }; \
+ TEST_F(ParseNumberTests##SHORT_NAME, RejectBadBases) { \
+ TestFns::TestRejectingBadBases(); \
+ } \
+ TEST_F(ParseNumberTests##SHORT_NAME, ParseNonNegatives) { \
+ TestFns::TestParsingNonNegatives(); \
+ } \
+ TEST_F(ParseNumberTests##SHORT_NAME, ParseNegatives) { \
+ TestFns::TestParsingNegatives(); \
+ } \
+ TEST_F(ParseNumberTests##SHORT_NAME, ParseGarbage) { \
+ TestFns::TestParsingGarbage(); \
+ } \
+ TEST_F(ParseNumberTests##SHORT_NAME, ParseWithExplicitBase) { \
+ TestFns::TestParsingWithExplicitBase(); \
+ } \
+ TEST_F(ParseNumberTests##SHORT_NAME, TestParsingLimits) { \
+ TestFns::TestParsingLimits(); \
}
- TEST(ParseNumber, Int8) {
- int8_t ignored;
- ASSERT_EQUALS(ErrorCodes::FailedToParse,
- parseNumberFromString("-129", &ignored));
- ASSERT_EQUALS(ErrorCodes::FailedToParse,
- parseNumberFromString("-130", &ignored));
- ASSERT_EQUALS(ErrorCodes::FailedToParse,
- parseNumberFromString("-900", &ignored));
- ASSERT_EQUALS(ErrorCodes::FailedToParse,
- parseNumberFromString("128", &ignored));
- ASSERT_EQUALS(ErrorCodes::FailedToParse,
- parseNumberFromString("130", &ignored));
- ASSERT_EQUALS(ErrorCodes::FailedToParse,
- parseNumberFromString("900", &ignored));
+GENERAL_NUMBER_TESTS(Short, short)
+GENERAL_NUMBER_TESTS(Int, int)
+GENERAL_NUMBER_TESTS(Long, long)
+GENERAL_NUMBER_TESTS(LongLong, long long)
+GENERAL_NUMBER_TESTS(UnsignedShort, unsigned short)
+GENERAL_NUMBER_TESTS(UnsignedInt, unsigned int)
+GENERAL_NUMBER_TESTS(UnsignedLong, unsigned long)
+GENERAL_NUMBER_TESTS(UnsignedLongLong, unsigned long long)
+GENERAL_NUMBER_TESTS(Int16, int16_t);
+GENERAL_NUMBER_TESTS(Int32, int32_t);
+GENERAL_NUMBER_TESTS(Int64, int64_t);
+GENERAL_NUMBER_TESTS(UInt16, uint16_t);
+GENERAL_NUMBER_TESTS(UInt32, uint32_t);
+GENERAL_NUMBER_TESTS(UInt64, uint64_t);
- for (int32_t i = -128; i <= 127; ++i)
- ASSERT_PARSES(int8_t, std::string(mongoutils::str::stream() << i), i);
- }
+TEST(ParseNumber, NotNullTerminated) {
+ ASSERT_PARSES(int, StringData("1234", 3), 123);
+}
- TEST(ParseNumber, UInt8) {
- uint8_t ignored;
- ASSERT_EQUALS(ErrorCodes::FailedToParse,
- parseNumberFromString("-129", &ignored));
- ASSERT_EQUALS(ErrorCodes::FailedToParse,
- parseNumberFromString("-130", &ignored));
- ASSERT_EQUALS(ErrorCodes::FailedToParse,
- parseNumberFromString("-900", &ignored));
- ASSERT_EQUALS(ErrorCodes::FailedToParse,
- parseNumberFromString("+256", &ignored));
- ASSERT_EQUALS(ErrorCodes::FailedToParse,
- parseNumberFromString("+900", &ignored));
+TEST(ParseNumber, Int8) {
+ int8_t ignored;
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("-129", &ignored));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("-130", &ignored));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("-900", &ignored));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("128", &ignored));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("130", &ignored));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("900", &ignored));
- for (uint32_t i = 0; i <= 255; ++i)
- ASSERT_PARSES(uint8_t, std::string(mongoutils::str::stream() << i), i);
- }
+ for (int32_t i = -128; i <= 127; ++i)
+ ASSERT_PARSES(int8_t, std::string(mongoutils::str::stream() << i), i);
+}
- TEST(Double, TestRejectingBadBases) {
- double ignored;
+TEST(ParseNumber, UInt8) {
+ uint8_t ignored;
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("-129", &ignored));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("-130", &ignored));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("-900", &ignored));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("+256", &ignored));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("+900", &ignored));
- // Only supported base for parseNumberFromStringWithBase<double> is 0.
- ASSERT_EQUALS(ErrorCodes::BadValue, parseNumberFromStringWithBase("0", -1, &ignored));
- ASSERT_EQUALS(ErrorCodes::BadValue, parseNumberFromStringWithBase("0", 1, &ignored));
- ASSERT_EQUALS(ErrorCodes::BadValue, parseNumberFromStringWithBase("0", 8, &ignored));
- ASSERT_EQUALS(ErrorCodes::BadValue, parseNumberFromStringWithBase("0", 10, &ignored));
- ASSERT_EQUALS(ErrorCodes::BadValue, parseNumberFromStringWithBase("0", 16, &ignored));
- }
+ for (uint32_t i = 0; i <= 255; ++i)
+ ASSERT_PARSES(uint8_t, std::string(mongoutils::str::stream() << i), i);
+}
- TEST(Double, TestParsingGarbage) {
- double d;
- CommonNumberParsingTests<double>::TestParsingGarbage();
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString<double>("1.0.1", &d));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString<double>("1.0-1", &d));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString<double>(" 1.0", &d));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString<double>("1.0P4", &d));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString<double>("1e6 ", &d));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString<double>(" 1e6", &d));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString<double>("1e6 ", &d));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString<double>(" 1e6", &d));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString<double>("0xabcab.defPa", &d));
- ASSERT_EQUALS(ErrorCodes::FailedToParse,
- parseNumberFromString<double>(StringData("1.0\0garbage",
- StringData::LiteralTag()),
- &d));
- }
+TEST(Double, TestRejectingBadBases) {
+ double ignored;
- TEST(Double, TestParsingOverflow) {
- double d;
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("1e309", &d));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("-1e309", &d));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("1e-400", &d));
- ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("-1e-400", &d));
- }
+ // Only supported base for parseNumberFromStringWithBase<double> is 0.
+ ASSERT_EQUALS(ErrorCodes::BadValue, parseNumberFromStringWithBase("0", -1, &ignored));
+ ASSERT_EQUALS(ErrorCodes::BadValue, parseNumberFromStringWithBase("0", 1, &ignored));
+ ASSERT_EQUALS(ErrorCodes::BadValue, parseNumberFromStringWithBase("0", 8, &ignored));
+ ASSERT_EQUALS(ErrorCodes::BadValue, parseNumberFromStringWithBase("0", 10, &ignored));
+ ASSERT_EQUALS(ErrorCodes::BadValue, parseNumberFromStringWithBase("0", 16, &ignored));
+}
- TEST(Double, TestParsingNan) {
- double d = 0;
- ASSERT_OK(parseNumberFromString("NaN", &d));
- ASSERT_TRUE(isNaN(d));
- }
+TEST(Double, TestParsingGarbage) {
+ double d;
+ CommonNumberParsingTests<double>::TestParsingGarbage();
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString<double>("1.0.1", &d));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString<double>("1.0-1", &d));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString<double>(" 1.0", &d));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString<double>("1.0P4", &d));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString<double>("1e6 ", &d));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString<double>(" 1e6", &d));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString<double>("1e6 ", &d));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString<double>(" 1e6", &d));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString<double>("0xabcab.defPa", &d));
+ ASSERT_EQUALS(
+ ErrorCodes::FailedToParse,
+ parseNumberFromString<double>(StringData("1.0\0garbage", StringData::LiteralTag()), &d));
+}
- TEST(Double, TestParsingInfinity) {
- double d = 0;
- ASSERT_OK(parseNumberFromString("infinity", &d));
- ASSERT_TRUE(isInf(d));
- d = 0;
- ASSERT_OK(parseNumberFromString("-Infinity", &d));
- ASSERT_TRUE(isInf(d));
- }
+TEST(Double, TestParsingOverflow) {
+ double d;
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("1e309", &d));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("-1e309", &d));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("1e-400", &d));
+ ASSERT_EQUALS(ErrorCodes::FailedToParse, parseNumberFromString("-1e-400", &d));
+}
- TEST(Double, TestParsingNormal) {
- ASSERT_PARSES(double, "10", 10);
- ASSERT_PARSES(double, "0", 0);
- ASSERT_PARSES(double, "1", 1);
- ASSERT_PARSES(double, "-10", -10);
- ASSERT_PARSES(double, "1e8", 1e8);
- ASSERT_PARSES(double, "1e-8", 1e-8);
- ASSERT_PARSES(double, "12e-8", 12e-8);
- ASSERT_PARSES(double, "-485.381e-8", -485.381e-8);
+TEST(Double, TestParsingNan) {
+ double d = 0;
+ ASSERT_OK(parseNumberFromString("NaN", &d));
+ ASSERT_TRUE(isNaN(d));
+}
+
+TEST(Double, TestParsingInfinity) {
+ double d = 0;
+ ASSERT_OK(parseNumberFromString("infinity", &d));
+ ASSERT_TRUE(isInf(d));
+ d = 0;
+ ASSERT_OK(parseNumberFromString("-Infinity", &d));
+ ASSERT_TRUE(isInf(d));
+}
+
+TEST(Double, TestParsingNormal) {
+ ASSERT_PARSES(double, "10", 10);
+ ASSERT_PARSES(double, "0", 0);
+ ASSERT_PARSES(double, "1", 1);
+ ASSERT_PARSES(double, "-10", -10);
+ ASSERT_PARSES(double, "1e8", 1e8);
+ ASSERT_PARSES(double, "1e-8", 1e-8);
+ ASSERT_PARSES(double, "12e-8", 12e-8);
+ ASSERT_PARSES(double, "-485.381e-8", -485.381e-8);
#if !(defined(_WIN32) || defined(__sunos__))
- // Parse hexadecimal representations of a double. Hex literals not supported by MSVC, and
- // not parseable by the Windows SDK libc or the Solaris libc in the mode we build.
- // See SERVER-14131.
+ // Parse hexadecimal representations of a double. Hex literals not supported by MSVC, and
+ // not parseable by the Windows SDK libc or the Solaris libc in the mode we build.
+ // See SERVER-14131.
- ASSERT_PARSES(double, "0xff", 0xff);
- ASSERT_PARSES(double, "-0xff", -0xff);
- ASSERT_PARSES(double, "0xabcab.defdefP-10", 0xabcab.defdefP-10);
+ ASSERT_PARSES(double, "0xff", 0xff);
+ ASSERT_PARSES(double, "-0xff", -0xff);
+ ASSERT_PARSES(double, "0xabcab.defdefP-10", 0xabcab.defdefP-10);
#endif
- }
+}
} // namespace
} // namespace mongo