From 71d4b19735aa060b466cee9f01422b68425f07d8 Mon Sep 17 00:00:00 2001 From: Dave Cunningham Date: Thu, 29 Mar 2018 19:38:35 -0400 Subject: [PATCH 1/6] Add Clone() Is() As() testing --- test/json_unittest.cc | 88 +++++++++++++++++++++++++------------------ 1 file changed, 51 insertions(+), 37 deletions(-) diff --git a/test/json_unittest.cc b/test/json_unittest.cc index 6ddd153f..6b73dbc2 100644 --- a/test/json_unittest.cc +++ b/test/json_unittest.cc @@ -7,6 +7,13 @@ namespace { +void ExpectSerializesToSelf(const std::string& json_text) { + json::value v = json::Parser::FromString(json_text); + EXPECT_TOSTRING_EQ(json_text, v); + // May as well test a clone while we're at it. + EXPECT_TOSTRING_EQ(json_text, v->Clone()); +} + void GuardJsonException(std::function test) { try { test(); @@ -21,7 +28,10 @@ void GuardJsonException(std::function test) { TEST(TrivialParseTest, Null) { GuardJsonException([](){ json::value v = json::Parser::FromString("null"); + EXPECT_TRUE(v->Is()); EXPECT_EQ(json::NullType, v->type()); + // Check it does not throw exception. + v->As(); }); } @@ -37,6 +47,8 @@ TEST(TrivialToStringTest, Null) { TEST(TrivialParseTest, True) { GuardJsonException([](){ json::value v = json::Parser::FromString("true"); + EXPECT_TRUE(v->Is()); + EXPECT_EQ(json::BooleanType, v->type()); EXPECT_EQ(true, v->As()->value()); }); } @@ -50,6 +62,8 @@ TEST(TrivialToStringTest, True) { TEST(TrivialParseTest, False) { GuardJsonException([](){ json::value v = json::Parser::FromString("false"); + EXPECT_TRUE(v->Is()); + EXPECT_EQ(json::BooleanType, v->type()); EXPECT_EQ(false, v->As()->value()); }); } @@ -66,6 +80,8 @@ TEST(TrivialToStringTest, False) { TEST(TrivialParseTest, Number) { GuardJsonException([](){ json::value v = json::Parser::FromString("2"); + EXPECT_TRUE(v->Is()); + EXPECT_EQ(json::NumberType, v->type()); EXPECT_EQ(2.0, v->As()->value()); }); } @@ -82,6 +98,8 @@ TEST(TrivialToStringTest, Number) { TEST(TrivialParseTest, StringEmpty) { GuardJsonException([](){ json::value v = json::Parser::FromString("\"\""); + EXPECT_TRUE(v->Is()); + EXPECT_EQ(json::StringType, v->type()); EXPECT_EQ("", v->As()->value()); }); } @@ -112,6 +130,8 @@ TEST(TrivialToStringTest, StringOneChar) { TEST(TrivialParseTest, ArrayEmpty) { GuardJsonException([](){ json::value v = json::Parser::FromString("[]"); + EXPECT_TRUE(v->Is()); + EXPECT_EQ(json::ArrayType, v->type()); EXPECT_TRUE(v->As()->empty()); }); } @@ -143,6 +163,8 @@ TEST(TrivialToStringTest, ArrayOneElement) { TEST(TrivialParseTest, ObjectEmpty) { GuardJsonException([](){ json::value v = json::Parser::FromString("{}"); + EXPECT_TRUE(v->Is()); + EXPECT_EQ(json::ObjectType, v->type()); EXPECT_TRUE(v->As()->empty()); }); } @@ -307,24 +329,26 @@ TEST(EdgeTest, NegativeNumbers) { // Big tests. +const std::string json_text = + "{\n" + " \"foo\": [1.0, 2, 3],\n" + " \"bar\": {\"x\": 0, \"y\": null},\n" + " \"baz\": true,\n" + " \"str\": \"asdfasdf\"\n" + "}\n"; + +const std::string canonical_json_text = + "{" + "\"bar\":{\"x\":0.0,\"y\":null}," + "\"baz\":true," + "\"foo\":[1.0,2.0,3.0]," + "\"str\":\"asdfasdf\"" + "}"; + TEST(BigTest, RealisticParsing) { GuardJsonException([](){ - json::value v = json::Parser::FromString( - "{\n" - " \"foo\": [1, 2, 3],\n" - " \"bar\": {\"x\": 0, \"y\": null},\n" - " \"baz\": true,\n" - " \"str\": \"asdfasdf\"\n" - "}\n" - ); - EXPECT_TOSTRING_EQ( - "{" - "\"bar\":{\"x\":0.0,\"y\":null}," - "\"baz\":true," - "\"foo\":[1.0,2.0,3.0]," - "\"str\":\"asdfasdf\"" - "}", - v); + json::value v = json::Parser::FromString(json_text); + EXPECT_TOSTRING_EQ(canonical_json_text, v); }); } @@ -336,44 +360,34 @@ TEST(BigTest, RealisticConstruction) { {"baz", json::boolean(true)}, {"str", json::string("asdfasdf")}, }); - EXPECT_TOSTRING_EQ( - "{" - "\"bar\":{\"x\":0.0,\"y\":null}," - "\"baz\":true," - "\"foo\":[1.0,2.0,3.0]," - "\"str\":\"asdfasdf\"" - "}", - v); + EXPECT_TOSTRING_EQ(canonical_json_text, v); + }); +} + +TEST(BigTest, Clone) { + GuardJsonException([](){ + json::value v = json::Parser::FromString(json_text); + json::value cloned = v->Clone(); + EXPECT_TOSTRING_EQ(canonical_json_text, cloned); }); } TEST(BigTest, LotsOfArrayNesting) { GuardJsonException([](){ - json::value v = json::Parser::FromString( + ExpectSerializesToSelf( "[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[" "]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]"); - EXPECT_TOSTRING_EQ( - "[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[" - "]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]", - v); }); } TEST(BigTest, LotsOfObjectNesting) { GuardJsonException([](){ - json::value v = json::Parser::FromString( + ExpectSerializesToSelf( "{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":" "{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":" "{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":" "{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":null" "}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}"); - EXPECT_TOSTRING_EQ( - "{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":" - "{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":" - "{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":" - "{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":{\"f\":null" - "}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}", - v); }); } From 34e423f9e8fe9078dd7f2b99a0cdec467b77aad6 Mon Sep 17 00:00:00 2001 From: Dave Cunningham Date: Fri, 30 Mar 2018 13:16:48 -0400 Subject: [PATCH 2/6] Respond to comments --- test/json_unittest.cc | 115 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 102 insertions(+), 13 deletions(-) diff --git a/test/json_unittest.cc b/test/json_unittest.cc index 6b73dbc2..0140d0fa 100644 --- a/test/json_unittest.cc +++ b/test/json_unittest.cc @@ -2,11 +2,15 @@ #include "gtest/gtest.h" #include +#include +#include #define EXPECT_TOSTRING_EQ(s, v) EXPECT_EQ(s, v->ToString()) namespace { +// Verifies that the given json parses, clones, and serializes to its original +// form. void ExpectSerializesToSelf(const std::string& json_text) { json::value v = json::Parser::FromString(json_text); EXPECT_TOSTRING_EQ(json_text, v); @@ -14,6 +18,8 @@ void ExpectSerializesToSelf(const std::string& json_text) { EXPECT_TOSTRING_EQ(json_text, v->Clone()); } +// If an unexpected exception was thrown, this prints the message in the test +// output. Otherwise, the test would fail with a cryptic message. void GuardJsonException(std::function test) { try { test(); @@ -23,6 +29,18 @@ void GuardJsonException(std::function test) { } +// Type values are distinct. + +TEST(Distinct, Types) { + std::vector all_types({ + json::NullType, json::BooleanType, json::NumberType, json::StringType, + json::ArrayType, json::ObjectType + }); + std::set all_types_set(all_types.begin(), all_types.end()); + EXPECT_EQ(all_types.size(), all_types_set.size()); +} + + // Trival null. TEST(TrivialParseTest, Null) { @@ -30,8 +48,12 @@ TEST(TrivialParseTest, Null) { json::value v = json::Parser::FromString("null"); EXPECT_TRUE(v->Is()); EXPECT_EQ(json::NullType, v->type()); - // Check it does not throw exception. - v->As(); + EXPECT_EQ(json::NullType, v->As()->type()); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); }); } @@ -50,6 +72,11 @@ TEST(TrivialParseTest, True) { EXPECT_TRUE(v->Is()); EXPECT_EQ(json::BooleanType, v->type()); EXPECT_EQ(true, v->As()->value()); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); }); } @@ -65,6 +92,11 @@ TEST(TrivialParseTest, False) { EXPECT_TRUE(v->Is()); EXPECT_EQ(json::BooleanType, v->type()); EXPECT_EQ(false, v->As()->value()); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); }); } @@ -83,6 +115,11 @@ TEST(TrivialParseTest, Number) { EXPECT_TRUE(v->Is()); EXPECT_EQ(json::NumberType, v->type()); EXPECT_EQ(2.0, v->As()->value()); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); }); } @@ -101,6 +138,11 @@ TEST(TrivialParseTest, StringEmpty) { EXPECT_TRUE(v->Is()); EXPECT_EQ(json::StringType, v->type()); EXPECT_EQ("", v->As()->value()); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); }); } @@ -115,6 +157,11 @@ TEST(TrivialParseTest, StringOneChar) { json::value v = json::Parser::FromString("\"x\""); const auto& str = v->As(); EXPECT_EQ("x", str->value()); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); }); } @@ -130,9 +177,17 @@ TEST(TrivialToStringTest, StringOneChar) { TEST(TrivialParseTest, ArrayEmpty) { GuardJsonException([](){ json::value v = json::Parser::FromString("[]"); + const auto& arr = v->As(); EXPECT_TRUE(v->Is()); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_EQ(json::ArrayType, v->type()); - EXPECT_TRUE(v->As()->empty()); + EXPECT_TRUE(arr->empty()); + EXPECT_EQ(0, arr->size()); }); } @@ -146,8 +201,16 @@ TEST(TrivialParseTest, ArrayOneElement) { GuardJsonException([](){ json::value v = json::Parser::FromString("[2]"); const auto& arr = v->As(); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + + EXPECT_FALSE(arr->empty()); EXPECT_EQ(1, arr->size()); EXPECT_EQ(2.0, (*arr)[0]->As()->value()); + EXPECT_EQ(2.0, arr->at(0)->As()->value()); }); } @@ -163,9 +226,18 @@ TEST(TrivialToStringTest, ArrayOneElement) { TEST(TrivialParseTest, ObjectEmpty) { GuardJsonException([](){ json::value v = json::Parser::FromString("{}"); + const auto& obj = v->As(); EXPECT_TRUE(v->Is()); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_EQ(json::ObjectType, v->type()); - EXPECT_TRUE(v->As()->empty()); + EXPECT_TRUE(obj->empty()); + EXPECT_THROW(obj->Get("g"), json::Exception); + EXPECT_THROW(obj->at("g"), std::out_of_range); }); } @@ -179,10 +251,20 @@ TEST(TrivialParseTest, ObjectOneField) { GuardJsonException([](){ json::value v = json::Parser::FromString("{\"f\":2}"); const auto& obj = v->As(); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_THROW(v->As(), json::Exception); + EXPECT_EQ(1, obj->size()); - EXPECT_TRUE(v->As()->Has("f")); - EXPECT_FALSE(v->As()->Has("g")); + EXPECT_TRUE(obj->Has("f")); + EXPECT_FALSE(obj->Has("g")); EXPECT_EQ(2.0, obj->Get("f")); + EXPECT_EQ(2.0, obj->at("f")->As()->value()); + EXPECT_THROW(obj->Get("f"), json::Exception); + EXPECT_THROW(obj->Get("g"), json::Exception); + EXPECT_THROW(obj->at("g"), std::out_of_range); }); } @@ -329,7 +411,7 @@ TEST(EdgeTest, NegativeNumbers) { // Big tests. -const std::string json_text = +const char kComplexExample[] = "{\n" " \"foo\": [1.0, 2, 3],\n" " \"bar\": {\"x\": 0, \"y\": null},\n" @@ -337,7 +419,7 @@ const std::string json_text = " \"str\": \"asdfasdf\"\n" "}\n"; -const std::string canonical_json_text = +const char kComplexExampleExpected[] = "{" "\"bar\":{\"x\":0.0,\"y\":null}," "\"baz\":true," @@ -347,8 +429,8 @@ const std::string canonical_json_text = TEST(BigTest, RealisticParsing) { GuardJsonException([](){ - json::value v = json::Parser::FromString(json_text); - EXPECT_TOSTRING_EQ(canonical_json_text, v); + json::value v = json::Parser::FromString(kComplexExample); + EXPECT_TOSTRING_EQ(kComplexExampleExpected, v); }); } @@ -360,15 +442,22 @@ TEST(BigTest, RealisticConstruction) { {"baz", json::boolean(true)}, {"str", json::string("asdfasdf")}, }); - EXPECT_TOSTRING_EQ(canonical_json_text, v); + EXPECT_TOSTRING_EQ( + "{" + "\"bar\":{\"x\":0.0,\"y\":null}," + "\"baz\":true," + "\"foo\":[1.0,2.0,3.0]," + "\"str\":\"asdfasdf\"" + "}", + v); }); } TEST(BigTest, Clone) { GuardJsonException([](){ - json::value v = json::Parser::FromString(json_text); + json::value v = json::Parser::FromString(kComplexExample); json::value cloned = v->Clone(); - EXPECT_TOSTRING_EQ(canonical_json_text, cloned); + EXPECT_TOSTRING_EQ(kComplexExampleExpected, cloned); }); } From 0592ff34d924346feef8e8b14102f66a71b1b8c0 Mon Sep 17 00:00:00 2001 From: Dave Cunningham Date: Fri, 30 Mar 2018 14:40:49 -0400 Subject: [PATCH 3/6] Respond to comments --- test/json_unittest.cc | 127 +++++++++++++++++++++++++++++++++++------- 1 file changed, 107 insertions(+), 20 deletions(-) diff --git a/test/json_unittest.cc b/test/json_unittest.cc index 0140d0fa..0c96e22d 100644 --- a/test/json_unittest.cc +++ b/test/json_unittest.cc @@ -46,14 +46,23 @@ TEST(Distinct, Types) { TEST(TrivialParseTest, Null) { GuardJsonException([](){ json::value v = json::Parser::FromString("null"); - EXPECT_TRUE(v->Is()); EXPECT_EQ(json::NullType, v->type()); - EXPECT_EQ(json::NullType, v->As()->type()); + + EXPECT_TRUE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_FALSE(v->Is()); + + const auto& null_value = v->As(); EXPECT_THROW(v->As(), json::Exception); EXPECT_THROW(v->As(), json::Exception); EXPECT_THROW(v->As(), json::Exception); EXPECT_THROW(v->As(), json::Exception); EXPECT_THROW(v->As(), json::Exception); + + EXPECT_EQ(json::NullType, null_value->type()); }); } @@ -69,14 +78,23 @@ TEST(TrivialToStringTest, Null) { TEST(TrivialParseTest, True) { GuardJsonException([](){ json::value v = json::Parser::FromString("true"); - EXPECT_TRUE(v->Is()); EXPECT_EQ(json::BooleanType, v->type()); - EXPECT_EQ(true, v->As()->value()); + + EXPECT_FALSE(v->Is()); + EXPECT_TRUE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_THROW(v->As(), json::Exception); + const auto& boolean = v->As(); EXPECT_THROW(v->As(), json::Exception); EXPECT_THROW(v->As(), json::Exception); EXPECT_THROW(v->As(), json::Exception); EXPECT_THROW(v->As(), json::Exception); + + EXPECT_EQ(true, boolean->value()); }); } @@ -89,14 +107,23 @@ TEST(TrivialToStringTest, True) { TEST(TrivialParseTest, False) { GuardJsonException([](){ json::value v = json::Parser::FromString("false"); - EXPECT_TRUE(v->Is()); EXPECT_EQ(json::BooleanType, v->type()); - EXPECT_EQ(false, v->As()->value()); + + EXPECT_FALSE(v->Is()); + EXPECT_TRUE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_THROW(v->As(), json::Exception); + const auto& boolean = v->As(); EXPECT_THROW(v->As(), json::Exception); EXPECT_THROW(v->As(), json::Exception); EXPECT_THROW(v->As(), json::Exception); EXPECT_THROW(v->As(), json::Exception); + + EXPECT_EQ(false, boolean->value()); }); } @@ -112,14 +139,23 @@ TEST(TrivialToStringTest, False) { TEST(TrivialParseTest, Number) { GuardJsonException([](){ json::value v = json::Parser::FromString("2"); - EXPECT_TRUE(v->Is()); EXPECT_EQ(json::NumberType, v->type()); - EXPECT_EQ(2.0, v->As()->value()); + + EXPECT_FALSE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_TRUE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_THROW(v->As(), json::Exception); EXPECT_THROW(v->As(), json::Exception); + const auto& num = v->As(); EXPECT_THROW(v->As(), json::Exception); EXPECT_THROW(v->As(), json::Exception); EXPECT_THROW(v->As(), json::Exception); + + EXPECT_EQ(2.0, num->value()); }); } @@ -135,14 +171,23 @@ TEST(TrivialToStringTest, Number) { TEST(TrivialParseTest, StringEmpty) { GuardJsonException([](){ json::value v = json::Parser::FromString("\"\""); - EXPECT_TRUE(v->Is()); EXPECT_EQ(json::StringType, v->type()); - EXPECT_EQ("", v->As()->value()); + + EXPECT_FALSE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_TRUE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_THROW(v->As(), json::Exception); EXPECT_THROW(v->As(), json::Exception); EXPECT_THROW(v->As(), json::Exception); + const auto& str = v->As(); EXPECT_THROW(v->As(), json::Exception); EXPECT_THROW(v->As(), json::Exception); + + EXPECT_EQ("", str->value()); }); } @@ -155,13 +200,23 @@ TEST(TrivialToStringTest, StringEmpty) { TEST(TrivialParseTest, StringOneChar) { GuardJsonException([](){ json::value v = json::Parser::FromString("\"x\""); - const auto& str = v->As(); - EXPECT_EQ("x", str->value()); + EXPECT_EQ(json::StringType, v->type()); + + EXPECT_FALSE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_TRUE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_THROW(v->As(), json::Exception); EXPECT_THROW(v->As(), json::Exception); EXPECT_THROW(v->As(), json::Exception); + const auto& str = v->As(); EXPECT_THROW(v->As(), json::Exception); EXPECT_THROW(v->As(), json::Exception); + + EXPECT_EQ("x", str->value()); }); } @@ -177,15 +232,22 @@ TEST(TrivialToStringTest, StringOneChar) { TEST(TrivialParseTest, ArrayEmpty) { GuardJsonException([](){ json::value v = json::Parser::FromString("[]"); - const auto& arr = v->As(); + EXPECT_EQ(json::ArrayType, v->type()); + + EXPECT_FALSE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_FALSE(v->Is()); EXPECT_TRUE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_THROW(v->As(), json::Exception); EXPECT_THROW(v->As(), json::Exception); EXPECT_THROW(v->As(), json::Exception); EXPECT_THROW(v->As(), json::Exception); + const auto& arr = v->As(); EXPECT_THROW(v->As(), json::Exception); - EXPECT_EQ(json::ArrayType, v->type()); EXPECT_TRUE(arr->empty()); EXPECT_EQ(0, arr->size()); }); @@ -200,11 +262,20 @@ TEST(TrivialToStringTest, ArrayEmpty) { TEST(TrivialParseTest, ArrayOneElement) { GuardJsonException([](){ json::value v = json::Parser::FromString("[2]"); - const auto& arr = v->As(); + EXPECT_EQ(json::ArrayType, v->type()); + + EXPECT_FALSE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_TRUE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_THROW(v->As(), json::Exception); EXPECT_THROW(v->As(), json::Exception); EXPECT_THROW(v->As(), json::Exception); EXPECT_THROW(v->As(), json::Exception); + const auto& arr = v->As(); EXPECT_THROW(v->As(), json::Exception); EXPECT_FALSE(arr->empty()); @@ -226,15 +297,22 @@ TEST(TrivialToStringTest, ArrayOneElement) { TEST(TrivialParseTest, ObjectEmpty) { GuardJsonException([](){ json::value v = json::Parser::FromString("{}"); - const auto& obj = v->As(); + EXPECT_EQ(json::ObjectType, v->type()); + + EXPECT_FALSE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_FALSE(v->Is()); EXPECT_TRUE(v->Is()); + EXPECT_THROW(v->As(), json::Exception); EXPECT_THROW(v->As(), json::Exception); EXPECT_THROW(v->As(), json::Exception); EXPECT_THROW(v->As(), json::Exception); EXPECT_THROW(v->As(), json::Exception); + const auto& obj = v->As(); - EXPECT_EQ(json::ObjectType, v->type()); EXPECT_TRUE(obj->empty()); EXPECT_THROW(obj->Get("g"), json::Exception); EXPECT_THROW(obj->at("g"), std::out_of_range); @@ -250,12 +328,21 @@ TEST(TrivialToStringTest, ObjectEmpty) { TEST(TrivialParseTest, ObjectOneField) { GuardJsonException([](){ json::value v = json::Parser::FromString("{\"f\":2}"); - const auto& obj = v->As(); + EXPECT_EQ(json::ObjectType, v->type()); + + EXPECT_FALSE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_FALSE(v->Is()); + EXPECT_TRUE(v->Is()); + EXPECT_THROW(v->As(), json::Exception); EXPECT_THROW(v->As(), json::Exception); EXPECT_THROW(v->As(), json::Exception); EXPECT_THROW(v->As(), json::Exception); EXPECT_THROW(v->As(), json::Exception); + const auto& obj = v->As(); EXPECT_EQ(1, obj->size()); EXPECT_TRUE(obj->Has("f")); @@ -411,7 +498,7 @@ TEST(EdgeTest, NegativeNumbers) { // Big tests. -const char kComplexExample[] = +constexpr char kComplexExample[] = "{\n" " \"foo\": [1.0, 2, 3],\n" " \"bar\": {\"x\": 0, \"y\": null},\n" @@ -419,7 +506,7 @@ const char kComplexExample[] = " \"str\": \"asdfasdf\"\n" "}\n"; -const char kComplexExampleExpected[] = +constexpr char kComplexExampleExpected[] = "{" "\"bar\":{\"x\":0.0,\"y\":null}," "\"baz\":true," From 60c6b30fb2141ce5674fe917ad6b761b2270c563 Mon Sep 17 00:00:00 2001 From: Dave Cunningham Date: Fri, 30 Mar 2018 14:57:02 -0400 Subject: [PATCH 4/6] Respond to comments --- test/json_unittest.cc | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/test/json_unittest.cc b/test/json_unittest.cc index 0c96e22d..8c450dfa 100644 --- a/test/json_unittest.cc +++ b/test/json_unittest.cc @@ -2,7 +2,7 @@ #include "gtest/gtest.h" #include -#include +#include #include #define EXPECT_TOSTRING_EQ(s, v) EXPECT_EQ(s, v->ToString()) @@ -346,10 +346,15 @@ TEST(TrivialParseTest, ObjectOneField) { EXPECT_EQ(1, obj->size()); EXPECT_TRUE(obj->Has("f")); - EXPECT_FALSE(obj->Has("g")); + EXPECT_THROW(obj->Get("f"), json::Exception); + EXPECT_THROW(obj->Get("f"), json::Exception); EXPECT_EQ(2.0, obj->Get("f")); - EXPECT_EQ(2.0, obj->at("f")->As()->value()); EXPECT_THROW(obj->Get("f"), json::Exception); + EXPECT_THROW(obj->Get("f"), json::Exception); + EXPECT_THROW(obj->Get("f"), json::Exception); + EXPECT_EQ(2.0, obj->at("f")->As()->value()); + + EXPECT_FALSE(obj->Has("g")); EXPECT_THROW(obj->Get("g"), json::Exception); EXPECT_THROW(obj->at("g"), std::out_of_range); }); From 6f155c79350226cb21a793545883a6b9865a8b02 Mon Sep 17 00:00:00 2001 From: Dave Cunningham Date: Fri, 30 Mar 2018 17:48:33 -0400 Subject: [PATCH 5/6] Add const to constexpr --- test/json_unittest.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/json_unittest.cc b/test/json_unittest.cc index 8c450dfa..3265ac7f 100644 --- a/test/json_unittest.cc +++ b/test/json_unittest.cc @@ -503,7 +503,7 @@ TEST(EdgeTest, NegativeNumbers) { // Big tests. -constexpr char kComplexExample[] = +constexpr const char kComplexExample[] = "{\n" " \"foo\": [1.0, 2, 3],\n" " \"bar\": {\"x\": 0, \"y\": null},\n" @@ -511,7 +511,7 @@ constexpr char kComplexExample[] = " \"str\": \"asdfasdf\"\n" "}\n"; -constexpr char kComplexExampleExpected[] = +constexpr const char kComplexExampleExpected[] = "{" "\"bar\":{\"x\":0.0,\"y\":null}," "\"baz\":true," From b5f0e5b17e952f1448ca3e654a30f0c073d1a03f Mon Sep 17 00:00:00 2001 From: Igor Peshansky Date: Sat, 31 Mar 2018 01:32:56 -0400 Subject: [PATCH 6/6] Whitespace fixes. --- test/json_unittest.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/json_unittest.cc b/test/json_unittest.cc index 3265ac7f..4b366ec1 100644 --- a/test/json_unittest.cc +++ b/test/json_unittest.cc @@ -12,10 +12,10 @@ namespace { // Verifies that the given json parses, clones, and serializes to its original // form. void ExpectSerializesToSelf(const std::string& json_text) { - json::value v = json::Parser::FromString(json_text); - EXPECT_TOSTRING_EQ(json_text, v); - // May as well test a clone while we're at it. - EXPECT_TOSTRING_EQ(json_text, v->Clone()); + json::value v = json::Parser::FromString(json_text); + EXPECT_TOSTRING_EQ(json_text, v); + // May as well test a clone while we're at it. + EXPECT_TOSTRING_EQ(json_text, v->Clone()); } // If an unexpected exception was thrown, this prints the message in the test