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
14TEST_CASE("other constructors and destructor")
15{
16    SECTION("copy constructor")
17    {
18        SECTION("object")
19        {
20            json j {{"foo", 1}, {"bar", false}};
21            json k(j); // NOLINT(performance-unnecessary-copy-initialization)
22            CHECK(j == k);
23        }
24
25        SECTION("array")
26        {
27            json j {"foo", 1, 42.23, false};
28            json k(j); // NOLINT(performance-unnecessary-copy-initialization)
29            CHECK(j == k);
30        }
31
32        SECTION("null")
33        {
34            json j(nullptr);
35            json k(j); // NOLINT(performance-unnecessary-copy-initialization)
36            CHECK(j == k);
37        }
38
39        SECTION("boolean")
40        {
41            json j(true);
42            json k(j); // NOLINT(performance-unnecessary-copy-initialization)
43            CHECK(j == k);
44        }
45
46        SECTION("string")
47        {
48            json j("Hello world");
49            json k(j); // NOLINT(performance-unnecessary-copy-initialization)
50            CHECK(j == k);
51        }
52
53        SECTION("number (integer)")
54        {
55            json j(42);
56            json k(j); // NOLINT(performance-unnecessary-copy-initialization)
57            CHECK(j == k);
58        }
59
60        SECTION("number (unsigned)")
61        {
62            json j(42u);
63            json k(j); // NOLINT(performance-unnecessary-copy-initialization)
64            CHECK(j == k);
65        }
66
67        SECTION("number (floating-point)")
68        {
69            json j(42.23);
70            json k(j); // NOLINT(performance-unnecessary-copy-initialization)
71            CHECK(j == k);
72        }
73
74        SECTION("binary")
75        {
76            json j = json::binary({1, 2, 3});
77            json k(j); // NOLINT(performance-unnecessary-copy-initialization)
78            CHECK(j == k);
79        }
80    }
81
82    SECTION("move constructor")
83    {
84        json j {{"foo", "bar"}, {"baz", {1, 2, 3, 4}}, {"a", 42u}, {"b", 42.23}, {"c", nullptr}};
85        CHECK(j.type() == json::value_t::object);
86        json k(std::move(j));
87        CHECK(k.type() == json::value_t::object);
88        CHECK(j.type() == json::value_t::null); // NOLINT: access after move is OK here
89    }
90
91    SECTION("copy assignment")
92    {
93        SECTION("object")
94        {
95            json j {{"foo", 1}, {"bar", false}};
96            json k;
97            k = j;
98            CHECK(j == k);
99        }
100
101        SECTION("array")
102        {
103            json j {"foo", 1, 42.23, false};
104            json k;
105            k = j;
106            CHECK(j == k);
107        }
108
109        SECTION("null")
110        {
111            json j(nullptr);
112            json k;
113            k = j;
114            CHECK(j == k);
115        }
116
117        SECTION("boolean")
118        {
119            json j(true);
120            json k;
121            k = j;
122            CHECK(j == k);
123        }
124
125        SECTION("string")
126        {
127            json j("Hello world");
128            json k;
129            k = j;
130            CHECK(j == k);
131        }
132
133        SECTION("number (integer)")
134        {
135            json j(42);
136            json k;
137            k = j;
138            CHECK(j == k);
139        }
140
141        SECTION("number (unsigned)")
142        {
143            json j(42u);
144            json k;
145            k = j;
146            CHECK(j == k);
147        }
148
149        SECTION("number (floating-point)")
150        {
151            json j(42.23);
152            json k;
153            k = j;
154            CHECK(j == k);
155        }
156
157        SECTION("binary")
158        {
159            json j = json::binary({1, 2, 3});
160            json k;
161            k = j;
162            CHECK(j == k);
163        }
164    }
165
166    SECTION("destructor")
167    {
168        SECTION("object")
169        {
170            auto* j = new json {{"foo", 1}, {"bar", false}}; // NOLINT(cppcoreguidelines-owning-memory)
171            delete j; // NOLINT(cppcoreguidelines-owning-memory)
172        }
173
174        SECTION("array")
175        {
176            auto* j = new json {"foo", 1, 1u, false, 23.42}; // NOLINT(cppcoreguidelines-owning-memory)
177            delete j; // NOLINT(cppcoreguidelines-owning-memory)
178        }
179
180        SECTION("string")
181        {
182            auto* j = new json("Hello world"); // NOLINT(cppcoreguidelines-owning-memory)
183            delete j; // NOLINT(cppcoreguidelines-owning-memory)
184        }
185    }
186}
187