1a1d56debSopenharmony_ci// Copyright (c) 2023 Huawei Device Co., Ltd.
2a1d56debSopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License");
3a1d56debSopenharmony_ci// you may not use this file except in compliance with the License.
4a1d56debSopenharmony_ci// You may obtain a copy of the License at
5a1d56debSopenharmony_ci//
6a1d56debSopenharmony_ci//     http://www.apache.org/licenses/LICENSE-2.0
7a1d56debSopenharmony_ci//
8a1d56debSopenharmony_ci// Unless required by applicable law or agreed to in writing, software
9a1d56debSopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS,
10a1d56debSopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11a1d56debSopenharmony_ci// See the License for the specific language governing permissions and
12a1d56debSopenharmony_ci// limitations under the License.
13a1d56debSopenharmony_ci
14a1d56debSopenharmony_ci#![allow(clippy::missing_safety_doc)]
15a1d56debSopenharmony_ci
16a1d56debSopenharmony_ciuse crate::*;
17a1d56debSopenharmony_ciuse core::ptr::{null_mut, slice_from_raw_parts};
18a1d56debSopenharmony_ciuse core::str::from_utf8_unchecked;
19a1d56debSopenharmony_ciuse libc::{c_char, c_double, c_int, c_longlong, c_void, strlen};
20a1d56debSopenharmony_ciuse std::ffi::CString;
21a1d56debSopenharmony_ci
22a1d56debSopenharmony_ci/// Boolean value mapping.
23a1d56debSopenharmony_ciconst FALSE: c_int = 0;
24a1d56debSopenharmony_ci
25a1d56debSopenharmony_ci/// Operation success or failure.
26a1d56debSopenharmony_ciconst SUCCESS: c_int = 1;
27a1d56debSopenharmony_ciconst FAILURE: c_int = 0;
28a1d56debSopenharmony_ci
29a1d56debSopenharmony_ci/// Empty pointer of YlongJson*
30a1d56debSopenharmony_ciconst NULL_MUT_YLONG_JSON: *mut YlongJson = null_mut::<YlongJson>();
31a1d56debSopenharmony_ci/// Empty pointer of char*
32a1d56debSopenharmony_ciconst NULL_MUT_CSTR: *mut c_char = null_mut::<c_char>();
33a1d56debSopenharmony_ci
34a1d56debSopenharmony_ci/// A void* pointer is passed to C for use.
35a1d56debSopenharmony_cipub type YlongJson = c_void;
36a1d56debSopenharmony_ci
37a1d56debSopenharmony_ci/// Parses a JSON text string.
38a1d56debSopenharmony_ci/// Returns a JSON object on success and null on failure.
39a1d56debSopenharmony_ci#[no_mangle]
40a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_parse(
41a1d56debSopenharmony_ci    value: *mut c_char,
42a1d56debSopenharmony_ci    err_msg: *mut *mut c_char,
43a1d56debSopenharmony_ci) -> *mut YlongJson {
44a1d56debSopenharmony_ci    // Using `ptr::slice_from_raw_parts` here dramatically
45a1d56debSopenharmony_ci    // reduces the cost of converting between char* and &[u8].
46a1d56debSopenharmony_ci    let len = strlen(value);
47a1d56debSopenharmony_ci    let slice = &*slice_from_raw_parts(value as *mut u8, len);
48a1d56debSopenharmony_ci
49a1d56debSopenharmony_ci    let value = match JsonValue::from_text(slice) {
50a1d56debSopenharmony_ci        Ok(v) => v,
51a1d56debSopenharmony_ci        Err(e) => {
52a1d56debSopenharmony_ci            // If an error occurs, writes error messages into err_msg.
53a1d56debSopenharmony_ci            *err_msg = CString::from_vec_unchecked(e.to_string().into_bytes()).into_raw();
54a1d56debSopenharmony_ci            return NULL_MUT_YLONG_JSON;
55a1d56debSopenharmony_ci        }
56a1d56debSopenharmony_ci    };
57a1d56debSopenharmony_ci
58a1d56debSopenharmony_ci    Box::into_raw(Box::from(value)) as *mut YlongJson
59a1d56debSopenharmony_ci}
60a1d56debSopenharmony_ci
61a1d56debSopenharmony_ci/// Frees a C string.
62a1d56debSopenharmony_ci#[no_mangle]
63a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_free_string(string: *mut c_char) {
64a1d56debSopenharmony_ci    if string.is_null() {
65a1d56debSopenharmony_ci        return;
66a1d56debSopenharmony_ci    }
67a1d56debSopenharmony_ci
68a1d56debSopenharmony_ci    let _ = Box::from_raw(string);
69a1d56debSopenharmony_ci}
70a1d56debSopenharmony_ci
71a1d56debSopenharmony_ci/// Outputs a JSON object to a string in plain format.
72a1d56debSopenharmony_ci/// Returns a C string on success and null on failure.
73a1d56debSopenharmony_ci#[no_mangle]
74a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_print_unformatted(item: *const YlongJson) -> *mut c_char {
75a1d56debSopenharmony_ci    if item.is_null() {
76a1d56debSopenharmony_ci        return NULL_MUT_CSTR;
77a1d56debSopenharmony_ci    }
78a1d56debSopenharmony_ci
79a1d56debSopenharmony_ci    let value = &mut *(item as *mut JsonValue);
80a1d56debSopenharmony_ci
81a1d56debSopenharmony_ci    // Requests 256 bytes of memory in advance to improve output efficiency.
82a1d56debSopenharmony_ci    // Here we use `Vec::with_capacity(256)`, which performs better when `12 < string.len() < 256`.
83a1d56debSopenharmony_ci    // If here we use `Vec::new()`, it performs better when `string.len() < 32 ||  256 > string.len()`
84a1d56debSopenharmony_ci    // In most cases, `12 < the average string.len() < 256`, so we use `Vec::with_capacity()`.
85a1d56debSopenharmony_ci    let mut vec = Vec::with_capacity(256);
86a1d56debSopenharmony_ci    if value.compact_encode(&mut vec).is_err() {
87a1d56debSopenharmony_ci        return NULL_MUT_CSTR;
88a1d56debSopenharmony_ci    }
89a1d56debSopenharmony_ci
90a1d56debSopenharmony_ci    CString::from_vec_unchecked(vec).into_raw()
91a1d56debSopenharmony_ci}
92a1d56debSopenharmony_ci
93a1d56debSopenharmony_ci/// Deletes a JSON object.
94a1d56debSopenharmony_ci#[no_mangle]
95a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_delete(item: *mut YlongJson) {
96a1d56debSopenharmony_ci    if item.is_null() {
97a1d56debSopenharmony_ci        return;
98a1d56debSopenharmony_ci    }
99a1d56debSopenharmony_ci
100a1d56debSopenharmony_ci    let _ = Box::from_raw(item as *mut JsonValue);
101a1d56debSopenharmony_ci}
102a1d56debSopenharmony_ci
103a1d56debSopenharmony_ci/// Duplicates a JSON object.
104a1d56debSopenharmony_ci/// Return a new JSON object on success and null on failure.
105a1d56debSopenharmony_ci#[no_mangle]
106a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_duplicate(
107a1d56debSopenharmony_ci    item: *const YlongJson,
108a1d56debSopenharmony_ci    recurse: c_int,
109a1d56debSopenharmony_ci) -> *mut YlongJson {
110a1d56debSopenharmony_ci    if item.is_null() {
111a1d56debSopenharmony_ci        return NULL_MUT_YLONG_JSON;
112a1d56debSopenharmony_ci    }
113a1d56debSopenharmony_ci
114a1d56debSopenharmony_ci    if recurse == FALSE {
115a1d56debSopenharmony_ci        let value = &*(item as *mut JsonValue);
116a1d56debSopenharmony_ci        let value_clone = match value {
117a1d56debSopenharmony_ci            JsonValue::Array(_) => JsonValue::Array(Array::new()),
118a1d56debSopenharmony_ci            JsonValue::Object(_) => JsonValue::Object(Object::new()),
119a1d56debSopenharmony_ci            x => x.clone(),
120a1d56debSopenharmony_ci        };
121a1d56debSopenharmony_ci        return Box::into_raw(Box::from(value_clone)) as *mut YlongJson;
122a1d56debSopenharmony_ci    }
123a1d56debSopenharmony_ci
124a1d56debSopenharmony_ci    let value = &*(item as *mut JsonValue);
125a1d56debSopenharmony_ci    Box::into_raw(Box::from(value.clone())) as *mut YlongJson
126a1d56debSopenharmony_ci}
127a1d56debSopenharmony_ci
128a1d56debSopenharmony_ci/// Creates a JSON null object and returns a new JSON null object.
129a1d56debSopenharmony_ci#[no_mangle]
130a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_create_null() -> *mut YlongJson {
131a1d56debSopenharmony_ci    Box::into_raw(Box::from(JsonValue::Null)) as *mut YlongJson
132a1d56debSopenharmony_ci}
133a1d56debSopenharmony_ci
134a1d56debSopenharmony_ci/// Checks whether a JSON object is null.
135a1d56debSopenharmony_ci/// Returns a boolean value indicating whether the object is null.
136a1d56debSopenharmony_ci#[no_mangle]
137a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_is_null(item: *mut YlongJson) -> c_int {
138a1d56debSopenharmony_ci    if item.is_null() {
139a1d56debSopenharmony_ci        return FALSE;
140a1d56debSopenharmony_ci    }
141a1d56debSopenharmony_ci
142a1d56debSopenharmony_ci    let item = &*(item as *mut JsonValue);
143a1d56debSopenharmony_ci
144a1d56debSopenharmony_ci    item.is_null() as c_int
145a1d56debSopenharmony_ci}
146a1d56debSopenharmony_ci
147a1d56debSopenharmony_ci/// Creates a JSON boolean object.
148a1d56debSopenharmony_ci#[no_mangle]
149a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_create_bool(boolean: c_int) -> *mut YlongJson {
150a1d56debSopenharmony_ci    // If it is equal to 0, the result is false. Otherwise it is true.
151a1d56debSopenharmony_ci    Box::into_raw(Box::from(JsonValue::Boolean(boolean != FALSE))) as *mut YlongJson
152a1d56debSopenharmony_ci}
153a1d56debSopenharmony_ci
154a1d56debSopenharmony_ci/// Checks whether a JSON object is a boolean.
155a1d56debSopenharmony_ci#[no_mangle]
156a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_is_bool(item: *const YlongJson) -> c_int {
157a1d56debSopenharmony_ci    if item.is_null() {
158a1d56debSopenharmony_ci        return FALSE;
159a1d56debSopenharmony_ci    }
160a1d56debSopenharmony_ci
161a1d56debSopenharmony_ci    let item = &*(item as *mut JsonValue);
162a1d56debSopenharmony_ci
163a1d56debSopenharmony_ci    item.is_boolean() as c_int
164a1d56debSopenharmony_ci}
165a1d56debSopenharmony_ci
166a1d56debSopenharmony_ci/// Gets the boolean value of a JSON boolean object.
167a1d56debSopenharmony_ci/// Returns a boolean value on success and an error code on failure.
168a1d56debSopenharmony_ci#[no_mangle]
169a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_get_value_from_bool(
170a1d56debSopenharmony_ci    boolean: *const YlongJson,
171a1d56debSopenharmony_ci    value: *mut c_int,
172a1d56debSopenharmony_ci) -> c_int {
173a1d56debSopenharmony_ci    if boolean.is_null() {
174a1d56debSopenharmony_ci        return FAILURE;
175a1d56debSopenharmony_ci    }
176a1d56debSopenharmony_ci
177a1d56debSopenharmony_ci    let boolean = &*(boolean as *mut JsonValue);
178a1d56debSopenharmony_ci    let boolean = match boolean.try_as_boolean() {
179a1d56debSopenharmony_ci        Ok(b) => b,
180a1d56debSopenharmony_ci        Err(_) => return FAILURE,
181a1d56debSopenharmony_ci    };
182a1d56debSopenharmony_ci    // For c_int value, true maps to 1, while false maps to 0.
183a1d56debSopenharmony_ci    *value = *boolean as c_int;
184a1d56debSopenharmony_ci    SUCCESS
185a1d56debSopenharmony_ci}
186a1d56debSopenharmony_ci
187a1d56debSopenharmony_ci/// Sets the boolean value of a JSON boolean object.
188a1d56debSopenharmony_ci/// Returns a `c_int` indicating whether the operation was successful (SUCCESS) or failed (FAILURE).
189a1d56debSopenharmony_ci#[no_mangle]
190a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_set_value_to_bool(
191a1d56debSopenharmony_ci    boolean: *mut YlongJson,
192a1d56debSopenharmony_ci    value: c_int,
193a1d56debSopenharmony_ci) -> c_int {
194a1d56debSopenharmony_ci    if boolean.is_null() {
195a1d56debSopenharmony_ci        return FAILURE;
196a1d56debSopenharmony_ci    }
197a1d56debSopenharmony_ci
198a1d56debSopenharmony_ci    let boolean = &mut *(boolean as *mut JsonValue);
199a1d56debSopenharmony_ci    let boolean = match boolean.try_as_mut_boolean() {
200a1d56debSopenharmony_ci        Ok(b) => b,
201a1d56debSopenharmony_ci        Err(_) => return FAILURE,
202a1d56debSopenharmony_ci    };
203a1d56debSopenharmony_ci    // The *boolean is false if value is 0, and true if value is not 1.
204a1d56debSopenharmony_ci    *boolean = value != FALSE;
205a1d56debSopenharmony_ci    SUCCESS
206a1d56debSopenharmony_ci}
207a1d56debSopenharmony_ci
208a1d56debSopenharmony_ci/// Creates a JSON double number object.
209a1d56debSopenharmony_ci/// Returns a pointer to the newly created JSON number.
210a1d56debSopenharmony_ci#[no_mangle]
211a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_create_double_number(number: c_double) -> *mut YlongJson {
212a1d56debSopenharmony_ci    Box::into_raw(Box::from(JsonValue::Number(Number::Float(number)))) as *mut YlongJson
213a1d56debSopenharmony_ci}
214a1d56debSopenharmony_ci
215a1d56debSopenharmony_ci/// Creates a JSON integer number object.
216a1d56debSopenharmony_ci/// Returns a pointer to the newly created JSON number.
217a1d56debSopenharmony_ci#[no_mangle]
218a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_create_int_number(number: c_longlong) -> *mut YlongJson {
219a1d56debSopenharmony_ci    Box::into_raw(Box::from(JsonValue::Number(Number::Signed(number)))) as *mut YlongJson
220a1d56debSopenharmony_ci}
221a1d56debSopenharmony_ci
222a1d56debSopenharmony_ci/// Checks whether a JSON object is a number.
223a1d56debSopenharmony_ci/// Returns a `c_int` where TRUE indicates that the item is a number, and FALSE indicates otherwise.
224a1d56debSopenharmony_ci#[no_mangle]
225a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_is_number(item: *const YlongJson) -> c_int {
226a1d56debSopenharmony_ci    if item.is_null() {
227a1d56debSopenharmony_ci        return FALSE;
228a1d56debSopenharmony_ci    }
229a1d56debSopenharmony_ci
230a1d56debSopenharmony_ci    let item = &*(item as *mut JsonValue);
231a1d56debSopenharmony_ci    item.is_number() as c_int
232a1d56debSopenharmony_ci}
233a1d56debSopenharmony_ci
234a1d56debSopenharmony_ci/// Checks whether a JSON object is a double number.
235a1d56debSopenharmony_ci/// Returns a `c_int` where TRUE indicates that the number is a double, and FALSE indicates otherwise.
236a1d56debSopenharmony_ci#[no_mangle]
237a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_is_double_number(item: *const YlongJson) -> c_int {
238a1d56debSopenharmony_ci    if item.is_null() {
239a1d56debSopenharmony_ci        return FALSE;
240a1d56debSopenharmony_ci    }
241a1d56debSopenharmony_ci
242a1d56debSopenharmony_ci    let item = &*(item as *mut JsonValue);
243a1d56debSopenharmony_ci    match item.try_as_number() {
244a1d56debSopenharmony_ci        Ok(n) => matches!(n, Number::Float(_)) as c_int,
245a1d56debSopenharmony_ci        Err(_) => FALSE,
246a1d56debSopenharmony_ci    }
247a1d56debSopenharmony_ci}
248a1d56debSopenharmony_ci
249a1d56debSopenharmony_ci/// Checks whether a JSON object is an integer number.
250a1d56debSopenharmony_ci/// Returns a `c_int` where TRUE indicates that the number is an integer, and FALSE indicates otherwise.
251a1d56debSopenharmony_ci#[no_mangle]
252a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_is_int_number(item: *const YlongJson) -> c_int {
253a1d56debSopenharmony_ci    if item.is_null() {
254a1d56debSopenharmony_ci        return FALSE;
255a1d56debSopenharmony_ci    }
256a1d56debSopenharmony_ci
257a1d56debSopenharmony_ci    let item = &*(item as *mut JsonValue);
258a1d56debSopenharmony_ci    match item.try_as_number() {
259a1d56debSopenharmony_ci        Ok(n) => matches!(n, Number::Signed(_) | Number::Unsigned(_)) as c_int,
260a1d56debSopenharmony_ci        Err(_) => FALSE,
261a1d56debSopenharmony_ci    }
262a1d56debSopenharmony_ci}
263a1d56debSopenharmony_ci
264a1d56debSopenharmony_ci/// Gets the double value of a JSON number object.
265a1d56debSopenharmony_ci/// Returns a `c_int` indicating whether the operation was successful (SUCCESS) or failed (FAILURE).
266a1d56debSopenharmony_ci#[no_mangle]
267a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_get_double_value_from_number(
268a1d56debSopenharmony_ci    number: *const YlongJson,
269a1d56debSopenharmony_ci    value: *mut c_double,
270a1d56debSopenharmony_ci) -> c_int {
271a1d56debSopenharmony_ci    if number.is_null() {
272a1d56debSopenharmony_ci        return FAILURE;
273a1d56debSopenharmony_ci    }
274a1d56debSopenharmony_ci
275a1d56debSopenharmony_ci    let number = &*(number as *mut JsonValue);
276a1d56debSopenharmony_ci    let number = match number.try_as_number() {
277a1d56debSopenharmony_ci        Ok(n) => n,
278a1d56debSopenharmony_ci        Err(_) => return FAILURE,
279a1d56debSopenharmony_ci    };
280a1d56debSopenharmony_ci    // Coercing u64 or i64 to f64 may result in a loss of data accuracy.
281a1d56debSopenharmony_ci    match number {
282a1d56debSopenharmony_ci        Number::Float(f) => *value = *f as c_double,
283a1d56debSopenharmony_ci        Number::Unsigned(u) => *value = *u as c_double,
284a1d56debSopenharmony_ci        Number::Signed(i) => *value = *i as c_double,
285a1d56debSopenharmony_ci    }
286a1d56debSopenharmony_ci    SUCCESS
287a1d56debSopenharmony_ci}
288a1d56debSopenharmony_ci
289a1d56debSopenharmony_ci/// Gets the integer value of a JSON number object.
290a1d56debSopenharmony_ci/// Returns a `c_int` indicating whether the operation was successful (SUCCESS) or failed (FAILURE).
291a1d56debSopenharmony_ci#[no_mangle]
292a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_get_int_value_from_number(
293a1d56debSopenharmony_ci    number: *const YlongJson,
294a1d56debSopenharmony_ci    value: *mut c_longlong,
295a1d56debSopenharmony_ci) -> c_int {
296a1d56debSopenharmony_ci    if number.is_null() {
297a1d56debSopenharmony_ci        return FAILURE;
298a1d56debSopenharmony_ci    }
299a1d56debSopenharmony_ci
300a1d56debSopenharmony_ci    let number = &*(number as *mut JsonValue);
301a1d56debSopenharmony_ci    let number = match number.try_as_number() {
302a1d56debSopenharmony_ci        Ok(n) => n,
303a1d56debSopenharmony_ci        Err(_) => return FAILURE,
304a1d56debSopenharmony_ci    };
305a1d56debSopenharmony_ci    // Coercing u64 or i64 or f64 to i64 may result in a loss of data accuracy.
306a1d56debSopenharmony_ci    match number {
307a1d56debSopenharmony_ci        Number::Float(f) => *value = *f as c_longlong,
308a1d56debSopenharmony_ci        Number::Unsigned(u) => *value = *u as c_longlong,
309a1d56debSopenharmony_ci        Number::Signed(i) => *value = *i as c_longlong,
310a1d56debSopenharmony_ci    }
311a1d56debSopenharmony_ci    SUCCESS
312a1d56debSopenharmony_ci}
313a1d56debSopenharmony_ci
314a1d56debSopenharmony_ci/// Sets the double value of a JSON number object.
315a1d56debSopenharmony_ci/// Returns a `c_int` indicating whether the operation was successful (SUCCESS) or failed (FAILURE).
316a1d56debSopenharmony_ci#[no_mangle]
317a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_set_double_value_to_number(
318a1d56debSopenharmony_ci    number: *mut YlongJson,
319a1d56debSopenharmony_ci    value: c_double,
320a1d56debSopenharmony_ci) -> c_int {
321a1d56debSopenharmony_ci    if number.is_null() {
322a1d56debSopenharmony_ci        return FAILURE;
323a1d56debSopenharmony_ci    }
324a1d56debSopenharmony_ci
325a1d56debSopenharmony_ci    let number = &mut *(number as *mut JsonValue);
326a1d56debSopenharmony_ci    let number = match number.try_as_mut_number() {
327a1d56debSopenharmony_ci        Ok(n) => n,
328a1d56debSopenharmony_ci        Err(_) => return FAILURE,
329a1d56debSopenharmony_ci    };
330a1d56debSopenharmony_ci    *number = Number::Float(value);
331a1d56debSopenharmony_ci    SUCCESS
332a1d56debSopenharmony_ci}
333a1d56debSopenharmony_ci
334a1d56debSopenharmony_ci/// Sets the integer value of a JSON number object.
335a1d56debSopenharmony_ci/// Returns a `c_int` indicating whether the operation was successful (SUCCESS) or failed (FAILURE).
336a1d56debSopenharmony_ci#[no_mangle]
337a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_set_int_value_to_number(
338a1d56debSopenharmony_ci    number: *mut YlongJson,
339a1d56debSopenharmony_ci    value: c_longlong,
340a1d56debSopenharmony_ci) -> c_int {
341a1d56debSopenharmony_ci    if number.is_null() {
342a1d56debSopenharmony_ci        return FAILURE;
343a1d56debSopenharmony_ci    }
344a1d56debSopenharmony_ci
345a1d56debSopenharmony_ci    let number = &mut *(number as *mut JsonValue);
346a1d56debSopenharmony_ci    let number = match number.try_as_mut_number() {
347a1d56debSopenharmony_ci        Ok(n) => n,
348a1d56debSopenharmony_ci        Err(_) => return FAILURE,
349a1d56debSopenharmony_ci    };
350a1d56debSopenharmony_ci    *number = Number::Signed(value);
351a1d56debSopenharmony_ci    SUCCESS
352a1d56debSopenharmony_ci}
353a1d56debSopenharmony_ci
354a1d56debSopenharmony_ci/// Creates a `YlongJson` string from a given C-style string.
355a1d56debSopenharmony_ci/// If the input string is null, it returns a null `YlongJson`.
356a1d56debSopenharmony_ci#[no_mangle]
357a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_create_string(string: *const c_char) -> *mut YlongJson {
358a1d56debSopenharmony_ci    if string.is_null() {
359a1d56debSopenharmony_ci        return NULL_MUT_YLONG_JSON;
360a1d56debSopenharmony_ci    }
361a1d56debSopenharmony_ci
362a1d56debSopenharmony_ci    let len = strlen(string);
363a1d56debSopenharmony_ci    let slice = &*slice_from_raw_parts(string as *mut u8, len);
364a1d56debSopenharmony_ci    let string = CString::from_vec_unchecked(slice.to_vec());
365a1d56debSopenharmony_ci    Box::into_raw(Box::from(JsonValue::String(string))) as *mut YlongJson
366a1d56debSopenharmony_ci}
367a1d56debSopenharmony_ci
368a1d56debSopenharmony_ci/// Checks if the `YlongJson` item is a string.
369a1d56debSopenharmony_ci/// Returns `FALSE` if the item is null or not a string, and `TRUE` otherwise.
370a1d56debSopenharmony_ci#[no_mangle]
371a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_is_string(item: *const YlongJson) -> c_int {
372a1d56debSopenharmony_ci    if item.is_null() {
373a1d56debSopenharmony_ci        return FALSE;
374a1d56debSopenharmony_ci    }
375a1d56debSopenharmony_ci
376a1d56debSopenharmony_ci    let item = &*(item as *mut JsonValue);
377a1d56debSopenharmony_ci    item.is_string() as c_int
378a1d56debSopenharmony_ci}
379a1d56debSopenharmony_ci
380a1d56debSopenharmony_ci/// The char* returned by this function differs from the original data,
381a1d56debSopenharmony_ci/// meaning that any changes to this char* will not be reflected in the original data.
382a1d56debSopenharmony_ci#[no_mangle]
383a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_get_value_from_string(
384a1d56debSopenharmony_ci    string: *const YlongJson,
385a1d56debSopenharmony_ci    value: *mut *mut c_char,
386a1d56debSopenharmony_ci) -> c_int {
387a1d56debSopenharmony_ci    if string.is_null() {
388a1d56debSopenharmony_ci        return FAILURE;
389a1d56debSopenharmony_ci    }
390a1d56debSopenharmony_ci
391a1d56debSopenharmony_ci    let string = &*(string as *mut JsonValue);
392a1d56debSopenharmony_ci    let string = match string.try_as_string() {
393a1d56debSopenharmony_ci        Ok(s) => s,
394a1d56debSopenharmony_ci        Err(_) => return FAILURE,
395a1d56debSopenharmony_ci    };
396a1d56debSopenharmony_ci    // If `c_adapter` feature is on, the pointer of the inner char arrays can be obtained directly,
397a1d56debSopenharmony_ci    // because the string pointer actually points to a `CString`
398a1d56debSopenharmony_ci    *value = string.as_ptr() as *mut c_char;
399a1d56debSopenharmony_ci    SUCCESS
400a1d56debSopenharmony_ci}
401a1d56debSopenharmony_ci
402a1d56debSopenharmony_ci/// Sets a `YlongJson` string to a given C-style string.
403a1d56debSopenharmony_ci/// If the `YlongJson` string or the input string is null, it returns `FAILURE`.
404a1d56debSopenharmony_ci#[no_mangle]
405a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_set_value_to_string(
406a1d56debSopenharmony_ci    string: *mut YlongJson,
407a1d56debSopenharmony_ci    value: *const c_char,
408a1d56debSopenharmony_ci) -> c_int {
409a1d56debSopenharmony_ci    if string.is_null() || value.is_null() {
410a1d56debSopenharmony_ci        return FAILURE;
411a1d56debSopenharmony_ci    }
412a1d56debSopenharmony_ci
413a1d56debSopenharmony_ci    let string = &mut *(string as *mut JsonValue);
414a1d56debSopenharmony_ci    let string = match string.try_as_mut_string() {
415a1d56debSopenharmony_ci        Ok(s) => s,
416a1d56debSopenharmony_ci        Err(_) => return FAILURE,
417a1d56debSopenharmony_ci    };
418a1d56debSopenharmony_ci    let len = strlen(value);
419a1d56debSopenharmony_ci    let slice = &*slice_from_raw_parts(value as *mut u8, len);
420a1d56debSopenharmony_ci    *string = CString::from_vec_unchecked(slice.to_vec());
421a1d56debSopenharmony_ci    SUCCESS
422a1d56debSopenharmony_ci}
423a1d56debSopenharmony_ci
424a1d56debSopenharmony_ci/// Creates a `YlongJson` array.
425a1d56debSopenharmony_ci#[no_mangle]
426a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_create_array() -> *mut YlongJson {
427a1d56debSopenharmony_ci    Box::into_raw(Box::from(JsonValue::Array(Array::new()))) as *mut YlongJson
428a1d56debSopenharmony_ci}
429a1d56debSopenharmony_ci
430a1d56debSopenharmony_ci/// Checks if the `YlongJson` item is an array.
431a1d56debSopenharmony_ci/// Returns `FALSE` if the item is null or not an array, and `TRUE` otherwise.
432a1d56debSopenharmony_ci#[no_mangle]
433a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_is_array(item: *const YlongJson) -> c_int {
434a1d56debSopenharmony_ci    if item.is_null() {
435a1d56debSopenharmony_ci        return FALSE;
436a1d56debSopenharmony_ci    }
437a1d56debSopenharmony_ci
438a1d56debSopenharmony_ci    let item = &*(item as *mut JsonValue);
439a1d56debSopenharmony_ci    item.is_array() as c_int
440a1d56debSopenharmony_ci}
441a1d56debSopenharmony_ci
442a1d56debSopenharmony_ci/// Gets the size of a `YlongJson` array.
443a1d56debSopenharmony_ci/// If the `YlongJson` array or the size is null, it returns `FAILURE`.
444a1d56debSopenharmony_ci#[no_mangle]
445a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_get_array_size(
446a1d56debSopenharmony_ci    array: *const YlongJson,
447a1d56debSopenharmony_ci    size: *mut c_int,
448a1d56debSopenharmony_ci) -> c_int {
449a1d56debSopenharmony_ci    if array.is_null() || size.is_null() {
450a1d56debSopenharmony_ci        return FAILURE;
451a1d56debSopenharmony_ci    }
452a1d56debSopenharmony_ci
453a1d56debSopenharmony_ci    let array = &*(array as *mut JsonValue);
454a1d56debSopenharmony_ci    let array = match array.try_as_array() {
455a1d56debSopenharmony_ci        Ok(a) => a,
456a1d56debSopenharmony_ci        Err(_) => return FAILURE,
457a1d56debSopenharmony_ci    };
458a1d56debSopenharmony_ci
459a1d56debSopenharmony_ci    *size = array.len() as c_int;
460a1d56debSopenharmony_ci    SUCCESS
461a1d56debSopenharmony_ci}
462a1d56debSopenharmony_ci
463a1d56debSopenharmony_ci/// Gets a `YlongJson` item from an array by index.
464a1d56debSopenharmony_ci/// Returns null `YlongJson` if the array is null, the item doesn't exist, or any error occurs.
465a1d56debSopenharmony_ci#[no_mangle]
466a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_get_array_item(
467a1d56debSopenharmony_ci    array: *const YlongJson,
468a1d56debSopenharmony_ci    index: c_int,
469a1d56debSopenharmony_ci) -> *mut YlongJson {
470a1d56debSopenharmony_ci    if array.is_null() {
471a1d56debSopenharmony_ci        return NULL_MUT_YLONG_JSON;
472a1d56debSopenharmony_ci    }
473a1d56debSopenharmony_ci
474a1d56debSopenharmony_ci    let array_ref = &mut *(array as *mut JsonValue);
475a1d56debSopenharmony_ci    let array_ref = match array_ref.try_as_mut_array() {
476a1d56debSopenharmony_ci        Ok(a) => a,
477a1d56debSopenharmony_ci        Err(_) => return NULL_MUT_YLONG_JSON,
478a1d56debSopenharmony_ci    };
479a1d56debSopenharmony_ci
480a1d56debSopenharmony_ci    if index as usize >= array_ref.len() {
481a1d56debSopenharmony_ci        return NULL_MUT_YLONG_JSON;
482a1d56debSopenharmony_ci    }
483a1d56debSopenharmony_ci
484a1d56debSopenharmony_ci    array_ref.get_mut(index as usize).unwrap() as *mut JsonValue as *mut YlongJson
485a1d56debSopenharmony_ci}
486a1d56debSopenharmony_ci
487a1d56debSopenharmony_ci/// Adds a `YlongJson` item to an array.
488a1d56debSopenharmony_ci/// Returns `FAILURE` if the array or the item is null, and `SUCCESS` otherwise.
489a1d56debSopenharmony_ci#[no_mangle]
490a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_add_item_to_array(
491a1d56debSopenharmony_ci    array: *mut YlongJson,
492a1d56debSopenharmony_ci    item: *mut YlongJson,
493a1d56debSopenharmony_ci) -> c_int {
494a1d56debSopenharmony_ci    if array.is_null() || item.is_null() {
495a1d56debSopenharmony_ci        return FAILURE;
496a1d56debSopenharmony_ci    }
497a1d56debSopenharmony_ci
498a1d56debSopenharmony_ci    let array_ref = &mut *(array as *mut JsonValue);
499a1d56debSopenharmony_ci    let array_ref = match array_ref.try_as_mut_array() {
500a1d56debSopenharmony_ci        Ok(a) => a,
501a1d56debSopenharmony_ci        Err(_) => return FAILURE,
502a1d56debSopenharmony_ci    };
503a1d56debSopenharmony_ci
504a1d56debSopenharmony_ci    let value = Box::from_raw(item as *mut JsonValue);
505a1d56debSopenharmony_ci    array_ref.push(*value);
506a1d56debSopenharmony_ci
507a1d56debSopenharmony_ci    SUCCESS
508a1d56debSopenharmony_ci}
509a1d56debSopenharmony_ci
510a1d56debSopenharmony_ci/// Replaces a `YlongJson` item in an array by index with a new item.
511a1d56debSopenharmony_ci/// Returns `FAILURE` if the array or the new item is null, the index is out of bounds, or any error occurs, and `SUCCESS` otherwise.
512a1d56debSopenharmony_ci#[no_mangle]
513a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_replace_array_item_by_index(
514a1d56debSopenharmony_ci    array: *mut YlongJson,
515a1d56debSopenharmony_ci    index: c_int,
516a1d56debSopenharmony_ci    new_item: *mut YlongJson,
517a1d56debSopenharmony_ci) -> c_int {
518a1d56debSopenharmony_ci    if array.is_null() || new_item.is_null() {
519a1d56debSopenharmony_ci        return FAILURE;
520a1d56debSopenharmony_ci    }
521a1d56debSopenharmony_ci
522a1d56debSopenharmony_ci    let array_ref = &mut *(array as *mut JsonValue);
523a1d56debSopenharmony_ci    let array_ref = match array_ref.try_as_mut_array() {
524a1d56debSopenharmony_ci        Ok(o) => o,
525a1d56debSopenharmony_ci        Err(_) => return FAILURE,
526a1d56debSopenharmony_ci    };
527a1d56debSopenharmony_ci
528a1d56debSopenharmony_ci    if let Some(value) = array_ref.get_mut(index as usize) {
529a1d56debSopenharmony_ci        let new_value = Box::from_raw(new_item as *mut JsonValue);
530a1d56debSopenharmony_ci
531a1d56debSopenharmony_ci        *value = *new_value;
532a1d56debSopenharmony_ci
533a1d56debSopenharmony_ci        return SUCCESS;
534a1d56debSopenharmony_ci    }
535a1d56debSopenharmony_ci    FAILURE
536a1d56debSopenharmony_ci}
537a1d56debSopenharmony_ci
538a1d56debSopenharmony_ci/// Removes a `YlongJson` item from an array by index.
539a1d56debSopenharmony_ci/// Returns null `YlongJson` if the array is null, the item doesn't exist, or any error occurs.
540a1d56debSopenharmony_ci#[no_mangle]
541a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_remove_array_item_by_index(
542a1d56debSopenharmony_ci    array: *mut YlongJson,
543a1d56debSopenharmony_ci    index: c_int,
544a1d56debSopenharmony_ci) -> *mut YlongJson {
545a1d56debSopenharmony_ci    if array.is_null() {
546a1d56debSopenharmony_ci        return NULL_MUT_YLONG_JSON;
547a1d56debSopenharmony_ci    }
548a1d56debSopenharmony_ci
549a1d56debSopenharmony_ci    let array = &mut *(array as *mut JsonValue);
550a1d56debSopenharmony_ci    let array = match array.try_as_mut_array() {
551a1d56debSopenharmony_ci        Ok(a) => a,
552a1d56debSopenharmony_ci        Err(_) => return NULL_MUT_YLONG_JSON,
553a1d56debSopenharmony_ci    };
554a1d56debSopenharmony_ci
555a1d56debSopenharmony_ci    // Uses method 'remove' of Array, but not the method 'remove' of underlying data structure.
556a1d56debSopenharmony_ci    if let Some(v) = Array::remove(array, index as usize) {
557a1d56debSopenharmony_ci        return Box::into_raw(Box::new(v)) as *mut YlongJson;
558a1d56debSopenharmony_ci    }
559a1d56debSopenharmony_ci    NULL_MUT_YLONG_JSON
560a1d56debSopenharmony_ci}
561a1d56debSopenharmony_ci
562a1d56debSopenharmony_ci/// Deletes a `YlongJson` item from an array by index.
563a1d56debSopenharmony_ci#[no_mangle]
564a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_delete_array_item_by_index(
565a1d56debSopenharmony_ci    array: *mut YlongJson,
566a1d56debSopenharmony_ci    index: c_int,
567a1d56debSopenharmony_ci) {
568a1d56debSopenharmony_ci    if array.is_null() {
569a1d56debSopenharmony_ci        return;
570a1d56debSopenharmony_ci    }
571a1d56debSopenharmony_ci
572a1d56debSopenharmony_ci    let array = &mut *(array as *mut JsonValue);
573a1d56debSopenharmony_ci    let array = match array.try_as_mut_array() {
574a1d56debSopenharmony_ci        Ok(a) => a,
575a1d56debSopenharmony_ci        Err(_) => return,
576a1d56debSopenharmony_ci    };
577a1d56debSopenharmony_ci    array.remove(index as usize);
578a1d56debSopenharmony_ci}
579a1d56debSopenharmony_ci
580a1d56debSopenharmony_ci/// In list_array mode, it is more efficient to get a node through this method and then delete it.
581a1d56debSopenharmony_ci#[cfg(feature = "list_array")]
582a1d56debSopenharmony_ci#[no_mangle]
583a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_get_array_node(
584a1d56debSopenharmony_ci    array: *mut YlongJson,
585a1d56debSopenharmony_ci    index: c_int,
586a1d56debSopenharmony_ci) -> *mut YlongJson {
587a1d56debSopenharmony_ci    if array.is_null() {
588a1d56debSopenharmony_ci        return NULL_MUT_YLONG_JSON;
589a1d56debSopenharmony_ci    }
590a1d56debSopenharmony_ci
591a1d56debSopenharmony_ci    let array_ref = &mut *(array as *mut JsonValue);
592a1d56debSopenharmony_ci    let array_ref = match array_ref.try_as_mut_array() {
593a1d56debSopenharmony_ci        Ok(a) => a,
594a1d56debSopenharmony_ci        Err(_) => return NULL_MUT_YLONG_JSON,
595a1d56debSopenharmony_ci    };
596a1d56debSopenharmony_ci
597a1d56debSopenharmony_ci    if index as usize >= array_ref.len() {
598a1d56debSopenharmony_ci        return NULL_MUT_YLONG_JSON;
599a1d56debSopenharmony_ci    }
600a1d56debSopenharmony_ci
601a1d56debSopenharmony_ci    let node = array_ref.get_node_mut(index as usize).unwrap();
602a1d56debSopenharmony_ci    node as *mut Node<JsonValue> as *mut YlongJson
603a1d56debSopenharmony_ci}
604a1d56debSopenharmony_ci
605a1d56debSopenharmony_ci/// Retrieves a `YlongJson` item from an array node.
606a1d56debSopenharmony_ci#[cfg(feature = "list_array")]
607a1d56debSopenharmony_ci#[no_mangle]
608a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_get_item_from_array_node(
609a1d56debSopenharmony_ci    array_node: *mut YlongJson,
610a1d56debSopenharmony_ci) -> *mut YlongJson {
611a1d56debSopenharmony_ci    if array_node.is_null() {
612a1d56debSopenharmony_ci        return NULL_MUT_YLONG_JSON;
613a1d56debSopenharmony_ci    }
614a1d56debSopenharmony_ci    let node = &mut *(array_node as *mut Node<JsonValue>);
615a1d56debSopenharmony_ci    node.get_element_mut() as *mut JsonValue as *mut YlongJson
616a1d56debSopenharmony_ci}
617a1d56debSopenharmony_ci
618a1d56debSopenharmony_ci/// Adds a `YlongJson` item to an array, then returns the node.
619a1d56debSopenharmony_ci/// Returns null `YlongJson` if the array or the item is null.
620a1d56debSopenharmony_ci#[cfg(feature = "list_array")]
621a1d56debSopenharmony_ci#[no_mangle]
622a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_add_item_to_array_then_get_node(
623a1d56debSopenharmony_ci    array: *mut YlongJson,
624a1d56debSopenharmony_ci    item: *mut YlongJson,
625a1d56debSopenharmony_ci) -> *mut YlongJson {
626a1d56debSopenharmony_ci    if array.is_null() || item.is_null() {
627a1d56debSopenharmony_ci        return NULL_MUT_YLONG_JSON;
628a1d56debSopenharmony_ci    }
629a1d56debSopenharmony_ci
630a1d56debSopenharmony_ci    let array_ref = &mut *(array as *mut JsonValue);
631a1d56debSopenharmony_ci    let array_ref = match array_ref.try_as_mut_array() {
632a1d56debSopenharmony_ci        Ok(a) => a,
633a1d56debSopenharmony_ci        Err(_) => return NULL_MUT_YLONG_JSON,
634a1d56debSopenharmony_ci    };
635a1d56debSopenharmony_ci
636a1d56debSopenharmony_ci    let value = Box::from_raw(item as *mut JsonValue);
637a1d56debSopenharmony_ci    array_ref.push(*value);
638a1d56debSopenharmony_ci
639a1d56debSopenharmony_ci    array_ref.last_node_mut().unwrap() as *mut Node<JsonValue> as *mut YlongJson
640a1d56debSopenharmony_ci}
641a1d56debSopenharmony_ci
642a1d56debSopenharmony_ci/// Replaces an item of an array node with a new item.
643a1d56debSopenharmony_ci/// Returns `FAILURE` if the array node or the new item is null, and `SUCCESS` otherwise.
644a1d56debSopenharmony_ci#[cfg(feature = "list_array")]
645a1d56debSopenharmony_ci#[no_mangle]
646a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_replace_item_of_array_node(
647a1d56debSopenharmony_ci    array_node: *mut YlongJson,
648a1d56debSopenharmony_ci    new_item: *mut YlongJson,
649a1d56debSopenharmony_ci) -> c_int {
650a1d56debSopenharmony_ci    if array_node.is_null() || new_item.is_null() {
651a1d56debSopenharmony_ci        return FAILURE;
652a1d56debSopenharmony_ci    }
653a1d56debSopenharmony_ci
654a1d56debSopenharmony_ci    let node = &mut *(array_node as *mut Node<JsonValue>);
655a1d56debSopenharmony_ci    let value = node.get_element_mut();
656a1d56debSopenharmony_ci
657a1d56debSopenharmony_ci    let new_value = Box::from_raw(new_item as *mut JsonValue);
658a1d56debSopenharmony_ci    *value = *new_value;
659a1d56debSopenharmony_ci    SUCCESS
660a1d56debSopenharmony_ci}
661a1d56debSopenharmony_ci
662a1d56debSopenharmony_ci/// Removes an array node.
663a1d56debSopenharmony_ci#[cfg(feature = "list_array")]
664a1d56debSopenharmony_ci#[no_mangle]
665a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_remove_array_node(
666a1d56debSopenharmony_ci    array_node: *mut YlongJson,
667a1d56debSopenharmony_ci) -> *mut YlongJson {
668a1d56debSopenharmony_ci    if array_node.is_null() {
669a1d56debSopenharmony_ci        return NULL_MUT_YLONG_JSON;
670a1d56debSopenharmony_ci    }
671a1d56debSopenharmony_ci
672a1d56debSopenharmony_ci    let node = &mut *(array_node as *mut Node<JsonValue>);
673a1d56debSopenharmony_ci    Box::into_raw(Box::new(node.remove_self().unwrap())) as *mut YlongJson
674a1d56debSopenharmony_ci}
675a1d56debSopenharmony_ci
676a1d56debSopenharmony_ci/// Deletes an array node.
677a1d56debSopenharmony_ci#[cfg(feature = "list_array")]
678a1d56debSopenharmony_ci#[no_mangle]
679a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_delete_array_node(array_node: *mut YlongJson) {
680a1d56debSopenharmony_ci    if array_node.is_null() {
681a1d56debSopenharmony_ci        return;
682a1d56debSopenharmony_ci    }
683a1d56debSopenharmony_ci
684a1d56debSopenharmony_ci    let node = &mut *(array_node as *mut Node<JsonValue>);
685a1d56debSopenharmony_ci    let _ = node.remove_self();
686a1d56debSopenharmony_ci}
687a1d56debSopenharmony_ci
688a1d56debSopenharmony_ci/// Creates a `YlongJson` object.
689a1d56debSopenharmony_ci#[no_mangle]
690a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_create_object() -> *mut YlongJson {
691a1d56debSopenharmony_ci    Box::into_raw(Box::from(JsonValue::Object(Object::new()))) as *mut YlongJson
692a1d56debSopenharmony_ci}
693a1d56debSopenharmony_ci
694a1d56debSopenharmony_ci/// Checks if the `YlongJson` item is an object.
695a1d56debSopenharmony_ci/// Returns `FALSE` if the item is null or not an object, and `TRUE` otherwise.
696a1d56debSopenharmony_ci#[no_mangle]
697a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_is_object(item: *const YlongJson) -> c_int {
698a1d56debSopenharmony_ci    if item.is_null() {
699a1d56debSopenharmony_ci        return FALSE;
700a1d56debSopenharmony_ci    }
701a1d56debSopenharmony_ci
702a1d56debSopenharmony_ci    let item = &*(item as *mut JsonValue);
703a1d56debSopenharmony_ci    item.is_object() as c_int
704a1d56debSopenharmony_ci}
705a1d56debSopenharmony_ci
706a1d56debSopenharmony_ci/// Gets the size of a `YlongJson` object.
707a1d56debSopenharmony_ci/// If the `YlongJson` object or the size is null, it returns `FAILURE`.
708a1d56debSopenharmony_ci#[no_mangle]
709a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_get_object_size(
710a1d56debSopenharmony_ci    object: *mut YlongJson,
711a1d56debSopenharmony_ci    size: *mut c_int,
712a1d56debSopenharmony_ci) -> c_int {
713a1d56debSopenharmony_ci    if object.is_null() || size.is_null() {
714a1d56debSopenharmony_ci        return FAILURE;
715a1d56debSopenharmony_ci    }
716a1d56debSopenharmony_ci
717a1d56debSopenharmony_ci    let object = &mut *(object as *mut JsonValue);
718a1d56debSopenharmony_ci    let object = match object.try_as_mut_object() {
719a1d56debSopenharmony_ci        Ok(o) => o,
720a1d56debSopenharmony_ci        Err(_) => return FAILURE,
721a1d56debSopenharmony_ci    };
722a1d56debSopenharmony_ci
723a1d56debSopenharmony_ci    *size = object.len() as c_int;
724a1d56debSopenharmony_ci    SUCCESS
725a1d56debSopenharmony_ci}
726a1d56debSopenharmony_ci
727a1d56debSopenharmony_ci/// Checks if a JSON object has a specific item.
728a1d56debSopenharmony_ci/// Returns a `c_int` indicating whether the item exists (TRUE) or not (FALSE).
729a1d56debSopenharmony_ci#[no_mangle]
730a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_has_object_item(
731a1d56debSopenharmony_ci    object: *mut YlongJson,
732a1d56debSopenharmony_ci    string: *const c_char,
733a1d56debSopenharmony_ci) -> c_int {
734a1d56debSopenharmony_ci    if object.is_null() || string.is_null() {
735a1d56debSopenharmony_ci        return FALSE;
736a1d56debSopenharmony_ci    }
737a1d56debSopenharmony_ci
738a1d56debSopenharmony_ci    let object = &*(object as *mut JsonValue);
739a1d56debSopenharmony_ci    let object = match object.try_as_object() {
740a1d56debSopenharmony_ci        Ok(o) => o,
741a1d56debSopenharmony_ci        Err(_) => return FALSE,
742a1d56debSopenharmony_ci    };
743a1d56debSopenharmony_ci
744a1d56debSopenharmony_ci    // Using `ptr::slice_from_raw_parts` here dramatically
745a1d56debSopenharmony_ci    // reduces the cost of converting between char* and &[u8].
746a1d56debSopenharmony_ci    // Then use `from_utf8_unchecked` to further reduce cost.
747a1d56debSopenharmony_ci    let len = strlen(string);
748a1d56debSopenharmony_ci    let slice = &*slice_from_raw_parts(string as *mut u8, len);
749a1d56debSopenharmony_ci    let str = from_utf8_unchecked(slice);
750a1d56debSopenharmony_ci
751a1d56debSopenharmony_ci    object.contains_key(str) as c_int
752a1d56debSopenharmony_ci}
753a1d56debSopenharmony_ci
754a1d56debSopenharmony_ci/// Retrieves an item from a JSON object by key.
755a1d56debSopenharmony_ci/// Returns a mutable pointer to the retrieved JSON item.
756a1d56debSopenharmony_ci#[no_mangle]
757a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_get_object_item(
758a1d56debSopenharmony_ci    object: *const YlongJson,
759a1d56debSopenharmony_ci    string: *const c_char,
760a1d56debSopenharmony_ci) -> *mut YlongJson {
761a1d56debSopenharmony_ci    // If object is empty, the search fails.
762a1d56debSopenharmony_ci    if object.is_null() || string.is_null() {
763a1d56debSopenharmony_ci        return NULL_MUT_YLONG_JSON;
764a1d56debSopenharmony_ci    }
765a1d56debSopenharmony_ci
766a1d56debSopenharmony_ci    let object_ref = &mut *(object as *mut JsonValue);
767a1d56debSopenharmony_ci
768a1d56debSopenharmony_ci    // If the type is not object, return err.
769a1d56debSopenharmony_ci    let object_ref = match object_ref.try_as_mut_object() {
770a1d56debSopenharmony_ci        Ok(o) => o,
771a1d56debSopenharmony_ci        Err(_) => return NULL_MUT_YLONG_JSON,
772a1d56debSopenharmony_ci    };
773a1d56debSopenharmony_ci
774a1d56debSopenharmony_ci    // Using `ptr::slice_from_raw_parts` here dramatically
775a1d56debSopenharmony_ci    // reduces the cost of converting between char* and &[u8].
776a1d56debSopenharmony_ci    // Then use `from_utf8_unchecked` to further reduce cost.
777a1d56debSopenharmony_ci    let len = strlen(string);
778a1d56debSopenharmony_ci    let slice = &*slice_from_raw_parts(string as *mut u8, len);
779a1d56debSopenharmony_ci    let index = from_utf8_unchecked(slice);
780a1d56debSopenharmony_ci
781a1d56debSopenharmony_ci    let target = match object_ref.get_mut(index) {
782a1d56debSopenharmony_ci        Some(v) => v,
783a1d56debSopenharmony_ci        None => return NULL_MUT_YLONG_JSON,
784a1d56debSopenharmony_ci    };
785a1d56debSopenharmony_ci    target as *mut JsonValue as *mut YlongJson
786a1d56debSopenharmony_ci}
787a1d56debSopenharmony_ci
788a1d56debSopenharmony_ci/// Adds an item to a JSON object.
789a1d56debSopenharmony_ci/// Returns a `c_int` indicating whether the operation was successful (SUCCESS) or failed (FAILURE).
790a1d56debSopenharmony_ci#[no_mangle]
791a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_add_item_to_object(
792a1d56debSopenharmony_ci    object: *mut YlongJson,
793a1d56debSopenharmony_ci    string: *const c_char,
794a1d56debSopenharmony_ci    item: *mut YlongJson,
795a1d56debSopenharmony_ci) -> c_int {
796a1d56debSopenharmony_ci    // If object or string or item is empty, returns FAILED.
797a1d56debSopenharmony_ci    if object.is_null() || string.is_null() || item.is_null() {
798a1d56debSopenharmony_ci        return FAILURE;
799a1d56debSopenharmony_ci    }
800a1d56debSopenharmony_ci
801a1d56debSopenharmony_ci    let object_ref = &mut *(object as *mut JsonValue);
802a1d56debSopenharmony_ci    let object_ref = match object_ref.try_as_mut_object() {
803a1d56debSopenharmony_ci        Ok(o) => o,
804a1d56debSopenharmony_ci        Err(_) => return FAILURE,
805a1d56debSopenharmony_ci    };
806a1d56debSopenharmony_ci
807a1d56debSopenharmony_ci    // Using `ptr::slice_from_raw_parts` here dramatically
808a1d56debSopenharmony_ci    // reduces the cost of converting between char* and &[u8].
809a1d56debSopenharmony_ci    // Then use `from_utf8_unchecked` to further reduce cost.
810a1d56debSopenharmony_ci    let len = strlen(string);
811a1d56debSopenharmony_ci    let slice = &*slice_from_raw_parts(string as *mut u8, len);
812a1d56debSopenharmony_ci    let index = from_utf8_unchecked(slice);
813a1d56debSopenharmony_ci
814a1d56debSopenharmony_ci    let value = Box::from_raw(item as *mut JsonValue);
815a1d56debSopenharmony_ci
816a1d56debSopenharmony_ci    object_ref.insert(String::from(index), *value);
817a1d56debSopenharmony_ci
818a1d56debSopenharmony_ci    SUCCESS
819a1d56debSopenharmony_ci}
820a1d56debSopenharmony_ci
821a1d56debSopenharmony_ci/// Replaces an item in a JSON object by key.
822a1d56debSopenharmony_ci/// Returns a `c_int` indicating whether the operation was successful (SUCCESS) or failed (FAILURE).
823a1d56debSopenharmony_ci#[no_mangle]
824a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_replace_object_item_by_index(
825a1d56debSopenharmony_ci    object: *mut YlongJson,
826a1d56debSopenharmony_ci    index: *const c_char,
827a1d56debSopenharmony_ci    new_item: *mut YlongJson,
828a1d56debSopenharmony_ci) -> c_int {
829a1d56debSopenharmony_ci    if object.is_null() || index.is_null() || new_item.is_null() {
830a1d56debSopenharmony_ci        return FAILURE;
831a1d56debSopenharmony_ci    }
832a1d56debSopenharmony_ci
833a1d56debSopenharmony_ci    let object_ref = &mut *(object as *mut JsonValue);
834a1d56debSopenharmony_ci    let object_ref = match object_ref.try_as_mut_object() {
835a1d56debSopenharmony_ci        Ok(o) => o,
836a1d56debSopenharmony_ci        Err(_) => return FAILURE,
837a1d56debSopenharmony_ci    };
838a1d56debSopenharmony_ci
839a1d56debSopenharmony_ci    // Using `ptr::slice_from_raw_parts` here dramatically
840a1d56debSopenharmony_ci    // reduces the cost of converting between char* and &[u8].
841a1d56debSopenharmony_ci    // Then use `from_utf8_unchecked` to further reduce cost.
842a1d56debSopenharmony_ci    let len = strlen(index);
843a1d56debSopenharmony_ci    let slice = &*slice_from_raw_parts(index as *mut u8, len);
844a1d56debSopenharmony_ci    let index = from_utf8_unchecked(slice);
845a1d56debSopenharmony_ci
846a1d56debSopenharmony_ci    if let Some(value) = object_ref.get_mut(index) {
847a1d56debSopenharmony_ci        let new_value = Box::from_raw(new_item as *mut JsonValue);
848a1d56debSopenharmony_ci
849a1d56debSopenharmony_ci        *value = *new_value;
850a1d56debSopenharmony_ci
851a1d56debSopenharmony_ci        return SUCCESS;
852a1d56debSopenharmony_ci    }
853a1d56debSopenharmony_ci
854a1d56debSopenharmony_ci    FAILURE
855a1d56debSopenharmony_ci}
856a1d56debSopenharmony_ci
857a1d56debSopenharmony_ci/// Removes an item in a JSON object by index.
858a1d56debSopenharmony_ci/// Returns a new JSON object without the item if successful, NULL_MUT_YLONG_JSON otherwise.
859a1d56debSopenharmony_ci#[no_mangle]
860a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_remove_object_item_by_index(
861a1d56debSopenharmony_ci    object: *mut YlongJson,
862a1d56debSopenharmony_ci    index: *const c_char,
863a1d56debSopenharmony_ci) -> *mut YlongJson {
864a1d56debSopenharmony_ci    if object.is_null() || index.is_null() {
865a1d56debSopenharmony_ci        return NULL_MUT_YLONG_JSON;
866a1d56debSopenharmony_ci    }
867a1d56debSopenharmony_ci
868a1d56debSopenharmony_ci    let object = &mut *(object as *mut JsonValue);
869a1d56debSopenharmony_ci
870a1d56debSopenharmony_ci    // Using `ptr::slice_from_raw_parts` here dramatically
871a1d56debSopenharmony_ci    // reduces the cost of converting between char* and &[u8].
872a1d56debSopenharmony_ci    // Then use `from_utf8_unchecked` to further reduce cost.
873a1d56debSopenharmony_ci    let len = strlen(index);
874a1d56debSopenharmony_ci    let slice = &*slice_from_raw_parts(index as *mut u8, len);
875a1d56debSopenharmony_ci    let index = from_utf8_unchecked(slice);
876a1d56debSopenharmony_ci
877a1d56debSopenharmony_ci    if let Some(v) = object.remove(index) {
878a1d56debSopenharmony_ci        return Box::into_raw(Box::new(v)) as *mut YlongJson;
879a1d56debSopenharmony_ci    }
880a1d56debSopenharmony_ci    NULL_MUT_YLONG_JSON
881a1d56debSopenharmony_ci}
882a1d56debSopenharmony_ci
883a1d56debSopenharmony_ci/// Deletes an item in a JSON object by index.
884a1d56debSopenharmony_ci/// Does not return a value.
885a1d56debSopenharmony_ci#[no_mangle]
886a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_delete_object_item_by_index(
887a1d56debSopenharmony_ci    object: *mut YlongJson,
888a1d56debSopenharmony_ci    index: *const c_char,
889a1d56debSopenharmony_ci) {
890a1d56debSopenharmony_ci    if object.is_null() || index.is_null() {
891a1d56debSopenharmony_ci        return;
892a1d56debSopenharmony_ci    }
893a1d56debSopenharmony_ci
894a1d56debSopenharmony_ci    let object = &mut *(object as *mut JsonValue);
895a1d56debSopenharmony_ci
896a1d56debSopenharmony_ci    // Using ptr::slice_from_raw_parts here dramatically
897a1d56debSopenharmony_ci    // reduces the cost of converting between char* and &[u8].
898a1d56debSopenharmony_ci    // Then use from_utf8_unchecked to further reduce cost.
899a1d56debSopenharmony_ci    let len = strlen(index);
900a1d56debSopenharmony_ci    let slice = &*slice_from_raw_parts(index as *mut u8, len);
901a1d56debSopenharmony_ci    let index = from_utf8_unchecked(slice);
902a1d56debSopenharmony_ci
903a1d56debSopenharmony_ci    object.remove(index);
904a1d56debSopenharmony_ci}
905a1d56debSopenharmony_ci
906a1d56debSopenharmony_ci/// Gets all items from a JSON object.
907a1d56debSopenharmony_ci/// Returns SUCCESS if the operation is successful, FAILURE otherwise.
908a1d56debSopenharmony_ci#[no_mangle]
909a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_get_all_object_items(
910a1d56debSopenharmony_ci    object: *mut YlongJson,
911a1d56debSopenharmony_ci    key: *mut *mut c_char,
912a1d56debSopenharmony_ci    value: *mut *mut YlongJson,
913a1d56debSopenharmony_ci    len: *mut c_int,
914a1d56debSopenharmony_ci) -> c_int {
915a1d56debSopenharmony_ci    if object.is_null() || key.is_null() || value.is_null() || len.is_null() {
916a1d56debSopenharmony_ci        return FAILURE;
917a1d56debSopenharmony_ci    }
918a1d56debSopenharmony_ci
919a1d56debSopenharmony_ci    let object = &mut *(object as *mut JsonValue);
920a1d56debSopenharmony_ci    let object = match object.try_as_mut_object() {
921a1d56debSopenharmony_ci        Ok(o) => o,
922a1d56debSopenharmony_ci        Err(_) => return FAILURE,
923a1d56debSopenharmony_ci    };
924a1d56debSopenharmony_ci
925a1d56debSopenharmony_ci    for (n, (k, v)) in object.iter_mut().enumerate() {
926a1d56debSopenharmony_ci        // k.clone ().into_bytes() is more efficient than k.as_bytes ().to_vec().
927a1d56debSopenharmony_ci        let k = CString::from_vec_unchecked(k.clone().into_bytes()).into_raw();
928a1d56debSopenharmony_ci        let v = v as *mut JsonValue as *mut YlongJson;
929a1d56debSopenharmony_ci        *(key.add(n)) = k;
930a1d56debSopenharmony_ci        *(value.add(n)) = v;
931a1d56debSopenharmony_ci    }
932a1d56debSopenharmony_ci    *len = object.len() as c_int;
933a1d56debSopenharmony_ci    SUCCESS
934a1d56debSopenharmony_ci}
935a1d56debSopenharmony_ci
936a1d56debSopenharmony_ci/// Applies a function to each item in a JSON object.
937a1d56debSopenharmony_ci/// Returns SUCCESS if the operation is successful, FAILURE otherwise.
938a1d56debSopenharmony_ci#[no_mangle]
939a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_for_each_object_item(
940a1d56debSopenharmony_ci    object: *mut YlongJson,
941a1d56debSopenharmony_ci    func: unsafe extern "C" fn(*mut YlongJson),
942a1d56debSopenharmony_ci) -> c_int {
943a1d56debSopenharmony_ci    if object.is_null() {
944a1d56debSopenharmony_ci        return FAILURE;
945a1d56debSopenharmony_ci    }
946a1d56debSopenharmony_ci
947a1d56debSopenharmony_ci    let object = &mut *(object as *mut JsonValue);
948a1d56debSopenharmony_ci    let object = match object.try_as_mut_object() {
949a1d56debSopenharmony_ci        Ok(o) => o,
950a1d56debSopenharmony_ci        Err(_) => return FAILURE,
951a1d56debSopenharmony_ci    };
952a1d56debSopenharmony_ci
953a1d56debSopenharmony_ci    object.iter_mut().for_each(|(_k, v)| {
954a1d56debSopenharmony_ci        let value = v as *mut JsonValue as *mut YlongJson;
955a1d56debSopenharmony_ci        func(value);
956a1d56debSopenharmony_ci    });
957a1d56debSopenharmony_ci    SUCCESS
958a1d56debSopenharmony_ci}
959a1d56debSopenharmony_ci
960a1d56debSopenharmony_ci/// Gets an object node from a JSON object by key.
961a1d56debSopenharmony_ci/// Returns a pointer to the object node if successful, NULL_MUT_YLONG_JSON otherwise.
962a1d56debSopenharmony_ci#[cfg(feature = "list_object")]
963a1d56debSopenharmony_ci#[no_mangle]
964a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_get_object_node(
965a1d56debSopenharmony_ci    object: *const YlongJson,
966a1d56debSopenharmony_ci    string: *const c_char,
967a1d56debSopenharmony_ci) -> *mut YlongJson {
968a1d56debSopenharmony_ci    // If object is empty, the search fails.
969a1d56debSopenharmony_ci    if object.is_null() || string.is_null() {
970a1d56debSopenharmony_ci        return NULL_MUT_YLONG_JSON;
971a1d56debSopenharmony_ci    }
972a1d56debSopenharmony_ci
973a1d56debSopenharmony_ci    let object_ref = &mut *(object as *mut JsonValue);
974a1d56debSopenharmony_ci
975a1d56debSopenharmony_ci    // If the type is not object, returns err.
976a1d56debSopenharmony_ci    let object_ref = match object_ref.try_as_mut_object() {
977a1d56debSopenharmony_ci        Ok(o) => o,
978a1d56debSopenharmony_ci        Err(_) => return NULL_MUT_YLONG_JSON,
979a1d56debSopenharmony_ci    };
980a1d56debSopenharmony_ci
981a1d56debSopenharmony_ci    // Using `ptr::slice_from_raw_parts` here dramatically
982a1d56debSopenharmony_ci    // reduces the cost of converting between char* and &[u8].
983a1d56debSopenharmony_ci    // Then use `from_utf8_unchecked` to further reduce cost.
984a1d56debSopenharmony_ci    let len = strlen(string);
985a1d56debSopenharmony_ci    let slice = &*slice_from_raw_parts(string as *mut u8, len);
986a1d56debSopenharmony_ci    let index = from_utf8_unchecked(slice);
987a1d56debSopenharmony_ci
988a1d56debSopenharmony_ci    // When using list to get a node, the return value points to the memory is CursorMut<JsonValue>.
989a1d56debSopenharmony_ci    let target = match object_ref.get_node_mut(index) {
990a1d56debSopenharmony_ci        Some(v) => v,
991a1d56debSopenharmony_ci        None => return NULL_MUT_YLONG_JSON,
992a1d56debSopenharmony_ci    };
993a1d56debSopenharmony_ci    target as *mut Node<(String, JsonValue)> as *mut YlongJson
994a1d56debSopenharmony_ci}
995a1d56debSopenharmony_ci
996a1d56debSopenharmony_ci/// Gets an item from an object node.
997a1d56debSopenharmony_ci/// Returns a pointer to the item if successful, NULL_MUT_YLONG_JSON otherwise.
998a1d56debSopenharmony_ci#[cfg(feature = "list_object")]
999a1d56debSopenharmony_ci#[no_mangle]
1000a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_get_item_from_object_node(
1001a1d56debSopenharmony_ci    object_node: *mut YlongJson,
1002a1d56debSopenharmony_ci) -> *mut YlongJson {
1003a1d56debSopenharmony_ci    if object_node.is_null() {
1004a1d56debSopenharmony_ci        return NULL_MUT_YLONG_JSON;
1005a1d56debSopenharmony_ci    }
1006a1d56debSopenharmony_ci
1007a1d56debSopenharmony_ci    let node = &mut *(object_node as *mut Node<(String, JsonValue)>);
1008a1d56debSopenharmony_ci    (&mut node.get_element_mut().1) as *mut JsonValue as *mut YlongJson
1009a1d56debSopenharmony_ci}
1010a1d56debSopenharmony_ci
1011a1d56debSopenharmony_ci/// Adds an item to a JSON object, then returns a pointer to the object node.
1012a1d56debSopenharmony_ci/// Returns a pointer to the object node if successful, NULL_MUT_YLONG_JSON otherwise.
1013a1d56debSopenharmony_ci#[cfg(feature = "list_object")]
1014a1d56debSopenharmony_ci#[no_mangle]
1015a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_add_item_to_object_then_get_node(
1016a1d56debSopenharmony_ci    object: *mut YlongJson,
1017a1d56debSopenharmony_ci    string: *const c_char,
1018a1d56debSopenharmony_ci    item: *mut YlongJson,
1019a1d56debSopenharmony_ci) -> *mut YlongJson {
1020a1d56debSopenharmony_ci    // If object or item is empty, returns NULL_MUT_YLONG_JSON.
1021a1d56debSopenharmony_ci    if object.is_null() || string.is_null() || item.is_null() {
1022a1d56debSopenharmony_ci        return NULL_MUT_YLONG_JSON;
1023a1d56debSopenharmony_ci    }
1024a1d56debSopenharmony_ci
1025a1d56debSopenharmony_ci    let object_ref = &mut *(object as *mut JsonValue);
1026a1d56debSopenharmony_ci    let object_ref = match object_ref.try_as_mut_object() {
1027a1d56debSopenharmony_ci        Ok(v) => v,
1028a1d56debSopenharmony_ci        Err(_) => return NULL_MUT_YLONG_JSON,
1029a1d56debSopenharmony_ci    };
1030a1d56debSopenharmony_ci
1031a1d56debSopenharmony_ci    // Using `ptr::slice_from_raw_parts` here dramatically
1032a1d56debSopenharmony_ci    // reduces the cost of converting between char* and &[u8].
1033a1d56debSopenharmony_ci    // Then use `from_utf8_unchecked` to further reduce cost.
1034a1d56debSopenharmony_ci    let len = strlen(string);
1035a1d56debSopenharmony_ci    let slice = &*slice_from_raw_parts(string as *mut u8, len);
1036a1d56debSopenharmony_ci    let string = from_utf8_unchecked(slice);
1037a1d56debSopenharmony_ci
1038a1d56debSopenharmony_ci    let value = Box::from_raw(item as *mut JsonValue);
1039a1d56debSopenharmony_ci    object_ref.insert(String::from(string), *value);
1040a1d56debSopenharmony_ci
1041a1d56debSopenharmony_ci    let target = object_ref.last_node_mut().unwrap();
1042a1d56debSopenharmony_ci    target as *mut Node<(String, JsonValue)> as *mut YlongJson
1043a1d56debSopenharmony_ci}
1044a1d56debSopenharmony_ci
1045a1d56debSopenharmony_ci/// Replaces an item in an object node.
1046a1d56debSopenharmony_ci/// Returns SUCCESS if the operation is successful, FAILURE otherwise.
1047a1d56debSopenharmony_ci#[cfg(feature = "list_object")]
1048a1d56debSopenharmony_ci#[no_mangle]
1049a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_replace_item_of_object_node(
1050a1d56debSopenharmony_ci    object_node: *mut YlongJson,
1051a1d56debSopenharmony_ci    new_item: *mut YlongJson,
1052a1d56debSopenharmony_ci) -> c_int {
1053a1d56debSopenharmony_ci    if object_node.is_null() || new_item.is_null() {
1054a1d56debSopenharmony_ci        return FAILURE;
1055a1d56debSopenharmony_ci    }
1056a1d56debSopenharmony_ci
1057a1d56debSopenharmony_ci    let node = &mut *(object_node as *mut Node<(String, JsonValue)>);
1058a1d56debSopenharmony_ci    let (_, value) = node.get_element_mut();
1059a1d56debSopenharmony_ci    let new_value = Box::from_raw(new_item as *mut JsonValue);
1060a1d56debSopenharmony_ci    *value = *new_value;
1061a1d56debSopenharmony_ci
1062a1d56debSopenharmony_ci    SUCCESS
1063a1d56debSopenharmony_ci}
1064a1d56debSopenharmony_ci
1065a1d56debSopenharmony_ci/// Removes an object node.
1066a1d56debSopenharmony_ci/// Returns a pointer to the removed item if successful, NULL_MUT_YLONG_JSON otherwise.
1067a1d56debSopenharmony_ci#[cfg(feature = "list_object")]
1068a1d56debSopenharmony_ci#[no_mangle]
1069a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_remove_object_node(
1070a1d56debSopenharmony_ci    object_node: *mut YlongJson,
1071a1d56debSopenharmony_ci) -> *mut YlongJson {
1072a1d56debSopenharmony_ci    if object_node.is_null() {
1073a1d56debSopenharmony_ci        return NULL_MUT_YLONG_JSON;
1074a1d56debSopenharmony_ci    }
1075a1d56debSopenharmony_ci
1076a1d56debSopenharmony_ci    let node = &mut *(object_node as *mut Node<(String, JsonValue)>);
1077a1d56debSopenharmony_ci    Box::into_raw(Box::new(node.remove_self().unwrap().1)) as *mut YlongJson
1078a1d56debSopenharmony_ci}
1079a1d56debSopenharmony_ci
1080a1d56debSopenharmony_ci/// Deletes a node from a JSON object.
1081a1d56debSopenharmony_ci#[cfg(feature = "list_object")]
1082a1d56debSopenharmony_ci#[no_mangle]
1083a1d56debSopenharmony_cipub unsafe extern "C" fn ylong_json_delete_object_node(object_node: *mut YlongJson) {
1084a1d56debSopenharmony_ci    if object_node.is_null() {
1085a1d56debSopenharmony_ci        return;
1086a1d56debSopenharmony_ci    }
1087a1d56debSopenharmony_ci
1088a1d56debSopenharmony_ci    let node = &mut *(object_node as *mut Node<(String, JsonValue)>);
1089a1d56debSopenharmony_ci    let _ = node.remove_self();
1090a1d56debSopenharmony_ci}
1091a1d56debSopenharmony_ci
1092a1d56debSopenharmony_ci#[cfg(test)]
1093a1d56debSopenharmony_cimod ut_adapter {
1094a1d56debSopenharmony_ci    use crate::*;
1095a1d56debSopenharmony_ci    use libc::*;
1096a1d56debSopenharmony_ci    use std::ffi::{CStr, CString};
1097a1d56debSopenharmony_ci    use std::mem::size_of;
1098a1d56debSopenharmony_ci    use std::ptr::{null, null_mut};
1099a1d56debSopenharmony_ci
1100a1d56debSopenharmony_ci    const JSON_TEXT: &str = r#"
1101a1d56debSopenharmony_ci{
1102a1d56debSopenharmony_ci    "null": null,
1103a1d56debSopenharmony_ci    "true": true,
1104a1d56debSopenharmony_ci    "false": false,
1105a1d56debSopenharmony_ci    "number": 3.14,
1106a1d56debSopenharmony_ci    "string": "Hello World!",
1107a1d56debSopenharmony_ci    "array": [1, 2, 3],
1108a1d56debSopenharmony_ci    "object": {
1109a1d56debSopenharmony_ci        "key1": 1,
1110a1d56debSopenharmony_ci        "key2": 2,
1111a1d56debSopenharmony_ci        "key3": 3
1112a1d56debSopenharmony_ci    }
1113a1d56debSopenharmony_ci}
1114a1d56debSopenharmony_ci"#;
1115a1d56debSopenharmony_ci
1116a1d56debSopenharmony_ci    unsafe fn str_to_c_char(str: &str) -> *mut c_char {
1117a1d56debSopenharmony_ci        CString::from_vec_unchecked(str.as_bytes().to_vec()).into_raw()
1118a1d56debSopenharmony_ci    }
1119a1d56debSopenharmony_ci
1120a1d56debSopenharmony_ci    /// UT test for `ylong_json_parse`.
1121a1d56debSopenharmony_ci    ///
1122a1d56debSopenharmony_ci    /// # Title
1123a1d56debSopenharmony_ci    /// ut_ylong_json_parse
1124a1d56debSopenharmony_ci    ///
1125a1d56debSopenharmony_ci    /// # Brief
1126a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_parse` to generate a JsonValue as YlongJson*.
1127a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
1128a1d56debSopenharmony_ci    #[test]
1129a1d56debSopenharmony_ci    fn ut_ylong_json_parse() {
1130a1d56debSopenharmony_ci        unsafe {
1131a1d56debSopenharmony_ci            // Passes in the correct syntax text string.
1132a1d56debSopenharmony_ci            let str = str_to_c_char(JSON_TEXT);
1133a1d56debSopenharmony_ci            let err = null_mut::<c_char>();
1134a1d56debSopenharmony_ci            let json = ylong_json_parse(str, &err as *const *mut c_char as *mut *mut c_char);
1135a1d56debSopenharmony_ci            // No error message.
1136a1d56debSopenharmony_ci            assert!(err.is_null());
1137a1d56debSopenharmony_ci            // The data structure is correct.
1138a1d56debSopenharmony_ci            assert!(!json.is_null());
1139a1d56debSopenharmony_ci
1140a1d56debSopenharmony_ci            // Destruction
1141a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
1142a1d56debSopenharmony_ci            ylong_json_delete(json);
1143a1d56debSopenharmony_ci
1144a1d56debSopenharmony_ci            // Passes in the incorrect syntax text string.
1145a1d56debSopenharmony_ci            let str = str_to_c_char("{");
1146a1d56debSopenharmony_ci            let err = null_mut::<c_char>();
1147a1d56debSopenharmony_ci            let json = ylong_json_parse(str, &err as *const *mut c_char as *mut *mut c_char);
1148a1d56debSopenharmony_ci            // Here is an error message.
1149a1d56debSopenharmony_ci            assert!(!err.is_null());
1150a1d56debSopenharmony_ci            // No correct syntax structure.
1151a1d56debSopenharmony_ci            assert!(json.is_null());
1152a1d56debSopenharmony_ci
1153a1d56debSopenharmony_ci            // Destruction
1154a1d56debSopenharmony_ci            ylong_json_free_string(err);
1155a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
1156a1d56debSopenharmony_ci            ylong_json_delete(json);
1157a1d56debSopenharmony_ci        }
1158a1d56debSopenharmony_ci    }
1159a1d56debSopenharmony_ci
1160a1d56debSopenharmony_ci    //noinspection SpellCheckingInspection
1161a1d56debSopenharmony_ci    //noinspection ALL
1162a1d56debSopenharmony_ci    /// UT test for `ylong_json_free_string`.
1163a1d56debSopenharmony_ci    ///
1164a1d56debSopenharmony_ci    /// # Title
1165a1d56debSopenharmony_ci    /// ut_ylong_json_free_string
1166a1d56debSopenharmony_ci    ///
1167a1d56debSopenharmony_ci    /// # Brief
1168a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_free_string` to free a YlongJson*(`C` string).
1169a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
1170a1d56debSopenharmony_ci    #[test]
1171a1d56debSopenharmony_ci    fn ut_ylong_json_free_string() {
1172a1d56debSopenharmony_ci        unsafe {
1173a1d56debSopenharmony_ci            // Null ptr scene, if the process does not exit abnormally, it is successful.
1174a1d56debSopenharmony_ci            let string = null_mut();
1175a1d56debSopenharmony_ci            ylong_json_free_string(string);
1176a1d56debSopenharmony_ci
1177a1d56debSopenharmony_ci            let str = str_to_c_char(JSON_TEXT);
1178a1d56debSopenharmony_ci            let err = null_mut::<c_char>();
1179a1d56debSopenharmony_ci            let json = ylong_json_parse(str, &err as *const *mut c_char as *mut *mut c_char);
1180a1d56debSopenharmony_ci            assert!(err.is_null());
1181a1d56debSopenharmony_ci            assert!(!json.is_null());
1182a1d56debSopenharmony_ci
1183a1d56debSopenharmony_ci            // The char* generated by `ylong_json_print_unformatted` needs
1184a1d56debSopenharmony_ci            // to be destructed by calling `ylong_json_free_string`.
1185a1d56debSopenharmony_ci            let result = ylong_json_print_unformatted(json);
1186a1d56debSopenharmony_ci            ylong_json_free_string(result);
1187a1d56debSopenharmony_ci
1188a1d56debSopenharmony_ci            // Destruction
1189a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
1190a1d56debSopenharmony_ci            ylong_json_delete(json);
1191a1d56debSopenharmony_ci        }
1192a1d56debSopenharmony_ci    }
1193a1d56debSopenharmony_ci
1194a1d56debSopenharmony_ci    /// UT test for `ylong_json_print_unformatted`.
1195a1d56debSopenharmony_ci    ///
1196a1d56debSopenharmony_ci    /// # Title
1197a1d56debSopenharmony_ci    /// ut_ylong_json_print_unformatted
1198a1d56debSopenharmony_ci    ///
1199a1d56debSopenharmony_ci    /// # Brief
1200a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_print_unformatted` to print the value as `C` string.
1201a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
1202a1d56debSopenharmony_ci    #[test]
1203a1d56debSopenharmony_ci    fn ut_ylong_json_print_unformatted() {
1204a1d56debSopenharmony_ci        unsafe {
1205a1d56debSopenharmony_ci            // Null ptr
1206a1d56debSopenharmony_ci            let json = null_mut();
1207a1d56debSopenharmony_ci            assert!(ylong_json_print_unformatted(json).is_null());
1208a1d56debSopenharmony_ci
1209a1d56debSopenharmony_ci            // Correct scene
1210a1d56debSopenharmony_ci            let str = str_to_c_char("{\"array\":[1,2,3]}");
1211a1d56debSopenharmony_ci            let err = null_mut::<c_char>();
1212a1d56debSopenharmony_ci            let json = ylong_json_parse(str, &err as *const *mut c_char as *mut *mut c_char);
1213a1d56debSopenharmony_ci            assert!(err.is_null());
1214a1d56debSopenharmony_ci            assert!(!json.is_null());
1215a1d56debSopenharmony_ci
1216a1d56debSopenharmony_ci            let result = ylong_json_print_unformatted(json);
1217a1d56debSopenharmony_ci            let result = CString::from_raw(result).into_string().unwrap();
1218a1d56debSopenharmony_ci            assert_eq!(result, "{\"array\":[1,2,3]}");
1219a1d56debSopenharmony_ci
1220a1d56debSopenharmony_ci            // Destruction
1221a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
1222a1d56debSopenharmony_ci            ylong_json_delete(json);
1223a1d56debSopenharmony_ci        }
1224a1d56debSopenharmony_ci    }
1225a1d56debSopenharmony_ci
1226a1d56debSopenharmony_ci    /// UT test for `ylong_json_delete`.
1227a1d56debSopenharmony_ci    ///
1228a1d56debSopenharmony_ci    /// # Title
1229a1d56debSopenharmony_ci    /// ut_ylong_json_delete
1230a1d56debSopenharmony_ci    ///
1231a1d56debSopenharmony_ci    /// # Brief
1232a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_delete` to delete the value.
1233a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
1234a1d56debSopenharmony_ci    #[test]
1235a1d56debSopenharmony_ci    fn ut_ylong_json_delete() {
1236a1d56debSopenharmony_ci        unsafe {
1237a1d56debSopenharmony_ci            // Null ptr scene, if the process does not exit abnormally, it is successful.
1238a1d56debSopenharmony_ci            let json = null_mut();
1239a1d56debSopenharmony_ci            ylong_json_delete(json);
1240a1d56debSopenharmony_ci
1241a1d56debSopenharmony_ci            // The YlongJson* generated by `ylong_json_parse` needs
1242a1d56debSopenharmony_ci            // to be destructed by calling `ylong_json_delete`.
1243a1d56debSopenharmony_ci            let str = str_to_c_char(JSON_TEXT);
1244a1d56debSopenharmony_ci            let err = null_mut::<c_char>();
1245a1d56debSopenharmony_ci            let json = ylong_json_parse(str, &err as *const *mut c_char as *mut *mut c_char);
1246a1d56debSopenharmony_ci            assert!(err.is_null());
1247a1d56debSopenharmony_ci            assert!(!json.is_null());
1248a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
1249a1d56debSopenharmony_ci            ylong_json_delete(json);
1250a1d56debSopenharmony_ci
1251a1d56debSopenharmony_ci            // If the YlongJson* generated by the function starting with
1252a1d56debSopenharmony_ci            // `ylong_json_create` is not inserted into another YlongJson*,
1253a1d56debSopenharmony_ci            // YlongJson* needs to be destructed by calling `ylong_json_delete`.
1254a1d56debSopenharmony_ci            let null = ylong_json_create_null();
1255a1d56debSopenharmony_ci            ylong_json_delete(null);
1256a1d56debSopenharmony_ci        }
1257a1d56debSopenharmony_ci    }
1258a1d56debSopenharmony_ci
1259a1d56debSopenharmony_ci    /// UT test for `ylong_json_duplicate`.
1260a1d56debSopenharmony_ci    ///
1261a1d56debSopenharmony_ci    /// # Title
1262a1d56debSopenharmony_ci    /// ut_ylong_json_duplicate
1263a1d56debSopenharmony_ci    ///
1264a1d56debSopenharmony_ci    /// # Brief
1265a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_duplicate` to clone the value.
1266a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
1267a1d56debSopenharmony_ci    #[test]
1268a1d56debSopenharmony_ci    fn ut_ylong_json_duplicate() {
1269a1d56debSopenharmony_ci        unsafe {
1270a1d56debSopenharmony_ci            // Null ptr
1271a1d56debSopenharmony_ci            let json = null_mut();
1272a1d56debSopenharmony_ci            assert!(ylong_json_duplicate(json, 0).is_null());
1273a1d56debSopenharmony_ci
1274a1d56debSopenharmony_ci            // Null ptr
1275a1d56debSopenharmony_ci            let json = null_mut();
1276a1d56debSopenharmony_ci            assert!(ylong_json_duplicate(json, 1).is_null());
1277a1d56debSopenharmony_ci
1278a1d56debSopenharmony_ci            let str = str_to_c_char(JSON_TEXT);
1279a1d56debSopenharmony_ci            let err = null_mut::<c_char>();
1280a1d56debSopenharmony_ci            let json = ylong_json_parse(str, &err as *const *mut c_char as *mut *mut c_char);
1281a1d56debSopenharmony_ci            assert!(err.is_null());
1282a1d56debSopenharmony_ci            assert!(!json.is_null());
1283a1d56debSopenharmony_ci
1284a1d56debSopenharmony_ci            // If recurse is 0, does not clone recursively.
1285a1d56debSopenharmony_ci            let duplicate = ylong_json_duplicate(json, 0);
1286a1d56debSopenharmony_ci            let result = ylong_json_print_unformatted(duplicate);
1287a1d56debSopenharmony_ci            let result = CString::from_raw(result).into_string().unwrap();
1288a1d56debSopenharmony_ci            assert_eq!(result, "{}");
1289a1d56debSopenharmony_ci            // Destruction
1290a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
1291a1d56debSopenharmony_ci            ylong_json_delete(duplicate);
1292a1d56debSopenharmony_ci
1293a1d56debSopenharmony_ci            // If recurse is not 0, do recursive cloning.
1294a1d56debSopenharmony_ci            let duplicate = ylong_json_duplicate(json, 1);
1295a1d56debSopenharmony_ci            let result = ylong_json_print_unformatted(duplicate);
1296a1d56debSopenharmony_ci            let result = CString::from_raw(result).into_string().unwrap();
1297a1d56debSopenharmony_ci            let origin = ylong_json_print_unformatted(json);
1298a1d56debSopenharmony_ci            let origin = CString::from_raw(origin).into_string().unwrap();
1299a1d56debSopenharmony_ci            // The json address value is not equal to duplicate,
1300a1d56debSopenharmony_ci            // which means it is a different instance.
1301a1d56debSopenharmony_ci            assert_ne!(duplicate, json);
1302a1d56debSopenharmony_ci            // But the output is the same.
1303a1d56debSopenharmony_ci            assert_eq!(result, origin);
1304a1d56debSopenharmony_ci            // Destruction
1305a1d56debSopenharmony_ci            ylong_json_delete(duplicate);
1306a1d56debSopenharmony_ci            ylong_json_delete(json);
1307a1d56debSopenharmony_ci        }
1308a1d56debSopenharmony_ci    }
1309a1d56debSopenharmony_ci
1310a1d56debSopenharmony_ci    /// UT test for `ylong_json_create_null`.
1311a1d56debSopenharmony_ci    ///
1312a1d56debSopenharmony_ci    /// # Title
1313a1d56debSopenharmony_ci    /// ut_ylong_json_create_null
1314a1d56debSopenharmony_ci    ///
1315a1d56debSopenharmony_ci    /// # Brief
1316a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_create_null` to create a null.
1317a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
1318a1d56debSopenharmony_ci    #[test]
1319a1d56debSopenharmony_ci    fn ut_ylong_json_create_null() {
1320a1d56debSopenharmony_ci        unsafe {
1321a1d56debSopenharmony_ci            let null = ylong_json_create_null();
1322a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_null(null), 1);
1323a1d56debSopenharmony_ci            ylong_json_delete(null);
1324a1d56debSopenharmony_ci        }
1325a1d56debSopenharmony_ci    }
1326a1d56debSopenharmony_ci
1327a1d56debSopenharmony_ci    /// UT test for `ylong_json_is_null`.
1328a1d56debSopenharmony_ci    ///
1329a1d56debSopenharmony_ci    /// # Title
1330a1d56debSopenharmony_ci    /// ut_ylong_json_is_null
1331a1d56debSopenharmony_ci    ///
1332a1d56debSopenharmony_ci    /// # Brief
1333a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_is_null` to determine whether the underlying structure is null.
1334a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
1335a1d56debSopenharmony_ci    #[test]
1336a1d56debSopenharmony_ci    fn ut_ylong_json_is_null() {
1337a1d56debSopenharmony_ci        unsafe {
1338a1d56debSopenharmony_ci            // Null ptr
1339a1d56debSopenharmony_ci            let null = null_mut();
1340a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_null(null), 0);
1341a1d56debSopenharmony_ci
1342a1d56debSopenharmony_ci            // If the underlying structure is Null, returns true.
1343a1d56debSopenharmony_ci            let null = ylong_json_create_null();
1344a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_null(null), 1);
1345a1d56debSopenharmony_ci            ylong_json_delete(null);
1346a1d56debSopenharmony_ci
1347a1d56debSopenharmony_ci            // Else returns false.
1348a1d56debSopenharmony_ci            let bool = ylong_json_create_bool(0xffff);
1349a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_null(bool), 0);
1350a1d56debSopenharmony_ci            ylong_json_delete(bool);
1351a1d56debSopenharmony_ci        }
1352a1d56debSopenharmony_ci    }
1353a1d56debSopenharmony_ci
1354a1d56debSopenharmony_ci    /// UT test for `ylong_json_create_bool`.
1355a1d56debSopenharmony_ci    ///
1356a1d56debSopenharmony_ci    /// # Title
1357a1d56debSopenharmony_ci    /// ut_ylong_json_create_bool
1358a1d56debSopenharmony_ci    ///
1359a1d56debSopenharmony_ci    /// # Brief
1360a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_create_bool` to create a bool.
1361a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
1362a1d56debSopenharmony_ci    #[test]
1363a1d56debSopenharmony_ci    fn ut_ylong_json_create_bool() {
1364a1d56debSopenharmony_ci        unsafe {
1365a1d56debSopenharmony_ci            // Creates true.
1366a1d56debSopenharmony_ci            let bool = ylong_json_create_bool(0xffff);
1367a1d56debSopenharmony_ci            let mut val = 0;
1368a1d56debSopenharmony_ci            ylong_json_get_value_from_bool(bool, &mut val as *mut c_int);
1369a1d56debSopenharmony_ci            assert_eq!(val, 1);
1370a1d56debSopenharmony_ci            ylong_json_delete(bool);
1371a1d56debSopenharmony_ci
1372a1d56debSopenharmony_ci            // Creates false.
1373a1d56debSopenharmony_ci            let bool = ylong_json_create_bool(0);
1374a1d56debSopenharmony_ci            let mut val = 1;
1375a1d56debSopenharmony_ci            ylong_json_get_value_from_bool(bool, &mut val as *mut c_int);
1376a1d56debSopenharmony_ci            assert_eq!(val, 0);
1377a1d56debSopenharmony_ci            ylong_json_delete(bool);
1378a1d56debSopenharmony_ci        }
1379a1d56debSopenharmony_ci    }
1380a1d56debSopenharmony_ci
1381a1d56debSopenharmony_ci    /// UT test for `ylong_json_is_bool`.
1382a1d56debSopenharmony_ci    ///
1383a1d56debSopenharmony_ci    /// # Title
1384a1d56debSopenharmony_ci    /// ut_ylong_json_is_bool
1385a1d56debSopenharmony_ci    ///
1386a1d56debSopenharmony_ci    /// # Brief
1387a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_is_bool` to determine whether the underlying structure is bool.
1388a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
1389a1d56debSopenharmony_ci    #[test]
1390a1d56debSopenharmony_ci    fn ut_ylong_json_is_bool() {
1391a1d56debSopenharmony_ci        unsafe {
1392a1d56debSopenharmony_ci            // Null ptr
1393a1d56debSopenharmony_ci            let bool = null_mut();
1394a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_bool(bool), 0);
1395a1d56debSopenharmony_ci
1396a1d56debSopenharmony_ci            // True
1397a1d56debSopenharmony_ci            let bool = ylong_json_create_bool(0xffff);
1398a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_bool(bool), 1);
1399a1d56debSopenharmony_ci            ylong_json_delete(bool);
1400a1d56debSopenharmony_ci
1401a1d56debSopenharmony_ci            // False
1402a1d56debSopenharmony_ci            let bool = ylong_json_create_bool(0);
1403a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_bool(bool), 1);
1404a1d56debSopenharmony_ci            ylong_json_delete(bool);
1405a1d56debSopenharmony_ci
1406a1d56debSopenharmony_ci            // Non-bool case
1407a1d56debSopenharmony_ci            let null = ylong_json_create_null();
1408a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_bool(null), 0);
1409a1d56debSopenharmony_ci            ylong_json_delete(null);
1410a1d56debSopenharmony_ci        }
1411a1d56debSopenharmony_ci    }
1412a1d56debSopenharmony_ci
1413a1d56debSopenharmony_ci    /// UT test for `ylong_json_get_value_from_bool`.
1414a1d56debSopenharmony_ci    ///
1415a1d56debSopenharmony_ci    /// # Title
1416a1d56debSopenharmony_ci    /// ut_ylong_json_get_value_from_bool
1417a1d56debSopenharmony_ci    ///
1418a1d56debSopenharmony_ci    /// # Brief
1419a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_get_value_from_bool` to get value from bool.
1420a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
1421a1d56debSopenharmony_ci    #[test]
1422a1d56debSopenharmony_ci    fn ut_ylong_json_get_value_from_bool() {
1423a1d56debSopenharmony_ci        unsafe {
1424a1d56debSopenharmony_ci            // Null ptr
1425a1d56debSopenharmony_ci            let bool = null_mut();
1426a1d56debSopenharmony_ci            let mut val = 0i32;
1427a1d56debSopenharmony_ci            assert_eq!(
1428a1d56debSopenharmony_ci                ylong_json_get_value_from_bool(bool, &mut val as *mut c_int),
1429a1d56debSopenharmony_ci                0
1430a1d56debSopenharmony_ci            );
1431a1d56debSopenharmony_ci
1432a1d56debSopenharmony_ci            let bool = ylong_json_create_bool(0xffff);
1433a1d56debSopenharmony_ci            let mut val = 0;
1434a1d56debSopenharmony_ci            assert_eq!(
1435a1d56debSopenharmony_ci                ylong_json_get_value_from_bool(bool, &mut val as *mut c_int),
1436a1d56debSopenharmony_ci                1
1437a1d56debSopenharmony_ci            );
1438a1d56debSopenharmony_ci            assert_eq!(val, 1);
1439a1d56debSopenharmony_ci            ylong_json_delete(bool);
1440a1d56debSopenharmony_ci
1441a1d56debSopenharmony_ci            let null = ylong_json_create_null();
1442a1d56debSopenharmony_ci            let mut val = 0;
1443a1d56debSopenharmony_ci            assert_eq!(
1444a1d56debSopenharmony_ci                ylong_json_get_value_from_bool(null, &mut val as *mut c_int),
1445a1d56debSopenharmony_ci                0
1446a1d56debSopenharmony_ci            );
1447a1d56debSopenharmony_ci            ylong_json_delete(null);
1448a1d56debSopenharmony_ci        }
1449a1d56debSopenharmony_ci    }
1450a1d56debSopenharmony_ci
1451a1d56debSopenharmony_ci    /// UT test for `ylong_json_set_value_to_bool`.
1452a1d56debSopenharmony_ci    ///
1453a1d56debSopenharmony_ci    /// # Title
1454a1d56debSopenharmony_ci    /// ut_ylong_json_set_value_to_bool
1455a1d56debSopenharmony_ci    ///
1456a1d56debSopenharmony_ci    /// # Brief
1457a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_set_value_to_bool` to set value to bool.
1458a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
1459a1d56debSopenharmony_ci    #[test]
1460a1d56debSopenharmony_ci    fn ut_ylong_json_set_value_to_bool() {
1461a1d56debSopenharmony_ci        unsafe {
1462a1d56debSopenharmony_ci            // Null ptr
1463a1d56debSopenharmony_ci            let bool = null_mut();
1464a1d56debSopenharmony_ci            assert_eq!(ylong_json_set_value_to_bool(bool, 1), 0);
1465a1d56debSopenharmony_ci
1466a1d56debSopenharmony_ci            let bool = ylong_json_create_bool(0xffff);
1467a1d56debSopenharmony_ci            let mut val = 0;
1468a1d56debSopenharmony_ci            assert_eq!(
1469a1d56debSopenharmony_ci                ylong_json_get_value_from_bool(bool, &mut val as *mut c_int),
1470a1d56debSopenharmony_ci                1
1471a1d56debSopenharmony_ci            );
1472a1d56debSopenharmony_ci            assert_eq!(val, 1);
1473a1d56debSopenharmony_ci
1474a1d56debSopenharmony_ci            assert_eq!(ylong_json_set_value_to_bool(bool, 0), 1);
1475a1d56debSopenharmony_ci            assert_eq!(
1476a1d56debSopenharmony_ci                ylong_json_get_value_from_bool(bool, &mut val as *mut c_int),
1477a1d56debSopenharmony_ci                1
1478a1d56debSopenharmony_ci            );
1479a1d56debSopenharmony_ci            assert_eq!(val, 0);
1480a1d56debSopenharmony_ci            ylong_json_delete(bool);
1481a1d56debSopenharmony_ci
1482a1d56debSopenharmony_ci            let null = ylong_json_create_null();
1483a1d56debSopenharmony_ci            assert_eq!(ylong_json_set_value_to_bool(null, 0), 0);
1484a1d56debSopenharmony_ci            ylong_json_delete(null);
1485a1d56debSopenharmony_ci        }
1486a1d56debSopenharmony_ci    }
1487a1d56debSopenharmony_ci
1488a1d56debSopenharmony_ci    /// UT test for `ylong_json_create_double_number`.
1489a1d56debSopenharmony_ci    ///
1490a1d56debSopenharmony_ci    /// # Title
1491a1d56debSopenharmony_ci    /// ut_ylong_json_create_double_number
1492a1d56debSopenharmony_ci    ///
1493a1d56debSopenharmony_ci    /// # Brief
1494a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_create_double_number` to create a double number.
1495a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
1496a1d56debSopenharmony_ci    #[test]
1497a1d56debSopenharmony_ci    fn ut_ylong_json_create_double_number() {
1498a1d56debSopenharmony_ci        unsafe {
1499a1d56debSopenharmony_ci            let double = ylong_json_create_double_number(3.24);
1500a1d56debSopenharmony_ci            let mut number = 0f64;
1501a1d56debSopenharmony_ci            ylong_json_get_double_value_from_number(double, &mut number as *mut c_double);
1502a1d56debSopenharmony_ci            assert_eq!(number, 3.24);
1503a1d56debSopenharmony_ci            ylong_json_delete(double);
1504a1d56debSopenharmony_ci        }
1505a1d56debSopenharmony_ci    }
1506a1d56debSopenharmony_ci
1507a1d56debSopenharmony_ci    /// UT test for `ylong_json_create_int_number`.
1508a1d56debSopenharmony_ci    ///
1509a1d56debSopenharmony_ci    /// # Title
1510a1d56debSopenharmony_ci    /// ut_ylong_json_create_int_number
1511a1d56debSopenharmony_ci    ///
1512a1d56debSopenharmony_ci    /// # Brief
1513a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_create_int_number` to create a int number.
1514a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
1515a1d56debSopenharmony_ci    #[test]
1516a1d56debSopenharmony_ci    fn ut_ylong_json_create_int_number() {
1517a1d56debSopenharmony_ci        unsafe {
1518a1d56debSopenharmony_ci            let int = ylong_json_create_int_number(0xffff);
1519a1d56debSopenharmony_ci            let mut number = 0i64;
1520a1d56debSopenharmony_ci            ylong_json_get_int_value_from_number(int, &mut number as *mut c_longlong);
1521a1d56debSopenharmony_ci            assert_eq!(number, 0xffff);
1522a1d56debSopenharmony_ci            ylong_json_delete(int);
1523a1d56debSopenharmony_ci        }
1524a1d56debSopenharmony_ci    }
1525a1d56debSopenharmony_ci
1526a1d56debSopenharmony_ci    /// UT test for `ylong_json_is_number`.
1527a1d56debSopenharmony_ci    ///
1528a1d56debSopenharmony_ci    /// # Title
1529a1d56debSopenharmony_ci    /// ut_ylong_json_is_number
1530a1d56debSopenharmony_ci    ///
1531a1d56debSopenharmony_ci    /// # Brief
1532a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_is_number` to determine whether the value is number.
1533a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
1534a1d56debSopenharmony_ci    #[test]
1535a1d56debSopenharmony_ci    fn ut_ylong_json_is_number() {
1536a1d56debSopenharmony_ci        unsafe {
1537a1d56debSopenharmony_ci            // Null ptr
1538a1d56debSopenharmony_ci            let number = null_mut();
1539a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_number(number), 0);
1540a1d56debSopenharmony_ci
1541a1d56debSopenharmony_ci            let int = ylong_json_create_int_number(1i64);
1542a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_number(int), 1);
1543a1d56debSopenharmony_ci            ylong_json_delete(int);
1544a1d56debSopenharmony_ci
1545a1d56debSopenharmony_ci            let double = ylong_json_create_double_number(3.24);
1546a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_number(double), 1);
1547a1d56debSopenharmony_ci            ylong_json_delete(double);
1548a1d56debSopenharmony_ci
1549a1d56debSopenharmony_ci            let null = ylong_json_create_null();
1550a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_number(null), 0);
1551a1d56debSopenharmony_ci            ylong_json_delete(null);
1552a1d56debSopenharmony_ci        }
1553a1d56debSopenharmony_ci    }
1554a1d56debSopenharmony_ci
1555a1d56debSopenharmony_ci    /// UT test for `ylong_json_is_double_number`.
1556a1d56debSopenharmony_ci    ///
1557a1d56debSopenharmony_ci    /// # Title
1558a1d56debSopenharmony_ci    /// ut_ylong_json_is_double_number
1559a1d56debSopenharmony_ci    ///
1560a1d56debSopenharmony_ci    /// # Brief
1561a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_is_double_number` to determine whether the value is double number.
1562a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
1563a1d56debSopenharmony_ci    #[test]
1564a1d56debSopenharmony_ci    fn ut_ylong_json_is_double_number() {
1565a1d56debSopenharmony_ci        unsafe {
1566a1d56debSopenharmony_ci            // Null ptr
1567a1d56debSopenharmony_ci            let double = null_mut();
1568a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_double_number(double), 0);
1569a1d56debSopenharmony_ci
1570a1d56debSopenharmony_ci            let int = ylong_json_create_int_number(1i64);
1571a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_double_number(int), 0);
1572a1d56debSopenharmony_ci            ylong_json_delete(int);
1573a1d56debSopenharmony_ci
1574a1d56debSopenharmony_ci            let double = ylong_json_create_double_number(3.24);
1575a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_double_number(double), 1);
1576a1d56debSopenharmony_ci            ylong_json_delete(double);
1577a1d56debSopenharmony_ci
1578a1d56debSopenharmony_ci            let null = ylong_json_create_null();
1579a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_double_number(null), 0);
1580a1d56debSopenharmony_ci            ylong_json_delete(null);
1581a1d56debSopenharmony_ci        }
1582a1d56debSopenharmony_ci    }
1583a1d56debSopenharmony_ci
1584a1d56debSopenharmony_ci    /// UT test for `ylong_json_is_int_number`.
1585a1d56debSopenharmony_ci    ///
1586a1d56debSopenharmony_ci    /// # Title
1587a1d56debSopenharmony_ci    /// ut_ylong_json_is_int_number
1588a1d56debSopenharmony_ci    ///
1589a1d56debSopenharmony_ci    /// # Brief
1590a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_is_int_number` to determine whether the value is int number.
1591a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
1592a1d56debSopenharmony_ci    #[test]
1593a1d56debSopenharmony_ci    fn ut_ylong_json_is_int_number() {
1594a1d56debSopenharmony_ci        unsafe {
1595a1d56debSopenharmony_ci            // Null ptr
1596a1d56debSopenharmony_ci            let int = null_mut();
1597a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_int_number(int), 0);
1598a1d56debSopenharmony_ci
1599a1d56debSopenharmony_ci            let int = ylong_json_create_int_number(1i64);
1600a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_int_number(int), 1);
1601a1d56debSopenharmony_ci            ylong_json_delete(int);
1602a1d56debSopenharmony_ci
1603a1d56debSopenharmony_ci            let double = ylong_json_create_double_number(3.24);
1604a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_int_number(double), 0);
1605a1d56debSopenharmony_ci            ylong_json_delete(double);
1606a1d56debSopenharmony_ci
1607a1d56debSopenharmony_ci            let null = ylong_json_create_null();
1608a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_int_number(null), 0);
1609a1d56debSopenharmony_ci            ylong_json_delete(null);
1610a1d56debSopenharmony_ci        }
1611a1d56debSopenharmony_ci    }
1612a1d56debSopenharmony_ci
1613a1d56debSopenharmony_ci    /// UT test for `ylong_json_get_double_value_from_number`.
1614a1d56debSopenharmony_ci    ///
1615a1d56debSopenharmony_ci    /// # Title
1616a1d56debSopenharmony_ci    /// ut_ylong_json_get_double_value_from_number
1617a1d56debSopenharmony_ci    ///
1618a1d56debSopenharmony_ci    /// # Brief
1619a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_get_double_value_from_number` to get double value from number.
1620a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
1621a1d56debSopenharmony_ci    #[test]
1622a1d56debSopenharmony_ci    fn ut_ylong_json_get_double_value_from_number() {
1623a1d56debSopenharmony_ci        unsafe {
1624a1d56debSopenharmony_ci            // Null ptr
1625a1d56debSopenharmony_ci            let double = null_mut();
1626a1d56debSopenharmony_ci            let mut number = 0f64;
1627a1d56debSopenharmony_ci            assert_eq!(
1628a1d56debSopenharmony_ci                ylong_json_get_double_value_from_number(double, &mut number as *mut c_double),
1629a1d56debSopenharmony_ci                0
1630a1d56debSopenharmony_ci            );
1631a1d56debSopenharmony_ci
1632a1d56debSopenharmony_ci            let int = ylong_json_create_int_number(1i64);
1633a1d56debSopenharmony_ci            let mut number = 0f64;
1634a1d56debSopenharmony_ci            assert_eq!(
1635a1d56debSopenharmony_ci                ylong_json_get_double_value_from_number(int, &mut number as *mut c_double),
1636a1d56debSopenharmony_ci                1
1637a1d56debSopenharmony_ci            );
1638a1d56debSopenharmony_ci            assert_eq!(number, 1.0);
1639a1d56debSopenharmony_ci            ylong_json_delete(int);
1640a1d56debSopenharmony_ci
1641a1d56debSopenharmony_ci            let double = ylong_json_create_double_number(3.24);
1642a1d56debSopenharmony_ci            let mut number = 0f64;
1643a1d56debSopenharmony_ci            assert_eq!(
1644a1d56debSopenharmony_ci                ylong_json_get_double_value_from_number(double, &mut number as *mut c_double),
1645a1d56debSopenharmony_ci                1
1646a1d56debSopenharmony_ci            );
1647a1d56debSopenharmony_ci            assert_eq!(number, 3.24);
1648a1d56debSopenharmony_ci            ylong_json_delete(double);
1649a1d56debSopenharmony_ci
1650a1d56debSopenharmony_ci            let null = ylong_json_create_null();
1651a1d56debSopenharmony_ci            let mut number = 0f64;
1652a1d56debSopenharmony_ci            assert_eq!(
1653a1d56debSopenharmony_ci                ylong_json_get_double_value_from_number(null, &mut number as *mut c_double),
1654a1d56debSopenharmony_ci                0
1655a1d56debSopenharmony_ci            );
1656a1d56debSopenharmony_ci            ylong_json_delete(null);
1657a1d56debSopenharmony_ci        }
1658a1d56debSopenharmony_ci    }
1659a1d56debSopenharmony_ci
1660a1d56debSopenharmony_ci    /// UT test for `ylong_json_get_int_value_from_number`.
1661a1d56debSopenharmony_ci    ///
1662a1d56debSopenharmony_ci    /// # Title
1663a1d56debSopenharmony_ci    /// ut_ylong_json_get_int_value_from_number
1664a1d56debSopenharmony_ci    ///
1665a1d56debSopenharmony_ci    /// # Brief
1666a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_get_int_value_from_number` to get int value from number.
1667a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
1668a1d56debSopenharmony_ci    #[test]
1669a1d56debSopenharmony_ci    fn ut_ylong_json_get_int_value_from_number() {
1670a1d56debSopenharmony_ci        unsafe {
1671a1d56debSopenharmony_ci            // Null ptr
1672a1d56debSopenharmony_ci            let int = null_mut();
1673a1d56debSopenharmony_ci            let mut number = 0i64;
1674a1d56debSopenharmony_ci            assert_eq!(
1675a1d56debSopenharmony_ci                ylong_json_get_int_value_from_number(int, &mut number as *mut c_longlong),
1676a1d56debSopenharmony_ci                0
1677a1d56debSopenharmony_ci            );
1678a1d56debSopenharmony_ci
1679a1d56debSopenharmony_ci            let int = ylong_json_create_int_number(1i64);
1680a1d56debSopenharmony_ci            let mut number = 0i64;
1681a1d56debSopenharmony_ci            assert_eq!(
1682a1d56debSopenharmony_ci                ylong_json_get_int_value_from_number(int, &mut number as *mut c_longlong),
1683a1d56debSopenharmony_ci                1
1684a1d56debSopenharmony_ci            );
1685a1d56debSopenharmony_ci            assert_eq!(number, 1i64);
1686a1d56debSopenharmony_ci            ylong_json_delete(int);
1687a1d56debSopenharmony_ci
1688a1d56debSopenharmony_ci            let double = ylong_json_create_double_number(3.24);
1689a1d56debSopenharmony_ci            let mut number = 0i64;
1690a1d56debSopenharmony_ci            assert_eq!(
1691a1d56debSopenharmony_ci                ylong_json_get_int_value_from_number(double, &mut number as *mut c_longlong),
1692a1d56debSopenharmony_ci                1
1693a1d56debSopenharmony_ci            );
1694a1d56debSopenharmony_ci            assert_eq!(number, 3i64);
1695a1d56debSopenharmony_ci            ylong_json_delete(double);
1696a1d56debSopenharmony_ci
1697a1d56debSopenharmony_ci            let null = ylong_json_create_null();
1698a1d56debSopenharmony_ci            let mut number = 0i64;
1699a1d56debSopenharmony_ci            assert_eq!(
1700a1d56debSopenharmony_ci                ylong_json_get_int_value_from_number(null, &mut number as *mut c_longlong),
1701a1d56debSopenharmony_ci                0
1702a1d56debSopenharmony_ci            );
1703a1d56debSopenharmony_ci            ylong_json_delete(null);
1704a1d56debSopenharmony_ci        }
1705a1d56debSopenharmony_ci    }
1706a1d56debSopenharmony_ci
1707a1d56debSopenharmony_ci    /// UT test for `ylong_json_set_double_value_to_number`.
1708a1d56debSopenharmony_ci    ///
1709a1d56debSopenharmony_ci    /// # Title
1710a1d56debSopenharmony_ci    /// ut_ylong_json_set_double_value_to_number
1711a1d56debSopenharmony_ci    ///
1712a1d56debSopenharmony_ci    /// # Brief
1713a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_set_double_value_to_number` to set double value to number.
1714a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
1715a1d56debSopenharmony_ci    #[test]
1716a1d56debSopenharmony_ci    fn ut_ylong_json_set_double_value_to_number() {
1717a1d56debSopenharmony_ci        unsafe {
1718a1d56debSopenharmony_ci            // Null ptr
1719a1d56debSopenharmony_ci            let number = null_mut();
1720a1d56debSopenharmony_ci            assert_eq!(ylong_json_set_double_value_to_number(number, 3.24), 0);
1721a1d56debSopenharmony_ci
1722a1d56debSopenharmony_ci            let double = ylong_json_create_double_number(3.24);
1723a1d56debSopenharmony_ci            let mut number = 0f64;
1724a1d56debSopenharmony_ci            ylong_json_get_double_value_from_number(double, &mut number as *mut c_double);
1725a1d56debSopenharmony_ci            assert_eq!(number, 3.24);
1726a1d56debSopenharmony_ci            assert_eq!(ylong_json_set_double_value_to_number(double, 1.23), 1);
1727a1d56debSopenharmony_ci            ylong_json_get_double_value_from_number(double, &mut number as *mut c_double);
1728a1d56debSopenharmony_ci            assert_eq!(number, 1.23);
1729a1d56debSopenharmony_ci            ylong_json_delete(double);
1730a1d56debSopenharmony_ci
1731a1d56debSopenharmony_ci            let int = ylong_json_create_int_number(1i64);
1732a1d56debSopenharmony_ci            let mut number = 0i64;
1733a1d56debSopenharmony_ci            ylong_json_get_int_value_from_number(int, &mut number as *mut c_longlong);
1734a1d56debSopenharmony_ci            assert_eq!(number, 1i64);
1735a1d56debSopenharmony_ci            assert_eq!(ylong_json_set_double_value_to_number(int, 3.24), 1);
1736a1d56debSopenharmony_ci            ylong_json_get_int_value_from_number(int, &mut number as *mut c_longlong);
1737a1d56debSopenharmony_ci            assert_eq!(number, 3i64);
1738a1d56debSopenharmony_ci            ylong_json_delete(int);
1739a1d56debSopenharmony_ci
1740a1d56debSopenharmony_ci            let null = ylong_json_create_null();
1741a1d56debSopenharmony_ci            assert_eq!(ylong_json_set_double_value_to_number(null, 3.24), 0);
1742a1d56debSopenharmony_ci            ylong_json_delete(null);
1743a1d56debSopenharmony_ci        }
1744a1d56debSopenharmony_ci    }
1745a1d56debSopenharmony_ci
1746a1d56debSopenharmony_ci    /// UT test for `ylong_json_set_int_value_to_number`.
1747a1d56debSopenharmony_ci    ///
1748a1d56debSopenharmony_ci    /// # Title
1749a1d56debSopenharmony_ci    /// ut_ylong_json_set_int_value_to_number
1750a1d56debSopenharmony_ci    ///
1751a1d56debSopenharmony_ci    /// # Brief
1752a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_set_int_value_to_number` to set int value to number.
1753a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
1754a1d56debSopenharmony_ci    #[test]
1755a1d56debSopenharmony_ci    fn ut_ylong_json_set_int_value_to_number() {
1756a1d56debSopenharmony_ci        unsafe {
1757a1d56debSopenharmony_ci            // Null ptr
1758a1d56debSopenharmony_ci            let number = null_mut();
1759a1d56debSopenharmony_ci            assert_eq!(ylong_json_set_int_value_to_number(number, 1), 0);
1760a1d56debSopenharmony_ci
1761a1d56debSopenharmony_ci            let int = ylong_json_create_int_number(1i64);
1762a1d56debSopenharmony_ci            let mut number = 0i64;
1763a1d56debSopenharmony_ci            ylong_json_get_int_value_from_number(int, &mut number as *mut c_longlong);
1764a1d56debSopenharmony_ci            assert_eq!(number, 1i64);
1765a1d56debSopenharmony_ci            assert_eq!(ylong_json_set_int_value_to_number(int, 3i64), 1);
1766a1d56debSopenharmony_ci            ylong_json_get_int_value_from_number(int, &mut number as *mut c_longlong);
1767a1d56debSopenharmony_ci            assert_eq!(number, 3i64);
1768a1d56debSopenharmony_ci            ylong_json_delete(int);
1769a1d56debSopenharmony_ci
1770a1d56debSopenharmony_ci            let double = ylong_json_create_double_number(3.24);
1771a1d56debSopenharmony_ci            let mut number = 0f64;
1772a1d56debSopenharmony_ci            ylong_json_get_double_value_from_number(double, &mut number as *mut c_double);
1773a1d56debSopenharmony_ci            assert_eq!(number, 3.24);
1774a1d56debSopenharmony_ci            assert_eq!(ylong_json_set_int_value_to_number(double, 1), 1);
1775a1d56debSopenharmony_ci            ylong_json_get_double_value_from_number(double, &mut number as *mut c_double);
1776a1d56debSopenharmony_ci            assert_eq!(number, 1.0);
1777a1d56debSopenharmony_ci            ylong_json_delete(double);
1778a1d56debSopenharmony_ci
1779a1d56debSopenharmony_ci            let null = ylong_json_create_null();
1780a1d56debSopenharmony_ci            assert_eq!(ylong_json_set_int_value_to_number(null, 1), 0);
1781a1d56debSopenharmony_ci            ylong_json_delete(null);
1782a1d56debSopenharmony_ci        }
1783a1d56debSopenharmony_ci    }
1784a1d56debSopenharmony_ci
1785a1d56debSopenharmony_ci    /// UT test for `ylong_json_create_string`.
1786a1d56debSopenharmony_ci    ///
1787a1d56debSopenharmony_ci    /// # Title
1788a1d56debSopenharmony_ci    /// ut_ylong_json_create_string
1789a1d56debSopenharmony_ci    ///
1790a1d56debSopenharmony_ci    /// # Brief
1791a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_create_string` to create a string from *mut c_char.
1792a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
1793a1d56debSopenharmony_ci    #[test]
1794a1d56debSopenharmony_ci    fn ut_ylong_json_create_string() {
1795a1d56debSopenharmony_ci        unsafe {
1796a1d56debSopenharmony_ci            // Null ptr
1797a1d56debSopenharmony_ci            let str = null();
1798a1d56debSopenharmony_ci            assert!(ylong_json_create_string(str).is_null());
1799a1d56debSopenharmony_ci
1800a1d56debSopenharmony_ci            let str = str_to_c_char("Hello World");
1801a1d56debSopenharmony_ci            let string = ylong_json_create_string(str);
1802a1d56debSopenharmony_ci            let mut content = null_mut();
1803a1d56debSopenharmony_ci            ylong_json_get_value_from_string(string, &mut content as *mut *mut c_char);
1804a1d56debSopenharmony_ci            let result = String::from_utf8_unchecked(CStr::from_ptr(content).to_bytes().to_vec());
1805a1d56debSopenharmony_ci            assert_eq!(result, "Hello World");
1806a1d56debSopenharmony_ci            // Destruction
1807a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
1808a1d56debSopenharmony_ci            ylong_json_delete(string);
1809a1d56debSopenharmony_ci        }
1810a1d56debSopenharmony_ci    }
1811a1d56debSopenharmony_ci
1812a1d56debSopenharmony_ci    /// UT test for `ylong_json_is_string`.
1813a1d56debSopenharmony_ci    ///
1814a1d56debSopenharmony_ci    /// # Title
1815a1d56debSopenharmony_ci    /// ut_ylong_json_is_string
1816a1d56debSopenharmony_ci    ///
1817a1d56debSopenharmony_ci    /// # Brief
1818a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_is_string` to determine whether the value is string.
1819a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
1820a1d56debSopenharmony_ci    #[test]
1821a1d56debSopenharmony_ci    fn ut_ylong_json_is_string() {
1822a1d56debSopenharmony_ci        unsafe {
1823a1d56debSopenharmony_ci            // Null ptr
1824a1d56debSopenharmony_ci            let string = null_mut();
1825a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_string(string), 0);
1826a1d56debSopenharmony_ci
1827a1d56debSopenharmony_ci            let str = str_to_c_char("Hello World");
1828a1d56debSopenharmony_ci            let string = ylong_json_create_string(str);
1829a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_string(string), 1);
1830a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
1831a1d56debSopenharmony_ci            ylong_json_delete(string);
1832a1d56debSopenharmony_ci
1833a1d56debSopenharmony_ci            let null = ylong_json_create_null();
1834a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_string(null), 0);
1835a1d56debSopenharmony_ci            ylong_json_delete(null);
1836a1d56debSopenharmony_ci        }
1837a1d56debSopenharmony_ci    }
1838a1d56debSopenharmony_ci
1839a1d56debSopenharmony_ci    /// UT test for `ylong_json_get_value_from_string`.
1840a1d56debSopenharmony_ci    ///
1841a1d56debSopenharmony_ci    /// # Title
1842a1d56debSopenharmony_ci    /// ut_ylong_json_get_value_from_string
1843a1d56debSopenharmony_ci    ///
1844a1d56debSopenharmony_ci    /// # Brief
1845a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_get_value_from_string` to get value from string.
1846a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
1847a1d56debSopenharmony_ci    #[test]
1848a1d56debSopenharmony_ci    fn ut_ylong_json_get_value_from_string() {
1849a1d56debSopenharmony_ci        unsafe {
1850a1d56debSopenharmony_ci            // Null ptr
1851a1d56debSopenharmony_ci            let string = null_mut();
1852a1d56debSopenharmony_ci            let mut str = null_mut();
1853a1d56debSopenharmony_ci            assert_eq!(
1854a1d56debSopenharmony_ci                ylong_json_get_value_from_string(string, &mut str as *mut *mut c_char),
1855a1d56debSopenharmony_ci                0
1856a1d56debSopenharmony_ci            );
1857a1d56debSopenharmony_ci
1858a1d56debSopenharmony_ci            let str = str_to_c_char("Hello World");
1859a1d56debSopenharmony_ci            let string = ylong_json_create_string(str);
1860a1d56debSopenharmony_ci            let mut content = null_mut();
1861a1d56debSopenharmony_ci            assert_eq!(
1862a1d56debSopenharmony_ci                ylong_json_get_value_from_string(string, &mut content as *mut *mut c_char),
1863a1d56debSopenharmony_ci                1
1864a1d56debSopenharmony_ci            );
1865a1d56debSopenharmony_ci            let result = String::from_utf8_unchecked(CStr::from_ptr(content).to_bytes().to_vec());
1866a1d56debSopenharmony_ci            assert_eq!(result, "Hello World");
1867a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
1868a1d56debSopenharmony_ci            ylong_json_delete(string);
1869a1d56debSopenharmony_ci
1870a1d56debSopenharmony_ci            let null = ylong_json_create_null();
1871a1d56debSopenharmony_ci            let mut content = null_mut();
1872a1d56debSopenharmony_ci            assert_eq!(
1873a1d56debSopenharmony_ci                ylong_json_get_value_from_string(null, &mut content as *mut *mut c_char),
1874a1d56debSopenharmony_ci                0
1875a1d56debSopenharmony_ci            );
1876a1d56debSopenharmony_ci            ylong_json_delete(null);
1877a1d56debSopenharmony_ci        }
1878a1d56debSopenharmony_ci    }
1879a1d56debSopenharmony_ci
1880a1d56debSopenharmony_ci    /// UT test for `ylong_json_set_value_to_string`.
1881a1d56debSopenharmony_ci    ///
1882a1d56debSopenharmony_ci    /// # Title
1883a1d56debSopenharmony_ci    /// ut_ylong_json_set_value_to_string
1884a1d56debSopenharmony_ci    ///
1885a1d56debSopenharmony_ci    /// # Brief
1886a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_set_value_to_string` to set value to string.
1887a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
1888a1d56debSopenharmony_ci    #[test]
1889a1d56debSopenharmony_ci    fn ut_ylong_json_set_value_to_string() {
1890a1d56debSopenharmony_ci        unsafe {
1891a1d56debSopenharmony_ci            // Null ptr
1892a1d56debSopenharmony_ci            let string = null_mut();
1893a1d56debSopenharmony_ci            let str = str_to_c_char("Hello World");
1894a1d56debSopenharmony_ci            assert_eq!(ylong_json_set_value_to_string(string, str), 0);
1895a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
1896a1d56debSopenharmony_ci
1897a1d56debSopenharmony_ci            // Null ptr
1898a1d56debSopenharmony_ci            let str = str_to_c_char("Hello World");
1899a1d56debSopenharmony_ci            let string = ylong_json_create_string(str);
1900a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
1901a1d56debSopenharmony_ci            let str = null();
1902a1d56debSopenharmony_ci            assert_eq!(ylong_json_set_value_to_string(string, str), 0);
1903a1d56debSopenharmony_ci            ylong_json_delete(string);
1904a1d56debSopenharmony_ci
1905a1d56debSopenharmony_ci            let str = str_to_c_char("Hello World");
1906a1d56debSopenharmony_ci            let string = ylong_json_create_string(str);
1907a1d56debSopenharmony_ci            // Check if the original value is "Hello World".
1908a1d56debSopenharmony_ci            let mut content = null_mut();
1909a1d56debSopenharmony_ci            ylong_json_get_value_from_string(string, &mut content as *mut *mut c_char);
1910a1d56debSopenharmony_ci            let result = String::from_utf8_unchecked(CStr::from_ptr(content).to_bytes().to_vec());
1911a1d56debSopenharmony_ci            assert_eq!(result, "Hello World");
1912a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
1913a1d56debSopenharmony_ci            // Use the function to set the content to "New String".
1914a1d56debSopenharmony_ci            let str = str_to_c_char("New String");
1915a1d56debSopenharmony_ci            assert_eq!(ylong_json_set_value_to_string(string, str), 1);
1916a1d56debSopenharmony_ci            // Check whether the Settings are successful.
1917a1d56debSopenharmony_ci            ylong_json_get_value_from_string(string, &mut content as *mut *mut c_char);
1918a1d56debSopenharmony_ci            let result = String::from_utf8_unchecked(CStr::from_ptr(content).to_bytes().to_vec());
1919a1d56debSopenharmony_ci            assert_eq!(result, "New String");
1920a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
1921a1d56debSopenharmony_ci            ylong_json_delete(string);
1922a1d56debSopenharmony_ci
1923a1d56debSopenharmony_ci            let null = ylong_json_create_null();
1924a1d56debSopenharmony_ci            let str = str_to_c_char("New String");
1925a1d56debSopenharmony_ci            assert_eq!(ylong_json_set_value_to_string(null, str), 0);
1926a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
1927a1d56debSopenharmony_ci            ylong_json_delete(null);
1928a1d56debSopenharmony_ci        }
1929a1d56debSopenharmony_ci    }
1930a1d56debSopenharmony_ci
1931a1d56debSopenharmony_ci    /// UT test for `ylong_json_create_array`.
1932a1d56debSopenharmony_ci    ///
1933a1d56debSopenharmony_ci    /// # Title
1934a1d56debSopenharmony_ci    /// ut_ylong_json_create_array
1935a1d56debSopenharmony_ci    ///
1936a1d56debSopenharmony_ci    /// # Brief
1937a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_create_array` to create an array.
1938a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
1939a1d56debSopenharmony_ci    #[test]
1940a1d56debSopenharmony_ci    fn ut_ylong_json_create_array() {
1941a1d56debSopenharmony_ci        unsafe {
1942a1d56debSopenharmony_ci            let array = ylong_json_create_array();
1943a1d56debSopenharmony_ci            let result = ylong_json_print_unformatted(array);
1944a1d56debSopenharmony_ci            let result = CString::from_raw(result).into_string().unwrap();
1945a1d56debSopenharmony_ci            assert_eq!(result, "[]");
1946a1d56debSopenharmony_ci            ylong_json_delete(array);
1947a1d56debSopenharmony_ci        }
1948a1d56debSopenharmony_ci    }
1949a1d56debSopenharmony_ci
1950a1d56debSopenharmony_ci    /// UT test for `ut_ylong_json_is_array`.
1951a1d56debSopenharmony_ci    ///
1952a1d56debSopenharmony_ci    /// # Title
1953a1d56debSopenharmony_ci    /// ut_ylong_json_is_array
1954a1d56debSopenharmony_ci    ///
1955a1d56debSopenharmony_ci    /// # Brief
1956a1d56debSopenharmony_ci    /// 1. Calls `long_json_is_array` to determine whether the value is an array.
1957a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
1958a1d56debSopenharmony_ci    #[test]
1959a1d56debSopenharmony_ci    fn ut_ylong_json_is_array() {
1960a1d56debSopenharmony_ci        unsafe {
1961a1d56debSopenharmony_ci            // Null ptr
1962a1d56debSopenharmony_ci            let array = null_mut();
1963a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_array(array), 0);
1964a1d56debSopenharmony_ci
1965a1d56debSopenharmony_ci            let array = ylong_json_create_array();
1966a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_array(array), 1);
1967a1d56debSopenharmony_ci            ylong_json_delete(array);
1968a1d56debSopenharmony_ci
1969a1d56debSopenharmony_ci            let null = ylong_json_create_null();
1970a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_array(null), 0);
1971a1d56debSopenharmony_ci            ylong_json_delete(null);
1972a1d56debSopenharmony_ci        }
1973a1d56debSopenharmony_ci    }
1974a1d56debSopenharmony_ci
1975a1d56debSopenharmony_ci    /// UT test for `ylong_json_get_array_size`.
1976a1d56debSopenharmony_ci    ///
1977a1d56debSopenharmony_ci    /// # Title
1978a1d56debSopenharmony_ci    /// ut_ylong_json_get_array_size
1979a1d56debSopenharmony_ci    ///
1980a1d56debSopenharmony_ci    /// # Brief
1981a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_get_array_size` to get size of the array.
1982a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
1983a1d56debSopenharmony_ci    #[test]
1984a1d56debSopenharmony_ci    fn ut_ylong_json_get_array_size() {
1985a1d56debSopenharmony_ci        unsafe {
1986a1d56debSopenharmony_ci            // Null ptr
1987a1d56debSopenharmony_ci            let array = null_mut();
1988a1d56debSopenharmony_ci            let mut len = 0i32;
1989a1d56debSopenharmony_ci            assert_eq!(ylong_json_get_array_size(array, &mut len as *mut c_int), 0);
1990a1d56debSopenharmony_ci
1991a1d56debSopenharmony_ci            // Null ptr
1992a1d56debSopenharmony_ci            let array = ylong_json_create_array();
1993a1d56debSopenharmony_ci            let len = null_mut();
1994a1d56debSopenharmony_ci            assert_eq!(ylong_json_get_array_size(array, len), 0);
1995a1d56debSopenharmony_ci            ylong_json_delete(array);
1996a1d56debSopenharmony_ci
1997a1d56debSopenharmony_ci            let array = ylong_json_create_array();
1998a1d56debSopenharmony_ci            let mut len = 1i32;
1999a1d56debSopenharmony_ci            assert_eq!(ylong_json_get_array_size(array, &mut len as *mut c_int), 1);
2000a1d56debSopenharmony_ci            assert_eq!(len, 0);
2001a1d56debSopenharmony_ci            ylong_json_delete(array);
2002a1d56debSopenharmony_ci
2003a1d56debSopenharmony_ci            let null = ylong_json_create_null();
2004a1d56debSopenharmony_ci            let mut len = 1i32;
2005a1d56debSopenharmony_ci            assert_eq!(ylong_json_get_array_size(null, &mut len as *mut c_int), 0);
2006a1d56debSopenharmony_ci            ylong_json_delete(null);
2007a1d56debSopenharmony_ci        }
2008a1d56debSopenharmony_ci    }
2009a1d56debSopenharmony_ci
2010a1d56debSopenharmony_ci    /// UT test for `ylong_json_get_array_item`.
2011a1d56debSopenharmony_ci    ///
2012a1d56debSopenharmony_ci    /// # Title
2013a1d56debSopenharmony_ci    /// ut_ylong_json_get_array_item
2014a1d56debSopenharmony_ci    ///
2015a1d56debSopenharmony_ci    /// # Brief
2016a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_get_array_item` to get an item of the array.
2017a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
2018a1d56debSopenharmony_ci    #[test]
2019a1d56debSopenharmony_ci    fn ut_ylong_json_get_array_item() {
2020a1d56debSopenharmony_ci        unsafe {
2021a1d56debSopenharmony_ci            // Null ptr
2022a1d56debSopenharmony_ci            let array = null_mut();
2023a1d56debSopenharmony_ci            assert!(ylong_json_get_array_item(array, 0).is_null());
2024a1d56debSopenharmony_ci
2025a1d56debSopenharmony_ci            const TEXT: &str = "[null, 1.0, true, \"Test\"]";
2026a1d56debSopenharmony_ci            let str = str_to_c_char(TEXT);
2027a1d56debSopenharmony_ci            let mut msg = null_mut();
2028a1d56debSopenharmony_ci            let array = ylong_json_parse(str, &mut msg as *mut *mut c_char);
2029a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
2030a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_array(array), 1);
2031a1d56debSopenharmony_ci
2032a1d56debSopenharmony_ci            let item0 = ylong_json_get_array_item(array, 0);
2033a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_null(item0), 1);
2034a1d56debSopenharmony_ci
2035a1d56debSopenharmony_ci            let item1 = ylong_json_get_array_item(array, 1);
2036a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_double_number(item1), 1);
2037a1d56debSopenharmony_ci            let mut number = 0f64;
2038a1d56debSopenharmony_ci            assert_eq!(
2039a1d56debSopenharmony_ci                ylong_json_get_double_value_from_number(item1, &mut number as *mut c_double),
2040a1d56debSopenharmony_ci                1
2041a1d56debSopenharmony_ci            );
2042a1d56debSopenharmony_ci            assert_eq!(number, 1.0);
2043a1d56debSopenharmony_ci
2044a1d56debSopenharmony_ci            let item2 = ylong_json_get_array_item(array, 2);
2045a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_bool(item2), 1);
2046a1d56debSopenharmony_ci            let mut bool = 0i32;
2047a1d56debSopenharmony_ci            assert_eq!(
2048a1d56debSopenharmony_ci                ylong_json_get_value_from_bool(item2, &mut bool as *mut c_int),
2049a1d56debSopenharmony_ci                1
2050a1d56debSopenharmony_ci            );
2051a1d56debSopenharmony_ci            assert_eq!(bool, 1i32);
2052a1d56debSopenharmony_ci
2053a1d56debSopenharmony_ci            let item3 = ylong_json_get_array_item(array, 3);
2054a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_string(item3), 1);
2055a1d56debSopenharmony_ci            let mut content = null_mut();
2056a1d56debSopenharmony_ci            assert_eq!(
2057a1d56debSopenharmony_ci                ylong_json_get_value_from_string(item3, &mut content as *mut *mut c_char),
2058a1d56debSopenharmony_ci                1
2059a1d56debSopenharmony_ci            );
2060a1d56debSopenharmony_ci            let result = String::from_utf8_unchecked(CStr::from_ptr(content).to_bytes().to_vec());
2061a1d56debSopenharmony_ci            assert_eq!(result, "Test");
2062a1d56debSopenharmony_ci
2063a1d56debSopenharmony_ci            assert!(ylong_json_get_array_item(array, 4).is_null());
2064a1d56debSopenharmony_ci
2065a1d56debSopenharmony_ci            ylong_json_delete(array);
2066a1d56debSopenharmony_ci
2067a1d56debSopenharmony_ci            let null = ylong_json_create_null();
2068a1d56debSopenharmony_ci            assert!(ylong_json_get_array_item(null, 0).is_null());
2069a1d56debSopenharmony_ci            ylong_json_delete(null);
2070a1d56debSopenharmony_ci        }
2071a1d56debSopenharmony_ci    }
2072a1d56debSopenharmony_ci
2073a1d56debSopenharmony_ci    /// UT test for `ylong_json_add_item_to_array`.
2074a1d56debSopenharmony_ci    ///
2075a1d56debSopenharmony_ci    /// # Title
2076a1d56debSopenharmony_ci    /// ut_ylong_json_add_item_to_array
2077a1d56debSopenharmony_ci    ///
2078a1d56debSopenharmony_ci    /// # Brief
2079a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_add_item_to_array` to add an item to the array.
2080a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
2081a1d56debSopenharmony_ci    #[test]
2082a1d56debSopenharmony_ci    fn ut_ylong_json_add_item_to_array() {
2083a1d56debSopenharmony_ci        unsafe {
2084a1d56debSopenharmony_ci            // Null ptr
2085a1d56debSopenharmony_ci            let array = null_mut();
2086a1d56debSopenharmony_ci            let item = ylong_json_create_null();
2087a1d56debSopenharmony_ci            assert_eq!(ylong_json_add_item_to_array(array, item), 0);
2088a1d56debSopenharmony_ci            ylong_json_delete(item);
2089a1d56debSopenharmony_ci
2090a1d56debSopenharmony_ci            let array = ylong_json_create_array();
2091a1d56debSopenharmony_ci            let item = null_mut();
2092a1d56debSopenharmony_ci            assert_eq!(ylong_json_add_item_to_array(array, item), 0);
2093a1d56debSopenharmony_ci            ylong_json_delete(array);
2094a1d56debSopenharmony_ci
2095a1d56debSopenharmony_ci            let array = ylong_json_create_array();
2096a1d56debSopenharmony_ci            let null = ylong_json_create_null();
2097a1d56debSopenharmony_ci            assert_eq!(ylong_json_add_item_to_array(array, null), 1);
2098a1d56debSopenharmony_ci            let result = ylong_json_print_unformatted(array);
2099a1d56debSopenharmony_ci            let result = CString::from_raw(result).into_string().unwrap();
2100a1d56debSopenharmony_ci            assert_eq!(result, "[null]");
2101a1d56debSopenharmony_ci            ylong_json_delete(array);
2102a1d56debSopenharmony_ci
2103a1d56debSopenharmony_ci            let null = ylong_json_create_null();
2104a1d56debSopenharmony_ci            let null2 = ylong_json_create_null();
2105a1d56debSopenharmony_ci            assert_eq!(ylong_json_add_item_to_array(null, null2), 0);
2106a1d56debSopenharmony_ci            ylong_json_delete(null);
2107a1d56debSopenharmony_ci            ylong_json_delete(null2);
2108a1d56debSopenharmony_ci        }
2109a1d56debSopenharmony_ci    }
2110a1d56debSopenharmony_ci
2111a1d56debSopenharmony_ci    /// UT test for `ylong_json_replace_item_in_array`.
2112a1d56debSopenharmony_ci    ///
2113a1d56debSopenharmony_ci    /// # Title
2114a1d56debSopenharmony_ci    /// ut_ylong_json_replace_item_in_array
2115a1d56debSopenharmony_ci    ///
2116a1d56debSopenharmony_ci    /// # Brief
2117a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_replace_item_in_array` to replace an item in the array.
2118a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
2119a1d56debSopenharmony_ci    #[test]
2120a1d56debSopenharmony_ci    fn ut_ylong_json_replace_item_in_array() {
2121a1d56debSopenharmony_ci        unsafe {
2122a1d56debSopenharmony_ci            // Null ptr
2123a1d56debSopenharmony_ci            let array = null_mut();
2124a1d56debSopenharmony_ci            let item = ylong_json_create_null();
2125a1d56debSopenharmony_ci            assert_eq!(ylong_json_replace_array_item_by_index(array, 0, item), 0);
2126a1d56debSopenharmony_ci            ylong_json_delete(item);
2127a1d56debSopenharmony_ci
2128a1d56debSopenharmony_ci            // Null ptr
2129a1d56debSopenharmony_ci            let array = ylong_json_create_array();
2130a1d56debSopenharmony_ci            let item = null_mut();
2131a1d56debSopenharmony_ci            assert_eq!(ylong_json_replace_array_item_by_index(array, 0, item), 0);
2132a1d56debSopenharmony_ci            ylong_json_delete(array);
2133a1d56debSopenharmony_ci
2134a1d56debSopenharmony_ci            let array = ylong_json_create_array();
2135a1d56debSopenharmony_ci            let null = ylong_json_create_null();
2136a1d56debSopenharmony_ci            assert_eq!(ylong_json_add_item_to_array(array, null), 1);
2137a1d56debSopenharmony_ci            let result = ylong_json_print_unformatted(array);
2138a1d56debSopenharmony_ci            let result = CString::from_raw(result).into_string().unwrap();
2139a1d56debSopenharmony_ci            assert_eq!(result, "[null]");
2140a1d56debSopenharmony_ci            let replace = ylong_json_create_bool(1);
2141a1d56debSopenharmony_ci            assert_eq!(ylong_json_replace_array_item_by_index(array, 0, replace), 1);
2142a1d56debSopenharmony_ci            let result = ylong_json_print_unformatted(array);
2143a1d56debSopenharmony_ci            let result = CString::from_raw(result).into_string().unwrap();
2144a1d56debSopenharmony_ci            assert_eq!(result, "[true]");
2145a1d56debSopenharmony_ci            ylong_json_delete(array);
2146a1d56debSopenharmony_ci
2147a1d56debSopenharmony_ci            let null = ylong_json_create_null();
2148a1d56debSopenharmony_ci            let null2 = ylong_json_create_null();
2149a1d56debSopenharmony_ci            assert_eq!(ylong_json_replace_array_item_by_index(null, 0, null2), 0);
2150a1d56debSopenharmony_ci            ylong_json_delete(null);
2151a1d56debSopenharmony_ci            ylong_json_delete(null2);
2152a1d56debSopenharmony_ci        }
2153a1d56debSopenharmony_ci    }
2154a1d56debSopenharmony_ci
2155a1d56debSopenharmony_ci    /// UT test for `ylong_json_remove_array_item_by_index`.
2156a1d56debSopenharmony_ci    ///
2157a1d56debSopenharmony_ci    /// # Title
2158a1d56debSopenharmony_ci    /// ut_ylong_json_remove_array_item_by_index
2159a1d56debSopenharmony_ci    ///
2160a1d56debSopenharmony_ci    /// # Brief
2161a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_remove_array_item_by_index` to remove an item in the array by index.
2162a1d56debSopenharmony_ci    /// (Uses the method 'remove' of Array.)
2163a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
2164a1d56debSopenharmony_ci    #[test]
2165a1d56debSopenharmony_ci    fn ut_ylong_json_remove_array_item_by_index() {
2166a1d56debSopenharmony_ci        unsafe {
2167a1d56debSopenharmony_ci            // Null ptr
2168a1d56debSopenharmony_ci            let array = null_mut();
2169a1d56debSopenharmony_ci            assert!(ylong_json_remove_array_item_by_index(array, 0).is_null());
2170a1d56debSopenharmony_ci
2171a1d56debSopenharmony_ci            const TEXT: &str = "[null, 1.0, true, \"Test\"]";
2172a1d56debSopenharmony_ci            let str = str_to_c_char(TEXT);
2173a1d56debSopenharmony_ci            let mut msg = null_mut();
2174a1d56debSopenharmony_ci            let array = ylong_json_parse(str, &mut msg as *mut *mut c_char);
2175a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
2176a1d56debSopenharmony_ci            let mut len = 0i32;
2177a1d56debSopenharmony_ci            assert_eq!(ylong_json_get_array_size(array, &mut len as *mut c_int), 1);
2178a1d56debSopenharmony_ci            assert_eq!(len, 4);
2179a1d56debSopenharmony_ci
2180a1d56debSopenharmony_ci            let item0 = ylong_json_remove_array_item_by_index(array, 0);
2181a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_null(item0), 1);
2182a1d56debSopenharmony_ci            assert_eq!(ylong_json_get_array_size(array, &mut len as *mut c_int), 1);
2183a1d56debSopenharmony_ci            assert_eq!(len, 3);
2184a1d56debSopenharmony_ci            ylong_json_delete(item0);
2185a1d56debSopenharmony_ci
2186a1d56debSopenharmony_ci            let item3 = ylong_json_remove_array_item_by_index(array, 2);
2187a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_string(item3), 1);
2188a1d56debSopenharmony_ci            assert_eq!(ylong_json_get_array_size(array, &mut len as *mut c_int), 1);
2189a1d56debSopenharmony_ci            assert_eq!(len, 2);
2190a1d56debSopenharmony_ci            ylong_json_delete(item3);
2191a1d56debSopenharmony_ci
2192a1d56debSopenharmony_ci            let item1 = ylong_json_remove_array_item_by_index(array, 0);
2193a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_number(item1), 1);
2194a1d56debSopenharmony_ci            assert_eq!(ylong_json_get_array_size(array, &mut len as *mut c_int), 1);
2195a1d56debSopenharmony_ci            assert_eq!(len, 1);
2196a1d56debSopenharmony_ci            ylong_json_delete(item1);
2197a1d56debSopenharmony_ci
2198a1d56debSopenharmony_ci            let item2 = ylong_json_remove_array_item_by_index(array, 0);
2199a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_bool(item2), 1);
2200a1d56debSopenharmony_ci            assert_eq!(ylong_json_get_array_size(array, &mut len as *mut c_int), 1);
2201a1d56debSopenharmony_ci            assert_eq!(len, 0);
2202a1d56debSopenharmony_ci            ylong_json_delete(item2);
2203a1d56debSopenharmony_ci            ylong_json_delete(array);
2204a1d56debSopenharmony_ci
2205a1d56debSopenharmony_ci            let null = ylong_json_create_null();
2206a1d56debSopenharmony_ci            let item = ylong_json_remove_array_item_by_index(null, 0);
2207a1d56debSopenharmony_ci            assert!(item.is_null());
2208a1d56debSopenharmony_ci            ylong_json_delete(null);
2209a1d56debSopenharmony_ci        }
2210a1d56debSopenharmony_ci    }
2211a1d56debSopenharmony_ci
2212a1d56debSopenharmony_ci    /// UT test for `ylong_json_delete_array_item_by_index`.
2213a1d56debSopenharmony_ci    ///
2214a1d56debSopenharmony_ci    /// # Title
2215a1d56debSopenharmony_ci    /// ut_ylong_json_delete_array_item_by_index
2216a1d56debSopenharmony_ci    ///
2217a1d56debSopenharmony_ci    /// # Brief
2218a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_delete_array_item_by_index` to delete an item in the array by index.
2219a1d56debSopenharmony_ci    /// (Uses the method 'remove' of underlying data structure.)
2220a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
2221a1d56debSopenharmony_ci    #[test]
2222a1d56debSopenharmony_ci    fn ut_ylong_json_delete_array_item_by_index() {
2223a1d56debSopenharmony_ci        unsafe {
2224a1d56debSopenharmony_ci            // Null ptr scene, if the process does not exit abnormally, it is successful.
2225a1d56debSopenharmony_ci            let array = null_mut();
2226a1d56debSopenharmony_ci            ylong_json_delete_array_item_by_index(array, 0);
2227a1d56debSopenharmony_ci
2228a1d56debSopenharmony_ci            const TEXT: &str = "[null, 1.0, true, \"Test\"]";
2229a1d56debSopenharmony_ci            let str = str_to_c_char(TEXT);
2230a1d56debSopenharmony_ci            let mut msg = null_mut();
2231a1d56debSopenharmony_ci            let array = ylong_json_parse(str, &mut msg as *mut *mut c_char);
2232a1d56debSopenharmony_ci            let mut len = 0i32;
2233a1d56debSopenharmony_ci            assert_eq!(ylong_json_get_array_size(array, &mut len as *mut c_int), 1);
2234a1d56debSopenharmony_ci            assert_eq!(len, 4);
2235a1d56debSopenharmony_ci
2236a1d56debSopenharmony_ci            ylong_json_delete_array_item_by_index(array, 0);
2237a1d56debSopenharmony_ci            assert_eq!(ylong_json_get_array_size(array, &mut len as *mut c_int), 1);
2238a1d56debSopenharmony_ci            assert_eq!(len, 3);
2239a1d56debSopenharmony_ci
2240a1d56debSopenharmony_ci            ylong_json_delete_array_item_by_index(array, 0);
2241a1d56debSopenharmony_ci            assert_eq!(ylong_json_get_array_size(array, &mut len as *mut c_int), 1);
2242a1d56debSopenharmony_ci            assert_eq!(len, 2);
2243a1d56debSopenharmony_ci
2244a1d56debSopenharmony_ci            ylong_json_delete_array_item_by_index(array, 0);
2245a1d56debSopenharmony_ci            assert_eq!(ylong_json_get_array_size(array, &mut len as *mut c_int), 1);
2246a1d56debSopenharmony_ci            assert_eq!(len, 1);
2247a1d56debSopenharmony_ci
2248a1d56debSopenharmony_ci            ylong_json_delete_array_item_by_index(array, 0);
2249a1d56debSopenharmony_ci            assert_eq!(ylong_json_get_array_size(array, &mut len as *mut c_int), 1);
2250a1d56debSopenharmony_ci            assert_eq!(len, 0);
2251a1d56debSopenharmony_ci
2252a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
2253a1d56debSopenharmony_ci            ylong_json_delete(array);
2254a1d56debSopenharmony_ci
2255a1d56debSopenharmony_ci            let null = ylong_json_create_null();
2256a1d56debSopenharmony_ci            ylong_json_delete_array_item_by_index(null, 0);
2257a1d56debSopenharmony_ci            ylong_json_delete(null);
2258a1d56debSopenharmony_ci        }
2259a1d56debSopenharmony_ci    }
2260a1d56debSopenharmony_ci
2261a1d56debSopenharmony_ci    /// UT test for `ylong_json_get_array_node`.
2262a1d56debSopenharmony_ci    ///
2263a1d56debSopenharmony_ci    /// # Title
2264a1d56debSopenharmony_ci    /// ut_ylong_json_get_array_node
2265a1d56debSopenharmony_ci    ///
2266a1d56debSopenharmony_ci    /// # Brief
2267a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_get_array_node` to get an array node.
2268a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
2269a1d56debSopenharmony_ci    #[cfg(feature = "list_array")]
2270a1d56debSopenharmony_ci    #[test]
2271a1d56debSopenharmony_ci    fn ut_ylong_json_get_array_node() {
2272a1d56debSopenharmony_ci        unsafe {
2273a1d56debSopenharmony_ci            // Null ptr
2274a1d56debSopenharmony_ci            let array = null_mut();
2275a1d56debSopenharmony_ci            assert!(ylong_json_get_array_node(array, 0).is_null());
2276a1d56debSopenharmony_ci
2277a1d56debSopenharmony_ci            const TEXT: &str = "[null, 1.0, true, \"Test\"]";
2278a1d56debSopenharmony_ci            let str = str_to_c_char(TEXT);
2279a1d56debSopenharmony_ci            let mut msg = null_mut();
2280a1d56debSopenharmony_ci            let array = ylong_json_parse(str, &mut msg as *mut *mut c_char);
2281a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
2282a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_array(array), 1);
2283a1d56debSopenharmony_ci
2284a1d56debSopenharmony_ci            let node0 = ylong_json_get_array_node(array, 0);
2285a1d56debSopenharmony_ci            assert!(!node0.is_null());
2286a1d56debSopenharmony_ci
2287a1d56debSopenharmony_ci            let node1 = ylong_json_get_array_node(array, 1);
2288a1d56debSopenharmony_ci            assert!(!node1.is_null());
2289a1d56debSopenharmony_ci
2290a1d56debSopenharmony_ci            let node2 = ylong_json_get_array_node(array, 2);
2291a1d56debSopenharmony_ci            assert!(!node2.is_null());
2292a1d56debSopenharmony_ci
2293a1d56debSopenharmony_ci            let node3 = ylong_json_get_array_node(array, 3);
2294a1d56debSopenharmony_ci            assert!(!node3.is_null());
2295a1d56debSopenharmony_ci
2296a1d56debSopenharmony_ci            let node4 = ylong_json_get_array_node(array, 4);
2297a1d56debSopenharmony_ci            assert!(node4.is_null());
2298a1d56debSopenharmony_ci
2299a1d56debSopenharmony_ci            ylong_json_delete(array);
2300a1d56debSopenharmony_ci
2301a1d56debSopenharmony_ci            let null = ylong_json_create_null();
2302a1d56debSopenharmony_ci            assert!(ylong_json_get_array_node(null, 0).is_null());
2303a1d56debSopenharmony_ci            ylong_json_delete(null);
2304a1d56debSopenharmony_ci        }
2305a1d56debSopenharmony_ci    }
2306a1d56debSopenharmony_ci
2307a1d56debSopenharmony_ci    /// UT test for `ylong_json_get_item_from_array_node`.
2308a1d56debSopenharmony_ci    ///
2309a1d56debSopenharmony_ci    /// # Title
2310a1d56debSopenharmony_ci    /// ut_ylong_json_get_item_from_array_node
2311a1d56debSopenharmony_ci    ///
2312a1d56debSopenharmony_ci    /// # Brief
2313a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_get_item_from_array_node` to get the item of an array node.
2314a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
2315a1d56debSopenharmony_ci    #[cfg(feature = "list_array")]
2316a1d56debSopenharmony_ci    #[test]
2317a1d56debSopenharmony_ci    fn ut_ylong_json_get_item_from_array_node() {
2318a1d56debSopenharmony_ci        unsafe {
2319a1d56debSopenharmony_ci            // Null ptr
2320a1d56debSopenharmony_ci            let node = null_mut();
2321a1d56debSopenharmony_ci            assert!(ylong_json_get_array_node(node, 0).is_null());
2322a1d56debSopenharmony_ci
2323a1d56debSopenharmony_ci            const TEXT: &str = "[null, 1.0, true, \"Test\"]";
2324a1d56debSopenharmony_ci            let str = str_to_c_char(TEXT);
2325a1d56debSopenharmony_ci            let mut msg = null_mut();
2326a1d56debSopenharmony_ci            let array = ylong_json_parse(str, &mut msg as *mut *mut c_char);
2327a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
2328a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_array(array), 1);
2329a1d56debSopenharmony_ci
2330a1d56debSopenharmony_ci            let node0 = ylong_json_get_array_node(array, 0);
2331a1d56debSopenharmony_ci            assert!(!node0.is_null());
2332a1d56debSopenharmony_ci            let item0 = ylong_json_get_item_from_array_node(node0);
2333a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_null(item0), 1);
2334a1d56debSopenharmony_ci
2335a1d56debSopenharmony_ci            let node1 = ylong_json_get_array_node(array, 1);
2336a1d56debSopenharmony_ci            assert!(!node1.is_null());
2337a1d56debSopenharmony_ci            let item1 = ylong_json_get_item_from_array_node(node1);
2338a1d56debSopenharmony_ci            let mut number = 0f64;
2339a1d56debSopenharmony_ci            assert_eq!(
2340a1d56debSopenharmony_ci                ylong_json_get_double_value_from_number(item1, &mut number as *mut c_double),
2341a1d56debSopenharmony_ci                1
2342a1d56debSopenharmony_ci            );
2343a1d56debSopenharmony_ci            assert_eq!(number, 1.0);
2344a1d56debSopenharmony_ci
2345a1d56debSopenharmony_ci            let node2 = ylong_json_get_array_node(array, 2);
2346a1d56debSopenharmony_ci            assert!(!node2.is_null());
2347a1d56debSopenharmony_ci            let item2 = ylong_json_get_item_from_array_node(node2);
2348a1d56debSopenharmony_ci            let mut bool = 0i32;
2349a1d56debSopenharmony_ci            assert_eq!(
2350a1d56debSopenharmony_ci                ylong_json_get_value_from_bool(item2, &mut bool as *mut c_int),
2351a1d56debSopenharmony_ci                1
2352a1d56debSopenharmony_ci            );
2353a1d56debSopenharmony_ci            assert_eq!(bool, 1i32);
2354a1d56debSopenharmony_ci
2355a1d56debSopenharmony_ci            let node3 = ylong_json_get_array_node(array, 3);
2356a1d56debSopenharmony_ci            assert!(!node3.is_null());
2357a1d56debSopenharmony_ci            let item3 = ylong_json_get_item_from_array_node(node3);
2358a1d56debSopenharmony_ci            let mut content = null_mut();
2359a1d56debSopenharmony_ci            assert_eq!(
2360a1d56debSopenharmony_ci                ylong_json_get_value_from_string(item3, &mut content as *mut *mut c_char),
2361a1d56debSopenharmony_ci                1
2362a1d56debSopenharmony_ci            );
2363a1d56debSopenharmony_ci            let result = String::from_utf8_unchecked(CStr::from_ptr(content).to_bytes().to_vec());
2364a1d56debSopenharmony_ci            assert_eq!(result, "Test");
2365a1d56debSopenharmony_ci
2366a1d56debSopenharmony_ci            ylong_json_delete(array);
2367a1d56debSopenharmony_ci        }
2368a1d56debSopenharmony_ci    }
2369a1d56debSopenharmony_ci
2370a1d56debSopenharmony_ci    /// UT test for `ylong_json_add_item_to_array_then_get_node`.
2371a1d56debSopenharmony_ci    ///
2372a1d56debSopenharmony_ci    /// # Title
2373a1d56debSopenharmony_ci    /// ut_ylong_json_add_item_to_array_then_get_node
2374a1d56debSopenharmony_ci    ///
2375a1d56debSopenharmony_ci    /// # Brief
2376a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_add_item_to_array_then_get_node` to add an item to array and get the corresponding node.
2377a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
2378a1d56debSopenharmony_ci    #[cfg(feature = "list_array")]
2379a1d56debSopenharmony_ci    #[test]
2380a1d56debSopenharmony_ci    fn ut_ylong_json_add_item_to_array_then_get_node() {
2381a1d56debSopenharmony_ci        unsafe {
2382a1d56debSopenharmony_ci            // Null ptr
2383a1d56debSopenharmony_ci            let array = null_mut();
2384a1d56debSopenharmony_ci            let item = ylong_json_create_null();
2385a1d56debSopenharmony_ci            assert!(ylong_json_add_item_to_array_then_get_node(array, item).is_null());
2386a1d56debSopenharmony_ci            ylong_json_delete(item);
2387a1d56debSopenharmony_ci
2388a1d56debSopenharmony_ci            // Null ptr
2389a1d56debSopenharmony_ci            let array = ylong_json_create_array();
2390a1d56debSopenharmony_ci            let item = null_mut();
2391a1d56debSopenharmony_ci            assert!(ylong_json_add_item_to_array_then_get_node(array, item).is_null());
2392a1d56debSopenharmony_ci            ylong_json_delete(array);
2393a1d56debSopenharmony_ci
2394a1d56debSopenharmony_ci            let array = ylong_json_create_array();
2395a1d56debSopenharmony_ci            let null = ylong_json_create_null();
2396a1d56debSopenharmony_ci            let node0 = ylong_json_add_item_to_array_then_get_node(array, null);
2397a1d56debSopenharmony_ci            assert!(!node0.is_null());
2398a1d56debSopenharmony_ci            let mut len = 0i32;
2399a1d56debSopenharmony_ci            assert_eq!(ylong_json_get_array_size(array, &mut len as *mut c_int), 1);
2400a1d56debSopenharmony_ci            assert_eq!(len, 1);
2401a1d56debSopenharmony_ci            let item0 = ylong_json_get_item_from_array_node(node0);
2402a1d56debSopenharmony_ci            assert!(!item0.is_null());
2403a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_null(item0), 1);
2404a1d56debSopenharmony_ci            let item0 = ylong_json_remove_array_node(node0);
2405a1d56debSopenharmony_ci            ylong_json_delete(item0);
2406a1d56debSopenharmony_ci            assert_eq!(ylong_json_get_array_size(array, &mut len as *mut c_int), 1);
2407a1d56debSopenharmony_ci            assert_eq!(len, 0);
2408a1d56debSopenharmony_ci            ylong_json_delete(array);
2409a1d56debSopenharmony_ci        }
2410a1d56debSopenharmony_ci    }
2411a1d56debSopenharmony_ci
2412a1d56debSopenharmony_ci    /// UT test for `ylong_json_replace_item_of_array_node`.
2413a1d56debSopenharmony_ci    ///
2414a1d56debSopenharmony_ci    /// # Title
2415a1d56debSopenharmony_ci    /// ut_ylong_json_replace_item_of_array_node
2416a1d56debSopenharmony_ci    ///
2417a1d56debSopenharmony_ci    /// # Brief
2418a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_replace_item_of_array_node` to replace the item of an array node.
2419a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
2420a1d56debSopenharmony_ci    #[cfg(feature = "list_array")]
2421a1d56debSopenharmony_ci    #[test]
2422a1d56debSopenharmony_ci    fn ut_ylong_json_replace_item_of_array_node() {
2423a1d56debSopenharmony_ci        unsafe {
2424a1d56debSopenharmony_ci            // Null ptr
2425a1d56debSopenharmony_ci            let node = null_mut();
2426a1d56debSopenharmony_ci            let item = ylong_json_create_null();
2427a1d56debSopenharmony_ci            assert_eq!(ylong_json_replace_item_of_array_node(node, item), 0);
2428a1d56debSopenharmony_ci            ylong_json_delete(item);
2429a1d56debSopenharmony_ci
2430a1d56debSopenharmony_ci            // Null ptr scene, if the process does not exit abnormally, it is successful.
2431a1d56debSopenharmony_ci            let array = ylong_json_create_array();
2432a1d56debSopenharmony_ci            let null = ylong_json_create_null();
2433a1d56debSopenharmony_ci            let node = ylong_json_add_item_to_array_then_get_node(array, null);
2434a1d56debSopenharmony_ci            let item = null_mut();
2435a1d56debSopenharmony_ci            assert_eq!(ylong_json_replace_item_of_array_node(node, item), 0);
2436a1d56debSopenharmony_ci            ylong_json_delete(array);
2437a1d56debSopenharmony_ci
2438a1d56debSopenharmony_ci            let array = ylong_json_create_array();
2439a1d56debSopenharmony_ci            let null = ylong_json_create_null();
2440a1d56debSopenharmony_ci            let node = ylong_json_add_item_to_array_then_get_node(array, null);
2441a1d56debSopenharmony_ci            let result = ylong_json_print_unformatted(array);
2442a1d56debSopenharmony_ci            let result = CString::from_raw(result).into_string().unwrap();
2443a1d56debSopenharmony_ci            assert_eq!(result, "[null]");
2444a1d56debSopenharmony_ci
2445a1d56debSopenharmony_ci            let bool = ylong_json_create_bool(1);
2446a1d56debSopenharmony_ci            assert_eq!(ylong_json_replace_item_of_array_node(node, bool), 1);
2447a1d56debSopenharmony_ci            let result = ylong_json_print_unformatted(array);
2448a1d56debSopenharmony_ci            let result = CString::from_raw(result).into_string().unwrap();
2449a1d56debSopenharmony_ci            assert_eq!(result, "[true]");
2450a1d56debSopenharmony_ci
2451a1d56debSopenharmony_ci            ylong_json_delete(array);
2452a1d56debSopenharmony_ci        }
2453a1d56debSopenharmony_ci    }
2454a1d56debSopenharmony_ci
2455a1d56debSopenharmony_ci    /// UT test for `ylong_json_remove_array_node`.
2456a1d56debSopenharmony_ci    ///
2457a1d56debSopenharmony_ci    /// # Title
2458a1d56debSopenharmony_ci    /// ut_ylong_json_remove_array_node
2459a1d56debSopenharmony_ci    ///
2460a1d56debSopenharmony_ci    /// # Brief
2461a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_remove_array_node` to remove an array node.
2462a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
2463a1d56debSopenharmony_ci    #[cfg(feature = "list_array")]
2464a1d56debSopenharmony_ci    #[test]
2465a1d56debSopenharmony_ci    fn ut_ylong_json_remove_array_node() {
2466a1d56debSopenharmony_ci        unsafe {
2467a1d56debSopenharmony_ci            // Null ptr
2468a1d56debSopenharmony_ci            let node = null_mut();
2469a1d56debSopenharmony_ci            assert!(ylong_json_remove_array_node(node).is_null());
2470a1d56debSopenharmony_ci
2471a1d56debSopenharmony_ci            const TEXT: &str = "[null, 1.0, true, \"Test\"]";
2472a1d56debSopenharmony_ci            let str = str_to_c_char(TEXT);
2473a1d56debSopenharmony_ci            let mut msg = null_mut();
2474a1d56debSopenharmony_ci            let array = ylong_json_parse(str, &mut msg as *mut *mut c_char);
2475a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
2476a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_array(array), 1);
2477a1d56debSopenharmony_ci            let mut len = 0i32;
2478a1d56debSopenharmony_ci            assert_eq!(ylong_json_get_array_size(array, &mut len as *mut c_int), 1);
2479a1d56debSopenharmony_ci            assert_eq!(len, 4);
2480a1d56debSopenharmony_ci
2481a1d56debSopenharmony_ci            let node0 = ylong_json_get_array_node(array, 0);
2482a1d56debSopenharmony_ci            assert!(!node0.is_null());
2483a1d56debSopenharmony_ci            let item0 = ylong_json_remove_array_node(node0);
2484a1d56debSopenharmony_ci            assert!(!item0.is_null());
2485a1d56debSopenharmony_ci            assert_eq!(ylong_json_get_array_size(array, &mut len as *mut c_int), 1);
2486a1d56debSopenharmony_ci            assert_eq!(len, 3);
2487a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_null(item0), 1);
2488a1d56debSopenharmony_ci            ylong_json_delete(item0);
2489a1d56debSopenharmony_ci
2490a1d56debSopenharmony_ci            let node0 = ylong_json_get_array_node(array, 0);
2491a1d56debSopenharmony_ci            assert!(!node0.is_null());
2492a1d56debSopenharmony_ci            let item0 = ylong_json_remove_array_node(node0);
2493a1d56debSopenharmony_ci            assert!(!item0.is_null());
2494a1d56debSopenharmony_ci            assert_eq!(ylong_json_get_array_size(array, &mut len as *mut c_int), 1);
2495a1d56debSopenharmony_ci            assert_eq!(len, 2);
2496a1d56debSopenharmony_ci            let mut number = 0f64;
2497a1d56debSopenharmony_ci            assert_eq!(
2498a1d56debSopenharmony_ci                ylong_json_get_double_value_from_number(item0, &mut number as *mut c_double),
2499a1d56debSopenharmony_ci                1
2500a1d56debSopenharmony_ci            );
2501a1d56debSopenharmony_ci            assert_eq!(number, 1.0);
2502a1d56debSopenharmony_ci            ylong_json_delete(item0);
2503a1d56debSopenharmony_ci
2504a1d56debSopenharmony_ci            let node0 = ylong_json_get_array_node(array, 0);
2505a1d56debSopenharmony_ci            assert!(!node0.is_null());
2506a1d56debSopenharmony_ci            let item0 = ylong_json_remove_array_node(node0);
2507a1d56debSopenharmony_ci            assert!(!item0.is_null());
2508a1d56debSopenharmony_ci            assert_eq!(ylong_json_get_array_size(array, &mut len as *mut c_int), 1);
2509a1d56debSopenharmony_ci            assert_eq!(len, 1);
2510a1d56debSopenharmony_ci            let mut bool = 0i32;
2511a1d56debSopenharmony_ci            assert_eq!(
2512a1d56debSopenharmony_ci                ylong_json_get_value_from_bool(item0, &mut bool as *mut c_int),
2513a1d56debSopenharmony_ci                1
2514a1d56debSopenharmony_ci            );
2515a1d56debSopenharmony_ci            assert_eq!(bool, 1i32);
2516a1d56debSopenharmony_ci            ylong_json_delete(item0);
2517a1d56debSopenharmony_ci
2518a1d56debSopenharmony_ci            let node0 = ylong_json_get_array_node(array, 0);
2519a1d56debSopenharmony_ci            assert!(!node0.is_null());
2520a1d56debSopenharmony_ci            let item0 = ylong_json_remove_array_node(node0);
2521a1d56debSopenharmony_ci            assert!(!item0.is_null());
2522a1d56debSopenharmony_ci            assert_eq!(ylong_json_get_array_size(array, &mut len as *mut c_int), 1);
2523a1d56debSopenharmony_ci            assert_eq!(len, 0);
2524a1d56debSopenharmony_ci            let mut content = null_mut();
2525a1d56debSopenharmony_ci            assert_eq!(
2526a1d56debSopenharmony_ci                ylong_json_get_value_from_string(item0, &mut content as *mut *mut c_char),
2527a1d56debSopenharmony_ci                1
2528a1d56debSopenharmony_ci            );
2529a1d56debSopenharmony_ci            let result = String::from_utf8_unchecked(CStr::from_ptr(content).to_bytes().to_vec());
2530a1d56debSopenharmony_ci            assert_eq!(result, "Test");
2531a1d56debSopenharmony_ci            ylong_json_delete(item0);
2532a1d56debSopenharmony_ci
2533a1d56debSopenharmony_ci            ylong_json_delete(array);
2534a1d56debSopenharmony_ci        }
2535a1d56debSopenharmony_ci    }
2536a1d56debSopenharmony_ci
2537a1d56debSopenharmony_ci    /// UT test for `ylong_json_delete_array_node`.
2538a1d56debSopenharmony_ci    ///
2539a1d56debSopenharmony_ci    /// # Title
2540a1d56debSopenharmony_ci    /// ut_ylong_json_delete_array_node
2541a1d56debSopenharmony_ci    ///
2542a1d56debSopenharmony_ci    /// # Brief
2543a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_delete_array_node` to delete an array node.
2544a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
2545a1d56debSopenharmony_ci    #[cfg(feature = "list_array")]
2546a1d56debSopenharmony_ci    #[test]
2547a1d56debSopenharmony_ci    fn ut_ylong_json_delete_array_node() {
2548a1d56debSopenharmony_ci        unsafe {
2549a1d56debSopenharmony_ci            // Null ptr scene, if the process does not exit abnormally, it is successful.
2550a1d56debSopenharmony_ci            let node = null_mut();
2551a1d56debSopenharmony_ci            ylong_json_delete_array_node(node);
2552a1d56debSopenharmony_ci
2553a1d56debSopenharmony_ci            const TEXT: &str = "[null, 1.0, true, \"Test\"]";
2554a1d56debSopenharmony_ci            let str = str_to_c_char(TEXT);
2555a1d56debSopenharmony_ci            let mut msg = null_mut();
2556a1d56debSopenharmony_ci            let array = ylong_json_parse(str, &mut msg as *mut *mut c_char);
2557a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
2558a1d56debSopenharmony_ci            let mut len = 0i32;
2559a1d56debSopenharmony_ci            assert_eq!(ylong_json_get_array_size(array, &mut len as *mut c_int), 1);
2560a1d56debSopenharmony_ci            assert_eq!(len, 4);
2561a1d56debSopenharmony_ci
2562a1d56debSopenharmony_ci            let node0 = ylong_json_get_array_node(array, 0);
2563a1d56debSopenharmony_ci            ylong_json_delete_array_node(node0);
2564a1d56debSopenharmony_ci            assert_eq!(ylong_json_get_array_size(array, &mut len as *mut c_int), 1);
2565a1d56debSopenharmony_ci            assert_eq!(len, 3);
2566a1d56debSopenharmony_ci
2567a1d56debSopenharmony_ci            let node1 = ylong_json_get_array_node(array, 0);
2568a1d56debSopenharmony_ci            ylong_json_delete_array_node(node1);
2569a1d56debSopenharmony_ci            assert_eq!(ylong_json_get_array_size(array, &mut len as *mut c_int), 1);
2570a1d56debSopenharmony_ci            assert_eq!(len, 2);
2571a1d56debSopenharmony_ci
2572a1d56debSopenharmony_ci            let node2 = ylong_json_get_array_node(array, 0);
2573a1d56debSopenharmony_ci            ylong_json_delete_array_node(node2);
2574a1d56debSopenharmony_ci            assert_eq!(ylong_json_get_array_size(array, &mut len as *mut c_int), 1);
2575a1d56debSopenharmony_ci            assert_eq!(len, 1);
2576a1d56debSopenharmony_ci
2577a1d56debSopenharmony_ci            let node3 = ylong_json_get_array_node(array, 0);
2578a1d56debSopenharmony_ci            ylong_json_delete_array_node(node3);
2579a1d56debSopenharmony_ci            assert_eq!(ylong_json_get_array_size(array, &mut len as *mut c_int), 1);
2580a1d56debSopenharmony_ci            assert_eq!(len, 0);
2581a1d56debSopenharmony_ci
2582a1d56debSopenharmony_ci            ylong_json_delete(array);
2583a1d56debSopenharmony_ci        }
2584a1d56debSopenharmony_ci    }
2585a1d56debSopenharmony_ci
2586a1d56debSopenharmony_ci    /// UT test for `ylong_json_create_object`.
2587a1d56debSopenharmony_ci    ///
2588a1d56debSopenharmony_ci    /// # Title
2589a1d56debSopenharmony_ci    /// ut_ylong_json_create_object
2590a1d56debSopenharmony_ci    ///
2591a1d56debSopenharmony_ci    /// # Brief
2592a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_create_object` to create an object.
2593a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
2594a1d56debSopenharmony_ci    #[test]
2595a1d56debSopenharmony_ci    fn ut_ylong_json_create_object() {
2596a1d56debSopenharmony_ci        unsafe {
2597a1d56debSopenharmony_ci            let object = ylong_json_create_object();
2598a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_object(object), 1);
2599a1d56debSopenharmony_ci            let result = ylong_json_print_unformatted(object);
2600a1d56debSopenharmony_ci            let result = CString::from_raw(result).into_string().unwrap();
2601a1d56debSopenharmony_ci            assert_eq!(result, "{}");
2602a1d56debSopenharmony_ci            ylong_json_delete(object);
2603a1d56debSopenharmony_ci        }
2604a1d56debSopenharmony_ci    }
2605a1d56debSopenharmony_ci
2606a1d56debSopenharmony_ci    /// UT test for `ylong_json_is_object`.
2607a1d56debSopenharmony_ci    ///
2608a1d56debSopenharmony_ci    /// # Title
2609a1d56debSopenharmony_ci    /// ut_ylong_json_is_object
2610a1d56debSopenharmony_ci    ///
2611a1d56debSopenharmony_ci    /// # Brief
2612a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_is_object` to determine whether the value is object.
2613a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
2614a1d56debSopenharmony_ci    #[test]
2615a1d56debSopenharmony_ci    fn ut_ylong_json_is_object() {
2616a1d56debSopenharmony_ci        unsafe {
2617a1d56debSopenharmony_ci            // Null ptr
2618a1d56debSopenharmony_ci            let object = null_mut();
2619a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_object(object), 0);
2620a1d56debSopenharmony_ci
2621a1d56debSopenharmony_ci            let object = ylong_json_create_object();
2622a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_object(object), 1);
2623a1d56debSopenharmony_ci            ylong_json_delete(object);
2624a1d56debSopenharmony_ci
2625a1d56debSopenharmony_ci            let null = ylong_json_create_null();
2626a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_object(null), 0);
2627a1d56debSopenharmony_ci            ylong_json_delete(null);
2628a1d56debSopenharmony_ci        }
2629a1d56debSopenharmony_ci    }
2630a1d56debSopenharmony_ci
2631a1d56debSopenharmony_ci    /// UT test for `ylong_json_get_object_size`.
2632a1d56debSopenharmony_ci    ///
2633a1d56debSopenharmony_ci    /// # Title
2634a1d56debSopenharmony_ci    /// ut_ylong_json_get_object_size
2635a1d56debSopenharmony_ci    ///
2636a1d56debSopenharmony_ci    /// # Brief
2637a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_get_object_size` to get size of an object.
2638a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
2639a1d56debSopenharmony_ci    #[test]
2640a1d56debSopenharmony_ci    fn ut_ylong_json_get_object_size() {
2641a1d56debSopenharmony_ci        unsafe {
2642a1d56debSopenharmony_ci            // Null ptr
2643a1d56debSopenharmony_ci            let object = null_mut();
2644a1d56debSopenharmony_ci            let mut len = 0i32;
2645a1d56debSopenharmony_ci            assert_eq!(
2646a1d56debSopenharmony_ci                ylong_json_get_object_size(object, &mut len as *mut c_int),
2647a1d56debSopenharmony_ci                0
2648a1d56debSopenharmony_ci            );
2649a1d56debSopenharmony_ci
2650a1d56debSopenharmony_ci            // Null ptr
2651a1d56debSopenharmony_ci            let object = ylong_json_create_object();
2652a1d56debSopenharmony_ci            let len = null_mut();
2653a1d56debSopenharmony_ci            assert_eq!(ylong_json_get_object_size(object, len), 0);
2654a1d56debSopenharmony_ci            ylong_json_delete(object);
2655a1d56debSopenharmony_ci
2656a1d56debSopenharmony_ci            let object = ylong_json_create_object();
2657a1d56debSopenharmony_ci            let mut len = 1i32;
2658a1d56debSopenharmony_ci            assert_eq!(
2659a1d56debSopenharmony_ci                ylong_json_get_object_size(object, &mut len as *mut c_int),
2660a1d56debSopenharmony_ci                1
2661a1d56debSopenharmony_ci            );
2662a1d56debSopenharmony_ci            assert_eq!(len, 0);
2663a1d56debSopenharmony_ci            ylong_json_delete(object);
2664a1d56debSopenharmony_ci
2665a1d56debSopenharmony_ci            let null = ylong_json_create_null();
2666a1d56debSopenharmony_ci            let mut len = 0i32;
2667a1d56debSopenharmony_ci            assert_eq!(ylong_json_get_object_size(null, &mut len as *mut c_int), 0);
2668a1d56debSopenharmony_ci            ylong_json_delete(null);
2669a1d56debSopenharmony_ci        }
2670a1d56debSopenharmony_ci    }
2671a1d56debSopenharmony_ci
2672a1d56debSopenharmony_ci    /// UT test for `ylong_json_has_object_item`.
2673a1d56debSopenharmony_ci    ///
2674a1d56debSopenharmony_ci    /// # Title
2675a1d56debSopenharmony_ci    /// ut_ylong_json_has_object_item
2676a1d56debSopenharmony_ci    ///
2677a1d56debSopenharmony_ci    /// # Brief
2678a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_has_object_item` to determine whether the item exists in the object.
2679a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
2680a1d56debSopenharmony_ci    #[test]
2681a1d56debSopenharmony_ci    fn ut_ylong_json_has_object_item() {
2682a1d56debSopenharmony_ci        unsafe {
2683a1d56debSopenharmony_ci            // Null ptr
2684a1d56debSopenharmony_ci            let object = null_mut();
2685a1d56debSopenharmony_ci            let str = str_to_c_char("Hello World");
2686a1d56debSopenharmony_ci            assert_eq!(ylong_json_has_object_item(object, str), 0);
2687a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
2688a1d56debSopenharmony_ci
2689a1d56debSopenharmony_ci            // Null ptr
2690a1d56debSopenharmony_ci            let object = ylong_json_create_object();
2691a1d56debSopenharmony_ci            let str = null();
2692a1d56debSopenharmony_ci            assert_eq!(ylong_json_has_object_item(object, str), 0);
2693a1d56debSopenharmony_ci            ylong_json_delete(object);
2694a1d56debSopenharmony_ci
2695a1d56debSopenharmony_ci            const TEXT: &str = "{\"null\":null}";
2696a1d56debSopenharmony_ci            let str = str_to_c_char(TEXT);
2697a1d56debSopenharmony_ci            let mut msg = null_mut();
2698a1d56debSopenharmony_ci            let object = ylong_json_parse(str, &mut msg as *mut *mut c_char);
2699a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
2700a1d56debSopenharmony_ci
2701a1d56debSopenharmony_ci            let str = str_to_c_char("null");
2702a1d56debSopenharmony_ci            assert_eq!(ylong_json_has_object_item(object, str), 1);
2703a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
2704a1d56debSopenharmony_ci
2705a1d56debSopenharmony_ci            let str = str_to_c_char("no_such_key");
2706a1d56debSopenharmony_ci            assert_eq!(ylong_json_has_object_item(object, str), 0);
2707a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
2708a1d56debSopenharmony_ci
2709a1d56debSopenharmony_ci            ylong_json_delete(object);
2710a1d56debSopenharmony_ci
2711a1d56debSopenharmony_ci            let null = ylong_json_create_null();
2712a1d56debSopenharmony_ci            let str = str_to_c_char("Invalid");
2713a1d56debSopenharmony_ci            assert_eq!(ylong_json_has_object_item(null, str), 0);
2714a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
2715a1d56debSopenharmony_ci            ylong_json_delete(null);
2716a1d56debSopenharmony_ci        }
2717a1d56debSopenharmony_ci    }
2718a1d56debSopenharmony_ci
2719a1d56debSopenharmony_ci    /// UT test for `ylong_json_get_object_item`.
2720a1d56debSopenharmony_ci    ///
2721a1d56debSopenharmony_ci    /// # Title
2722a1d56debSopenharmony_ci    /// ut_ylong_json_get_object_item
2723a1d56debSopenharmony_ci    ///
2724a1d56debSopenharmony_ci    /// # Brief
2725a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_get_object_item` to get an item in the object.
2726a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
2727a1d56debSopenharmony_ci    #[test]
2728a1d56debSopenharmony_ci    fn ut_ylong_json_get_object_item() {
2729a1d56debSopenharmony_ci        unsafe {
2730a1d56debSopenharmony_ci            // Null ptr
2731a1d56debSopenharmony_ci            let object = null_mut();
2732a1d56debSopenharmony_ci            let str = str_to_c_char("Hello World");
2733a1d56debSopenharmony_ci            assert!(ylong_json_get_object_item(object, str).is_null());
2734a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
2735a1d56debSopenharmony_ci
2736a1d56debSopenharmony_ci            // Null ptr
2737a1d56debSopenharmony_ci            let object = ylong_json_create_object();
2738a1d56debSopenharmony_ci            let str = null();
2739a1d56debSopenharmony_ci            assert!(ylong_json_get_object_item(object, str).is_null());
2740a1d56debSopenharmony_ci            ylong_json_delete(object);
2741a1d56debSopenharmony_ci
2742a1d56debSopenharmony_ci            const TEXT: &str = "{\"null\":null}";
2743a1d56debSopenharmony_ci            let str = str_to_c_char(TEXT);
2744a1d56debSopenharmony_ci            let mut msg = null_mut();
2745a1d56debSopenharmony_ci            let object = ylong_json_parse(str, &mut msg as *mut *mut c_char);
2746a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
2747a1d56debSopenharmony_ci
2748a1d56debSopenharmony_ci            let str = str_to_c_char("null");
2749a1d56debSopenharmony_ci            let item = ylong_json_get_object_item(object, str);
2750a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_null(item), 1);
2751a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
2752a1d56debSopenharmony_ci
2753a1d56debSopenharmony_ci            let str = str_to_c_char("no_such_key");
2754a1d56debSopenharmony_ci            let item = ylong_json_get_object_item(object, str);
2755a1d56debSopenharmony_ci            assert!(item.is_null());
2756a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
2757a1d56debSopenharmony_ci
2758a1d56debSopenharmony_ci            ylong_json_delete(object);
2759a1d56debSopenharmony_ci
2760a1d56debSopenharmony_ci            let null = ylong_json_create_null();
2761a1d56debSopenharmony_ci            let str = str_to_c_char("Invalid");
2762a1d56debSopenharmony_ci            assert!(ylong_json_get_object_item(null, str).is_null());
2763a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
2764a1d56debSopenharmony_ci            ylong_json_delete(null);
2765a1d56debSopenharmony_ci        }
2766a1d56debSopenharmony_ci    }
2767a1d56debSopenharmony_ci
2768a1d56debSopenharmony_ci    /// UT test for `ylong_json_add_item_to_object`.
2769a1d56debSopenharmony_ci    ///
2770a1d56debSopenharmony_ci    /// # Title
2771a1d56debSopenharmony_ci    /// ut_ylong_json_add_item_to_object
2772a1d56debSopenharmony_ci    ///
2773a1d56debSopenharmony_ci    /// # Brief
2774a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_add_item_to_object` to add an item to the object.
2775a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
2776a1d56debSopenharmony_ci    #[test]
2777a1d56debSopenharmony_ci    fn ut_ylong_json_add_item_to_object() {
2778a1d56debSopenharmony_ci        unsafe {
2779a1d56debSopenharmony_ci            // Null ptr
2780a1d56debSopenharmony_ci            let object = null_mut();
2781a1d56debSopenharmony_ci            let str = str_to_c_char("Hello World");
2782a1d56debSopenharmony_ci            let item = ylong_json_create_null();
2783a1d56debSopenharmony_ci            assert_eq!(ylong_json_add_item_to_object(object, str, item), 0);
2784a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
2785a1d56debSopenharmony_ci            ylong_json_delete(item);
2786a1d56debSopenharmony_ci
2787a1d56debSopenharmony_ci            // Null ptr
2788a1d56debSopenharmony_ci            let object = ylong_json_create_object();
2789a1d56debSopenharmony_ci            let str = null();
2790a1d56debSopenharmony_ci            let item = ylong_json_create_null();
2791a1d56debSopenharmony_ci            assert_eq!(ylong_json_add_item_to_object(object, str, item), 0);
2792a1d56debSopenharmony_ci            ylong_json_delete(object);
2793a1d56debSopenharmony_ci            ylong_json_delete(item);
2794a1d56debSopenharmony_ci
2795a1d56debSopenharmony_ci            // Null ptr
2796a1d56debSopenharmony_ci            let object = ylong_json_create_object();
2797a1d56debSopenharmony_ci            let str = str_to_c_char("Hello World");
2798a1d56debSopenharmony_ci            let item = null_mut();
2799a1d56debSopenharmony_ci            assert_eq!(ylong_json_add_item_to_object(object, str, item), 0);
2800a1d56debSopenharmony_ci            ylong_json_delete(object);
2801a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
2802a1d56debSopenharmony_ci
2803a1d56debSopenharmony_ci            let object = ylong_json_create_object();
2804a1d56debSopenharmony_ci            let mut len = 0i32;
2805a1d56debSopenharmony_ci            assert_eq!(
2806a1d56debSopenharmony_ci                ylong_json_get_object_size(object, &mut len as *mut c_int),
2807a1d56debSopenharmony_ci                1
2808a1d56debSopenharmony_ci            );
2809a1d56debSopenharmony_ci            assert_eq!(len, 0);
2810a1d56debSopenharmony_ci            let str = str_to_c_char("Hello World");
2811a1d56debSopenharmony_ci            let item = ylong_json_create_null();
2812a1d56debSopenharmony_ci            assert_eq!(ylong_json_add_item_to_object(object, str, item), 1);
2813a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
2814a1d56debSopenharmony_ci            assert_eq!(
2815a1d56debSopenharmony_ci                ylong_json_get_object_size(object, &mut len as *mut c_int),
2816a1d56debSopenharmony_ci                1
2817a1d56debSopenharmony_ci            );
2818a1d56debSopenharmony_ci            assert_eq!(len, 1);
2819a1d56debSopenharmony_ci            ylong_json_delete(object);
2820a1d56debSopenharmony_ci
2821a1d56debSopenharmony_ci            let null = ylong_json_create_null();
2822a1d56debSopenharmony_ci            let str = str_to_c_char("Hello World");
2823a1d56debSopenharmony_ci            let item = ylong_json_create_null();
2824a1d56debSopenharmony_ci            assert_eq!(ylong_json_add_item_to_object(null, str, item), 0);
2825a1d56debSopenharmony_ci            ylong_json_delete(null);
2826a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
2827a1d56debSopenharmony_ci            ylong_json_delete(item);
2828a1d56debSopenharmony_ci        }
2829a1d56debSopenharmony_ci    }
2830a1d56debSopenharmony_ci
2831a1d56debSopenharmony_ci    /// UT test for `ylong_json_replace_object_item_by_index`.
2832a1d56debSopenharmony_ci    ///
2833a1d56debSopenharmony_ci    /// # Title
2834a1d56debSopenharmony_ci    /// ut_ylong_json_replace_object_item_by_index
2835a1d56debSopenharmony_ci    ///
2836a1d56debSopenharmony_ci    /// # Brief
2837a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_replace_object_item_by_index` to replace an item in the object by index.
2838a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
2839a1d56debSopenharmony_ci    #[test]
2840a1d56debSopenharmony_ci    fn ut_ylong_json_replace_object_item_by_index() {
2841a1d56debSopenharmony_ci        unsafe {
2842a1d56debSopenharmony_ci            // Null ptr
2843a1d56debSopenharmony_ci            let object = null_mut();
2844a1d56debSopenharmony_ci            let str = str_to_c_char("Hello World");
2845a1d56debSopenharmony_ci            let item = ylong_json_create_null();
2846a1d56debSopenharmony_ci            assert_eq!(
2847a1d56debSopenharmony_ci                ylong_json_replace_object_item_by_index(object, str, item),
2848a1d56debSopenharmony_ci                0
2849a1d56debSopenharmony_ci            );
2850a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
2851a1d56debSopenharmony_ci            ylong_json_delete(item);
2852a1d56debSopenharmony_ci
2853a1d56debSopenharmony_ci            // Null ptr
2854a1d56debSopenharmony_ci            let object = ylong_json_create_object();
2855a1d56debSopenharmony_ci            let str = null();
2856a1d56debSopenharmony_ci            let item = ylong_json_create_null();
2857a1d56debSopenharmony_ci            assert_eq!(
2858a1d56debSopenharmony_ci                ylong_json_replace_object_item_by_index(object, str, item),
2859a1d56debSopenharmony_ci                0
2860a1d56debSopenharmony_ci            );
2861a1d56debSopenharmony_ci            ylong_json_delete(object);
2862a1d56debSopenharmony_ci            ylong_json_delete(item);
2863a1d56debSopenharmony_ci
2864a1d56debSopenharmony_ci            // Null ptr
2865a1d56debSopenharmony_ci            let object = ylong_json_create_object();
2866a1d56debSopenharmony_ci            let str = str_to_c_char("Hello World");
2867a1d56debSopenharmony_ci            let item = null_mut();
2868a1d56debSopenharmony_ci            assert_eq!(
2869a1d56debSopenharmony_ci                ylong_json_replace_object_item_by_index(object, str, item),
2870a1d56debSopenharmony_ci                0
2871a1d56debSopenharmony_ci            );
2872a1d56debSopenharmony_ci            ylong_json_delete(object);
2873a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
2874a1d56debSopenharmony_ci
2875a1d56debSopenharmony_ci            let object = ylong_json_create_object();
2876a1d56debSopenharmony_ci            let str = str_to_c_char("Init");
2877a1d56debSopenharmony_ci            let item = ylong_json_create_null();
2878a1d56debSopenharmony_ci            assert_eq!(ylong_json_add_item_to_object(object, str, item), 1);
2879a1d56debSopenharmony_ci            let result = ylong_json_print_unformatted(object);
2880a1d56debSopenharmony_ci            let result = CString::from_raw(result).into_string().unwrap();
2881a1d56debSopenharmony_ci            assert_eq!(result, "{\"Init\":null}");
2882a1d56debSopenharmony_ci            let item = ylong_json_create_bool(1);
2883a1d56debSopenharmony_ci            assert_eq!(
2884a1d56debSopenharmony_ci                ylong_json_replace_object_item_by_index(object, str, item),
2885a1d56debSopenharmony_ci                1
2886a1d56debSopenharmony_ci            );
2887a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
2888a1d56debSopenharmony_ci            let result = ylong_json_print_unformatted(object);
2889a1d56debSopenharmony_ci            let result = CString::from_raw(result).into_string().unwrap();
2890a1d56debSopenharmony_ci            assert_eq!(result, "{\"Init\":true}");
2891a1d56debSopenharmony_ci            ylong_json_delete(object);
2892a1d56debSopenharmony_ci
2893a1d56debSopenharmony_ci            let null = ylong_json_create_null();
2894a1d56debSopenharmony_ci            let str = str_to_c_char("Hello World");
2895a1d56debSopenharmony_ci            let item = ylong_json_create_null();
2896a1d56debSopenharmony_ci            assert_eq!(ylong_json_replace_object_item_by_index(null, str, item), 0);
2897a1d56debSopenharmony_ci            ylong_json_delete(null);
2898a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
2899a1d56debSopenharmony_ci            ylong_json_delete(item);
2900a1d56debSopenharmony_ci        }
2901a1d56debSopenharmony_ci    }
2902a1d56debSopenharmony_ci
2903a1d56debSopenharmony_ci    /// UT test for `ylong_json_remove_object_item_by_index`.
2904a1d56debSopenharmony_ci    ///
2905a1d56debSopenharmony_ci    /// # Title
2906a1d56debSopenharmony_ci    /// ut_ylong_json_remove_object_item_by_index
2907a1d56debSopenharmony_ci    ///
2908a1d56debSopenharmony_ci    /// # Brief
2909a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_remove_object_item_by_index` to remove an item in the object by index.
2910a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
2911a1d56debSopenharmony_ci    #[test]
2912a1d56debSopenharmony_ci    fn ut_ylong_json_remove_object_item_by_index() {
2913a1d56debSopenharmony_ci        unsafe {
2914a1d56debSopenharmony_ci            // Null ptr
2915a1d56debSopenharmony_ci            let object = null_mut();
2916a1d56debSopenharmony_ci            let str = str_to_c_char("Hello World");
2917a1d56debSopenharmony_ci            assert!(ylong_json_remove_object_item_by_index(object, str).is_null());
2918a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
2919a1d56debSopenharmony_ci
2920a1d56debSopenharmony_ci            // Null ptr
2921a1d56debSopenharmony_ci            let object = ylong_json_create_object();
2922a1d56debSopenharmony_ci            let str = null();
2923a1d56debSopenharmony_ci            assert!(ylong_json_remove_object_item_by_index(object, str).is_null());
2924a1d56debSopenharmony_ci            ylong_json_delete(object);
2925a1d56debSopenharmony_ci
2926a1d56debSopenharmony_ci            let object = ylong_json_create_object();
2927a1d56debSopenharmony_ci            let str = str_to_c_char("Init");
2928a1d56debSopenharmony_ci            let item = ylong_json_create_null();
2929a1d56debSopenharmony_ci            assert_eq!(ylong_json_add_item_to_object(object, str, item), 1);
2930a1d56debSopenharmony_ci            let result = ylong_json_print_unformatted(object);
2931a1d56debSopenharmony_ci            let result = CString::from_raw(result).into_string().unwrap();
2932a1d56debSopenharmony_ci            assert_eq!(result, "{\"Init\":null}");
2933a1d56debSopenharmony_ci            let item = ylong_json_remove_object_item_by_index(object, str);
2934a1d56debSopenharmony_ci            assert!(!item.is_null());
2935a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_null(item), 1);
2936a1d56debSopenharmony_ci            let result = ylong_json_print_unformatted(object);
2937a1d56debSopenharmony_ci            let result = CString::from_raw(result).into_string().unwrap();
2938a1d56debSopenharmony_ci            assert_eq!(result, "{}");
2939a1d56debSopenharmony_ci            ylong_json_delete(object);
2940a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
2941a1d56debSopenharmony_ci            ylong_json_delete(item);
2942a1d56debSopenharmony_ci
2943a1d56debSopenharmony_ci            let null = ylong_json_create_null();
2944a1d56debSopenharmony_ci            let str = str_to_c_char("Hello World");
2945a1d56debSopenharmony_ci            assert!(ylong_json_remove_object_item_by_index(null, str).is_null());
2946a1d56debSopenharmony_ci            ylong_json_delete(null);
2947a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
2948a1d56debSopenharmony_ci        }
2949a1d56debSopenharmony_ci    }
2950a1d56debSopenharmony_ci
2951a1d56debSopenharmony_ci    /// UT test for `ylong_json_delete_object_by_index`.
2952a1d56debSopenharmony_ci    ///
2953a1d56debSopenharmony_ci    /// # Title
2954a1d56debSopenharmony_ci    /// ut_ylong_json_delete_object_by_index
2955a1d56debSopenharmony_ci    ///
2956a1d56debSopenharmony_ci    /// # Brief
2957a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_delete_object_by_index` to delete an item in the object by index.
2958a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
2959a1d56debSopenharmony_ci    #[test]
2960a1d56debSopenharmony_ci    fn ut_ylong_json_delete_object_by_index() {
2961a1d56debSopenharmony_ci        unsafe {
2962a1d56debSopenharmony_ci            // Null ptr
2963a1d56debSopenharmony_ci            let object = null_mut();
2964a1d56debSopenharmony_ci            let str = str_to_c_char("Hello World");
2965a1d56debSopenharmony_ci            ylong_json_delete_object_item_by_index(object, str);
2966a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
2967a1d56debSopenharmony_ci
2968a1d56debSopenharmony_ci            // Null ptr
2969a1d56debSopenharmony_ci            let object = ylong_json_create_object();
2970a1d56debSopenharmony_ci            let str = null();
2971a1d56debSopenharmony_ci            ylong_json_delete_object_item_by_index(object, str);
2972a1d56debSopenharmony_ci            ylong_json_delete(object);
2973a1d56debSopenharmony_ci
2974a1d56debSopenharmony_ci            let object = ylong_json_create_object();
2975a1d56debSopenharmony_ci            let str = str_to_c_char("Init");
2976a1d56debSopenharmony_ci            let item = ylong_json_create_null();
2977a1d56debSopenharmony_ci            assert_eq!(ylong_json_add_item_to_object(object, str, item), 1);
2978a1d56debSopenharmony_ci            let result = ylong_json_print_unformatted(object);
2979a1d56debSopenharmony_ci            let result = CString::from_raw(result).into_string().unwrap();
2980a1d56debSopenharmony_ci            assert_eq!(result, "{\"Init\":null}");
2981a1d56debSopenharmony_ci            ylong_json_delete_object_item_by_index(object, str);
2982a1d56debSopenharmony_ci            let result = ylong_json_print_unformatted(object);
2983a1d56debSopenharmony_ci            let result = CString::from_raw(result).into_string().unwrap();
2984a1d56debSopenharmony_ci            assert_eq!(result, "{}");
2985a1d56debSopenharmony_ci            ylong_json_delete(object);
2986a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
2987a1d56debSopenharmony_ci
2988a1d56debSopenharmony_ci            let null = ylong_json_create_null();
2989a1d56debSopenharmony_ci            let str = str_to_c_char("Hello World");
2990a1d56debSopenharmony_ci            ylong_json_delete_object_item_by_index(null, str);
2991a1d56debSopenharmony_ci            ylong_json_delete(null);
2992a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
2993a1d56debSopenharmony_ci        }
2994a1d56debSopenharmony_ci    }
2995a1d56debSopenharmony_ci
2996a1d56debSopenharmony_ci    /// UT test for `ylong_json_get_all_object_items`.
2997a1d56debSopenharmony_ci    ///
2998a1d56debSopenharmony_ci    /// # Title
2999a1d56debSopenharmony_ci    /// ut_ylong_json_get_all_object_items
3000a1d56debSopenharmony_ci    ///
3001a1d56debSopenharmony_ci    /// # Brief
3002a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_get_all_object_items` to get all items in the object.
3003a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
3004a1d56debSopenharmony_ci    #[test]
3005a1d56debSopenharmony_ci    fn ut_ylong_json_get_all_object_items() {
3006a1d56debSopenharmony_ci        unsafe {
3007a1d56debSopenharmony_ci            // Null ptr
3008a1d56debSopenharmony_ci            let object = null_mut();
3009a1d56debSopenharmony_ci            let mut len = 1i32;
3010a1d56debSopenharmony_ci            let keys = malloc(size_of::<*mut c_char>() * (len as usize)) as *mut *mut c_char;
3011a1d56debSopenharmony_ci            let values =
3012a1d56debSopenharmony_ci                malloc(size_of::<*mut YlongJson>() * (len as usize)) as *mut *mut YlongJson;
3013a1d56debSopenharmony_ci            assert_eq!(
3014a1d56debSopenharmony_ci                ylong_json_get_all_object_items(object, keys, values, &mut len as *mut c_int),
3015a1d56debSopenharmony_ci                0
3016a1d56debSopenharmony_ci            );
3017a1d56debSopenharmony_ci            free(keys as *mut c_void);
3018a1d56debSopenharmony_ci            free(values as *mut c_void);
3019a1d56debSopenharmony_ci
3020a1d56debSopenharmony_ci            // Null ptr
3021a1d56debSopenharmony_ci            let object = ylong_json_create_object();
3022a1d56debSopenharmony_ci            let mut len = 1i32;
3023a1d56debSopenharmony_ci            let keys = null_mut();
3024a1d56debSopenharmony_ci            let values =
3025a1d56debSopenharmony_ci                malloc(size_of::<*mut YlongJson>() * (len as usize)) as *mut *mut YlongJson;
3026a1d56debSopenharmony_ci            assert_eq!(
3027a1d56debSopenharmony_ci                ylong_json_get_all_object_items(object, keys, values, &mut len as *mut c_int),
3028a1d56debSopenharmony_ci                0
3029a1d56debSopenharmony_ci            );
3030a1d56debSopenharmony_ci            ylong_json_delete(object);
3031a1d56debSopenharmony_ci            free(values as *mut c_void);
3032a1d56debSopenharmony_ci
3033a1d56debSopenharmony_ci            // Null ptr
3034a1d56debSopenharmony_ci            let object = ylong_json_create_object();
3035a1d56debSopenharmony_ci            let mut len = 1i32;
3036a1d56debSopenharmony_ci            let keys = malloc(size_of::<*mut c_char>() * (len as usize)) as *mut *mut c_char;
3037a1d56debSopenharmony_ci            let values = null_mut();
3038a1d56debSopenharmony_ci            assert_eq!(
3039a1d56debSopenharmony_ci                ylong_json_get_all_object_items(object, keys, values, &mut len as *mut c_int),
3040a1d56debSopenharmony_ci                0
3041a1d56debSopenharmony_ci            );
3042a1d56debSopenharmony_ci            ylong_json_delete(object);
3043a1d56debSopenharmony_ci            free(keys as *mut c_void);
3044a1d56debSopenharmony_ci
3045a1d56debSopenharmony_ci            // Null ptr
3046a1d56debSopenharmony_ci            let object = ylong_json_create_object();
3047a1d56debSopenharmony_ci            let len = 1i32;
3048a1d56debSopenharmony_ci            let keys = malloc(size_of::<*mut c_char>() * (len as usize)) as *mut *mut c_char;
3049a1d56debSopenharmony_ci            let values =
3050a1d56debSopenharmony_ci                malloc(size_of::<*mut YlongJson>() * (len as usize)) as *mut *mut YlongJson;
3051a1d56debSopenharmony_ci            let len = null_mut();
3052a1d56debSopenharmony_ci            assert_eq!(
3053a1d56debSopenharmony_ci                ylong_json_get_all_object_items(object, keys, values, len),
3054a1d56debSopenharmony_ci                0
3055a1d56debSopenharmony_ci            );
3056a1d56debSopenharmony_ci            ylong_json_delete(object);
3057a1d56debSopenharmony_ci            free(keys as *mut c_void);
3058a1d56debSopenharmony_ci            free(values as *mut c_void);
3059a1d56debSopenharmony_ci
3060a1d56debSopenharmony_ci            const TEXT: &str = r#"{"A":null,"B":1.0,"C":true,"D":"Test"}"#;
3061a1d56debSopenharmony_ci            let text = str_to_c_char(TEXT);
3062a1d56debSopenharmony_ci            let mut err_msg = null_mut();
3063a1d56debSopenharmony_ci            let object = ylong_json_parse(text, &mut err_msg as *mut *mut c_char);
3064a1d56debSopenharmony_ci            let _ = Box::from_raw(text);
3065a1d56debSopenharmony_ci            let mut len = 0i32;
3066a1d56debSopenharmony_ci            assert_eq!(
3067a1d56debSopenharmony_ci                ylong_json_get_object_size(object, &mut len as *mut c_int),
3068a1d56debSopenharmony_ci                1
3069a1d56debSopenharmony_ci            );
3070a1d56debSopenharmony_ci            assert_eq!(len, 4);
3071a1d56debSopenharmony_ci            let keys = malloc(size_of::<*mut c_char>() * (len as usize)) as *mut *mut c_char;
3072a1d56debSopenharmony_ci            let values =
3073a1d56debSopenharmony_ci                malloc(size_of::<*mut YlongJson>() * (len as usize)) as *mut *mut YlongJson;
3074a1d56debSopenharmony_ci            assert_eq!(
3075a1d56debSopenharmony_ci                ylong_json_get_all_object_items(object, keys, values, &mut len as *mut c_int),
3076a1d56debSopenharmony_ci                1
3077a1d56debSopenharmony_ci            );
3078a1d56debSopenharmony_ci            let mut cnt = 0;
3079a1d56debSopenharmony_ci            let key_result = ["A", "B", "C", "D"];
3080a1d56debSopenharmony_ci            let value_result = ["null", "1.0", "true", "\"Test\""];
3081a1d56debSopenharmony_ci            while cnt != len {
3082a1d56debSopenharmony_ci                let key = *(keys.offset(cnt as isize));
3083a1d56debSopenharmony_ci                let key_str = CStr::from_ptr(key).to_str().unwrap();
3084a1d56debSopenharmony_ci                assert_eq!(key_str, key_result[cnt as usize]);
3085a1d56debSopenharmony_ci                ylong_json_free_string(key);
3086a1d56debSopenharmony_ci
3087a1d56debSopenharmony_ci                let item = *(values.offset(cnt as isize));
3088a1d56debSopenharmony_ci                let value = ylong_json_print_unformatted(item);
3089a1d56debSopenharmony_ci                let value_str = CString::from_raw(value).into_string().unwrap();
3090a1d56debSopenharmony_ci                assert_eq!(value_str, value_result[cnt as usize]);
3091a1d56debSopenharmony_ci                cnt += 1;
3092a1d56debSopenharmony_ci            }
3093a1d56debSopenharmony_ci            free(keys as *mut c_void);
3094a1d56debSopenharmony_ci            free(values as *mut c_void);
3095a1d56debSopenharmony_ci            ylong_json_delete(object);
3096a1d56debSopenharmony_ci
3097a1d56debSopenharmony_ci            // 非 object
3098a1d56debSopenharmony_ci            let null = ylong_json_create_null();
3099a1d56debSopenharmony_ci            let mut len = 1i32;
3100a1d56debSopenharmony_ci            let keys = malloc(size_of::<*mut c_char>() * (len as usize)) as *mut *mut c_char;
3101a1d56debSopenharmony_ci            let values =
3102a1d56debSopenharmony_ci                malloc(size_of::<*mut YlongJson>() * (len as usize)) as *mut *mut YlongJson;
3103a1d56debSopenharmony_ci            assert_eq!(
3104a1d56debSopenharmony_ci                ylong_json_get_all_object_items(null, keys, values, &mut len as *mut c_int),
3105a1d56debSopenharmony_ci                0
3106a1d56debSopenharmony_ci            );
3107a1d56debSopenharmony_ci            ylong_json_delete(null);
3108a1d56debSopenharmony_ci            free(keys as *mut c_void);
3109a1d56debSopenharmony_ci            free(values as *mut c_void);
3110a1d56debSopenharmony_ci        }
3111a1d56debSopenharmony_ci    }
3112a1d56debSopenharmony_ci
3113a1d56debSopenharmony_ci    /// UT test for `ylong_json_for_each_object_item`.
3114a1d56debSopenharmony_ci    ///
3115a1d56debSopenharmony_ci    /// # Title
3116a1d56debSopenharmony_ci    /// ut_ylong_json_for_each_object_item
3117a1d56debSopenharmony_ci    ///
3118a1d56debSopenharmony_ci    /// # Brief
3119a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_for_each_object_item` to do `func` for each item in the object.
3120a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
3121a1d56debSopenharmony_ci    #[test]
3122a1d56debSopenharmony_ci    fn ut_ylong_json_for_each_object_item() {
3123a1d56debSopenharmony_ci        unsafe {
3124a1d56debSopenharmony_ci            unsafe extern "C" fn func(target: *mut YlongJson) {
3125a1d56debSopenharmony_ci                ylong_json_set_int_value_to_number(target, 1000);
3126a1d56debSopenharmony_ci            }
3127a1d56debSopenharmony_ci
3128a1d56debSopenharmony_ci            // Null ptr
3129a1d56debSopenharmony_ci            let object = null_mut();
3130a1d56debSopenharmony_ci            assert_eq!(ylong_json_for_each_object_item(object, func), 0);
3131a1d56debSopenharmony_ci
3132a1d56debSopenharmony_ci            const TEXT: &str = r#"{"A":1,"B":2,"C":3,"D":null,"E":1.0}"#;
3133a1d56debSopenharmony_ci            let text = str_to_c_char(TEXT);
3134a1d56debSopenharmony_ci            let err_msg = null_mut();
3135a1d56debSopenharmony_ci            let object = ylong_json_parse(text, err_msg);
3136a1d56debSopenharmony_ci            let _ = Box::from_raw(text);
3137a1d56debSopenharmony_ci            let result = ylong_json_print_unformatted(object);
3138a1d56debSopenharmony_ci            let result = CString::from_raw(result).into_string().unwrap();
3139a1d56debSopenharmony_ci            assert_eq!(result, "{\"A\":1,\"B\":2,\"C\":3,\"D\":null,\"E\":1.0}");
3140a1d56debSopenharmony_ci            assert_eq!(ylong_json_for_each_object_item(object, func), 1);
3141a1d56debSopenharmony_ci            let result = ylong_json_print_unformatted(object);
3142a1d56debSopenharmony_ci            let result = CString::from_raw(result).into_string().unwrap();
3143a1d56debSopenharmony_ci            assert_eq!(
3144a1d56debSopenharmony_ci                result,
3145a1d56debSopenharmony_ci                "{\"A\":1000,\"B\":1000,\"C\":1000,\"D\":null,\"E\":1000}"
3146a1d56debSopenharmony_ci            );
3147a1d56debSopenharmony_ci            ylong_json_delete(object);
3148a1d56debSopenharmony_ci
3149a1d56debSopenharmony_ci            let null = ylong_json_create_null();
3150a1d56debSopenharmony_ci            assert_eq!(ylong_json_for_each_object_item(null, func), 0);
3151a1d56debSopenharmony_ci            ylong_json_delete(null);
3152a1d56debSopenharmony_ci        }
3153a1d56debSopenharmony_ci    }
3154a1d56debSopenharmony_ci
3155a1d56debSopenharmony_ci    /// UT test for `ylong_json_get_object_node`.
3156a1d56debSopenharmony_ci    ///
3157a1d56debSopenharmony_ci    /// # Title
3158a1d56debSopenharmony_ci    /// ut_ylong_json_get_object_node
3159a1d56debSopenharmony_ci    ///
3160a1d56debSopenharmony_ci    /// # Brief
3161a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_get_object_node` to get an object node.
3162a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
3163a1d56debSopenharmony_ci    #[cfg(feature = "list_object")]
3164a1d56debSopenharmony_ci    #[test]
3165a1d56debSopenharmony_ci    fn ut_ylong_json_get_object_node() {
3166a1d56debSopenharmony_ci        unsafe {
3167a1d56debSopenharmony_ci            // Null ptr
3168a1d56debSopenharmony_ci            let object = null_mut();
3169a1d56debSopenharmony_ci            let str = str_to_c_char("Hello World");
3170a1d56debSopenharmony_ci            let node = ylong_json_get_object_node(object, str);
3171a1d56debSopenharmony_ci            assert!(node.is_null());
3172a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
3173a1d56debSopenharmony_ci
3174a1d56debSopenharmony_ci            // Null ptr
3175a1d56debSopenharmony_ci            let object = ylong_json_create_object();
3176a1d56debSopenharmony_ci            let str = null_mut();
3177a1d56debSopenharmony_ci            let node = ylong_json_get_object_node(object, str);
3178a1d56debSopenharmony_ci            assert!(node.is_null());
3179a1d56debSopenharmony_ci            ylong_json_delete(object);
3180a1d56debSopenharmony_ci
3181a1d56debSopenharmony_ci            const TEXT: &str = r#"{"null":null}"#;
3182a1d56debSopenharmony_ci            let text = str_to_c_char(TEXT);
3183a1d56debSopenharmony_ci            let err_msg = null_mut();
3184a1d56debSopenharmony_ci            let object = ylong_json_parse(text, err_msg);
3185a1d56debSopenharmony_ci            let _ = Box::from_raw(text);
3186a1d56debSopenharmony_ci            let str = str_to_c_char("null");
3187a1d56debSopenharmony_ci            let node = ylong_json_get_object_node(object, str);
3188a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
3189a1d56debSopenharmony_ci            assert!(!node.is_null());
3190a1d56debSopenharmony_ci            let item = ylong_json_get_item_from_object_node(node);
3191a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_null(item), 1);
3192a1d56debSopenharmony_ci            ylong_json_delete(object);
3193a1d56debSopenharmony_ci
3194a1d56debSopenharmony_ci            // Non-object
3195a1d56debSopenharmony_ci            let null = ylong_json_create_null();
3196a1d56debSopenharmony_ci            let str = str_to_c_char("Hello World");
3197a1d56debSopenharmony_ci            let node = ylong_json_get_object_node(null, str);
3198a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
3199a1d56debSopenharmony_ci            assert!(node.is_null());
3200a1d56debSopenharmony_ci            ylong_json_delete(null);
3201a1d56debSopenharmony_ci        }
3202a1d56debSopenharmony_ci    }
3203a1d56debSopenharmony_ci
3204a1d56debSopenharmony_ci    /// UT test for `ylong_json_get_item_from_object_node`.
3205a1d56debSopenharmony_ci    ///
3206a1d56debSopenharmony_ci    /// # Title
3207a1d56debSopenharmony_ci    /// ut_ylong_json_get_item_from_object_node
3208a1d56debSopenharmony_ci    ///
3209a1d56debSopenharmony_ci    /// # Brief
3210a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_get_item_from_object_node` to get the item of an object node.
3211a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
3212a1d56debSopenharmony_ci    #[cfg(feature = "list_object")]
3213a1d56debSopenharmony_ci    #[test]
3214a1d56debSopenharmony_ci    fn ut_ylong_json_get_item_from_object_node() {
3215a1d56debSopenharmony_ci        unsafe {
3216a1d56debSopenharmony_ci            // Null ptr
3217a1d56debSopenharmony_ci            let node = null_mut();
3218a1d56debSopenharmony_ci            let item = ylong_json_get_item_from_object_node(node);
3219a1d56debSopenharmony_ci            assert!(item.is_null());
3220a1d56debSopenharmony_ci
3221a1d56debSopenharmony_ci            const TEXT: &str = r#"{"null":null}"#;
3222a1d56debSopenharmony_ci            let text = str_to_c_char(TEXT);
3223a1d56debSopenharmony_ci            let err_msg = null_mut();
3224a1d56debSopenharmony_ci            let object = ylong_json_parse(text, err_msg);
3225a1d56debSopenharmony_ci            let str = str_to_c_char("null");
3226a1d56debSopenharmony_ci            let node = ylong_json_get_object_node(object, str);
3227a1d56debSopenharmony_ci            assert!(!node.is_null());
3228a1d56debSopenharmony_ci            let item = ylong_json_get_item_from_object_node(node);
3229a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_null(item), 1);
3230a1d56debSopenharmony_ci            let _ = Box::from_raw(text);
3231a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
3232a1d56debSopenharmony_ci            ylong_json_delete(object);
3233a1d56debSopenharmony_ci        }
3234a1d56debSopenharmony_ci    }
3235a1d56debSopenharmony_ci
3236a1d56debSopenharmony_ci    /// UT test for `ylong_json_add_item_to_object_then_get_node`.
3237a1d56debSopenharmony_ci    ///
3238a1d56debSopenharmony_ci    /// # Title
3239a1d56debSopenharmony_ci    /// ut_ylong_json_add_item_to_object_then_get_node
3240a1d56debSopenharmony_ci    ///
3241a1d56debSopenharmony_ci    /// # Brief
3242a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_add_item_to_object_then_get_node` to add an item to the object and get the corresponding node.
3243a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
3244a1d56debSopenharmony_ci    #[cfg(feature = "list_object")]
3245a1d56debSopenharmony_ci    #[test]
3246a1d56debSopenharmony_ci    fn ut_ylong_json_add_item_to_object_then_get_node() {
3247a1d56debSopenharmony_ci        unsafe {
3248a1d56debSopenharmony_ci            // Null ptr
3249a1d56debSopenharmony_ci            let object = null_mut();
3250a1d56debSopenharmony_ci            let str = str_to_c_char("null");
3251a1d56debSopenharmony_ci            let item = ylong_json_create_null();
3252a1d56debSopenharmony_ci            let node = ylong_json_add_item_to_object_then_get_node(object, str, item);
3253a1d56debSopenharmony_ci            assert!(node.is_null());
3254a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
3255a1d56debSopenharmony_ci            ylong_json_delete(item);
3256a1d56debSopenharmony_ci
3257a1d56debSopenharmony_ci            // Null ptr
3258a1d56debSopenharmony_ci            let object = ylong_json_create_object();
3259a1d56debSopenharmony_ci            let str = null_mut();
3260a1d56debSopenharmony_ci            let item = ylong_json_create_null();
3261a1d56debSopenharmony_ci            let node = ylong_json_add_item_to_object_then_get_node(object, str, item);
3262a1d56debSopenharmony_ci            assert!(node.is_null());
3263a1d56debSopenharmony_ci            ylong_json_delete(object);
3264a1d56debSopenharmony_ci            ylong_json_delete(item);
3265a1d56debSopenharmony_ci
3266a1d56debSopenharmony_ci            // Null ptr
3267a1d56debSopenharmony_ci            let object = ylong_json_create_object();
3268a1d56debSopenharmony_ci            let str = str_to_c_char("null");
3269a1d56debSopenharmony_ci            let item = null_mut();
3270a1d56debSopenharmony_ci            let node = ylong_json_add_item_to_object_then_get_node(object, str, item);
3271a1d56debSopenharmony_ci            assert!(node.is_null());
3272a1d56debSopenharmony_ci            ylong_json_delete(object);
3273a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
3274a1d56debSopenharmony_ci
3275a1d56debSopenharmony_ci            let object = ylong_json_create_object();
3276a1d56debSopenharmony_ci            let str = str_to_c_char("null");
3277a1d56debSopenharmony_ci            let item = ylong_json_create_null();
3278a1d56debSopenharmony_ci            let node = ylong_json_add_item_to_object_then_get_node(object, str, item);
3279a1d56debSopenharmony_ci            assert!(!node.is_null());
3280a1d56debSopenharmony_ci            let item = ylong_json_get_item_from_object_node(node);
3281a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_null(item), 1);
3282a1d56debSopenharmony_ci            ylong_json_delete(object);
3283a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
3284a1d56debSopenharmony_ci
3285a1d56debSopenharmony_ci            let null = ylong_json_create_null();
3286a1d56debSopenharmony_ci            let str = str_to_c_char("null");
3287a1d56debSopenharmony_ci            let item = ylong_json_create_null();
3288a1d56debSopenharmony_ci            let node = ylong_json_add_item_to_object_then_get_node(null, str, item);
3289a1d56debSopenharmony_ci            assert!(node.is_null());
3290a1d56debSopenharmony_ci            ylong_json_delete(null);
3291a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
3292a1d56debSopenharmony_ci            ylong_json_delete(item);
3293a1d56debSopenharmony_ci        }
3294a1d56debSopenharmony_ci    }
3295a1d56debSopenharmony_ci
3296a1d56debSopenharmony_ci    /// UT test for `ylong_json_replace_item_of_object_node`.
3297a1d56debSopenharmony_ci    ///
3298a1d56debSopenharmony_ci    /// # Title
3299a1d56debSopenharmony_ci    /// ut_ylong_json_replace_item_of_object_node
3300a1d56debSopenharmony_ci    ///
3301a1d56debSopenharmony_ci    /// # Brief
3302a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_replace_item_of_object_node` to replace the item of an object node.
3303a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
3304a1d56debSopenharmony_ci    #[cfg(feature = "list_object")]
3305a1d56debSopenharmony_ci    #[test]
3306a1d56debSopenharmony_ci    fn ut_ylong_json_replace_item_of_object_node() {
3307a1d56debSopenharmony_ci        unsafe {
3308a1d56debSopenharmony_ci            // Null ptr
3309a1d56debSopenharmony_ci            let node = null_mut();
3310a1d56debSopenharmony_ci            let item = ylong_json_create_null();
3311a1d56debSopenharmony_ci            assert_eq!(ylong_json_replace_item_of_object_node(node, item), 0);
3312a1d56debSopenharmony_ci            ylong_json_delete(item);
3313a1d56debSopenharmony_ci
3314a1d56debSopenharmony_ci            // Null ptr
3315a1d56debSopenharmony_ci            let object = ylong_json_create_object();
3316a1d56debSopenharmony_ci            let str = str_to_c_char("null");
3317a1d56debSopenharmony_ci            let item = ylong_json_create_null();
3318a1d56debSopenharmony_ci            let node = ylong_json_add_item_to_object_then_get_node(object, str, item);
3319a1d56debSopenharmony_ci            let item = null_mut();
3320a1d56debSopenharmony_ci            assert_eq!(ylong_json_replace_item_of_object_node(node, item), 0);
3321a1d56debSopenharmony_ci            ylong_json_delete(object);
3322a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
3323a1d56debSopenharmony_ci
3324a1d56debSopenharmony_ci            let object = ylong_json_create_object();
3325a1d56debSopenharmony_ci            let str = str_to_c_char("null");
3326a1d56debSopenharmony_ci            let item = ylong_json_create_null();
3327a1d56debSopenharmony_ci            let node = ylong_json_add_item_to_object_then_get_node(object, str, item);
3328a1d56debSopenharmony_ci            let result = ylong_json_print_unformatted(object);
3329a1d56debSopenharmony_ci            let result = CString::from_raw(result).into_string().unwrap();
3330a1d56debSopenharmony_ci            assert_eq!(result, "{\"null\":null}");
3331a1d56debSopenharmony_ci            let item = ylong_json_create_bool(1);
3332a1d56debSopenharmony_ci            assert_eq!(ylong_json_replace_item_of_object_node(node, item), 1);
3333a1d56debSopenharmony_ci            let result = ylong_json_print_unformatted(object);
3334a1d56debSopenharmony_ci            let result = CString::from_raw(result).into_string().unwrap();
3335a1d56debSopenharmony_ci            assert_eq!(result, "{\"null\":true}");
3336a1d56debSopenharmony_ci            ylong_json_delete(object);
3337a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
3338a1d56debSopenharmony_ci        }
3339a1d56debSopenharmony_ci    }
3340a1d56debSopenharmony_ci
3341a1d56debSopenharmony_ci    /// UT test for `ylong_json_remove_object_node`.
3342a1d56debSopenharmony_ci    ///
3343a1d56debSopenharmony_ci    /// # Title
3344a1d56debSopenharmony_ci    /// ut_ylong_json_remove_object_node
3345a1d56debSopenharmony_ci    ///
3346a1d56debSopenharmony_ci    /// # Brief
3347a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_remove_object_node` to remove an object node.
3348a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
3349a1d56debSopenharmony_ci    #[cfg(feature = "list_object")]
3350a1d56debSopenharmony_ci    #[test]
3351a1d56debSopenharmony_ci    fn ut_ylong_json_remove_object_node() {
3352a1d56debSopenharmony_ci        unsafe {
3353a1d56debSopenharmony_ci            // Null ptr
3354a1d56debSopenharmony_ci            let node = null_mut();
3355a1d56debSopenharmony_ci            let item = ylong_json_remove_object_node(node);
3356a1d56debSopenharmony_ci            assert!(item.is_null());
3357a1d56debSopenharmony_ci
3358a1d56debSopenharmony_ci            let object = ylong_json_create_object();
3359a1d56debSopenharmony_ci            let str = str_to_c_char("null");
3360a1d56debSopenharmony_ci            let item = ylong_json_create_null();
3361a1d56debSopenharmony_ci            let node = ylong_json_add_item_to_object_then_get_node(object, str, item);
3362a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
3363a1d56debSopenharmony_ci            let result = ylong_json_print_unformatted(object);
3364a1d56debSopenharmony_ci            let result = CString::from_raw(result).into_string().unwrap();
3365a1d56debSopenharmony_ci            assert_eq!(result, "{\"null\":null}");
3366a1d56debSopenharmony_ci            let item = ylong_json_remove_object_node(node);
3367a1d56debSopenharmony_ci            assert_eq!(ylong_json_is_null(item), 1);
3368a1d56debSopenharmony_ci            let result = ylong_json_print_unformatted(object);
3369a1d56debSopenharmony_ci            let result = CString::from_raw(result).into_string().unwrap();
3370a1d56debSopenharmony_ci            assert_eq!(result, "{}");
3371a1d56debSopenharmony_ci            ylong_json_delete(item);
3372a1d56debSopenharmony_ci            ylong_json_delete(object);
3373a1d56debSopenharmony_ci        }
3374a1d56debSopenharmony_ci    }
3375a1d56debSopenharmony_ci
3376a1d56debSopenharmony_ci    /// UT test for `ylong_json_delete_object_node`.
3377a1d56debSopenharmony_ci    ///
3378a1d56debSopenharmony_ci    /// # Title
3379a1d56debSopenharmony_ci    /// ut_ylong_json_delete_object_node
3380a1d56debSopenharmony_ci    ///
3381a1d56debSopenharmony_ci    /// # Brief
3382a1d56debSopenharmony_ci    /// 1. Calls `ylong_json_delete_object_node` to delete an object node.
3383a1d56debSopenharmony_ci    /// 2. Checks if the test results are correct.
3384a1d56debSopenharmony_ci    #[cfg(feature = "list_object")]
3385a1d56debSopenharmony_ci    #[test]
3386a1d56debSopenharmony_ci    fn ut_ylong_json_delete_object_node() {
3387a1d56debSopenharmony_ci        unsafe {
3388a1d56debSopenharmony_ci            // Null ptr scene, the process is correct if it exits without exception.
3389a1d56debSopenharmony_ci            let node = null_mut();
3390a1d56debSopenharmony_ci            ylong_json_delete_object_node(node);
3391a1d56debSopenharmony_ci
3392a1d56debSopenharmony_ci            let object = ylong_json_create_object();
3393a1d56debSopenharmony_ci            let str = str_to_c_char("null");
3394a1d56debSopenharmony_ci            let item = ylong_json_create_null();
3395a1d56debSopenharmony_ci            let node = ylong_json_add_item_to_object_then_get_node(object, str, item);
3396a1d56debSopenharmony_ci            let result = ylong_json_print_unformatted(object);
3397a1d56debSopenharmony_ci            let result = CString::from_raw(result).into_string().unwrap();
3398a1d56debSopenharmony_ci            assert_eq!(result, "{\"null\":null}");
3399a1d56debSopenharmony_ci            ylong_json_delete_object_node(node);
3400a1d56debSopenharmony_ci            let result = ylong_json_print_unformatted(object);
3401a1d56debSopenharmony_ci            let result = CString::from_raw(result).into_string().unwrap();
3402a1d56debSopenharmony_ci            assert_eq!(result, "{}");
3403a1d56debSopenharmony_ci            let _ = Box::from_raw(str);
3404a1d56debSopenharmony_ci            ylong_json_delete(object);
3405a1d56debSopenharmony_ci        }
3406a1d56debSopenharmony_ci    }
3407a1d56debSopenharmony_ci}
3408