Path: blob/master/Utilities/cmcppdap/src/json_serializer_test.cpp
3153 views
// Copyright 2019 Google LLC1//2// Licensed under the Apache License, Version 2.0 (the "License");3// you may not use this file except in compliance with the License.4// You may obtain a copy of the License at5//6// https://www.apache.org/licenses/LICENSE-2.07//8// Unless required by applicable law or agreed to in writing, software9// distributed under the License is distributed on an "AS IS" BASIS,10// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.11// See the License for the specific language governing permissions and12// limitations under the License.1314#include "json_serializer.h"1516#include "dap/typeinfo.h"17#include "dap/typeof.h"1819#include "gmock/gmock.h"20#include "gtest/gtest.h"2122namespace dap {2324struct JSONInnerTestObject {25integer i;26};2728DAP_STRUCT_TYPEINFO(JSONInnerTestObject,29"json-inner-test-object",30DAP_FIELD(i, "i"));3132struct JSONTestObject {33boolean b;34integer i;35number n;36array<integer> a;37object o;38string s;39optional<integer> o1;40optional<integer> o2;41JSONInnerTestObject inner;42};4344DAP_STRUCT_TYPEINFO(JSONTestObject,45"json-test-object",46DAP_FIELD(b, "b"),47DAP_FIELD(i, "i"),48DAP_FIELD(n, "n"),49DAP_FIELD(a, "a"),50DAP_FIELD(o, "o"),51DAP_FIELD(s, "s"),52DAP_FIELD(o1, "o1"),53DAP_FIELD(o2, "o2"),54DAP_FIELD(inner, "inner"));5556struct JSONObjectNoFields {};5758DAP_STRUCT_TYPEINFO(JSONObjectNoFields, "json-object-no-fields");5960struct SimpleJSONTestObject {61boolean b;62integer i;63};64DAP_STRUCT_TYPEINFO(SimpleJSONTestObject,65"simple-json-test-object",66DAP_FIELD(b, "b"),67DAP_FIELD(i, "i"));6869} // namespace dap7071class JSONSerializer : public testing::Test {72protected:73static dap::object GetSimpleObject() {74return dap::object({{"one", dap::integer(1)},75{"two", dap::number(2)},76{"three", dap::string("three")},77{"four", dap::boolean(true)}});78}79void TEST_SIMPLE_OBJECT(const dap::object& obj) {80NESTED_TEST_FAILED = true;81auto ref_obj = GetSimpleObject();82ASSERT_EQ(obj.size(), ref_obj.size());83ASSERT_TRUE(obj.at("one").is<dap::integer>());84ASSERT_TRUE(obj.at("two").is<dap::number>());85ASSERT_TRUE(obj.at("three").is<dap::string>());86ASSERT_TRUE(obj.at("four").is<dap::boolean>());8788ASSERT_EQ(ref_obj.at("one").get<dap::integer>(),89obj.at("one").get<dap::integer>());90ASSERT_EQ(ref_obj.at("two").get<dap::number>(),91obj.at("two").get<dap::number>());92ASSERT_EQ(ref_obj.at("three").get<dap::string>(),93obj.at("three").get<dap::string>());94ASSERT_EQ(ref_obj.at("four").get<dap::boolean>(),95obj.at("four").get<dap::boolean>());96NESTED_TEST_FAILED = false;97}98template <typename T>99void TEST_SERIALIZING_DESERIALIZING(const T& encoded, T& decoded) {100NESTED_TEST_FAILED = true;101dap::json::Serializer s;102ASSERT_TRUE(s.serialize(encoded));103dap::json::Deserializer d(s.dump());104ASSERT_TRUE(d.deserialize(&decoded));105NESTED_TEST_FAILED = false;106}107bool NESTED_TEST_FAILED = false;108#define _ASSERT_PASS(NESTED_TEST) \109NESTED_TEST; \110ASSERT_FALSE(NESTED_TEST_FAILED);111};112113TEST_F(JSONSerializer, SerializeDeserialize) {114dap::JSONTestObject encoded;115encoded.b = true;116encoded.i = 32;117encoded.n = 123.456;118encoded.a = {2, 4, 6, 8, 0x100000000, -2, -4, -6, -8, -0x100000000};119encoded.o["one"] = dap::integer(1);120encoded.o["two"] = dap::number(2);121encoded.s = "hello world";122encoded.o2 = 42;123encoded.inner.i = 70;124125dap::json::Serializer s;126ASSERT_TRUE(s.serialize(encoded));127128dap::JSONTestObject decoded;129dap::json::Deserializer d(s.dump());130ASSERT_TRUE(d.deserialize(&decoded));131132ASSERT_EQ(encoded.b, decoded.b);133ASSERT_EQ(encoded.i, decoded.i);134ASSERT_EQ(encoded.n, decoded.n);135ASSERT_EQ(encoded.a, decoded.a);136ASSERT_EQ(encoded.o["one"].get<dap::integer>(),137decoded.o["one"].get<dap::integer>());138ASSERT_EQ(encoded.o["two"].get<dap::number>(),139decoded.o["two"].get<dap::number>());140ASSERT_EQ(encoded.s, decoded.s);141ASSERT_EQ(encoded.o2, decoded.o2);142ASSERT_EQ(encoded.inner.i, decoded.inner.i);143}144145TEST_F(JSONSerializer, SerializeObjectNoFields) {146dap::JSONObjectNoFields obj;147dap::json::Serializer s;148ASSERT_TRUE(s.serialize(obj));149ASSERT_EQ(s.dump(), "{}");150}151152TEST_F(JSONSerializer, SerializeDeserializeObject) {153dap::object encoded = GetSimpleObject();154dap::object decoded;155_ASSERT_PASS(TEST_SERIALIZING_DESERIALIZING(encoded, decoded));156_ASSERT_PASS(TEST_SIMPLE_OBJECT(decoded));157}158159TEST_F(JSONSerializer, SerializeDeserializeEmbeddedObject) {160dap::object encoded;161dap::object decoded;162// object nested inside object163dap::object encoded_embed_obj = GetSimpleObject();164dap::object decoded_embed_obj;165encoded["embed_obj"] = encoded_embed_obj;166_ASSERT_PASS(TEST_SERIALIZING_DESERIALIZING(encoded, decoded));167ASSERT_TRUE(decoded["embed_obj"].is<dap::object>());168decoded_embed_obj = decoded["embed_obj"].get<dap::object>();169_ASSERT_PASS(TEST_SIMPLE_OBJECT(decoded_embed_obj));170}171172TEST_F(JSONSerializer, SerializeDeserializeEmbeddedStruct) {173dap::object encoded;174dap::object decoded;175// object nested inside object176dap::SimpleJSONTestObject encoded_embed_struct;177encoded_embed_struct.b = true;178encoded_embed_struct.i = 50;179encoded["embed_struct"] = encoded_embed_struct;180181dap::object decoded_embed_obj;182_ASSERT_PASS(TEST_SERIALIZING_DESERIALIZING(encoded, decoded));183ASSERT_TRUE(decoded["embed_struct"].is<dap::object>());184decoded_embed_obj = decoded["embed_struct"].get<dap::object>();185ASSERT_TRUE(decoded_embed_obj.at("b").is<dap::boolean>());186ASSERT_TRUE(decoded_embed_obj.at("i").is<dap::integer>());187188ASSERT_EQ(encoded_embed_struct.b, decoded_embed_obj["b"].get<dap::boolean>());189ASSERT_EQ(encoded_embed_struct.i, decoded_embed_obj["i"].get<dap::integer>());190}191192TEST_F(JSONSerializer, SerializeDeserializeEmbeddedIntArray) {193dap::object encoded;194dap::object decoded;195// array nested inside object196dap::array<dap::integer> encoded_embed_arr = {1, 2, 3, 4};197dap::array<dap::any> decoded_embed_arr;198199encoded["embed_arr"] = encoded_embed_arr;200201_ASSERT_PASS(TEST_SERIALIZING_DESERIALIZING(encoded, decoded));202// TODO: Deserializing array should infer basic member types203ASSERT_TRUE(decoded["embed_arr"].is<dap::array<dap::any>>());204decoded_embed_arr = decoded["embed_arr"].get<dap::array<dap::any>>();205ASSERT_EQ(encoded_embed_arr.size(), decoded_embed_arr.size());206for (std::size_t i = 0; i < decoded_embed_arr.size(); i++) {207ASSERT_TRUE(decoded_embed_arr[i].is<dap::integer>());208ASSERT_EQ(encoded_embed_arr[i], decoded_embed_arr[i].get<dap::integer>());209}210}211212TEST_F(JSONSerializer, SerializeDeserializeEmbeddedObjectArray) {213dap::object encoded;214dap::object decoded;215216dap::array<dap::object> encoded_embed_arr = {GetSimpleObject(),217GetSimpleObject()};218dap::array<dap::any> decoded_embed_arr;219220encoded["embed_arr"] = encoded_embed_arr;221222_ASSERT_PASS(TEST_SERIALIZING_DESERIALIZING(encoded, decoded));223// TODO: Deserializing array should infer basic member types224ASSERT_TRUE(decoded["embed_arr"].is<dap::array<dap::any>>());225decoded_embed_arr = decoded["embed_arr"].get<dap::array<dap::any>>();226ASSERT_EQ(encoded_embed_arr.size(), decoded_embed_arr.size());227for (std::size_t i = 0; i < decoded_embed_arr.size(); i++) {228ASSERT_TRUE(decoded_embed_arr[i].is<dap::object>());229_ASSERT_PASS(TEST_SIMPLE_OBJECT(decoded_embed_arr[i].get<dap::object>()));230}231}232233TEST_F(JSONSerializer, DeserializeSerializeEmptyObject) {234auto empty_obj = "{}";235dap::object decoded;236dap::json::Deserializer d(empty_obj);237ASSERT_TRUE(d.deserialize(&decoded));238dap::json::Serializer s;239ASSERT_TRUE(s.serialize(decoded));240ASSERT_EQ(s.dump(), empty_obj);241}242243TEST_F(JSONSerializer, SerializeDeserializeEmbeddedEmptyObject) {244dap::object encoded_empty_obj;245dap::object encoded = {{"empty_obj", encoded_empty_obj}};246dap::object decoded;247248_ASSERT_PASS(TEST_SERIALIZING_DESERIALIZING(encoded, decoded));249ASSERT_TRUE(decoded["empty_obj"].is<dap::object>());250dap::object decoded_empty_obj = decoded["empty_obj"].get<dap::object>();251ASSERT_EQ(encoded_empty_obj.size(), decoded_empty_obj.size());252}253254TEST_F(JSONSerializer, SerializeDeserializeObjectWithNulledField) {255auto thing = dap::any(dap::null());256dap::object encoded;257encoded["nulled_field"] = dap::null();258dap::json::Serializer s;259ASSERT_TRUE(s.serialize(encoded));260dap::object decoded;261auto dump = s.dump();262dap::json::Deserializer d(dump);263ASSERT_TRUE(d.deserialize(&decoded));264ASSERT_TRUE(encoded["nulled_field"].is<dap::null>());265}266267268