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