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