#include #include "V8Xml/WebSerializer.h" #include "V8Xml/WebParser.h" #include "V8DataModel/BasicPartInstance.h" #include "V8DataModel/ModelInstance.h" #include "V8DataModel/JointInstance.h" using namespace RBX; BOOST_AUTO_TEST_SUITE(WebSerializer) BOOST_AUTO_TEST_CASE(TestWebSerializerList) { shared_ptr valueCollection(new Reflection::ValueArray()); { Reflection::Variant val = 2.25f; valueCollection->push_back(val); } { Reflection::Variant val = std::string("foo bar"); valueCollection->push_back(val); } { Reflection::Variant val = true; valueCollection->push_back(val); } { shared_ptr part = Creatable::create(); part->setName("CustomPart"); Reflection::Variant val = part; valueCollection->push_back(val); } scoped_ptr root(RBX::WebSerializer::writeList(*valueCollection)); Reflection::Variant value; BOOST_CHECK(RBX::WebParser::parseWebGenericResponse(root.get(), value)); BOOST_CHECK(value.isType >()); shared_ptr newValueCollection = value.get >(); BOOST_CHECK(newValueCollection); BOOST_CHECK(newValueCollection->size() == valueCollection->size()); BOOST_CHECK(newValueCollection->at(0).isType()); BOOST_CHECK(newValueCollection->at(0).get() == 2.25); BOOST_CHECK(newValueCollection->at(1).isType()); BOOST_CHECK(newValueCollection->at(1).get() == "foo bar"); BOOST_CHECK(newValueCollection->at(2).isType()); BOOST_CHECK(newValueCollection->at(2).get() == true); { BOOST_CHECK(newValueCollection->at(3).isType >()); BOOST_CHECK(newValueCollection->at(3).get >()->getName() == "CustomPart"); } } BOOST_AUTO_TEST_CASE(TestWebSerializerTable) { shared_ptr valueMap(new Reflection::ValueMap()); { Reflection::Variant val = 2.25; (*valueMap)["number"] = val; } { Reflection::Variant val = std::string("foo bar"); (*valueMap)["string"] = val; } { Reflection::Variant val = true; (*valueMap)["bool"] = val; } { shared_ptr part = Creatable::create(); part->setName("CustomPart"); Reflection::Variant val = part; (*valueMap)["instance"] = val; } { double val = 2.25; (*valueMap)["double"] = val; } { float val = 2.25f; (*valueMap)["float"] = val; } scoped_ptr root(RBX::WebSerializer::writeTable(*valueMap)); Reflection::Variant value; BOOST_CHECK(RBX::WebParser::parseWebGenericResponse(root.get(), value)); BOOST_CHECK(value.isType >()); shared_ptr newValueMap = value.get >(); BOOST_CHECK(newValueMap); BOOST_CHECK(newValueMap->size() == valueMap->size()); BOOST_CHECK(newValueMap->find("number")->second.isType()); BOOST_CHECK(newValueMap->find("number")->second.get() == 2.25); BOOST_CHECK(newValueMap->find("string")->second.isType()); BOOST_CHECK(newValueMap->find("string")->second.get() == "foo bar"); BOOST_CHECK(newValueMap->find("bool")->second.isType()); BOOST_CHECK(newValueMap->find("bool")->second.get() == true); { BOOST_CHECK(newValueMap->find("instance")->second.isType >()); BOOST_CHECK(newValueMap->find("instance")->second.get >()->getName() == "CustomPart"); } BOOST_CHECK(newValueMap->find("double")->second.isType()); BOOST_CHECK(newValueMap->find("double")->second.get() == 2.25); BOOST_CHECK(newValueMap->find("float")->second.isType()); BOOST_CHECK(newValueMap->find("float")->second.get() == 2.25); } BOOST_AUTO_TEST_CASE(TestWebSerializerInstance) { Reflection::Variant value; { shared_ptr part = Creatable::create(); part->setName("CustomPart"); Creatable::create()->setParent(part.get()); Creatable::create()->setParent(part.get()); Creatable::create()->setParent(part.get()); value = part; } scoped_ptr root(RBX::WebSerializer::writeValue(value)); Reflection::Variant newValue; BOOST_CHECK(RBX::WebParser::parseWebGenericResponse(root.get(), newValue)); BOOST_CHECK(newValue.isType >()); BOOST_CHECK(newValue.get >()->getName() == "CustomPart"); BOOST_CHECK(newValue.get >()->getChildren()->size() == 3); } BOOST_AUTO_TEST_CASE(TestInstanceClone) { shared_ptr model = Creatable::create(); shared_ptr part0 = Creatable::create(); part0->setName("Part0"); part0->setParent(model.get()); shared_ptr part1 = Creatable::create(); part1->setName("Part1"); part1->setParent(model.get()); shared_ptr weld = Creatable::create(); weld->setName("Weld"); weld->setParent(part0.get()); weld->setPart0(part0.get()); weld->setPart1(part1.get()); shared_ptr cloneModel = model->clone(EngineCreator); BOOST_CHECK(cloneModel); Instance* clonePart0 = cloneModel->findFirstChildByName("Part0"); BOOST_CHECK(clonePart0); Instance* clonePart1 = cloneModel->findFirstChildByName("Part1"); BOOST_CHECK(clonePart1); ManualWeld* cloneWeld = Instance::fastDynamicCast(clonePart0->findFirstChildByName("Weld")); BOOST_CHECK(cloneWeld); BOOST_CHECK(cloneWeld->getPart0()); BOOST_CHECK(cloneWeld->getPart0() == clonePart0); BOOST_CHECK(cloneWeld->getPart1()); BOOST_CHECK(cloneWeld->getPart1() == clonePart1); } BOOST_AUTO_TEST_CASE(TestInstanceCloneExternal) { shared_ptr model = Creatable::create(); shared_ptr part0 = Creatable::create(); part0->setName("Part0"); part0->setParent(model.get()); shared_ptr part1 = Creatable::create(); part1->setName("Part1"); part1->setParent(model.get()); shared_ptr weld = Creatable::create(); weld->setName("Weld"); weld->setParent(part0.get()); weld->setPart0(part0.get()); weld->setPart1(part1.get()); shared_ptr cloneWeld = Instance::fastSharedDynamicCast(weld->clone(EngineCreator)); BOOST_CHECK(cloneWeld); BOOST_CHECK(cloneWeld->getPart0()); BOOST_CHECK(cloneWeld->getPart0() == part0.get()); BOOST_CHECK(cloneWeld->getPart1()); BOOST_CHECK(cloneWeld->getPart1() == part1.get()); } BOOST_AUTO_TEST_SUITE_END()