133d722a9Sopenharmony_ci#![allow( 233d722a9Sopenharmony_ci clippy::assertions_on_constants, 333d722a9Sopenharmony_ci clippy::assertions_on_result_states, 433d722a9Sopenharmony_ci clippy::cast_possible_truncation, 533d722a9Sopenharmony_ci clippy::cast_possible_wrap, 633d722a9Sopenharmony_ci clippy::float_cmp, 733d722a9Sopenharmony_ci clippy::needless_pass_by_value, 833d722a9Sopenharmony_ci clippy::unit_cmp, 933d722a9Sopenharmony_ci clippy::unseparated_literal_suffix 1033d722a9Sopenharmony_ci)] 1133d722a9Sopenharmony_ci 1233d722a9Sopenharmony_ciuse cxx::SharedPtr; 1333d722a9Sopenharmony_ciuse cxx_test_suite::module::ffi2; 1433d722a9Sopenharmony_ciuse cxx_test_suite::{cast, ffi, R}; 1533d722a9Sopenharmony_ciuse std::cell::Cell; 1633d722a9Sopenharmony_ciuse std::ffi::CStr; 1733d722a9Sopenharmony_ci 1833d722a9Sopenharmony_cithread_local! { 1933d722a9Sopenharmony_ci static CORRECT: Cell<bool> = Cell::new(false); 2033d722a9Sopenharmony_ci} 2133d722a9Sopenharmony_ci 2233d722a9Sopenharmony_ci#[no_mangle] 2333d722a9Sopenharmony_ciextern "C" fn cxx_test_suite_set_correct() { 2433d722a9Sopenharmony_ci CORRECT.with(|correct| correct.set(true)); 2533d722a9Sopenharmony_ci} 2633d722a9Sopenharmony_ci 2733d722a9Sopenharmony_cimacro_rules! check { 2833d722a9Sopenharmony_ci ($run:expr) => {{ 2933d722a9Sopenharmony_ci CORRECT.with(|correct| correct.set(false)); 3033d722a9Sopenharmony_ci $run; 3133d722a9Sopenharmony_ci assert!(CORRECT.with(Cell::get), "{}", stringify!($run)); 3233d722a9Sopenharmony_ci }}; 3333d722a9Sopenharmony_ci} 3433d722a9Sopenharmony_ci 3533d722a9Sopenharmony_ci#[test] 3633d722a9Sopenharmony_cifn test_c_return() { 3733d722a9Sopenharmony_ci let shared = ffi::Shared { z: 2020 }; 3833d722a9Sopenharmony_ci let ns_shared = ffi::AShared { z: 2020 }; 3933d722a9Sopenharmony_ci let nested_ns_shared = ffi::ABShared { z: 2020 }; 4033d722a9Sopenharmony_ci 4133d722a9Sopenharmony_ci assert_eq!(2020, ffi::c_return_primitive()); 4233d722a9Sopenharmony_ci assert_eq!(2020, ffi::c_return_shared().z); 4333d722a9Sopenharmony_ci assert_eq!(2020, ffi::c_return_box().0); 4433d722a9Sopenharmony_ci ffi::c_return_unique_ptr(); 4533d722a9Sopenharmony_ci ffi2::c_return_ns_unique_ptr(); 4633d722a9Sopenharmony_ci assert_eq!(2020, *ffi::c_return_ref(&shared)); 4733d722a9Sopenharmony_ci assert_eq!(2020, *ffi::c_return_ns_ref(&ns_shared)); 4833d722a9Sopenharmony_ci assert_eq!(2020, *ffi::c_return_nested_ns_ref(&nested_ns_shared)); 4933d722a9Sopenharmony_ci assert_eq!("2020", ffi::c_return_str(&shared)); 5033d722a9Sopenharmony_ci assert_eq!( 5133d722a9Sopenharmony_ci b"2020\0", 5233d722a9Sopenharmony_ci cast::c_char_to_unsigned(ffi::c_return_slice_char(&shared)), 5333d722a9Sopenharmony_ci ); 5433d722a9Sopenharmony_ci assert_eq!("2020", ffi::c_return_rust_string()); 5533d722a9Sopenharmony_ci assert_eq!("Hello \u{fffd}World", ffi::c_return_rust_string_lossy()); 5633d722a9Sopenharmony_ci assert_eq!("2020", ffi::c_return_unique_ptr_string().to_str().unwrap()); 5733d722a9Sopenharmony_ci assert_eq!(4, ffi::c_return_unique_ptr_vector_u8().len()); 5833d722a9Sopenharmony_ci assert_eq!( 5933d722a9Sopenharmony_ci 200_u8, 6033d722a9Sopenharmony_ci ffi::c_return_unique_ptr_vector_u8().into_iter().sum(), 6133d722a9Sopenharmony_ci ); 6233d722a9Sopenharmony_ci assert_eq!( 6333d722a9Sopenharmony_ci 200.5_f64, 6433d722a9Sopenharmony_ci ffi::c_return_unique_ptr_vector_f64().into_iter().sum(), 6533d722a9Sopenharmony_ci ); 6633d722a9Sopenharmony_ci assert_eq!(2, ffi::c_return_unique_ptr_vector_shared().len()); 6733d722a9Sopenharmony_ci assert_eq!( 6833d722a9Sopenharmony_ci 2021_usize, 6933d722a9Sopenharmony_ci ffi::c_return_unique_ptr_vector_shared() 7033d722a9Sopenharmony_ci .into_iter() 7133d722a9Sopenharmony_ci .map(|o| o.z) 7233d722a9Sopenharmony_ci .sum(), 7333d722a9Sopenharmony_ci ); 7433d722a9Sopenharmony_ci assert_eq!(b"\x02\0\x02\0"[..], ffi::c_return_rust_vec_u8()); 7533d722a9Sopenharmony_ci assert_eq!([true, true, false][..], ffi::c_return_rust_vec_bool()); 7633d722a9Sopenharmony_ci assert_eq!(2020, ffi::c_return_identity(2020)); 7733d722a9Sopenharmony_ci assert_eq!(2021, ffi::c_return_sum(2020, 1)); 7833d722a9Sopenharmony_ci match ffi::c_return_enum(0) { 7933d722a9Sopenharmony_ci enm @ ffi::Enum::AVal => assert_eq!(0, enm.repr), 8033d722a9Sopenharmony_ci _ => assert!(false), 8133d722a9Sopenharmony_ci } 8233d722a9Sopenharmony_ci match ffi::c_return_enum(1) { 8333d722a9Sopenharmony_ci enm @ ffi::Enum::BVal => assert_eq!(2020, enm.repr), 8433d722a9Sopenharmony_ci _ => assert!(false), 8533d722a9Sopenharmony_ci } 8633d722a9Sopenharmony_ci match ffi::c_return_enum(2021) { 8733d722a9Sopenharmony_ci enm @ ffi::Enum::LastVal => assert_eq!(2021, enm.repr), 8833d722a9Sopenharmony_ci _ => assert!(false), 8933d722a9Sopenharmony_ci } 9033d722a9Sopenharmony_ci match ffi::c_return_ns_enum(0) { 9133d722a9Sopenharmony_ci enm @ ffi::AEnum::AAVal => assert_eq!(0, enm.repr), 9233d722a9Sopenharmony_ci _ => assert!(false), 9333d722a9Sopenharmony_ci } 9433d722a9Sopenharmony_ci match ffi::c_return_nested_ns_enum(0) { 9533d722a9Sopenharmony_ci enm @ ffi::ABEnum::ABAVal => assert_eq!(0, enm.repr), 9633d722a9Sopenharmony_ci _ => assert!(false), 9733d722a9Sopenharmony_ci } 9833d722a9Sopenharmony_ci} 9933d722a9Sopenharmony_ci 10033d722a9Sopenharmony_ci#[test] 10133d722a9Sopenharmony_cifn test_c_try_return() { 10233d722a9Sopenharmony_ci assert_eq!((), ffi::c_try_return_void().unwrap()); 10333d722a9Sopenharmony_ci assert_eq!(2020, ffi::c_try_return_primitive().unwrap()); 10433d722a9Sopenharmony_ci assert_eq!( 10533d722a9Sopenharmony_ci "logic error", 10633d722a9Sopenharmony_ci ffi::c_fail_return_primitive().unwrap_err().what(), 10733d722a9Sopenharmony_ci ); 10833d722a9Sopenharmony_ci assert_eq!(2020, ffi::c_try_return_box().unwrap().0); 10933d722a9Sopenharmony_ci assert_eq!("2020", *ffi::c_try_return_ref(&"2020".to_owned()).unwrap()); 11033d722a9Sopenharmony_ci assert_eq!("2020", ffi::c_try_return_str("2020").unwrap()); 11133d722a9Sopenharmony_ci assert_eq!(b"2020", ffi::c_try_return_sliceu8(b"2020").unwrap()); 11233d722a9Sopenharmony_ci assert_eq!("2020", ffi::c_try_return_rust_string().unwrap()); 11333d722a9Sopenharmony_ci assert_eq!("2020", &*ffi::c_try_return_unique_ptr_string().unwrap()); 11433d722a9Sopenharmony_ci} 11533d722a9Sopenharmony_ci 11633d722a9Sopenharmony_ci#[test] 11733d722a9Sopenharmony_cifn test_c_take() { 11833d722a9Sopenharmony_ci let unique_ptr = ffi::c_return_unique_ptr(); 11933d722a9Sopenharmony_ci let unique_ptr_ns = ffi2::c_return_ns_unique_ptr(); 12033d722a9Sopenharmony_ci 12133d722a9Sopenharmony_ci check!(ffi::c_take_primitive(2020)); 12233d722a9Sopenharmony_ci check!(ffi::c_take_shared(ffi::Shared { z: 2020 })); 12333d722a9Sopenharmony_ci check!(ffi::c_take_ns_shared(ffi::AShared { z: 2020 })); 12433d722a9Sopenharmony_ci check!(ffi::ns_c_take_ns_shared(ffi::AShared { z: 2020 })); 12533d722a9Sopenharmony_ci check!(ffi::c_take_nested_ns_shared(ffi::ABShared { z: 2020 })); 12633d722a9Sopenharmony_ci check!(ffi::c_take_box(Box::new(R(2020)))); 12733d722a9Sopenharmony_ci check!(ffi::c_take_ref_c(&unique_ptr)); 12833d722a9Sopenharmony_ci check!(ffi2::c_take_ref_ns_c(&unique_ptr_ns)); 12933d722a9Sopenharmony_ci check!(cxx_test_suite::module::ffi::c_take_unique_ptr(unique_ptr)); 13033d722a9Sopenharmony_ci check!(ffi::c_take_str("2020")); 13133d722a9Sopenharmony_ci check!(ffi::c_take_slice_char(cast::unsigned_to_c_char(b"2020"))); 13233d722a9Sopenharmony_ci check!(ffi::c_take_slice_shared(&[ 13333d722a9Sopenharmony_ci ffi::Shared { z: 2020 }, 13433d722a9Sopenharmony_ci ffi::Shared { z: 2021 }, 13533d722a9Sopenharmony_ci ])); 13633d722a9Sopenharmony_ci let shared_sort_slice = &mut [ 13733d722a9Sopenharmony_ci ffi::Shared { z: 2 }, 13833d722a9Sopenharmony_ci ffi::Shared { z: 0 }, 13933d722a9Sopenharmony_ci ffi::Shared { z: 7 }, 14033d722a9Sopenharmony_ci ffi::Shared { z: 4 }, 14133d722a9Sopenharmony_ci ]; 14233d722a9Sopenharmony_ci check!(ffi::c_take_slice_shared_sort(shared_sort_slice)); 14333d722a9Sopenharmony_ci assert_eq!(shared_sort_slice[0].z, 0); 14433d722a9Sopenharmony_ci assert_eq!(shared_sort_slice[1].z, 2); 14533d722a9Sopenharmony_ci assert_eq!(shared_sort_slice[2].z, 4); 14633d722a9Sopenharmony_ci assert_eq!(shared_sort_slice[3].z, 7); 14733d722a9Sopenharmony_ci let r_sort_slice = &mut [R(2020), R(2050), R(2021)]; 14833d722a9Sopenharmony_ci check!(ffi::c_take_slice_r(r_sort_slice)); 14933d722a9Sopenharmony_ci check!(ffi::c_take_slice_r_sort(r_sort_slice)); 15033d722a9Sopenharmony_ci assert_eq!(r_sort_slice[0].0, 2020); 15133d722a9Sopenharmony_ci assert_eq!(r_sort_slice[1].0, 2021); 15233d722a9Sopenharmony_ci assert_eq!(r_sort_slice[2].0, 2050); 15333d722a9Sopenharmony_ci check!(ffi::c_take_rust_string("2020".to_owned())); 15433d722a9Sopenharmony_ci check!(ffi::c_take_unique_ptr_string( 15533d722a9Sopenharmony_ci ffi::c_return_unique_ptr_string() 15633d722a9Sopenharmony_ci )); 15733d722a9Sopenharmony_ci let mut vector = ffi::c_return_unique_ptr_vector_u8(); 15833d722a9Sopenharmony_ci assert_eq!(vector.pin_mut().pop(), Some(9)); 15933d722a9Sopenharmony_ci check!(ffi::c_take_unique_ptr_vector_u8(vector)); 16033d722a9Sopenharmony_ci let mut vector = ffi::c_return_unique_ptr_vector_f64(); 16133d722a9Sopenharmony_ci vector.pin_mut().push(9.0); 16233d722a9Sopenharmony_ci check!(ffi::c_take_unique_ptr_vector_f64(vector)); 16333d722a9Sopenharmony_ci let mut vector = ffi::c_return_unique_ptr_vector_shared(); 16433d722a9Sopenharmony_ci vector.pin_mut().push(ffi::Shared { z: 9 }); 16533d722a9Sopenharmony_ci check!(ffi::c_take_unique_ptr_vector_shared(vector)); 16633d722a9Sopenharmony_ci check!(ffi::c_take_ref_vector(&ffi::c_return_unique_ptr_vector_u8())); 16733d722a9Sopenharmony_ci let test_vec = [86_u8, 75_u8, 30_u8, 9_u8].to_vec(); 16833d722a9Sopenharmony_ci check!(ffi::c_take_rust_vec(test_vec.clone())); 16933d722a9Sopenharmony_ci check!(ffi::c_take_rust_vec_index(test_vec.clone())); 17033d722a9Sopenharmony_ci let shared_test_vec = vec![ffi::Shared { z: 1010 }, ffi::Shared { z: 1011 }]; 17133d722a9Sopenharmony_ci check!(ffi::c_take_rust_vec_shared(shared_test_vec.clone())); 17233d722a9Sopenharmony_ci check!(ffi::c_take_rust_vec_shared_index(shared_test_vec.clone())); 17333d722a9Sopenharmony_ci check!(ffi::c_take_rust_vec_shared_push(shared_test_vec.clone())); 17433d722a9Sopenharmony_ci check!(ffi::c_take_rust_vec_shared_truncate( 17533d722a9Sopenharmony_ci shared_test_vec.clone() 17633d722a9Sopenharmony_ci )); 17733d722a9Sopenharmony_ci check!(ffi::c_take_rust_vec_shared_clear(shared_test_vec.clone())); 17833d722a9Sopenharmony_ci check!(ffi::c_take_rust_vec_shared_forward_iterator( 17933d722a9Sopenharmony_ci shared_test_vec, 18033d722a9Sopenharmony_ci )); 18133d722a9Sopenharmony_ci let shared_sort_vec = vec![ 18233d722a9Sopenharmony_ci ffi::Shared { z: 2 }, 18333d722a9Sopenharmony_ci ffi::Shared { z: 0 }, 18433d722a9Sopenharmony_ci ffi::Shared { z: 7 }, 18533d722a9Sopenharmony_ci ffi::Shared { z: 4 }, 18633d722a9Sopenharmony_ci ]; 18733d722a9Sopenharmony_ci check!(ffi::c_take_rust_vec_shared_sort(shared_sort_vec)); 18833d722a9Sopenharmony_ci check!(ffi::c_take_ref_rust_vec(&test_vec)); 18933d722a9Sopenharmony_ci check!(ffi::c_take_ref_rust_vec_index(&test_vec)); 19033d722a9Sopenharmony_ci check!(ffi::c_take_ref_rust_vec_copy(&test_vec)); 19133d722a9Sopenharmony_ci check!(ffi::c_take_ref_shared_string(&ffi::SharedString { 19233d722a9Sopenharmony_ci msg: "2020".to_owned() 19333d722a9Sopenharmony_ci })); 19433d722a9Sopenharmony_ci let ns_shared_test_vec = vec![ffi::AShared { z: 1010 }, ffi::AShared { z: 1011 }]; 19533d722a9Sopenharmony_ci check!(ffi::c_take_rust_vec_ns_shared(ns_shared_test_vec)); 19633d722a9Sopenharmony_ci let nested_ns_shared_test_vec = vec![ffi::ABShared { z: 1010 }, ffi::ABShared { z: 1011 }]; 19733d722a9Sopenharmony_ci check!(ffi::c_take_rust_vec_nested_ns_shared( 19833d722a9Sopenharmony_ci nested_ns_shared_test_vec 19933d722a9Sopenharmony_ci )); 20033d722a9Sopenharmony_ci 20133d722a9Sopenharmony_ci check!(ffi::c_take_enum(ffi::Enum::AVal)); 20233d722a9Sopenharmony_ci check!(ffi::c_take_ns_enum(ffi::AEnum::AAVal)); 20333d722a9Sopenharmony_ci check!(ffi::c_take_nested_ns_enum(ffi::ABEnum::ABAVal)); 20433d722a9Sopenharmony_ci} 20533d722a9Sopenharmony_ci 20633d722a9Sopenharmony_ci#[test] 20733d722a9Sopenharmony_cifn test_c_callback() { 20833d722a9Sopenharmony_ci fn callback(s: String) -> usize { 20933d722a9Sopenharmony_ci if s == "2020" { 21033d722a9Sopenharmony_ci cxx_test_suite_set_correct(); 21133d722a9Sopenharmony_ci } 21233d722a9Sopenharmony_ci 0 21333d722a9Sopenharmony_ci } 21433d722a9Sopenharmony_ci 21533d722a9Sopenharmony_ci #[allow(clippy::ptr_arg)] 21633d722a9Sopenharmony_ci fn callback_ref(s: &String) { 21733d722a9Sopenharmony_ci if s == "2020" { 21833d722a9Sopenharmony_ci cxx_test_suite_set_correct(); 21933d722a9Sopenharmony_ci } 22033d722a9Sopenharmony_ci } 22133d722a9Sopenharmony_ci 22233d722a9Sopenharmony_ci fn callback_mut(s: &mut String) { 22333d722a9Sopenharmony_ci if s == "2020" { 22433d722a9Sopenharmony_ci cxx_test_suite_set_correct(); 22533d722a9Sopenharmony_ci } 22633d722a9Sopenharmony_ci } 22733d722a9Sopenharmony_ci 22833d722a9Sopenharmony_ci check!(ffi::c_take_callback(callback)); 22933d722a9Sopenharmony_ci check!(ffi::c_take_callback_ref(callback_ref)); 23033d722a9Sopenharmony_ci check!(ffi::c_take_callback_ref_lifetime(callback_ref)); 23133d722a9Sopenharmony_ci check!(ffi::c_take_callback_mut(callback_mut)); 23233d722a9Sopenharmony_ci} 23333d722a9Sopenharmony_ci 23433d722a9Sopenharmony_ci#[test] 23533d722a9Sopenharmony_cifn test_c_call_r() { 23633d722a9Sopenharmony_ci fn cxx_run_test() { 23733d722a9Sopenharmony_ci extern "C" { 23833d722a9Sopenharmony_ci fn cxx_run_test() -> *const i8; 23933d722a9Sopenharmony_ci } 24033d722a9Sopenharmony_ci let failure = unsafe { cxx_run_test() }; 24133d722a9Sopenharmony_ci if !failure.is_null() { 24233d722a9Sopenharmony_ci let msg = unsafe { CStr::from_ptr(failure as *mut std::os::raw::c_char) }; 24333d722a9Sopenharmony_ci eprintln!("{}", msg.to_string_lossy()); 24433d722a9Sopenharmony_ci } 24533d722a9Sopenharmony_ci } 24633d722a9Sopenharmony_ci check!(cxx_run_test()); 24733d722a9Sopenharmony_ci} 24833d722a9Sopenharmony_ci 24933d722a9Sopenharmony_ci#[test] 25033d722a9Sopenharmony_cifn test_c_method_calls() { 25133d722a9Sopenharmony_ci let mut unique_ptr = ffi::c_return_unique_ptr(); 25233d722a9Sopenharmony_ci 25333d722a9Sopenharmony_ci let old_value = unique_ptr.get(); 25433d722a9Sopenharmony_ci assert_eq!(2020, old_value); 25533d722a9Sopenharmony_ci assert_eq!(2021, unique_ptr.pin_mut().set(2021)); 25633d722a9Sopenharmony_ci assert_eq!(2021, unique_ptr.get()); 25733d722a9Sopenharmony_ci assert_eq!(2021, unique_ptr.get2()); 25833d722a9Sopenharmony_ci assert_eq!(2021, *unique_ptr.getRef()); 25933d722a9Sopenharmony_ci assert_eq!(2021, *unique_ptr.pin_mut().getMut()); 26033d722a9Sopenharmony_ci assert_eq!(2022, unique_ptr.pin_mut().set_succeed(2022).unwrap()); 26133d722a9Sopenharmony_ci assert!(unique_ptr.pin_mut().get_fail().is_err()); 26233d722a9Sopenharmony_ci assert_eq!(2021, ffi::Shared { z: 0 }.c_method_on_shared()); 26333d722a9Sopenharmony_ci assert_eq!(2022, *ffi::Shared { z: 2022 }.c_method_ref_on_shared()); 26433d722a9Sopenharmony_ci assert_eq!(2023, *ffi::Shared { z: 2023 }.c_method_mut_on_shared()); 26533d722a9Sopenharmony_ci 26633d722a9Sopenharmony_ci let val = 42; 26733d722a9Sopenharmony_ci let mut array = ffi::Array { 26833d722a9Sopenharmony_ci a: [0, 0, 0, 0], 26933d722a9Sopenharmony_ci b: ffi::Buffer::default(), 27033d722a9Sopenharmony_ci }; 27133d722a9Sopenharmony_ci array.c_set_array(val); 27233d722a9Sopenharmony_ci assert_eq!(array.a.len() as i32 * val, array.r_get_array_sum()); 27333d722a9Sopenharmony_ci} 27433d722a9Sopenharmony_ci 27533d722a9Sopenharmony_ci#[test] 27633d722a9Sopenharmony_cifn test_shared_ptr_weak_ptr() { 27733d722a9Sopenharmony_ci let shared_ptr = ffi::c_return_shared_ptr(); 27833d722a9Sopenharmony_ci let weak_ptr = SharedPtr::downgrade(&shared_ptr); 27933d722a9Sopenharmony_ci assert_eq!(1, ffi::c_get_use_count(&weak_ptr)); 28033d722a9Sopenharmony_ci 28133d722a9Sopenharmony_ci assert!(!weak_ptr.upgrade().is_null()); 28233d722a9Sopenharmony_ci assert_eq!(1, ffi::c_get_use_count(&weak_ptr)); 28333d722a9Sopenharmony_ci 28433d722a9Sopenharmony_ci drop(shared_ptr); 28533d722a9Sopenharmony_ci assert_eq!(0, ffi::c_get_use_count(&weak_ptr)); 28633d722a9Sopenharmony_ci assert!(weak_ptr.upgrade().is_null()); 28733d722a9Sopenharmony_ci} 28833d722a9Sopenharmony_ci 28933d722a9Sopenharmony_ci#[test] 29033d722a9Sopenharmony_cifn test_c_ns_method_calls() { 29133d722a9Sopenharmony_ci let unique_ptr = ffi2::ns_c_return_unique_ptr_ns(); 29233d722a9Sopenharmony_ci 29333d722a9Sopenharmony_ci let old_value = unique_ptr.get(); 29433d722a9Sopenharmony_ci assert_eq!(1000, old_value); 29533d722a9Sopenharmony_ci} 29633d722a9Sopenharmony_ci 29733d722a9Sopenharmony_ci#[test] 29833d722a9Sopenharmony_cifn test_enum_representations() { 29933d722a9Sopenharmony_ci assert_eq!(0, ffi::Enum::AVal.repr); 30033d722a9Sopenharmony_ci assert_eq!(2020, ffi::Enum::BVal.repr); 30133d722a9Sopenharmony_ci assert_eq!(2021, ffi::Enum::LastVal.repr); 30233d722a9Sopenharmony_ci} 30333d722a9Sopenharmony_ci 30433d722a9Sopenharmony_ci#[test] 30533d722a9Sopenharmony_cifn test_debug() { 30633d722a9Sopenharmony_ci assert_eq!("Shared { z: 1 }", format!("{:?}", ffi::Shared { z: 1 })); 30733d722a9Sopenharmony_ci assert_eq!("BVal", format!("{:?}", ffi::Enum::BVal)); 30833d722a9Sopenharmony_ci assert_eq!("Enum(9)", format!("{:?}", ffi::Enum { repr: 9 })); 30933d722a9Sopenharmony_ci} 31033d722a9Sopenharmony_ci 31133d722a9Sopenharmony_ci#[no_mangle] 31233d722a9Sopenharmony_ciextern "C" fn cxx_test_suite_get_box() -> *mut R { 31333d722a9Sopenharmony_ci Box::into_raw(Box::new(R(2020usize))) 31433d722a9Sopenharmony_ci} 31533d722a9Sopenharmony_ci 31633d722a9Sopenharmony_ci#[no_mangle] 31733d722a9Sopenharmony_ciunsafe extern "C" fn cxx_test_suite_r_is_correct(r: *const R) -> bool { 31833d722a9Sopenharmony_ci (*r).0 == 2020 31933d722a9Sopenharmony_ci} 32033d722a9Sopenharmony_ci 32133d722a9Sopenharmony_ci#[test] 32233d722a9Sopenharmony_cifn test_rust_name_attribute() { 32333d722a9Sopenharmony_ci assert_eq!("2020", ffi::i32_overloaded_function(2020)); 32433d722a9Sopenharmony_ci assert_eq!("2020", ffi::str_overloaded_function("2020")); 32533d722a9Sopenharmony_ci let unique_ptr = ffi::c_return_unique_ptr(); 32633d722a9Sopenharmony_ci assert_eq!("2020", unique_ptr.i32_overloaded_method(2020)); 32733d722a9Sopenharmony_ci assert_eq!("2020", unique_ptr.str_overloaded_method("2020")); 32833d722a9Sopenharmony_ci} 32933d722a9Sopenharmony_ci 33033d722a9Sopenharmony_ci#[test] 33133d722a9Sopenharmony_cifn test_extern_trivial() { 33233d722a9Sopenharmony_ci let mut d = ffi2::c_return_trivial(); 33333d722a9Sopenharmony_ci check!(ffi2::c_take_trivial_ref(&d)); 33433d722a9Sopenharmony_ci check!(d.c_take_trivial_ref_method()); 33533d722a9Sopenharmony_ci check!(d.c_take_trivial_mut_ref_method()); 33633d722a9Sopenharmony_ci check!(ffi2::c_take_trivial(d)); 33733d722a9Sopenharmony_ci let mut d = ffi2::c_return_trivial_ptr(); 33833d722a9Sopenharmony_ci check!(d.c_take_trivial_ref_method()); 33933d722a9Sopenharmony_ci check!(d.c_take_trivial_mut_ref_method()); 34033d722a9Sopenharmony_ci check!(ffi2::c_take_trivial_ptr(d)); 34133d722a9Sopenharmony_ci cxx::UniquePtr::new(ffi2::D { d: 42 }); 34233d722a9Sopenharmony_ci let d = ffi2::ns_c_return_trivial(); 34333d722a9Sopenharmony_ci check!(ffi2::ns_c_take_trivial(d)); 34433d722a9Sopenharmony_ci 34533d722a9Sopenharmony_ci let g = ffi2::c_return_trivial_ns(); 34633d722a9Sopenharmony_ci check!(ffi2::c_take_trivial_ns_ref(&g)); 34733d722a9Sopenharmony_ci check!(ffi2::c_take_trivial_ns(g)); 34833d722a9Sopenharmony_ci let g = ffi2::c_return_trivial_ns_ptr(); 34933d722a9Sopenharmony_ci check!(ffi2::c_take_trivial_ns_ptr(g)); 35033d722a9Sopenharmony_ci cxx::UniquePtr::new(ffi2::G { g: 42 }); 35133d722a9Sopenharmony_ci} 35233d722a9Sopenharmony_ci 35333d722a9Sopenharmony_ci#[test] 35433d722a9Sopenharmony_cifn test_extern_opaque() { 35533d722a9Sopenharmony_ci let mut e = ffi2::c_return_opaque_ptr(); 35633d722a9Sopenharmony_ci check!(ffi2::c_take_opaque_ref(e.as_ref().unwrap())); 35733d722a9Sopenharmony_ci check!(e.c_take_opaque_ref_method()); 35833d722a9Sopenharmony_ci check!(e.pin_mut().c_take_opaque_mut_ref_method()); 35933d722a9Sopenharmony_ci check!(ffi2::c_take_opaque_ptr(e)); 36033d722a9Sopenharmony_ci 36133d722a9Sopenharmony_ci let f = ffi2::c_return_ns_opaque_ptr(); 36233d722a9Sopenharmony_ci check!(ffi2::c_take_opaque_ns_ref(f.as_ref().unwrap())); 36333d722a9Sopenharmony_ci check!(ffi2::c_take_opaque_ns_ptr(f)); 36433d722a9Sopenharmony_ci} 36533d722a9Sopenharmony_ci 36633d722a9Sopenharmony_ci#[test] 36733d722a9Sopenharmony_cifn test_raw_ptr() { 36833d722a9Sopenharmony_ci let c = ffi::c_return_mut_ptr(2023); 36933d722a9Sopenharmony_ci let mut c_unique = unsafe { cxx::UniquePtr::from_raw(c) }; 37033d722a9Sopenharmony_ci assert_eq!(2023, c_unique.pin_mut().set_succeed(2023).unwrap()); 37133d722a9Sopenharmony_ci // c will be dropped as it's now in a UniquePtr 37233d722a9Sopenharmony_ci 37333d722a9Sopenharmony_ci let c2 = ffi::c_return_mut_ptr(2024); 37433d722a9Sopenharmony_ci assert_eq!(2024, unsafe { ffi::c_take_const_ptr(c2) }); 37533d722a9Sopenharmony_ci assert_eq!(2024, unsafe { ffi::c_take_mut_ptr(c2) }); // deletes c2 37633d722a9Sopenharmony_ci 37733d722a9Sopenharmony_ci let c3 = ffi::c_return_const_ptr(2025); 37833d722a9Sopenharmony_ci assert_eq!(2025, unsafe { ffi::c_take_const_ptr(c3) }); 37933d722a9Sopenharmony_ci assert_eq!(2025, unsafe { ffi::c_take_mut_ptr(c3 as *mut ffi::C) }); // deletes c3 38033d722a9Sopenharmony_ci} 381