1c5f01b2fSopenharmony_ci//     __ _____ _____ _____
2c5f01b2fSopenharmony_ci//  __|  |   __|     |   | |  JSON for Modern C++ (supporting code)
3c5f01b2fSopenharmony_ci// |  |  |__   |  |  | | | |  version 3.11.2
4c5f01b2fSopenharmony_ci// |_____|_____|_____|_|___|  https://github.com/nlohmann/json
5c5f01b2fSopenharmony_ci//
6c5f01b2fSopenharmony_ci// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
7c5f01b2fSopenharmony_ci// SPDX-License-Identifier: MIT
8c5f01b2fSopenharmony_ci
9c5f01b2fSopenharmony_ci#include "doctest_compatibility.h"
10c5f01b2fSopenharmony_ci
11c5f01b2fSopenharmony_ci#include <nlohmann/json.hpp>
12c5f01b2fSopenharmony_ciusing nlohmann::json;
13c5f01b2fSopenharmony_ci
14c5f01b2fSopenharmony_ci#include <fstream>
15c5f01b2fSopenharmony_ci#include "make_test_data_available.hpp"
16c5f01b2fSopenharmony_ci
17c5f01b2fSopenharmony_ciTEST_CASE("Binary Formats" * doctest::skip())
18c5f01b2fSopenharmony_ci{
19c5f01b2fSopenharmony_ci    SECTION("canada.json")
20c5f01b2fSopenharmony_ci    {
21c5f01b2fSopenharmony_ci        const auto* filename = TEST_DATA_DIRECTORY "/nativejson-benchmark/canada.json";
22c5f01b2fSopenharmony_ci        json j = json::parse(std::ifstream(filename));
23c5f01b2fSopenharmony_ci
24c5f01b2fSopenharmony_ci        const auto json_size = j.dump().size();
25c5f01b2fSopenharmony_ci        const auto bjdata_1_size = json::to_bjdata(j).size();
26c5f01b2fSopenharmony_ci        const auto bjdata_2_size = json::to_bjdata(j, true).size();
27c5f01b2fSopenharmony_ci        const auto bjdata_3_size = json::to_bjdata(j, true, true).size();
28c5f01b2fSopenharmony_ci        const auto bson_size = json::to_bson(j).size();
29c5f01b2fSopenharmony_ci        const auto cbor_size = json::to_cbor(j).size();
30c5f01b2fSopenharmony_ci        const auto msgpack_size = json::to_msgpack(j).size();
31c5f01b2fSopenharmony_ci        const auto ubjson_1_size = json::to_ubjson(j).size();
32c5f01b2fSopenharmony_ci        const auto ubjson_2_size = json::to_ubjson(j, true).size();
33c5f01b2fSopenharmony_ci        const auto ubjson_3_size = json::to_ubjson(j, true, true).size();
34c5f01b2fSopenharmony_ci
35c5f01b2fSopenharmony_ci        CHECK(json_size == 2090303);
36c5f01b2fSopenharmony_ci        CHECK(bjdata_1_size == 1112030);
37c5f01b2fSopenharmony_ci        CHECK(bjdata_2_size == 1224148);
38c5f01b2fSopenharmony_ci        CHECK(bjdata_3_size == 1224148);
39c5f01b2fSopenharmony_ci        CHECK(bson_size == 1794522);
40c5f01b2fSopenharmony_ci        CHECK(cbor_size == 1055552);
41c5f01b2fSopenharmony_ci        CHECK(msgpack_size == 1056145);
42c5f01b2fSopenharmony_ci        CHECK(ubjson_1_size == 1112030);
43c5f01b2fSopenharmony_ci        CHECK(ubjson_2_size == 1224148);
44c5f01b2fSopenharmony_ci        CHECK(ubjson_3_size == 1169069);
45c5f01b2fSopenharmony_ci
46c5f01b2fSopenharmony_ci        CHECK((100.0 * double(json_size) / double(json_size)) == Approx(100.0));
47c5f01b2fSopenharmony_ci        CHECK((100.0 * double(bjdata_1_size) / double(json_size)) == Approx(53.199));
48c5f01b2fSopenharmony_ci        CHECK((100.0 * double(bjdata_2_size) / double(json_size)) == Approx(58.563));
49c5f01b2fSopenharmony_ci        CHECK((100.0 * double(bjdata_3_size) / double(json_size)) == Approx(58.563));
50c5f01b2fSopenharmony_ci        CHECK((100.0 * double(bson_size) / double(json_size)) == Approx(85.849));
51c5f01b2fSopenharmony_ci        CHECK((100.0 * double(cbor_size) / double(json_size)) == Approx(50.497));
52c5f01b2fSopenharmony_ci        CHECK((100.0 * double(msgpack_size) / double(json_size)) == Approx(50.526));
53c5f01b2fSopenharmony_ci        CHECK((100.0 * double(ubjson_1_size) / double(json_size)) == Approx(53.199));
54c5f01b2fSopenharmony_ci        CHECK((100.0 * double(ubjson_2_size) / double(json_size)) == Approx(58.563));
55c5f01b2fSopenharmony_ci        CHECK((100.0 * double(ubjson_3_size) / double(json_size)) == Approx(55.928));
56c5f01b2fSopenharmony_ci    }
57c5f01b2fSopenharmony_ci
58c5f01b2fSopenharmony_ci    SECTION("twitter.json")
59c5f01b2fSopenharmony_ci    {
60c5f01b2fSopenharmony_ci        const auto* filename = TEST_DATA_DIRECTORY "/nativejson-benchmark/twitter.json";
61c5f01b2fSopenharmony_ci        json j = json::parse(std::ifstream(filename));
62c5f01b2fSopenharmony_ci
63c5f01b2fSopenharmony_ci        const auto json_size = j.dump().size();
64c5f01b2fSopenharmony_ci        const auto bjdata_1_size = json::to_bjdata(j).size();
65c5f01b2fSopenharmony_ci        const auto bjdata_2_size = json::to_bjdata(j, true).size();
66c5f01b2fSopenharmony_ci        const auto bjdata_3_size = json::to_bjdata(j, true, true).size();
67c5f01b2fSopenharmony_ci        const auto bson_size = json::to_bson(j).size();
68c5f01b2fSopenharmony_ci        const auto cbor_size = json::to_cbor(j).size();
69c5f01b2fSopenharmony_ci        const auto msgpack_size = json::to_msgpack(j).size();
70c5f01b2fSopenharmony_ci        const auto ubjson_1_size = json::to_ubjson(j).size();
71c5f01b2fSopenharmony_ci        const auto ubjson_2_size = json::to_ubjson(j, true).size();
72c5f01b2fSopenharmony_ci        const auto ubjson_3_size = json::to_ubjson(j, true, true).size();
73c5f01b2fSopenharmony_ci
74c5f01b2fSopenharmony_ci        CHECK(json_size == 466906);
75c5f01b2fSopenharmony_ci        CHECK(bjdata_1_size == 425342);
76c5f01b2fSopenharmony_ci        CHECK(bjdata_2_size == 429970);
77c5f01b2fSopenharmony_ci        CHECK(bjdata_3_size == 429970);
78c5f01b2fSopenharmony_ci        CHECK(bson_size == 444568);
79c5f01b2fSopenharmony_ci        CHECK(cbor_size == 402814);
80c5f01b2fSopenharmony_ci        CHECK(msgpack_size == 401510);
81c5f01b2fSopenharmony_ci        CHECK(ubjson_1_size == 426160);
82c5f01b2fSopenharmony_ci        CHECK(ubjson_2_size == 430788);
83c5f01b2fSopenharmony_ci        CHECK(ubjson_3_size == 430798);
84c5f01b2fSopenharmony_ci
85c5f01b2fSopenharmony_ci        CHECK((100.0 * double(json_size) / double(json_size)) == Approx(100.0));
86c5f01b2fSopenharmony_ci        CHECK((100.0 * double(bjdata_1_size) / double(json_size)) == Approx(91.097));
87c5f01b2fSopenharmony_ci        CHECK((100.0 * double(bjdata_2_size) / double(json_size)) == Approx(92.089));
88c5f01b2fSopenharmony_ci        CHECK((100.0 * double(bjdata_3_size) / double(json_size)) == Approx(92.089));
89c5f01b2fSopenharmony_ci        CHECK((100.0 * double(bson_size) / double(json_size)) == Approx(95.215));
90c5f01b2fSopenharmony_ci        CHECK((100.0 * double(cbor_size) / double(json_size)) == Approx(86.273));
91c5f01b2fSopenharmony_ci        CHECK((100.0 * double(msgpack_size) / double(json_size)) == Approx(85.993));
92c5f01b2fSopenharmony_ci        CHECK((100.0 * double(ubjson_1_size) / double(json_size)) == Approx(91.273));
93c5f01b2fSopenharmony_ci        CHECK((100.0 * double(ubjson_2_size) / double(json_size)) == Approx(92.264));
94c5f01b2fSopenharmony_ci        CHECK((100.0 * double(ubjson_3_size) / double(json_size)) == Approx(92.266));
95c5f01b2fSopenharmony_ci    }
96c5f01b2fSopenharmony_ci
97c5f01b2fSopenharmony_ci    SECTION("citm_catalog.json")
98c5f01b2fSopenharmony_ci    {
99c5f01b2fSopenharmony_ci        const auto* filename = TEST_DATA_DIRECTORY "/nativejson-benchmark/citm_catalog.json";
100c5f01b2fSopenharmony_ci        json j = json::parse(std::ifstream(filename));
101c5f01b2fSopenharmony_ci
102c5f01b2fSopenharmony_ci        const auto json_size = j.dump().size();
103c5f01b2fSopenharmony_ci        const auto bjdata_1_size = json::to_bjdata(j).size();
104c5f01b2fSopenharmony_ci        const auto bjdata_2_size = json::to_bjdata(j, true).size();
105c5f01b2fSopenharmony_ci        const auto bjdata_3_size = json::to_bjdata(j, true, true).size();
106c5f01b2fSopenharmony_ci        const auto bson_size = json::to_bson(j).size();
107c5f01b2fSopenharmony_ci        const auto cbor_size = json::to_cbor(j).size();
108c5f01b2fSopenharmony_ci        const auto msgpack_size = json::to_msgpack(j).size();
109c5f01b2fSopenharmony_ci        const auto ubjson_1_size = json::to_ubjson(j).size();
110c5f01b2fSopenharmony_ci        const auto ubjson_2_size = json::to_ubjson(j, true).size();
111c5f01b2fSopenharmony_ci        const auto ubjson_3_size = json::to_ubjson(j, true, true).size();
112c5f01b2fSopenharmony_ci
113c5f01b2fSopenharmony_ci        CHECK(json_size == 500299);
114c5f01b2fSopenharmony_ci        CHECK(bjdata_1_size == 390781);
115c5f01b2fSopenharmony_ci        CHECK(bjdata_2_size == 433557);
116c5f01b2fSopenharmony_ci        CHECK(bjdata_3_size == 432964);
117c5f01b2fSopenharmony_ci        CHECK(bson_size == 479430);
118c5f01b2fSopenharmony_ci        CHECK(cbor_size == 342373);
119c5f01b2fSopenharmony_ci        CHECK(msgpack_size == 342473);
120c5f01b2fSopenharmony_ci        CHECK(ubjson_1_size == 391463);
121c5f01b2fSopenharmony_ci        CHECK(ubjson_2_size == 434239);
122c5f01b2fSopenharmony_ci        CHECK(ubjson_3_size == 425073);
123c5f01b2fSopenharmony_ci
124c5f01b2fSopenharmony_ci        CHECK((100.0 * double(json_size) / double(json_size)) == Approx(100.0));
125c5f01b2fSopenharmony_ci        CHECK((100.0 * double(bjdata_1_size) / double(json_size)) == Approx(78.109));
126c5f01b2fSopenharmony_ci        CHECK((100.0 * double(bjdata_2_size) / double(json_size)) == Approx(86.659));
127c5f01b2fSopenharmony_ci        CHECK((100.0 * double(bjdata_3_size) / double(json_size)) == Approx(86.541));
128c5f01b2fSopenharmony_ci        CHECK((100.0 * double(bson_size) / double(json_size)) == Approx(95.828));
129c5f01b2fSopenharmony_ci        CHECK((100.0 * double(cbor_size) / double(json_size)) == Approx(68.433));
130c5f01b2fSopenharmony_ci        CHECK((100.0 * double(msgpack_size) / double(json_size)) == Approx(68.453));
131c5f01b2fSopenharmony_ci        CHECK((100.0 * double(ubjson_1_size) / double(json_size)) == Approx(78.245));
132c5f01b2fSopenharmony_ci        CHECK((100.0 * double(ubjson_2_size) / double(json_size)) == Approx(86.795));
133c5f01b2fSopenharmony_ci        CHECK((100.0 * double(ubjson_3_size) / double(json_size)) == Approx(84.963));
134c5f01b2fSopenharmony_ci    }
135c5f01b2fSopenharmony_ci
136c5f01b2fSopenharmony_ci    SECTION("jeopardy.json")
137c5f01b2fSopenharmony_ci    {
138c5f01b2fSopenharmony_ci        const auto* filename = TEST_DATA_DIRECTORY "/jeopardy/jeopardy.json";
139c5f01b2fSopenharmony_ci        json j = json::parse(std::ifstream(filename));
140c5f01b2fSopenharmony_ci
141c5f01b2fSopenharmony_ci        const auto json_size = j.dump().size();
142c5f01b2fSopenharmony_ci        const auto bjdata_1_size = json::to_bjdata(j).size();
143c5f01b2fSopenharmony_ci        const auto bjdata_2_size = json::to_bjdata(j, true).size();
144c5f01b2fSopenharmony_ci        const auto bjdata_3_size = json::to_bjdata(j, true, true).size();
145c5f01b2fSopenharmony_ci        const auto bson_size = json::to_bson({{"", j}}).size(); // wrap array in object for BSON
146c5f01b2fSopenharmony_ci        const auto cbor_size = json::to_cbor(j).size();
147c5f01b2fSopenharmony_ci        const auto msgpack_size = json::to_msgpack(j).size();
148c5f01b2fSopenharmony_ci        const auto ubjson_1_size = json::to_ubjson(j).size();
149c5f01b2fSopenharmony_ci        const auto ubjson_2_size = json::to_ubjson(j, true).size();
150c5f01b2fSopenharmony_ci        const auto ubjson_3_size = json::to_ubjson(j, true, true).size();
151c5f01b2fSopenharmony_ci
152c5f01b2fSopenharmony_ci        CHECK(json_size == 52508728);
153c5f01b2fSopenharmony_ci        CHECK(bjdata_1_size == 50710965);
154c5f01b2fSopenharmony_ci        CHECK(bjdata_2_size == 51144830);
155c5f01b2fSopenharmony_ci        CHECK(bjdata_3_size == 51144830);
156c5f01b2fSopenharmony_ci        CHECK(bson_size == 56008520);
157c5f01b2fSopenharmony_ci        CHECK(cbor_size == 46187320);
158c5f01b2fSopenharmony_ci        CHECK(msgpack_size == 46158575);
159c5f01b2fSopenharmony_ci        CHECK(ubjson_1_size == 50710965);
160c5f01b2fSopenharmony_ci        CHECK(ubjson_2_size == 51144830);
161c5f01b2fSopenharmony_ci        CHECK(ubjson_3_size == 49861422);
162c5f01b2fSopenharmony_ci
163c5f01b2fSopenharmony_ci        CHECK((100.0 * double(json_size) / double(json_size)) == Approx(100.0));
164c5f01b2fSopenharmony_ci        CHECK((100.0 * double(bjdata_1_size) / double(json_size)) == Approx(96.576));
165c5f01b2fSopenharmony_ci        CHECK((100.0 * double(bjdata_2_size) / double(json_size)) == Approx(97.402));
166c5f01b2fSopenharmony_ci        CHECK((100.0 * double(bjdata_3_size) / double(json_size)) == Approx(97.402));
167c5f01b2fSopenharmony_ci        CHECK((100.0 * double(bson_size) / double(json_size)) == Approx(106.665));
168c5f01b2fSopenharmony_ci        CHECK((100.0 * double(cbor_size) / double(json_size)) == Approx(87.961));
169c5f01b2fSopenharmony_ci        CHECK((100.0 * double(msgpack_size) / double(json_size)) == Approx(87.906));
170c5f01b2fSopenharmony_ci        CHECK((100.0 * double(ubjson_1_size) / double(json_size)) == Approx(96.576));
171c5f01b2fSopenharmony_ci        CHECK((100.0 * double(ubjson_2_size) / double(json_size)) == Approx(97.402));
172c5f01b2fSopenharmony_ci        CHECK((100.0 * double(ubjson_3_size) / double(json_size)) == Approx(94.958));
173c5f01b2fSopenharmony_ci    }
174c5f01b2fSopenharmony_ci
175c5f01b2fSopenharmony_ci    SECTION("sample.json")
176c5f01b2fSopenharmony_ci    {
177c5f01b2fSopenharmony_ci        const auto* filename = TEST_DATA_DIRECTORY "/json_testsuite/sample.json";
178c5f01b2fSopenharmony_ci        json j = json::parse(std::ifstream(filename));
179c5f01b2fSopenharmony_ci
180c5f01b2fSopenharmony_ci        const auto json_size = j.dump().size();
181c5f01b2fSopenharmony_ci        const auto bjdata_1_size = json::to_bjdata(j).size();
182c5f01b2fSopenharmony_ci        const auto bjdata_2_size = json::to_bjdata(j, true).size();
183c5f01b2fSopenharmony_ci        const auto bjdata_3_size = json::to_bjdata(j, true, true).size();
184c5f01b2fSopenharmony_ci        // BSON cannot process the file as it contains code point  U+0000
185c5f01b2fSopenharmony_ci        const auto cbor_size = json::to_cbor(j).size();
186c5f01b2fSopenharmony_ci        const auto msgpack_size = json::to_msgpack(j).size();
187c5f01b2fSopenharmony_ci        const auto ubjson_1_size = json::to_ubjson(j).size();
188c5f01b2fSopenharmony_ci        const auto ubjson_2_size = json::to_ubjson(j, true).size();
189c5f01b2fSopenharmony_ci        const auto ubjson_3_size = json::to_ubjson(j, true, true).size();
190c5f01b2fSopenharmony_ci
191c5f01b2fSopenharmony_ci        CHECK(json_size == 168677);
192c5f01b2fSopenharmony_ci        CHECK(bjdata_1_size == 148695);
193c5f01b2fSopenharmony_ci        CHECK(bjdata_2_size == 150569);
194c5f01b2fSopenharmony_ci        CHECK(bjdata_3_size == 150569);
195c5f01b2fSopenharmony_ci        CHECK(cbor_size == 147095);
196c5f01b2fSopenharmony_ci        CHECK(msgpack_size == 147017);
197c5f01b2fSopenharmony_ci        CHECK(ubjson_1_size == 148695);
198c5f01b2fSopenharmony_ci        CHECK(ubjson_2_size == 150569);
199c5f01b2fSopenharmony_ci        CHECK(ubjson_3_size == 150883);
200c5f01b2fSopenharmony_ci
201c5f01b2fSopenharmony_ci        CHECK((100.0 * double(json_size) / double(json_size)) == Approx(100.0));
202c5f01b2fSopenharmony_ci        CHECK((100.0 * double(bjdata_1_size) / double(json_size)) == Approx(88.153));
203c5f01b2fSopenharmony_ci        CHECK((100.0 * double(bjdata_2_size) / double(json_size)) == Approx(89.264));
204c5f01b2fSopenharmony_ci        CHECK((100.0 * double(bjdata_3_size) / double(json_size)) == Approx(89.264));
205c5f01b2fSopenharmony_ci        CHECK((100.0 * double(cbor_size) / double(json_size)) == Approx(87.205));
206c5f01b2fSopenharmony_ci        CHECK((100.0 * double(msgpack_size) / double(json_size)) == Approx(87.158));
207c5f01b2fSopenharmony_ci        CHECK((100.0 * double(ubjson_1_size) / double(json_size)) == Approx(88.153));
208c5f01b2fSopenharmony_ci        CHECK((100.0 * double(ubjson_2_size) / double(json_size)) == Approx(89.264));
209c5f01b2fSopenharmony_ci        CHECK((100.0 * double(ubjson_3_size) / double(json_size)) == Approx(89.450));
210c5f01b2fSopenharmony_ci    }
211c5f01b2fSopenharmony_ci}
212