Files
GDevelop/Core/tests/Serializer.cpp
T
2015-10-11 17:12:17 +02:00

107 lines
5.4 KiB
C++

/*
* GDevelop Core
* Copyright 2008-2015 Florian Rival (Florian.Rival@gmail.com). All rights reserved.
* This project is released under the MIT License.
*/
/**
* @file Tests covering serialization to JSON.
*/
#include "catch.hpp"
#include "GDCore/CommonTools.h"
#include "GDCore/Tools/SystemStats.h"
#include "GDCore/Tools/VersionWrapper.h"
#include "GDCore/PlatformDefinition/Project.h"
#include "GDCore/PlatformDefinition/Layout.h"
#include "GDCore/PlatformDefinition/Variable.h"
#include "GDCore/Events/EventsList.h"
#include "GDCore/Events/Event.h"
#include "GDCore/Events/Builtin/StandardEvent.h"
#include "GDCore/Events/Serialization.h"
#include "GDCore/Serialization/Serializer.h"
#include "GDCore/Serialization/Splitter.h"
using namespace gd;
TEST_CASE( "Serializer", "[common]" ) {
SECTION("JSON basics") {
gd::String originalJSON = "{\"ok\": true,\"hello\": \"world\"}";
SerializerElement element = Serializer::FromJSON(originalJSON);
REQUIRE(element.GetChild("ok").GetValue().GetBool() == true);
REQUIRE(element.GetChild("hello").GetValue().GetString() == "world");
gd::String json = Serializer::ToJSON(element);
REQUIRE(json == originalJSON);
}
SECTION("Quotes and special characters") {
gd::String originalJSON = "{\"\\\"hello\\\"\": \" \\\"quote\\\" \",\"caret-prop\": 1,\"special-\\b\\f\\n\\r\\t\\\"\": \"\\b\\f\\n\\r\\t\"}";
SerializerElement element = Serializer::FromJSON(originalJSON);
REQUIRE(element.GetChild("caret-prop").GetValue().GetBool() == true);
REQUIRE(element.GetChild("\"hello\"").GetValue().GetString() == " \"quote\" ");
REQUIRE(element.GetChild("special-\b\f\n\r\t\"").GetValue().GetString() == "\b\f\n\r\t");
gd::String json = Serializer::ToJSON(element);
REQUIRE(json == originalJSON);
}
SECTION("Splitter") {
SECTION("Split elements") {
//Create some elements
SerializerElement root;
root.AddChild("a").AddChild("a1").SetValue(gd::String("hello"));
root.AddChild("b").AddChild("b1").SetValue(gd::String("world"));
root.AddChild("c").AddChild("c1").SetValue(3);
auto & layouts = root.AddChild("layouts");
layouts.ConsiderAsArrayOf("layout");
for(auto i = 0;i<5;++i) {
auto & layout = layouts.AddChild("layout");
layout.SetAttribute("name", "layout" + gd::String::From(i));
layout.AddChild("child").SetValue(42);
}
//And split them
gd::Splitter splitter;
auto splitElements = splitter.Split(root, {"/a/a1", "/layouts/layout"});
REQUIRE(splitElements.size() == 6);
REQUIRE(splitElements[0].path == "/a/a1");
REQUIRE(splitElements[1].path == "/layouts/layout");
REQUIRE(splitElements[1].name == "layout0");
REQUIRE(Serializer::ToJSON(splitElements[0].element) ==
"\"hello\""
);
REQUIRE(Serializer::ToJSON(splitElements[1].element) ==
"{\"name\": \"layout0\",\"child\": 42}"
);
REQUIRE(Serializer::ToJSON(root) ==
"{\"a\": {\"a1\": {\"name\": \"\",\"referenceTo\": \"/a/a1\"}},\"b\": {\"b1\": \"world\"},\"c\": {\"c1\": 3},\"layouts\": [{\"name\": \"layout0\",\"referenceTo\": \"/layouts/layout\"},{\"name\": \"layout1\",\"referenceTo\": \"/layouts/layout\"},{\"name\": \"layout2\",\"referenceTo\": \"/layouts/layout\"},{\"name\": \"layout3\",\"referenceTo\": \"/layouts/layout\"},{\"name\": \"layout4\",\"referenceTo\": \"/layouts/layout\"}]}"
);
}
SECTION("Unsplit elements") {
//Get a JSON with elements being reference to split elements
gd::String originalJSON = "{\"a\": {\"a1\": {\"name\": \"\",\"referenceTo\": \"/a/a1\"}},\"b\": {\"b1\": \"world\"},\"c\": {\"c1\": 3},\"layouts\": [{\"name\": \"layout0\",\"referenceTo\": \"/layouts/layout\"},{\"name\": \"layout1\",\"referenceTo\": \"/layouts/layout\"},{\"name\": \"layout2\",\"referenceTo\": \"/layouts/layout\"},{\"name\": \"layout3\",\"referenceTo\": \"/layouts/layout\"},{\"name\": \"layout4\",\"referenceTo\": \"/layouts/layout\"}]}";
SerializerElement root = Serializer::FromJSON(originalJSON);
gd::Splitter splitter;
splitter.Unsplit(root, [](gd::String path, gd::String name) {
//Return new elements to replace the split elements
SerializerElement element;
element.SetAttribute("path", path);
element.SetAttribute("name", name);
element.AddChild("child").SetValue(name == "" ? 41 : 42);
return element;
});
//Check that we can now get elements, with all split elements
//replaced by the new ones.
root.GetChild("layouts").ConsiderAsArrayOf("layout");
REQUIRE(root.GetChild("a").GetChild("a1").GetStringAttribute("name") == "");
REQUIRE(root.GetChild("a").GetChild("a1").GetChild("child").GetValue().GetInt() == 41);
REQUIRE(root.GetChild("layouts").GetChild(0).GetStringAttribute("path") == "/layouts/layout");
REQUIRE(root.GetChild("layouts").GetChild(1).GetStringAttribute("name") == "layout1");
REQUIRE(root.GetChild("layouts").GetChild(2).GetChild("child").GetValue().GetInt() == 42);
}
}
}