#![cfg(feature = "NSArray")] #![cfg(feature = "NSValue")] #![cfg(feature = "NSRange")] use alloc::format; use alloc::vec::Vec; use core::ptr;
usecrate::{NSArray, NSNumber, NSObject, NSValue}; use objc2::extern_protocol; use objc2::rc::Retained; use objc2::runtime::{AnyObject, ProtocolObject};
fn sample_array(len: usize) -> Retained<NSArray<NSObject>> { letmut vec = Vec::with_capacity(len);
for _ in 0..len {
vec.push(NSObject::new());
}
NSArray::from_retained_slice(&vec)
}
fn sample_number_array(len: u8) -> Retained<NSArray<NSNumber>> { letmut vec = Vec::with_capacity(len as usize);
for i in 0..len {
vec.push(NSNumber::new_u8(i));
}
NSArray::from_retained_slice(&vec)
}
#[test]
fn test_two_empty() { let _empty_array1 = NSArray::<NSObject>::new(); let _empty_array2 = NSArray::<NSObject>::new();
}
#[test]
fn test_creation() { let _ = <NSArray<NSNumber>>::from_retained_slice(&[]); let _ = NSArray::from_retained_slice(&[NSNumber::new_u8(4), NSNumber::new_u8(2)]);
let _ = <NSArray<NSNumber>>::from_slice(&[]); let _ = NSArray::from_slice(&[&*NSNumber::new_u8(4), &*NSNumber::new_u8(2)]);
}
#[test]
fn test_len() { let empty_array = NSArray::<NSObject>::new();
assert_eq!(empty_array.len(), 0);
let array = sample_array(4);
assert_eq!(array.len(), 4);
}
#[test]
fn test_equality() { let array1 = sample_array(3); let array2 = sample_array(3);
assert_ne!(array1, array2);
let array1 = sample_number_array(3); let array2 = sample_number_array(3);
assert_eq!(array1, array2);
let array1 = sample_number_array(3); let array2 = sample_number_array(4);
assert_ne!(array1, array2);
}
#[test]
fn test_debug() { let obj = sample_number_array(0);
assert_eq!(format!("{obj:?}"), "[]"); let obj = sample_number_array(3);
assert_eq!(format!("{obj:?}"), "[0, 1, 2]");
}
let empty_array = <NSArray<NSObject>>::new();
assert!(empty_array.firstObject().is_none());
assert!(empty_array.lastObject().is_none());
}
#[test]
fn test_iter() { let array = sample_number_array(4);
let vec1 = array.to_vec(); let vec2: Vec<_> = array.iter().collect();
assert_eq!(vec1, vec2);
letmut iterations = 0;
for _ in &array {
iterations += 1;
}
for _ in array.iter() {
iterations += 1;
}
for _ in unsafe { array.iter_unchecked() } {
iterations += 1;
}
for _ in array {
iterations += 1;
}
assert_eq!(iterations, 4 * 4);
}
#[test]
fn test_iter_fused() { // Not actually documented, nor is FusedIterator implemented for the // array iterators; but it it still important to test that iterating past // the end still works.
let obj: Retained<ProtocolObject<dyn TestProtocol>> =
ProtocolObject::from_retained(NSNumber::new_i32(42)); let _ = NSArray::from_slice(&[&*obj, &*obj]); let _ = NSArray::from_retained_slice(&[obj.clone(), obj.clone()]);
}
#[test]
fn test_access_anyobject() { let obj: Retained<AnyObject> = NSObject::new().into_super(); let array = NSArray::from_retained_slice(&[obj.clone(), obj.clone()]);
assert!(ptr::eq(&*array.objectAtIndex(0), &*obj));
assert!(ptr::eq(unsafe { array.objectAtIndex_unchecked(0) }, &*obj));
for _ in array.iter() {}
for _ in unsafe { array.iter_unchecked() } {}
for _ in array {}
}
#[test]
fn test_cast() { let array = NSArray::from_retained_slice(&[NSNumber::new_i64(42)]); // SAFETY: NSNumber is a subclass of NSValue. let array = unsafe { array.cast_unchecked::<NSValue>() }; let value = array.objectAtIndex(0); // SAFETY: We put an i64 into the NSNumber.
assert_eq!(unsafe { value.get::<i64>() }, 42);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.