diff options
author | Shaun Verch <shaun.verch@10gen.com> | 2013-12-29 10:34:27 -0800 |
---|---|---|
committer | Shaun Verch <shaun.verch@10gen.com> | 2013-12-30 11:10:33 -0800 |
commit | 6486c53c2de908d90f098eb1295a07440a8cc6b0 (patch) | |
tree | ff4ffbd4dc9e1c39de28c4916541884026b4e2c7 | |
parent | 1b599c9f17c6dd10b320e5d642a03604164aec2d (diff) | |
download | mongo-6486c53c2de908d90f098eb1295a07440a8cc6b0.tar.gz |
SERVER-11868 Add tests for numbers that cannot be represented in JSON
-rw-r--r-- | src/mongo/db/jsobj.cpp | 3 | ||||
-rw-r--r-- | src/mongo/dbtests/jsontests.cpp | 30 |
2 files changed, 33 insertions, 0 deletions
diff --git a/src/mongo/db/jsobj.cpp b/src/mongo/db/jsobj.cpp index 5f5d4ce9c5b..1378a9513a8 100644 --- a/src/mongo/db/jsobj.cpp +++ b/src/mongo/db/jsobj.cpp @@ -97,6 +97,9 @@ namespace mongo { s.precision( 16 ); s << number(); } + // This is not valid JSON, but according to RFC-4627, "Numeric values that cannot be + // represented as sequences of digits (such as Infinity and NaN) are not permitted." so + // we are accepting the fact that if we have such values we cannot output valid JSON. else if ( mongo::isNaN(number()) ) { s << "NaN"; } diff --git a/src/mongo/dbtests/jsontests.cpp b/src/mongo/dbtests/jsontests.cpp index d15d2a32c91..22449b988ad 100644 --- a/src/mongo/dbtests/jsontests.cpp +++ b/src/mongo/dbtests/jsontests.cpp @@ -180,6 +180,33 @@ namespace JsonTests { } }; + class NumberDoubleNaN { + public: + void run() { + BSONObjBuilder b; + b.append("a", std::numeric_limits<double>::quiet_NaN()); + ASSERT_EQUALS("{ \"a\" : NaN }", b.done().jsonString(Strict)); + } + }; + + class NumberDoubleInfinity { + public: + void run() { + BSONObjBuilder b; + b.append("a", std::numeric_limits<double>::infinity()); + ASSERT_EQUALS("{ \"a\" : Infinity }", b.done().jsonString(Strict)); + } + }; + + class NumberDoubleNegativeInfinity { + public: + void run() { + BSONObjBuilder b; + b.append("a", -std::numeric_limits<double>::infinity()); + ASSERT_EQUALS("{ \"a\" : -Infinity }", b.done().jsonString(Strict)); + } + }; + class SingleBoolMember { public: void run() { @@ -2592,6 +2619,9 @@ namespace JsonTests { add< JsonStringTests::NumberLongStrict >(); add< JsonStringTests::NumberLongStrictLarge >(); add< JsonStringTests::NumberLongStrictNegative >(); + add< JsonStringTests::NumberDoubleNaN >(); + add< JsonStringTests::NumberDoubleInfinity >(); + add< JsonStringTests::NumberDoubleNegativeInfinity >(); add< JsonStringTests::SingleBoolMember >(); add< JsonStringTests::SingleNullMember >(); add< JsonStringTests::SingleUndefinedMember >(); |