JSONTest.cpp 31 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393
  1. //
  2. // JSONTest.cpp
  3. //
  4. // $Id: //poco/1.4/XML/testsuite/src/JSONTest.cpp#1 $
  5. //
  6. // Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
  7. // and Contributors.
  8. //
  9. // Permission is hereby granted, free of charge, to any person or organization
  10. // obtaining a copy of the software and accompanying documentation covered by
  11. // this license (the "Software") to use, reproduce, display, distribute,
  12. // execute, and transmit the Software, and to prepare derivative works of the
  13. // Software, and to permit third-parties to whom the Software is furnished to
  14. // do so, all subject to the following:
  15. //
  16. // The copyright notices in the Software and this entire statement, including
  17. // the above license grant, this restriction and the following disclaimer,
  18. // must be included in all copies of the Software, in whole or in part, and
  19. // all derivative works of the Software, unless such copies or derivative
  20. // works are solely in the form of machine-executable object code generated by
  21. // a source language processor.
  22. //
  23. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  24. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  25. // FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
  26. // SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
  27. // FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
  28. // ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  29. // DEALINGS IN THE SOFTWARE.
  30. //
  31. #include "JSONTest.h"
  32. #include "CppUnit/TestCaller.h"
  33. #include "CppUnit/TestSuite.h"
  34. #include "Poco/JSON/Object.h"
  35. #include "Poco/JSON/Parser.h"
  36. #include "Poco/JSON/Query.h"
  37. #include "Poco/JSON/JSONException.h"
  38. #include "Poco/JSON/Stringifier.h"
  39. #include "Poco/JSON/ParseHandler.h"
  40. #include "Poco/JSON/PrintHandler.h"
  41. #include "Poco/JSON/Template.h"
  42. #include "Poco/Path.h"
  43. #include "Poco/Environment.h"
  44. #include "Poco/File.h"
  45. #include "Poco/FileStream.h"
  46. #include "Poco/Glob.h"
  47. #include "Poco/UTF8Encoding.h"
  48. #include "Poco/Latin1Encoding.h"
  49. #include "Poco/TextConverter.h"
  50. #include <set>
  51. using namespace Poco::JSON;
  52. using namespace Poco::Dynamic;
  53. JSONTest::JSONTest(const std::string& name): CppUnit::TestCase("JSON")
  54. {
  55. }
  56. JSONTest::~JSONTest()
  57. {
  58. }
  59. void JSONTest::setUp()
  60. {
  61. }
  62. void JSONTest::tearDown()
  63. {
  64. }
  65. void JSONTest::testNullProperty()
  66. {
  67. std::string json = "{ \"test\" : null }";
  68. Parser parser;
  69. Var result;
  70. try
  71. {
  72. ParseHandler handler;
  73. parser.setHandler(&handler);
  74. parser.parse(json);
  75. result = handler.result();
  76. }
  77. catch(JSONException& jsone)
  78. {
  79. std::cout << jsone.message() << std::endl;
  80. assert(false);
  81. }
  82. assert(result.type() == typeid(Object::Ptr));
  83. Object::Ptr object = result.extract<Object::Ptr>();
  84. assert(object->isNull("test"));
  85. Var test = object->get("test");
  86. assert(test.isEmpty());
  87. }
  88. void JSONTest::testTrueProperty()
  89. {
  90. std::string json = "{ \"test\" : true }";
  91. Parser parser;
  92. Var result;
  93. try
  94. {
  95. ParseHandler handler;
  96. parser.setHandler(&handler);
  97. parser.parse(json);
  98. result = handler.result();
  99. }
  100. catch(JSONException& jsone)
  101. {
  102. std::cout << jsone.message() << std::endl;
  103. assert(false);
  104. }
  105. assert(result.type() == typeid(Object::Ptr));
  106. Object::Ptr object = result.extract<Object::Ptr>();
  107. Var test = object->get("test");
  108. assert(test.type() == typeid(bool));
  109. bool value = test;
  110. assert(value);
  111. }
  112. void JSONTest::testFalseProperty()
  113. {
  114. std::string json = "{ \"test\" : false }";
  115. Parser parser;
  116. Var result;
  117. try
  118. {
  119. ParseHandler handler;
  120. parser.setHandler(&handler);
  121. parser.parse(json);
  122. result = handler.result();
  123. }
  124. catch(JSONException& jsone)
  125. {
  126. std::cout << jsone.message() << std::endl;
  127. assert(false);
  128. }
  129. assert(result.type() == typeid(Object::Ptr));
  130. Object::Ptr object = result.extract<Object::Ptr>();
  131. Var test = object->get("test");
  132. assert(test.type() == typeid(bool));
  133. bool value = test;
  134. assert(!value);
  135. }
  136. void JSONTest::testNumberProperty()
  137. {
  138. std::string json = "{ \"test\" : 1969 }";
  139. Parser parser;
  140. Var result;
  141. try
  142. {
  143. ParseHandler handler;
  144. parser.setHandler(&handler);
  145. parser.parse(json);
  146. result = handler.result();
  147. }
  148. catch(JSONException& jsone)
  149. {
  150. std::cout << jsone.message() << std::endl;
  151. assert(false);
  152. }
  153. assert(result.type() == typeid(Object::Ptr));
  154. Object::Ptr object = result.extract<Object::Ptr>();
  155. Var test = object->get("test");
  156. assert(test.isInteger());
  157. int value = test;
  158. assert(value == 1969);
  159. }
  160. void JSONTest::testUnsignedNumberProperty()
  161. {
  162. // 4294967295 == unsigned(-1)
  163. std::string json = "{ \"test\" : 4294967295 }";
  164. Parser parser;
  165. Var result;
  166. try
  167. {
  168. ParseHandler handler;
  169. parser.setHandler(&handler);
  170. parser.parse(json);
  171. result = handler.result();
  172. }
  173. catch(JSONException& jsone)
  174. {
  175. std::cout << jsone.message() << std::endl;
  176. assert(false);
  177. }
  178. assert(result.type() == typeid(Object::Ptr));
  179. Object::Ptr object = result.extract<Object::Ptr>();
  180. Var test = object->get("test");
  181. assert(test.isInteger());
  182. unsigned value = test;
  183. assert(value == -1);
  184. }
  185. #if defined(POCO_HAVE_INT64)
  186. void JSONTest::testNumber64Property()
  187. {
  188. std::string json = "{ \"test\" : -5000000000000000 }";
  189. Parser parser;
  190. Var result;
  191. try
  192. {
  193. ParseHandler handler;
  194. parser.setHandler(&handler);
  195. parser.parse(json);
  196. result = handler.result();
  197. }
  198. catch(JSONException& jsone)
  199. {
  200. std::cout << jsone.message() << std::endl;
  201. assert(false);
  202. }
  203. assert(result.type() == typeid(Object::Ptr));
  204. Object::Ptr object = result.extract<Object::Ptr>();
  205. Var test = object->get("test");
  206. assert(test.isInteger());
  207. Poco::Int64 value = test;
  208. assert(value == -5000000000000000);
  209. }
  210. void JSONTest::testUnsignedNumber64Property()
  211. {
  212. // 18446744073709551615 == UInt64(-1)
  213. std::string json = "{ \"test\" : 18446744073709551615 }";
  214. Parser parser;
  215. Var result;
  216. try
  217. {
  218. ParseHandler handler;
  219. parser.setHandler(&handler);
  220. parser.parse(json);
  221. result = handler.result();
  222. }
  223. catch(JSONException& jsone)
  224. {
  225. std::cout << jsone.message() << std::endl;
  226. assert(false);
  227. }
  228. assert(result.type() == typeid(Object::Ptr));
  229. Object::Ptr object = result.extract<Object::Ptr>();
  230. Var test = object->get("test");
  231. assert(test.isInteger());
  232. Poco::UInt64 value = test;
  233. assert(value == -1);
  234. }
  235. #endif
  236. void JSONTest::testStringProperty()
  237. {
  238. std::string json = "{ \"test\" : \"value\" }";
  239. Parser parser;
  240. Var result;
  241. try
  242. {
  243. ParseHandler handler;
  244. parser.setHandler(&handler);
  245. parser.parse(json);
  246. result = handler.result();
  247. }
  248. catch(JSONException& jsone)
  249. {
  250. std::cout << jsone.message() << std::endl;
  251. assert(false);
  252. }
  253. assert(result.type() == typeid(Object::Ptr));
  254. Object::Ptr object = result.extract<Object::Ptr>();
  255. Var test = object->get("test");
  256. assert(test.isString());
  257. std::string value = test.convert<std::string>();
  258. assert(value.compare("value") == 0);
  259. }
  260. void JSONTest::testEmptyObject()
  261. {
  262. std::string json = "{}";
  263. Parser parser;
  264. Var result;
  265. try
  266. {
  267. ParseHandler handler;
  268. parser.setHandler(&handler);
  269. parser.parse(json);
  270. result = handler.result();
  271. }
  272. catch(JSONException& jsone)
  273. {
  274. std::cout << jsone.message() << std::endl;
  275. assert(false);
  276. }
  277. assert(result.type() == typeid(Object::Ptr));
  278. Object::Ptr object = result.extract<Object::Ptr>();
  279. assert(object->size() == 0);
  280. }
  281. void JSONTest::testDoubleProperty()
  282. {
  283. std::string json = "{ \"test\" : 123.45 }";
  284. Parser parser;
  285. Var result;
  286. try
  287. {
  288. ParseHandler handler;
  289. parser.setHandler(&handler);
  290. parser.parse(json);
  291. result = handler.result();
  292. }
  293. catch(JSONException& jsone)
  294. {
  295. std::cout << jsone.message() << std::endl;
  296. assert(false);
  297. }
  298. assert(result.type() == typeid(Object::Ptr));
  299. Object::Ptr object = result.extract<Object::Ptr>();
  300. Var test = object->get("test");
  301. assert(test.isNumeric());
  302. double value = test;
  303. assert(value == 123.45);
  304. }
  305. void JSONTest::testDouble2Property()
  306. {
  307. std::string json = "{ \"test\" : 12e34 }";
  308. Parser parser;
  309. Var result;
  310. try
  311. {
  312. ParseHandler handler;
  313. parser.setHandler(&handler);
  314. parser.parse(json);
  315. result = handler.result();
  316. }
  317. catch(JSONException& jsone)
  318. {
  319. std::cout << jsone.message() << std::endl;
  320. assert(false);
  321. }
  322. assert(result.type() == typeid(Object::Ptr));
  323. Object::Ptr object = result.extract<Object::Ptr>();
  324. Var test = object->get("test");
  325. assert(test.isNumeric());
  326. double value = test;
  327. assert(value >= 1.99e34 && value <= 12.01e34);
  328. }
  329. void JSONTest::testDouble3Property()
  330. {
  331. std::string json = "{ \"test\" : 12e-34 }";
  332. Parser parser;
  333. Var result;
  334. try
  335. {
  336. ParseHandler handler;
  337. parser.setHandler(&handler);
  338. parser.parse(json);
  339. result = handler.result();
  340. }
  341. catch(JSONException& jsone)
  342. {
  343. std::cout << jsone.message() << std::endl;
  344. assert(false);
  345. }
  346. assert(result.type() == typeid(Object::Ptr));
  347. Object::Ptr object = result.extract<Object::Ptr>();
  348. Var test = object->get("test");
  349. assert(test.isNumeric());
  350. double value = test;
  351. assert(value == 12e-34);
  352. }
  353. void JSONTest::testObjectProperty()
  354. {
  355. std::string json = "{ \"test\" : { \"property\" : \"value\" } }";
  356. Parser parser;
  357. Var result;
  358. try
  359. {
  360. ParseHandler handler;
  361. parser.setHandler(&handler);
  362. parser.parse(json);
  363. result = handler.result();
  364. }
  365. catch(JSONException& jsone)
  366. {
  367. std::cout << jsone.message() << std::endl;
  368. assert(false);
  369. }
  370. assert(result.type() == typeid(Object::Ptr));
  371. Object::Ptr object = result.extract<Object::Ptr>();
  372. assert (object->isObject("test"));
  373. assert (!object->isArray("test"));
  374. Var test = object->get("test");
  375. assert(test.type() == typeid(Object::Ptr));
  376. object = test.extract<Object::Ptr>();
  377. test = object->get("property");
  378. assert(test.isString());
  379. std::string value = test.convert<std::string>();
  380. assert(value.compare("value") == 0);
  381. }
  382. void JSONTest::testObjectArray()
  383. {
  384. std::string json = "{ \"test\" : { \"test1\" : [1, 2, 3], \"test2\" : 4 } }";
  385. Parser parser;
  386. Var result;
  387. try
  388. {
  389. ParseHandler handler;
  390. parser.setHandler(&handler);
  391. parser.parse(json);
  392. result = handler.result();
  393. }
  394. catch(JSONException& jsone)
  395. {
  396. std::cout << jsone.message() << std::endl;
  397. assert(false);
  398. }
  399. assert(result.type() == typeid(Object::Ptr));
  400. Object::Ptr object = result.extract<Object::Ptr>();
  401. assert(object->isObject("test"));
  402. object = object->getObject("test");
  403. assert(!object->isObject("test1"));
  404. assert(object->isArray("test1"));
  405. assert(!object->isObject("test2"));
  406. assert(!object->isArray("test2"));
  407. }
  408. void JSONTest::testArrayOfObjects()
  409. {
  410. std::string json = "[ {\"test\" : 0}, { \"test1\" : [1, 2, 3], \"test2\" : 4 } ]";
  411. Parser parser;
  412. Var result;
  413. try
  414. {
  415. ParseHandler handler;
  416. parser.setHandler(&handler);
  417. parser.parse(json);
  418. result = handler.result();
  419. }
  420. catch(JSONException& jsone)
  421. {
  422. std::cout << jsone.message() << std::endl;
  423. assert(false);
  424. }
  425. assert(result.type() == typeid(Array::Ptr));
  426. Array::Ptr arr = result.extract<Array::Ptr>();
  427. Object::Ptr object = arr->getObject(0);
  428. assert (object->getValue<int>("test") == 0);
  429. object = arr->getObject(1);
  430. arr = object->getArray("test1");
  431. result = arr->get(0);
  432. assert (result == 1);
  433. }
  434. void JSONTest::testEmptyArray()
  435. {
  436. std::string json = "[]";
  437. Parser parser;
  438. Var result;
  439. try
  440. {
  441. ParseHandler handler;
  442. parser.setHandler(&handler);
  443. parser.parse(json);
  444. result = handler.result();
  445. }
  446. catch(JSONException& jsone)
  447. {
  448. std::cout << jsone.message() << std::endl;
  449. assert(false);
  450. }
  451. assert(result.type() == typeid(Array::Ptr));
  452. Array::Ptr array = result.extract<Array::Ptr>();
  453. assert(array->size() == 0);
  454. }
  455. void JSONTest::testNestedArray()
  456. {
  457. std::string json = "[[[[]]]]";
  458. Parser parser;
  459. Var result;
  460. try
  461. {
  462. ParseHandler handler;
  463. parser.setHandler(&handler);
  464. parser.parse(json);
  465. result = handler.result();
  466. }
  467. catch(JSONException& jsone)
  468. {
  469. std::cout << jsone.message() << std::endl;
  470. assert(false);
  471. }
  472. assert(result.type() == typeid(Array::Ptr));
  473. Array::Ptr array = result.extract<Array::Ptr>();
  474. assert(array->size() == 1);
  475. }
  476. void JSONTest::testNullElement()
  477. {
  478. std::string json = "[ null ]";
  479. Parser parser;
  480. Var result;
  481. try
  482. {
  483. ParseHandler handler;
  484. parser.setHandler(&handler);
  485. parser.parse(json);
  486. result = handler.result();
  487. }
  488. catch(JSONException& jsone)
  489. {
  490. std::cout << jsone.message() << std::endl;
  491. assert(false);
  492. }
  493. assert(result.type() == typeid(Array::Ptr));
  494. Array::Ptr array = result.extract<Array::Ptr>();
  495. assert(array->isNull(0));
  496. Var test = array->get(0);
  497. assert(test.isEmpty());
  498. }
  499. void JSONTest::testTrueElement()
  500. {
  501. std::string json = "[ true ]";
  502. Parser parser;
  503. Var result;
  504. try
  505. {
  506. ParseHandler handler;
  507. parser.setHandler(&handler);
  508. parser.parse(json);
  509. result = handler.result();
  510. }
  511. catch(JSONException& jsone)
  512. {
  513. std::cout << jsone.message() << std::endl;
  514. assert(false);
  515. }
  516. assert(result.type() == typeid(Array::Ptr));
  517. Array::Ptr array = result.extract<Array::Ptr>();
  518. Var test = array->get(0);
  519. assert(test.type() == typeid(bool));
  520. bool value = test;
  521. assert(value);
  522. }
  523. void JSONTest::testFalseElement()
  524. {
  525. std::string json = "[ false ]";
  526. Parser parser;
  527. Var result;
  528. try
  529. {
  530. ParseHandler handler;
  531. parser.setHandler(&handler);
  532. parser.parse(json);
  533. result = handler.result();
  534. }
  535. catch(JSONException& jsone)
  536. {
  537. std::cout << jsone.message() << std::endl;
  538. assert(false);
  539. }
  540. assert(result.type() == typeid(Array::Ptr));
  541. Array::Ptr array = result.extract<Array::Ptr>();
  542. Var test = array->get(0);
  543. assert(test.type() == typeid(bool));
  544. bool value = test;
  545. assert(!value);
  546. }
  547. void JSONTest::testNumberElement()
  548. {
  549. std::string json = "[ 1969 ]";
  550. Parser parser;
  551. Var result;
  552. try
  553. {
  554. ParseHandler handler;
  555. parser.setHandler(&handler);
  556. parser.parse(json);
  557. result = handler.result();
  558. }
  559. catch(JSONException& jsone)
  560. {
  561. std::cout << jsone.message() << std::endl;
  562. assert(false);
  563. }
  564. assert(result.type() == typeid(Array::Ptr));
  565. Array::Ptr array = result.extract<Array::Ptr>();
  566. Var test = array->get(0);
  567. assert(test.isInteger());
  568. int value = test;
  569. assert(value == 1969);
  570. }
  571. void JSONTest::testStringElement()
  572. {
  573. std::string json = "[ \"value\" ]";
  574. Parser parser;
  575. Var result;
  576. try
  577. {
  578. ParseHandler handler;
  579. parser.setHandler(&handler);
  580. parser.parse(json);
  581. result = handler.result();
  582. }
  583. catch(JSONException& jsone)
  584. {
  585. std::cout << jsone.message() << std::endl;
  586. assert(false);
  587. }
  588. assert(result.type() == typeid(Array::Ptr));
  589. Array::Ptr array = result.extract<Array::Ptr>();
  590. Var test = array->get(0);
  591. assert(test.isString());
  592. std::string value = test.convert<std::string>();
  593. assert(value.compare("value") == 0);
  594. }
  595. void JSONTest::testEmptyObjectElement()
  596. {
  597. std::string json = "[{}]";
  598. Parser parser;
  599. Var result;
  600. try
  601. {
  602. ParseHandler handler;
  603. parser.setHandler(&handler);
  604. parser.parse(json);
  605. result = handler.result();
  606. }
  607. catch(JSONException& jsone)
  608. {
  609. std::cout << jsone.message() << std::endl;
  610. assert(false);
  611. }
  612. assert(result.type() == typeid(Array::Ptr));
  613. Array::Ptr array = result.extract<Array::Ptr>();
  614. Object::Ptr object = array->getObject(0);
  615. assert(object->size() == 0);
  616. }
  617. void JSONTest::testDoubleElement()
  618. {
  619. std::string json = "[ 123.45 ]";
  620. Parser parser;
  621. Var result;
  622. try
  623. {
  624. ParseHandler handler;
  625. parser.setHandler(&handler);
  626. parser.parse(json);
  627. result = handler.result();
  628. }
  629. catch(JSONException& jsone)
  630. {
  631. std::cout << jsone.message() << std::endl;
  632. assert(false);
  633. }
  634. assert(result.type() == typeid(Array::Ptr));
  635. Array::Ptr array = result.extract<Array::Ptr>();
  636. Var test = array->get(0);
  637. assert(test.isNumeric());
  638. double value = test;
  639. assert(value == 123.45);
  640. }
  641. void JSONTest::testOptValue()
  642. {
  643. std::string json = "{ }";
  644. Parser parser;
  645. Var result;
  646. try
  647. {
  648. ParseHandler handler;
  649. parser.setHandler(&handler);
  650. parser.parse(json);
  651. result = handler.result();
  652. }
  653. catch(JSONException& jsone)
  654. {
  655. std::cout << jsone.message() << std::endl;
  656. assert(false);
  657. }
  658. assert(result.type() == typeid(Object::Ptr));
  659. Object::Ptr object = result.extract<Object::Ptr>();
  660. int n = object->optValue("test", 123);
  661. assert(n == 123);
  662. }
  663. void JSONTest::testQuery()
  664. {
  665. std::string json = "{ \"name\" : \"Franky\", \"children\" : [ \"Jonas\", \"Ellen\" ] }";
  666. Parser parser;
  667. Var result;
  668. try
  669. {
  670. ParseHandler handler;
  671. parser.setHandler(&handler);
  672. parser.parse(json);
  673. result = handler.result();
  674. }
  675. catch(JSONException& jsone)
  676. {
  677. std::cout << jsone.message() << std::endl;
  678. assert(false);
  679. }
  680. assert(result.type() == typeid(Object::Ptr));
  681. Query query(result);
  682. std::string firstChild = query.findValue("children[0]", "");
  683. assert(firstChild.compare("Jonas") == 0);
  684. }
  685. void JSONTest::testPrintHandler()
  686. {
  687. std::string json = "{ \"name\" : \"Homer\", \"age\" : 38, \"wife\" : \"Marge\", \"age\" : 36, \"children\" : [ \"Bart\", \"Lisa\", \"Maggie\" ] }";
  688. Parser parser;
  689. std::ostringstream ostr;
  690. PrintHandler handler(ostr);
  691. parser.setHandler(&handler);
  692. parser.parse(json);
  693. assert (ostr.str() == "{\"name\":\"Homer\",\"age\":38,\"wife\":\"Marge\",\"age\":36,\"children\":[\"Bart\",\"Lisa\",\"Maggie\"]}");
  694. handler.setIndent(1);
  695. ostr.str("");
  696. parser.parse(json);
  697. assert (ostr.str() == "{\n"
  698. " \"name\" : \"Homer\",\n"
  699. " \"age\" : 38,\n"
  700. " \"wife\" : \"Marge\",\n"
  701. " \"age\" : 36,\n"
  702. " \"children\" : [\n"
  703. " \"Bart\",\n"
  704. " \"Lisa\",\n"
  705. " \"Maggie\"\n"
  706. " ]\n"
  707. "}"
  708. );
  709. handler.setIndent(2);
  710. ostr.str("");
  711. parser.parse(json);
  712. assert (ostr.str() == "{\n"
  713. " \"name\" : \"Homer\",\n"
  714. " \"age\" : 38,\n"
  715. " \"wife\" : \"Marge\",\n"
  716. " \"age\" : 36,\n"
  717. " \"children\" : [\n"
  718. " \"Bart\",\n"
  719. " \"Lisa\",\n"
  720. " \"Maggie\"\n"
  721. " ]\n"
  722. "}"
  723. );
  724. handler.setIndent(4);
  725. ostr.str("");
  726. parser.parse(json);
  727. assert (ostr.str() == "{\n"
  728. " \"name\" : \"Homer\",\n"
  729. " \"age\" : 38,\n"
  730. " \"wife\" : \"Marge\",\n"
  731. " \"age\" : 36,\n"
  732. " \"children\" : [\n"
  733. " \"Bart\",\n"
  734. " \"Lisa\",\n"
  735. " \"Maggie\"\n"
  736. " ]\n"
  737. "}"
  738. );
  739. }
  740. void JSONTest::testStringify()
  741. {
  742. std::string json = "{ \"Simpsons\" : { \"husband\" : { \"name\" : \"Homer\" , \"age\" : 38 }, \"wife\" : { \"name\" : \"Marge\", \"age\" : 36 }, "
  743. "\"children\" : [ \"Bart\", \"Lisa\", \"Maggie\" ], "
  744. "\"address\" : { \"number\" : 742, \"street\" : \"Evergreen Terrace\", \"town\" : \"Springfield\" } } }";
  745. Parser parser;
  746. Var result;
  747. try
  748. {
  749. ParseHandler handler;
  750. parser.setHandler(&handler);
  751. parser.parse(json);
  752. result = handler.result();
  753. }
  754. catch(JSONException& jsone)
  755. {
  756. std::cout << jsone.message() << std::endl;
  757. assert(false);
  758. }
  759. assert(result.type() == typeid(Object::Ptr));
  760. std::ostringstream ostr;
  761. Stringifier::condense(result, ostr);
  762. std::string str = "{"
  763. "\"Simpsons\":{"
  764. "\"address\":{"
  765. "\"number\":742,"
  766. "\"street\":\"Evergreen Terrace\","
  767. "\"town\":\"Springfield\""
  768. "},"
  769. "\"children\":["
  770. "\"Bart\","
  771. "\"Lisa\","
  772. "\"Maggie\"],"
  773. "\"husband\":{"
  774. "\"age\":38,"
  775. "\"name\":\"Homer\""
  776. "},"
  777. "\"wife\":{"
  778. "\"age\":36,\"name\":\"Marge\""
  779. "}}}";
  780. assert (ostr.str() == str);
  781. ostr.str("");
  782. Stringifier::stringify(result, ostr);
  783. assert (ostr.str() == str);
  784. ostr.str("");
  785. Stringifier::stringify(result, ostr, 1);
  786. str = "{\n"
  787. " \"Simpsons\" : {\n"
  788. " \"address\" : {\n"
  789. " \"number\" : 742,\n"
  790. " \"street\" : \"Evergreen Terrace\",\n"
  791. " \"town\" : \"Springfield\"\n"
  792. " },\n"
  793. " \"children\" : [\n"
  794. " \"Bart\",\n"
  795. " \"Lisa\",\n"
  796. " \"Maggie\"\n"
  797. " ],\n"
  798. " \"husband\" : {\n"
  799. " \"age\" : 38,\n"
  800. " \"name\" : \"Homer\"\n"
  801. " },\n"
  802. " \"wife\" : {\n"
  803. " \"age\" : 36,\n"
  804. " \"name\" : \"Marge\"\n"
  805. " }\n"
  806. " }\n"
  807. "}";
  808. assert (ostr.str() == str);
  809. ostr.str("");
  810. Stringifier::stringify(result, ostr, 2);
  811. str = "{\n"
  812. " \"Simpsons\" : {\n"
  813. " \"address\" : {\n"
  814. " \"number\" : 742,\n"
  815. " \"street\" : \"Evergreen Terrace\",\n"
  816. " \"town\" : \"Springfield\"\n"
  817. " },\n"
  818. " \"children\" : [\n"
  819. " \"Bart\",\n"
  820. " \"Lisa\",\n"
  821. " \"Maggie\"\n"
  822. " ],\n"
  823. " \"husband\" : {\n"
  824. " \"age\" : 38,\n"
  825. " \"name\" : \"Homer\"\n"
  826. " },\n"
  827. " \"wife\" : {\n"
  828. " \"age\" : 36,\n"
  829. " \"name\" : \"Marge\"\n"
  830. " }\n"
  831. " }\n"
  832. "}";
  833. assert (ostr.str() == str);
  834. ostr.str("");
  835. Stringifier::stringify(result, ostr, 4);
  836. str = "{\n"
  837. " \"Simpsons\" : {\n"
  838. " \"address\" : {\n"
  839. " \"number\" : 742,\n"
  840. " \"street\" : \"Evergreen Terrace\",\n"
  841. " \"town\" : \"Springfield\"\n"
  842. " },\n"
  843. " \"children\" : [\n"
  844. " \"Bart\",\n"
  845. " \"Lisa\",\n"
  846. " \"Maggie\"\n"
  847. " ],\n"
  848. " \"husband\" : {\n"
  849. " \"age\" : 38,\n"
  850. " \"name\" : \"Homer\"\n"
  851. " },\n"
  852. " \"wife\" : {\n"
  853. " \"age\" : 36,\n"
  854. " \"name\" : \"Marge\"\n"
  855. " }\n"
  856. " }\n"
  857. "}";
  858. assert (ostr.str() == str);
  859. }
  860. void JSONTest::testStringifyPreserveOrder()
  861. {
  862. std::string json = "{ \"Simpsons\" : { \"husband\" : { \"name\" : \"Homer\" , \"age\" : 38 }, \"wife\" : { \"name\" : \"Marge\", \"age\" : 36 }, "
  863. "\"children\" : [ \"Bart\", \"Lisa\", \"Maggie\" ], "
  864. "\"address\" : { \"number\" : 742, \"street\" : \"Evergreen Terrace\", \"town\" : \"Springfield\" } } }";
  865. Parser parser;
  866. Var result;
  867. try
  868. {
  869. ParseHandler handler(true);
  870. parser.setHandler(&handler);
  871. parser.parse(json);
  872. result = handler.result();
  873. }
  874. catch(JSONException& jsone)
  875. {
  876. std::cout << jsone.message() << std::endl;
  877. assert(false);
  878. }
  879. assert(result.type() == typeid(Object::Ptr));
  880. std::ostringstream ostr;
  881. Stringifier::condense(result, ostr);
  882. assert (ostr.str() == "{\"Simpsons\":{\"husband\":{\"name\":\"Homer\",\"age\":38},\"wife\":{\"name\":\"Marge\",\"age\":36},"
  883. "\"children\":[\"Bart\",\"Lisa\",\"Maggie\"],"
  884. "\"address\":{\"number\":742,\"street\":\"Evergreen Terrace\",\"town\":\"Springfield\"}}}");
  885. ostr.str("");
  886. Stringifier::stringify(result, ostr);
  887. assert (ostr.str() == "{\"Simpsons\":{\"husband\":{\"name\":\"Homer\",\"age\":38},\"wife\":{\"name\":\"Marge\",\"age\":36},"
  888. "\"children\":[\"Bart\",\"Lisa\",\"Maggie\"],"
  889. "\"address\":{\"number\":742,\"street\":\"Evergreen Terrace\",\"town\":\"Springfield\"}}}");
  890. ostr.str("");
  891. Stringifier::stringify(result, ostr, 1);
  892. assert (ostr.str() == "{\n"
  893. " \"Simpsons\" : {\n"
  894. " \"husband\" : {\n"
  895. " \"name\" : \"Homer\",\n"
  896. " \"age\" : 38\n"
  897. " },\n"
  898. " \"wife\" : {\n"
  899. " \"name\" : \"Marge\",\n"
  900. " \"age\" : 36\n"
  901. " },\n"
  902. " \"children\" : [\n"
  903. " \"Bart\",\n"
  904. " \"Lisa\",\n"
  905. " \"Maggie\"\n"
  906. " ],\n"
  907. " \"address\" : {\n"
  908. " \"number\" : 742,\n"
  909. " \"street\" : \"Evergreen Terrace\",\n"
  910. " \"town\" : \"Springfield\"\n"
  911. " }\n"
  912. " }\n"
  913. "}");
  914. ostr.str("");
  915. Stringifier::stringify(result, ostr, 2);
  916. assert (ostr.str() == "{\n"
  917. " \"Simpsons\" : {\n"
  918. " \"husband\" : {\n"
  919. " \"name\" : \"Homer\",\n"
  920. " \"age\" : 38\n"
  921. " },\n"
  922. " \"wife\" : {\n"
  923. " \"name\" : \"Marge\",\n"
  924. " \"age\" : 36\n"
  925. " },\n"
  926. " \"children\" : [\n"
  927. " \"Bart\",\n"
  928. " \"Lisa\",\n"
  929. " \"Maggie\"\n"
  930. " ],\n"
  931. " \"address\" : {\n"
  932. " \"number\" : 742,\n"
  933. " \"street\" : \"Evergreen Terrace\",\n"
  934. " \"town\" : \"Springfield\"\n"
  935. " }\n"
  936. " }\n"
  937. "}");
  938. ostr.str("");
  939. Stringifier::stringify(result, ostr, 4);
  940. assert (ostr.str() == "{\n"
  941. " \"Simpsons\" : {\n"
  942. " \"husband\" : {\n"
  943. " \"name\" : \"Homer\",\n"
  944. " \"age\" : 38\n"
  945. " },\n"
  946. " \"wife\" : {\n"
  947. " \"name\" : \"Marge\",\n"
  948. " \"age\" : 36\n"
  949. " },\n"
  950. " \"children\" : [\n"
  951. " \"Bart\",\n"
  952. " \"Lisa\",\n"
  953. " \"Maggie\"\n"
  954. " ],\n"
  955. " \"address\" : {\n"
  956. " \"number\" : 742,\n"
  957. " \"street\" : \"Evergreen Terrace\",\n"
  958. " \"town\" : \"Springfield\"\n"
  959. " }\n"
  960. " }\n"
  961. "}");
  962. }
  963. void JSONTest::testValidJanssonFiles()
  964. {
  965. Poco::Path pathPattern(getTestFilesPath("valid"));
  966. std::set<std::string> paths;
  967. Poco::Glob::glob(pathPattern, paths);
  968. for(std::set<std::string>::iterator it = paths.begin(); it != paths.end(); ++it)
  969. {
  970. Poco::Path filePath(*it, "input");
  971. if ( filePath.isFile() )
  972. {
  973. Poco::File inputFile(filePath);
  974. if ( inputFile.exists() )
  975. {
  976. Poco::FileInputStream fis(filePath.toString());
  977. std::cout << filePath.toString() << std::endl;
  978. Parser parser;
  979. Var result;
  980. try
  981. {
  982. ParseHandler handler;
  983. parser.setHandler(&handler);
  984. parser.parse(fis);
  985. result = handler.result();
  986. std::cout << "Ok!" << std::endl;
  987. }
  988. catch(JSONException& jsone)
  989. {
  990. std::string err = jsone.displayText();
  991. std::cout << "Failed:" << err << std::endl;
  992. fail (err);
  993. }
  994. catch(Poco::Exception& e)
  995. {
  996. std::string err = e.displayText();
  997. std::cout << "Failed:" << err << std::endl;
  998. fail (err);
  999. }
  1000. }
  1001. }
  1002. }
  1003. }
  1004. void JSONTest::testInvalidJanssonFiles()
  1005. {
  1006. Poco::Path pathPattern(getTestFilesPath("invalid"));
  1007. std::set<std::string> paths;
  1008. Poco::Glob::glob(pathPattern, paths);
  1009. for(std::set<std::string>::iterator it = paths.begin(); it != paths.end(); ++it)
  1010. {
  1011. Poco::Path filePath(*it, "input");
  1012. if ( filePath.isFile() )
  1013. {
  1014. Poco::File inputFile(filePath);
  1015. if ( inputFile.exists() )
  1016. {
  1017. Poco::FileInputStream fis(filePath.toString());
  1018. std::cout << filePath.toString() << std::endl;
  1019. Parser parser;
  1020. Var result;
  1021. try
  1022. {
  1023. ParseHandler handler;
  1024. parser.setHandler(&handler);
  1025. parser.parse(fis);
  1026. result = handler.result();
  1027. // We shouldn't get here.
  1028. std::cout << "We didn't get an exception. This is the result: " << result.convert<std::string>() << std::endl;
  1029. fail(result.convert<std::string>());
  1030. }
  1031. catch(JSONException&)
  1032. {
  1033. continue;
  1034. }
  1035. catch(Poco::SyntaxException&)
  1036. { }
  1037. }
  1038. }
  1039. }
  1040. }
  1041. void JSONTest::testInvalidUnicodeJanssonFiles()
  1042. {
  1043. Poco::Path pathPattern(getTestFilesPath("invalid-unicode"));
  1044. std::set<std::string> paths;
  1045. Poco::Glob::glob(pathPattern, paths);
  1046. for(std::set<std::string>::iterator it = paths.begin(); it != paths.end(); ++it)
  1047. {
  1048. Poco::Path filePath(*it, "input");
  1049. if ( filePath.isFile() )
  1050. {
  1051. Poco::File inputFile(filePath);
  1052. if ( inputFile.exists() )
  1053. {
  1054. Poco::FileInputStream fis(filePath.toString());
  1055. std::cout << filePath.toString() << std::endl;
  1056. Parser parser;
  1057. Var result;
  1058. try
  1059. {
  1060. ParseHandler handler;
  1061. parser.setHandler(&handler);
  1062. parser.parse(fis);
  1063. result = handler.result();
  1064. // We shouldn't get here.
  1065. std::cout << "We didn't get an exception. This is the result: " << result.convert<std::string>() << std::endl;
  1066. fail(result.convert<std::string>());
  1067. }
  1068. catch(JSONException&)
  1069. {
  1070. continue;
  1071. }
  1072. catch(Poco::SyntaxException&)
  1073. { }
  1074. }
  1075. }
  1076. }
  1077. }
  1078. void JSONTest::testTemplate()
  1079. {
  1080. Template tpl;
  1081. tpl.parse("Hello world! From <?= person.name ?>\n<?if person.toOld ?>You're too old<?endif?>\n");
  1082. Object::Ptr data = new Object();
  1083. Object::Ptr person = new Object();
  1084. data->set("person", person);
  1085. person->set("name", "Franky");
  1086. person->set("toOld", true);
  1087. tpl.render(data, std::cout);
  1088. }
  1089. void JSONTest::testUnicode()
  1090. {
  1091. const unsigned char supp[] = {0x61, 0xE1, 0xE9, 0x78, 0xED, 0xF3, 0xFA, 0x0};
  1092. std::string text((const char*) supp);
  1093. std::string json = "{ \"test\" : \"a\\u00E1\\u00E9x\\u00ED\\u00F3\\u00FA\" }";
  1094. Parser parser;
  1095. Var result;
  1096. try
  1097. {
  1098. ParseHandler handler;
  1099. parser.setHandler(&handler);
  1100. parser.parse(json);
  1101. result = handler.result();
  1102. }
  1103. catch(JSONException& jsone)
  1104. {
  1105. std::cout << jsone.message() << std::endl;
  1106. assert(false);
  1107. }
  1108. assert(result.type() == typeid(Object::Ptr));
  1109. Object::Ptr object = result.extract<Object::Ptr>();
  1110. Var test = object->get("test");
  1111. Poco::Latin1Encoding latin1;
  1112. Poco::UTF8Encoding utf8;
  1113. Poco::TextConverter converter(latin1, utf8);
  1114. std::string original;
  1115. converter.convert(text, original);
  1116. assert(test.convert<std::string>() == original);
  1117. }
  1118. std::string JSONTest::getTestFilesPath(const std::string& type)
  1119. {
  1120. std::ostringstream ostr;
  1121. ostr << "data/" << type << '/';
  1122. std::string validDir(ostr.str());
  1123. Poco::Path pathPattern(validDir);
  1124. if (Poco::File(pathPattern).exists())
  1125. {
  1126. validDir += '*';
  1127. return validDir;
  1128. }
  1129. ostr.str("");
  1130. ostr << "/JSON/testsuite/data/" << type << '/';
  1131. validDir = Poco::Environment::get("POCO_BASE") + ostr.str();
  1132. pathPattern = validDir;
  1133. if (Poco::File(pathPattern).exists())
  1134. validDir += '*';
  1135. else
  1136. {
  1137. std::cout << "Can't find " << validDir << std::endl;
  1138. throw Poco::NotFoundException("cannot locate directory containing valid JSON test files");
  1139. }
  1140. return validDir;
  1141. }
  1142. CppUnit::Test* JSONTest::suite()
  1143. {
  1144. CppUnit::TestSuite* pSuite = new CppUnit::TestSuite("JSONTest");
  1145. CppUnit_addTest(pSuite, JSONTest, testNullProperty);
  1146. CppUnit_addTest(pSuite, JSONTest, testTrueProperty);
  1147. CppUnit_addTest(pSuite, JSONTest, testFalseProperty);
  1148. CppUnit_addTest(pSuite, JSONTest, testNumberProperty);
  1149. CppUnit_addTest(pSuite, JSONTest, testUnsignedNumberProperty);
  1150. #if defined(POCO_HAVE_INT64)
  1151. CppUnit_addTest(pSuite, JSONTest, testNumber64Property);
  1152. CppUnit_addTest(pSuite, JSONTest, testUnsignedNumber64Property);
  1153. #endif
  1154. CppUnit_addTest(pSuite, JSONTest, testStringProperty);
  1155. CppUnit_addTest(pSuite, JSONTest, testEmptyObject);
  1156. CppUnit_addTest(pSuite, JSONTest, testDoubleProperty);
  1157. CppUnit_addTest(pSuite, JSONTest, testDouble2Property);
  1158. CppUnit_addTest(pSuite, JSONTest, testDouble3Property);
  1159. CppUnit_addTest(pSuite, JSONTest, testObjectProperty);
  1160. CppUnit_addTest(pSuite, JSONTest, testObjectArray);
  1161. CppUnit_addTest(pSuite, JSONTest, testArrayOfObjects);
  1162. CppUnit_addTest(pSuite, JSONTest, testEmptyArray);
  1163. CppUnit_addTest(pSuite, JSONTest, testNestedArray);
  1164. CppUnit_addTest(pSuite, JSONTest, testNullElement);
  1165. CppUnit_addTest(pSuite, JSONTest, testTrueElement);
  1166. CppUnit_addTest(pSuite, JSONTest, testFalseElement);
  1167. CppUnit_addTest(pSuite, JSONTest, testNumberElement);
  1168. CppUnit_addTest(pSuite, JSONTest, testStringElement);
  1169. CppUnit_addTest(pSuite, JSONTest, testEmptyObjectElement);
  1170. CppUnit_addTest(pSuite, JSONTest, testDoubleElement);
  1171. CppUnit_addTest(pSuite, JSONTest, testOptValue);
  1172. CppUnit_addTest(pSuite, JSONTest, testQuery);
  1173. CppUnit_addTest(pSuite, JSONTest, testPrintHandler);
  1174. CppUnit_addTest(pSuite, JSONTest, testStringify);
  1175. CppUnit_addTest(pSuite, JSONTest, testStringifyPreserveOrder);
  1176. CppUnit_addTest(pSuite, JSONTest, testValidJanssonFiles);
  1177. CppUnit_addTest(pSuite, JSONTest, testInvalidJanssonFiles);
  1178. CppUnit_addTest(pSuite, JSONTest, testInvalidUnicodeJanssonFiles);
  1179. CppUnit_addTest(pSuite, JSONTest, testTemplate);
  1180. CppUnit_addTest(pSuite, JSONTest, testUnicode);
  1181. return pSuite;
  1182. }