test.cpp 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. /*
  2. * Copyright (C) 2021 Duowan Inc. All rights reserved.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing,
  11. * software distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. #include <iostream>
  17. #ifdef XGTEST
  18. #include<gtest/gtest.h>
  19. #endif
  20. #include "xpack/json.h"
  21. #include "xpack/xml.h"
  22. #include "string.h"
  23. using namespace std;
  24. // BuiltInTypes
  25. struct BuiltInTypes {
  26. signed char sch;
  27. char ch;
  28. unsigned char uch;
  29. short sh;
  30. unsigned short ush;
  31. int i;
  32. unsigned int ui;
  33. long l;
  34. unsigned long ul;
  35. long long ll;
  36. unsigned long long ull;
  37. float f;
  38. double d;
  39. long double ld;
  40. bool b;
  41. XPACK(AF(F(ATTR), sch, "xml:s:ch"), X(F(ATTR), ch, uch, sh, ush), O(i, ui, l, ul, ll, ull, f, d, ld, b));
  42. };
  43. // simple struct used by other
  44. struct Base {
  45. int bi;
  46. string bs;
  47. XPACK(O(bi, bs));
  48. };
  49. // test in another namespace
  50. namespace otherns {
  51. // test enum
  52. enum Enum {
  53. E0 = 0,
  54. E1 = 1,
  55. };
  56. struct OtherNS:public Base {
  57. // test bit field
  58. short h:8;
  59. short l:8;
  60. Enum e;
  61. };
  62. }
  63. // XPACK_OUT must define in global namespace
  64. XPACK_OUT(otherns::OtherNS, I(Base), B(F(0), h, l), E(F(0), e));
  65. struct XTest :public otherns::OtherNS {
  66. string as1; // alias name
  67. string as2;
  68. BuiltInTypes types;
  69. vector<int> vi; // vector int
  70. vector<vector<int> > vvi; // vector vector int
  71. vector<string> vs; // vector string
  72. vector<vector<string> > vvs; // vector vector string
  73. vector<Base> vst; // vector struct
  74. vector<vector<Base> > vvst; // vector vector struct
  75. set<int> si;
  76. list<int> li;
  77. map<string, int> mi;
  78. map<string, Base> mst;
  79. #ifdef XGTEST
  80. unordered_map<string, Base> umst;
  81. #else
  82. map<string, Base> umst;
  83. #endif
  84. shared_ptr<Base> spst;
  85. char charray[16];
  86. #ifdef XPACK_SUPPORT_QT
  87. // Qt
  88. QString qstr;
  89. QList<Base> qlst;
  90. QVector<Base> qvst;
  91. QMap<string, Base> qmst;
  92. QMap<QString, Base> qmqsst;
  93. XPACK(I(otherns::OtherNS, Base), A(as1, "a1 json:alias1", as2, "a2 json:alias2"),
  94. O(types, vi, vvi, vs, vvs, vvst), A(vst, "xml:vst,vl@base"),
  95. O(si,li,mi, mst, umst, spst, charray),
  96. O(qstr, qlst, qvst, qmst, qmqsst));
  97. #else
  98. XPACK(I(otherns::OtherNS, Base), A(as1, "a1 json:alias1", as2, "a2 json:alias2"),
  99. O(types, vi, vvi, vs, vvs, vvst), A(vst, "xml:vst,vl@base"),
  100. O(si,li,mi, mst, umst, spst, charray));
  101. #endif
  102. };
  103. #ifdef XGTEST
  104. void childeq(const XTest&cd) {
  105. EXPECT_EQ(cd.bi, 1024);
  106. EXPECT_EQ(cd.bs, "1024");
  107. EXPECT_EQ(cd.h, 10);
  108. EXPECT_EQ(cd.l, 24);
  109. EXPECT_EQ(cd.e, 1);
  110. EXPECT_EQ(cd.as1, "hello");
  111. EXPECT_EQ(cd.as2, "world");
  112. EXPECT_EQ(cd.vi.size(), 3U);
  113. EXPECT_EQ(cd.vi[0], 1);
  114. EXPECT_EQ(cd.vi[1], 2);
  115. EXPECT_EQ(cd.vi[2], 4);
  116. EXPECT_EQ(cd.vvi.size(), 2U);
  117. EXPECT_EQ(cd.vvi[0][0], 8);
  118. EXPECT_EQ(cd.vvi[0][1], 16);
  119. EXPECT_EQ(cd.vvi[0][2], 32);
  120. EXPECT_EQ(cd.vvi[1][0], 64);
  121. EXPECT_EQ(cd.vvi[1][1], 128);
  122. EXPECT_EQ(cd.vvi[1][2], 256);
  123. EXPECT_EQ(cd.vs.size(), 3U);
  124. EXPECT_EQ(cd.vs[0], "hello");
  125. EXPECT_EQ(cd.vs[1], "hallo");
  126. EXPECT_EQ(cd.vs[2], "你好");
  127. EXPECT_EQ(cd.vvs.size(), 2U);
  128. EXPECT_EQ(cd.vvs[0][0], "Python");
  129. EXPECT_EQ(cd.vvs[0][1], "Perl");
  130. EXPECT_EQ(cd.vvs[0][2], "Bash");
  131. EXPECT_EQ(cd.vvs[1][0], "C++");
  132. EXPECT_EQ(cd.vvs[1][1], "Golang");
  133. EXPECT_EQ(cd.vvs[1][2], "Rust");
  134. EXPECT_EQ(cd.vst.size(), 2U);
  135. EXPECT_EQ(cd.vst[0].bi, 1);
  136. EXPECT_EQ(cd.vst[0].bs, "2");
  137. EXPECT_EQ(cd.vst[1].bi, 3);
  138. EXPECT_EQ(cd.vst[1].bs, "4");
  139. EXPECT_EQ(cd.vvst.size(), 2U);
  140. EXPECT_EQ(cd.vvst[0][0].bi, 5);
  141. EXPECT_EQ(cd.vvst[0][0].bs, "6");
  142. EXPECT_EQ(cd.vvst[0][1].bi, 7);
  143. EXPECT_EQ(cd.vvst[0][1].bs, "8");
  144. EXPECT_EQ(cd.vvst[1][0].bi, 9);
  145. EXPECT_EQ(cd.vvst[1][0].bs, "10");
  146. EXPECT_EQ(cd.si.size(), 3U);
  147. EXPECT_TRUE(cd.si.find(1)!=cd.si.end());
  148. EXPECT_TRUE(cd.si.find(3)!=cd.si.end());
  149. EXPECT_TRUE(cd.si.find(5)!=cd.si.end());
  150. auto siter = cd.li.begin();
  151. EXPECT_EQ(cd.li.size(), 3U);
  152. EXPECT_EQ(*siter, 2); ++siter;
  153. EXPECT_EQ(*siter, 4); ++siter;
  154. EXPECT_EQ(*siter, 6); ++siter;
  155. EXPECT_EQ(cd.mi.find("a")->second, 1);
  156. EXPECT_EQ(cd.mi.find("b")->second, 2);
  157. EXPECT_EQ(cd.mi.find("c")->second, 3);
  158. EXPECT_EQ(cd.mst.find("d")->second.bi, 1);
  159. EXPECT_EQ(cd.mst.find("d")->second.bs, "2");
  160. EXPECT_EQ(cd.mst.find("e")->second.bi, 3);
  161. EXPECT_EQ(cd.mst.find("e")->second.bs, "4");
  162. EXPECT_EQ(cd.umst.find("f")->second.bi, 1);
  163. EXPECT_EQ(cd.umst.find("f")->second.bs, "2");
  164. EXPECT_EQ(cd.umst.find("g")->second.bi, 3);
  165. EXPECT_EQ(cd.umst.find("g")->second.bs, "4");
  166. EXPECT_EQ(cd.spst->bi, 10);
  167. EXPECT_EQ(cd.spst->bs, "24");
  168. EXPECT_TRUE(strcmp(cd.charray, "hello world")==0);
  169. #ifdef XPACK_SUPPORT_QT
  170. EXPECT_EQ(cd.qstr.toStdString(), "1024");
  171. auto qlstiter = cd.qlst.begin();
  172. EXPECT_EQ(cd.qlst.size(), 2);
  173. EXPECT_EQ(qlstiter->bi, 1);
  174. EXPECT_EQ(qlstiter->bs, "2");++qlstiter;
  175. EXPECT_EQ(qlstiter->bi, 3);
  176. EXPECT_EQ(qlstiter->bs, "4");
  177. auto qvstiter = cd.qvst.begin();
  178. EXPECT_EQ(cd.qvst.size(), 2);
  179. EXPECT_EQ(qvstiter->bi, 5);
  180. EXPECT_EQ(qvstiter->bs, "6");++qvstiter;
  181. EXPECT_EQ(qvstiter->bi, 7);
  182. EXPECT_EQ(qvstiter->bs, "8");
  183. EXPECT_EQ(cd.qmst.find("d")->bi, 1);
  184. EXPECT_EQ(cd.qmst.find("d")->bs, "2");
  185. EXPECT_EQ(cd.qmst.find("e")->bi, 3);
  186. EXPECT_EQ(cd.qmst.find("e")->bs, "4");
  187. EXPECT_EQ(cd.qmqsst.find("e")->bi, 5);
  188. EXPECT_EQ(cd.qmqsst.find("e")->bs, "6");
  189. EXPECT_EQ(cd.qmqsst.find("f")->bi, 7);
  190. EXPECT_EQ(cd.qmqsst.find("f")->bs, "8");
  191. #endif
  192. EXPECT_EQ(cd.types.sch, 48);
  193. EXPECT_EQ(cd.types.ch, 49);
  194. EXPECT_EQ(cd.types.uch, 50);
  195. EXPECT_EQ(cd.types.sh, 10);
  196. EXPECT_EQ(cd.types.ush, 24);
  197. EXPECT_EQ(cd.types.i, 10);
  198. EXPECT_EQ(cd.types.ui, 24U);
  199. EXPECT_EQ(cd.types.l, 10);
  200. EXPECT_EQ(cd.types.ul, 24U);
  201. EXPECT_EQ(cd.types.ll, 10);
  202. EXPECT_EQ(cd.types.ull, 24U);
  203. EXPECT_FLOAT_EQ(cd.types.f, 2.718);
  204. EXPECT_DOUBLE_EQ(cd.types.d, 3.14);
  205. EXPECT_DOUBLE_EQ(cd.types.ld, 0.618);
  206. EXPECT_TRUE(cd.types.b);
  207. }
  208. TEST(json, testJson) {
  209. XTest cd;
  210. xpack::json::decode_file("test.json", cd);
  211. childeq(cd);
  212. string tjs = xpack::json::encode(cd);//, 0, 1, '\t');
  213. cout<<"json:"<<endl<<tjs<<endl;
  214. XTest cd1;
  215. xpack::json::decode(tjs, cd1);
  216. childeq(cd1);
  217. cout<<"test json with rapidjson value"<<endl;
  218. rapidjson::Document doc;
  219. doc.Parse(tjs);
  220. XTest cd2;
  221. xpack::json::decode(doc, cd2);
  222. childeq(cd2);
  223. }
  224. void jd_swap(xpack::JsonData &out) {
  225. xpack::JsonData jd;
  226. xpack::json::decode_file("test.json", jd);
  227. cout<<"==================jsondata swap=================="<<endl;
  228. cout<<"jd.bi:"<<jd["bi"].GetInt()<<endl;
  229. cout<<"jd.vi[1]:"<<jd["vi"][1].GetInt()<<endl;
  230. cout<<"qlst[0].bi:"<<jd["qlst"][size_t(0)]["bi"].GetInt()<<endl;
  231. cout<<"==================jsondata swap=================="<<endl;
  232. out.Swap(jd);
  233. }
  234. TEST(json, jsondata) {
  235. xpack::JsonData jd;
  236. xpack::json::decode_file("test.json", jd);
  237. cout<<"jd.bi:"<<jd["bi"].GetInt()<<endl;
  238. cout<<"jd.vi[1]:"<<jd["vi"][1].GetInt()<<endl;
  239. cout<<"qlst[0].bi:"<<jd["qlst"][size_t(0)]["bi"].GetInt()<<endl;
  240. xpack::JsonData out;
  241. jd_swap(out);
  242. cout<<"qlst[0].bi:"<<out["qlst"][size_t(1)]["bi"].GetInt()<<endl;
  243. }
  244. TEST(xml, testXml) {
  245. XTest cd;
  246. xpack::xml::decode_file("test.xml", cd);
  247. childeq(cd);
  248. string str = xpack::xml::encode(cd, "root");//, 0, 1, '\t');
  249. XTest cd1;
  250. cout<<"xml:"<<endl<<str<<endl;
  251. xpack::xml::decode(str, cd1);
  252. childeq(cd1);
  253. }
  254. #endif
  255. int main(int argc, char *argv[]) {
  256. #ifdef XGTEST
  257. testing::InitGoogleTest(&argc, argv);
  258. return RUN_ALL_TESTS();
  259. #else
  260. XTest j1;
  261. XTest j2;
  262. string s1;
  263. string s2;
  264. cout<<"test json....";
  265. xpack::json::decode_file("test.json", j1);
  266. s1 = xpack::json::encode(j1);
  267. xpack::json::decode(s1, j2);
  268. s2 = xpack::json::encode(j2);
  269. if (0 != s1.compare(s2)) {
  270. cout<<"fail(json not same)"<<endl<<"json1:"<<endl<<s1<<endl<<"json2:"<<endl<<s2<<endl;
  271. } else {
  272. cout<<"done"<<endl;
  273. }
  274. XTest x1;
  275. XTest x2;
  276. cout<<"test xml....";
  277. xpack::xml::decode_file("test.xml", x1);
  278. s1 = xpack::xml::encode(x1, "root");
  279. xpack::xml::decode(s1, x2);
  280. s2 = xpack::xml::encode(x2, "root");
  281. if (0 != s1.compare(s2)) {
  282. cout<<"fail(xml not same)"<<endl<<"xml1:"<<endl<<s1<<endl<<"xml2:"<<endl<<s2<<endl;
  283. } else {
  284. cout<<"done"<<endl;
  285. }
  286. return 0;
  287. #endif
  288. }