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// ICPC errors out on multibyte character sequences in source files 15c5f01b2fSopenharmony_ci#ifndef __INTEL_COMPILER 16c5f01b2fSopenharmony_cinamespace 17c5f01b2fSopenharmony_ci{ 18c5f01b2fSopenharmony_cibool wstring_is_utf16(); 19c5f01b2fSopenharmony_cibool wstring_is_utf16() 20c5f01b2fSopenharmony_ci{ 21c5f01b2fSopenharmony_ci return (std::wstring(L"") == std::wstring(L"\U0001F4A9")); 22c5f01b2fSopenharmony_ci} 23c5f01b2fSopenharmony_ci 24c5f01b2fSopenharmony_cibool u16string_is_utf16(); 25c5f01b2fSopenharmony_cibool u16string_is_utf16() 26c5f01b2fSopenharmony_ci{ 27c5f01b2fSopenharmony_ci return (std::u16string(u"") == std::u16string(u"\U0001F4A9")); 28c5f01b2fSopenharmony_ci} 29c5f01b2fSopenharmony_ci 30c5f01b2fSopenharmony_cibool u32string_is_utf32(); 31c5f01b2fSopenharmony_cibool u32string_is_utf32() 32c5f01b2fSopenharmony_ci{ 33c5f01b2fSopenharmony_ci return (std::u32string(U"") == std::u32string(U"\U0001F4A9")); 34c5f01b2fSopenharmony_ci} 35c5f01b2fSopenharmony_ci} // namespace 36c5f01b2fSopenharmony_ci 37c5f01b2fSopenharmony_ciTEST_CASE("wide strings") 38c5f01b2fSopenharmony_ci{ 39c5f01b2fSopenharmony_ci SECTION("std::wstring") 40c5f01b2fSopenharmony_ci { 41c5f01b2fSopenharmony_ci if (wstring_is_utf16()) 42c5f01b2fSopenharmony_ci { 43c5f01b2fSopenharmony_ci std::wstring w = L"[12.2,\"Ⴥaäö\"]"; 44c5f01b2fSopenharmony_ci json j = json::parse(w); 45c5f01b2fSopenharmony_ci CHECK(j.dump() == "[12.2,\"Ⴥaäö\"]"); 46c5f01b2fSopenharmony_ci } 47c5f01b2fSopenharmony_ci } 48c5f01b2fSopenharmony_ci 49c5f01b2fSopenharmony_ci SECTION("invalid std::wstring") 50c5f01b2fSopenharmony_ci { 51c5f01b2fSopenharmony_ci if (wstring_is_utf16()) 52c5f01b2fSopenharmony_ci { 53c5f01b2fSopenharmony_ci std::wstring w = L"\"\xDBFF"; 54c5f01b2fSopenharmony_ci json _; 55c5f01b2fSopenharmony_ci CHECK_THROWS_AS(_ = json::parse(w), json::parse_error&); 56c5f01b2fSopenharmony_ci } 57c5f01b2fSopenharmony_ci } 58c5f01b2fSopenharmony_ci 59c5f01b2fSopenharmony_ci SECTION("std::u16string") 60c5f01b2fSopenharmony_ci { 61c5f01b2fSopenharmony_ci if (u16string_is_utf16()) 62c5f01b2fSopenharmony_ci { 63c5f01b2fSopenharmony_ci std::u16string w = u"[12.2,\"Ⴥaäö\"]"; 64c5f01b2fSopenharmony_ci json j = json::parse(w); 65c5f01b2fSopenharmony_ci CHECK(j.dump() == "[12.2,\"Ⴥaäö\"]"); 66c5f01b2fSopenharmony_ci } 67c5f01b2fSopenharmony_ci } 68c5f01b2fSopenharmony_ci 69c5f01b2fSopenharmony_ci SECTION("invalid std::u16string") 70c5f01b2fSopenharmony_ci { 71c5f01b2fSopenharmony_ci if (wstring_is_utf16()) 72c5f01b2fSopenharmony_ci { 73c5f01b2fSopenharmony_ci std::u16string w = u"\"\xDBFF"; 74c5f01b2fSopenharmony_ci json _; 75c5f01b2fSopenharmony_ci CHECK_THROWS_AS(_ = json::parse(w), json::parse_error&); 76c5f01b2fSopenharmony_ci } 77c5f01b2fSopenharmony_ci } 78c5f01b2fSopenharmony_ci 79c5f01b2fSopenharmony_ci SECTION("std::u32string") 80c5f01b2fSopenharmony_ci { 81c5f01b2fSopenharmony_ci if (u32string_is_utf32()) 82c5f01b2fSopenharmony_ci { 83c5f01b2fSopenharmony_ci std::u32string w = U"[12.2,\"Ⴥaäö\"]"; 84c5f01b2fSopenharmony_ci json j = json::parse(w); 85c5f01b2fSopenharmony_ci CHECK(j.dump() == "[12.2,\"Ⴥaäö\"]"); 86c5f01b2fSopenharmony_ci } 87c5f01b2fSopenharmony_ci } 88c5f01b2fSopenharmony_ci 89c5f01b2fSopenharmony_ci SECTION("invalid std::u32string") 90c5f01b2fSopenharmony_ci { 91c5f01b2fSopenharmony_ci if (u32string_is_utf32()) 92c5f01b2fSopenharmony_ci { 93c5f01b2fSopenharmony_ci std::u32string w = U"\"\x110000"; 94c5f01b2fSopenharmony_ci json _; 95c5f01b2fSopenharmony_ci CHECK_THROWS_AS(_ = json::parse(w), json::parse_error&); 96c5f01b2fSopenharmony_ci } 97c5f01b2fSopenharmony_ci } 98c5f01b2fSopenharmony_ci} 99c5f01b2fSopenharmony_ci#endif 100