use objc2::{
class, msg_send,
rc::{autoreleasepool, Retained},
runtime::AnyObject,
};
use objc2_foundation::{NSDictionary, NSNumber, NSObject, NSString};
pub fn create_test_dictionary() -> Retained<NSDictionary<NSString, NSObject>> {
autoreleasepool(|_| unsafe {
let dict_class = class!(NSDictionary);
let dict_ptr: *mut AnyObject = msg_send![dict_class, dictionary];
Retained::from_raw(dict_ptr.cast()).expect("Failed to create test dictionary")
})
}
pub fn create_test_dictionary_with_entries(
entries: &[(Retained<NSString>, Retained<NSObject>)],
) -> Retained<NSDictionary<NSString, NSObject>> {
if entries.is_empty() {
return create_test_dictionary();
}
autoreleasepool(|_| unsafe {
let keys: Vec<*const NSString> =
entries.iter().map(|(k, _)| k.as_ref() as *const NSString).collect();
let values: Vec<*const NSObject> =
entries.iter().map(|(_, v)| v.as_ref() as *const NSObject).collect();
let dict_class = class!(NSDictionary);
let count = entries.len();
let dict_ptr: *mut AnyObject = msg_send![dict_class, dictionaryWithObjects: values.as_ptr(), forKeys: keys.as_ptr(), count: count];
Retained::from_raw(dict_ptr.cast()).expect("Failed to create test dictionary with entries")
})
}
pub fn create_test_string(value: &str) -> Retained<NSString> {
NSString::from_str(value)
}
pub fn create_test_number(_value: f64) -> Retained<NSNumber> {
autoreleasepool(|_| unsafe {
let number_class = class!(NSNumber);
let number_ptr: *mut AnyObject = msg_send![number_class, numberWithBool: true];
Retained::from_raw(number_ptr.cast()).expect("Failed to create test number")
})
}
pub fn create_test_object() -> Retained<AnyObject> {
autoreleasepool(|_| unsafe {
let obj: *mut AnyObject = msg_send![class!(NSObject), new];
Retained::from_raw(obj).expect("Failed to create test object")
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_create_test_dictionary() {
let _dict = create_test_dictionary();
}
#[test]
fn test_create_test_dictionary_with_entries() {
use objc2::rc::Retained;
use objc2_foundation::{NSObject, NSString};
let entries: &[(Retained<NSString>, Retained<NSObject>)] = &[];
let _dict = create_test_dictionary_with_entries(entries);
}
#[test]
fn test_create_test_string() {
let test_str = "Test String";
let _ns_string = create_test_string(test_str);
}
#[test]
fn test_create_test_number() {
let test_value = 123.45;
let _ns_number = create_test_number(test_value);
}
#[test]
fn test_create_test_object() {
let _obj = create_test_object();
}
}