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>
12 using nlohmann::json;
13 
14 TEST_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