use core::mem::ManuallyDrop;
use objc2::msg_send;
use objc2::rc::{autoreleasepool, Id, Shared};
use objc2::runtime::NSObject;
fn retain_count(obj: &NSObject) -> usize {
unsafe { msg_send![obj, retainCount] }
}
fn create_obj() -> Id<NSObject, Shared> {
let obj = ManuallyDrop::new(NSObject::new());
unsafe {
let obj: *mut NSObject = msg_send![&*obj, autorelease];
Id::retain_autoreleased(obj).unwrap()
}
}
#[test]
fn test_retain_autoreleased() {
autoreleasepool(|_| {
let _data = create_obj();
#[allow(clippy::if_same_then_else)]
let expected = if cfg!(feature = "gnustep-1-7") {
1
} else if cfg!(all(target_arch = "arm", panic = "unwind")) {
2
} else if cfg!(any(debug_assertions, feature = "exception")) {
2
} else {
1
};
let data = create_obj();
assert_eq!(retain_count(&data), expected);
let data = create_obj();
assert_eq!(retain_count(&data), expected);
let data = autoreleasepool(|_| create_obj());
assert_eq!(retain_count(&data), 1);
});
}