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