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