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