/
zOMGdev
/
cppcms
Обзор
Документация
Войти
/
zOMGdev
/
cppcms
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
v2.0.0.beta1
tests/serialization_test.cpp
478 строк
9 KB
Artyom Beilis
Switch from booster::shared_ptr/weak_ptr to std::ones
11 авг 2020, 22:57
11 авг 2020, 22:57
dfc88bd
Код
Авторство
О чём код?
/////////////////////////////////////////////////////////////////////////////// // // Copyright (C) 2008-2012 Artyom Beilis (Tonkikh) <artyomtnk@yahoo.com> // // See accompanying file COPYING.TXT file for licensing details. // /////////////////////////////////////////////////////////////////////////////// #include <cppcms/serialization.h> #include "test.h" struct foo { double t,v; }; struct test2_base { foo f; int x,y; void init() { f.t=100; f.v=20; x=65; y=10; } void check() { TEST(f.t==100); TEST(f.v==20); TEST(x==65); TEST(y==10); } }; struct test2 : public test2_base, public cppcms::serializable { void serialize(cppcms::archive &a) { a & cppcms::as_pod(f) & x & y; } }; struct test2c : public test2_base, public cppcms::serializable_base { void save(cppcms::archive &a) const { a << cppcms::as_pod(f) << x << y; } void load(cppcms::archive &a) { a >> cppcms::as_pod(f) >> x >> y; } }; template<typename Test2> struct test1_base { void init() { str="Hello"; x=11; v.push_back(10); v.push_back(20); mapping[10].init(); mapping[20].init(); p.reset(new Test2); p->init(); } void check() { TEST(str=="Hello" && x == 11 && v[0]==10 && v[1]==20 && v.size()==2); TEST(mapping.size()==2); mapping[10].check(); mapping[20].check(); TEST(mapping.size()==2); TEST(p); p->check(); } std::string str; int x; std::vector<int> v; std::map<int,Test2> mapping; booster::shared_ptr<Test2> p; }; struct test1 : public test1_base<test2>, public cppcms::serializable { void serialize(cppcms::archive &a) { a & str & x & v & mapping & p; } }; struct test1c : public test1_base<test2c>, public cppcms::serializable_base { void save(cppcms::archive &a) const { a << str << x << v << mapping << p; } void load(cppcms::archive &a) { a >> str >> x >> v >> mapping >> p; } }; template<typename Pointer> void test_ptr() { { cppcms::archive a; Pointer x(new int(15)),y; a & x; a.mode(cppcms::archive::load_from_archive); a & y; TEST(*x==*y && x.get()!=y.get()); TEST(a.eof()); } { cppcms::archive a; Pointer const x(new int(15)); Pointer y; a << x; a.mode(cppcms::archive::load_from_archive); a >> y; TEST(*x==*y && x.get()!=y.get()); TEST(a.eof()); } { cppcms::archive a; Pointer x,y(new int(15)); a & x; a.mode(cppcms::archive::load_from_archive); a & y; TEST(y.get()==0); TEST(a.eof()); } { cppcms::archive a; Pointer const x; Pointer y(new int(15)); a << x; a.mode(cppcms::archive::load_from_archive); a >> y; TEST(y.get()==0); TEST(a.eof()); } } template<typename T> T const &const_ref(T &x) { return x; } int main() { try { std::cout << "Testing POD" << std::endl; { cppcms::archive a; unsigned int x=0xDEADBEEF; a & x; a.mode(cppcms::archive::load_from_archive); unsigned int y = 0xFFFFFFFF; a & y; TEST(y==0xDEADBEEF); TEST(a.eof()); a.reset(); TEST(a.next_chunk_size() == sizeof(int)); } { cppcms::archive a; const unsigned int x=0xDEADBEEF; a << x; a.mode(cppcms::archive::load_from_archive); unsigned int y = 0xFFFFFFFF; a >> y; TEST(y==0xDEADBEEF); TEST(a.eof()); a.reset(); TEST(a.next_chunk_size() == sizeof(int)); } std::cout << "Testing String" << std::endl; { cppcms::archive a; std::string x="Hello World"; a & x; a.mode(cppcms::archive::load_from_archive); std::string y; a & y; TEST(y==x); TEST(a.eof()); a.reset(); TEST(a.next_chunk_size() == x.size()); } { cppcms::archive a; std::string const x="Hello World"; a << x; a.mode(cppcms::archive::load_from_archive); std::string y; a >> y; TEST(y==x); TEST(a.eof()); a.reset(); TEST(a.next_chunk_size() == x.size()); } std::cout << "Testing array" << std::endl; { cppcms::archive a; std::string x[2]={"hello","world"}; a << x; a.mode(cppcms::archive::load_from_archive); std::string y[2]; a >> y; TEST(x[0]==y[0] && x[1]==y[1]); TEST(a.eof()); } { cppcms::archive a; std::string const x[2]={"hello","world"}; a << x; a.mode(cppcms::archive::load_from_archive); std::string y[2]; a >> y; TEST(x[0]==y[0] && x[1]==y[1]); TEST(a.eof()); } std::cout << "Testing POD array" << std::endl; { cppcms::archive a; int x[2]={10,20}; a & x; a.mode(cppcms::archive::load_from_archive); TEST(a.next_chunk_size()==sizeof(int)*2); int y[2]={0,0}; a & y; TEST(x[0]==y[0] && x[1]==y[1]); TEST(a.eof()); } { cppcms::archive a; int const x[2]={10,20}; a << x; a.mode(cppcms::archive::load_from_archive); TEST(a.next_chunk_size()==sizeof(int)*2); int y[2]={0,0}; a >> y; TEST(x[0]==y[0] && x[1]==y[1]); TEST(a.eof()); } std::cout << "Testing POD vector" << std::endl; { cppcms::archive a; std::vector<int> x; x.push_back(10); x.push_back(20); x.push_back(30); a & x; a.mode(cppcms::archive::load_from_archive); TEST(a.next_chunk_size()==sizeof(int)*3); std::vector<int> y; a & y; TEST(x==y); TEST(a.eof()); } { cppcms::archive a; std::vector<int> xr; xr.push_back(10); xr.push_back(20); xr.push_back(30); std::vector<int> const &x=xr; a << x; a.mode(cppcms::archive::load_from_archive); TEST(a.next_chunk_size()==sizeof(int)*3); std::vector<int> y; a >> y; TEST(x==y); TEST(a.eof()); } std::cout << "Testing list" << std::endl; { cppcms::archive a; std::list<int> x; x.push_back(10); x.push_back(20); x.push_back(30); a & x; a.mode(cppcms::archive::load_from_archive); std::list<int> y; a & y; TEST(x==y); TEST(a.eof()); } { cppcms::archive a; std::list<int> xr; xr.push_back(10); xr.push_back(20); xr.push_back(30); std::list<int> const &x=xr; a << x; a.mode(cppcms::archive::load_from_archive); std::list<int> y; a >> y; TEST(x==y); TEST(a.eof()); } std::cout << "Testing compund" << std::endl; { cppcms::archive a; std::vector<std::string> x; x.push_back("a"); x.push_back("XX"); x.push_back("tttt"); a & x; a.mode(cppcms::archive::load_from_archive); std::vector<std::string> y; a & y; TEST(x==y); TEST(a.eof()); } { cppcms::archive a; std::vector<std::string> xr; xr.push_back("a"); xr.push_back("XX"); xr.push_back("tttt"); std::vector<std::string> const &x=xr; a << x; a.mode(cppcms::archive::load_from_archive); std::vector<std::string> y; a >> y; TEST(x==y); TEST(a.eof()); } std::cout << "Testing set" << std::endl; { cppcms::archive a; std::set<std::string> x; x.insert("a"); x.insert("XX"); x.insert("tttt"); a & x; a.mode(cppcms::archive::load_from_archive); std::set<std::string> y; a & y; TEST(x==y); TEST(a.eof()); } { cppcms::archive a; std::set<std::string> xr; xr.insert("a"); xr.insert("XX"); xr.insert("tttt"); std::set<std::string> const &x=xr; a << x; a.mode(cppcms::archive::load_from_archive); std::set<std::string> y; a >> y; TEST(x==y); TEST(a.eof()); } std::cout << "Testing map" << std::endl; { cppcms::archive a; std::map<std::string,std::vector<int> > x; x["a"].push_back(10); x["a"].push_back(20); x["b"].push_back(40); a & x; a.mode(cppcms::archive::load_from_archive); std::map<std::string,std::vector<int> > y; a & y; TEST(x==y); TEST(a.eof()); } { cppcms::archive a; std::map<std::string,std::vector<int> > xr; xr["a"].push_back(10); xr["a"].push_back(20); xr["b"].push_back(40); std::map<std::string,std::vector<int> > const &x=xr; a << x; a.mode(cppcms::archive::load_from_archive); std::map<std::string,std::vector<int> > y; a >> y; TEST(x==y); TEST(a.eof()); } std::cout << "Testing multimap" << std::endl; { cppcms::archive a; std::multimap<std::string,std::vector<int> > x,y; x.insert(std::pair<std::string,std::vector<int> >("foo",std::vector<int>(10,20))); a << const_ref(x); a.mode(cppcms::archive::load_from_archive); a >> y; TEST(x==y); TEST(a.eof()); } std::cout << "Testing smart pointer" << std::endl; test_ptr<booster::shared_ptr<int> >(); test_ptr<booster::hold_ptr<int> >(); test_ptr<booster::copy_ptr<int> >(); test_ptr<booster::clone_ptr<int> >(); test_ptr<std::unique_ptr<int> >(); std::cout << "Testing object serialization" << std::endl; { std::string tmp; { test1 t; t.init(); { test1 const &tt=t; cppcms::serialization_traits<test1>::save(tt,tmp); } } { test1 t; cppcms::serialization_traits<test1>::load(tmp,t); t.check(); } } { std::string tmp; { test1c t; t.init(); { test1c const &tt=t; cppcms::serialization_traits<test1c>::save(tt,tmp); } } { test1c t; cppcms::serialization_traits<test1c>::load(tmp,t); t.check(); } } } catch(std::exception const &e) { std::cerr << "Fail: " << e.what() << std::endl; return 1; } std::cout << "Ok" << std::endl; }