// // Copyright (C) 2014 Christian Schüller // // This Source Code Form is subject to the terms of the Mozilla Public License // v. 2.0. If a copy of the MPL was not distributed with this file, You can // obtain one at http://mozilla.org/MPL/2.0/. //#ifndef IGL_SERIALIZATION_TEST_H //#define IGL_SERIALIZATION_TEST_H //#include #include namespace igl { struct Test1111 { }; struct Test1 : public XMLSerializable { std::string ts; std::vector tvt; Test1* tt; Test1() { tt = NULL; } void InitSerialization() { Add(ts,"ts"); Add(tvt,"tvt",true); Add(tt,"tt",true); } }; struct Test2: public igl::XMLSerializableBase { char tc; int* ti; std::vector tvb; float tf; Test2() { tc = '1'; ti = NULL; tf = 1.0004; tvb.push_back(2); tvb.push_back(3); } void Serialize(tinyxml2::XMLDocument* doc,tinyxml2::XMLElement* element) const { igl::serialize_xml(tc,"tc",doc,element); igl::serialize_xml(ti,"ti",doc,element); igl::serialize_xml(tvb,"tvb",doc,element); } void Deserialize(const tinyxml2::XMLDocument* doc,const tinyxml2::XMLElement* element) { igl::deserialize_xml(tc,"tc",doc,element); igl::deserialize_xml(ti,"ti",doc,element); igl::deserialize_xml(tvb,"tvb",doc,element); } void Serialize(std::vector& buffer) const { igl::serialize(tc,"tc",buffer); igl::serialize(ti,"ti",buffer); igl::serialize(tvb,"tvb",buffer); igl::serialize(tf,"tf",buffer); } void Deserialize(const std::vector& buffer) { igl::deserialize(tc,"tc",buffer); igl::deserialize(ti,"ti",buffer); igl::deserialize(tvb,"tvb",buffer); igl::deserialize(tf,"tf",buffer); } }; void serialization_test() { std::string file("test"); bool tbIn = true,tbOut; char tcIn = 't',tcOut; unsigned char tucIn = 'u',tucOut; short tsIn = 6,tsOut; int tiIn = -10,tiOut; unsigned int tuiIn = 10,tuiOut; float tfIn = 1.0005,tfOut; double tdIn = 1.000000005,tdOut; int* tinpIn = NULL,*tinpOut = NULL; float* tfpIn = new float,*tfpOut = NULL; *tfpIn = 1.11101; std::string tstrIn("test12345"),tstrOut; Test2 tObjIn,tObjOut; int ti = 2; tObjIn.ti = &ti; Test1 test1,test2,test3; test1.ts = "100"; test2.ts = "200"; test3.ts = "300"; Test1 testA, testC; testA.tt = &test1; testA.ts = "test123"; testA.tvt.push_back(&test2); testA.tvt.push_back(&test3); Test1 testB = testA; testB.ts = "400"; testB.tvt.pop_back(); std::pair tPairIn(10,true); std::pair tPairOut; std::vector tVector1In ={1,2,3,4,5}; std::vector tVector1Out; std::pair p1(10,1); std::pair p2(1,0); std::pair p3(10000,1); std::vector > tVector2In ={p1,p2,p3}; std::vector > tVector2Out; std::set > tSetIn ={p1,p2,p3}; std::set > tSetOut; std::map tMapIn ={p1,p2,p3}; std::map tMapOut; Eigen::Matrix tDenseMatrixIn; tDenseMatrixIn << Eigen::Matrix::Random(); Eigen::Matrix tDenseMatrixOut; Eigen::Matrix tDenseRowMatrixIn; tDenseRowMatrixIn << Eigen::Matrix::Random(); Eigen::Matrix tDenseRowMatrixOut; Eigen::SparseMatrix tSparseMatrixIn; tSparseMatrixIn.resize(3,3); tSparseMatrixIn.insert(0,0) = 1.3; tSparseMatrixIn.insert(1,1) = 10.2; tSparseMatrixIn.insert(2,2) = 100.1; tSparseMatrixIn.finalize(); Eigen::SparseMatrix tSparseMatrixOut; // binary serialization igl::serialize(tbIn,file); igl::deserialize(tbOut,file); assert(tbIn == tbOut); igl::serialize(tcIn,file); igl::deserialize(tcOut,file); assert(tcIn == tcOut); igl::serialize(tucIn,file); igl::deserialize(tucOut,file); assert(tucIn == tucOut); igl::serialize(tsIn,file); igl::deserialize(tsOut,file); assert(tsIn == tsOut); igl::serialize(tiIn,file); igl::deserialize(tiOut,file); assert(tiIn == tiOut); igl::serialize(tuiIn,file); igl::deserialize(tuiOut,file); assert(tuiIn == tuiOut); igl::serialize(tfIn,file); igl::deserialize(tfOut,file); assert(tfIn == tfOut); igl::serialize(tdIn,file); igl::deserialize(tdOut,file); assert(tdIn == tdOut); igl::serialize(tinpIn,file); igl::deserialize(tinpOut,file); assert(tinpIn == tinpOut); igl::serialize(tfpIn,file); igl::deserialize(tfpOut,file); assert(*tfpIn == *tfpOut); tfpOut = NULL; igl::serialize(tstrIn,file); igl::deserialize(tstrOut,file); assert(tstrIn == tstrOut); // updating igl::serialize(tsIn,"tsIn",file); igl::serialize(tVector1In,"tVector1In",file,true); igl::serialize(tVector2In,"tsIn",file,true); igl::deserialize(tVector2Out,"tsIn",file); for(unsigned int i=0;its == testC.tvt[i]->ts); assert(testB.tvt[i]->tvt.size() == testC.tvt[i]->tvt.size()); assert(testB.tvt[i]->tt == testC.tvt[i]->tt); } assert(testB.tt->ts == testC.tt->ts); assert(testB.tt->tvt.size() == testC.tt->tvt.size()); assert(testB.tt->tt == testC.tt->tt); testC = Test1(); // big data test /*std::vector > bigDataIn,bigDataOut; for(unsigned int i=0;i<10000;i++) { std::vector v; for(unsigned int j=0;j<10000;j++) { v.push_back(j); } bigDataIn.push_back(v); } igl::Timer timer; timer.start(); igl::serialize(bigDataIn,file); timer.stop(); std::cout << "ser: " << timer.getElapsedTimeInMilliSec() << std::endl; timer.start(); igl::deserialize(bigDataOut,file); timer.stop(); std::cout << "des: " << timer.getElapsedTimeInMilliSec() << std::endl; char c; std::cin >> c; */ // xml serialization igl::serialize_xml(tbIn,file); igl::deserialize_xml(tbOut,file); assert(tbIn == tbOut); igl::serialize_xml(tcIn,file); igl::deserialize_xml(tcOut,file); assert(tcIn == tcOut); igl::serialize_xml(tucIn,file); igl::deserialize_xml(tucOut,file); assert(tucIn == tucOut); igl::serialize_xml(tsIn,file); igl::deserialize_xml(tsOut,file); assert(tsIn == tsOut); igl::serialize_xml(tiIn,file); igl::deserialize_xml(tiOut,file); assert(tiIn == tiOut); igl::serialize_xml(tuiIn,file); igl::deserialize_xml(tuiOut,file); assert(tuiIn == tuiOut); igl::serialize_xml(tfIn,file); igl::deserialize_xml(tfOut,file); assert(tfIn == tfOut); igl::serialize_xml(tdIn,file); igl::deserialize_xml(tdOut,file); assert(tdIn == tdOut); igl::serialize_xml(tinpIn,file); igl::deserialize_xml(tinpOut,file); assert(tinpIn == tinpOut); igl::serialize_xml(tfpIn,file); igl::deserialize_xml(tfpOut,file); assert(*tfpIn == *tfpOut); igl::serialize_xml(tstrIn,file); igl::deserialize_xml(tstrOut,file); assert(tstrIn == tstrOut); // updating igl::serialize_xml(tsIn,"tsIn",file); igl::serialize_xml(tVector1In,"tVector1In",file,false,true); igl::serialize_xml(tVector2In,"tsIn",file,false,true); igl::deserialize_xml(tVector2Out,"tsIn",file); for(unsigned int i=0;its == testC.tvt[i]->ts); assert(testB.tvt[i]->tvt.size() == testC.tvt[i]->tvt.size()); assert(testB.tvt[i]->tt == testC.tvt[i]->tt); } assert(testB.tt->ts == testC.tt->ts); assert(testB.tt->tvt.size() == testC.tt->tvt.size()); assert(testB.tt->tt == testC.tt->tt); // big data test /*std::vector > bigDataIn,bigDataOut; for(unsigned int i=0;i<10000;i++) { std::vector v; for(unsigned int j=0;j<10000;j++) { v.push_back(j); } bigDataIn.push_back(v); } igl::Timer timer; timer.start(); igl::serialize_xml(bigDataIn,"bigDataIn",file,igl::SERIALIZE_BINARY); timer.stop(); std::cout << "ser: " << timer.getElapsedTimeInMilliSec() << std::endl; timer.start(); igl::deserialize_xml(bigDataOut,"bigDataIn",file); timer.stop(); std::cout << "des: " << timer.getElapsedTimeInMilliSec() << std::endl; char c; std::cin >> c;*/ std::cout << "All tests run successfully!\n"; } } //#endif