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