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 crate::{Array, JsonValue, Object};
15a1d56debSopenharmony_ci
16a1d56debSopenharmony_ci/// Static NULL, which is returned if the searched key-value pair does not exist.
17a1d56debSopenharmony_cistatic NULL: JsonValue = JsonValue::Null;
18a1d56debSopenharmony_ci
19a1d56debSopenharmony_ci/// This trait can be used to get an index based on the subscript of an internal member of JsonValue.
20a1d56debSopenharmony_cipub trait Index: private::IndexSealed {
21a1d56debSopenharmony_ci    /// Gets a common reference to the value with the specified subscript (or key) from a JsonValue.
22a1d56debSopenharmony_ci    fn index_into<'a>(&self, value: &'a JsonValue) -> &'a JsonValue;
23a1d56debSopenharmony_ci
24a1d56debSopenharmony_ci    /// Gets a mutable reference to the value of the specified subscript (or key) from a JsonValue.
25a1d56debSopenharmony_ci    fn index_into_mut<'a>(&self, value: &'a mut JsonValue) -> &'a mut JsonValue;
26a1d56debSopenharmony_ci
27a1d56debSopenharmony_ci    /// Removes the member with the specified subscript (or key) from a JsonValue.
28a1d56debSopenharmony_ci    fn index_remove(&self, value: &mut JsonValue) -> Option<JsonValue>;
29a1d56debSopenharmony_ci}
30a1d56debSopenharmony_ci
31a1d56debSopenharmony_ciimpl Index for usize {
32a1d56debSopenharmony_ci    /// Uses the array subscript to visit the Array type of JsonValue
33a1d56debSopenharmony_ci    /// and get a common reference to the corresponding JsonValue.
34a1d56debSopenharmony_ci    /// A null type will be returned in the following two cases:
35a1d56debSopenharmony_ci    ///
36a1d56debSopenharmony_ci    /// 1.Use a subscript to visit non-array types.
37a1d56debSopenharmony_ci    ///
38a1d56debSopenharmony_ci    /// 2.The subscript exceeds the current length of the Array type.
39a1d56debSopenharmony_ci    ///
40a1d56debSopenharmony_ci    /// # Examples
41a1d56debSopenharmony_ci    /// ```
42a1d56debSopenharmony_ci    /// use ylong_json::{JsonValue, Array};
43a1d56debSopenharmony_ci    ///
44a1d56debSopenharmony_ci    /// // Non-array types
45a1d56debSopenharmony_ci    /// assert_eq!(JsonValue::Number(0.0.into())[0], JsonValue::Null);
46a1d56debSopenharmony_ci    ///
47a1d56debSopenharmony_ci    /// // Array type
48a1d56debSopenharmony_ci    /// let mut array = Array::new();
49a1d56debSopenharmony_ci    /// array.push(JsonValue::Null);
50a1d56debSopenharmony_ci    /// array.push(JsonValue::Boolean(true));
51a1d56debSopenharmony_ci    /// array.push(JsonValue::Number(0.0.into()));
52a1d56debSopenharmony_ci    ///
53a1d56debSopenharmony_ci    /// let value = JsonValue::Array(array);
54a1d56debSopenharmony_ci    ///
55a1d56debSopenharmony_ci    /// // When subscript < length
56a1d56debSopenharmony_ci    /// assert_eq!(value[0], JsonValue::Null);
57a1d56debSopenharmony_ci    /// assert_eq!(value[1], JsonValue::Boolean(true));
58a1d56debSopenharmony_ci    /// assert_eq!(value[2], JsonValue::Number(0.0.into()));
59a1d56debSopenharmony_ci    /// // When subscript >= length
60a1d56debSopenharmony_ci    /// assert_eq!(value[3], JsonValue::Null);
61a1d56debSopenharmony_ci    /// ```
62a1d56debSopenharmony_ci    fn index_into<'a>(&self, value: &'a JsonValue) -> &'a JsonValue {
63a1d56debSopenharmony_ci        if let JsonValue::Array(ref array) = value {
64a1d56debSopenharmony_ci            if *self < array.len() {
65a1d56debSopenharmony_ci                return array.get(*self).unwrap();
66a1d56debSopenharmony_ci            }
67a1d56debSopenharmony_ci        }
68a1d56debSopenharmony_ci        &NULL
69a1d56debSopenharmony_ci    }
70a1d56debSopenharmony_ci
71a1d56debSopenharmony_ci    /// Uses the array subscript to visit the Array type of JsonValue
72a1d56debSopenharmony_ci    /// and get a mutable reference to the corresponding JsonValue.
73a1d56debSopenharmony_ci    ///
74a1d56debSopenharmony_ci    /// If the visited JsonValue is not Array type, the JsonValue will be
75a1d56debSopenharmony_ci    /// replaced with an empty Array type and visits again with that subscript.
76a1d56debSopenharmony_ci    ///
77a1d56debSopenharmony_ci    /// If the visited JsonValue is Array type, but the subscript exceeds the length of the array,
78a1d56debSopenharmony_ci    /// then adds a Null type JsonValue at the end of the array and return a mutable reference of it.
79a1d56debSopenharmony_ci    ///
80a1d56debSopenharmony_ci    /// # Examples
81a1d56debSopenharmony_ci    /// ```
82a1d56debSopenharmony_ci    /// use ylong_json::{JsonValue, Array};
83a1d56debSopenharmony_ci    ///
84a1d56debSopenharmony_ci    /// // Non-array types
85a1d56debSopenharmony_ci    /// let mut value = JsonValue::Null;
86a1d56debSopenharmony_ci    /// value[0] = JsonValue::Null;
87a1d56debSopenharmony_ci    ///
88a1d56debSopenharmony_ci    /// let mut array = Array::new();
89a1d56debSopenharmony_ci    /// array.push(JsonValue::Null);
90a1d56debSopenharmony_ci    /// assert_eq!(value, JsonValue::Array(array));
91a1d56debSopenharmony_ci    ///
92a1d56debSopenharmony_ci    /// // Array type
93a1d56debSopenharmony_ci    /// let mut array = Array::new();
94a1d56debSopenharmony_ci    /// array.push(JsonValue::Null);
95a1d56debSopenharmony_ci    /// let mut value = JsonValue::Array(array);
96a1d56debSopenharmony_ci    ///
97a1d56debSopenharmony_ci    /// // Contains the subscript
98a1d56debSopenharmony_ci    /// value[0] = JsonValue::Number(0.0.into());
99a1d56debSopenharmony_ci    /// assert_eq!(value[0], JsonValue::Number(0.0.into()));
100a1d56debSopenharmony_ci    /// assert_eq!(value.try_as_array().unwrap().len(), 1);
101a1d56debSopenharmony_ci    ///
102a1d56debSopenharmony_ci    /// // Does not contain the subscript
103a1d56debSopenharmony_ci    /// value[1] = JsonValue::Boolean(true);
104a1d56debSopenharmony_ci    /// assert_eq!(value[1], JsonValue::Boolean(true));
105a1d56debSopenharmony_ci    /// assert_eq!(value.try_as_array().unwrap().len(), 2);
106a1d56debSopenharmony_ci    /// ```
107a1d56debSopenharmony_ci    fn index_into_mut<'a>(&self, value: &'a mut JsonValue) -> &'a mut JsonValue {
108a1d56debSopenharmony_ci        if let JsonValue::Array(ref mut array) = value {
109a1d56debSopenharmony_ci            return if *self < array.len() {
110a1d56debSopenharmony_ci                array.get_mut(*self).unwrap()
111a1d56debSopenharmony_ci            } else {
112a1d56debSopenharmony_ci                array.push(JsonValue::Null);
113a1d56debSopenharmony_ci                array.last_mut().unwrap()
114a1d56debSopenharmony_ci            };
115a1d56debSopenharmony_ci        }
116a1d56debSopenharmony_ci        *value = JsonValue::new_array(Array::new());
117a1d56debSopenharmony_ci        self.index_into_mut(value)
118a1d56debSopenharmony_ci    }
119a1d56debSopenharmony_ci
120a1d56debSopenharmony_ci    /// Removes the element at the specified location of Array type JsonValue and returns that content.
121a1d56debSopenharmony_ci    ///
122a1d56debSopenharmony_ci    /// # Examples
123a1d56debSopenharmony_ci    /// ```
124a1d56debSopenharmony_ci    /// use ylong_json::{JsonValue, Array};
125a1d56debSopenharmony_ci    ///
126a1d56debSopenharmony_ci    /// let mut array = Array::new();
127a1d56debSopenharmony_ci    /// array.push(1i32.into());
128a1d56debSopenharmony_ci    ///
129a1d56debSopenharmony_ci    /// let mut value: JsonValue = JsonValue::Array(array);
130a1d56debSopenharmony_ci    /// assert_eq!(value[0], 1i32.into());
131a1d56debSopenharmony_ci    ///
132a1d56debSopenharmony_ci    /// let ret = value.remove(0);
133a1d56debSopenharmony_ci    /// assert_eq!(value[0], JsonValue::Null);
134a1d56debSopenharmony_ci    /// assert_eq!(ret.unwrap(), 1i32.into());
135a1d56debSopenharmony_ci    /// ```
136a1d56debSopenharmony_ci    fn index_remove(&self, value: &mut JsonValue) -> Option<JsonValue> {
137a1d56debSopenharmony_ci        if let JsonValue::Array(ref mut array) = value {
138a1d56debSopenharmony_ci            if *self < array.len() {
139a1d56debSopenharmony_ci                return array.remove(*self);
140a1d56debSopenharmony_ci            }
141a1d56debSopenharmony_ci        }
142a1d56debSopenharmony_ci        None
143a1d56debSopenharmony_ci    }
144a1d56debSopenharmony_ci}
145a1d56debSopenharmony_ci
146a1d56debSopenharmony_ciimpl Index for str {
147a1d56debSopenharmony_ci    /// Uses key to visit Object type JsonValue, and returns a common reference to corresponding JsonValue.
148a1d56debSopenharmony_ci    /// A null type will be returned in the following two cases:
149a1d56debSopenharmony_ci    ///
150a1d56debSopenharmony_ci    /// 1.Uses key to visit non-object types.
151a1d56debSopenharmony_ci    ///
152a1d56debSopenharmony_ci    /// 2.The searched Object type does not contain the key.
153a1d56debSopenharmony_ci    ///
154a1d56debSopenharmony_ci    /// # Examples
155a1d56debSopenharmony_ci    /// ```
156a1d56debSopenharmony_ci    /// use ylong_json::{JsonValue, Object};
157a1d56debSopenharmony_ci    ///
158a1d56debSopenharmony_ci    /// // Non-object types
159a1d56debSopenharmony_ci    /// assert_eq!(JsonValue::Number(0.0.into())["key"], JsonValue::Null);
160a1d56debSopenharmony_ci    ///
161a1d56debSopenharmony_ci    /// // Object type
162a1d56debSopenharmony_ci    /// let mut object = Object::new();
163a1d56debSopenharmony_ci    /// object.insert(String::from("key"), JsonValue::Number(0.0.into()));
164a1d56debSopenharmony_ci    ///
165a1d56debSopenharmony_ci    /// let value = JsonValue::Object(object);
166a1d56debSopenharmony_ci    ///
167a1d56debSopenharmony_ci    /// // The key exists.
168a1d56debSopenharmony_ci    /// assert_eq!(value["key"], JsonValue::Number(0.0.into()));
169a1d56debSopenharmony_ci    ///
170a1d56debSopenharmony_ci    /// // The key does not exist.
171a1d56debSopenharmony_ci    /// assert_eq!(value["not exist"], JsonValue::Null);
172a1d56debSopenharmony_ci    /// ```
173a1d56debSopenharmony_ci    fn index_into<'a>(&self, value: &'a JsonValue) -> &'a JsonValue {
174a1d56debSopenharmony_ci        if let JsonValue::Object(ref object) = value {
175a1d56debSopenharmony_ci            return object.get(self).unwrap_or(&NULL);
176a1d56debSopenharmony_ci        }
177a1d56debSopenharmony_ci        &NULL
178a1d56debSopenharmony_ci    }
179a1d56debSopenharmony_ci
180a1d56debSopenharmony_ci    /// Uses key to visit Object type JsonValue, and returns a mutable reference to corresponding JsonValue.
181a1d56debSopenharmony_ci    ///
182a1d56debSopenharmony_ci    /// If the visited JsonValue is not Object type, the JsonValue will be
183a1d56debSopenharmony_ci    /// replaced with an empty Object type and visits again with that key.
184a1d56debSopenharmony_ci    ///
185a1d56debSopenharmony_ci    /// If the visited JsonValue is of object type but does not contain the key, a key-value pair of
186a1d56debSopenharmony_ci    /// the key and a null type will be inserted and returns a mutable reference to the JsonValue.
187a1d56debSopenharmony_ci    ///
188a1d56debSopenharmony_ci    ///
189a1d56debSopenharmony_ci    /// # Examples
190a1d56debSopenharmony_ci    /// ```
191a1d56debSopenharmony_ci    /// use ylong_json::{JsonValue, Object};
192a1d56debSopenharmony_ci    ///
193a1d56debSopenharmony_ci    /// // Non-object types
194a1d56debSopenharmony_ci    /// let mut value = JsonValue::Null;
195a1d56debSopenharmony_ci    /// let mut object = Object::new();
196a1d56debSopenharmony_ci    /// object.insert(String::from("key"), JsonValue::Number(0.0.into()));
197a1d56debSopenharmony_ci    ///
198a1d56debSopenharmony_ci    /// value["key"] = JsonValue::Number(0.0.into());
199a1d56debSopenharmony_ci    /// assert_eq!(value, JsonValue::Object(object));
200a1d56debSopenharmony_ci    ///
201a1d56debSopenharmony_ci    /// // Object type
202a1d56debSopenharmony_ci    /// let mut object = Object::new();
203a1d56debSopenharmony_ci    /// object.insert(String::from("key"), JsonValue::Number(0.0.into()));
204a1d56debSopenharmony_ci    /// let mut value = JsonValue::Object(object);
205a1d56debSopenharmony_ci    ///
206a1d56debSopenharmony_ci    /// // Contains the key.
207a1d56debSopenharmony_ci    /// value["key"] = JsonValue::Boolean(true);
208a1d56debSopenharmony_ci    /// assert_eq!(value["key"], JsonValue::Boolean(true));
209a1d56debSopenharmony_ci    /// assert_eq!(value.try_as_mut_object().unwrap().len(), 1);
210a1d56debSopenharmony_ci    ///
211a1d56debSopenharmony_ci    /// // Dose not contain the key.
212a1d56debSopenharmony_ci    /// value["not exist"] = JsonValue::Number(1.1.into());
213a1d56debSopenharmony_ci    /// assert_eq!(value["not exist"], JsonValue::Number(1.1.into()));
214a1d56debSopenharmony_ci    /// assert_eq!(value.try_as_mut_object().unwrap().len(), 2);
215a1d56debSopenharmony_ci    /// ```
216a1d56debSopenharmony_ci    fn index_into_mut<'a>(&self, value: &'a mut JsonValue) -> &'a mut JsonValue {
217a1d56debSopenharmony_ci        if let JsonValue::Object(ref mut object) = value {
218a1d56debSopenharmony_ci            #[cfg(feature = "list_object")]
219a1d56debSopenharmony_ci            {
220a1d56debSopenharmony_ci                return object.get_key_mut_maybe_insert(self);
221a1d56debSopenharmony_ci            }
222a1d56debSopenharmony_ci            #[cfg(feature = "vec_object")]
223a1d56debSopenharmony_ci            {
224a1d56debSopenharmony_ci                if let Some(pos) = object.iter().position(|(k, _)| k == self) {
225a1d56debSopenharmony_ci                    return object.get_mut_by_position(pos).unwrap();
226a1d56debSopenharmony_ci                }
227a1d56debSopenharmony_ci                object.insert(String::from(self), JsonValue::Null);
228a1d56debSopenharmony_ci                return object.last_mut().unwrap();
229a1d56debSopenharmony_ci            }
230a1d56debSopenharmony_ci            #[cfg(feature = "btree_object")]
231a1d56debSopenharmony_ci            {
232a1d56debSopenharmony_ci                if !object.contains_key(self) {
233a1d56debSopenharmony_ci                    object.insert(String::from(self), JsonValue::Null);
234a1d56debSopenharmony_ci                }
235a1d56debSopenharmony_ci                return object.get_mut(self).unwrap();
236a1d56debSopenharmony_ci            }
237a1d56debSopenharmony_ci        }
238a1d56debSopenharmony_ci        *value = JsonValue::Object(Object::new());
239a1d56debSopenharmony_ci        self.index_into_mut(value)
240a1d56debSopenharmony_ci    }
241a1d56debSopenharmony_ci
242a1d56debSopenharmony_ci    /// Removes the element at the specified location of Object type JsonValue and returns that content.
243a1d56debSopenharmony_ci    ///
244a1d56debSopenharmony_ci    /// # Examples
245a1d56debSopenharmony_ci    /// ```
246a1d56debSopenharmony_ci    /// use ylong_json::{Object, JsonValue};
247a1d56debSopenharmony_ci    ///
248a1d56debSopenharmony_ci    /// let mut object = Object::new();
249a1d56debSopenharmony_ci    /// object.insert(String::from("key"), "value".into());
250a1d56debSopenharmony_ci    ///
251a1d56debSopenharmony_ci    /// let mut value: JsonValue = object.into();
252a1d56debSopenharmony_ci    /// assert_eq!(value["key"], "value".into());
253a1d56debSopenharmony_ci    ///
254a1d56debSopenharmony_ci    /// let ret = value.remove("key");
255a1d56debSopenharmony_ci    /// assert_eq!(value["key"], JsonValue::Null);
256a1d56debSopenharmony_ci    /// assert_eq!(ret.unwrap(), "value".into());
257a1d56debSopenharmony_ci    /// ```
258a1d56debSopenharmony_ci    fn index_remove(&self, value: &mut JsonValue) -> Option<JsonValue> {
259a1d56debSopenharmony_ci        if let JsonValue::Object(ref mut object) = value {
260a1d56debSopenharmony_ci            return object.remove(self);
261a1d56debSopenharmony_ci        }
262a1d56debSopenharmony_ci        None
263a1d56debSopenharmony_ci    }
264a1d56debSopenharmony_ci}
265a1d56debSopenharmony_ci
266a1d56debSopenharmony_ciimpl Index for String {
267a1d56debSopenharmony_ci    /// Same as 'Index for str'.
268a1d56debSopenharmony_ci    fn index_into<'a>(&self, value: &'a JsonValue) -> &'a JsonValue {
269a1d56debSopenharmony_ci        self.as_str().index_into(value)
270a1d56debSopenharmony_ci    }
271a1d56debSopenharmony_ci
272a1d56debSopenharmony_ci    /// Same as 'Index for str'.
273a1d56debSopenharmony_ci    fn index_into_mut<'a>(&self, value: &'a mut JsonValue) -> &'a mut JsonValue {
274a1d56debSopenharmony_ci        self.as_str().index_into_mut(value)
275a1d56debSopenharmony_ci    }
276a1d56debSopenharmony_ci
277a1d56debSopenharmony_ci    /// Same as 'Index for str'.
278a1d56debSopenharmony_ci    fn index_remove(&self, value: &mut JsonValue) -> Option<JsonValue> {
279a1d56debSopenharmony_ci        self.as_str().index_remove(value)
280a1d56debSopenharmony_ci    }
281a1d56debSopenharmony_ci}
282a1d56debSopenharmony_ci
283a1d56debSopenharmony_ciimpl<'a, T> Index for &'a T
284a1d56debSopenharmony_ciwhere
285a1d56debSopenharmony_ci    T: ?Sized + Index,
286a1d56debSopenharmony_ci{
287a1d56debSopenharmony_ci    /// Implements Index for the relevant reference type.
288a1d56debSopenharmony_ci    fn index_into<'v>(&self, value: &'v JsonValue) -> &'v JsonValue {
289a1d56debSopenharmony_ci        (**self).index_into(value)
290a1d56debSopenharmony_ci    }
291a1d56debSopenharmony_ci
292a1d56debSopenharmony_ci    /// Implements Index for the relevant reference type.
293a1d56debSopenharmony_ci    fn index_into_mut<'v>(&self, value: &'v mut JsonValue) -> &'v mut JsonValue {
294a1d56debSopenharmony_ci        (**self).index_into_mut(value)
295a1d56debSopenharmony_ci    }
296a1d56debSopenharmony_ci
297a1d56debSopenharmony_ci    /// Implements Index for the relevant reference type.
298a1d56debSopenharmony_ci    fn index_remove(&self, value: &mut JsonValue) -> Option<JsonValue> {
299a1d56debSopenharmony_ci        (**self).index_remove(value)
300a1d56debSopenharmony_ci    }
301a1d56debSopenharmony_ci}
302a1d56debSopenharmony_ci
303a1d56debSopenharmony_ci// To prevent the Index by external implementation.
304a1d56debSopenharmony_cimod private {
305a1d56debSopenharmony_ci    pub trait IndexSealed {}
306a1d56debSopenharmony_ci
307a1d56debSopenharmony_ci    impl IndexSealed for usize {}
308a1d56debSopenharmony_ci
309a1d56debSopenharmony_ci    impl IndexSealed for str {}
310a1d56debSopenharmony_ci
311a1d56debSopenharmony_ci    impl IndexSealed for String {}
312a1d56debSopenharmony_ci
313a1d56debSopenharmony_ci    impl<'a, T> IndexSealed for &'a T where T: ?Sized + IndexSealed {}
314a1d56debSopenharmony_ci}
315a1d56debSopenharmony_ci
316a1d56debSopenharmony_ci#[cfg(test)]
317a1d56debSopenharmony_cimod ut_index {
318a1d56debSopenharmony_ci    use crate::{Array, Index, JsonValue, Object};
319a1d56debSopenharmony_ci
320a1d56debSopenharmony_ci    /// UT test for `usize::index_into`.
321a1d56debSopenharmony_ci    ///
322a1d56debSopenharmony_ci    /// # Title
323a1d56debSopenharmony_ci    /// ut_usize_index_into
324a1d56debSopenharmony_ci    ///
325a1d56debSopenharmony_ci    /// # Brief
326a1d56debSopenharmony_ci    /// 1. Creates some `usize`s and some `JsonValue`s.
327a1d56debSopenharmony_ci    /// 2. Calls `Index::index_into`.
328a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
329a1d56debSopenharmony_ci    #[test]
330a1d56debSopenharmony_ci    fn ut_usize_index_into() {
331a1d56debSopenharmony_ci        let value = JsonValue::new_boolean(true);
332a1d56debSopenharmony_ci        assert!(1usize.index_into(&value).is_null());
333a1d56debSopenharmony_ci    }
334a1d56debSopenharmony_ci
335a1d56debSopenharmony_ci    /// UT test for `usize::index_into_mut`.
336a1d56debSopenharmony_ci    ///
337a1d56debSopenharmony_ci    /// # Title
338a1d56debSopenharmony_ci    /// ut_usize_index_into_mut
339a1d56debSopenharmony_ci    ///
340a1d56debSopenharmony_ci    /// # Brief
341a1d56debSopenharmony_ci    /// 1. Creates some `usize`s and some `JsonValue`s.
342a1d56debSopenharmony_ci    /// 2. Calls `Index::index_into_mut`.
343a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
344a1d56debSopenharmony_ci    #[test]
345a1d56debSopenharmony_ci    fn ut_usize_index_into_mut() {
346a1d56debSopenharmony_ci        let mut value = JsonValue::new_array(array!(1));
347a1d56debSopenharmony_ci        assert!(0usize.index_into_mut(&mut value).is_number());
348a1d56debSopenharmony_ci        assert!(1usize.index_into_mut(&mut value).is_null());
349a1d56debSopenharmony_ci
350a1d56debSopenharmony_ci        let mut value = JsonValue::new_null();
351a1d56debSopenharmony_ci        assert!(0usize.index_into_mut(&mut value).is_null());
352a1d56debSopenharmony_ci        assert!(value.is_array())
353a1d56debSopenharmony_ci    }
354a1d56debSopenharmony_ci
355a1d56debSopenharmony_ci    /// UT test for `usize::index_remove`.
356a1d56debSopenharmony_ci    ///
357a1d56debSopenharmony_ci    /// # Title
358a1d56debSopenharmony_ci    /// ut_usize_index_remove
359a1d56debSopenharmony_ci    ///
360a1d56debSopenharmony_ci    /// # Brief
361a1d56debSopenharmony_ci    /// 1. Creates some `usize`s and some `JsonValue`s.
362a1d56debSopenharmony_ci    /// 2. Calls `Index::index_remove`.
363a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
364a1d56debSopenharmony_ci    #[test]
365a1d56debSopenharmony_ci    fn ut_usize_index_remove() {
366a1d56debSopenharmony_ci        let mut value = JsonValue::new_array(array!(1));
367a1d56debSopenharmony_ci        assert_eq!(
368a1d56debSopenharmony_ci            0usize.index_remove(&mut value),
369a1d56debSopenharmony_ci            Some(JsonValue::new_number(1.into()))
370a1d56debSopenharmony_ci        );
371a1d56debSopenharmony_ci        assert!(0usize.index_remove(&mut value).is_none());
372a1d56debSopenharmony_ci    }
373a1d56debSopenharmony_ci
374a1d56debSopenharmony_ci    /// UT test for `str::index_into`.
375a1d56debSopenharmony_ci    ///
376a1d56debSopenharmony_ci    /// # Title
377a1d56debSopenharmony_ci    /// ut_str_index_into
378a1d56debSopenharmony_ci    ///
379a1d56debSopenharmony_ci    /// # Brief
380a1d56debSopenharmony_ci    /// 1. Creates some `str`s and some `JsonValue`s.
381a1d56debSopenharmony_ci    /// 2. Calls `Index::index_into`.
382a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
383a1d56debSopenharmony_ci    #[test]
384a1d56debSopenharmony_ci    fn ut_str_index_into() {
385a1d56debSopenharmony_ci        let value = JsonValue::new_boolean(true);
386a1d56debSopenharmony_ci        assert!("key".index_into(&value).is_null());
387a1d56debSopenharmony_ci    }
388a1d56debSopenharmony_ci
389a1d56debSopenharmony_ci    /// UT test for `str::index_into_mut`.
390a1d56debSopenharmony_ci    ///
391a1d56debSopenharmony_ci    /// # Title
392a1d56debSopenharmony_ci    /// ut_str_index_into_mut
393a1d56debSopenharmony_ci    ///
394a1d56debSopenharmony_ci    /// # Brief
395a1d56debSopenharmony_ci    /// 1. Creates some `str`s and some `JsonValue`s.
396a1d56debSopenharmony_ci    /// 2. Calls `Index::index_into_mut`.
397a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
398a1d56debSopenharmony_ci    #[test]
399a1d56debSopenharmony_ci    fn ut_str_index_into_mut() {
400a1d56debSopenharmony_ci        let mut value = JsonValue::new_object(object!("key1" => "value1"));
401a1d56debSopenharmony_ci        assert!("key1".index_into_mut(&mut value).is_string());
402a1d56debSopenharmony_ci        assert!("key2".index_into_mut(&mut value).is_null());
403a1d56debSopenharmony_ci
404a1d56debSopenharmony_ci        let mut value = JsonValue::new_null();
405a1d56debSopenharmony_ci        assert!("key1".index_into_mut(&mut value).is_null());
406a1d56debSopenharmony_ci        assert!(value.is_object())
407a1d56debSopenharmony_ci    }
408a1d56debSopenharmony_ci
409a1d56debSopenharmony_ci    /// UT test for `str::index_remove`.
410a1d56debSopenharmony_ci    ///
411a1d56debSopenharmony_ci    /// # Title
412a1d56debSopenharmony_ci    /// ut_str_index_remove
413a1d56debSopenharmony_ci    ///
414a1d56debSopenharmony_ci    /// # Brief
415a1d56debSopenharmony_ci    /// 1. Creates some `str`s and some `JsonValue`s.
416a1d56debSopenharmony_ci    /// 2. Calls `Index::index_remove`.
417a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
418a1d56debSopenharmony_ci    #[test]
419a1d56debSopenharmony_ci    fn ut_str_index_remove() {
420a1d56debSopenharmony_ci        let mut value = JsonValue::new_object(object!("key1" => "value1"));
421a1d56debSopenharmony_ci        assert_eq!(
422a1d56debSopenharmony_ci            "key1".index_remove(&mut value),
423a1d56debSopenharmony_ci            Some(JsonValue::new_string("value1"))
424a1d56debSopenharmony_ci        );
425a1d56debSopenharmony_ci
426a1d56debSopenharmony_ci        let mut value = JsonValue::new_null();
427a1d56debSopenharmony_ci        assert!("key1".index_remove(&mut value).is_none());
428a1d56debSopenharmony_ci    }
429a1d56debSopenharmony_ci
430a1d56debSopenharmony_ci    /// UT test for `String::index_into`.
431a1d56debSopenharmony_ci    ///
432a1d56debSopenharmony_ci    /// # Title
433a1d56debSopenharmony_ci    /// ut_string_index_into
434a1d56debSopenharmony_ci    ///
435a1d56debSopenharmony_ci    /// # Brief
436a1d56debSopenharmony_ci    /// 1. Creates some `String`s and some `JsonValue`s.
437a1d56debSopenharmony_ci    /// 2. Calls `Index::index_into`.
438a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
439a1d56debSopenharmony_ci    #[test]
440a1d56debSopenharmony_ci    fn ut_string_index_into() {
441a1d56debSopenharmony_ci        let value = JsonValue::new_boolean(true);
442a1d56debSopenharmony_ci        assert!(String::from("key").index_into(&value).is_null());
443a1d56debSopenharmony_ci    }
444a1d56debSopenharmony_ci
445a1d56debSopenharmony_ci    /// UT test for `String::index_into_mut`.
446a1d56debSopenharmony_ci    ///
447a1d56debSopenharmony_ci    /// # Title
448a1d56debSopenharmony_ci    /// ut_string_index_into_mut
449a1d56debSopenharmony_ci    ///
450a1d56debSopenharmony_ci    /// # Brief
451a1d56debSopenharmony_ci    /// 1. Creates some `String`s and some `JsonValue`s.
452a1d56debSopenharmony_ci    /// 2. Calls `Index::index_into_mut`.
453a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
454a1d56debSopenharmony_ci    #[test]
455a1d56debSopenharmony_ci    fn ut_string_index_into_mut() {
456a1d56debSopenharmony_ci        let mut value = JsonValue::new_object(object!("key1" => "value1"));
457a1d56debSopenharmony_ci        assert!(String::from("key1").index_into_mut(&mut value).is_string());
458a1d56debSopenharmony_ci        assert!(String::from("key2").index_into_mut(&mut value).is_null());
459a1d56debSopenharmony_ci
460a1d56debSopenharmony_ci        let mut value = JsonValue::new_null();
461a1d56debSopenharmony_ci        assert!(String::from("key1").index_into_mut(&mut value).is_null());
462a1d56debSopenharmony_ci        assert!(value.is_object())
463a1d56debSopenharmony_ci    }
464a1d56debSopenharmony_ci
465a1d56debSopenharmony_ci    /// UT test for `String::index_remove`.
466a1d56debSopenharmony_ci    ///
467a1d56debSopenharmony_ci    /// # Title
468a1d56debSopenharmony_ci    /// ut_string_index_remove
469a1d56debSopenharmony_ci    ///
470a1d56debSopenharmony_ci    /// # Brief
471a1d56debSopenharmony_ci    /// 1. Creates some `String`s and some `JsonValue`s.
472a1d56debSopenharmony_ci    /// 2. Calls `Index::index_remove`.
473a1d56debSopenharmony_ci    /// 3. Checks if the test results are correct.
474a1d56debSopenharmony_ci    #[test]
475a1d56debSopenharmony_ci    fn ut_string_index_remove() {
476a1d56debSopenharmony_ci        let mut value = JsonValue::new_object(object!("key1" => "value1"));
477a1d56debSopenharmony_ci        assert_eq!(
478a1d56debSopenharmony_ci            String::from("key1").index_remove(&mut value),
479a1d56debSopenharmony_ci            Some(JsonValue::new_string("value1"))
480a1d56debSopenharmony_ci        );
481a1d56debSopenharmony_ci        assert!(String::from("key1").index_remove(&mut value).is_none());
482a1d56debSopenharmony_ci    }
483a1d56debSopenharmony_ci}
484