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_ciuse std::ffi::{CStr, CString}; 15a1d56debSopenharmony_ciuse std::os::raw::{c_char, c_double, c_int}; 16a1d56debSopenharmony_ciuse std::ptr::*; 17a1d56debSopenharmony_ciuse ylong_json::*; 18a1d56debSopenharmony_ci 19a1d56debSopenharmony_ciconst RFC7159_EXAMPLE1: &str = r#" 20a1d56debSopenharmony_ci{ 21a1d56debSopenharmony_ci "Image": { 22a1d56debSopenharmony_ci "Width": 800, 23a1d56debSopenharmony_ci "Height": 600, 24a1d56debSopenharmony_ci "Title": "View from 15th Floor", 25a1d56debSopenharmony_ci "Thumbnail": { 26a1d56debSopenharmony_ci "Url": "http://www.example.com/image/481989943", 27a1d56debSopenharmony_ci "Height": 125, 28a1d56debSopenharmony_ci "Width": 100 29a1d56debSopenharmony_ci }, 30a1d56debSopenharmony_ci "Animated" : false, 31a1d56debSopenharmony_ci "IDs": [116, 943, 234, 38793] 32a1d56debSopenharmony_ci } 33a1d56debSopenharmony_ci} 34a1d56debSopenharmony_ci"#; 35a1d56debSopenharmony_ci 36a1d56debSopenharmony_cimacro_rules! test_json { 37a1d56debSopenharmony_ci ($json: expr) => {{ 38a1d56debSopenharmony_ci let target = str_to_c_char("Image"); 39a1d56debSopenharmony_ci let image = ylong_json_get_object_item($json, target); 40a1d56debSopenharmony_ci let _ = CString::from_raw(target); 41a1d56debSopenharmony_ci 42a1d56debSopenharmony_ci assert_eq!(ylong_json_is_object(image), 1); 43a1d56debSopenharmony_ci 44a1d56debSopenharmony_ci let target = str_to_c_char("Width"); 45a1d56debSopenharmony_ci let width = ylong_json_get_object_item(image, target); 46a1d56debSopenharmony_ci let _ = CString::from_raw(target); 47a1d56debSopenharmony_ci let mut ptr: c_double = 0f64; 48a1d56debSopenharmony_ci assert_eq!( 49a1d56debSopenharmony_ci ylong_json_get_double_value_from_number(width, &mut ptr as *mut c_double), 50a1d56debSopenharmony_ci 1 51a1d56debSopenharmony_ci ); 52a1d56debSopenharmony_ci assert_eq!(ptr, 800f64); 53a1d56debSopenharmony_ci 54a1d56debSopenharmony_ci let target = str_to_c_char("Height"); 55a1d56debSopenharmony_ci let height = ylong_json_get_object_item(image, target); 56a1d56debSopenharmony_ci let _ = CString::from_raw(target); 57a1d56debSopenharmony_ci let mut ptr: c_double = 0f64; 58a1d56debSopenharmony_ci assert_eq!( 59a1d56debSopenharmony_ci ylong_json_get_double_value_from_number(height, &mut ptr as *mut c_double), 60a1d56debSopenharmony_ci 1 61a1d56debSopenharmony_ci ); 62a1d56debSopenharmony_ci assert_eq!(ptr, 600f64); 63a1d56debSopenharmony_ci 64a1d56debSopenharmony_ci let target = str_to_c_char("Title"); 65a1d56debSopenharmony_ci let title = ylong_json_get_object_item(image, target); 66a1d56debSopenharmony_ci let _ = CString::from_raw(target); 67a1d56debSopenharmony_ci let mut ptr: *mut c_char = null_mut::<c_char>(); 68a1d56debSopenharmony_ci assert_eq!( 69a1d56debSopenharmony_ci ylong_json_get_value_from_string(title, &mut ptr as *mut *mut c_char), 70a1d56debSopenharmony_ci 1 71a1d56debSopenharmony_ci ); 72a1d56debSopenharmony_ci assert_eq!( 73a1d56debSopenharmony_ci CStr::from_ptr(ptr).to_str().unwrap(), 74a1d56debSopenharmony_ci "View from 15th Floor" 75a1d56debSopenharmony_ci ); 76a1d56debSopenharmony_ci 77a1d56debSopenharmony_ci let target = str_to_c_char("Thumbnail"); 78a1d56debSopenharmony_ci let thumbnail = ylong_json_get_object_item(image, target); 79a1d56debSopenharmony_ci let _ = CString::from_raw(target); 80a1d56debSopenharmony_ci assert_eq!(ylong_json_is_object(thumbnail), 1); 81a1d56debSopenharmony_ci 82a1d56debSopenharmony_ci let target = str_to_c_char("Url"); 83a1d56debSopenharmony_ci let url = ylong_json_get_object_item(thumbnail, target); 84a1d56debSopenharmony_ci let _ = CString::from_raw(target); 85a1d56debSopenharmony_ci let mut ptr: *mut c_char = null_mut::<c_char>(); 86a1d56debSopenharmony_ci assert_eq!( 87a1d56debSopenharmony_ci ylong_json_get_value_from_string(url, &mut ptr as *mut *mut c_char), 88a1d56debSopenharmony_ci 1 89a1d56debSopenharmony_ci ); 90a1d56debSopenharmony_ci assert_eq!( 91a1d56debSopenharmony_ci CStr::from_ptr(ptr).to_str().unwrap(), 92a1d56debSopenharmony_ci "http://www.example.com/image/481989943" 93a1d56debSopenharmony_ci ); 94a1d56debSopenharmony_ci 95a1d56debSopenharmony_ci let target = str_to_c_char("Height"); 96a1d56debSopenharmony_ci let height = ylong_json_get_object_item(thumbnail, target); 97a1d56debSopenharmony_ci let _ = CString::from_raw(target); 98a1d56debSopenharmony_ci let mut ptr: c_double = 0f64; 99a1d56debSopenharmony_ci assert_eq!( 100a1d56debSopenharmony_ci ylong_json_get_double_value_from_number(height, &mut ptr as *mut c_double), 101a1d56debSopenharmony_ci 1 102a1d56debSopenharmony_ci ); 103a1d56debSopenharmony_ci assert_eq!(ptr, 125f64); 104a1d56debSopenharmony_ci 105a1d56debSopenharmony_ci let target = str_to_c_char("Width"); 106a1d56debSopenharmony_ci let width = ylong_json_get_object_item(thumbnail, target); 107a1d56debSopenharmony_ci let _ = CString::from_raw(target); 108a1d56debSopenharmony_ci let mut ptr: c_double = 0f64; 109a1d56debSopenharmony_ci assert_eq!( 110a1d56debSopenharmony_ci ylong_json_get_double_value_from_number(width, &mut ptr as *mut c_double), 111a1d56debSopenharmony_ci 1 112a1d56debSopenharmony_ci ); 113a1d56debSopenharmony_ci assert_eq!(ptr, 100f64); 114a1d56debSopenharmony_ci 115a1d56debSopenharmony_ci let target = str_to_c_char("Animated"); 116a1d56debSopenharmony_ci let animated = ylong_json_get_object_item(image, target); 117a1d56debSopenharmony_ci let _ = CString::from_raw(target); 118a1d56debSopenharmony_ci let mut ptr: c_int = 0; 119a1d56debSopenharmony_ci assert_eq!( 120a1d56debSopenharmony_ci ylong_json_get_value_from_bool(animated, &mut ptr as *mut c_int), 121a1d56debSopenharmony_ci 1 122a1d56debSopenharmony_ci ); 123a1d56debSopenharmony_ci assert_eq!(ptr, 0); 124a1d56debSopenharmony_ci 125a1d56debSopenharmony_ci let target = str_to_c_char("IDs"); 126a1d56debSopenharmony_ci let ids = ylong_json_get_object_item(image, target); 127a1d56debSopenharmony_ci let _ = CString::from_raw(target); 128a1d56debSopenharmony_ci 129a1d56debSopenharmony_ci assert_eq!(ylong_json_is_array(ids), 1); 130a1d56debSopenharmony_ci 131a1d56debSopenharmony_ci let item = ylong_json_get_array_item(ids, 0); 132a1d56debSopenharmony_ci let mut ptr = 0f64; 133a1d56debSopenharmony_ci assert_eq!( 134a1d56debSopenharmony_ci ylong_json_get_double_value_from_number(item, &mut ptr as *mut c_double), 135a1d56debSopenharmony_ci 1 136a1d56debSopenharmony_ci ); 137a1d56debSopenharmony_ci assert_eq!(ptr, 116f64); 138a1d56debSopenharmony_ci 139a1d56debSopenharmony_ci let item = ylong_json_get_array_item(ids, 1); 140a1d56debSopenharmony_ci let mut ptr = 0f64; 141a1d56debSopenharmony_ci assert_eq!( 142a1d56debSopenharmony_ci ylong_json_get_double_value_from_number(item, &mut ptr as *mut c_double), 143a1d56debSopenharmony_ci 1 144a1d56debSopenharmony_ci ); 145a1d56debSopenharmony_ci assert_eq!(ptr, 943f64); 146a1d56debSopenharmony_ci 147a1d56debSopenharmony_ci let item = ylong_json_get_array_item(ids, 2); 148a1d56debSopenharmony_ci let mut ptr = 0f64; 149a1d56debSopenharmony_ci assert_eq!( 150a1d56debSopenharmony_ci ylong_json_get_double_value_from_number(item, &mut ptr as *mut c_double), 151a1d56debSopenharmony_ci 1 152a1d56debSopenharmony_ci ); 153a1d56debSopenharmony_ci assert_eq!(ptr, 234f64); 154a1d56debSopenharmony_ci 155a1d56debSopenharmony_ci let item = ylong_json_get_array_item(ids, 3); 156a1d56debSopenharmony_ci let mut ptr = 0f64; 157a1d56debSopenharmony_ci assert_eq!( 158a1d56debSopenharmony_ci ylong_json_get_double_value_from_number(item, &mut ptr as *mut c_double), 159a1d56debSopenharmony_ci 1 160a1d56debSopenharmony_ci ); 161a1d56debSopenharmony_ci assert_eq!(ptr, 38793f64); 162a1d56debSopenharmony_ci }}; 163a1d56debSopenharmony_ci} 164a1d56debSopenharmony_ci 165a1d56debSopenharmony_ci#[test] 166a1d56debSopenharmony_cifn sdv_adapter_test() { 167a1d56debSopenharmony_ci unsafe { 168a1d56debSopenharmony_ci sdv_adapter_parse_and_print(); 169a1d56debSopenharmony_ci sdv_adapter_parse_memory_check(); 170a1d56debSopenharmony_ci } 171a1d56debSopenharmony_ci} 172a1d56debSopenharmony_ci 173a1d56debSopenharmony_ciunsafe fn str_to_c_char(str: &str) -> *mut c_char { 174a1d56debSopenharmony_ci CString::from_vec_unchecked(str.as_bytes().to_vec()).into_raw() 175a1d56debSopenharmony_ci} 176a1d56debSopenharmony_ci 177a1d56debSopenharmony_ciunsafe fn sdv_adapter_parse_and_print() { 178a1d56debSopenharmony_ci let text = str_to_c_char(RFC7159_EXAMPLE1); 179a1d56debSopenharmony_ci 180a1d56debSopenharmony_ci let msg = null_mut::<c_char>(); 181a1d56debSopenharmony_ci let mut json = Some(ylong_json_parse( 182a1d56debSopenharmony_ci text, 183a1d56debSopenharmony_ci &msg as *const *mut c_char as *mut *mut c_char, 184a1d56debSopenharmony_ci )); 185a1d56debSopenharmony_ci 186a1d56debSopenharmony_ci for _ in 0..1000 { 187a1d56debSopenharmony_ci let curr = json.take().unwrap(); 188a1d56debSopenharmony_ci 189a1d56debSopenharmony_ci let curr_str = ylong_json_print_unformatted(curr); 190a1d56debSopenharmony_ci 191a1d56debSopenharmony_ci let msg = null_mut::<c_char>(); 192a1d56debSopenharmony_ci let new = ylong_json_parse(curr_str, &msg as *const *mut c_char as *mut *mut c_char); 193a1d56debSopenharmony_ci 194a1d56debSopenharmony_ci let _ = CString::from_raw(curr_str); 195a1d56debSopenharmony_ci 196a1d56debSopenharmony_ci test_json!(new); 197a1d56debSopenharmony_ci 198a1d56debSopenharmony_ci json = Some(new); 199a1d56debSopenharmony_ci ylong_json_delete(curr); 200a1d56debSopenharmony_ci } 201a1d56debSopenharmony_ci 202a1d56debSopenharmony_ci ylong_json_delete(json.take().unwrap()); 203a1d56debSopenharmony_ci 204a1d56debSopenharmony_ci // 析构 text 205a1d56debSopenharmony_ci let _ = CString::from_raw(text); 206a1d56debSopenharmony_ci} 207a1d56debSopenharmony_ci 208a1d56debSopenharmony_ciunsafe fn sdv_adapter_parse_memory_check() { 209a1d56debSopenharmony_ci const TEXT: &str = r#" 210a1d56debSopenharmony_ci{ 211a1d56debSopenharmony_ci "null": null, 212a1d56debSopenharmony_ci "true": true, 213a1d56debSopenharmony_ci "false": false, 214a1d56debSopenharmony_ci "number": 3.14, 215a1d56debSopenharmony_ci "string": "Hello World!", 216a1d56debSopenharmony_ci "array": [1, 2, 3], 217a1d56debSopenharmony_ci "object": { 218a1d56debSopenharmony_ci "key1": 1, 219a1d56debSopenharmony_ci "key2": 2, 220a1d56debSopenharmony_ci "key3": 3 221a1d56debSopenharmony_ci } 222a1d56debSopenharmony_ci} 223a1d56debSopenharmony_ci"#; 224a1d56debSopenharmony_ci 225a1d56debSopenharmony_ci let text = str_to_c_char(TEXT); 226a1d56debSopenharmony_ci let msg = null_mut::<c_char>(); 227a1d56debSopenharmony_ci let json = ylong_json_parse(text, &msg as *const *mut c_char as *mut *mut c_char); 228a1d56debSopenharmony_ci let _ = Box::from_raw(text); 229a1d56debSopenharmony_ci 230a1d56debSopenharmony_ci assert!(msg.is_null()); 231a1d56debSopenharmony_ci let result = ylong_json_print_unformatted(json); 232a1d56debSopenharmony_ci ylong_json_free_string(result); 233a1d56debSopenharmony_ci 234a1d56debSopenharmony_ci let duplicate = ylong_json_duplicate(json, 1); 235a1d56debSopenharmony_ci ylong_json_delete(duplicate); 236a1d56debSopenharmony_ci 237a1d56debSopenharmony_ci let null = ylong_json_create_null(); 238a1d56debSopenharmony_ci ylong_json_delete(null); 239a1d56debSopenharmony_ci 240a1d56debSopenharmony_ci let index = str_to_c_char("string"); 241a1d56debSopenharmony_ci let string = ylong_json_get_object_item(json, index); 242a1d56debSopenharmony_ci let content = null_mut::<c_char>(); 243a1d56debSopenharmony_ci ylong_json_get_value_from_string(string, &content as *const *mut c_char as *mut *mut c_char); 244a1d56debSopenharmony_ci let _ = Box::from_raw(index); 245a1d56debSopenharmony_ci 246a1d56debSopenharmony_ci let null = ylong_json_create_null(); 247a1d56debSopenharmony_ci let index = str_to_c_char("123"); 248a1d56debSopenharmony_ci ylong_json_add_item_to_object(json, index, null); 249a1d56debSopenharmony_ci 250a1d56debSopenharmony_ci let content = str_to_c_char("aaaa"); 251a1d56debSopenharmony_ci let string = ylong_json_create_string(content); 252a1d56debSopenharmony_ci ylong_json_replace_object_item_by_index(json, index, string); 253a1d56debSopenharmony_ci let _ = Box::from_raw(content); 254a1d56debSopenharmony_ci 255a1d56debSopenharmony_ci let removed = ylong_json_remove_object_item_by_index(json, index); 256a1d56debSopenharmony_ci ylong_json_delete(removed); 257a1d56debSopenharmony_ci let _ = Box::from_raw(index); 258a1d56debSopenharmony_ci 259a1d56debSopenharmony_ci extern "C" fn func(_value: *mut YlongJson) {} 260a1d56debSopenharmony_ci ylong_json_for_each_object_item(json, func); 261a1d56debSopenharmony_ci 262a1d56debSopenharmony_ci ylong_json_delete(json); 263a1d56debSopenharmony_ci} 264