filter.cpp 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129
  1. // ArduinoJson - https://arduinojson.org
  2. // Copyright © 2014-2023, Benoit BLANCHON
  3. // MIT License
  4. #include <ArduinoJson.h>
  5. #include <catch.hpp>
  6. #include <sstream>
  7. using namespace ArduinoJson::detail;
  8. TEST_CASE("deserializeMsgPack() filter") {
  9. JsonDocument doc(4096);
  10. DeserializationError error;
  11. JsonDocument filter(200);
  12. DeserializationOption::Filter filterOpt(filter);
  13. SECTION("root is fixmap") {
  14. SECTION("filter = {include:true,ignore:false)") {
  15. filter["include"] = true;
  16. filter["ignore"] = false;
  17. SECTION("input truncated after ignored key") {
  18. error = deserializeMsgPack(doc, "\x82\xA6ignore", 8, filterOpt);
  19. CHECK(error == DeserializationError::IncompleteInput);
  20. CHECK(doc.as<std::string>() == "{}");
  21. CHECK(doc.memoryUsage() == sizeofObject(0));
  22. }
  23. SECTION("input truncated after inside skipped uint 8") {
  24. error = deserializeMsgPack(doc, "\x82\xA6ignore\xCC\x2A\xA7include\x2A",
  25. 9, filterOpt);
  26. CHECK(error == DeserializationError::IncompleteInput);
  27. CHECK(doc.as<std::string>() == "{}");
  28. CHECK(doc.memoryUsage() == sizeofObject(0));
  29. }
  30. SECTION("input truncated after before skipped string size") {
  31. error = deserializeMsgPack(doc, "\x82\xA6ignore\xd9", 9, filterOpt);
  32. CHECK(error == DeserializationError::IncompleteInput);
  33. CHECK(doc.as<std::string>() == "{}");
  34. CHECK(doc.memoryUsage() == sizeofObject(0));
  35. }
  36. SECTION("input truncated after before skipped ext size") {
  37. error = deserializeMsgPack(doc, "\x82\xA6ignore\xC7", 9, filterOpt);
  38. CHECK(error == DeserializationError::IncompleteInput);
  39. CHECK(doc.as<std::string>() == "{}");
  40. CHECK(doc.memoryUsage() == sizeofObject(0));
  41. }
  42. SECTION("skip nil") {
  43. error = deserializeMsgPack(doc, "\x82\xA6ignore\xC0\xA7include\x2A",
  44. filterOpt);
  45. CHECK(error == DeserializationError::Ok);
  46. CHECK(doc.as<std::string>() == "{\"include\":42}");
  47. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  48. }
  49. SECTION("reject 0xc1") {
  50. error = deserializeMsgPack(doc, "\x82\xA6ignore\xC1\xA7include\x2A",
  51. filterOpt);
  52. CHECK(error == DeserializationError::InvalidInput);
  53. }
  54. SECTION("skip false") {
  55. error = deserializeMsgPack(doc, "\x82\xA6ignore\xC2\xA7include\x2A",
  56. filterOpt);
  57. CHECK(error == DeserializationError::Ok);
  58. CHECK(doc.as<std::string>() == "{\"include\":42}");
  59. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  60. }
  61. SECTION("skip true") {
  62. error = deserializeMsgPack(doc, "\x82\xA6ignore\xC3\xA7include\x2A",
  63. filterOpt);
  64. CHECK(error == DeserializationError::Ok);
  65. CHECK(doc.as<std::string>() == "{\"include\":42}");
  66. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  67. }
  68. SECTION("skip positive fixint") {
  69. error = deserializeMsgPack(doc, "\x82\xA6ignore\x2A\xA7include\x2A",
  70. filterOpt);
  71. CHECK(error == DeserializationError::Ok);
  72. CHECK(doc.as<std::string>() == "{\"include\":42}");
  73. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  74. }
  75. SECTION("skip negative fixint") {
  76. error = deserializeMsgPack(doc, "\x82\xA6ignore\xFF\xA7include\x2A",
  77. filterOpt);
  78. CHECK(error == DeserializationError::Ok);
  79. CHECK(doc.as<std::string>() == "{\"include\":42}");
  80. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  81. }
  82. SECTION("skip uint 8") {
  83. error = deserializeMsgPack(doc, "\x82\xA6ignore\xCC\x2A\xA7include\x2A",
  84. filterOpt);
  85. CHECK(error == DeserializationError::Ok);
  86. CHECK(doc.as<std::string>() == "{\"include\":42}");
  87. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  88. }
  89. SECTION("skip int 8") {
  90. error = deserializeMsgPack(doc, "\x82\xA6ignore\xD0\x2A\xA7include\x2A",
  91. filterOpt);
  92. CHECK(error == DeserializationError::Ok);
  93. CHECK(doc.as<std::string>() == "{\"include\":42}");
  94. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  95. }
  96. SECTION("skip uint 16") {
  97. error = deserializeMsgPack(
  98. doc, "\x82\xA6ignore\xcd\x30\x39\xA7include\x2A", filterOpt);
  99. CHECK(error == DeserializationError::Ok);
  100. CHECK(doc.as<std::string>() == "{\"include\":42}");
  101. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  102. }
  103. SECTION("skip int 16") {
  104. error = deserializeMsgPack(
  105. doc, "\x82\xA6ignore\xD1\xCF\xC7\xA7include\x2A", filterOpt);
  106. CHECK(error == DeserializationError::Ok);
  107. CHECK(doc.as<std::string>() == "{\"include\":42}");
  108. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  109. }
  110. SECTION("skip uint 32") {
  111. error = deserializeMsgPack(
  112. doc, "\x82\xA6ignore\xCE\x12\x34\x56\x78\xA7include\x2A",
  113. filterOpt);
  114. CHECK(error == DeserializationError::Ok);
  115. CHECK(doc.as<std::string>() == "{\"include\":42}");
  116. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  117. }
  118. SECTION("skip int 32") {
  119. error = deserializeMsgPack(
  120. doc, "\x82\xA6ignore\xD2\xB6\x69\xFD\x2E\xA7include\x2A",
  121. filterOpt);
  122. CHECK(error == DeserializationError::Ok);
  123. CHECK(doc.as<std::string>() == "{\"include\":42}");
  124. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  125. }
  126. SECTION("skip uint 64") {
  127. error = deserializeMsgPack(
  128. doc,
  129. "\x82\xA6ignore\xCF\x12\x34\x56\x78\x9A\xBC\xDE\xF0\xA7include\x2A",
  130. filterOpt);
  131. CHECK(error == DeserializationError::Ok);
  132. CHECK(doc.as<std::string>() == "{\"include\":42}");
  133. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  134. }
  135. SECTION("skip int 64") {
  136. error = deserializeMsgPack(
  137. doc,
  138. "\x82\xA6ignore\xD3\x12\x34\x56\x78\x9A\xBC\xDE\xF0\xA7include\x2A",
  139. filterOpt);
  140. CHECK(error == DeserializationError::Ok);
  141. CHECK(doc.as<std::string>() == "{\"include\":42}");
  142. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  143. }
  144. SECTION("skip float 32") {
  145. error = deserializeMsgPack(
  146. doc, "\x82\xA6ignore\xCA\x40\x48\xF5\xC3\xA7include\x2A",
  147. filterOpt);
  148. CHECK(error == DeserializationError::Ok);
  149. CHECK(doc.as<std::string>() == "{\"include\":42}");
  150. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  151. }
  152. SECTION("skip float 64") {
  153. error = deserializeMsgPack(
  154. doc,
  155. "\x82\xA6ignore\xCB\x40\x09\x21\xCA\xC0\x83\x12\x6F\xA7include\x2A",
  156. filterOpt);
  157. CHECK(error == DeserializationError::Ok);
  158. CHECK(doc.as<std::string>() == "{\"include\":42}");
  159. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  160. }
  161. SECTION("skip fixstr") {
  162. error = deserializeMsgPack(
  163. doc, "\x82\xA6ignore\xABhello world\xA7include\x2A", filterOpt);
  164. CHECK(error == DeserializationError::Ok);
  165. CHECK(doc.as<std::string>() == "{\"include\":42}");
  166. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  167. }
  168. SECTION("skip str 8") {
  169. error = deserializeMsgPack(
  170. doc, "\x82\xA6ignore\xd9\x05hello\xA7include\x2A", filterOpt);
  171. CHECK(error == DeserializationError::Ok);
  172. CHECK(doc.as<std::string>() == "{\"include\":42}");
  173. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  174. }
  175. SECTION("skip str 16") {
  176. error = deserializeMsgPack(
  177. doc, "\x82\xA6ignore\xda\x00\x05hello\xA7include\x2A", filterOpt);
  178. CHECK(error == DeserializationError::Ok);
  179. CHECK(doc.as<std::string>() == "{\"include\":42}");
  180. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  181. }
  182. SECTION("skip str 32") {
  183. error = deserializeMsgPack(
  184. doc, "\x82\xA6ignore\xdb\x00\x00\x00\x05hello\xA7include\x2A",
  185. filterOpt);
  186. CHECK(error == DeserializationError::Ok);
  187. CHECK(doc.as<std::string>() == "{\"include\":42}");
  188. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  189. }
  190. SECTION("skip bin 8") {
  191. error = deserializeMsgPack(
  192. doc, "\x82\xA6ignore\xC4\x05hello\xA7include\x2A", filterOpt);
  193. CHECK(error == DeserializationError::Ok);
  194. CHECK(doc.as<std::string>() == "{\"include\":42}");
  195. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  196. }
  197. SECTION("skip bin 16") {
  198. error = deserializeMsgPack(
  199. doc, "\x82\xA6ignore\xC5\x00\x05hello\xA7include\x2A", filterOpt);
  200. CHECK(error == DeserializationError::Ok);
  201. CHECK(doc.as<std::string>() == "{\"include\":42}");
  202. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  203. }
  204. SECTION("skip bin 32") {
  205. error = deserializeMsgPack(
  206. doc, "\x82\xA6ignore\xC6\x00\x00\x00\x05hello\xA7include\x2A",
  207. filterOpt);
  208. CHECK(error == DeserializationError::Ok);
  209. CHECK(doc.as<std::string>() == "{\"include\":42}");
  210. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  211. }
  212. SECTION("skip fixarray") {
  213. error = deserializeMsgPack(
  214. doc, "\x82\xA6ignore\x92\x01\x02\xA7include\x2A", filterOpt);
  215. CHECK(error == DeserializationError::Ok);
  216. CHECK(doc.as<std::string>() == "{\"include\":42}");
  217. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  218. }
  219. SECTION("skip array 16") {
  220. error = deserializeMsgPack(
  221. doc, "\x82\xA6ignore\xDC\x00\x02\xA5hello\xA5world\xA7include\x2A",
  222. filterOpt);
  223. CHECK(error == DeserializationError::Ok);
  224. CHECK(doc.as<std::string>() == "{\"include\":42}");
  225. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  226. }
  227. SECTION("skip array 32") {
  228. error = deserializeMsgPack(
  229. doc,
  230. "\x82\xA6ignore"
  231. "\xDD\x00\x00\x00\x02\xCA\x00\x00\x00\x00\xCA\x40\x48\xF5\xC3"
  232. "\xA7include\x2A",
  233. filterOpt);
  234. CHECK(error == DeserializationError::Ok);
  235. CHECK(doc.as<std::string>() == "{\"include\":42}");
  236. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  237. }
  238. SECTION("skip fixmap") {
  239. error = deserializeMsgPack(
  240. doc, "\x82\xA6ignore\x82\xA3one\x01\xA3two\x02\xA7include\x2A",
  241. filterOpt);
  242. CHECK(error == DeserializationError::Ok);
  243. CHECK(doc.as<std::string>() == "{\"include\":42}");
  244. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  245. }
  246. SECTION("skip map 16") {
  247. error = deserializeMsgPack(doc,
  248. "\x82\xA6ignore"
  249. "\xDE\x00\x02\xA1H\xA5hello\xA1W\xA5world"
  250. "\xA7include\x2A",
  251. filterOpt);
  252. CHECK(error == DeserializationError::Ok);
  253. CHECK(doc.as<std::string>() == "{\"include\":42}");
  254. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  255. }
  256. SECTION("skip map 32") {
  257. error = deserializeMsgPack(doc,
  258. "\x82\xA6ignore"
  259. "\xDF\x00\x00\x00\x02"
  260. "\xA4zero\xCA\x00\x00\x00\x00"
  261. "\xA2pi\xCA\x40\x48\xF5\xC3"
  262. "\xA7include\x2A",
  263. filterOpt);
  264. CHECK(error == DeserializationError::Ok);
  265. CHECK(doc.as<std::string>() == "{\"include\":42}");
  266. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  267. }
  268. SECTION("skip fixext 1") {
  269. error = deserializeMsgPack(doc,
  270. "\x82\xA6ignore"
  271. "\xd4\x01\x02"
  272. "\xA7include\x2A",
  273. filterOpt);
  274. CHECK(error == DeserializationError::Ok);
  275. CHECK(doc.as<std::string>() == "{\"include\":42}");
  276. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  277. }
  278. SECTION("skip fixext 2") {
  279. error = deserializeMsgPack(doc,
  280. "\x82\xA6ignore"
  281. "\xd5\x01\x02\x03"
  282. "\xA7include\x2A",
  283. filterOpt);
  284. CHECK(error == DeserializationError::Ok);
  285. CHECK(doc.as<std::string>() == "{\"include\":42}");
  286. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  287. }
  288. SECTION("skip fixext 4") {
  289. error = deserializeMsgPack(doc,
  290. "\x82\xA6ignore"
  291. "\xd6\x01\x02\x03\x04\x05"
  292. "\xA7include\x2A",
  293. filterOpt);
  294. CHECK(error == DeserializationError::Ok);
  295. CHECK(doc.as<std::string>() == "{\"include\":42}");
  296. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  297. }
  298. SECTION("skip fixext 8") {
  299. error = deserializeMsgPack(doc,
  300. "\x82\xA6ignore"
  301. "\xd7\x01\x02\x03\x04\x05\x06\x07\x08\x09"
  302. "\xA7include\x2A",
  303. filterOpt);
  304. CHECK(error == DeserializationError::Ok);
  305. CHECK(doc.as<std::string>() == "{\"include\":42}");
  306. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  307. }
  308. SECTION("skip fixext 16") {
  309. error =
  310. deserializeMsgPack(doc,
  311. "\x82\xA6ignore"
  312. "\xd8\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A"
  313. "\x0B\x0C\x0D\x0E\x0F\x10\x11"
  314. "\xA7include\x2A",
  315. filterOpt);
  316. CHECK(error == DeserializationError::Ok);
  317. CHECK(doc.as<std::string>() == "{\"include\":42}");
  318. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  319. }
  320. SECTION("skip ext 8") {
  321. error = deserializeMsgPack(doc,
  322. "\x82\xA6ignore"
  323. "\xc7\x02\x00\x01\x02"
  324. "\xA7include\x2A",
  325. filterOpt);
  326. CHECK(error == DeserializationError::Ok);
  327. CHECK(doc.as<std::string>() == "{\"include\":42}");
  328. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  329. }
  330. SECTION("skip ext 16") {
  331. error = deserializeMsgPack(doc,
  332. "\x82\xA6ignore"
  333. "\xc8\x00\x02\x00\x01\x02"
  334. "\xA7include\x2A",
  335. filterOpt);
  336. CHECK(error == DeserializationError::Ok);
  337. CHECK(doc.as<std::string>() == "{\"include\":42}");
  338. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  339. }
  340. SECTION("skip ext 32") {
  341. error = deserializeMsgPack(doc,
  342. "\x82\xA6ignore"
  343. "\xc9\x00\x00\x00\x02\x00\x01\x02"
  344. "\xA7include\x2A",
  345. filterOpt);
  346. CHECK(error == DeserializationError::Ok);
  347. CHECK(doc.as<std::string>() == "{\"include\":42}");
  348. CHECK(doc.memoryUsage() == sizeofObject(1) + 8);
  349. }
  350. }
  351. SECTION("Filter = {arronly:[{measure:true}],include:true}") {
  352. filter["onlyarr"][0]["measure"] = true;
  353. filter["include"] = true;
  354. CAPTURE(filter.as<std::string>());
  355. SECTION("include fixarray") {
  356. error = deserializeMsgPack(doc,
  357. "\x82\xA7onlyarr\x92"
  358. "\x82\xA8location\x01\xA7measure\x02"
  359. "\x82\xA8location\x02\xA7measure\x04"
  360. "\xA7include\x2A",
  361. filterOpt);
  362. CHECK(error == DeserializationError::Ok);
  363. CHECK(doc.as<std::string>() ==
  364. "{\"onlyarr\":[{\"measure\":2},{\"measure\":4}],\"include\":42}");
  365. CHECK(doc.memoryUsage() == sizeofArray(2) + 2 * sizeofObject(2) + 24);
  366. }
  367. SECTION("include array 16") {
  368. error = deserializeMsgPack(doc,
  369. "\x82\xA7onlyarr"
  370. "\xDC\x00\x02"
  371. "\x82\xA8location\x01\xA7measure\x02"
  372. "\x82\xA8location\x02\xA7measure\x04"
  373. "\xA7include\x2A",
  374. filterOpt);
  375. CHECK(error == DeserializationError::Ok);
  376. CHECK(doc.as<std::string>() ==
  377. "{\"onlyarr\":[{\"measure\":2},{\"measure\":4}],\"include\":42}");
  378. CHECK(doc.memoryUsage() == sizeofArray(2) + 2 * sizeofObject(2) + 24);
  379. }
  380. SECTION("include array 32") {
  381. error = deserializeMsgPack(doc,
  382. "\x82\xA7onlyarr"
  383. "\xDD\x00\x00\x00\x02"
  384. "\x82\xA8location\x01\xA7measure\x02"
  385. "\x82\xA8location\x02\xA7measure\x04"
  386. "\xA7include\x2A",
  387. filterOpt);
  388. CHECK(error == DeserializationError::Ok);
  389. CHECK(doc.as<std::string>() ==
  390. "{\"onlyarr\":[{\"measure\":2},{\"measure\":4}],\"include\":42}");
  391. CHECK(doc.memoryUsage() == sizeofArray(2) + 2 * sizeofObject(2) + 24);
  392. }
  393. SECTION("skip null") {
  394. error = deserializeMsgPack(doc, "\x82\xA7onlyarr\xC0\xA7include\x2A",
  395. filterOpt);
  396. CHECK(error == DeserializationError::Ok);
  397. CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
  398. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  399. }
  400. SECTION("skip false") {
  401. error = deserializeMsgPack(doc, "\x82\xA7onlyarr\xC2\xA7include\x2A",
  402. filterOpt);
  403. CHECK(error == DeserializationError::Ok);
  404. CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
  405. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  406. }
  407. SECTION("skip true") {
  408. error = deserializeMsgPack(doc, "\x82\xA7onlyarr\xC3\xA7include\x2A",
  409. filterOpt);
  410. CHECK(error == DeserializationError::Ok);
  411. CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
  412. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  413. }
  414. SECTION("skip positive fixint") {
  415. error = deserializeMsgPack(doc, "\x82\xA7onlyarr\x2A\xA7include\x2A",
  416. filterOpt);
  417. CHECK(error == DeserializationError::Ok);
  418. CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
  419. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  420. }
  421. SECTION("skip negative fixint") {
  422. error = deserializeMsgPack(doc, "\x82\xA7onlyarr\xFF\xA7include\x2A",
  423. filterOpt);
  424. CHECK(error == DeserializationError::Ok);
  425. CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
  426. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  427. }
  428. SECTION("skip uint 8") {
  429. error = deserializeMsgPack(
  430. doc, "\x82\xA7onlyarr\xCC\x2A\xA7include\x2A", filterOpt);
  431. CHECK(error == DeserializationError::Ok);
  432. CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
  433. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  434. }
  435. SECTION("skip uint 16") {
  436. error = deserializeMsgPack(
  437. doc, "\x82\xA7onlyarr\xcd\x30\x39\xA7include\x2A", filterOpt);
  438. CHECK(error == DeserializationError::Ok);
  439. CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
  440. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  441. }
  442. SECTION("skip uint 32") {
  443. error = deserializeMsgPack(
  444. doc, "\x82\xA7onlyarr\xCE\x12\x34\x56\x78\xA7include\x2A",
  445. filterOpt);
  446. CHECK(error == DeserializationError::Ok);
  447. CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
  448. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  449. }
  450. SECTION("skip uint 64") {
  451. error = deserializeMsgPack(doc,
  452. "\x82\xA7onlyarr\xCF\x12\x34\x56\x78\x9A\xBC"
  453. "\xDE\xF0\xA7include\x2A",
  454. filterOpt);
  455. CHECK(error == DeserializationError::Ok);
  456. CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
  457. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  458. }
  459. SECTION("skip int 8") {
  460. error = deserializeMsgPack(
  461. doc, "\x82\xA7onlyarr\xD0\x2A\xA7include\x2A", filterOpt);
  462. CHECK(error == DeserializationError::Ok);
  463. CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
  464. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  465. }
  466. SECTION("skip int 16") {
  467. error = deserializeMsgPack(
  468. doc, "\x82\xA7onlyarr\xD1\xCF\xC7\xA7include\x2A", filterOpt);
  469. CHECK(error == DeserializationError::Ok);
  470. CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
  471. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  472. }
  473. SECTION("skip int 32") {
  474. error = deserializeMsgPack(
  475. doc, "\x82\xA7onlyarr\xD2\xB6\x69\xFD\x2E\xA7include\x2A",
  476. filterOpt);
  477. CHECK(error == DeserializationError::Ok);
  478. CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
  479. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  480. }
  481. SECTION("skip int 64") {
  482. error = deserializeMsgPack(doc,
  483. "\x82\xA7onlyarr\xD3\x12\x34\x56\x78\x9A\xBC"
  484. "\xDE\xF0\xA7include\x2A",
  485. filterOpt);
  486. CHECK(error == DeserializationError::Ok);
  487. CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
  488. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  489. }
  490. SECTION("skip float 32") {
  491. error = deserializeMsgPack(
  492. doc, "\x82\xA7onlyarr\xCA\x40\x48\xF5\xC3\xA7include\x2A",
  493. filterOpt);
  494. CHECK(error == DeserializationError::Ok);
  495. CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
  496. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  497. }
  498. SECTION("skip float 64") {
  499. error = deserializeMsgPack(doc,
  500. "\x82\xA7onlyarr\xCB\x40\x09\x21\xCA\xC0\x83"
  501. "\x12\x6F\xA7include\x2A",
  502. filterOpt);
  503. CHECK(error == DeserializationError::Ok);
  504. CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
  505. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  506. }
  507. SECTION("skip fixstr") {
  508. error = deserializeMsgPack(
  509. doc, "\x82\xA7onlyarr\xABhello world\xA7include\x2A", filterOpt);
  510. CHECK(error == DeserializationError::Ok);
  511. CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
  512. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  513. }
  514. SECTION("skip str 8") {
  515. error = deserializeMsgPack(
  516. doc, "\x82\xA7onlyarr\xd9\x05hello\xA7include\x2A", filterOpt);
  517. CHECK(error == DeserializationError::Ok);
  518. }
  519. SECTION("skip str 16") {
  520. error = deserializeMsgPack(
  521. doc, "\x82\xA7onlyarr\xda\x00\x05hello\xA7include\x2A", filterOpt);
  522. CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
  523. }
  524. SECTION("skip str 32") {
  525. error = deserializeMsgPack(
  526. doc, "\x82\xA7onlyarr\xdb\x00\x00\x00\x05hello\xA7include\x2A",
  527. filterOpt);
  528. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  529. }
  530. SECTION("skip fixmap") {
  531. error = deserializeMsgPack(
  532. doc, "\x82\xA7onlyarr\x82\xA3one\x01\xA3two\x02\xA7include\x2A",
  533. filterOpt);
  534. CHECK(error == DeserializationError::Ok);
  535. CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
  536. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  537. }
  538. SECTION("skip map 16") {
  539. error = deserializeMsgPack(doc,
  540. "\x82\xA7onlyarr"
  541. "\xDE\x00\x02\xA1H\xA5hello\xA1W\xA5world"
  542. "\xA7include\x2A",
  543. filterOpt);
  544. CHECK(error == DeserializationError::Ok);
  545. CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
  546. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  547. }
  548. SECTION("skip map 32") {
  549. error = deserializeMsgPack(doc,
  550. "\x82\xA7onlyarr"
  551. "\xDF\x00\x00\x00\x02"
  552. "\xA4zero\xCA\x00\x00\x00\x00"
  553. "\xA2pi\xCA\x40\x48\xF5\xC3"
  554. "\xA7include\x2A",
  555. filterOpt);
  556. CHECK(error == DeserializationError::Ok);
  557. CHECK(doc.as<std::string>() == "{\"onlyarr\":null,\"include\":42}");
  558. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  559. }
  560. }
  561. }
  562. SECTION("root is fixarray") {
  563. SECTION("filter = [false, true]") {
  564. filter[0] = false; // only the first elment of the filter matters
  565. filter[1] = true; // so this one is ignored
  566. SECTION("input = [1,2,3]") {
  567. error = deserializeMsgPack(doc, "\x93\x01\x02\x03", filterOpt);
  568. CHECK(error == DeserializationError::Ok);
  569. CHECK(doc.as<std::string>() == "[]");
  570. CHECK(doc.memoryUsage() == sizeofArray(0));
  571. }
  572. }
  573. SECTION("filter = [true, false]") {
  574. filter[0] = true; // only the first elment of the filter matters
  575. filter[1] = false; // so this one is ignored
  576. SECTION("input = [1,2,3]") {
  577. error = deserializeMsgPack(doc, "\x93\x01\x02\x03", filterOpt);
  578. CHECK(error == DeserializationError::Ok);
  579. CHECK(doc.as<std::string>() == "[1,2,3]");
  580. CHECK(doc.memoryUsage() == sizeofArray(3));
  581. }
  582. }
  583. }
  584. SECTION("Filter = {onlyobj:{measure:true},include:true}") {
  585. filter["onlyobj"]["measure"] = true;
  586. filter["include"] = true;
  587. CAPTURE(filter.as<std::string>());
  588. SECTION("include fixmap") {
  589. error = deserializeMsgPack(doc,
  590. "\x82\xA7onlyobj"
  591. "\x82\xA8location\x01\xA7measure\x02"
  592. "\xA7include\x2A",
  593. filterOpt);
  594. CHECK(error == DeserializationError::Ok);
  595. CHECK(doc.as<std::string>() ==
  596. "{\"onlyobj\":{\"measure\":2},\"include\":42}");
  597. CHECK(doc.memoryUsage() == sizeofObject(2) + sizeofObject(1) + 24);
  598. }
  599. SECTION("include map 16") {
  600. error = deserializeMsgPack(doc,
  601. "\x82\xA7onlyobj"
  602. "\xDE\x00\x02\xA8location\x01\xA7measure\x02"
  603. "\xA7include\x2A",
  604. filterOpt);
  605. CHECK(error == DeserializationError::Ok);
  606. CHECK(doc.as<std::string>() ==
  607. "{\"onlyobj\":{\"measure\":2},\"include\":42}");
  608. CHECK(doc.memoryUsage() == sizeofObject(2) + sizeofObject(1) + 24);
  609. }
  610. SECTION("include map 32") {
  611. error = deserializeMsgPack(doc,
  612. "\x82\xA7onlyobj"
  613. "\xDF\x00\x00\x00\x02"
  614. "\xA8location\x01\xA7measure\x02"
  615. "\xA7include\x2A",
  616. filterOpt);
  617. CHECK(error == DeserializationError::Ok);
  618. CHECK(doc.as<std::string>() ==
  619. "{\"onlyobj\":{\"measure\":2},\"include\":42}");
  620. CHECK(doc.memoryUsage() == sizeofObject(2) + sizeofObject(1) + 24);
  621. }
  622. SECTION("skip null") {
  623. error = deserializeMsgPack(doc, "\x82\xA7onlyobj\xC0\xA7include\x2A",
  624. filterOpt);
  625. CHECK(error == DeserializationError::Ok);
  626. CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
  627. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  628. }
  629. SECTION("skip false") {
  630. error = deserializeMsgPack(doc, "\x82\xA7onlyobj\xC2\xA7include\x2A",
  631. filterOpt);
  632. CHECK(error == DeserializationError::Ok);
  633. CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
  634. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  635. }
  636. SECTION("skip true") {
  637. error = deserializeMsgPack(doc, "\x82\xA7onlyobj\xC3\xA7include\x2A",
  638. filterOpt);
  639. CHECK(error == DeserializationError::Ok);
  640. CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
  641. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  642. }
  643. SECTION("skip positive fixint") {
  644. error = deserializeMsgPack(doc, "\x82\xA7onlyobj\x2A\xA7include\x2A",
  645. filterOpt);
  646. CHECK(error == DeserializationError::Ok);
  647. CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
  648. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  649. }
  650. SECTION("skip negative fixint") {
  651. error = deserializeMsgPack(doc, "\x82\xA7onlyobj\xFF\xA7include\x2A",
  652. filterOpt);
  653. CHECK(error == DeserializationError::Ok);
  654. CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
  655. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  656. }
  657. SECTION("skip uint 8") {
  658. error = deserializeMsgPack(doc, "\x82\xA7onlyobj\xCC\x2A\xA7include\x2A",
  659. filterOpt);
  660. CHECK(error == DeserializationError::Ok);
  661. CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
  662. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  663. }
  664. SECTION("skip uint 16") {
  665. error = deserializeMsgPack(
  666. doc, "\x82\xA7onlyobj\xcd\x30\x39\xA7include\x2A", filterOpt);
  667. CHECK(error == DeserializationError::Ok);
  668. CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
  669. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  670. }
  671. SECTION("skip uint 32") {
  672. error = deserializeMsgPack(
  673. doc, "\x82\xA7onlyobj\xCE\x12\x34\x56\x78\xA7include\x2A", filterOpt);
  674. CHECK(error == DeserializationError::Ok);
  675. CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
  676. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  677. }
  678. SECTION("skip uint 64") {
  679. error = deserializeMsgPack(doc,
  680. "\x82\xA7onlyobj\xCF\x12\x34\x56\x78\x9A\xBC"
  681. "\xDE\xF0\xA7include\x2A",
  682. filterOpt);
  683. CHECK(error == DeserializationError::Ok);
  684. CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
  685. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  686. }
  687. SECTION("skip int 8") {
  688. error = deserializeMsgPack(doc, "\x82\xA7onlyobj\xD0\x2A\xA7include\x2A",
  689. filterOpt);
  690. CHECK(error == DeserializationError::Ok);
  691. CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
  692. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  693. }
  694. SECTION("skip int 16") {
  695. error = deserializeMsgPack(
  696. doc, "\x82\xA7onlyobj\xD1\xCF\xC7\xA7include\x2A", filterOpt);
  697. CHECK(error == DeserializationError::Ok);
  698. CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
  699. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  700. }
  701. SECTION("skip int 32") {
  702. error = deserializeMsgPack(
  703. doc, "\x82\xA7onlyobj\xD2\xB6\x69\xFD\x2E\xA7include\x2A", filterOpt);
  704. CHECK(error == DeserializationError::Ok);
  705. CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
  706. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  707. }
  708. SECTION("skip int 64") {
  709. error = deserializeMsgPack(doc,
  710. "\x82\xA7onlyobj\xD3\x12\x34\x56\x78\x9A\xBC"
  711. "\xDE\xF0\xA7include\x2A",
  712. filterOpt);
  713. CHECK(error == DeserializationError::Ok);
  714. CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
  715. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  716. }
  717. SECTION("skip float 32") {
  718. error = deserializeMsgPack(
  719. doc, "\x82\xA7onlyobj\xCA\x40\x48\xF5\xC3\xA7include\x2A", filterOpt);
  720. CHECK(error == DeserializationError::Ok);
  721. CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
  722. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  723. }
  724. SECTION("skip float 64") {
  725. error = deserializeMsgPack(doc,
  726. "\x82\xA7onlyobj\xCB\x40\x09\x21\xCA\xC0\x83"
  727. "\x12\x6F\xA7include\x2A",
  728. filterOpt);
  729. CHECK(error == DeserializationError::Ok);
  730. CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
  731. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  732. }
  733. SECTION("skip fixstr") {
  734. error = deserializeMsgPack(
  735. doc, "\x82\xA7onlyobj\xABhello world\xA7include\x2A", filterOpt);
  736. CHECK(error == DeserializationError::Ok);
  737. CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
  738. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  739. }
  740. SECTION("skip str 8") {
  741. error = deserializeMsgPack(
  742. doc, "\x82\xA7onlyobj\xd9\x05hello\xA7include\x2A", filterOpt);
  743. CHECK(error == DeserializationError::Ok);
  744. }
  745. SECTION("skip str 16") {
  746. error = deserializeMsgPack(
  747. doc, "\x82\xA7onlyobj\xda\x00\x05hello\xA7include\x2A", filterOpt);
  748. CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
  749. }
  750. SECTION("skip str 32") {
  751. error = deserializeMsgPack(
  752. doc, "\x82\xA7onlyobj\xdb\x00\x00\x00\x05hello\xA7include\x2A",
  753. filterOpt);
  754. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  755. }
  756. SECTION("skip fixarray") {
  757. error = deserializeMsgPack(
  758. doc, "\x82\xA7onlyobj\x92\x01\x02\xA7include\x2A", filterOpt);
  759. CHECK(error == DeserializationError::Ok);
  760. CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
  761. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  762. }
  763. SECTION("skip array 16") {
  764. error = deserializeMsgPack(doc,
  765. "\x82\xA7onlyobj\xDC\x00\x01\xA7"
  766. "example\xA7include\x2A",
  767. filterOpt);
  768. CHECK(error == DeserializationError::Ok);
  769. CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
  770. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  771. }
  772. SECTION("skip array 32") {
  773. error = deserializeMsgPack(doc,
  774. "\x82\xA7onlyobj"
  775. "\xDD\x00\x00\x00\x02\x01\x02"
  776. "\xA7include\x2A",
  777. filterOpt);
  778. CHECK(error == DeserializationError::Ok);
  779. CHECK(doc.as<std::string>() == "{\"onlyobj\":null,\"include\":42}");
  780. CHECK(doc.memoryUsage() == sizeofObject(2) + 16);
  781. }
  782. }
  783. SECTION("filter = true") {
  784. filter.set(true);
  785. error = deserializeMsgPack(doc, "\x90", filterOpt);
  786. CHECK(error == DeserializationError::Ok);
  787. CHECK(doc.is<JsonArray>() == true);
  788. CHECK(doc.size() == 0);
  789. }
  790. SECTION("filter = false") {
  791. filter.set(false);
  792. SECTION("input = fixarray") {
  793. error = deserializeMsgPack(doc, "\x92\x01\x02", filterOpt);
  794. CHECK(error == DeserializationError::Ok);
  795. CHECK(doc.isNull() == true);
  796. }
  797. SECTION("input = array 16") {
  798. error = deserializeMsgPack(doc, "\xDC\x00\x02\x01\x02", filterOpt);
  799. CHECK(error == DeserializationError::Ok);
  800. CHECK(doc.isNull() == true);
  801. }
  802. SECTION("array too deep") {
  803. error = deserializeMsgPack(doc, "\x91\x91\x91\x91\x91", 5, filterOpt,
  804. DeserializationOption::NestingLimit(4));
  805. CHECK(error == DeserializationError::TooDeep);
  806. }
  807. SECTION("object too deep") {
  808. error = deserializeMsgPack(
  809. doc, "\x81\xA1z\x81\xA1z\x81\xA1z\x81\xA1z\x81\xA1z", 15, filterOpt,
  810. DeserializationOption::NestingLimit(4));
  811. CHECK(error == DeserializationError::TooDeep);
  812. }
  813. }
  814. }
  815. TEST_CASE("Zero-copy mode") { // issue #1697
  816. char input[] = "\x82\xA7include\x01\xA6ignore\x02";
  817. JsonDocument filter(256);
  818. filter["include"] = true;
  819. JsonDocument doc(256);
  820. DeserializationError err =
  821. deserializeMsgPack(doc, input, 18, DeserializationOption::Filter(filter));
  822. CHECK(err == DeserializationError::Ok);
  823. CHECK(doc.as<std::string>() == "{\"include\":1}");
  824. }
  825. TEST_CASE("Overloads") {
  826. JsonDocument doc(256);
  827. JsonDocument filter(256);
  828. using namespace DeserializationOption;
  829. // deserializeMsgPack(..., Filter)
  830. SECTION("const char*, Filter") {
  831. deserializeMsgPack(doc, "{}", Filter(filter));
  832. }
  833. SECTION("const char*, size_t, Filter") {
  834. deserializeMsgPack(doc, "{}", 2, Filter(filter));
  835. }
  836. SECTION("const std::string&, Filter") {
  837. deserializeMsgPack(doc, std::string("{}"), Filter(filter));
  838. }
  839. SECTION("std::istream&, Filter") {
  840. std::stringstream s("{}");
  841. deserializeMsgPack(doc, s, Filter(filter));
  842. }
  843. #ifdef HAS_VARIABLE_LENGTH_ARRAY
  844. SECTION("char[n], Filter") {
  845. size_t i = 4;
  846. char vla[i];
  847. strcpy(vla, "{}");
  848. deserializeMsgPack(doc, vla, Filter(filter));
  849. }
  850. #endif
  851. // deserializeMsgPack(..., Filter, NestingLimit)
  852. SECTION("const char*, Filter, NestingLimit") {
  853. deserializeMsgPack(doc, "{}", Filter(filter), NestingLimit(5));
  854. }
  855. SECTION("const char*, size_t, Filter, NestingLimit") {
  856. deserializeMsgPack(doc, "{}", 2, Filter(filter), NestingLimit(5));
  857. }
  858. SECTION("const std::string&, Filter, NestingLimit") {
  859. deserializeMsgPack(doc, std::string("{}"), Filter(filter), NestingLimit(5));
  860. }
  861. SECTION("std::istream&, Filter, NestingLimit") {
  862. std::stringstream s("{}");
  863. deserializeMsgPack(doc, s, Filter(filter), NestingLimit(5));
  864. }
  865. #ifdef HAS_VARIABLE_LENGTH_ARRAY
  866. SECTION("char[n], Filter, NestingLimit") {
  867. size_t i = 4;
  868. char vla[i];
  869. strcpy(vla, "{}");
  870. deserializeMsgPack(doc, vla, Filter(filter), NestingLimit(5));
  871. }
  872. #endif
  873. // deserializeMsgPack(..., NestingLimit, Filter)
  874. SECTION("const char*, NestingLimit, Filter") {
  875. deserializeMsgPack(doc, "{}", NestingLimit(5), Filter(filter));
  876. }
  877. SECTION("const char*, size_t, NestingLimit, Filter") {
  878. deserializeMsgPack(doc, "{}", 2, NestingLimit(5), Filter(filter));
  879. }
  880. SECTION("const std::string&, NestingLimit, Filter") {
  881. deserializeMsgPack(doc, std::string("{}"), NestingLimit(5), Filter(filter));
  882. }
  883. SECTION("std::istream&, NestingLimit, Filter") {
  884. std::stringstream s("{}");
  885. deserializeMsgPack(doc, s, NestingLimit(5), Filter(filter));
  886. }
  887. #ifdef HAS_VARIABLE_LENGTH_ARRAY
  888. SECTION("char[n], NestingLimit, Filter") {
  889. size_t i = 4;
  890. char vla[i];
  891. strcpy(vla, "{}");
  892. deserializeMsgPack(doc, vla, NestingLimit(5), Filter(filter));
  893. }
  894. #endif
  895. }