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