TestInspectors.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. #include "TestSuite.h"
  2. #include "../Source/JSONNode.h"
  3. #include <cstdlib>
  4. void TestSuite::TestInspectors(void){
  5. UnitTest::SetPrefix("TestInspectors.cpp - Inspectors");
  6. #ifdef JSON_LIBRARY
  7. JSONNODE * test = json_new(JSON_NULL);
  8. assertEquals(json_type(test), JSON_NULL);
  9. json_char * res = json_as_string(test);
  10. assertCStringSame(res, JSON_TEXT(""));
  11. json_free(res);
  12. assertEquals_Primitive(json_as_int(test), 0);
  13. assertEquals_Primitive(json_as_float(test), 0.0f);
  14. assertEquals(json_as_bool(test), false);
  15. json_set_f(test, 15.5f);
  16. assertEquals(json_type(test), JSON_NUMBER);
  17. #ifdef JSON_CASTABLE
  18. res = json_as_string(test);
  19. assertCStringSame(res, JSON_TEXT("15.5"));
  20. json_free(res);
  21. #endif
  22. assertEquals_Primitive(json_as_int(test), 15);
  23. assertEquals_Primitive(json_as_float(test), 15.5f);
  24. #ifdef JSON_CASTABLE
  25. assertEquals(json_as_bool(test), true);
  26. #endif
  27. json_set_f(test, 0.0f);
  28. assertEquals(json_type(test), JSON_NUMBER);
  29. #ifdef JSON_CASTABLE
  30. res = json_as_string(test);
  31. assertCStringSame(res, JSON_TEXT("0"));
  32. json_free(res);
  33. #endif
  34. assertEquals_Primitive(json_as_int(test), 0);
  35. assertEquals_Primitive(json_as_float(test), 0.0f);
  36. #ifdef JSON_CASTABLE
  37. assertEquals(json_as_bool(test), false);
  38. #endif
  39. json_set_b(test, true);
  40. assertEquals(json_type(test), JSON_BOOL);
  41. #ifdef JSON_CASTABLE
  42. res = json_as_string(test);
  43. assertCStringSame(res, JSON_TEXT("true"));
  44. json_free(res);
  45. assertEquals_Primitive(json_as_int(test), 1);
  46. assertEquals_Primitive(json_as_float(test), 1.0f);
  47. #endif
  48. assertEquals(json_as_bool(test), true);
  49. json_set_b(test, false);
  50. assertEquals(json_type(test), JSON_BOOL);
  51. #ifdef JSON_CASTABLE
  52. res = json_as_string(test);
  53. assertCStringSame(res, JSON_TEXT("false"));
  54. json_free(res);
  55. assertEquals_Primitive(json_as_int(test), 0);
  56. assertEquals_Primitive(json_as_float(test), 0.0f);
  57. #endif
  58. assertEquals(json_as_bool(test), false);
  59. #ifdef JSON_CASTABLE
  60. json_cast(test, JSON_NODE);
  61. assertEquals(json_type(test), JSON_NODE);
  62. assertEquals(json_size(test), 0);
  63. json_push_back(test, json_new_a(JSON_TEXT("hi"), JSON_TEXT("world")));
  64. json_push_back(test, json_new_a(JSON_TEXT("hello"), JSON_TEXT("mars")));
  65. json_push_back(test, json_new_a(JSON_TEXT("salut"), JSON_TEXT("france")));
  66. assertEquals(json_size(test), 3);
  67. TestSuite::testParsingItself(test);
  68. JSONNODE * casted = json_as_array(test);
  69. #ifdef JSON_UNIT_TEST
  70. assertNotEquals(((JSONNode*)casted) -> internal, ((JSONNode*)test) -> internal);
  71. #endif
  72. assertEquals(json_type(casted), JSON_ARRAY);
  73. assertEquals(json_type(test), JSON_NODE);
  74. assertEquals(json_size(test), 3);
  75. assertEquals(json_size(casted), 3);
  76. TestSuite::testParsingItself(casted);
  77. #endif
  78. UnitTest::SetPrefix("TestInspectors.cpp - Location");
  79. #ifdef JSON_CASTABLE
  80. #define CheckAt(parent, locale, text)\
  81. if(JSONNODE * temp = json_at(parent, locale)){\
  82. json_char * _res = json_as_string(temp);\
  83. assertCStringSame(_res, text);\
  84. json_free(_res);\
  85. } else {\
  86. FAIL(std::string("CheckAt: ") + #parent + "[" + #locale + "]");\
  87. }
  88. #define CheckNameAt(parent, locale, text)\
  89. if(JSONNODE * temp = json_at(parent, locale)){\
  90. json_char * _res = json_name(temp);\
  91. assertCStringSame(_res, text);\
  92. json_free(_res);\
  93. } else {\
  94. FAIL(std::string("CheckNameAt: ") + #parent + "[" + #locale + "]");\
  95. }
  96. CheckAt(casted, 0, JSON_TEXT("world"));
  97. CheckAt(casted, 1, JSON_TEXT("mars"));
  98. CheckAt(casted, 2, JSON_TEXT("france"));
  99. CheckNameAt(casted, 0, JSON_TEXT(""));
  100. CheckNameAt(casted, 1, JSON_TEXT(""));
  101. CheckNameAt(casted, 2, JSON_TEXT(""));
  102. CheckAt(test, 0, JSON_TEXT("world"));
  103. CheckAt(test, 1, JSON_TEXT("mars"));
  104. CheckAt(test, 2, JSON_TEXT("france"));
  105. CheckNameAt(test, 0, JSON_TEXT("hi"));
  106. CheckNameAt(test, 1, JSON_TEXT("hello"));
  107. CheckNameAt(test, 2, JSON_TEXT("salut"));
  108. #define CheckGet(parent, locale, text)\
  109. if(JSONNODE * temp = json_get(parent, locale)){\
  110. json_char * _res = json_as_string(temp);\
  111. assertCStringSame(_res, text);\
  112. json_free(_res);\
  113. } else {\
  114. FAIL(std::string("CheckGet: ") + #parent + "[" + #locale + "]");\
  115. }
  116. #ifdef JSON_CASE_INSENSITIVE_FUNCTIONS
  117. #define CheckGetNoCase(parent, locale, text)\
  118. if(JSONNODE * temp = json_get_nocase(parent, locale)){\
  119. json_char * _res = json_as_string(temp);\
  120. assertCStringSame(_res, text);\
  121. json_free(_res);\
  122. } else {\
  123. FAIL(std::string("CheckGetNoCase: ") + #parent + "[" + #locale + "]");\
  124. }
  125. #else
  126. #define CheckGetNoCase(parent, locale, text)
  127. #endif
  128. CheckGet(test, JSON_TEXT("hi"), JSON_TEXT("world"));
  129. CheckGetNoCase(test, JSON_TEXT("HI"), JSON_TEXT("world"));
  130. CheckGet(test, JSON_TEXT("hello"), JSON_TEXT("mars"));
  131. CheckGetNoCase(test, JSON_TEXT("HELLO"), JSON_TEXT("mars"));
  132. CheckGet(test, JSON_TEXT("salut"), JSON_TEXT("france"));
  133. CheckGetNoCase(test, JSON_TEXT("SALUT"), JSON_TEXT("france"));
  134. assertNull(json_get(test, JSON_TEXT("meh")));
  135. #ifdef JSON_CASE_INSENSITIVE_FUNCTIONS
  136. assertNull(json_get_nocase(test, JSON_TEXT("meh")));
  137. #endif
  138. #endif
  139. #ifdef JSON_ITERATORS
  140. #ifdef JSON_CASTABLE
  141. UnitTest::SetPrefix("TestInspectors.cpp - Iterators");
  142. for(JSONNODE_ITERATOR it = json_begin(casted), end = json_end(casted); it != end; ++it){
  143. json_char * _res = json_name(*it);
  144. assertCStringSame(_res, JSON_TEXT(""));
  145. json_free(_res);
  146. }
  147. #endif
  148. #endif
  149. #ifdef JSON_BINARY
  150. UnitTest::SetPrefix("TestInspectors.cpp - Binary");
  151. json_set_binary(test, (const unsigned char *)"Hello World", 11);
  152. assertEquals(json_type(test), JSON_STRING);
  153. json_char * _res = json_as_string(test);
  154. assertCStringSame(_res, JSON_TEXT("SGVsbG8gV29ybGQ="));
  155. json_free(_res);
  156. unsigned long i;
  157. if(char * bin = (char*)json_as_binary(test, &i)){
  158. assertEquals(i, 11);
  159. char * terminated = (char*)std::memcpy(std::malloc(i + 1), bin, i);
  160. terminated[i] = '\0';
  161. assertCStringEquals(terminated, "Hello World");
  162. json_free(bin);
  163. std::free(terminated);
  164. } else {
  165. FAIL("as_binary failed");
  166. }
  167. json_set_a(test, JSON_TEXT("Hello World"));
  168. assertEquals(json_type(test), JSON_STRING);
  169. _res = json_as_string(test);
  170. assertCStringSame(_res, JSON_TEXT("Hello World"));
  171. json_free(_res);
  172. #ifdef JSON_SAFE
  173. assertEquals(json_as_binary(test, &i), 0);
  174. assertEquals(i, 0);
  175. #endif
  176. #endif
  177. json_delete(test);
  178. #ifdef JSON_CASTABLE
  179. json_delete(casted);
  180. #endif
  181. #else
  182. JSONNode test = JSONNode(JSON_NULL);
  183. #ifdef JSON_CASTABLE
  184. assertEquals(test.as_string(), JSON_TEXT(""));
  185. assertEquals(test.as_int(), 0);
  186. assertEquals(test.as_float(), 0.0f);
  187. assertEquals(test.as_bool(), false);
  188. #endif
  189. test = 15.5f;
  190. assertEquals(test.type(), JSON_NUMBER);
  191. #ifdef JSON_CASTABLE
  192. assertEquals(test.as_string(), JSON_TEXT("15.5"));
  193. #endif
  194. assertEquals(test.as_int(), 15);
  195. assertEquals(test.as_float(), 15.5f);
  196. #ifdef JSON_CASTABLE
  197. assertEquals(test.as_bool(), true);
  198. #endif
  199. test = 0.0f;
  200. assertEquals(test.type(), JSON_NUMBER);
  201. #ifdef JSON_CASTABLE
  202. assertEquals(test.as_string(), JSON_TEXT("0"));
  203. #endif
  204. assertEquals(test.as_int(), 0);
  205. assertEquals(test.as_float(), 0.0f);
  206. #ifdef JSON_CASTABLE
  207. assertEquals(test.as_bool(), false);
  208. #endif
  209. test = true;
  210. assertEquals(test.type(), JSON_BOOL);
  211. #ifdef JSON_CASTABLE
  212. assertEquals(test.as_string(), JSON_TEXT("true"));
  213. assertEquals(test.as_int(), 1);
  214. assertEquals(test.as_float(), 1.0f);
  215. #endif
  216. assertEquals(test.as_bool(), true);
  217. test = false;
  218. assertEquals(test.type(), JSON_BOOL);
  219. #ifdef JSON_CASTABLE
  220. assertEquals(test.as_string(), JSON_TEXT("false"));
  221. assertEquals(test.as_int(), 0);
  222. assertEquals(test.as_float(), 0.0f);
  223. #endif
  224. assertEquals(test.as_bool(), false);
  225. #ifdef JSON_CASTABLE
  226. test.cast(JSON_NODE);
  227. #else
  228. test = JSONNode(JSON_NODE);
  229. #endif
  230. assertEquals(test.type(), JSON_NODE);
  231. assertEquals(test.size(), 0);
  232. test.push_back(JSONNode(JSON_TEXT("hi"), JSON_TEXT("world")));
  233. test.push_back(JSONNode(JSON_TEXT("hello"), JSON_TEXT("mars")));
  234. test.push_back(JSONNode(JSON_TEXT("salut"), JSON_TEXT("france")));
  235. assertEquals(test.size(), 3);
  236. TestSuite::testParsingItself(test);
  237. #ifdef JSON_CASTABLE
  238. JSONNode casted = test.as_array();
  239. #ifdef JSON_UNIT_TEST
  240. assertNotEquals(casted.internal, test.internal);
  241. #endif
  242. assertEquals(casted.type(), JSON_ARRAY);
  243. assertEquals(test.type(), JSON_NODE);
  244. assertEquals(test.size(), 3);
  245. assertEquals(casted.size(), 3);
  246. TestSuite::testParsingItself(casted);
  247. #endif
  248. UnitTest::SetPrefix("TestInspectors.cpp - Location");
  249. try {
  250. #ifdef JSON_CASTABLE
  251. assertEquals(casted.at(0), JSON_TEXT("world"));
  252. assertEquals(casted.at(1), JSON_TEXT("mars"));
  253. assertEquals(casted.at(2), JSON_TEXT("france"));
  254. assertEquals(casted.at(0).name(), JSON_TEXT(""));
  255. assertEquals(casted.at(1).name(), JSON_TEXT(""));
  256. assertEquals(casted.at(2).name(), JSON_TEXT(""));
  257. #endif
  258. assertEquals(test.at(0), JSON_TEXT("world"));
  259. assertEquals(test.at(1), JSON_TEXT("mars"));
  260. assertEquals(test.at(2), JSON_TEXT("france"));
  261. assertEquals(test.at(0).name(), JSON_TEXT("hi"));
  262. assertEquals(test.at(1).name(), JSON_TEXT("hello"));
  263. assertEquals(test.at(2).name(), JSON_TEXT("salut"));
  264. } catch (std::out_of_range){
  265. FAIL("exception caught");
  266. }
  267. try {
  268. assertEquals(test.at(JSON_TEXT("hi")), JSON_TEXT("world"));
  269. assertEquals(test.at(JSON_TEXT("hello")), JSON_TEXT("mars"));
  270. assertEquals(test.at(JSON_TEXT("salut")), JSON_TEXT("france"));
  271. #ifdef JSON_CASE_INSENSITIVE_FUNCTIONS
  272. assertEquals(test.at_nocase(JSON_TEXT("SALUT")), JSON_TEXT("france"));
  273. assertEquals(test.at_nocase(JSON_TEXT("HELLO")), JSON_TEXT("mars"));
  274. assertEquals(test.at_nocase(JSON_TEXT("HI")), JSON_TEXT("world"));
  275. #endif
  276. } catch (std::out_of_range){
  277. FAIL("exception caught");
  278. }
  279. assertException(test.at(JSON_TEXT("meh")), std::out_of_range);
  280. #ifdef JSON_CASE_INSENSITIVE_FUNCTIONS
  281. assertException(test.at_nocase(JSON_TEXT("meh")), std::out_of_range);
  282. #endif
  283. assertEquals(test[JSON_TEXT("hi")], json_string(JSON_TEXT("world")));
  284. assertEquals(test[JSON_TEXT("hello")], json_string(JSON_TEXT("mars")));
  285. assertEquals(test[JSON_TEXT("salut")], json_string(JSON_TEXT("france")));
  286. assertEquals(test[0], JSON_TEXT("world"));
  287. assertEquals(test[1], JSON_TEXT("mars"));
  288. assertEquals(test[2], JSON_TEXT("france"));
  289. #ifdef JSON_ITERATORS
  290. #ifdef JSON_CASTABLE
  291. UnitTest::SetPrefix("TestInspectors.cpp - Iterators");
  292. for(JSONNode::iterator it = casted.begin(), end = casted.end(); it != end; ++it){
  293. assertEquals((*it).name(), JSON_TEXT(""));
  294. }
  295. #endif
  296. #endif
  297. #ifdef JSON_BINARY
  298. UnitTest::SetPrefix("TestInspectors.cpp - Binary");
  299. test.set_binary((const unsigned char *)"Hello World", 11);
  300. assertEquals(test.type(), JSON_STRING);
  301. assertEquals(test.as_string(), JSON_TEXT("SGVsbG8gV29ybGQ="));
  302. assertEquals(test.as_binary(), "Hello World");
  303. assertEquals(test.as_binary().size(), 11);
  304. test = JSON_TEXT("Hello World");
  305. assertEquals(test.type(), JSON_STRING);
  306. assertEquals(test.as_string(), JSON_TEXT("Hello World"));
  307. #ifdef JSON_SAFE
  308. assertEquals(test.as_binary(), "");
  309. #endif
  310. #endif
  311. #ifdef JSON_READ_PRIORITY
  312. //This is a regression test for a bug in at()
  313. json_string buffer(JSON_TEXT("{ \"myValue1\" : \"foo\", \"myValue2\" : \"bar\"}"));
  314. JSONNode current = libjson::parse(buffer);
  315. try {
  316. JSONNode & value1 = current[JSON_TEXT("myValue1")];
  317. assertEquals(value1.as_string(), JSON_TEXT("foo"));
  318. JSONNode & value2 = current[JSON_TEXT("myValue2")];
  319. assertEquals(value2.as_string(), JSON_TEXT("bar"));
  320. } catch (...){
  321. assertTrue(false);
  322. }
  323. #endif
  324. #endif
  325. }