1 /*
2 __ _____ _____ _____
3 __| | __| | | | JSON for Modern C++ (test suite)
4 | | |__ | | | | | | version 3.7.3
5 |_____|_____|_____|_|___| https://github.com/nlohmann/json
6
7 Licensed under the MIT License <http://opensource.org/licenses/MIT>.
8 SPDX-License-Identifier: MIT
9 Copyright (c) 2013-2019 Niels Lohmann <http://nlohmann.me>.
10
11 Permission is hereby granted, free of charge, to any person obtaining a copy
12 of this software and associated documentation files (the "Software"), to deal
13 in the Software without restriction, including without limitation the rights
14 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15 copies of the Software, and to permit persons to whom the Software is
16 furnished to do so, subject to the following conditions:
17
18 The above copyright notice and this permission notice shall be included in all
19 copies or substantial portions of the Software.
20
21 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
27 SOFTWARE.
28 */
29
30 #include "doctest_compatibility.h"
31
32 #include <nlohmann/json.hpp>
33 using nlohmann::json;
34
35 #include <fstream>
36
37 TEST_CASE("compliance tests from json.org")
38 {
39 // test cases are from http://json.org/JSON_checker/
40
41 SECTION("expected failures")
42 {
43 for (auto filename :
44 {
45 //"test/data/json_tests/fail1.json",
46 "test/data/json_tests/fail2.json",
47 "test/data/json_tests/fail3.json",
48 "test/data/json_tests/fail4.json",
49 "test/data/json_tests/fail5.json",
50 "test/data/json_tests/fail6.json",
51 "test/data/json_tests/fail7.json",
52 "test/data/json_tests/fail8.json",
53 "test/data/json_tests/fail9.json",
54 "test/data/json_tests/fail10.json",
55 "test/data/json_tests/fail11.json",
56 "test/data/json_tests/fail12.json",
57 "test/data/json_tests/fail13.json",
58 "test/data/json_tests/fail14.json",
59 "test/data/json_tests/fail15.json",
60 "test/data/json_tests/fail16.json",
61 "test/data/json_tests/fail17.json",
62 //"test/data/json_tests/fail18.json",
63 "test/data/json_tests/fail19.json",
64 "test/data/json_tests/fail20.json",
65 "test/data/json_tests/fail21.json",
66 "test/data/json_tests/fail22.json",
67 "test/data/json_tests/fail23.json",
68 "test/data/json_tests/fail24.json",
69 "test/data/json_tests/fail25.json",
70 "test/data/json_tests/fail26.json",
71 "test/data/json_tests/fail27.json",
72 "test/data/json_tests/fail28.json",
73 "test/data/json_tests/fail29.json",
74 "test/data/json_tests/fail30.json",
75 "test/data/json_tests/fail31.json",
76 "test/data/json_tests/fail32.json",
77 "test/data/json_tests/fail33.json"
78 })
79 {
80 CAPTURE(filename)
81 std::ifstream f(filename);
82 json _;
83 CHECK_THROWS_AS(_ = json::parse(f), json::parse_error&);
84 }
85 }
86
87 SECTION("no failures with trailing literals (relaxed)")
88 {
89 // these tests fail above, because the parser does not end on EOF;
90 // they succeed when the operator>> is used, because it does not
91 // have this constraint
92 for (auto filename :
93 {
94 "test/data/json_tests/fail7.json",
95 "test/data/json_tests/fail8.json",
96 "test/data/json_tests/fail10.json",
97 })
98 {
99 CAPTURE(filename)
100 std::ifstream f(filename);
101 json j;
102 CHECK_NOTHROW(f >> j);
103 }
104 }
105
106 SECTION("expected passes")
107 {
108 for (auto filename :
109 {
110 "test/data/json_tests/pass1.json",
111 "test/data/json_tests/pass2.json",
112 "test/data/json_tests/pass3.json"
113 })
114 {
115 CAPTURE(filename)
116 std::ifstream f(filename);
117 json j;
118 CHECK_NOTHROW(f >> j);
119 }
120 }
121 }
122
123 TEST_CASE("compliance tests from nativejson-benchmark")
124 {
125 // test cases from https://github.com/miloyip/nativejson-benchmark/blob/master/src/main.cpp
126
127 SECTION("doubles")
128 {
129 auto TEST_DOUBLE = [](const std::string & json_string, const double expected)
__anon864b59a30102(const std::string & json_string, const double expected) 130 {
131 CAPTURE(json_string)
132 CAPTURE(expected)
133 CHECK(json::parse(json_string)[0].get<double>() == Approx(expected));
134 };
135
136 TEST_DOUBLE("[0.0]", 0.0);
137 TEST_DOUBLE("[-0.0]", -0.0);
138 TEST_DOUBLE("[1.0]", 1.0);
139 TEST_DOUBLE("[-1.0]", -1.0);
140 TEST_DOUBLE("[1.5]", 1.5);
141 TEST_DOUBLE("[-1.5]", -1.5);
142 TEST_DOUBLE("[3.1416]", 3.1416);
143 TEST_DOUBLE("[1E10]", 1E10);
144 TEST_DOUBLE("[1e10]", 1e10);
145 TEST_DOUBLE("[1E+10]", 1E+10);
146 TEST_DOUBLE("[1E-10]", 1E-10);
147 TEST_DOUBLE("[-1E10]", -1E10);
148 TEST_DOUBLE("[-1e10]", -1e10);
149 TEST_DOUBLE("[-1E+10]", -1E+10);
150 TEST_DOUBLE("[-1E-10]", -1E-10);
151 TEST_DOUBLE("[1.234E+10]", 1.234E+10);
152 TEST_DOUBLE("[1.234E-10]", 1.234E-10);
153 TEST_DOUBLE("[1.79769e+308]", 1.79769e+308);
154 TEST_DOUBLE("[2.22507e-308]", 2.22507e-308);
155 TEST_DOUBLE("[-1.79769e+308]", -1.79769e+308);
156 TEST_DOUBLE("[-2.22507e-308]", -2.22507e-308);
157 TEST_DOUBLE("[4.9406564584124654e-324]", 4.9406564584124654e-324); // minimum denormal
158 TEST_DOUBLE("[2.2250738585072009e-308]", 2.2250738585072009e-308); // Max subnormal double
159 TEST_DOUBLE("[2.2250738585072014e-308]", 2.2250738585072014e-308); // Min normal positive double
160 TEST_DOUBLE("[1.7976931348623157e+308]", 1.7976931348623157e+308); // Max double
161 TEST_DOUBLE("[1e-10000]", 0.0); // must underflow
162 TEST_DOUBLE("[18446744073709551616]",
163 18446744073709551616.0); // 2^64 (max of uint64_t + 1, force to use double)
164 TEST_DOUBLE("[-9223372036854775809]",
165 -9223372036854775809.0); // -2^63 - 1(min of int64_t + 1, force to use double)
166 TEST_DOUBLE("[0.9868011474609375]",
167 0.9868011474609375); // https://github.com/miloyip/rapidjson/issues/120
168 TEST_DOUBLE("[123e34]", 123e34); // Fast Path Cases In Disguise
169 TEST_DOUBLE("[45913141877270640000.0]", 45913141877270640000.0);
170 TEST_DOUBLE("[2.2250738585072011e-308]",
171 2.2250738585072011e-308);
172 //TEST_DOUBLE("[1e-00011111111111]", 0.0);
173 //TEST_DOUBLE("[-1e-00011111111111]", -0.0);
174 TEST_DOUBLE("[1e-214748363]", 0.0);
175 TEST_DOUBLE("[1e-214748364]", 0.0);
176 //TEST_DOUBLE("[1e-21474836311]", 0.0);
177 TEST_DOUBLE("[0.017976931348623157e+310]", 1.7976931348623157e+308); // Max double in another form
178
179 // Since
180 // abs((2^-1022 - 2^-1074) - 2.2250738585072012e-308) = 3.109754131239141401123495768877590405345064751974375599... ¡Á 10^-324
181 // abs((2^-1022) - 2.2250738585072012e-308) = 1.830902327173324040642192159804623318305533274168872044... ¡Á 10 ^ -324
182 // So 2.2250738585072012e-308 should round to 2^-1022 = 2.2250738585072014e-308
183 TEST_DOUBLE("[2.2250738585072012e-308]",
184 2.2250738585072014e-308);
185
186 // More closer to normal/subnormal boundary
187 // boundary = 2^-1022 - 2^-1075 = 2.225073858507201136057409796709131975934819546351645648... ¡Á 10^-308
188 TEST_DOUBLE("[2.22507385850720113605740979670913197593481954635164564e-308]",
189 2.2250738585072009e-308);
190 TEST_DOUBLE("[2.22507385850720113605740979670913197593481954635164565e-308]",
191 2.2250738585072014e-308);
192
193 // 1.0 is in (1.0 - 2^-54, 1.0 + 2^-53)
194 // 1.0 - 2^-54 = 0.999999999999999944488848768742172978818416595458984375
195 TEST_DOUBLE("[0.999999999999999944488848768742172978818416595458984375]", 1.0); // round to even
196 TEST_DOUBLE("[0.999999999999999944488848768742172978818416595458984374]",
197 0.99999999999999989); // previous double
198 TEST_DOUBLE("[0.999999999999999944488848768742172978818416595458984376]", 1.0); // next double
199 // 1.0 + 2^-53 = 1.00000000000000011102230246251565404236316680908203125
200 TEST_DOUBLE("[1.00000000000000011102230246251565404236316680908203125]", 1.0); // round to even
201 TEST_DOUBLE("[1.00000000000000011102230246251565404236316680908203124]", 1.0); // previous double
202 TEST_DOUBLE("[1.00000000000000011102230246251565404236316680908203126]",
203 1.00000000000000022); // next double
204
205 // Numbers from https://github.com/floitsch/double-conversion/blob/master/test/cctest/test-strtod.cc
206
207 TEST_DOUBLE("[72057594037927928.0]", 72057594037927928.0);
208 TEST_DOUBLE("[72057594037927936.0]", 72057594037927936.0);
209 TEST_DOUBLE("[72057594037927932.0]", 72057594037927936.0);
210 TEST_DOUBLE("[7205759403792793199999e-5]", 72057594037927928.0);
211 TEST_DOUBLE("[7205759403792793200001e-5]", 72057594037927936.0);
212
213 TEST_DOUBLE("[9223372036854774784.0]", 9223372036854774784.0);
214 TEST_DOUBLE("[9223372036854775808.0]", 9223372036854775808.0);
215 TEST_DOUBLE("[9223372036854775296.0]", 9223372036854775808.0);
216 TEST_DOUBLE("[922337203685477529599999e-5]", 9223372036854774784.0);
217 TEST_DOUBLE("[922337203685477529600001e-5]", 9223372036854775808.0);
218
219 TEST_DOUBLE("[10141204801825834086073718800384]", 10141204801825834086073718800384.0);
220 TEST_DOUBLE("[10141204801825835211973625643008]", 10141204801825835211973625643008.0);
221 TEST_DOUBLE("[10141204801825834649023672221696]", 10141204801825835211973625643008.0);
222 TEST_DOUBLE("[1014120480182583464902367222169599999e-5]", 10141204801825834086073718800384.0);
223 TEST_DOUBLE("[1014120480182583464902367222169600001e-5]", 10141204801825835211973625643008.0);
224
225 TEST_DOUBLE("[5708990770823838890407843763683279797179383808]",
226 5708990770823838890407843763683279797179383808.0);
227 TEST_DOUBLE("[5708990770823839524233143877797980545530986496]",
228 5708990770823839524233143877797980545530986496.0);
229 TEST_DOUBLE("[5708990770823839207320493820740630171355185152]",
230 5708990770823839524233143877797980545530986496.0);
231 TEST_DOUBLE("[5708990770823839207320493820740630171355185151999e-3]",
232 5708990770823838890407843763683279797179383808.0);
233 TEST_DOUBLE("[5708990770823839207320493820740630171355185152001e-3]",
234 5708990770823839524233143877797980545530986496.0);
235
236 {
237 char n1e308[312]; // '1' followed by 308 '0'
238 n1e308[0] = '[';
239 n1e308[1] = '1';
240 for (int j = 2; j < 310; j++)
241 {
242 n1e308[j] = '0';
243 }
244 n1e308[310] = ']';
245 n1e308[311] = '\0';
246 TEST_DOUBLE(n1e308, 1E308);
247 }
248
249 // Cover trimming
250 TEST_DOUBLE(
251 "[2.22507385850720113605740979670913197593481954635164564802342610972482222202107694551652952390813508"
252 "7914149158913039621106870086438694594645527657207407820621743379988141063267329253552286881372149012"
253 "9811224514518898490572223072852551331557550159143974763979834118019993239625482890171070818506906306"
254 "6665599493827577257201576306269066333264756530000924588831643303777979186961204949739037782970490505"
255 "1080609940730262937128958950003583799967207254304360284078895771796150945516748243471030702609144621"
256 "5722898802581825451803257070188608721131280795122334262883686223215037756666225039825343359745688844"
257 "2390026549819838548794829220689472168983109969836584681402285424333066033985088644580400103493397042"
258 "7567186443383770486037861622771738545623065874679014086723327636718751234567890123456789012345678901"
259 "e-308]",
260 2.2250738585072014e-308);
261 }
262
263 SECTION("strings")
264 {
265 auto TEST_STRING = [](const std::string & json_string, const std::string & expected)
__anon864b59a30202(const std::string & json_string, const std::string & expected) 266 {
267 CAPTURE(json_string)
268 CAPTURE(expected)
269 CHECK(json::parse(json_string)[0].get<std::string>() == expected);
270 };
271
272 TEST_STRING("[\"\"]", "");
273 TEST_STRING("[\"Hello\"]", "Hello");
274 TEST_STRING("[\"Hello\\nWorld\"]", "Hello\nWorld");
275 //TEST_STRING("[\"Hello\\u0000World\"]", "Hello\0World");
276 TEST_STRING("[\"\\\"\\\\/\\b\\f\\n\\r\\t\"]", "\"\\/\b\f\n\r\t");
277 TEST_STRING("[\"\\u0024\"]", "\x24"); // Dollar sign U+0024
278 TEST_STRING("[\"\\u00A2\"]", "\xC2\xA2"); // Cents sign U+00A2
279 TEST_STRING("[\"\\u20AC\"]", "\xE2\x82\xAC"); // Euro sign U+20AC
280 TEST_STRING("[\"\\uD834\\uDD1E\"]", "\xF0\x9D\x84\x9E"); // G clef sign U+1D11E
281 }
282
283 SECTION("roundtrip")
284 {
285 // test cases are from https://github.com/miloyip/nativejson-benchmark/tree/master/test/data/roundtrip
286
287 for (auto filename :
288 {
289 "test/data/json_roundtrip/roundtrip01.json",
290 "test/data/json_roundtrip/roundtrip02.json",
291 "test/data/json_roundtrip/roundtrip03.json",
292 "test/data/json_roundtrip/roundtrip04.json",
293 "test/data/json_roundtrip/roundtrip05.json",
294 "test/data/json_roundtrip/roundtrip06.json",
295 "test/data/json_roundtrip/roundtrip07.json",
296 "test/data/json_roundtrip/roundtrip08.json",
297 "test/data/json_roundtrip/roundtrip09.json",
298 "test/data/json_roundtrip/roundtrip10.json",
299 "test/data/json_roundtrip/roundtrip11.json",
300 "test/data/json_roundtrip/roundtrip12.json",
301 "test/data/json_roundtrip/roundtrip13.json",
302 "test/data/json_roundtrip/roundtrip14.json",
303 "test/data/json_roundtrip/roundtrip15.json",
304 "test/data/json_roundtrip/roundtrip16.json",
305 "test/data/json_roundtrip/roundtrip17.json",
306 "test/data/json_roundtrip/roundtrip18.json",
307 "test/data/json_roundtrip/roundtrip19.json",
308 "test/data/json_roundtrip/roundtrip20.json",
309 "test/data/json_roundtrip/roundtrip21.json",
310 "test/data/json_roundtrip/roundtrip22.json",
311 "test/data/json_roundtrip/roundtrip23.json",
312 "test/data/json_roundtrip/roundtrip24.json",
313 "test/data/json_roundtrip/roundtrip25.json",
314 "test/data/json_roundtrip/roundtrip26.json",
315 "test/data/json_roundtrip/roundtrip27.json",
316 //"test/data/json_roundtrip/roundtrip28.json", // incompatible with roundtrip24
317 "test/data/json_roundtrip/roundtrip29.json",
318 "test/data/json_roundtrip/roundtrip30.json",
319 "test/data/json_roundtrip/roundtrip31.json"
320 //"test/data/json_roundtrip/roundtrip32.json" // same as roundtrip31
321 })
322 {
323 CAPTURE(filename)
324 std::ifstream f(filename);
325 std::string json_string( (std::istreambuf_iterator<char>(f) ),
326 (std::istreambuf_iterator<char>()) );
327
328 CAPTURE(json_string)
329 json j = json::parse(json_string);
330 CHECK(j.dump() == json_string);
331 }
332 }
333 }
334
335 TEST_CASE("test suite from json-test-suite")
336 {
337 SECTION("read all sample.json")
338 {
339 // read a file with all unicode characters stored as single-character
340 // strings in a JSON array
341 std::ifstream f("test/data/json_testsuite/sample.json");
342 json j;
343 CHECK_NOTHROW(f >> j);
344
345 // the array has 3 elements
346 CHECK(j.size() == 3);
347 }
348 }
349
350 TEST_CASE("json.org examples")
351 {
352 // here, we list all JSON values from http://json.org/example
353
354 SECTION("1.json")
355 {
356 std::ifstream f("test/data/json.org/1.json");
357 json j;
358 CHECK_NOTHROW(f >> j);
359 }
360
361 SECTION("2.json")
362 {
363 std::ifstream f("test/data/json.org/2.json");
364 json j;
365 CHECK_NOTHROW(f >> j);
366 }
367
368 SECTION("3.json")
369 {
370 std::ifstream f("test/data/json.org/3.json");
371 json j;
372 CHECK_NOTHROW(f >> j);
373 }
374
375 SECTION("4.json")
376 {
377 std::ifstream f("test/data/json.org/4.json");
378 json j;
379 CHECK_NOTHROW(f >> j);
380 }
381
382 SECTION("5.json")
383 {
384 std::ifstream f("test/data/json.org/5.json");
385 json j;
386 CHECK_NOTHROW(f >> j);
387 }
388 SECTION("FILE 1.json")
389 {
390 std::unique_ptr<std::FILE, decltype(&std::fclose)> f(std::fopen("test/data/json.org/1.json", "r"), &std::fclose);
391 json _;
392 CHECK_NOTHROW(_ = json::parse(f.get()));
393 }
394
395 SECTION("FILE 2.json")
396 {
397 std::unique_ptr<std::FILE, decltype(&std::fclose)> f(std::fopen("test/data/json.org/2.json", "r"), &std::fclose);
398 json _;
399 CHECK_NOTHROW(_ = json::parse(f.get()));
400 }
401
402 SECTION("FILE 3.json")
403 {
404 std::unique_ptr<std::FILE, decltype(&std::fclose)> f(std::fopen("test/data/json.org/3.json", "r"), &std::fclose);
405 json _;
406 CHECK_NOTHROW(_ = json::parse(f.get()));
407 }
408
409 SECTION("FILE 4.json")
410 {
411 std::unique_ptr<std::FILE, decltype(&std::fclose)> f(std::fopen("test/data/json.org/4.json", "r"), &std::fclose);
412 json _;
413 CHECK_NOTHROW(_ = json::parse(f.get()));
414 }
415
416 SECTION("FILE 5.json")
417 {
418 std::unique_ptr<std::FILE, decltype(&std::fclose)> f(std::fopen("test/data/json.org/5.json", "r"), &std::fclose);
419 json _;
420 CHECK_NOTHROW(_ = json::parse(f.get()));
421 }
422 }
423
424 TEST_CASE("RFC 7159 examples")
425 {
426 // here, we list all JSON values from the RFC 7159 document
427
428 SECTION("7. Strings")
429 {
430 CHECK(json::parse("\"\\u005C\"") == json("\\"));
431 CHECK(json::parse("\"\\uD834\\uDD1E\"") == json(""));
432 CHECK(json::parse("\"\"") == json(""));
433 }
434
435 SECTION("8.3 String Comparison")
436 {
437 CHECK(json::parse("\"a\\b\"") == json::parse("\"a\u005Cb\""));
438 }
439
440 SECTION("13 Examples")
441 {
442 {
443 auto json_contents = R"(
444 {
445 "Image": {
446 "Width": 800,
447 "Height": 600,
448 "Title": "View from 15th Floor",
449 "Thumbnail": {
450 "Url": "http://www.example.com/image/481989943",
451 "Height": 125,
452 "Width": 100
453 },
454 "Animated" : false,
455 "IDs": [116, 943, 234, 38793]
456 }
457 }
458 )";
459
460 CHECK_NOTHROW(json(json_contents));
461 }
462
463 {
464 auto json_contents = R"(
465 [
466 {
467 "precision": "zip",
468 "Latitude": 37.7668,
469 "Longitude": -122.3959,
470 "Address": "",
471 "City": "SAN FRANCISCO",
472 "State": "CA",
473 "Zip": "94107",
474 "Country": "US"
475 },
476 {
477 "precision": "zip",
478 "Latitude": 37.371991,
479 "Longitude": -122.026020,
480 "Address": "",
481 "City": "SUNNYVALE",
482 "State": "CA",
483 "Zip": "94085",
484 "Country": "US"
485 }
486 ])";
487 CHECK_NOTHROW(json(json_contents));
488 }
489
490 CHECK(json::parse("\"Hello world!\"") == json("Hello world!"));
491 CHECK(json::parse("42") == json(42));
492 CHECK(json::parse("true") == json(true));
493 }
494 }
495
496 TEST_CASE("nst's JSONTestSuite")
497 {
498 SECTION("test_parsing")
499 {
500 SECTION("y")
501 {
502 for (auto filename :
503 {
504 "test/data/nst_json_testsuite/test_parsing/y_array_arraysWithSpaces.json",
505 "test/data/nst_json_testsuite/test_parsing/y_array_empty-string.json",
506 "test/data/nst_json_testsuite/test_parsing/y_array_empty.json",
507 "test/data/nst_json_testsuite/test_parsing/y_array_ending_with_newline.json",
508 "test/data/nst_json_testsuite/test_parsing/y_array_false.json",
509 "test/data/nst_json_testsuite/test_parsing/y_array_heterogeneous.json",
510 "test/data/nst_json_testsuite/test_parsing/y_array_null.json",
511 "test/data/nst_json_testsuite/test_parsing/y_array_with_1_and_newline.json",
512 "test/data/nst_json_testsuite/test_parsing/y_array_with_leading_space.json",
513 "test/data/nst_json_testsuite/test_parsing/y_array_with_several_null.json",
514 "test/data/nst_json_testsuite/test_parsing/y_array_with_trailing_space.json",
515 "test/data/nst_json_testsuite/test_parsing/y_number.json",
516 "test/data/nst_json_testsuite/test_parsing/y_number_0e+1.json",
517 "test/data/nst_json_testsuite/test_parsing/y_number_0e1.json",
518 "test/data/nst_json_testsuite/test_parsing/y_number_after_space.json",
519 "test/data/nst_json_testsuite/test_parsing/y_number_double_close_to_zero.json",
520 "test/data/nst_json_testsuite/test_parsing/y_number_double_huge_neg_exp.json",
521 "test/data/nst_json_testsuite/test_parsing/y_number_int_with_exp.json",
522 "test/data/nst_json_testsuite/test_parsing/y_number_minus_zero.json",
523 "test/data/nst_json_testsuite/test_parsing/y_number_negative_int.json",
524 "test/data/nst_json_testsuite/test_parsing/y_number_negative_one.json",
525 "test/data/nst_json_testsuite/test_parsing/y_number_negative_zero.json",
526 "test/data/nst_json_testsuite/test_parsing/y_number_real_capital_e.json",
527 "test/data/nst_json_testsuite/test_parsing/y_number_real_capital_e_neg_exp.json",
528 "test/data/nst_json_testsuite/test_parsing/y_number_real_capital_e_pos_exp.json",
529 "test/data/nst_json_testsuite/test_parsing/y_number_real_exponent.json",
530 "test/data/nst_json_testsuite/test_parsing/y_number_real_fraction_exponent.json",
531 "test/data/nst_json_testsuite/test_parsing/y_number_real_neg_exp.json",
532 "test/data/nst_json_testsuite/test_parsing/y_number_real_pos_exponent.json",
533 "test/data/nst_json_testsuite/test_parsing/y_number_real_underflow.json",
534 "test/data/nst_json_testsuite/test_parsing/y_number_simple_int.json",
535 "test/data/nst_json_testsuite/test_parsing/y_number_simple_real.json",
536 "test/data/nst_json_testsuite/test_parsing/y_number_too_big_neg_int.json",
537 "test/data/nst_json_testsuite/test_parsing/y_number_too_big_pos_int.json",
538 "test/data/nst_json_testsuite/test_parsing/y_number_very_big_negative_int.json",
539 "test/data/nst_json_testsuite/test_parsing/y_object.json",
540 "test/data/nst_json_testsuite/test_parsing/y_object_basic.json",
541 "test/data/nst_json_testsuite/test_parsing/y_object_duplicated_key.json",
542 "test/data/nst_json_testsuite/test_parsing/y_object_duplicated_key_and_value.json",
543 "test/data/nst_json_testsuite/test_parsing/y_object_empty.json",
544 "test/data/nst_json_testsuite/test_parsing/y_object_empty_key.json",
545 "test/data/nst_json_testsuite/test_parsing/y_object_escaped_null_in_key.json",
546 "test/data/nst_json_testsuite/test_parsing/y_object_extreme_numbers.json",
547 "test/data/nst_json_testsuite/test_parsing/y_object_long_strings.json",
548 "test/data/nst_json_testsuite/test_parsing/y_object_simple.json",
549 "test/data/nst_json_testsuite/test_parsing/y_object_string_unicode.json",
550 "test/data/nst_json_testsuite/test_parsing/y_object_with_newlines.json",
551 "test/data/nst_json_testsuite/test_parsing/y_string_1_2_3_bytes_UTF-8_sequences.json",
552 "test/data/nst_json_testsuite/test_parsing/y_string_UTF-16_Surrogates_U+1D11E_MUSICAL_SYMBOL_G_CLEF.json",
553 "test/data/nst_json_testsuite/test_parsing/y_string_accepted_surrogate_pair.json",
554 "test/data/nst_json_testsuite/test_parsing/y_string_accepted_surrogate_pairs.json",
555 "test/data/nst_json_testsuite/test_parsing/y_string_allowed_escapes.json",
556 "test/data/nst_json_testsuite/test_parsing/y_string_backslash_and_u_escaped_zero.json",
557 "test/data/nst_json_testsuite/test_parsing/y_string_backslash_doublequotes.json",
558 "test/data/nst_json_testsuite/test_parsing/y_string_comments.json",
559 "test/data/nst_json_testsuite/test_parsing/y_string_double_escape_a.json",
560 "test/data/nst_json_testsuite/test_parsing/y_string_double_escape_n.json",
561 "test/data/nst_json_testsuite/test_parsing/y_string_escaped_control_character.json",
562 "test/data/nst_json_testsuite/test_parsing/y_string_escaped_noncharacter.json",
563 "test/data/nst_json_testsuite/test_parsing/y_string_in_array.json",
564 "test/data/nst_json_testsuite/test_parsing/y_string_in_array_with_leading_space.json",
565 "test/data/nst_json_testsuite/test_parsing/y_string_last_surrogates_1_and_2.json",
566 "test/data/nst_json_testsuite/test_parsing/y_string_newline_uescaped.json",
567 "test/data/nst_json_testsuite/test_parsing/y_string_nonCharacterInUTF-8_U+10FFFF.json",
568 "test/data/nst_json_testsuite/test_parsing/y_string_nonCharacterInUTF-8_U+1FFFF.json",
569 "test/data/nst_json_testsuite/test_parsing/y_string_nonCharacterInUTF-8_U+FFFF.json",
570 "test/data/nst_json_testsuite/test_parsing/y_string_null_escape.json",
571 "test/data/nst_json_testsuite/test_parsing/y_string_one-byte-utf-8.json",
572 "test/data/nst_json_testsuite/test_parsing/y_string_pi.json",
573 "test/data/nst_json_testsuite/test_parsing/y_string_simple_ascii.json",
574 "test/data/nst_json_testsuite/test_parsing/y_string_space.json",
575 "test/data/nst_json_testsuite/test_parsing/y_string_three-byte-utf-8.json",
576 "test/data/nst_json_testsuite/test_parsing/y_string_two-byte-utf-8.json",
577 "test/data/nst_json_testsuite/test_parsing/y_string_u+2028_line_sep.json",
578 "test/data/nst_json_testsuite/test_parsing/y_string_u+2029_par_sep.json",
579 "test/data/nst_json_testsuite/test_parsing/y_string_uEscape.json",
580 "test/data/nst_json_testsuite/test_parsing/y_string_unescaped_char_delete.json",
581 "test/data/nst_json_testsuite/test_parsing/y_string_unicode.json",
582 "test/data/nst_json_testsuite/test_parsing/y_string_unicodeEscapedBackslash.json",
583 "test/data/nst_json_testsuite/test_parsing/y_string_unicode_2.json",
584 "test/data/nst_json_testsuite/test_parsing/y_string_unicode_U+200B_ZERO_WIDTH_SPACE.json",
585 "test/data/nst_json_testsuite/test_parsing/y_string_unicode_U+2064_invisible_plus.json",
586 "test/data/nst_json_testsuite/test_parsing/y_string_unicode_escaped_double_quote.json",
587 // "test/data/nst_json_testsuite/test_parsing/y_string_utf16.json",
588 "test/data/nst_json_testsuite/test_parsing/y_string_utf8.json",
589 "test/data/nst_json_testsuite/test_parsing/y_string_with_del_character.json",
590 "test/data/nst_json_testsuite/test_parsing/y_structure_lonely_false.json",
591 "test/data/nst_json_testsuite/test_parsing/y_structure_lonely_int.json",
592 "test/data/nst_json_testsuite/test_parsing/y_structure_lonely_negative_real.json",
593 "test/data/nst_json_testsuite/test_parsing/y_structure_lonely_null.json",
594 "test/data/nst_json_testsuite/test_parsing/y_structure_lonely_string.json",
595 "test/data/nst_json_testsuite/test_parsing/y_structure_lonely_true.json",
596 "test/data/nst_json_testsuite/test_parsing/y_structure_string_empty.json",
597 "test/data/nst_json_testsuite/test_parsing/y_structure_trailing_newline.json",
598 "test/data/nst_json_testsuite/test_parsing/y_structure_true_in_array.json",
599 "test/data/nst_json_testsuite/test_parsing/y_structure_whitespace_array.json"
600 }
601 )
602 {
603 CAPTURE(filename)
604 std::ifstream f(filename);
605 json j;
606 CHECK_NOTHROW(f >> j);
607 }
608 }
609
610 SECTION("n")
611 {
612 for (auto filename :
613 {
614 "test/data/nst_json_testsuite/test_parsing/n_array_1_true_without_comma.json",
615 "test/data/nst_json_testsuite/test_parsing/n_array_a_invalid_utf8.json",
616 "test/data/nst_json_testsuite/test_parsing/n_array_colon_instead_of_comma.json",
617 "test/data/nst_json_testsuite/test_parsing/n_array_comma_after_close.json",
618 "test/data/nst_json_testsuite/test_parsing/n_array_comma_and_number.json",
619 "test/data/nst_json_testsuite/test_parsing/n_array_double_comma.json",
620 "test/data/nst_json_testsuite/test_parsing/n_array_double_extra_comma.json",
621 "test/data/nst_json_testsuite/test_parsing/n_array_extra_close.json",
622 "test/data/nst_json_testsuite/test_parsing/n_array_extra_comma.json",
623 "test/data/nst_json_testsuite/test_parsing/n_array_incomplete.json",
624 "test/data/nst_json_testsuite/test_parsing/n_array_incomplete_invalid_value.json",
625 "test/data/nst_json_testsuite/test_parsing/n_array_inner_array_no_comma.json",
626 "test/data/nst_json_testsuite/test_parsing/n_array_invalid_utf8.json",
627 "test/data/nst_json_testsuite/test_parsing/n_array_items_separated_by_semicolon.json",
628 "test/data/nst_json_testsuite/test_parsing/n_array_just_comma.json",
629 "test/data/nst_json_testsuite/test_parsing/n_array_just_minus.json",
630 "test/data/nst_json_testsuite/test_parsing/n_array_missing_value.json",
631 "test/data/nst_json_testsuite/test_parsing/n_array_newlines_unclosed.json",
632 "test/data/nst_json_testsuite/test_parsing/n_array_number_and_comma.json",
633 "test/data/nst_json_testsuite/test_parsing/n_array_number_and_several_commas.json",
634 "test/data/nst_json_testsuite/test_parsing/n_array_spaces_vertical_tab_formfeed.json",
635 "test/data/nst_json_testsuite/test_parsing/n_array_star_inside.json",
636 "test/data/nst_json_testsuite/test_parsing/n_array_unclosed.json",
637 "test/data/nst_json_testsuite/test_parsing/n_array_unclosed_trailing_comma.json",
638 "test/data/nst_json_testsuite/test_parsing/n_array_unclosed_with_new_lines.json",
639 "test/data/nst_json_testsuite/test_parsing/n_array_unclosed_with_object_inside.json",
640 "test/data/nst_json_testsuite/test_parsing/n_incomplete_false.json",
641 "test/data/nst_json_testsuite/test_parsing/n_incomplete_null.json",
642 "test/data/nst_json_testsuite/test_parsing/n_incomplete_true.json",
643 "test/data/nst_json_testsuite/test_parsing/n_number_++.json",
644 "test/data/nst_json_testsuite/test_parsing/n_number_+1.json",
645 "test/data/nst_json_testsuite/test_parsing/n_number_+Inf.json",
646 "test/data/nst_json_testsuite/test_parsing/n_number_-01.json",
647 "test/data/nst_json_testsuite/test_parsing/n_number_-1.0..json",
648 "test/data/nst_json_testsuite/test_parsing/n_number_-2..json",
649 "test/data/nst_json_testsuite/test_parsing/n_number_-NaN.json",
650 "test/data/nst_json_testsuite/test_parsing/n_number_.-1.json",
651 "test/data/nst_json_testsuite/test_parsing/n_number_.2e-3.json",
652 "test/data/nst_json_testsuite/test_parsing/n_number_0.1.2.json",
653 "test/data/nst_json_testsuite/test_parsing/n_number_0.3e+.json",
654 "test/data/nst_json_testsuite/test_parsing/n_number_0.3e.json",
655 "test/data/nst_json_testsuite/test_parsing/n_number_0.e1.json",
656 "test/data/nst_json_testsuite/test_parsing/n_number_0_capital_E+.json",
657 "test/data/nst_json_testsuite/test_parsing/n_number_0_capital_E.json",
658 "test/data/nst_json_testsuite/test_parsing/n_number_0e+.json",
659 "test/data/nst_json_testsuite/test_parsing/n_number_0e.json",
660 "test/data/nst_json_testsuite/test_parsing/n_number_1.0e+.json",
661 "test/data/nst_json_testsuite/test_parsing/n_number_1.0e-.json",
662 "test/data/nst_json_testsuite/test_parsing/n_number_1.0e.json",
663 "test/data/nst_json_testsuite/test_parsing/n_number_1_000.json",
664 "test/data/nst_json_testsuite/test_parsing/n_number_1eE2.json",
665 "test/data/nst_json_testsuite/test_parsing/n_number_2.e+3.json",
666 "test/data/nst_json_testsuite/test_parsing/n_number_2.e-3.json",
667 "test/data/nst_json_testsuite/test_parsing/n_number_2.e3.json",
668 "test/data/nst_json_testsuite/test_parsing/n_number_9.e+.json",
669 "test/data/nst_json_testsuite/test_parsing/n_number_Inf.json",
670 "test/data/nst_json_testsuite/test_parsing/n_number_NaN.json",
671 "test/data/nst_json_testsuite/test_parsing/n_number_U+FF11_fullwidth_digit_one.json",
672 "test/data/nst_json_testsuite/test_parsing/n_number_expression.json",
673 "test/data/nst_json_testsuite/test_parsing/n_number_hex_1_digit.json",
674 "test/data/nst_json_testsuite/test_parsing/n_number_hex_2_digits.json",
675 "test/data/nst_json_testsuite/test_parsing/n_number_infinity.json",
676 "test/data/nst_json_testsuite/test_parsing/n_number_invalid+-.json",
677 "test/data/nst_json_testsuite/test_parsing/n_number_invalid-negative-real.json",
678 "test/data/nst_json_testsuite/test_parsing/n_number_invalid-utf-8-in-bigger-int.json",
679 "test/data/nst_json_testsuite/test_parsing/n_number_invalid-utf-8-in-exponent.json",
680 "test/data/nst_json_testsuite/test_parsing/n_number_invalid-utf-8-in-int.json",
681 "test/data/nst_json_testsuite/test_parsing/n_number_minus_infinity.json",
682 "test/data/nst_json_testsuite/test_parsing/n_number_minus_sign_with_trailing_garbage.json",
683 "test/data/nst_json_testsuite/test_parsing/n_number_minus_space_1.json",
684 "test/data/nst_json_testsuite/test_parsing/n_number_neg_int_starting_with_zero.json",
685 "test/data/nst_json_testsuite/test_parsing/n_number_neg_real_without_int_part.json",
686 "test/data/nst_json_testsuite/test_parsing/n_number_neg_with_garbage_at_end.json",
687 "test/data/nst_json_testsuite/test_parsing/n_number_real_garbage_after_e.json",
688 "test/data/nst_json_testsuite/test_parsing/n_number_real_with_invalid_utf8_after_e.json",
689 "test/data/nst_json_testsuite/test_parsing/n_number_real_without_fractional_part.json",
690 "test/data/nst_json_testsuite/test_parsing/n_number_starting_with_dot.json",
691 //"test/data/nst_json_testsuite/test_parsing/n_number_then_00.json",
692 "test/data/nst_json_testsuite/test_parsing/n_number_with_alpha.json",
693 "test/data/nst_json_testsuite/test_parsing/n_number_with_alpha_char.json",
694 "test/data/nst_json_testsuite/test_parsing/n_number_with_leading_zero.json",
695 "test/data/nst_json_testsuite/test_parsing/n_object_bad_value.json",
696 "test/data/nst_json_testsuite/test_parsing/n_object_bracket_key.json",
697 "test/data/nst_json_testsuite/test_parsing/n_object_comma_instead_of_colon.json",
698 "test/data/nst_json_testsuite/test_parsing/n_object_double_colon.json",
699 "test/data/nst_json_testsuite/test_parsing/n_object_emoji.json",
700 "test/data/nst_json_testsuite/test_parsing/n_object_garbage_at_end.json",
701 "test/data/nst_json_testsuite/test_parsing/n_object_key_with_single_quotes.json",
702 "test/data/nst_json_testsuite/test_parsing/n_object_missing_colon.json",
703 "test/data/nst_json_testsuite/test_parsing/n_object_missing_key.json",
704 "test/data/nst_json_testsuite/test_parsing/n_object_missing_semicolon.json",
705 "test/data/nst_json_testsuite/test_parsing/n_object_missing_value.json",
706 "test/data/nst_json_testsuite/test_parsing/n_object_no-colon.json",
707 "test/data/nst_json_testsuite/test_parsing/n_object_non_string_key.json",
708 "test/data/nst_json_testsuite/test_parsing/n_object_non_string_key_but_huge_number_instead.json",
709 "test/data/nst_json_testsuite/test_parsing/n_object_pi_in_key_and_trailing_comma.json",
710 "test/data/nst_json_testsuite/test_parsing/n_object_repeated_null_null.json",
711 "test/data/nst_json_testsuite/test_parsing/n_object_several_trailing_commas.json",
712 "test/data/nst_json_testsuite/test_parsing/n_object_single_quote.json",
713 "test/data/nst_json_testsuite/test_parsing/n_object_trailing_comma.json",
714 "test/data/nst_json_testsuite/test_parsing/n_object_trailing_comment.json",
715 "test/data/nst_json_testsuite/test_parsing/n_object_trailing_comment_open.json",
716 "test/data/nst_json_testsuite/test_parsing/n_object_trailing_comment_slash_open.json",
717 "test/data/nst_json_testsuite/test_parsing/n_object_trailing_comment_slash_open_incomplete.json",
718 "test/data/nst_json_testsuite/test_parsing/n_object_two_commas_in_a_row.json",
719 "test/data/nst_json_testsuite/test_parsing/n_object_unquoted_key.json",
720 "test/data/nst_json_testsuite/test_parsing/n_object_unterminated-value.json",
721 "test/data/nst_json_testsuite/test_parsing/n_object_with_single_string.json",
722 "test/data/nst_json_testsuite/test_parsing/n_object_with_trailing_garbage.json",
723 "test/data/nst_json_testsuite/test_parsing/n_single_space.json",
724 "test/data/nst_json_testsuite/test_parsing/n_string_1_surrogate_then_escape u.json",
725 "test/data/nst_json_testsuite/test_parsing/n_string_1_surrogate_then_escape u1.json",
726 "test/data/nst_json_testsuite/test_parsing/n_string_1_surrogate_then_escape u1x.json",
727 "test/data/nst_json_testsuite/test_parsing/n_string_1_surrogate_then_escape.json",
728 "test/data/nst_json_testsuite/test_parsing/n_string_UTF-16_incomplete_surrogate.json",
729 "test/data/nst_json_testsuite/test_parsing/n_string_UTF8_surrogate_U+D800.json",
730 "test/data/nst_json_testsuite/test_parsing/n_string_accentuated_char_no_quotes.json",
731 "test/data/nst_json_testsuite/test_parsing/n_string_backslash_00.json",
732 "test/data/nst_json_testsuite/test_parsing/n_string_escape_x.json",
733 "test/data/nst_json_testsuite/test_parsing/n_string_escaped_backslash_bad.json",
734 "test/data/nst_json_testsuite/test_parsing/n_string_escaped_ctrl_char_tab.json",
735 "test/data/nst_json_testsuite/test_parsing/n_string_escaped_emoji.json",
736 "test/data/nst_json_testsuite/test_parsing/n_string_incomplete_escape.json",
737 "test/data/nst_json_testsuite/test_parsing/n_string_incomplete_escaped_character.json",
738 "test/data/nst_json_testsuite/test_parsing/n_string_incomplete_surrogate_escape_invalid.json",
739 "test/data/nst_json_testsuite/test_parsing/n_string_invalid-utf-8-in-escape.json",
740 "test/data/nst_json_testsuite/test_parsing/n_string_invalid_backslash_esc.json",
741 "test/data/nst_json_testsuite/test_parsing/n_string_invalid_unicode_escape.json",
742 "test/data/nst_json_testsuite/test_parsing/n_string_invalid_utf-8.json",
743 "test/data/nst_json_testsuite/test_parsing/n_string_invalid_utf8_after_escape.json",
744 "test/data/nst_json_testsuite/test_parsing/n_string_iso_latin_1.json",
745 "test/data/nst_json_testsuite/test_parsing/n_string_leading_uescaped_thinspace.json",
746 "test/data/nst_json_testsuite/test_parsing/n_string_lone_utf8_continuation_byte.json",
747 "test/data/nst_json_testsuite/test_parsing/n_string_no_quotes_with_bad_escape.json",
748 "test/data/nst_json_testsuite/test_parsing/n_string_overlong_sequence_2_bytes.json",
749 "test/data/nst_json_testsuite/test_parsing/n_string_overlong_sequence_6_bytes.json",
750 "test/data/nst_json_testsuite/test_parsing/n_string_overlong_sequence_6_bytes_null.json",
751 "test/data/nst_json_testsuite/test_parsing/n_string_single_doublequote.json",
752 "test/data/nst_json_testsuite/test_parsing/n_string_single_quote.json",
753 "test/data/nst_json_testsuite/test_parsing/n_string_single_string_no_double_quotes.json",
754 "test/data/nst_json_testsuite/test_parsing/n_string_start_escape_unclosed.json",
755 "test/data/nst_json_testsuite/test_parsing/n_string_unescaped_crtl_char.json",
756 "test/data/nst_json_testsuite/test_parsing/n_string_unescaped_newline.json",
757 "test/data/nst_json_testsuite/test_parsing/n_string_unescaped_tab.json",
758 "test/data/nst_json_testsuite/test_parsing/n_string_unicode_CapitalU.json",
759 "test/data/nst_json_testsuite/test_parsing/n_string_with_trailing_garbage.json",
760 //!"test/data/nst_json_testsuite/test_parsing/n_structure_100000_opening_arrays.json",
761 "test/data/nst_json_testsuite/test_parsing/n_structure_3C.3E.json",
762 "test/data/nst_json_testsuite/test_parsing/n_structure_3Cnull3E.json",
763 "test/data/nst_json_testsuite/test_parsing/n_structure_U+2060_word_joined.json",
764 "test/data/nst_json_testsuite/test_parsing/n_structure_UTF8_BOM_no_data.json",
765 "test/data/nst_json_testsuite/test_parsing/n_structure_array_trailing_garbage.json",
766 "test/data/nst_json_testsuite/test_parsing/n_structure_array_with_extra_array_close.json",
767 "test/data/nst_json_testsuite/test_parsing/n_structure_array_with_unclosed_string.json",
768 "test/data/nst_json_testsuite/test_parsing/n_structure_ascii-unicode-identifier.json",
769 "test/data/nst_json_testsuite/test_parsing/n_structure_capitalized_True.json",
770 "test/data/nst_json_testsuite/test_parsing/n_structure_close_unopened_array.json",
771 "test/data/nst_json_testsuite/test_parsing/n_structure_comma_instead_of_closing_brace.json",
772 "test/data/nst_json_testsuite/test_parsing/n_structure_double_array.json",
773 "test/data/nst_json_testsuite/test_parsing/n_structure_end_array.json",
774 "test/data/nst_json_testsuite/test_parsing/n_structure_incomplete_UTF8_BOM.json",
775 "test/data/nst_json_testsuite/test_parsing/n_structure_lone-invalid-utf-8.json",
776 "test/data/nst_json_testsuite/test_parsing/n_structure_lone-open-bracket.json",
777 "test/data/nst_json_testsuite/test_parsing/n_structure_no_data.json",
778 "test/data/nst_json_testsuite/test_parsing/n_structure_null-byte-outside-string.json",
779 "test/data/nst_json_testsuite/test_parsing/n_structure_number_with_trailing_garbage.json",
780 "test/data/nst_json_testsuite/test_parsing/n_structure_object_followed_by_closing_object.json",
781 "test/data/nst_json_testsuite/test_parsing/n_structure_object_unclosed_no_value.json",
782 "test/data/nst_json_testsuite/test_parsing/n_structure_object_with_comment.json",
783 "test/data/nst_json_testsuite/test_parsing/n_structure_object_with_trailing_garbage.json",
784 "test/data/nst_json_testsuite/test_parsing/n_structure_open_array_apostrophe.json",
785 "test/data/nst_json_testsuite/test_parsing/n_structure_open_array_comma.json",
786 //!"test/data/nst_json_testsuite/test_parsing/n_structure_open_array_object.json",
787 "test/data/nst_json_testsuite/test_parsing/n_structure_open_array_open_object.json",
788 "test/data/nst_json_testsuite/test_parsing/n_structure_open_array_open_string.json",
789 "test/data/nst_json_testsuite/test_parsing/n_structure_open_array_string.json",
790 "test/data/nst_json_testsuite/test_parsing/n_structure_open_object.json",
791 "test/data/nst_json_testsuite/test_parsing/n_structure_open_object_close_array.json",
792 "test/data/nst_json_testsuite/test_parsing/n_structure_open_object_comma.json",
793 "test/data/nst_json_testsuite/test_parsing/n_structure_open_object_open_array.json",
794 "test/data/nst_json_testsuite/test_parsing/n_structure_open_object_open_string.json",
795 "test/data/nst_json_testsuite/test_parsing/n_structure_open_object_string_with_apostrophes.json",
796 "test/data/nst_json_testsuite/test_parsing/n_structure_open_open.json",
797 "test/data/nst_json_testsuite/test_parsing/n_structure_single_point.json",
798 "test/data/nst_json_testsuite/test_parsing/n_structure_single_star.json",
799 "test/data/nst_json_testsuite/test_parsing/n_structure_trailing_#.json",
800 "test/data/nst_json_testsuite/test_parsing/n_structure_uescaped_LF_before_string.json",
801 "test/data/nst_json_testsuite/test_parsing/n_structure_unclosed_array.json",
802 "test/data/nst_json_testsuite/test_parsing/n_structure_unclosed_array_partial_null.json",
803 "test/data/nst_json_testsuite/test_parsing/n_structure_unclosed_array_unfinished_false.json",
804 "test/data/nst_json_testsuite/test_parsing/n_structure_unclosed_array_unfinished_true.json",
805 "test/data/nst_json_testsuite/test_parsing/n_structure_unclosed_object.json",
806 "test/data/nst_json_testsuite/test_parsing/n_structure_unicode-identifier.json",
807 "test/data/nst_json_testsuite/test_parsing/n_structure_whitespace_U+2060_word_joiner.json",
808 "test/data/nst_json_testsuite/test_parsing/n_structure_whitespace_formfeed.json"
809 }
810 )
811 {
812 CAPTURE(filename)
813 std::ifstream f(filename);
814 json _;
815 CHECK_THROWS_AS(_ = json::parse(f), json::parse_error&);
816 }
817 }
818
819 SECTION("n -> y (relaxed)")
820 {
821 // these tests fail above, because the parser does not end on EOF;
822 // they succeed when the operator>> is used, because it does not
823 // have this constraint
824 for (auto filename :
825 {
826 "test/data/nst_json_testsuite/test_parsing/n_array_comma_after_close.json",
827 "test/data/nst_json_testsuite/test_parsing/n_array_extra_close.json",
828 "test/data/nst_json_testsuite/test_parsing/n_object_trailing_comment.json",
829 "test/data/nst_json_testsuite/test_parsing/n_object_trailing_comment_open.json",
830 "test/data/nst_json_testsuite/test_parsing/n_object_trailing_comment_slash_open.json",
831 "test/data/nst_json_testsuite/test_parsing/n_object_trailing_comment_slash_open_incomplete.json",
832 "test/data/nst_json_testsuite/test_parsing/n_object_with_trailing_garbage.json",
833 "test/data/nst_json_testsuite/test_parsing/n_string_with_trailing_garbage.json",
834 "test/data/nst_json_testsuite/test_parsing/n_structure_array_trailing_garbage.json",
835 "test/data/nst_json_testsuite/test_parsing/n_structure_array_with_extra_array_close.json",
836 "test/data/nst_json_testsuite/test_parsing/n_structure_close_unopened_array.json",
837 "test/data/nst_json_testsuite/test_parsing/n_structure_double_array.json",
838 "test/data/nst_json_testsuite/test_parsing/n_structure_number_with_trailing_garbage.json",
839 "test/data/nst_json_testsuite/test_parsing/n_structure_object_followed_by_closing_object.json",
840 "test/data/nst_json_testsuite/test_parsing/n_structure_object_with_trailing_garbage.json",
841 "test/data/nst_json_testsuite/test_parsing/n_structure_trailing_#.json"
842 }
843 )
844 {
845 CAPTURE(filename)
846 std::ifstream f(filename);
847 json j;
848 CHECK_NOTHROW(f >> j);
849 }
850 }
851
852 SECTION("i -> y")
853 {
854 for (auto filename :
855 {
856 // we do not pose a limit on nesting
857 "test/data/nst_json_testsuite/test_parsing/i_structure_500_nested_arrays.json",
858 // we silently ignore BOMs
859 "test/data/nst_json_testsuite/test_parsing/i_structure_UTF-8_BOM_empty_object.json",
860 // we accept and forward non-characters
861 "test/data/nst_json_testsuite/test_parsing/i_string_unicode_U+10FFFE_nonchar.json",
862 "test/data/nst_json_testsuite/test_parsing/i_string_unicode_U+1FFFE_nonchar.json",
863 "test/data/nst_json_testsuite/test_parsing/i_string_unicode_U+FDD0_nonchar.json",
864 "test/data/nst_json_testsuite/test_parsing/i_string_unicode_U+FFFE_nonchar.json"
865 }
866 )
867 {
868 CAPTURE(filename)
869 std::ifstream f(filename);
870 json j;
871 CHECK_NOTHROW(f >> j);
872 }
873 }
874
875 // numbers that overflow during parsing
876 SECTION("i/y -> n (out of range)")
877 {
878 for (auto filename :
879 {
880 "test/data/nst_json_testsuite/test_parsing/i_number_neg_int_huge_exp.json",
881 "test/data/nst_json_testsuite/test_parsing/i_number_pos_double_huge_exp.json",
882 "test/data/nst_json_testsuite/test_parsing/y_number_huge_exp.json",
883 "test/data/nst_json_testsuite/test_parsing/y_number_real_neg_overflow.json",
884 "test/data/nst_json_testsuite/test_parsing/y_number_real_pos_overflow.json"
885 }
886 )
887 {
888 CAPTURE(filename)
889 std::ifstream f(filename);
890 json j;
891 CHECK_THROWS_AS(f >> j, json::out_of_range&);
892 }
893 }
894
895 SECTION("i -> n")
896 {
897 for (auto filename :
898 {
899 "test/data/nst_json_testsuite/test_parsing/i_object_key_lone_2nd_surrogate.json",
900 "test/data/nst_json_testsuite/test_parsing/i_string_1st_surrogate_but_2nd_missing.json",
901 "test/data/nst_json_testsuite/test_parsing/i_string_1st_valid_surrogate_2nd_invalid.json",
902 "test/data/nst_json_testsuite/test_parsing/i_string_UTF-16_invalid_lonely_surrogate.json",
903 "test/data/nst_json_testsuite/test_parsing/i_string_UTF-16_invalid_surrogate.json",
904 "test/data/nst_json_testsuite/test_parsing/i_string_UTF-8_invalid_sequence.json",
905 "test/data/nst_json_testsuite/test_parsing/i_string_incomplete_surrogate_and_escape_valid.json",
906 "test/data/nst_json_testsuite/test_parsing/i_string_incomplete_surrogate_pair.json",
907 "test/data/nst_json_testsuite/test_parsing/i_string_incomplete_surrogates_escape_valid.json",
908 "test/data/nst_json_testsuite/test_parsing/i_string_inverted_surrogates_U+1D11E.json",
909 "test/data/nst_json_testsuite/test_parsing/i_string_lone_second_surrogate.json",
910 "test/data/nst_json_testsuite/test_parsing/i_string_not_in_unicode_range.json",
911 "test/data/nst_json_testsuite/test_parsing/i_string_truncated-utf-8.json"
912 }
913 )
914 {
915 CAPTURE(filename)
916 std::ifstream f(filename);
917 json j;
918 CHECK_THROWS_AS(f >> j, json::parse_error&);
919 }
920 }
921 }
922 }
923
924 TEST_CASE("nst's JSONTestSuite (2)")
925 {
926 SECTION("test_parsing")
927 {
928 SECTION("y")
929 {
930 for (auto filename :
931 {
932 "test/data/nst_json_testsuite2/test_parsing/y_array_arraysWithSpaces.json",
933 "test/data/nst_json_testsuite2/test_parsing/y_array_empty-string.json",
934 "test/data/nst_json_testsuite2/test_parsing/y_array_empty.json",
935 "test/data/nst_json_testsuite2/test_parsing/y_array_ending_with_newline.json",
936 "test/data/nst_json_testsuite2/test_parsing/y_array_false.json",
937 "test/data/nst_json_testsuite2/test_parsing/y_array_heterogeneous.json",
938 "test/data/nst_json_testsuite2/test_parsing/y_array_null.json",
939 "test/data/nst_json_testsuite2/test_parsing/y_array_with_1_and_newline.json",
940 "test/data/nst_json_testsuite2/test_parsing/y_array_with_leading_space.json",
941 "test/data/nst_json_testsuite2/test_parsing/y_array_with_several_null.json",
942 "test/data/nst_json_testsuite2/test_parsing/y_array_with_trailing_space.json",
943 "test/data/nst_json_testsuite2/test_parsing/y_number.json",
944 "test/data/nst_json_testsuite2/test_parsing/y_number_0e+1.json",
945 "test/data/nst_json_testsuite2/test_parsing/y_number_0e1.json",
946 "test/data/nst_json_testsuite2/test_parsing/y_number_after_space.json",
947 "test/data/nst_json_testsuite2/test_parsing/y_number_double_close_to_zero.json",
948 "test/data/nst_json_testsuite2/test_parsing/y_number_int_with_exp.json",
949 "test/data/nst_json_testsuite2/test_parsing/y_number_minus_zero.json",
950 "test/data/nst_json_testsuite2/test_parsing/y_number_negative_int.json",
951 "test/data/nst_json_testsuite2/test_parsing/y_number_negative_one.json",
952 "test/data/nst_json_testsuite2/test_parsing/y_number_negative_zero.json",
953 "test/data/nst_json_testsuite2/test_parsing/y_number_real_capital_e.json",
954 "test/data/nst_json_testsuite2/test_parsing/y_number_real_capital_e_neg_exp.json",
955 "test/data/nst_json_testsuite2/test_parsing/y_number_real_capital_e_pos_exp.json",
956 "test/data/nst_json_testsuite2/test_parsing/y_number_real_exponent.json",
957 "test/data/nst_json_testsuite2/test_parsing/y_number_real_fraction_exponent.json",
958 "test/data/nst_json_testsuite2/test_parsing/y_number_real_neg_exp.json",
959 "test/data/nst_json_testsuite2/test_parsing/y_number_real_pos_exponent.json",
960 "test/data/nst_json_testsuite2/test_parsing/y_number_simple_int.json",
961 "test/data/nst_json_testsuite2/test_parsing/y_number_simple_real.json",
962 "test/data/nst_json_testsuite2/test_parsing/y_object.json",
963 "test/data/nst_json_testsuite2/test_parsing/y_object_basic.json",
964 "test/data/nst_json_testsuite2/test_parsing/y_object_duplicated_key.json",
965 "test/data/nst_json_testsuite2/test_parsing/y_object_duplicated_key_and_value.json",
966 "test/data/nst_json_testsuite2/test_parsing/y_object_empty.json",
967 "test/data/nst_json_testsuite2/test_parsing/y_object_empty_key.json",
968 "test/data/nst_json_testsuite2/test_parsing/y_object_escaped_null_in_key.json",
969 "test/data/nst_json_testsuite2/test_parsing/y_object_extreme_numbers.json",
970 "test/data/nst_json_testsuite2/test_parsing/y_object_long_strings.json",
971 "test/data/nst_json_testsuite2/test_parsing/y_object_simple.json",
972 "test/data/nst_json_testsuite2/test_parsing/y_object_string_unicode.json",
973 "test/data/nst_json_testsuite2/test_parsing/y_object_with_newlines.json",
974 "test/data/nst_json_testsuite2/test_parsing/y_string_1_2_3_bytes_UTF-8_sequences.json",
975 "test/data/nst_json_testsuite2/test_parsing/y_string_accepted_surrogate_pair.json",
976 "test/data/nst_json_testsuite2/test_parsing/y_string_accepted_surrogate_pairs.json",
977 "test/data/nst_json_testsuite2/test_parsing/y_string_allowed_escapes.json",
978 "test/data/nst_json_testsuite2/test_parsing/y_string_backslash_and_u_escaped_zero.json",
979 "test/data/nst_json_testsuite2/test_parsing/y_string_backslash_doublequotes.json",
980 "test/data/nst_json_testsuite2/test_parsing/y_string_comments.json",
981 "test/data/nst_json_testsuite2/test_parsing/y_string_double_escape_a.json",
982 "test/data/nst_json_testsuite2/test_parsing/y_string_double_escape_n.json",
983 "test/data/nst_json_testsuite2/test_parsing/y_string_escaped_control_character.json",
984 "test/data/nst_json_testsuite2/test_parsing/y_string_escaped_noncharacter.json",
985 "test/data/nst_json_testsuite2/test_parsing/y_string_in_array.json",
986 "test/data/nst_json_testsuite2/test_parsing/y_string_in_array_with_leading_space.json",
987 "test/data/nst_json_testsuite2/test_parsing/y_string_last_surrogates_1_and_2.json",
988 "test/data/nst_json_testsuite2/test_parsing/y_string_nbsp_uescaped.json",
989 "test/data/nst_json_testsuite2/test_parsing/y_string_nonCharacterInUTF-8_U+10FFFF.json",
990 "test/data/nst_json_testsuite2/test_parsing/y_string_nonCharacterInUTF-8_U+FFFF.json",
991 "test/data/nst_json_testsuite2/test_parsing/y_string_null_escape.json",
992 "test/data/nst_json_testsuite2/test_parsing/y_string_one-byte-utf-8.json",
993 "test/data/nst_json_testsuite2/test_parsing/y_string_pi.json",
994 "test/data/nst_json_testsuite2/test_parsing/y_string_reservedCharacterInUTF-8_U+1BFFF.json",
995 "test/data/nst_json_testsuite2/test_parsing/y_string_simple_ascii.json",
996 "test/data/nst_json_testsuite2/test_parsing/y_string_space.json",
997 "test/data/nst_json_testsuite2/test_parsing/y_string_surrogates_U+1D11E_MUSICAL_SYMBOL_G_CLEF.json",
998 "test/data/nst_json_testsuite2/test_parsing/y_string_three-byte-utf-8.json",
999 "test/data/nst_json_testsuite2/test_parsing/y_string_two-byte-utf-8.json",
1000 "test/data/nst_json_testsuite2/test_parsing/y_string_u+2028_line_sep.json",
1001 "test/data/nst_json_testsuite2/test_parsing/y_string_u+2029_par_sep.json",
1002 "test/data/nst_json_testsuite2/test_parsing/y_string_uEscape.json",
1003 "test/data/nst_json_testsuite2/test_parsing/y_string_uescaped_newline.json",
1004 "test/data/nst_json_testsuite2/test_parsing/y_string_unescaped_char_delete.json",
1005 "test/data/nst_json_testsuite2/test_parsing/y_string_unicode.json",
1006 "test/data/nst_json_testsuite2/test_parsing/y_string_unicodeEscapedBackslash.json",
1007 "test/data/nst_json_testsuite2/test_parsing/y_string_unicode_2.json",
1008 "test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+10FFFE_nonchar.json",
1009 "test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+1FFFE_nonchar.json",
1010 "test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+200B_ZERO_WIDTH_SPACE.json",
1011 "test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+2064_invisible_plus.json",
1012 "test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+FDD0_nonchar.json",
1013 "test/data/nst_json_testsuite2/test_parsing/y_string_unicode_U+FFFE_nonchar.json",
1014 "test/data/nst_json_testsuite2/test_parsing/y_string_unicode_escaped_double_quote.json",
1015 "test/data/nst_json_testsuite2/test_parsing/y_string_utf8.json",
1016 "test/data/nst_json_testsuite2/test_parsing/y_string_with_del_character.json",
1017 "test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_false.json",
1018 "test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_int.json",
1019 "test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_negative_real.json",
1020 "test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_null.json",
1021 "test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_string.json",
1022 "test/data/nst_json_testsuite2/test_parsing/y_structure_lonely_true.json",
1023 "test/data/nst_json_testsuite2/test_parsing/y_structure_string_empty.json",
1024 "test/data/nst_json_testsuite2/test_parsing/y_structure_trailing_newline.json",
1025 "test/data/nst_json_testsuite2/test_parsing/y_structure_true_in_array.json",
1026 "test/data/nst_json_testsuite2/test_parsing/y_structure_whitespace_array.json"
1027 }
1028 )
1029 {
1030 CAPTURE(filename)
1031 std::ifstream f(filename);
1032 json _;
1033 CHECK_NOTHROW(_ = json::parse(f));
1034 std::ifstream f2(filename);
1035 CHECK(json::accept(f2));
1036 }
1037 }
1038
1039 SECTION("n")
1040 {
1041 for (auto filename :
1042 {
1043 "test/data/nst_json_testsuite2/test_parsing/n_array_1_true_without_comma.json",
1044 "test/data/nst_json_testsuite2/test_parsing/n_array_a_invalid_utf8.json",
1045 "test/data/nst_json_testsuite2/test_parsing/n_array_colon_instead_of_comma.json",
1046 "test/data/nst_json_testsuite2/test_parsing/n_array_comma_after_close.json",
1047 "test/data/nst_json_testsuite2/test_parsing/n_array_comma_and_number.json",
1048 "test/data/nst_json_testsuite2/test_parsing/n_array_double_comma.json",
1049 "test/data/nst_json_testsuite2/test_parsing/n_array_double_extra_comma.json",
1050 "test/data/nst_json_testsuite2/test_parsing/n_array_extra_close.json",
1051 "test/data/nst_json_testsuite2/test_parsing/n_array_extra_comma.json",
1052 "test/data/nst_json_testsuite2/test_parsing/n_array_incomplete.json",
1053 "test/data/nst_json_testsuite2/test_parsing/n_array_incomplete_invalid_value.json",
1054 "test/data/nst_json_testsuite2/test_parsing/n_array_inner_array_no_comma.json",
1055 "test/data/nst_json_testsuite2/test_parsing/n_array_invalid_utf8.json",
1056 "test/data/nst_json_testsuite2/test_parsing/n_array_items_separated_by_semicolon.json",
1057 "test/data/nst_json_testsuite2/test_parsing/n_array_just_comma.json",
1058 "test/data/nst_json_testsuite2/test_parsing/n_array_just_minus.json",
1059 "test/data/nst_json_testsuite2/test_parsing/n_array_missing_value.json",
1060 "test/data/nst_json_testsuite2/test_parsing/n_array_newlines_unclosed.json",
1061 "test/data/nst_json_testsuite2/test_parsing/n_array_number_and_comma.json",
1062 "test/data/nst_json_testsuite2/test_parsing/n_array_number_and_several_commas.json",
1063 "test/data/nst_json_testsuite2/test_parsing/n_array_spaces_vertical_tab_formfeed.json",
1064 "test/data/nst_json_testsuite2/test_parsing/n_array_star_inside.json",
1065 "test/data/nst_json_testsuite2/test_parsing/n_array_unclosed.json",
1066 "test/data/nst_json_testsuite2/test_parsing/n_array_unclosed_trailing_comma.json",
1067 "test/data/nst_json_testsuite2/test_parsing/n_array_unclosed_with_new_lines.json",
1068 "test/data/nst_json_testsuite2/test_parsing/n_array_unclosed_with_object_inside.json",
1069 "test/data/nst_json_testsuite2/test_parsing/n_incomplete_false.json",
1070 "test/data/nst_json_testsuite2/test_parsing/n_incomplete_null.json",
1071 "test/data/nst_json_testsuite2/test_parsing/n_incomplete_true.json",
1072 //"test/data/nst_json_testsuite2/test_parsing/n_multidigit_number_then_00.json",
1073 "test/data/nst_json_testsuite2/test_parsing/n_number_++.json",
1074 "test/data/nst_json_testsuite2/test_parsing/n_number_+1.json",
1075 "test/data/nst_json_testsuite2/test_parsing/n_number_+Inf.json",
1076 "test/data/nst_json_testsuite2/test_parsing/n_number_-01.json",
1077 "test/data/nst_json_testsuite2/test_parsing/n_number_-1.0..json",
1078 "test/data/nst_json_testsuite2/test_parsing/n_number_-2..json",
1079 "test/data/nst_json_testsuite2/test_parsing/n_number_-NaN.json",
1080 "test/data/nst_json_testsuite2/test_parsing/n_number_.-1.json",
1081 "test/data/nst_json_testsuite2/test_parsing/n_number_.2e-3.json",
1082 "test/data/nst_json_testsuite2/test_parsing/n_number_0.1.2.json",
1083 "test/data/nst_json_testsuite2/test_parsing/n_number_0.3e+.json",
1084 "test/data/nst_json_testsuite2/test_parsing/n_number_0.3e.json",
1085 "test/data/nst_json_testsuite2/test_parsing/n_number_0.e1.json",
1086 "test/data/nst_json_testsuite2/test_parsing/n_number_0_capital_E+.json",
1087 "test/data/nst_json_testsuite2/test_parsing/n_number_0_capital_E.json",
1088 "test/data/nst_json_testsuite2/test_parsing/n_number_0e+.json",
1089 "test/data/nst_json_testsuite2/test_parsing/n_number_0e.json",
1090 "test/data/nst_json_testsuite2/test_parsing/n_number_1.0e+.json",
1091 "test/data/nst_json_testsuite2/test_parsing/n_number_1.0e-.json",
1092 "test/data/nst_json_testsuite2/test_parsing/n_number_1.0e.json",
1093 "test/data/nst_json_testsuite2/test_parsing/n_number_1_000.json",
1094 "test/data/nst_json_testsuite2/test_parsing/n_number_1eE2.json",
1095 "test/data/nst_json_testsuite2/test_parsing/n_number_2.e+3.json",
1096 "test/data/nst_json_testsuite2/test_parsing/n_number_2.e-3.json",
1097 "test/data/nst_json_testsuite2/test_parsing/n_number_2.e3.json",
1098 "test/data/nst_json_testsuite2/test_parsing/n_number_9.e+.json",
1099 "test/data/nst_json_testsuite2/test_parsing/n_number_Inf.json",
1100 "test/data/nst_json_testsuite2/test_parsing/n_number_NaN.json",
1101 "test/data/nst_json_testsuite2/test_parsing/n_number_U+FF11_fullwidth_digit_one.json",
1102 "test/data/nst_json_testsuite2/test_parsing/n_number_expression.json",
1103 "test/data/nst_json_testsuite2/test_parsing/n_number_hex_1_digit.json",
1104 "test/data/nst_json_testsuite2/test_parsing/n_number_hex_2_digits.json",
1105 "test/data/nst_json_testsuite2/test_parsing/n_number_infinity.json",
1106 "test/data/nst_json_testsuite2/test_parsing/n_number_invalid+-.json",
1107 "test/data/nst_json_testsuite2/test_parsing/n_number_invalid-negative-real.json",
1108 "test/data/nst_json_testsuite2/test_parsing/n_number_invalid-utf-8-in-bigger-int.json",
1109 "test/data/nst_json_testsuite2/test_parsing/n_number_invalid-utf-8-in-exponent.json",
1110 "test/data/nst_json_testsuite2/test_parsing/n_number_invalid-utf-8-in-int.json",
1111 "test/data/nst_json_testsuite2/test_parsing/n_number_minus_infinity.json",
1112 "test/data/nst_json_testsuite2/test_parsing/n_number_minus_sign_with_trailing_garbage.json",
1113 "test/data/nst_json_testsuite2/test_parsing/n_number_minus_space_1.json",
1114 "test/data/nst_json_testsuite2/test_parsing/n_number_neg_int_starting_with_zero.json",
1115 "test/data/nst_json_testsuite2/test_parsing/n_number_neg_real_without_int_part.json",
1116 "test/data/nst_json_testsuite2/test_parsing/n_number_neg_with_garbage_at_end.json",
1117 "test/data/nst_json_testsuite2/test_parsing/n_number_real_garbage_after_e.json",
1118 "test/data/nst_json_testsuite2/test_parsing/n_number_real_with_invalid_utf8_after_e.json",
1119 "test/data/nst_json_testsuite2/test_parsing/n_number_real_without_fractional_part.json",
1120 "test/data/nst_json_testsuite2/test_parsing/n_number_starting_with_dot.json",
1121 "test/data/nst_json_testsuite2/test_parsing/n_number_with_alpha.json",
1122 "test/data/nst_json_testsuite2/test_parsing/n_number_with_alpha_char.json",
1123 "test/data/nst_json_testsuite2/test_parsing/n_number_with_leading_zero.json",
1124 "test/data/nst_json_testsuite2/test_parsing/n_object_bad_value.json",
1125 "test/data/nst_json_testsuite2/test_parsing/n_object_bracket_key.json",
1126 "test/data/nst_json_testsuite2/test_parsing/n_object_comma_instead_of_colon.json",
1127 "test/data/nst_json_testsuite2/test_parsing/n_object_double_colon.json",
1128 "test/data/nst_json_testsuite2/test_parsing/n_object_emoji.json",
1129 "test/data/nst_json_testsuite2/test_parsing/n_object_garbage_at_end.json",
1130 "test/data/nst_json_testsuite2/test_parsing/n_object_key_with_single_quotes.json",
1131 "test/data/nst_json_testsuite2/test_parsing/n_object_lone_continuation_byte_in_key_and_trailing_comma.json",
1132 "test/data/nst_json_testsuite2/test_parsing/n_object_missing_colon.json",
1133 "test/data/nst_json_testsuite2/test_parsing/n_object_missing_key.json",
1134 "test/data/nst_json_testsuite2/test_parsing/n_object_missing_semicolon.json",
1135 "test/data/nst_json_testsuite2/test_parsing/n_object_missing_value.json",
1136 "test/data/nst_json_testsuite2/test_parsing/n_object_no-colon.json",
1137 "test/data/nst_json_testsuite2/test_parsing/n_object_non_string_key.json",
1138 "test/data/nst_json_testsuite2/test_parsing/n_object_non_string_key_but_huge_number_instead.json",
1139 "test/data/nst_json_testsuite2/test_parsing/n_object_repeated_null_null.json",
1140 "test/data/nst_json_testsuite2/test_parsing/n_object_several_trailing_commas.json",
1141 "test/data/nst_json_testsuite2/test_parsing/n_object_single_quote.json",
1142 "test/data/nst_json_testsuite2/test_parsing/n_object_trailing_comma.json",
1143 "test/data/nst_json_testsuite2/test_parsing/n_object_trailing_comment.json",
1144 "test/data/nst_json_testsuite2/test_parsing/n_object_trailing_comment_open.json",
1145 "test/data/nst_json_testsuite2/test_parsing/n_object_trailing_comment_slash_open.json",
1146 "test/data/nst_json_testsuite2/test_parsing/n_object_trailing_comment_slash_open_incomplete.json",
1147 "test/data/nst_json_testsuite2/test_parsing/n_object_two_commas_in_a_row.json",
1148 "test/data/nst_json_testsuite2/test_parsing/n_object_unquoted_key.json",
1149 "test/data/nst_json_testsuite2/test_parsing/n_object_unterminated-value.json",
1150 "test/data/nst_json_testsuite2/test_parsing/n_object_with_single_string.json",
1151 "test/data/nst_json_testsuite2/test_parsing/n_object_with_trailing_garbage.json",
1152 "test/data/nst_json_testsuite2/test_parsing/n_single_space.json",
1153 "test/data/nst_json_testsuite2/test_parsing/n_string_1_surrogate_then_escape.json",
1154 "test/data/nst_json_testsuite2/test_parsing/n_string_1_surrogate_then_escape_u.json",
1155 "test/data/nst_json_testsuite2/test_parsing/n_string_1_surrogate_then_escape_u1.json",
1156 "test/data/nst_json_testsuite2/test_parsing/n_string_1_surrogate_then_escape_u1x.json",
1157 "test/data/nst_json_testsuite2/test_parsing/n_string_accentuated_char_no_quotes.json",
1158 "test/data/nst_json_testsuite2/test_parsing/n_string_backslash_00.json",
1159 "test/data/nst_json_testsuite2/test_parsing/n_string_escape_x.json",
1160 "test/data/nst_json_testsuite2/test_parsing/n_string_escaped_backslash_bad.json",
1161 "test/data/nst_json_testsuite2/test_parsing/n_string_escaped_ctrl_char_tab.json",
1162 "test/data/nst_json_testsuite2/test_parsing/n_string_escaped_emoji.json",
1163 "test/data/nst_json_testsuite2/test_parsing/n_string_incomplete_escape.json",
1164 "test/data/nst_json_testsuite2/test_parsing/n_string_incomplete_escaped_character.json",
1165 "test/data/nst_json_testsuite2/test_parsing/n_string_incomplete_surrogate.json",
1166 "test/data/nst_json_testsuite2/test_parsing/n_string_incomplete_surrogate_escape_invalid.json",
1167 "test/data/nst_json_testsuite2/test_parsing/n_string_invalid-utf-8-in-escape.json",
1168 "test/data/nst_json_testsuite2/test_parsing/n_string_invalid_backslash_esc.json",
1169 "test/data/nst_json_testsuite2/test_parsing/n_string_invalid_unicode_escape.json",
1170 "test/data/nst_json_testsuite2/test_parsing/n_string_invalid_utf8_after_escape.json",
1171 "test/data/nst_json_testsuite2/test_parsing/n_string_leading_uescaped_thinspace.json",
1172 "test/data/nst_json_testsuite2/test_parsing/n_string_no_quotes_with_bad_escape.json",
1173 "test/data/nst_json_testsuite2/test_parsing/n_string_single_doublequote.json",
1174 "test/data/nst_json_testsuite2/test_parsing/n_string_single_quote.json",
1175 "test/data/nst_json_testsuite2/test_parsing/n_string_single_string_no_double_quotes.json",
1176 "test/data/nst_json_testsuite2/test_parsing/n_string_start_escape_unclosed.json",
1177 "test/data/nst_json_testsuite2/test_parsing/n_string_unescaped_crtl_char.json",
1178 "test/data/nst_json_testsuite2/test_parsing/n_string_unescaped_newline.json",
1179 "test/data/nst_json_testsuite2/test_parsing/n_string_unescaped_tab.json",
1180 "test/data/nst_json_testsuite2/test_parsing/n_string_unicode_CapitalU.json",
1181 "test/data/nst_json_testsuite2/test_parsing/n_string_with_trailing_garbage.json",
1182 "test/data/nst_json_testsuite2/test_parsing/n_structure_U+2060_word_joined.json",
1183 "test/data/nst_json_testsuite2/test_parsing/n_structure_UTF8_BOM_no_data.json",
1184 "test/data/nst_json_testsuite2/test_parsing/n_structure_angle_bracket_..json",
1185 "test/data/nst_json_testsuite2/test_parsing/n_structure_angle_bracket_null.json",
1186 "test/data/nst_json_testsuite2/test_parsing/n_structure_array_trailing_garbage.json",
1187 "test/data/nst_json_testsuite2/test_parsing/n_structure_array_with_extra_array_close.json",
1188 "test/data/nst_json_testsuite2/test_parsing/n_structure_array_with_unclosed_string.json",
1189 "test/data/nst_json_testsuite2/test_parsing/n_structure_ascii-unicode-identifier.json",
1190 "test/data/nst_json_testsuite2/test_parsing/n_structure_capitalized_True.json",
1191 "test/data/nst_json_testsuite2/test_parsing/n_structure_close_unopened_array.json",
1192 "test/data/nst_json_testsuite2/test_parsing/n_structure_comma_instead_of_closing_brace.json",
1193 "test/data/nst_json_testsuite2/test_parsing/n_structure_double_array.json",
1194 "test/data/nst_json_testsuite2/test_parsing/n_structure_end_array.json",
1195 "test/data/nst_json_testsuite2/test_parsing/n_structure_incomplete_UTF8_BOM.json",
1196 "test/data/nst_json_testsuite2/test_parsing/n_structure_lone-invalid-utf-8.json",
1197 "test/data/nst_json_testsuite2/test_parsing/n_structure_lone-open-bracket.json",
1198 "test/data/nst_json_testsuite2/test_parsing/n_structure_no_data.json",
1199 "test/data/nst_json_testsuite2/test_parsing/n_structure_null-byte-outside-string.json",
1200 "test/data/nst_json_testsuite2/test_parsing/n_structure_number_with_trailing_garbage.json",
1201 "test/data/nst_json_testsuite2/test_parsing/n_structure_object_followed_by_closing_object.json",
1202 "test/data/nst_json_testsuite2/test_parsing/n_structure_object_unclosed_no_value.json",
1203 "test/data/nst_json_testsuite2/test_parsing/n_structure_object_with_comment.json",
1204 "test/data/nst_json_testsuite2/test_parsing/n_structure_object_with_trailing_garbage.json",
1205 "test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_apostrophe.json",
1206 "test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_comma.json",
1207 "test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_open_object.json",
1208 "test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_open_string.json",
1209 "test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_string.json",
1210 "test/data/nst_json_testsuite2/test_parsing/n_structure_open_object.json",
1211 "test/data/nst_json_testsuite2/test_parsing/n_structure_open_object_close_array.json",
1212 "test/data/nst_json_testsuite2/test_parsing/n_structure_open_object_comma.json",
1213 "test/data/nst_json_testsuite2/test_parsing/n_structure_open_object_open_array.json",
1214 "test/data/nst_json_testsuite2/test_parsing/n_structure_open_object_open_string.json",
1215 "test/data/nst_json_testsuite2/test_parsing/n_structure_open_object_string_with_apostrophes.json",
1216 "test/data/nst_json_testsuite2/test_parsing/n_structure_open_open.json",
1217 "test/data/nst_json_testsuite2/test_parsing/n_structure_single_eacute.json",
1218 "test/data/nst_json_testsuite2/test_parsing/n_structure_single_star.json",
1219 "test/data/nst_json_testsuite2/test_parsing/n_structure_trailing_#.json",
1220 "test/data/nst_json_testsuite2/test_parsing/n_structure_uescaped_LF_before_string.json",
1221 "test/data/nst_json_testsuite2/test_parsing/n_structure_unclosed_array.json",
1222 "test/data/nst_json_testsuite2/test_parsing/n_structure_unclosed_array_partial_null.json",
1223 "test/data/nst_json_testsuite2/test_parsing/n_structure_unclosed_array_unfinished_false.json",
1224 "test/data/nst_json_testsuite2/test_parsing/n_structure_unclosed_array_unfinished_true.json",
1225 "test/data/nst_json_testsuite2/test_parsing/n_structure_unclosed_object.json",
1226 "test/data/nst_json_testsuite2/test_parsing/n_structure_unicode-identifier.json",
1227 "test/data/nst_json_testsuite2/test_parsing/n_structure_whitespace_U+2060_word_joiner.json",
1228 "test/data/nst_json_testsuite2/test_parsing/n_structure_whitespace_formfeed.json"
1229 }
1230 )
1231 {
1232 CAPTURE(filename)
1233 std::ifstream f(filename);
1234 json _;
1235 CHECK_THROWS_AS(_ = json::parse(f), json::parse_error&);
1236 std::ifstream f2(filename);
1237 CHECK(not json::accept(f2));
1238 }
1239 }
1240
1241 SECTION("n (previously overflowed)")
1242 {
1243 for (auto filename :
1244 {
1245 "test/data/nst_json_testsuite2/test_parsing/n_structure_100000_opening_arrays.json",
1246 "test/data/nst_json_testsuite2/test_parsing/n_structure_open_array_object.json"
1247 }
1248 )
1249 {
1250 CAPTURE(filename)
1251 std::ifstream f(filename);
1252 CHECK(not json::accept(f));
1253 }
1254 }
1255
1256 SECTION("i -> y")
1257 {
1258 for (auto filename :
1259 {
1260 "test/data/nst_json_testsuite2/test_parsing/i_number_double_huge_neg_exp.json",
1261 //"test/data/nst_json_testsuite2/test_parsing/i_number_huge_exp.json",
1262 //"test/data/nst_json_testsuite2/test_parsing/i_number_neg_int_huge_exp.json",
1263 //"test/data/nst_json_testsuite2/test_parsing/i_number_pos_double_huge_exp.json",
1264 //"test/data/nst_json_testsuite2/test_parsing/i_number_real_neg_overflow.json",
1265 //"test/data/nst_json_testsuite2/test_parsing/i_number_real_pos_overflow.json",
1266 "test/data/nst_json_testsuite2/test_parsing/i_number_real_underflow.json",
1267 "test/data/nst_json_testsuite2/test_parsing/i_number_too_big_neg_int.json",
1268 "test/data/nst_json_testsuite2/test_parsing/i_number_too_big_pos_int.json",
1269 "test/data/nst_json_testsuite2/test_parsing/i_number_very_big_negative_int.json",
1270 //"test/data/nst_json_testsuite2/test_parsing/i_object_key_lone_2nd_surrogate.json",
1271 //"test/data/nst_json_testsuite2/test_parsing/i_string_1st_surrogate_but_2nd_missing.json",
1272 //"test/data/nst_json_testsuite2/test_parsing/i_string_1st_valid_surrogate_2nd_invalid.json",
1273 //"test/data/nst_json_testsuite2/test_parsing/i_string_UTF-16LE_with_BOM.json",
1274 //"test/data/nst_json_testsuite2/test_parsing/i_string_UTF-8_invalid_sequence.json",
1275 //"test/data/nst_json_testsuite2/test_parsing/i_string_UTF8_surrogate_U+D800.json",
1276 //"test/data/nst_json_testsuite2/test_parsing/i_string_incomplete_surrogate_and_escape_valid.json",
1277 //"test/data/nst_json_testsuite2/test_parsing/i_string_incomplete_surrogate_pair.json",
1278 //"test/data/nst_json_testsuite2/test_parsing/i_string_incomplete_surrogates_escape_valid.json",
1279 //"test/data/nst_json_testsuite2/test_parsing/i_string_invalid_lonely_surrogate.json",
1280 //"test/data/nst_json_testsuite2/test_parsing/i_string_invalid_surrogate.json",
1281 //"test/data/nst_json_testsuite2/test_parsing/i_string_invalid_utf-8.json",
1282 //"test/data/nst_json_testsuite2/test_parsing/i_string_inverted_surrogates_U+1D11E.json",
1283 //"test/data/nst_json_testsuite2/test_parsing/i_string_iso_latin_1.json",
1284 //"test/data/nst_json_testsuite2/test_parsing/i_string_lone_second_surrogate.json",
1285 //"test/data/nst_json_testsuite2/test_parsing/i_string_lone_utf8_continuation_byte.json",
1286 //"test/data/nst_json_testsuite2/test_parsing/i_string_not_in_unicode_range.json",
1287 //"test/data/nst_json_testsuite2/test_parsing/i_string_overlong_sequence_2_bytes.json",
1288 //"test/data/nst_json_testsuite2/test_parsing/i_string_overlong_sequence_6_bytes.json",
1289 //"test/data/nst_json_testsuite2/test_parsing/i_string_overlong_sequence_6_bytes_null.json",
1290 //"test/data/nst_json_testsuite2/test_parsing/i_string_truncated-utf-8.json",
1291 //"test/data/nst_json_testsuite2/test_parsing/i_string_utf16BE_no_BOM.json",
1292 //"test/data/nst_json_testsuite2/test_parsing/i_string_utf16LE_no_BOM.json",
1293 "test/data/nst_json_testsuite2/test_parsing/i_structure_500_nested_arrays.json",
1294 "test/data/nst_json_testsuite2/test_parsing/i_structure_UTF-8_BOM_empty_object.json"
1295 }
1296 )
1297 {
1298 CAPTURE(filename)
1299 std::ifstream f(filename);
1300 json _;
1301 CHECK_NOTHROW(_ = json::parse(f));
1302 std::ifstream f2(filename);
1303 CHECK(json::accept(f2));
1304 }
1305 }
1306
1307 SECTION("i -> n")
1308 {
1309 for (auto filename :
1310 {
1311 //"test/data/nst_json_testsuite2/test_parsing/i_number_double_huge_neg_exp.json",
1312 "test/data/nst_json_testsuite2/test_parsing/i_number_huge_exp.json",
1313 "test/data/nst_json_testsuite2/test_parsing/i_number_neg_int_huge_exp.json",
1314 "test/data/nst_json_testsuite2/test_parsing/i_number_pos_double_huge_exp.json",
1315 "test/data/nst_json_testsuite2/test_parsing/i_number_real_neg_overflow.json",
1316 "test/data/nst_json_testsuite2/test_parsing/i_number_real_pos_overflow.json",
1317 //"test/data/nst_json_testsuite2/test_parsing/i_number_real_underflow.json",
1318 //"test/data/nst_json_testsuite2/test_parsing/i_number_too_big_neg_int.json",
1319 //"test/data/nst_json_testsuite2/test_parsing/i_number_too_big_pos_int.json",
1320 //"test/data/nst_json_testsuite2/test_parsing/i_number_very_big_negative_int.json",
1321 "test/data/nst_json_testsuite2/test_parsing/i_object_key_lone_2nd_surrogate.json",
1322 "test/data/nst_json_testsuite2/test_parsing/i_string_1st_surrogate_but_2nd_missing.json",
1323 "test/data/nst_json_testsuite2/test_parsing/i_string_1st_valid_surrogate_2nd_invalid.json",
1324 "test/data/nst_json_testsuite2/test_parsing/i_string_UTF-16LE_with_BOM.json",
1325 "test/data/nst_json_testsuite2/test_parsing/i_string_UTF-8_invalid_sequence.json",
1326 "test/data/nst_json_testsuite2/test_parsing/i_string_UTF8_surrogate_U+D800.json",
1327 "test/data/nst_json_testsuite2/test_parsing/i_string_incomplete_surrogate_and_escape_valid.json",
1328 "test/data/nst_json_testsuite2/test_parsing/i_string_incomplete_surrogate_pair.json",
1329 "test/data/nst_json_testsuite2/test_parsing/i_string_incomplete_surrogates_escape_valid.json",
1330 "test/data/nst_json_testsuite2/test_parsing/i_string_invalid_lonely_surrogate.json",
1331 "test/data/nst_json_testsuite2/test_parsing/i_string_invalid_surrogate.json",
1332 "test/data/nst_json_testsuite2/test_parsing/i_string_invalid_utf-8.json",
1333 "test/data/nst_json_testsuite2/test_parsing/i_string_inverted_surrogates_U+1D11E.json",
1334 "test/data/nst_json_testsuite2/test_parsing/i_string_iso_latin_1.json",
1335 "test/data/nst_json_testsuite2/test_parsing/i_string_lone_second_surrogate.json",
1336 "test/data/nst_json_testsuite2/test_parsing/i_string_lone_utf8_continuation_byte.json",
1337 "test/data/nst_json_testsuite2/test_parsing/i_string_not_in_unicode_range.json",
1338 "test/data/nst_json_testsuite2/test_parsing/i_string_overlong_sequence_2_bytes.json",
1339 "test/data/nst_json_testsuite2/test_parsing/i_string_overlong_sequence_6_bytes.json",
1340 "test/data/nst_json_testsuite2/test_parsing/i_string_overlong_sequence_6_bytes_null.json",
1341 "test/data/nst_json_testsuite2/test_parsing/i_string_truncated-utf-8.json",
1342 "test/data/nst_json_testsuite2/test_parsing/i_string_utf16BE_no_BOM.json",
1343 "test/data/nst_json_testsuite2/test_parsing/i_string_utf16LE_no_BOM.json",
1344 //"test/data/nst_json_testsuite2/test_parsing/i_structure_500_nested_arrays.json",
1345 //"test/data/nst_json_testsuite2/test_parsing/i_structure_UTF-8_BOM_empty_object.json"
1346 }
1347 )
1348 {
1349 CAPTURE(filename)
1350 std::ifstream f(filename);
1351 json _;
1352 CHECK_THROWS_AS(_ = json::parse(f), json::exception&); // could be parse_error or out_of_range
1353 std::ifstream f2(filename);
1354 CHECK(not json::accept(f2));
1355 }
1356 }
1357 }
1358 }
1359
1360 namespace
1361 {
1362 std::string trim(const std::string& str);
1363
1364 // from http://stackoverflow.com/a/25829178/266378
trim(const std::string & str)1365 std::string trim(const std::string& str)
1366 {
1367 size_t first = str.find_first_not_of(' ');
1368 if (std::string::npos == first)
1369 {
1370 return str;
1371 }
1372 size_t last = str.find_last_not_of(' ');
1373 return str.substr(first, (last - first + 1));
1374 }
1375 }
1376
1377 TEST_CASE("Big List of Naughty Strings")
1378 {
1379 // test from https://github.com/minimaxir/big-list-of-naughty-strings
1380 SECTION("parsing blns.json")
1381 {
1382 std::ifstream f("test/data/big-list-of-naughty-strings/blns.json");
1383 json j;
1384 CHECK_NOTHROW(f >> j);
1385 }
1386
1387 // check if parsed strings roundtrip
1388 // https://www.reddit.com/r/cpp/comments/5qpbie/json_form_modern_c_version_210/dd12mpq/
1389 SECTION("roundtripping")
1390 {
1391 std::ifstream f("test/data/big-list-of-naughty-strings/blns.json");
1392 std::string line;
1393
1394 // read lines one by one, bail out on error or eof
1395 while (getline(f, line))
1396 {
1397 // trim whitespace
1398 line = trim(line);
1399
1400 // remove trailing comma
1401 line = line.substr(0, line.find_last_of(","));
1402
1403 // discard lines without at least two characters (quotes)
1404 if (line.size() < 2)
1405 {
1406 continue;
1407 }
1408
1409 // check roundtrip
1410 CAPTURE(line)
1411 json j = json::parse(line);
1412 CHECK(j.dump() == line);
1413 }
1414 }
1415 }
1416