From ad1ff1daa18e059a8e92181d2ec436d79836c99f Mon Sep 17 00:00:00 2001 From: Tor Egge Date: Fri, 8 Mar 2024 13:29:20 +0100 Subject: Rewrite json unit test to gtest. --- vespalib/src/tests/json/CMakeLists.txt | 1 + vespalib/src/tests/json/json.cpp | 179 +++++++++++++-------------------- 2 files changed, 71 insertions(+), 109 deletions(-) diff --git a/vespalib/src/tests/json/CMakeLists.txt b/vespalib/src/tests/json/CMakeLists.txt index 720f8e3a040..89471e18d74 100644 --- a/vespalib/src/tests/json/CMakeLists.txt +++ b/vespalib/src/tests/json/CMakeLists.txt @@ -4,5 +4,6 @@ vespa_add_executable(vespalib_json_test_app TEST json.cpp DEPENDS vespalib + GTest::gtest ) vespa_add_test(NAME vespalib_json_test_app COMMAND vespalib_json_test_app boost) diff --git a/vespalib/src/tests/json/json.cpp b/vespalib/src/tests/json/json.cpp index 2638c6638c3..024d9045cc1 100644 --- a/vespalib/src/tests/json/json.cpp +++ b/vespalib/src/tests/json/json.cpp @@ -1,124 +1,108 @@ // Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -#include +#include #include #include #include using namespace vespalib; -class JSONTest : public vespalib::TestApp -{ -private: - void testJSONWriterValues(); - void testJSONWriterObject(); - void testJSONWriterArray(); - void testJSONWriterComplex(); - void testJsonStream(); - void testJsonStreamErrors(); - void testJsonStreamStateReporting(); - -public: - int Main() override; -}; -void -JSONTest::testJSONWriterValues() +TEST(JSONTest, test_json_writer_values) { JSONStringer js; { // bool js.appendBool(true); - EXPECT_EQUAL(js.toString(), "true"); + EXPECT_EQ(js.toString(), "true"); js.clear().appendBool(false); - EXPECT_EQUAL(js.toString(), "false"); + EXPECT_EQ(js.toString(), "false"); } { // double js.clear().appendDouble(1234.5678); - EXPECT_EQUAL(js.toString(), "1234.5678"); + EXPECT_EQ(js.toString(), "1234.5678"); js.clear().appendDouble(-1234.5678); - EXPECT_EQUAL(js.toString(), "-1234.5678"); + EXPECT_EQ(js.toString(), "-1234.5678"); js.clear().appendDouble(0.0); - EXPECT_EQUAL(js.toString(), "0.0"); + EXPECT_EQ(js.toString(), "0.0"); js.clear().appendDouble(0.00000000012345678912356789123456789); - EXPECT_EQUAL(js.toString(), "1.234567891235679e-10"); + EXPECT_EQ(js.toString(), "1.234567891235679e-10"); js.clear().appendDouble(std::numeric_limits::max()); - EXPECT_EQUAL(js.toString(), "1.797693134862316e+308"); + EXPECT_EQ(js.toString(), "1.797693134862316e+308"); js.clear().appendDouble(std::numeric_limits::min()); - EXPECT_EQUAL(js.toString(), "2.225073858507201e-308"); + EXPECT_EQ(js.toString(), "2.225073858507201e-308"); js.clear().appendDouble(1.0 * (uint64_t(1) << 53)); - EXPECT_EQUAL(js.toString(), "9007199254740992.0"); + EXPECT_EQ(js.toString(), "9007199254740992.0"); js.clear().appendDouble(1000); - EXPECT_EQUAL(js.toString(), "1000.0"); + EXPECT_EQ(js.toString(), "1000.0"); } { // float js.clear().appendFloat(1234.5678f); - EXPECT_EQUAL(js.toString(), "1234.5677"); + EXPECT_EQ(js.toString(), "1234.5677"); js.clear().appendFloat(-1234.5678f); - EXPECT_EQUAL(js.toString(), "-1234.5677"); + EXPECT_EQ(js.toString(), "-1234.5677"); js.clear().appendFloat(0.0f); - EXPECT_EQUAL(js.toString(), "0.0"); + EXPECT_EQ(js.toString(), "0.0"); js.clear().appendFloat(0.00000000012345678912356789123456789f); - EXPECT_EQUAL(js.toString(), "1.2345679e-10"); + EXPECT_EQ(js.toString(), "1.2345679e-10"); js.clear().appendFloat(std::numeric_limits::max()); - EXPECT_EQUAL(js.toString(), "3.4028235e+38"); + EXPECT_EQ(js.toString(), "3.4028235e+38"); js.clear().appendFloat(std::numeric_limits::min()); - EXPECT_EQUAL(js.toString(), "1.1754944e-38"); + EXPECT_EQ(js.toString(), "1.1754944e-38"); js.clear().appendFloat(1.0 * (uint64_t(1) << 24)); - EXPECT_EQUAL(js.toString(), "16777216.0"); + EXPECT_EQ(js.toString(), "16777216.0"); js.clear().appendFloat(1000); - EXPECT_EQUAL(js.toString(), "1000.0"); + EXPECT_EQ(js.toString(), "1000.0"); } { // long js.clear().appendInt64(4294967296ll); - EXPECT_EQUAL(js.toString(), "4294967296"); + EXPECT_EQ(js.toString(), "4294967296"); js.clear().appendInt64(-4294967296ll); - EXPECT_EQUAL(js.toString(), "-4294967296"); + EXPECT_EQ(js.toString(), "-4294967296"); } { // string js.clear().appendString("string"); - EXPECT_EQUAL(js.toString(), "\"string\""); + EXPECT_EQ(js.toString(), "\"string\""); } { // NULL js.clear().appendNull(); - EXPECT_EQUAL(js.toString(), "null"); + EXPECT_EQ(js.toString(), "null"); } { // quote js.clear().appendString("x\"y"); - EXPECT_EQUAL(js.toString(), "\"x\\\"y\""); + EXPECT_EQ(js.toString(), "\"x\\\"y\""); js.clear().appendString("x\\y"); - EXPECT_EQUAL(js.toString(), "\"x\\\\y\""); + EXPECT_EQ(js.toString(), "\"x\\\\y\""); js.clear().appendString("x/y"); - EXPECT_EQUAL(js.toString(), "\"x/y\""); + EXPECT_EQ(js.toString(), "\"x/y\""); js.clear().appendString("x\by"); - EXPECT_EQUAL(js.toString(), "\"x\\by\""); + EXPECT_EQ(js.toString(), "\"x\\by\""); js.clear().appendString("x\fy"); - EXPECT_EQUAL(js.toString(), "\"x\\fy\""); + EXPECT_EQ(js.toString(), "\"x\\fy\""); js.clear().appendString("x\ny"); - EXPECT_EQUAL(js.toString(), "\"x\\ny\""); + EXPECT_EQ(js.toString(), "\"x\\ny\""); js.clear().appendString("x\ry"); - EXPECT_EQUAL(js.toString(), "\"x\\ry\""); + EXPECT_EQ(js.toString(), "\"x\\ry\""); js.clear().appendString("x\ty"); - EXPECT_EQUAL(js.toString(), "\"x\\ty\""); + EXPECT_EQ(js.toString(), "\"x\\ty\""); } } -void -JSONTest::testJSONWriterObject() +TEST(JSONTest, test_json_writer_object) { JSONStringer js; { // single pair js.beginObject().appendKey("k1").appendInt64(1l).endObject(); - EXPECT_EQUAL(js.toString(), "{\"k1\":1}"); + EXPECT_EQ(js.toString(), "{\"k1\":1}"); } { // multiple pairs js.clear().beginObject().appendKey("k1").appendInt64(1l).appendKey("k2").appendInt64(2l).endObject(); - EXPECT_EQUAL(js.toString(), "{\"k1\":1,\"k2\":2}"); + EXPECT_EQ(js.toString(), "{\"k1\":1,\"k2\":2}"); } { // object in object js.clear().beginObject().appendKey("k1").beginObject().appendKey("k1.1").appendInt64(11l).endObject().endObject(); - EXPECT_EQUAL(js.toString(), "{\"k1\":{\"k1.1\":11}}"); + EXPECT_EQ(js.toString(), "{\"k1\":{\"k1.1\":11}}"); } { // object in object (multiple pairs) js.clear().beginObject(). @@ -133,65 +117,61 @@ JSONTest::testJSONWriterObject() appendKey("k2.2").appendInt64(22l). endObject(). endObject(); - EXPECT_EQUAL(js.toString(), "{\"k1\":{\"k1.1\":11,\"k1.2\":12},\"k2\":{\"k2.1\":21,\"k2.2\":22}}"); + EXPECT_EQ(js.toString(), "{\"k1\":{\"k1.1\":11,\"k1.2\":12},\"k2\":{\"k2.1\":21,\"k2.2\":22}}"); } { // array in object js.clear().beginObject().appendKey("k1"). beginArray().appendInt64(1l).appendInt64(2l).endArray().endObject(); - EXPECT_EQUAL(js.toString(), "{\"k1\":[1,2]}"); + EXPECT_EQ(js.toString(), "{\"k1\":[1,2]}"); } { // array in object (multiple pairs) js.clear().beginObject(). appendKey("k1").beginArray().appendInt64(1l).appendInt64(2l).endArray(). appendKey("k2").beginArray().appendInt64(3l).appendInt64(4l).endArray(). endObject(); - EXPECT_EQUAL(js.toString(), "{\"k1\":[1,2],\"k2\":[3,4]}"); + EXPECT_EQ(js.toString(), "{\"k1\":[1,2],\"k2\":[3,4]}"); } } - -void -JSONTest::testJSONWriterArray() +TEST(JSONTest, test_json_writer_array) { JSONStringer js; { // single element js.beginArray().appendInt64(1l).endArray(); - EXPECT_EQUAL(js.toString(), "[1]"); + EXPECT_EQ(js.toString(), "[1]"); } { // multiple elements js.clear().beginArray().appendInt64(1l).appendInt64(2l).endArray(); - EXPECT_EQUAL(js.toString(), "[1,2]"); + EXPECT_EQ(js.toString(), "[1,2]"); } { // array in array js.clear().beginArray().beginArray().appendInt64(1l).endArray().endArray(); - EXPECT_EQUAL(js.toString(), "[[1]]"); + EXPECT_EQ(js.toString(), "[[1]]"); } { // array in array (multiple elements) js.clear().beginArray(). beginArray().appendInt64(1l).appendInt64(2l).endArray(). beginArray().appendInt64(3l).appendInt64(4l).endArray(). endArray(); - EXPECT_EQUAL(js.toString(), "[[1,2],[3,4]]"); + EXPECT_EQ(js.toString(), "[[1,2],[3,4]]"); } { // object in array js.clear().beginArray(). beginObject().appendKey("k1").appendInt64(1l).endObject(). endArray(); - EXPECT_EQUAL(js.toString(), "[{\"k1\":1}]"); + EXPECT_EQ(js.toString(), "[{\"k1\":1}]"); } { // object in array (multiple elements) js.clear().beginArray(). beginObject().appendKey("k1").appendInt64(1l).appendKey("k2").appendInt64(2l).endObject(). beginObject().appendKey("k3").appendInt64(3l).appendKey("k4").appendInt64(4l).endObject(). endArray(); - EXPECT_EQUAL(js.toString(), "[{\"k1\":1,\"k2\":2},{\"k3\":3,\"k4\":4}]"); + EXPECT_EQ(js.toString(), "[{\"k1\":1,\"k2\":2},{\"k3\":3,\"k4\":4}]"); } } - -void -JSONTest::testJSONWriterComplex() +TEST(JSONTest, test_json_writer_complex) { JSONStringer js; @@ -269,7 +249,7 @@ JSONTest::testJSONWriterComplex() js.endArray(); } js.endObject(); - EXPECT_EQUAL(js.toString(), "{\"k1\":{\"k1.1\":1,\"k1.2\":[2,3]},\"k2\":{\"k2.1\":{\"k2.1.1\":4,\"k2.1.2\":[5,6]}},\"k3\":[{\"k3.1\":7,\"k3.2\":[8,9]},{\"k3.1\":10,\"k3.2\":[11,12]}]}"); + EXPECT_EQ(js.toString(), "{\"k1\":{\"k1.1\":1,\"k1.2\":[2,3]},\"k2\":{\"k2.1\":{\"k2.1.1\":4,\"k2.1.2\":[5,6]}},\"k3\":[{\"k3.1\":7,\"k3.2\":[8,9]},{\"k3.1\":10,\"k3.2\":[11,12]}]}"); } namespace { @@ -304,19 +284,17 @@ namespace { }; } -void -JSONTest::testJsonStream() +TEST(JSONTest, test_json_stream) { vespalib::asciistream as; vespalib::JsonStream stream(as); Builder b; b.build(stream); stream.finalize(); - EXPECT_EQUAL(as.str(), "{\"k1\":{\"k1.1\":1,\"k1.2\":[2,3]},\"k2\":{\"k2.1\":{\"k2.1.1\":4,\"k2.1.2\":[5,6]}},\"k3\":[{\"k3.1\":-7,\"k3.2\":[-8,-9]},{\"k3.1\":10,\"k3.2\":[11,12]}]}"); + EXPECT_EQ(as.str(), "{\"k1\":{\"k1.1\":1,\"k1.2\":[2,3]},\"k2\":{\"k2.1\":{\"k2.1.1\":4,\"k2.1.2\":[5,6]}},\"k3\":[{\"k3.1\":-7,\"k3.2\":[-8,-9]},{\"k3.1\":10,\"k3.2\":[11,12]}]}"); } -void -JSONTest::testJsonStreamErrors() +TEST(JSONTest, test_json_stream_errors) { using namespace vespalib::jsonstream; // Unsupported object keys @@ -325,42 +303,42 @@ JSONTest::testJsonStreamErrors() vespalib::JsonStream stream(as); stream << Object() << Object(); } catch (vespalib::JsonStreamException& e) { - EXPECT_EQUAL("Invalid state on call: An object value cannot be an object key ({}(ObjectExpectingKey))", e.getReason()); + EXPECT_EQ("Invalid state on call: An object value cannot be an object key ({}(ObjectExpectingKey))", e.getReason()); } try{ vespalib::asciistream as; vespalib::JsonStream stream(as); stream << Object() << true; } catch (vespalib::JsonStreamException& e) { - EXPECT_EQUAL("Invalid state on call: A bool value cannot be an object key ({}(ObjectExpectingKey))", e.getReason()); + EXPECT_EQ("Invalid state on call: A bool value cannot be an object key ({}(ObjectExpectingKey))", e.getReason()); } try{ vespalib::asciistream as; vespalib::JsonStream stream(as); stream << Object() << 13; } catch (vespalib::JsonStreamException& e) { - EXPECT_EQUAL("Invalid state on call: An int64_t value cannot be an object key ({}(ObjectExpectingKey))", e.getReason()); + EXPECT_EQ("Invalid state on call: An int64_t value cannot be an object key ({}(ObjectExpectingKey))", e.getReason()); } try{ vespalib::asciistream as; vespalib::JsonStream stream(as); stream << Object() << uint64_t(13); } catch (vespalib::JsonStreamException& e) { - EXPECT_EQUAL("Invalid state on call: A uint64_t value cannot be an object key ({}(ObjectExpectingKey))", e.getReason()); + EXPECT_EQ("Invalid state on call: A uint64_t value cannot be an object key ({}(ObjectExpectingKey))", e.getReason()); } try{ vespalib::asciistream as; vespalib::JsonStream stream(as); stream << Object() << 0.5; } catch (vespalib::JsonStreamException& e) { - EXPECT_EQUAL("Invalid state on call: A double value cannot be an object key ({}(ObjectExpectingKey))", e.getReason()); + EXPECT_EQ("Invalid state on call: A double value cannot be an object key ({}(ObjectExpectingKey))", e.getReason()); } try{ vespalib::asciistream as; vespalib::JsonStream stream(as); stream << Object() << jsonstream::Array(); } catch (vespalib::JsonStreamException& e) { - EXPECT_EQUAL("Invalid state on call: An array value cannot be an object key ({}(ObjectExpectingKey))", e.getReason()); + EXPECT_EQ("Invalid state on call: An array value cannot be an object key ({}(ObjectExpectingKey))", e.getReason()); } // Invalid points to add End() try{ @@ -368,14 +346,14 @@ JSONTest::testJsonStreamErrors() vespalib::JsonStream stream(as); stream << Object() << "foo" << End(); } catch (vespalib::JsonStreamException& e) { - EXPECT_EQUAL("Invalid state on call: Object got key but not value. Cannot end it now ({foo}(ObjectExpectingValue))", e.getReason()); + EXPECT_EQ("Invalid state on call: Object got key but not value. Cannot end it now ({foo}(ObjectExpectingValue))", e.getReason()); } try{ vespalib::asciistream as; vespalib::JsonStream stream(as); stream << End(); } catch (vespalib::JsonStreamException& e) { - EXPECT_EQUAL("Invalid state on call: No tag to end. At root ((RootExpectingArrayOrObjectStart))", e.getReason()); + EXPECT_EQ("Invalid state on call: No tag to end. At root ((RootExpectingArrayOrObjectStart))", e.getReason()); } // Adding to finalized stream try{ @@ -383,61 +361,60 @@ JSONTest::testJsonStreamErrors() vespalib::JsonStream stream(as); stream << Object() << End() << "foo"; } catch (vespalib::JsonStreamException& e) { - EXPECT_EQUAL("Invalid state on call: Stream already finalized. Can't add a string value. (Finalized)", e.getReason()); + EXPECT_EQ("Invalid state on call: Stream already finalized. Can't add a string value. (Finalized)", e.getReason()); } try{ vespalib::asciistream as; vespalib::JsonStream stream(as); stream << Object() << End() << false; } catch (vespalib::JsonStreamException& e) { - EXPECT_EQUAL("Invalid state on call: Stream already finalized. Can't add a bool value. (Finalized)", e.getReason()); + EXPECT_EQ("Invalid state on call: Stream already finalized. Can't add a bool value. (Finalized)", e.getReason()); } try{ vespalib::asciistream as; vespalib::JsonStream stream(as); stream << Object() << End() << 13; } catch (vespalib::JsonStreamException& e) { - EXPECT_EQUAL("Invalid state on call: Stream already finalized. Can't add a long long value. (Finalized)", e.getReason()); + EXPECT_EQ("Invalid state on call: Stream already finalized. Can't add a long long value. (Finalized)", e.getReason()); } try{ vespalib::asciistream as; vespalib::JsonStream stream(as); stream << Object() << End() << 13u; } catch (vespalib::JsonStreamException& e) { - EXPECT_EQUAL("Invalid state on call: Stream already finalized. Can't add an unsigned long long value. (Finalized)", e.getReason()); + EXPECT_EQ("Invalid state on call: Stream already finalized. Can't add an unsigned long long value. (Finalized)", e.getReason()); } try{ vespalib::asciistream as; vespalib::JsonStream stream(as); stream << Object() << End() << 0.2; } catch (vespalib::JsonStreamException& e) { - EXPECT_EQUAL("Invalid state on call: Stream already finalized. Can't add a double value. (Finalized)", e.getReason()); + EXPECT_EQ("Invalid state on call: Stream already finalized. Can't add a double value. (Finalized)", e.getReason()); } try{ vespalib::asciistream as; vespalib::JsonStream stream(as); stream << Object() << End() << Object(); } catch (vespalib::JsonStreamException& e) { - EXPECT_EQUAL("Invalid state on call: Stream already finalized. Can't start a new object. (Finalized)", e.getReason()); + EXPECT_EQ("Invalid state on call: Stream already finalized. Can't start a new object. (Finalized)", e.getReason()); } try{ vespalib::asciistream as; vespalib::JsonStream stream(as); stream << Object() << End() << jsonstream::Array(); } catch (vespalib::JsonStreamException& e) { - EXPECT_EQUAL("Invalid state on call: Stream already finalized. Can't start a new array. (Finalized)", e.getReason()); + EXPECT_EQ("Invalid state on call: Stream already finalized. Can't start a new array. (Finalized)", e.getReason()); } try{ vespalib::asciistream as; vespalib::JsonStream stream(as); stream << Object() << End() << End(); } catch (vespalib::JsonStreamException& e) { - EXPECT_EQUAL("Invalid state on call: Stream already finalized. Can't end it. (Finalized)", e.getReason()); + EXPECT_EQ("Invalid state on call: Stream already finalized. Can't end it. (Finalized)", e.getReason()); } } -void -JSONTest::testJsonStreamStateReporting() +TEST(JSONTest, test_json_stream_state_reporting) { using namespace vespalib::jsonstream; vespalib::asciistream as; @@ -447,24 +424,8 @@ JSONTest::testJsonStreamStateReporting() << Object() << "key" << "value" << End() << false << End(); - EXPECT_EQUAL("Current: Finalized", stream.getJsonStreamState()); -} - -int -JSONTest::Main() -{ - TEST_INIT("json_test"); - - testJSONWriterValues(); - testJSONWriterObject(); - testJSONWriterArray(); - testJSONWriterComplex(); - testJsonStream(); - testJsonStreamErrors(); - testJsonStreamStateReporting(); - - TEST_DONE(); + EXPECT_EQ("Current: Finalized", stream.getJsonStreamState()); } -TEST_APPHOOK(JSONTest); +GTEST_MAIN_RUN_ALL_TESTS() -- cgit v1.2.3