xref: /third_party/json/tests/src/unit-msgpack.cpp (revision c5f01b2f)
1//     __ _____ _____ _____
2//  __|  |   __|     |   | |  JSON for Modern C++ (supporting code)
3// |  |  |__   |  |  | | | |  version 3.11.2
4// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
5//
6// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
7// SPDX-License-Identifier: MIT
8
9#include "doctest_compatibility.h"
10
11#include <nlohmann/json.hpp>
12using nlohmann::json;
13#ifdef JSON_TEST_NO_GLOBAL_UDLS
14    using namespace nlohmann::literals; // NOLINT(google-build-using-namespace)
15#endif
16
17#include <fstream>
18#include <sstream>
19#include <iomanip>
20#include <set>
21#include "make_test_data_available.hpp"
22#include "test_utils.hpp"
23
24namespace
25{
26class SaxCountdown
27{
28  public:
29    explicit SaxCountdown(const int count) : events_left(count)
30    {}
31
32    bool null()
33    {
34        return events_left-- > 0;
35    }
36
37    bool boolean(bool /*unused*/)
38    {
39        return events_left-- > 0;
40    }
41
42    bool number_integer(json::number_integer_t /*unused*/)
43    {
44        return events_left-- > 0;
45    }
46
47    bool number_unsigned(json::number_unsigned_t /*unused*/)
48    {
49        return events_left-- > 0;
50    }
51
52    bool number_float(json::number_float_t /*unused*/, const std::string& /*unused*/)
53    {
54        return events_left-- > 0;
55    }
56
57    bool string(std::string& /*unused*/)
58    {
59        return events_left-- > 0;
60    }
61
62    bool binary(std::vector<std::uint8_t>& /*unused*/)
63    {
64        return events_left-- > 0;
65    }
66
67    bool start_object(std::size_t /*unused*/)
68    {
69        return events_left-- > 0;
70    }
71
72    bool key(std::string& /*unused*/)
73    {
74        return events_left-- > 0;
75    }
76
77    bool end_object()
78    {
79        return events_left-- > 0;
80    }
81
82    bool start_array(std::size_t /*unused*/)
83    {
84        return events_left-- > 0;
85    }
86
87    bool end_array()
88    {
89        return events_left-- > 0;
90    }
91
92    bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/, const json::exception& /*unused*/) // NOLINT(readability-convert-member-functions-to-static)
93    {
94        return false;
95    }
96
97  private:
98    int events_left = 0;
99};
100} // namespace
101
102TEST_CASE("MessagePack")
103{
104    SECTION("individual values")
105    {
106        SECTION("discarded")
107        {
108            // discarded values are not serialized
109            json j = json::value_t::discarded;
110            const auto result = json::to_msgpack(j);
111            CHECK(result.empty());
112        }
113
114        SECTION("null")
115        {
116            json j = nullptr;
117            std::vector<uint8_t> expected = {0xc0};
118            const auto result = json::to_msgpack(j);
119            CHECK(result == expected);
120
121            // roundtrip
122            CHECK(json::from_msgpack(result) == j);
123            CHECK(json::from_msgpack(result, true, false) == j);
124        }
125
126        SECTION("boolean")
127        {
128            SECTION("true")
129            {
130                json j = true;
131                std::vector<uint8_t> expected = {0xc3};
132                const auto result = json::to_msgpack(j);
133                CHECK(result == expected);
134
135                // roundtrip
136                CHECK(json::from_msgpack(result) == j);
137                CHECK(json::from_msgpack(result, true, false) == j);
138            }
139
140            SECTION("false")
141            {
142                json j = false;
143                std::vector<uint8_t> expected = {0xc2};
144                const auto result = json::to_msgpack(j);
145                CHECK(result == expected);
146
147                // roundtrip
148                CHECK(json::from_msgpack(result) == j);
149                CHECK(json::from_msgpack(result, true, false) == j);
150            }
151        }
152
153        SECTION("number")
154        {
155            SECTION("signed")
156            {
157                SECTION("-32..-1 (negative fixnum)")
158                {
159                    for (auto i = -32; i <= -1; ++i)
160                    {
161                        CAPTURE(i)
162
163                        // create JSON value with integer number
164                        json j = i;
165
166                        // check type
167                        CHECK(j.is_number_integer());
168
169                        // create expected byte vector
170                        std::vector<uint8_t> expected;
171                        expected.push_back(static_cast<uint8_t>(i));
172
173                        // compare result + size
174                        const auto result = json::to_msgpack(j);
175                        CHECK(result == expected);
176                        CHECK(result.size() == 1);
177
178                        // check individual bytes
179                        CHECK(static_cast<int8_t>(result[0]) == i);
180
181                        // roundtrip
182                        CHECK(json::from_msgpack(result) == j);
183                        CHECK(json::from_msgpack(result, true, false) == j);
184                    }
185                }
186
187                SECTION("0..127 (positive fixnum)")
188                {
189                    for (size_t i = 0; i <= 127; ++i)
190                    {
191                        CAPTURE(i)
192
193                        // create JSON value with integer number
194                        json j = -1;
195                        j.get_ref<json::number_integer_t&>() = static_cast<json::number_integer_t>(i);
196
197                        // check type
198                        CHECK(j.is_number_integer());
199
200                        // create expected byte vector
201                        std::vector<uint8_t> expected;
202                        expected.push_back(static_cast<uint8_t>(i));
203
204                        // compare result + size
205                        const auto result = json::to_msgpack(j);
206                        CHECK(result == expected);
207                        CHECK(result.size() == 1);
208
209                        // check individual bytes
210                        CHECK(result[0] == i);
211
212                        // roundtrip
213                        CHECK(json::from_msgpack(result) == j);
214                        CHECK(json::from_msgpack(result, true, false) == j);
215                    }
216                }
217
218                SECTION("128..255 (int 8)")
219                {
220                    for (size_t i = 128; i <= 255; ++i)
221                    {
222                        CAPTURE(i)
223
224                        // create JSON value with integer number
225                        json j = -1;
226                        j.get_ref<json::number_integer_t&>() = static_cast<json::number_integer_t>(i);
227
228                        // check type
229                        CHECK(j.is_number_integer());
230
231                        // create expected byte vector
232                        std::vector<uint8_t> expected;
233                        expected.push_back(0xcc);
234                        expected.push_back(static_cast<uint8_t>(i));
235
236                        // compare result + size
237                        const auto result = json::to_msgpack(j);
238                        CHECK(result == expected);
239                        CHECK(result.size() == 2);
240
241                        // check individual bytes
242                        CHECK(result[0] == 0xcc);
243                        auto restored = static_cast<uint8_t>(result[1]);
244                        CHECK(restored == i);
245
246                        // roundtrip
247                        CHECK(json::from_msgpack(result) == j);
248                        CHECK(json::from_msgpack(result, true, false) == j);
249                    }
250                }
251
252                SECTION("256..65535 (int 16)")
253                {
254                    for (size_t i = 256; i <= 65535; ++i)
255                    {
256                        CAPTURE(i)
257
258                        // create JSON value with integer number
259                        json j = -1;
260                        j.get_ref<json::number_integer_t&>() = static_cast<json::number_integer_t>(i);
261
262                        // check type
263                        CHECK(j.is_number_integer());
264
265                        // create expected byte vector
266                        std::vector<uint8_t> expected;
267                        expected.push_back(0xcd);
268                        expected.push_back(static_cast<uint8_t>((i >> 8) & 0xff));
269                        expected.push_back(static_cast<uint8_t>(i & 0xff));
270
271                        // compare result + size
272                        const auto result = json::to_msgpack(j);
273                        CHECK(result == expected);
274                        CHECK(result.size() == 3);
275
276                        // check individual bytes
277                        CHECK(result[0] == 0xcd);
278                        auto restored = static_cast<uint16_t>(static_cast<uint8_t>(result[1]) * 256 + static_cast<uint8_t>(result[2]));
279                        CHECK(restored == i);
280
281                        // roundtrip
282                        CHECK(json::from_msgpack(result) == j);
283                        CHECK(json::from_msgpack(result, true, false) == j);
284                    }
285                }
286
287                SECTION("65536..4294967295 (int 32)")
288                {
289                    for (uint32_t i :
290                            {
291                                65536u, 77777u, 1048576u, 4294967295u
292                            })
293                    {
294                        CAPTURE(i)
295
296                        // create JSON value with integer number
297                        json j = -1;
298                        j.get_ref<json::number_integer_t&>() = static_cast<json::number_integer_t>(i);
299
300                        // check type
301                        CHECK(j.is_number_integer());
302
303                        // create expected byte vector
304                        std::vector<uint8_t> expected;
305                        expected.push_back(0xce);
306                        expected.push_back(static_cast<uint8_t>((i >> 24) & 0xff));
307                        expected.push_back(static_cast<uint8_t>((i >> 16) & 0xff));
308                        expected.push_back(static_cast<uint8_t>((i >> 8) & 0xff));
309                        expected.push_back(static_cast<uint8_t>(i & 0xff));
310
311                        // compare result + size
312                        const auto result = json::to_msgpack(j);
313                        CHECK(result == expected);
314                        CHECK(result.size() == 5);
315
316                        // check individual bytes
317                        CHECK(result[0] == 0xce);
318                        uint32_t restored = (static_cast<uint32_t>(result[1]) << 030) +
319                                            (static_cast<uint32_t>(result[2]) << 020) +
320                                            (static_cast<uint32_t>(result[3]) << 010) +
321                                            static_cast<uint32_t>(result[4]);
322                        CHECK(restored == i);
323
324                        // roundtrip
325                        CHECK(json::from_msgpack(result) == j);
326                        CHECK(json::from_msgpack(result, true, false) == j);
327                    }
328                }
329
330                SECTION("4294967296..9223372036854775807 (int 64)")
331                {
332                    for (uint64_t i :
333                            {
334                                4294967296LU, 9223372036854775807LU
335                            })
336                    {
337                        CAPTURE(i)
338
339                        // create JSON value with integer number
340                        json j = -1;
341                        j.get_ref<json::number_integer_t&>() = static_cast<json::number_integer_t>(i);
342
343                        // check type
344                        CHECK(j.is_number_integer());
345
346                        // create expected byte vector
347                        std::vector<uint8_t> expected;
348                        expected.push_back(0xcf);
349                        expected.push_back(static_cast<uint8_t>((i >> 070) & 0xff));
350                        expected.push_back(static_cast<uint8_t>((i >> 060) & 0xff));
351                        expected.push_back(static_cast<uint8_t>((i >> 050) & 0xff));
352                        expected.push_back(static_cast<uint8_t>((i >> 040) & 0xff));
353                        expected.push_back(static_cast<uint8_t>((i >> 030) & 0xff));
354                        expected.push_back(static_cast<uint8_t>((i >> 020) & 0xff));
355                        expected.push_back(static_cast<uint8_t>((i >> 010) & 0xff));
356                        expected.push_back(static_cast<uint8_t>(i & 0xff));
357
358                        // compare result + size
359                        const auto result = json::to_msgpack(j);
360                        CHECK(result == expected);
361                        CHECK(result.size() == 9);
362
363                        // check individual bytes
364                        CHECK(result[0] == 0xcf);
365                        uint64_t restored = (static_cast<uint64_t>(result[1]) << 070) +
366                                            (static_cast<uint64_t>(result[2]) << 060) +
367                                            (static_cast<uint64_t>(result[3]) << 050) +
368                                            (static_cast<uint64_t>(result[4]) << 040) +
369                                            (static_cast<uint64_t>(result[5]) << 030) +
370                                            (static_cast<uint64_t>(result[6]) << 020) +
371                                            (static_cast<uint64_t>(result[7]) << 010) +
372                                            static_cast<uint64_t>(result[8]);
373                        CHECK(restored == i);
374
375                        // roundtrip
376                        CHECK(json::from_msgpack(result) == j);
377                        CHECK(json::from_msgpack(result, true, false) == j);
378                    }
379                }
380
381                SECTION("-128..-33 (int 8)")
382                {
383                    for (auto i = -128; i <= -33; ++i)
384                    {
385                        CAPTURE(i)
386
387                        // create JSON value with integer number
388                        json j = i;
389
390                        // check type
391                        CHECK(j.is_number_integer());
392
393                        // create expected byte vector
394                        std::vector<uint8_t> expected;
395                        expected.push_back(0xd0);
396                        expected.push_back(static_cast<uint8_t>(i));
397
398                        // compare result + size
399                        const auto result = json::to_msgpack(j);
400                        CHECK(result == expected);
401                        CHECK(result.size() == 2);
402
403                        // check individual bytes
404                        CHECK(result[0] == 0xd0);
405                        CHECK(static_cast<int8_t>(result[1]) == i);
406
407                        // roundtrip
408                        CHECK(json::from_msgpack(result) == j);
409                        CHECK(json::from_msgpack(result, true, false) == j);
410                    }
411                }
412
413                SECTION("-9263 (int 16)")
414                {
415                    json j = -9263;
416                    std::vector<uint8_t> expected = {0xd1, 0xdb, 0xd1};
417
418                    const auto result = json::to_msgpack(j);
419                    CHECK(result == expected);
420
421                    auto restored = static_cast<int16_t>((result[1] << 8) + result[2]);
422                    CHECK(restored == -9263);
423
424                    // roundtrip
425                    CHECK(json::from_msgpack(result) == j);
426                    CHECK(json::from_msgpack(result, true, false) == j);
427                }
428
429                SECTION("-32768..-129 (int 16)")
430                {
431                    for (int16_t i = -32768; i <= static_cast<std::int16_t>(-129); ++i)
432                    {
433                        CAPTURE(i)
434
435                        // create JSON value with integer number
436                        json j = i;
437
438                        // check type
439                        CHECK(j.is_number_integer());
440
441                        // create expected byte vector
442                        std::vector<uint8_t> expected;
443                        expected.push_back(0xd1);
444                        expected.push_back(static_cast<uint8_t>((i >> 8) & 0xff));
445                        expected.push_back(static_cast<uint8_t>(i & 0xff));
446
447                        // compare result + size
448                        const auto result = json::to_msgpack(j);
449                        CHECK(result == expected);
450                        CHECK(result.size() == 3);
451
452                        // check individual bytes
453                        CHECK(result[0] == 0xd1);
454                        auto restored = static_cast<int16_t>((result[1] << 8) + result[2]);
455                        CHECK(restored == i);
456
457                        // roundtrip
458                        CHECK(json::from_msgpack(result) == j);
459                        CHECK(json::from_msgpack(result, true, false) == j);
460                    }
461                }
462
463                SECTION("-32769..-2147483648")
464                {
465                    std::vector<int32_t> numbers;
466                    numbers.push_back(-32769);
467                    numbers.push_back(-65536);
468                    numbers.push_back(-77777);
469                    numbers.push_back(-1048576);
470                    numbers.push_back(-2147483648LL);
471                    for (auto i : numbers)
472                    {
473                        CAPTURE(i)
474
475                        // create JSON value with integer number
476                        json j = i;
477
478                        // check type
479                        CHECK(j.is_number_integer());
480
481                        // create expected byte vector
482                        std::vector<uint8_t> expected;
483                        expected.push_back(0xd2);
484                        expected.push_back(static_cast<uint8_t>((i >> 24) & 0xff));
485                        expected.push_back(static_cast<uint8_t>((i >> 16) & 0xff));
486                        expected.push_back(static_cast<uint8_t>((i >> 8) & 0xff));
487                        expected.push_back(static_cast<uint8_t>(i & 0xff));
488
489                        // compare result + size
490                        const auto result = json::to_msgpack(j);
491                        CHECK(result == expected);
492                        CHECK(result.size() == 5);
493
494                        // check individual bytes
495                        CHECK(result[0] == 0xd2);
496                        uint32_t restored = (static_cast<uint32_t>(result[1]) << 030) +
497                                            (static_cast<uint32_t>(result[2]) << 020) +
498                                            (static_cast<uint32_t>(result[3]) << 010) +
499                                            static_cast<uint32_t>(result[4]);
500                        CHECK(static_cast<std::int32_t>(restored) == i);
501
502                        // roundtrip
503                        CHECK(json::from_msgpack(result) == j);
504                        CHECK(json::from_msgpack(result, true, false) == j);
505                    }
506                }
507
508                SECTION("-9223372036854775808..-2147483649 (int 64)")
509                {
510                    std::vector<int64_t> numbers;
511                    numbers.push_back(INT64_MIN);
512                    numbers.push_back(-2147483649LL);
513                    for (auto i : numbers)
514                    {
515                        CAPTURE(i)
516
517                        // create JSON value with unsigned integer number
518                        json j = i;
519
520                        // check type
521                        CHECK(j.is_number_integer());
522
523                        // create expected byte vector
524                        std::vector<uint8_t> expected;
525                        expected.push_back(0xd3);
526                        expected.push_back(static_cast<uint8_t>((i >> 070) & 0xff));
527                        expected.push_back(static_cast<uint8_t>((i >> 060) & 0xff));
528                        expected.push_back(static_cast<uint8_t>((i >> 050) & 0xff));
529                        expected.push_back(static_cast<uint8_t>((i >> 040) & 0xff));
530                        expected.push_back(static_cast<uint8_t>((i >> 030) & 0xff));
531                        expected.push_back(static_cast<uint8_t>((i >> 020) & 0xff));
532                        expected.push_back(static_cast<uint8_t>((i >> 010) & 0xff));
533                        expected.push_back(static_cast<uint8_t>(i & 0xff));
534
535                        // compare result + size
536                        const auto result = json::to_msgpack(j);
537                        CHECK(result == expected);
538                        CHECK(result.size() == 9);
539
540                        // check individual bytes
541                        CHECK(result[0] == 0xd3);
542                        int64_t restored = (static_cast<int64_t>(result[1]) << 070) +
543                                           (static_cast<int64_t>(result[2]) << 060) +
544                                           (static_cast<int64_t>(result[3]) << 050) +
545                                           (static_cast<int64_t>(result[4]) << 040) +
546                                           (static_cast<int64_t>(result[5]) << 030) +
547                                           (static_cast<int64_t>(result[6]) << 020) +
548                                           (static_cast<int64_t>(result[7]) << 010) +
549                                           static_cast<int64_t>(result[8]);
550                        CHECK(restored == i);
551
552                        // roundtrip
553                        CHECK(json::from_msgpack(result) == j);
554                        CHECK(json::from_msgpack(result, true, false) == j);
555                    }
556                }
557            }
558
559            SECTION("unsigned")
560            {
561                SECTION("0..127 (positive fixnum)")
562                {
563                    for (size_t i = 0; i <= 127; ++i)
564                    {
565                        CAPTURE(i)
566
567                        // create JSON value with unsigned integer number
568                        json j = i;
569
570                        // check type
571                        CHECK(j.is_number_unsigned());
572
573                        // create expected byte vector
574                        std::vector<uint8_t> expected;
575                        expected.push_back(static_cast<uint8_t>(i));
576
577                        // compare result + size
578                        const auto result = json::to_msgpack(j);
579                        CHECK(result == expected);
580                        CHECK(result.size() == 1);
581
582                        // check individual bytes
583                        CHECK(result[0] == i);
584
585                        // roundtrip
586                        CHECK(json::from_msgpack(result) == j);
587                        CHECK(json::from_msgpack(result, true, false) == j);
588                    }
589                }
590
591                SECTION("128..255 (uint 8)")
592                {
593                    for (size_t i = 128; i <= 255; ++i)
594                    {
595                        CAPTURE(i)
596
597                        // create JSON value with unsigned integer number
598                        json j = i;
599
600                        // check type
601                        CHECK(j.is_number_unsigned());
602
603                        // create expected byte vector
604                        std::vector<uint8_t> expected;
605                        expected.push_back(0xcc);
606                        expected.push_back(static_cast<uint8_t>(i));
607
608                        // compare result + size
609                        const auto result = json::to_msgpack(j);
610                        CHECK(result == expected);
611                        CHECK(result.size() == 2);
612
613                        // check individual bytes
614                        CHECK(result[0] == 0xcc);
615                        auto restored = static_cast<uint8_t>(result[1]);
616                        CHECK(restored == i);
617
618                        // roundtrip
619                        CHECK(json::from_msgpack(result) == j);
620                        CHECK(json::from_msgpack(result, true, false) == j);
621                    }
622                }
623
624                SECTION("256..65535 (uint 16)")
625                {
626                    for (size_t i = 256; i <= 65535; ++i)
627                    {
628                        CAPTURE(i)
629
630                        // create JSON value with unsigned integer number
631                        json j = i;
632
633                        // check type
634                        CHECK(j.is_number_unsigned());
635
636                        // create expected byte vector
637                        std::vector<uint8_t> expected;
638                        expected.push_back(0xcd);
639                        expected.push_back(static_cast<uint8_t>((i >> 8) & 0xff));
640                        expected.push_back(static_cast<uint8_t>(i & 0xff));
641
642                        // compare result + size
643                        const auto result = json::to_msgpack(j);
644                        CHECK(result == expected);
645                        CHECK(result.size() == 3);
646
647                        // check individual bytes
648                        CHECK(result[0] == 0xcd);
649                        auto restored = static_cast<uint16_t>(static_cast<uint8_t>(result[1]) * 256 + static_cast<uint8_t>(result[2]));
650                        CHECK(restored == i);
651
652                        // roundtrip
653                        CHECK(json::from_msgpack(result) == j);
654                        CHECK(json::from_msgpack(result, true, false) == j);
655                    }
656                }
657
658                SECTION("65536..4294967295 (uint 32)")
659                {
660                    for (uint32_t i :
661                            {
662                                65536u, 77777u, 1048576u, 4294967295u
663                            })
664                    {
665                        CAPTURE(i)
666
667                        // create JSON value with unsigned integer number
668                        json j = i;
669
670                        // check type
671                        CHECK(j.is_number_unsigned());
672
673                        // create expected byte vector
674                        std::vector<uint8_t> expected;
675                        expected.push_back(0xce);
676                        expected.push_back(static_cast<uint8_t>((i >> 24) & 0xff));
677                        expected.push_back(static_cast<uint8_t>((i >> 16) & 0xff));
678                        expected.push_back(static_cast<uint8_t>((i >> 8) & 0xff));
679                        expected.push_back(static_cast<uint8_t>(i & 0xff));
680
681                        // compare result + size
682                        const auto result = json::to_msgpack(j);
683                        CHECK(result == expected);
684                        CHECK(result.size() == 5);
685
686                        // check individual bytes
687                        CHECK(result[0] == 0xce);
688                        uint32_t restored = (static_cast<uint32_t>(result[1]) << 030) +
689                                            (static_cast<uint32_t>(result[2]) << 020) +
690                                            (static_cast<uint32_t>(result[3]) << 010) +
691                                            static_cast<uint32_t>(result[4]);
692                        CHECK(restored == i);
693
694                        // roundtrip
695                        CHECK(json::from_msgpack(result) == j);
696                        CHECK(json::from_msgpack(result, true, false) == j);
697                    }
698                }
699
700                SECTION("4294967296..18446744073709551615 (uint 64)")
701                {
702                    for (uint64_t i :
703                            {
704                                4294967296LU, 18446744073709551615LU
705                            })
706                    {
707                        CAPTURE(i)
708
709                        // create JSON value with unsigned integer number
710                        json j = i;
711
712                        // check type
713                        CHECK(j.is_number_unsigned());
714
715                        // create expected byte vector
716                        std::vector<uint8_t> expected;
717                        expected.push_back(0xcf);
718                        expected.push_back(static_cast<uint8_t>((i >> 070) & 0xff));
719                        expected.push_back(static_cast<uint8_t>((i >> 060) & 0xff));
720                        expected.push_back(static_cast<uint8_t>((i >> 050) & 0xff));
721                        expected.push_back(static_cast<uint8_t>((i >> 040) & 0xff));
722                        expected.push_back(static_cast<uint8_t>((i >> 030) & 0xff));
723                        expected.push_back(static_cast<uint8_t>((i >> 020) & 0xff));
724                        expected.push_back(static_cast<uint8_t>((i >> 010) & 0xff));
725                        expected.push_back(static_cast<uint8_t>(i & 0xff));
726
727                        // compare result + size
728                        const auto result = json::to_msgpack(j);
729                        CHECK(result == expected);
730                        CHECK(result.size() == 9);
731
732                        // check individual bytes
733                        CHECK(result[0] == 0xcf);
734                        uint64_t restored = (static_cast<uint64_t>(result[1]) << 070) +
735                                            (static_cast<uint64_t>(result[2]) << 060) +
736                                            (static_cast<uint64_t>(result[3]) << 050) +
737                                            (static_cast<uint64_t>(result[4]) << 040) +
738                                            (static_cast<uint64_t>(result[5]) << 030) +
739                                            (static_cast<uint64_t>(result[6]) << 020) +
740                                            (static_cast<uint64_t>(result[7]) << 010) +
741                                            static_cast<uint64_t>(result[8]);
742                        CHECK(restored == i);
743
744                        // roundtrip
745                        CHECK(json::from_msgpack(result) == j);
746                        CHECK(json::from_msgpack(result, true, false) == j);
747                    }
748                }
749            }
750
751            SECTION("float")
752            {
753                SECTION("3.1415925")
754                {
755                    double v = 3.1415925;
756                    json j = v;
757                    std::vector<uint8_t> expected =
758                    {
759                        0xcb, 0x40, 0x09, 0x21, 0xfb, 0x3f, 0xa6, 0xde, 0xfc
760                    };
761                    const auto result = json::to_msgpack(j);
762                    CHECK(result == expected);
763
764                    // roundtrip
765                    CHECK(json::from_msgpack(result) == j);
766                    CHECK(json::from_msgpack(result) == v);
767                    CHECK(json::from_msgpack(result, true, false) == j);
768                }
769
770                SECTION("1.0")
771                {
772                    double v = 1.0;
773                    json j = v;
774                    std::vector<uint8_t> expected =
775                    {
776                        0xca, 0x3f, 0x80, 0x00, 0x00
777                    };
778                    const auto result = json::to_msgpack(j);
779                    CHECK(result == expected);
780
781                    // roundtrip
782                    CHECK(json::from_msgpack(result) == j);
783                    CHECK(json::from_msgpack(result) == v);
784                    CHECK(json::from_msgpack(result, true, false) == j);
785                }
786
787                SECTION("128.128")
788                {
789                    double v = 128.1280059814453125;
790                    json j = v;
791                    std::vector<uint8_t> expected =
792                    {
793                        0xca, 0x43, 0x00, 0x20, 0xc5
794                    };
795                    const auto result = json::to_msgpack(j);
796                    CHECK(result == expected);
797
798                    // roundtrip
799                    CHECK(json::from_msgpack(result) == j);
800                    CHECK(json::from_msgpack(result) == v);
801                    CHECK(json::from_msgpack(result, true, false) == j);
802                }
803            }
804        }
805
806        SECTION("string")
807        {
808            SECTION("N = 0..31")
809            {
810                // explicitly enumerate the first byte for all 32 strings
811                const std::vector<uint8_t> first_bytes =
812                {
813                    0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8,
814                    0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1,
815                    0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba,
816                    0xbb, 0xbc, 0xbd, 0xbe, 0xbf
817                };
818
819                for (size_t N = 0; N < first_bytes.size(); ++N)
820                {
821                    CAPTURE(N)
822
823                    // create JSON value with string containing of N * 'x'
824                    const auto s = std::string(N, 'x');
825                    json j = s;
826
827                    // create expected byte vector
828                    std::vector<uint8_t> expected;
829                    expected.push_back(first_bytes[N]);
830                    for (size_t i = 0; i < N; ++i)
831                    {
832                        expected.push_back('x');
833                    }
834
835                    // check first byte
836                    CHECK((first_bytes[N] & 0x1f) == N);
837
838                    // compare result + size
839                    const auto result = json::to_msgpack(j);
840                    CHECK(result == expected);
841                    CHECK(result.size() == N + 1);
842                    // check that no null byte is appended
843                    if (N > 0)
844                    {
845                        CHECK(result.back() != '\x00');
846                    }
847
848                    // roundtrip
849                    CHECK(json::from_msgpack(result) == j);
850                    CHECK(json::from_msgpack(result, true, false) == j);
851                }
852            }
853
854            SECTION("N = 32..255")
855            {
856                for (size_t N = 32; N <= 255; ++N)
857                {
858                    CAPTURE(N)
859
860                    // create JSON value with string containing of N * 'x'
861                    const auto s = std::string(N, 'x');
862                    json j = s;
863
864                    // create expected byte vector
865                    std::vector<uint8_t> expected;
866                    expected.push_back(0xd9);
867                    expected.push_back(static_cast<uint8_t>(N));
868                    for (size_t i = 0; i < N; ++i)
869                    {
870                        expected.push_back('x');
871                    }
872
873                    // compare result + size
874                    const auto result = json::to_msgpack(j);
875                    CHECK(result == expected);
876                    CHECK(result.size() == N + 2);
877                    // check that no null byte is appended
878                    CHECK(result.back() != '\x00');
879
880                    // roundtrip
881                    CHECK(json::from_msgpack(result) == j);
882                    CHECK(json::from_msgpack(result, true, false) == j);
883                }
884            }
885
886            SECTION("N = 256..65535")
887            {
888                for (size_t N :
889                        {
890                            256u, 999u, 1025u, 3333u, 2048u, 65535u
891                        })
892                {
893                    CAPTURE(N)
894
895                    // create JSON value with string containing of N * 'x'
896                    const auto s = std::string(N, 'x');
897                    json j = s;
898
899                    // create expected byte vector (hack: create string first)
900                    std::vector<uint8_t> expected(N, 'x');
901                    // reverse order of commands, because we insert at begin()
902                    expected.insert(expected.begin(), static_cast<uint8_t>(N & 0xff));
903                    expected.insert(expected.begin(), static_cast<uint8_t>((N >> 8) & 0xff));
904                    expected.insert(expected.begin(), 0xda);
905
906                    // compare result + size
907                    const auto result = json::to_msgpack(j);
908                    CHECK(result == expected);
909                    CHECK(result.size() == N + 3);
910                    // check that no null byte is appended
911                    CHECK(result.back() != '\x00');
912
913                    // roundtrip
914                    CHECK(json::from_msgpack(result) == j);
915                    CHECK(json::from_msgpack(result, true, false) == j);
916                }
917            }
918
919            SECTION("N = 65536..4294967295")
920            {
921                for (size_t N :
922                        {
923                            65536u, 77777u, 1048576u
924                        })
925                {
926                    CAPTURE(N)
927
928                    // create JSON value with string containing of N * 'x'
929                    const auto s = std::string(N, 'x');
930                    json j = s;
931
932                    // create expected byte vector (hack: create string first)
933                    std::vector<uint8_t> expected(N, 'x');
934                    // reverse order of commands, because we insert at begin()
935                    expected.insert(expected.begin(), static_cast<uint8_t>(N & 0xff));
936                    expected.insert(expected.begin(), static_cast<uint8_t>((N >> 8) & 0xff));
937                    expected.insert(expected.begin(), static_cast<uint8_t>((N >> 16) & 0xff));
938                    expected.insert(expected.begin(), static_cast<uint8_t>((N >> 24) & 0xff));
939                    expected.insert(expected.begin(), 0xdb);
940
941                    // compare result + size
942                    const auto result = json::to_msgpack(j);
943                    CHECK(result == expected);
944                    CHECK(result.size() == N + 5);
945                    // check that no null byte is appended
946                    CHECK(result.back() != '\x00');
947
948                    // roundtrip
949                    CHECK(json::from_msgpack(result) == j);
950                    CHECK(json::from_msgpack(result, true, false) == j);
951                }
952            }
953        }
954
955        SECTION("array")
956        {
957            SECTION("empty")
958            {
959                json j = json::array();
960                std::vector<uint8_t> expected = {0x90};
961                const auto result = json::to_msgpack(j);
962                CHECK(result == expected);
963
964                // roundtrip
965                CHECK(json::from_msgpack(result) == j);
966                CHECK(json::from_msgpack(result, true, false) == j);
967            }
968
969            SECTION("[null]")
970            {
971                json j = {nullptr};
972                std::vector<uint8_t> expected = {0x91, 0xc0};
973                const auto result = json::to_msgpack(j);
974                CHECK(result == expected);
975
976                // roundtrip
977                CHECK(json::from_msgpack(result) == j);
978                CHECK(json::from_msgpack(result, true, false) == j);
979            }
980
981            SECTION("[1,2,3,4,5]")
982            {
983                json j = json::parse("[1,2,3,4,5]");
984                std::vector<uint8_t> expected = {0x95, 0x01, 0x02, 0x03, 0x04, 0x05};
985                const auto result = json::to_msgpack(j);
986                CHECK(result == expected);
987
988                // roundtrip
989                CHECK(json::from_msgpack(result) == j);
990                CHECK(json::from_msgpack(result, true, false) == j);
991            }
992
993            SECTION("[[[[]]]]")
994            {
995                json j = json::parse("[[[[]]]]");
996                std::vector<uint8_t> expected = {0x91, 0x91, 0x91, 0x90};
997                const auto result = json::to_msgpack(j);
998                CHECK(result == expected);
999
1000                // roundtrip
1001                CHECK(json::from_msgpack(result) == j);
1002                CHECK(json::from_msgpack(result, true, false) == j);
1003            }
1004
1005            SECTION("array 16")
1006            {
1007                json j(16, nullptr);
1008                std::vector<uint8_t> expected(j.size() + 3, 0xc0); // all null
1009                expected[0] = 0xdc; // array 16
1010                expected[1] = 0x00; // size (0x0010), byte 0
1011                expected[2] = 0x10; // size (0x0010), byte 1
1012                const auto result = json::to_msgpack(j);
1013                CHECK(result == expected);
1014
1015                // roundtrip
1016                CHECK(json::from_msgpack(result) == j);
1017                CHECK(json::from_msgpack(result, true, false) == j);
1018            }
1019
1020            SECTION("array 32")
1021            {
1022                json j(65536, nullptr);
1023                std::vector<uint8_t> expected(j.size() + 5, 0xc0); // all null
1024                expected[0] = 0xdd; // array 32
1025                expected[1] = 0x00; // size (0x00100000), byte 0
1026                expected[2] = 0x01; // size (0x00100000), byte 1
1027                expected[3] = 0x00; // size (0x00100000), byte 2
1028                expected[4] = 0x00; // size (0x00100000), byte 3
1029                const auto result = json::to_msgpack(j);
1030                //CHECK(result == expected);
1031
1032                CHECK(result.size() == expected.size());
1033                for (size_t i = 0; i < expected.size(); ++i)
1034                {
1035                    CAPTURE(i)
1036                    CHECK(result[i] == expected[i]);
1037                }
1038
1039                // roundtrip
1040                CHECK(json::from_msgpack(result) == j);
1041                CHECK(json::from_msgpack(result, true, false) == j);
1042            }
1043        }
1044
1045        SECTION("object")
1046        {
1047            SECTION("empty")
1048            {
1049                json j = json::object();
1050                std::vector<uint8_t> expected = {0x80};
1051                const auto result = json::to_msgpack(j);
1052                CHECK(result == expected);
1053
1054                // roundtrip
1055                CHECK(json::from_msgpack(result) == j);
1056                CHECK(json::from_msgpack(result, true, false) == j);
1057            }
1058
1059            SECTION("{\"\":null}")
1060            {
1061                json j = {{"", nullptr}};
1062                std::vector<uint8_t> expected = {0x81, 0xa0, 0xc0};
1063                const auto result = json::to_msgpack(j);
1064                CHECK(result == expected);
1065
1066                // roundtrip
1067                CHECK(json::from_msgpack(result) == j);
1068                CHECK(json::from_msgpack(result, true, false) == j);
1069            }
1070
1071            SECTION("{\"a\": {\"b\": {\"c\": {}}}}")
1072            {
1073                json j = json::parse(R"({"a": {"b": {"c": {}}}})");
1074                std::vector<uint8_t> expected =
1075                {
1076                    0x81, 0xa1, 0x61, 0x81, 0xa1, 0x62, 0x81, 0xa1, 0x63, 0x80
1077                };
1078                const auto result = json::to_msgpack(j);
1079                CHECK(result == expected);
1080
1081                // roundtrip
1082                CHECK(json::from_msgpack(result) == j);
1083                CHECK(json::from_msgpack(result, true, false) == j);
1084            }
1085
1086            SECTION("map 16")
1087            {
1088                json j = R"({"00": null, "01": null, "02": null, "03": null,
1089                             "04": null, "05": null, "06": null, "07": null,
1090                             "08": null, "09": null, "10": null, "11": null,
1091                             "12": null, "13": null, "14": null, "15": null})"_json;
1092
1093                const auto result = json::to_msgpack(j);
1094
1095                // Checking against an expected vector byte by byte is
1096                // difficult, because no assumption on the order of key/value
1097                // pairs are made. We therefore only check the prefix (type and
1098                // size and the overall size. The rest is then handled in the
1099                // roundtrip check.
1100                CHECK(result.size() == 67); // 1 type, 2 size, 16*4 content
1101                CHECK(result[0] == 0xde); // map 16
1102                CHECK(result[1] == 0x00); // byte 0 of size (0x0010)
1103                CHECK(result[2] == 0x10); // byte 1 of size (0x0010)
1104
1105                // roundtrip
1106                CHECK(json::from_msgpack(result) == j);
1107                CHECK(json::from_msgpack(result, true, false) == j);
1108            }
1109
1110            SECTION("map 32")
1111            {
1112                json j;
1113                for (auto i = 0; i < 65536; ++i)
1114                {
1115                    // format i to a fixed width of 5
1116                    // each entry will need 7 bytes: 6 for fixstr, 1 for null
1117                    std::stringstream ss;
1118                    ss << std::setw(5) << std::setfill('0') << i;
1119                    j.emplace(ss.str(), nullptr);
1120                }
1121
1122                const auto result = json::to_msgpack(j);
1123
1124                // Checking against an expected vector byte by byte is
1125                // difficult, because no assumption on the order of key/value
1126                // pairs are made. We therefore only check the prefix (type and
1127                // size and the overall size. The rest is then handled in the
1128                // roundtrip check.
1129                CHECK(result.size() == 458757); // 1 type, 4 size, 65536*7 content
1130                CHECK(result[0] == 0xdf); // map 32
1131                CHECK(result[1] == 0x00); // byte 0 of size (0x00010000)
1132                CHECK(result[2] == 0x01); // byte 1 of size (0x00010000)
1133                CHECK(result[3] == 0x00); // byte 2 of size (0x00010000)
1134                CHECK(result[4] == 0x00); // byte 3 of size (0x00010000)
1135
1136                // roundtrip
1137                CHECK(json::from_msgpack(result) == j);
1138                CHECK(json::from_msgpack(result, true, false) == j);
1139            }
1140        }
1141
1142        SECTION("extension")
1143        {
1144            SECTION("N = 0..255")
1145            {
1146                for (size_t N = 0; N <= 0xFF; ++N)
1147                {
1148                    CAPTURE(N)
1149
1150                    // create JSON value with byte array containing of N * 'x'
1151                    const auto s = std::vector<uint8_t>(N, 'x');
1152                    json j = json::binary(s);
1153                    std::uint8_t subtype = 42;
1154                    j.get_binary().set_subtype(subtype);
1155
1156                    // create expected byte vector
1157                    std::vector<uint8_t> expected;
1158                    switch (N)
1159                    {
1160                        case 1:
1161                            expected.push_back(static_cast<std::uint8_t>(0xD4));
1162                            break;
1163                        case 2:
1164                            expected.push_back(static_cast<std::uint8_t>(0xD5));
1165                            break;
1166                        case 4:
1167                            expected.push_back(static_cast<std::uint8_t>(0xD6));
1168                            break;
1169                        case 8:
1170                            expected.push_back(static_cast<std::uint8_t>(0xD7));
1171                            break;
1172                        case 16:
1173                            expected.push_back(static_cast<std::uint8_t>(0xD8));
1174                            break;
1175                        default:
1176                            expected.push_back(static_cast<std::uint8_t>(0xC7));
1177                            expected.push_back(static_cast<std::uint8_t>(N));
1178                            break;
1179                    }
1180                    expected.push_back(subtype);
1181
1182                    for (size_t i = 0; i < N; ++i)
1183                    {
1184                        expected.push_back(0x78);
1185                    }
1186
1187                    // compare result + size
1188                    const auto result = json::to_msgpack(j);
1189                    CHECK(result == expected);
1190                    switch (N)
1191                    {
1192                        case 1:
1193                        case 2:
1194                        case 4:
1195                        case 8:
1196                        case 16:
1197                            CHECK(result.size() == N + 2);
1198                            break;
1199                        default:
1200                            CHECK(result.size() == N + 3);
1201                            break;
1202                    }
1203
1204                    // check that no null byte is appended
1205                    if (N > 0)
1206                    {
1207                        CHECK(result.back() != '\x00');
1208                    }
1209
1210                    // roundtrip
1211                    CHECK(json::from_msgpack(result) == j);
1212                    CHECK(json::from_msgpack(result, true, false) == j);
1213                }
1214            }
1215
1216            SECTION("N = 256..65535")
1217            {
1218                for (std::size_t N :
1219                        {
1220                            256u, 999u, 1025u, 3333u, 2048u, 65535u
1221                        })
1222                {
1223                    CAPTURE(N)
1224
1225                    // create JSON value with string containing of N * 'x'
1226                    const auto s = std::vector<uint8_t>(N, 'x');
1227                    json j = json::binary(s);
1228                    std::uint8_t subtype = 42;
1229                    j.get_binary().set_subtype(subtype);
1230
1231                    // create expected byte vector (hack: create string first)
1232                    std::vector<uint8_t> expected(N, 'x');
1233                    // reverse order of commands, because we insert at begin()
1234                    expected.insert(expected.begin(), subtype);
1235                    expected.insert(expected.begin(), static_cast<uint8_t>(N & 0xff));
1236                    expected.insert(expected.begin(), static_cast<uint8_t>((N >> 8) & 0xff));
1237                    expected.insert(expected.begin(), 0xC8);
1238
1239                    // compare result + size
1240                    const auto result = json::to_msgpack(j);
1241                    CHECK(result == expected);
1242                    CHECK(result.size() == N + 4);
1243                    // check that no null byte is appended
1244                    CHECK(result.back() != '\x00');
1245
1246                    // roundtrip
1247                    CHECK(json::from_msgpack(result) == j);
1248                    CHECK(json::from_msgpack(result, true, false) == j);
1249                }
1250            }
1251
1252            SECTION("N = 65536..4294967295")
1253            {
1254                for (std::size_t N :
1255                        {
1256                            65536u, 77777u, 1048576u
1257                        })
1258                {
1259                    CAPTURE(N)
1260
1261                    // create JSON value with string containing of N * 'x'
1262                    const auto s = std::vector<uint8_t>(N, 'x');
1263                    json j = json::binary(s);
1264                    std::uint8_t subtype = 42;
1265                    j.get_binary().set_subtype(subtype);
1266
1267                    // create expected byte vector (hack: create string first)
1268                    std::vector<uint8_t> expected(N, 'x');
1269                    // reverse order of commands, because we insert at begin()
1270                    expected.insert(expected.begin(), subtype);
1271                    expected.insert(expected.begin(), static_cast<uint8_t>(N & 0xff));
1272                    expected.insert(expected.begin(), static_cast<uint8_t>((N >> 8) & 0xff));
1273                    expected.insert(expected.begin(), static_cast<uint8_t>((N >> 16) & 0xff));
1274                    expected.insert(expected.begin(), static_cast<uint8_t>((N >> 24) & 0xff));
1275                    expected.insert(expected.begin(), 0xC9);
1276
1277                    // compare result + size
1278                    const auto result = json::to_msgpack(j);
1279                    CHECK(result == expected);
1280                    CHECK(result.size() == N + 6);
1281                    // check that no null byte is appended
1282                    CHECK(result.back() != '\x00');
1283
1284                    // roundtrip
1285                    CHECK(json::from_msgpack(result) == j);
1286                    CHECK(json::from_msgpack(result, true, false) == j);
1287                }
1288            }
1289        }
1290
1291        SECTION("binary")
1292        {
1293            SECTION("N = 0..255")
1294            {
1295                for (std::size_t N = 0; N <= 0xFF; ++N)
1296                {
1297                    CAPTURE(N)
1298
1299                    // create JSON value with byte array containing of N * 'x'
1300                    const auto s = std::vector<uint8_t>(N, 'x');
1301                    json j = json::binary(s);
1302
1303                    // create expected byte vector
1304                    std::vector<std::uint8_t> expected;
1305                    expected.push_back(static_cast<std::uint8_t>(0xC4));
1306                    expected.push_back(static_cast<std::uint8_t>(N));
1307                    for (size_t i = 0; i < N; ++i)
1308                    {
1309                        expected.push_back(0x78);
1310                    }
1311
1312                    // compare result + size
1313                    const auto result = json::to_msgpack(j);
1314                    CHECK(result == expected);
1315                    CHECK(result.size() == N + 2);
1316                    // check that no null byte is appended
1317                    if (N > 0)
1318                    {
1319                        CHECK(result.back() != '\x00');
1320                    }
1321
1322                    // roundtrip
1323                    CHECK(json::from_msgpack(result) == j);
1324                    CHECK(json::from_msgpack(result, true, false) == j);
1325                }
1326            }
1327
1328            SECTION("N = 256..65535")
1329            {
1330                for (std::size_t N :
1331                        {
1332                            256u, 999u, 1025u, 3333u, 2048u, 65535u
1333                        })
1334                {
1335                    CAPTURE(N)
1336
1337                    // create JSON value with string containing of N * 'x'
1338                    const auto s = std::vector<std::uint8_t>(N, 'x');
1339                    json j = json::binary(s);
1340
1341                    // create expected byte vector (hack: create string first)
1342                    std::vector<std::uint8_t> expected(N, 'x');
1343                    // reverse order of commands, because we insert at begin()
1344                    expected.insert(expected.begin(), static_cast<std::uint8_t>(N & 0xff));
1345                    expected.insert(expected.begin(), static_cast<std::uint8_t>((N >> 8) & 0xff));
1346                    expected.insert(expected.begin(), 0xC5);
1347
1348                    // compare result + size
1349                    const auto result = json::to_msgpack(j);
1350                    CHECK(result == expected);
1351                    CHECK(result.size() == N + 3);
1352                    // check that no null byte is appended
1353                    CHECK(result.back() != '\x00');
1354
1355                    // roundtrip
1356                    CHECK(json::from_msgpack(result) == j);
1357                    CHECK(json::from_msgpack(result, true, false) == j);
1358                }
1359            }
1360
1361            SECTION("N = 65536..4294967295")
1362            {
1363                for (std::size_t N :
1364                        {
1365                            65536u, 77777u, 1048576u
1366                        })
1367                {
1368                    CAPTURE(N)
1369
1370                    // create JSON value with string containing of N * 'x'
1371                    const auto s = std::vector<std::uint8_t>(N, 'x');
1372                    json j = json::binary(s);
1373
1374                    // create expected byte vector (hack: create string first)
1375                    std::vector<uint8_t> expected(N, 'x');
1376                    // reverse order of commands, because we insert at begin()
1377                    expected.insert(expected.begin(), static_cast<std::uint8_t>(N & 0xff));
1378                    expected.insert(expected.begin(), static_cast<std::uint8_t>((N >> 8) & 0xff));
1379                    expected.insert(expected.begin(), static_cast<std::uint8_t>((N >> 16) & 0xff));
1380                    expected.insert(expected.begin(), static_cast<std::uint8_t>((N >> 24) & 0xff));
1381                    expected.insert(expected.begin(), 0xC6);
1382
1383                    // compare result + size
1384                    const auto result = json::to_msgpack(j);
1385                    CHECK(result == expected);
1386                    CHECK(result.size() == N + 5);
1387                    // check that no null byte is appended
1388                    CHECK(result.back() != '\x00');
1389
1390                    // roundtrip
1391                    CHECK(json::from_msgpack(result) == j);
1392                    CHECK(json::from_msgpack(result, true, false) == j);
1393                }
1394            }
1395        }
1396    }
1397
1398    SECTION("from float32")
1399    {
1400        auto given = std::vector<uint8_t>({0xca, 0x41, 0xc8, 0x00, 0x01});
1401        json j = json::from_msgpack(given);
1402        CHECK(j.get<double>() == Approx(25.0000019073486));
1403    }
1404
1405    SECTION("errors")
1406    {
1407        SECTION("empty byte vector")
1408        {
1409            json _;
1410            CHECK_THROWS_WITH_AS(_ = json::from_msgpack(std::vector<uint8_t>()), "[json.exception.parse_error.110] parse error at byte 1: syntax error while parsing MessagePack value: unexpected end of input", json::parse_error&);
1411            CHECK(json::from_msgpack(std::vector<uint8_t>(), true, false).is_discarded());
1412        }
1413
1414        SECTION("too short byte vector")
1415        {
1416            json _;
1417
1418            CHECK_THROWS_WITH_AS(_ = json::from_msgpack(std::vector<uint8_t>({0x87})),
1419                                 "[json.exception.parse_error.110] parse error at byte 2: syntax error while parsing MessagePack string: unexpected end of input", json::parse_error&);
1420            CHECK_THROWS_WITH_AS(_ = json::from_msgpack(std::vector<uint8_t>({0xcc})),
1421                                 "[json.exception.parse_error.110] parse error at byte 2: syntax error while parsing MessagePack number: unexpected end of input", json::parse_error&);
1422            CHECK_THROWS_WITH_AS(_ = json::from_msgpack(std::vector<uint8_t>({0xcd})),
1423                                 "[json.exception.parse_error.110] parse error at byte 2: syntax error while parsing MessagePack number: unexpected end of input", json::parse_error&);
1424            CHECK_THROWS_WITH_AS(_ = json::from_msgpack(std::vector<uint8_t>({0xcd, 0x00})),
1425                                 "[json.exception.parse_error.110] parse error at byte 3: syntax error while parsing MessagePack number: unexpected end of input", json::parse_error&);
1426            CHECK_THROWS_WITH_AS(_ = json::from_msgpack(std::vector<uint8_t>({0xce})),
1427                                 "[json.exception.parse_error.110] parse error at byte 2: syntax error while parsing MessagePack number: unexpected end of input", json::parse_error&);
1428            CHECK_THROWS_WITH_AS(_ = json::from_msgpack(std::vector<uint8_t>({0xce, 0x00})),
1429                                 "[json.exception.parse_error.110] parse error at byte 3: syntax error while parsing MessagePack number: unexpected end of input", json::parse_error&);
1430            CHECK_THROWS_WITH_AS(_ = json::from_msgpack(std::vector<uint8_t>({0xce, 0x00, 0x00})),
1431                                 "[json.exception.parse_error.110] parse error at byte 4: syntax error while parsing MessagePack number: unexpected end of input", json::parse_error&);
1432            CHECK_THROWS_WITH_AS(_ = json::from_msgpack(std::vector<uint8_t>({0xce, 0x00, 0x00, 0x00})),
1433                                 "[json.exception.parse_error.110] parse error at byte 5: syntax error while parsing MessagePack number: unexpected end of input", json::parse_error&);
1434            CHECK_THROWS_WITH_AS(_ = json::from_msgpack(std::vector<uint8_t>({0xcf})),
1435                                 "[json.exception.parse_error.110] parse error at byte 2: syntax error while parsing MessagePack number: unexpected end of input", json::parse_error&);
1436            CHECK_THROWS_WITH_AS(_ = json::from_msgpack(std::vector<uint8_t>({0xcf, 0x00})),
1437                                 "[json.exception.parse_error.110] parse error at byte 3: syntax error while parsing MessagePack number: unexpected end of input", json::parse_error&);
1438            CHECK_THROWS_WITH_AS(_ = json::from_msgpack(std::vector<uint8_t>({0xcf, 0x00, 0x00})),
1439                                 "[json.exception.parse_error.110] parse error at byte 4: syntax error while parsing MessagePack number: unexpected end of input", json::parse_error&);
1440            CHECK_THROWS_WITH_AS(_ = json::from_msgpack(std::vector<uint8_t>({0xcf, 0x00, 0x00, 0x00})),
1441                                 "[json.exception.parse_error.110] parse error at byte 5: syntax error while parsing MessagePack number: unexpected end of input", json::parse_error&);
1442            CHECK_THROWS_WITH_AS(_ = json::from_msgpack(std::vector<uint8_t>({0xcf, 0x00, 0x00, 0x00, 0x00})),
1443                                 "[json.exception.parse_error.110] parse error at byte 6: syntax error while parsing MessagePack number: unexpected end of input", json::parse_error&);
1444            CHECK_THROWS_WITH_AS(_ = json::from_msgpack(std::vector<uint8_t>({0xcf, 0x00, 0x00, 0x00, 0x00, 0x00})),
1445                                 "[json.exception.parse_error.110] parse error at byte 7: syntax error while parsing MessagePack number: unexpected end of input", json::parse_error&);
1446            CHECK_THROWS_WITH_AS(_ = json::from_msgpack(std::vector<uint8_t>({0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})),
1447                                 "[json.exception.parse_error.110] parse error at byte 8: syntax error while parsing MessagePack number: unexpected end of input", json::parse_error&);
1448            CHECK_THROWS_WITH_AS(_ = json::from_msgpack(std::vector<uint8_t>({0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})),
1449                                 "[json.exception.parse_error.110] parse error at byte 9: syntax error while parsing MessagePack number: unexpected end of input", json::parse_error&);
1450            CHECK_THROWS_WITH_AS(_ = json::from_msgpack(std::vector<uint8_t>({0xa5, 0x68, 0x65})),
1451                                 "[json.exception.parse_error.110] parse error at byte 4: syntax error while parsing MessagePack string: unexpected end of input", json::parse_error&);
1452            CHECK_THROWS_WITH_AS(_ = json::from_msgpack(std::vector<uint8_t>({0x92, 0x01})),
1453                                 "[json.exception.parse_error.110] parse error at byte 3: syntax error while parsing MessagePack value: unexpected end of input", json::parse_error&);
1454            CHECK_THROWS_WITH_AS(_ = json::from_msgpack(std::vector<uint8_t>({0x81, 0xa1, 0x61})),
1455                                 "[json.exception.parse_error.110] parse error at byte 4: syntax error while parsing MessagePack value: unexpected end of input", json::parse_error&);
1456            CHECK_THROWS_WITH_AS(_ = json::from_msgpack(std::vector<uint8_t>({0xc4, 0x02})),
1457                                 "[json.exception.parse_error.110] parse error at byte 3: syntax error while parsing MessagePack binary: unexpected end of input", json::parse_error&);
1458
1459            CHECK(json::from_msgpack(std::vector<uint8_t>({0x87}), true, false).is_discarded());
1460            CHECK(json::from_msgpack(std::vector<uint8_t>({0xcc}), true, false).is_discarded());
1461            CHECK(json::from_msgpack(std::vector<uint8_t>({0xcd}), true, false).is_discarded());
1462            CHECK(json::from_msgpack(std::vector<uint8_t>({0xcd, 0x00}), true, false).is_discarded());
1463            CHECK(json::from_msgpack(std::vector<uint8_t>({0xce}), true, false).is_discarded());
1464            CHECK(json::from_msgpack(std::vector<uint8_t>({0xce, 0x00}), true, false).is_discarded());
1465            CHECK(json::from_msgpack(std::vector<uint8_t>({0xce, 0x00, 0x00}), true, false).is_discarded());
1466            CHECK(json::from_msgpack(std::vector<uint8_t>({0xce, 0x00, 0x00, 0x00}), true, false).is_discarded());
1467            CHECK(json::from_msgpack(std::vector<uint8_t>({0xcf}), true, false).is_discarded());
1468            CHECK(json::from_msgpack(std::vector<uint8_t>({0xcf, 0x00}), true, false).is_discarded());
1469            CHECK(json::from_msgpack(std::vector<uint8_t>({0xcf, 0x00, 0x00}), true, false).is_discarded());
1470            CHECK(json::from_msgpack(std::vector<uint8_t>({0xcf, 0x00, 0x00, 0x00}), true, false).is_discarded());
1471            CHECK(json::from_msgpack(std::vector<uint8_t>({0xcf, 0x00, 0x00, 0x00, 0x00}), true, false).is_discarded());
1472            CHECK(json::from_msgpack(std::vector<uint8_t>({0xcf, 0x00, 0x00, 0x00, 0x00, 0x00}), true, false).is_discarded());
1473            CHECK(json::from_msgpack(std::vector<uint8_t>({0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}), true, false).is_discarded());
1474            CHECK(json::from_msgpack(std::vector<uint8_t>({0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}), true, false).is_discarded());
1475            CHECK(json::from_msgpack(std::vector<uint8_t>({0xa5, 0x68, 0x65}), true, false).is_discarded());
1476            CHECK(json::from_msgpack(std::vector<uint8_t>({0x92, 0x01}), true, false).is_discarded());
1477            CHECK(json::from_msgpack(std::vector<uint8_t>({0x81, 0xA1, 0x61}), true, false).is_discarded());
1478            CHECK(json::from_msgpack(std::vector<uint8_t>({0xc4, 0x02}), true, false).is_discarded());
1479            CHECK(json::from_msgpack(std::vector<uint8_t>({0xc4}), true, false).is_discarded());
1480        }
1481
1482        SECTION("unsupported bytes")
1483        {
1484            SECTION("concrete examples")
1485            {
1486                json _;
1487                CHECK_THROWS_WITH_AS(_ = json::from_msgpack(std::vector<uint8_t>({0xc1})), "[json.exception.parse_error.112] parse error at byte 1: syntax error while parsing MessagePack value: invalid byte: 0xC1", json::parse_error&);
1488            }
1489
1490            SECTION("all unsupported bytes")
1491            {
1492                for (auto byte :
1493                        {
1494                            // never used
1495                            0xc1
1496                        })
1497                {
1498                    json _;
1499                    CHECK_THROWS_AS(_ = json::from_msgpack(std::vector<uint8_t>({static_cast<uint8_t>(byte)})), json::parse_error&);
1500                    CHECK(json::from_msgpack(std::vector<uint8_t>({static_cast<uint8_t>(byte)}), true, false).is_discarded());
1501                }
1502            }
1503        }
1504
1505        SECTION("invalid string in map")
1506        {
1507            json _;
1508            CHECK_THROWS_WITH_AS(_ = json::from_msgpack(std::vector<uint8_t>({0x81, 0xff, 0x01})), "[json.exception.parse_error.113] parse error at byte 2: syntax error while parsing MessagePack string: expected length specification (0xA0-0xBF, 0xD9-0xDB); last byte: 0xFF", json::parse_error&);
1509            CHECK(json::from_msgpack(std::vector<uint8_t>({0x81, 0xff, 0x01}), true, false).is_discarded());
1510        }
1511
1512        SECTION("strict mode")
1513        {
1514            std::vector<uint8_t> vec = {0xc0, 0xc0};
1515            SECTION("non-strict mode")
1516            {
1517                const auto result = json::from_msgpack(vec, false);
1518                CHECK(result == json());
1519            }
1520
1521            SECTION("strict mode")
1522            {
1523                json _;
1524                CHECK_THROWS_WITH_AS(_ = json::from_msgpack(vec), "[json.exception.parse_error.110] parse error at byte 2: syntax error while parsing MessagePack value: expected end of input; last byte: 0xC0", json::parse_error&);
1525                CHECK(json::from_msgpack(vec, true, false).is_discarded());
1526            }
1527        }
1528    }
1529
1530    SECTION("SAX aborts")
1531    {
1532        SECTION("start_array(len)")
1533        {
1534            std::vector<uint8_t> v = {0x93, 0x01, 0x02, 0x03};
1535            SaxCountdown scp(0);
1536            CHECK(!json::sax_parse(v, &scp, json::input_format_t::msgpack));
1537        }
1538
1539        SECTION("start_object(len)")
1540        {
1541            std::vector<uint8_t> v = {0x81, 0xa3, 0x66, 0x6F, 0x6F, 0xc2};
1542            SaxCountdown scp(0);
1543            CHECK(!json::sax_parse(v, &scp, json::input_format_t::msgpack));
1544        }
1545
1546        SECTION("key()")
1547        {
1548            std::vector<uint8_t> v = {0x81, 0xa3, 0x66, 0x6F, 0x6F, 0xc2};
1549            SaxCountdown scp(1);
1550            CHECK(!json::sax_parse(v, &scp, json::input_format_t::msgpack));
1551        }
1552    }
1553}
1554
1555// use this testcase outside [hide] to run it with Valgrind
1556TEST_CASE("single MessagePack roundtrip")
1557{
1558    SECTION("sample.json")
1559    {
1560        std::string filename = TEST_DATA_DIRECTORY "/json_testsuite/sample.json";
1561
1562        // parse JSON file
1563        std::ifstream f_json(filename);
1564        json j1 = json::parse(f_json);
1565
1566        // parse MessagePack file
1567        auto packed = utils::read_binary_file(filename + ".msgpack");
1568        json j2;
1569        CHECK_NOTHROW(j2 = json::from_msgpack(packed));
1570
1571        // compare parsed JSON values
1572        CHECK(j1 == j2);
1573
1574        SECTION("roundtrips")
1575        {
1576            SECTION("std::ostringstream")
1577            {
1578                std::basic_ostringstream<std::uint8_t> ss;
1579                json::to_msgpack(j1, ss);
1580                json j3 = json::from_msgpack(ss.str());
1581                CHECK(j1 == j3);
1582            }
1583
1584            SECTION("std::string")
1585            {
1586                std::string s;
1587                json::to_msgpack(j1, s);
1588                json j3 = json::from_msgpack(s);
1589                CHECK(j1 == j3);
1590            }
1591        }
1592
1593        // check with different start index
1594        packed.insert(packed.begin(), 5, 0xff);
1595        CHECK(j1 == json::from_msgpack(packed.begin() + 5, packed.end()));
1596    }
1597}
1598
1599TEST_CASE("MessagePack roundtrips" * doctest::skip())
1600{
1601    SECTION("input from msgpack-python")
1602    {
1603        // most of these are excluded due to differences in key order (not a real problem)
1604        std::set<std::string> exclude_packed;
1605        exclude_packed.insert(TEST_DATA_DIRECTORY "/json.org/1.json");
1606        exclude_packed.insert(TEST_DATA_DIRECTORY "/json.org/2.json");
1607        exclude_packed.insert(TEST_DATA_DIRECTORY "/json.org/3.json");
1608        exclude_packed.insert(TEST_DATA_DIRECTORY "/json.org/4.json");
1609        exclude_packed.insert(TEST_DATA_DIRECTORY "/json.org/5.json");
1610        exclude_packed.insert(TEST_DATA_DIRECTORY "/json_testsuite/sample.json"); // kills AppVeyor
1611        exclude_packed.insert(TEST_DATA_DIRECTORY "/json_tests/pass1.json");
1612        exclude_packed.insert(TEST_DATA_DIRECTORY "/regression/working_file.json");
1613        exclude_packed.insert(TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_object.json");
1614        exclude_packed.insert(TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_object_basic.json");
1615        exclude_packed.insert(TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_object_duplicated_key.json");
1616        exclude_packed.insert(TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_object_long_strings.json");
1617        exclude_packed.insert(TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_object_simple.json");
1618        exclude_packed.insert(TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_object_string_unicode.json");
1619
1620        for (std::string filename :
1621                {
1622                    TEST_DATA_DIRECTORY "/json_nlohmann_tests/all_unicode.json",
1623                    TEST_DATA_DIRECTORY "/json.org/1.json",
1624                    TEST_DATA_DIRECTORY "/json.org/2.json",
1625                    TEST_DATA_DIRECTORY "/json.org/3.json",
1626                    TEST_DATA_DIRECTORY "/json.org/4.json",
1627                    TEST_DATA_DIRECTORY "/json.org/5.json",
1628                    TEST_DATA_DIRECTORY "/json_roundtrip/roundtrip01.json",
1629                    TEST_DATA_DIRECTORY "/json_roundtrip/roundtrip02.json",
1630                    TEST_DATA_DIRECTORY "/json_roundtrip/roundtrip03.json",
1631                    TEST_DATA_DIRECTORY "/json_roundtrip/roundtrip04.json",
1632                    TEST_DATA_DIRECTORY "/json_roundtrip/roundtrip05.json",
1633                    TEST_DATA_DIRECTORY "/json_roundtrip/roundtrip06.json",
1634                    TEST_DATA_DIRECTORY "/json_roundtrip/roundtrip07.json",
1635                    TEST_DATA_DIRECTORY "/json_roundtrip/roundtrip08.json",
1636                    TEST_DATA_DIRECTORY "/json_roundtrip/roundtrip09.json",
1637                    TEST_DATA_DIRECTORY "/json_roundtrip/roundtrip10.json",
1638                    TEST_DATA_DIRECTORY "/json_roundtrip/roundtrip11.json",
1639                    TEST_DATA_DIRECTORY "/json_roundtrip/roundtrip12.json",
1640                    TEST_DATA_DIRECTORY "/json_roundtrip/roundtrip13.json",
1641                    TEST_DATA_DIRECTORY "/json_roundtrip/roundtrip14.json",
1642                    TEST_DATA_DIRECTORY "/json_roundtrip/roundtrip15.json",
1643                    TEST_DATA_DIRECTORY "/json_roundtrip/roundtrip16.json",
1644                    TEST_DATA_DIRECTORY "/json_roundtrip/roundtrip17.json",
1645                    TEST_DATA_DIRECTORY "/json_roundtrip/roundtrip18.json",
1646                    TEST_DATA_DIRECTORY "/json_roundtrip/roundtrip19.json",
1647                    TEST_DATA_DIRECTORY "/json_roundtrip/roundtrip20.json",
1648                    TEST_DATA_DIRECTORY "/json_roundtrip/roundtrip21.json",
1649                    TEST_DATA_DIRECTORY "/json_roundtrip/roundtrip22.json",
1650                    TEST_DATA_DIRECTORY "/json_roundtrip/roundtrip23.json",
1651                    TEST_DATA_DIRECTORY "/json_roundtrip/roundtrip24.json",
1652                    TEST_DATA_DIRECTORY "/json_roundtrip/roundtrip25.json",
1653                    TEST_DATA_DIRECTORY "/json_roundtrip/roundtrip26.json",
1654                    TEST_DATA_DIRECTORY "/json_roundtrip/roundtrip27.json",
1655                    TEST_DATA_DIRECTORY "/json_roundtrip/roundtrip28.json",
1656                    TEST_DATA_DIRECTORY "/json_roundtrip/roundtrip29.json",
1657                    TEST_DATA_DIRECTORY "/json_roundtrip/roundtrip30.json",
1658                    TEST_DATA_DIRECTORY "/json_roundtrip/roundtrip31.json",
1659                    TEST_DATA_DIRECTORY "/json_roundtrip/roundtrip32.json",
1660                    TEST_DATA_DIRECTORY "/json_testsuite/sample.json", // kills AppVeyor
1661                    TEST_DATA_DIRECTORY "/json_tests/pass1.json",
1662                    TEST_DATA_DIRECTORY "/json_tests/pass2.json",
1663                    TEST_DATA_DIRECTORY "/json_tests/pass3.json",
1664                    TEST_DATA_DIRECTORY "/regression/floats.json",
1665                    TEST_DATA_DIRECTORY "/regression/signed_ints.json",
1666                    TEST_DATA_DIRECTORY "/regression/unsigned_ints.json",
1667                    TEST_DATA_DIRECTORY "/regression/working_file.json",
1668                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_array_arraysWithSpaces.json",
1669                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_array_empty-string.json",
1670                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_array_empty.json",
1671                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_array_ending_with_newline.json",
1672                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_array_false.json",
1673                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_array_heterogeneous.json",
1674                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_array_null.json",
1675                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_array_with_1_and_newline.json",
1676                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_array_with_leading_space.json",
1677                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_array_with_several_null.json",
1678                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_array_with_trailing_space.json",
1679                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_number.json",
1680                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_number_0e+1.json",
1681                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_number_0e1.json",
1682                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_number_after_space.json",
1683                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_number_double_close_to_zero.json",
1684                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_number_double_huge_neg_exp.json",
1685                    //TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_number_huge_exp.json",
1686                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_number_int_with_exp.json",
1687                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_number_minus_zero.json",
1688                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_number_negative_int.json",
1689                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_number_negative_one.json",
1690                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_number_negative_zero.json",
1691                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_number_real_capital_e.json",
1692                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_number_real_capital_e_neg_exp.json",
1693                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_number_real_capital_e_pos_exp.json",
1694                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_number_real_exponent.json",
1695                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_number_real_fraction_exponent.json",
1696                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_number_real_neg_exp.json",
1697                    //TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_number_real_neg_overflow.json",
1698                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_number_real_pos_exponent.json",
1699                    //TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_number_real_pos_overflow.json",
1700                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_number_real_underflow.json",
1701                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_number_simple_int.json",
1702                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_number_simple_real.json",
1703                    //TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_number_too_big_neg_int.json",
1704                    //TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_number_too_big_pos_int.json",
1705                    //TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_number_very_big_negative_int.json",
1706                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_object.json",
1707                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_object_basic.json",
1708                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_object_duplicated_key.json",
1709                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_object_duplicated_key_and_value.json",
1710                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_object_empty.json",
1711                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_object_empty_key.json",
1712                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_object_escaped_null_in_key.json",
1713                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_object_extreme_numbers.json",
1714                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_object_long_strings.json",
1715                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_object_simple.json",
1716                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_object_string_unicode.json",
1717                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_object_with_newlines.json",
1718                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_1_2_3_bytes_UTF-8_sequences.json",
1719                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_UTF-16_Surrogates_U+1D11E_MUSICAL_SYMBOL_G_CLEF.json",
1720                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_accepted_surrogate_pair.json",
1721                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_accepted_surrogate_pairs.json",
1722                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_allowed_escapes.json",
1723                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_backslash_and_u_escaped_zero.json",
1724                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_backslash_doublequotes.json",
1725                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_comments.json",
1726                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_double_escape_a.json",
1727                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_double_escape_n.json",
1728                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_escaped_control_character.json",
1729                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_escaped_noncharacter.json",
1730                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_in_array.json",
1731                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_in_array_with_leading_space.json",
1732                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_last_surrogates_1_and_2.json",
1733                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_newline_uescaped.json",
1734                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_nonCharacterInUTF-8_U+10FFFF.json",
1735                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_nonCharacterInUTF-8_U+1FFFF.json",
1736                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_nonCharacterInUTF-8_U+FFFF.json",
1737                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_null_escape.json",
1738                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_one-byte-utf-8.json",
1739                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_pi.json",
1740                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_simple_ascii.json",
1741                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_space.json",
1742                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_three-byte-utf-8.json",
1743                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_two-byte-utf-8.json",
1744                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_u+2028_line_sep.json",
1745                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_u+2029_par_sep.json",
1746                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_uEscape.json",
1747                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_unescaped_char_delete.json",
1748                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_unicode.json",
1749                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_unicodeEscapedBackslash.json",
1750                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_unicode_2.json",
1751                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_unicode_U+200B_ZERO_WIDTH_SPACE.json",
1752                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_unicode_U+2064_invisible_plus.json",
1753                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_unicode_escaped_double_quote.json",
1754                    // TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_utf16.json",
1755                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_utf8.json",
1756                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_string_with_del_character.json",
1757                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_structure_lonely_false.json",
1758                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_structure_lonely_int.json",
1759                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_structure_lonely_negative_real.json",
1760                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_structure_lonely_null.json",
1761                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_structure_lonely_string.json",
1762                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_structure_lonely_true.json",
1763                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_structure_string_empty.json",
1764                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_structure_trailing_newline.json",
1765                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_structure_true_in_array.json",
1766                    TEST_DATA_DIRECTORY "/nst_json_testsuite/test_parsing/y_structure_whitespace_array.json"
1767                })
1768        {
1769            CAPTURE(filename)
1770
1771            {
1772                INFO_WITH_TEMP(filename + ": std::vector<uint8_t>");
1773                // parse JSON file
1774                std::ifstream f_json(filename);
1775                json j1 = json::parse(f_json);
1776
1777                // parse MessagePack file
1778                auto packed = utils::read_binary_file(filename + ".msgpack");
1779                json j2;
1780                CHECK_NOTHROW(j2 = json::from_msgpack(packed));
1781
1782                // compare parsed JSON values
1783                CHECK(j1 == j2);
1784            }
1785
1786            {
1787                INFO_WITH_TEMP(filename + ": std::ifstream");
1788                // parse JSON file
1789                std::ifstream f_json(filename);
1790                json j1 = json::parse(f_json);
1791
1792                // parse MessagePack file
1793                std::ifstream f_msgpack(filename + ".msgpack", std::ios::binary);
1794                json j2;
1795                CHECK_NOTHROW(j2 = json::from_msgpack(f_msgpack));
1796
1797                // compare parsed JSON values
1798                CHECK(j1 == j2);
1799            }
1800
1801            {
1802                INFO_WITH_TEMP(filename + ": uint8_t* and size");
1803                // parse JSON file
1804                std::ifstream f_json(filename);
1805                json j1 = json::parse(f_json);
1806
1807                // parse MessagePack file
1808                auto packed = utils::read_binary_file(filename + ".msgpack");
1809                json j2;
1810                CHECK_NOTHROW(j2 = json::from_msgpack({packed.data(), packed.size()}));
1811
1812                // compare parsed JSON values
1813                CHECK(j1 == j2);
1814            }
1815
1816            {
1817                INFO_WITH_TEMP(filename + ": output to output adapters");
1818                // parse JSON file
1819                std::ifstream f_json(filename);
1820                json j1 = json::parse(f_json);
1821
1822                // parse MessagePack file
1823                auto packed = utils::read_binary_file(filename + ".msgpack");
1824
1825                if (exclude_packed.count(filename) == 0u)
1826                {
1827                    {
1828                        INFO_WITH_TEMP(filename + ": output adapters: std::vector<uint8_t>");
1829                        std::vector<uint8_t> vec;
1830                        json::to_msgpack(j1, vec);
1831                        CHECK(vec == packed);
1832                    }
1833                }
1834            }
1835        }
1836    }
1837}
1838