• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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