112a9d9c8Sopenharmony_ci#![allow(warnings)]
212a9d9c8Sopenharmony_ci
312a9d9c8Sopenharmony_cimod bindings {
412a9d9c8Sopenharmony_ci    include!(concat!(env!("OUT_DIR"), "/test.rs"));
512a9d9c8Sopenharmony_ci}
612a9d9c8Sopenharmony_ci
712a9d9c8Sopenharmony_cimod extern_bindings {
812a9d9c8Sopenharmony_ci    include!(concat!(env!("OUT_DIR"), "/extern.rs"));
912a9d9c8Sopenharmony_ci}
1012a9d9c8Sopenharmony_ci
1112a9d9c8Sopenharmony_ciuse std::ffi::CStr;
1212a9d9c8Sopenharmony_ciuse std::mem;
1312a9d9c8Sopenharmony_ciuse std::os::raw::c_int;
1412a9d9c8Sopenharmony_ci
1512a9d9c8Sopenharmony_ci#[allow(unused)]
1612a9d9c8Sopenharmony_ciuse bindings::testing::Bar; // This type is generated from module_raw_line.
1712a9d9c8Sopenharmony_ci
1812a9d9c8Sopenharmony_citype MacroInteger = isize;
1912a9d9c8Sopenharmony_ci
2012a9d9c8Sopenharmony_ci#[test]
2112a9d9c8Sopenharmony_cifn test_static_array() {
2212a9d9c8Sopenharmony_ci    let mut test = unsafe { bindings::Test_COUNTDOWN.as_ptr() };
2312a9d9c8Sopenharmony_ci    let expected = unsafe { bindings::Test_countdown() };
2412a9d9c8Sopenharmony_ci    let also_expected = unsafe { bindings::Test_COUNTDOWN_PTR };
2512a9d9c8Sopenharmony_ci    assert!(!test.is_null());
2612a9d9c8Sopenharmony_ci    assert_eq!(also_expected, expected);
2712a9d9c8Sopenharmony_ci    assert_eq!(test, also_expected);
2812a9d9c8Sopenharmony_ci
2912a9d9c8Sopenharmony_ci    let mut expected = 10;
3012a9d9c8Sopenharmony_ci    unsafe {
3112a9d9c8Sopenharmony_ci        loop {
3212a9d9c8Sopenharmony_ci            assert_eq!(*test, expected);
3312a9d9c8Sopenharmony_ci            if *test == 0 {
3412a9d9c8Sopenharmony_ci                break;
3512a9d9c8Sopenharmony_ci            }
3612a9d9c8Sopenharmony_ci            test = test.offset(1);
3712a9d9c8Sopenharmony_ci            expected -= 1;
3812a9d9c8Sopenharmony_ci        }
3912a9d9c8Sopenharmony_ci    }
4012a9d9c8Sopenharmony_ci}
4112a9d9c8Sopenharmony_ci
4212a9d9c8Sopenharmony_ci#[test]
4312a9d9c8Sopenharmony_cifn test_static_method() {
4412a9d9c8Sopenharmony_ci    let c_str = unsafe { bindings::Test::name() };
4512a9d9c8Sopenharmony_ci    let name = unsafe { CStr::from_ptr(c_str).to_string_lossy().into_owned() };
4612a9d9c8Sopenharmony_ci    assert_eq!(name, "Test", "Calling a static C++ method works!");
4712a9d9c8Sopenharmony_ci}
4812a9d9c8Sopenharmony_ci
4912a9d9c8Sopenharmony_ci#[test]
5012a9d9c8Sopenharmony_cifn test_constructor() {
5112a9d9c8Sopenharmony_ci    let test = unsafe { bindings::Test::new(5) };
5212a9d9c8Sopenharmony_ci    assert_eq!(test.m_int, 5);
5312a9d9c8Sopenharmony_ci    assert_eq!(test.m_double, 0.0);
5412a9d9c8Sopenharmony_ci}
5512a9d9c8Sopenharmony_ci
5612a9d9c8Sopenharmony_ci#[test]
5712a9d9c8Sopenharmony_cifn test_overload() {
5812a9d9c8Sopenharmony_ci    let test = unsafe { bindings::Test::new1(5.0) };
5912a9d9c8Sopenharmony_ci    assert_eq!(test.m_int, 0);
6012a9d9c8Sopenharmony_ci    assert_eq!(test.m_double, 5.0);
6112a9d9c8Sopenharmony_ci}
6212a9d9c8Sopenharmony_ci
6312a9d9c8Sopenharmony_ci#[test]
6412a9d9c8Sopenharmony_cifn test_bitfields_first() {
6512a9d9c8Sopenharmony_ci    let mut first: bindings::bitfields::First = unsafe { mem::zeroed() };
6612a9d9c8Sopenharmony_ci    assert!(unsafe { first.assert(0, 0, 0) });
6712a9d9c8Sopenharmony_ci    first.set_three_bits_byte_one(2);
6812a9d9c8Sopenharmony_ci    first.set_six_bits_byte_two(42);
6912a9d9c8Sopenharmony_ci    first.set_two_bits_byte_two(1);
7012a9d9c8Sopenharmony_ci    assert!(unsafe { first.assert(2, 42, 1) });
7112a9d9c8Sopenharmony_ci}
7212a9d9c8Sopenharmony_ci
7312a9d9c8Sopenharmony_ci#[test]
7412a9d9c8Sopenharmony_cifn test_bitfields_second() {
7512a9d9c8Sopenharmony_ci    let mut second: bindings::bitfields::Second = unsafe { mem::zeroed() };
7612a9d9c8Sopenharmony_ci    assert!(unsafe { second.assert(0, false) });
7712a9d9c8Sopenharmony_ci    second.set_thirty_one_bits(1337);
7812a9d9c8Sopenharmony_ci    second.set_one_bit(true);
7912a9d9c8Sopenharmony_ci    assert!(unsafe { second.assert(1337, true) });
8012a9d9c8Sopenharmony_ci}
8112a9d9c8Sopenharmony_ci
8212a9d9c8Sopenharmony_ci#[test]
8312a9d9c8Sopenharmony_cifn test_bitfields_third() {
8412a9d9c8Sopenharmony_ci    let mut third: bindings::bitfields::Third = unsafe { mem::zeroed() };
8512a9d9c8Sopenharmony_ci    assert!(unsafe {
8612a9d9c8Sopenharmony_ci        third.assert(0, false, bindings::bitfields::ItemKind::ITEM_KIND_UNO)
8712a9d9c8Sopenharmony_ci    });
8812a9d9c8Sopenharmony_ci    third.set_flags(12345);
8912a9d9c8Sopenharmony_ci    third.set_is_whatever(true);
9012a9d9c8Sopenharmony_ci    third.set_kind(bindings::bitfields::ItemKind::ITEM_KIND_TRES);
9112a9d9c8Sopenharmony_ci    assert!(unsafe {
9212a9d9c8Sopenharmony_ci        third.assert(12345, true, bindings::bitfields::ItemKind::ITEM_KIND_TRES)
9312a9d9c8Sopenharmony_ci    });
9412a9d9c8Sopenharmony_ci}
9512a9d9c8Sopenharmony_ci
9612a9d9c8Sopenharmony_ci#[test]
9712a9d9c8Sopenharmony_cifn test_bitfields_fourth() {
9812a9d9c8Sopenharmony_ci    let mut fourth: bindings::bitfields::Fourth = unsafe { mem::zeroed() };
9912a9d9c8Sopenharmony_ci    assert!(unsafe { fourth.assert(bindings::bitfields::MyEnum::ONE, 0) });
10012a9d9c8Sopenharmony_ci
10112a9d9c8Sopenharmony_ci    fourth.set_tag(bindings::bitfields::MyEnum::THREE);
10212a9d9c8Sopenharmony_ci    fourth.set_ptr(0xdeadbeef);
10312a9d9c8Sopenharmony_ci    assert!(unsafe {
10412a9d9c8Sopenharmony_ci        fourth.assert(bindings::bitfields::MyEnum::THREE, 0xdeadbeef)
10512a9d9c8Sopenharmony_ci    });
10612a9d9c8Sopenharmony_ci}
10712a9d9c8Sopenharmony_ci
10812a9d9c8Sopenharmony_ci#[test]
10912a9d9c8Sopenharmony_cifn test_bitfields_date2() {
11012a9d9c8Sopenharmony_ci    let mut date: bindings::bitfields::Date2 = unsafe { mem::zeroed() };
11112a9d9c8Sopenharmony_ci    assert!(unsafe { date.assert(0, 0, 0, 0, 0) });
11212a9d9c8Sopenharmony_ci
11312a9d9c8Sopenharmony_ci    date.set_nWeekDay(6); // saturdays are the best
11412a9d9c8Sopenharmony_ci    date.set_nMonthDay(20);
11512a9d9c8Sopenharmony_ci    date.set_nMonth(11);
11612a9d9c8Sopenharmony_ci    date.set_nYear(95);
11712a9d9c8Sopenharmony_ci    date.set_byte(255);
11812a9d9c8Sopenharmony_ci    assert!(unsafe { date.assert(6, 20, 11, 95, 255) });
11912a9d9c8Sopenharmony_ci}
12012a9d9c8Sopenharmony_ci
12112a9d9c8Sopenharmony_ci#[test]
12212a9d9c8Sopenharmony_cifn test_bitfields_fifth() {
12312a9d9c8Sopenharmony_ci    let mut date: bindings::bitfields::Fifth = unsafe { mem::zeroed() };
12412a9d9c8Sopenharmony_ci
12512a9d9c8Sopenharmony_ci    assert!(unsafe { date.assert(0, 0, 0, 0, 0) });
12612a9d9c8Sopenharmony_ci
12712a9d9c8Sopenharmony_ci    date.byte = 255; // Set this first, to ensure we don't override it.
12812a9d9c8Sopenharmony_ci
12912a9d9c8Sopenharmony_ci    date.set_nWeekDay(6); // saturdays are the best
13012a9d9c8Sopenharmony_ci    date.set_nMonthDay(20);
13112a9d9c8Sopenharmony_ci    date.set_nMonth(11);
13212a9d9c8Sopenharmony_ci    date.set_nYear(95);
13312a9d9c8Sopenharmony_ci
13412a9d9c8Sopenharmony_ci    assert!(unsafe { date.assert(6, 20, 11, 95, 255) });
13512a9d9c8Sopenharmony_ci}
13612a9d9c8Sopenharmony_ci
13712a9d9c8Sopenharmony_ci#[test]
13812a9d9c8Sopenharmony_cifn test_bitfields_sixth() {
13912a9d9c8Sopenharmony_ci    let mut date: bindings::bitfields::Sixth = unsafe { mem::zeroed() };
14012a9d9c8Sopenharmony_ci
14112a9d9c8Sopenharmony_ci    assert!(unsafe { date.assert(0, 0, 0, 0) });
14212a9d9c8Sopenharmony_ci
14312a9d9c8Sopenharmony_ci    date.byte = 255;
14412a9d9c8Sopenharmony_ci    date.set_nWeekDay(6); // saturdays are the best
14512a9d9c8Sopenharmony_ci    date.set_nMonthDay(20);
14612a9d9c8Sopenharmony_ci    date.set_nMonth(11);
14712a9d9c8Sopenharmony_ci
14812a9d9c8Sopenharmony_ci    assert!(unsafe { date.assert(255, 6, 11, 20) });
14912a9d9c8Sopenharmony_ci}
15012a9d9c8Sopenharmony_ci
15112a9d9c8Sopenharmony_ci#[test]
15212a9d9c8Sopenharmony_cifn test_bitfields_seventh() {
15312a9d9c8Sopenharmony_ci    let mut large: bindings::bitfields::Seventh = unsafe { mem::zeroed() };
15412a9d9c8Sopenharmony_ci
15512a9d9c8Sopenharmony_ci    assert!(unsafe { large.assert(false, 0, 0, 0, 0, false, 0) });
15612a9d9c8Sopenharmony_ci
15712a9d9c8Sopenharmony_ci    large.set_first_one_bit(true);
15812a9d9c8Sopenharmony_ci    large.set_second_thirty_bits(375028802);
15912a9d9c8Sopenharmony_ci    large.set_third_two_bits(2);
16012a9d9c8Sopenharmony_ci    large.set_fourth_thirty_bits(643472885);
16112a9d9c8Sopenharmony_ci    large.set_fifth_two_bits(3);
16212a9d9c8Sopenharmony_ci    large.set_sixth_one_bit(true);
16312a9d9c8Sopenharmony_ci    large.set_seventh_thirty_bits(1061657575);
16412a9d9c8Sopenharmony_ci
16512a9d9c8Sopenharmony_ci    assert!(unsafe {
16612a9d9c8Sopenharmony_ci        large.assert(true, 375028802, 2, 643472885, 3, true, 1061657575)
16712a9d9c8Sopenharmony_ci    });
16812a9d9c8Sopenharmony_ci
16912a9d9c8Sopenharmony_ci    assert_eq!(large.first_one_bit(), true);
17012a9d9c8Sopenharmony_ci    assert_eq!(large.second_thirty_bits(), 375028802);
17112a9d9c8Sopenharmony_ci    assert_eq!(large.third_two_bits(), 2);
17212a9d9c8Sopenharmony_ci    assert_eq!(large.fourth_thirty_bits(), 643472885);
17312a9d9c8Sopenharmony_ci    assert_eq!(large.fifth_two_bits(), 3);
17412a9d9c8Sopenharmony_ci    assert_eq!(large.sixth_one_bit(), true);
17512a9d9c8Sopenharmony_ci    assert_eq!(large.seventh_thirty_bits(), 1061657575);
17612a9d9c8Sopenharmony_ci}
17712a9d9c8Sopenharmony_ci
17812a9d9c8Sopenharmony_ci#[test]
17912a9d9c8Sopenharmony_cifn test_bitfield_constructors() {
18012a9d9c8Sopenharmony_ci    use std::mem;
18112a9d9c8Sopenharmony_ci    let mut first = bindings::bitfields::First {
18212a9d9c8Sopenharmony_ci        _bitfield_align_1: [],
18312a9d9c8Sopenharmony_ci        _bitfield_1: bindings::bitfields::First::new_bitfield_1(1, 2, 3),
18412a9d9c8Sopenharmony_ci    };
18512a9d9c8Sopenharmony_ci    assert!(unsafe { first.assert(1, 2, 3) });
18612a9d9c8Sopenharmony_ci
18712a9d9c8Sopenharmony_ci    let mut second = bindings::bitfields::Second {
18812a9d9c8Sopenharmony_ci        _bitfield_align_1: [],
18912a9d9c8Sopenharmony_ci        _bitfield_1: bindings::bitfields::Second::new_bitfield_1(1337, true),
19012a9d9c8Sopenharmony_ci    };
19112a9d9c8Sopenharmony_ci    assert!(unsafe { second.assert(1337, true) });
19212a9d9c8Sopenharmony_ci
19312a9d9c8Sopenharmony_ci    let mut third = bindings::bitfields::Third {
19412a9d9c8Sopenharmony_ci        _bitfield_align_1: [],
19512a9d9c8Sopenharmony_ci        _bitfield_1: bindings::bitfields::Third::new_bitfield_1(
19612a9d9c8Sopenharmony_ci            42,
19712a9d9c8Sopenharmony_ci            false,
19812a9d9c8Sopenharmony_ci            bindings::bitfields::ItemKind::ITEM_KIND_TRES,
19912a9d9c8Sopenharmony_ci        ),
20012a9d9c8Sopenharmony_ci    };
20112a9d9c8Sopenharmony_ci    assert!(unsafe {
20212a9d9c8Sopenharmony_ci        third.assert(42, false, bindings::bitfields::ItemKind::ITEM_KIND_TRES)
20312a9d9c8Sopenharmony_ci    });
20412a9d9c8Sopenharmony_ci}
20512a9d9c8Sopenharmony_ci
20612a9d9c8Sopenharmony_ciimpl Drop for bindings::AutoRestoreBool {
20712a9d9c8Sopenharmony_ci    fn drop(&mut self) {
20812a9d9c8Sopenharmony_ci        unsafe { bindings::AutoRestoreBool::destruct(self) }
20912a9d9c8Sopenharmony_ci    }
21012a9d9c8Sopenharmony_ci}
21112a9d9c8Sopenharmony_ci
21212a9d9c8Sopenharmony_ci#[test]
21312a9d9c8Sopenharmony_cifn test_destructors() {
21412a9d9c8Sopenharmony_ci    let mut v = true;
21512a9d9c8Sopenharmony_ci
21612a9d9c8Sopenharmony_ci    {
21712a9d9c8Sopenharmony_ci        let auto_restore = unsafe { bindings::AutoRestoreBool::new(&mut v) };
21812a9d9c8Sopenharmony_ci        v = false;
21912a9d9c8Sopenharmony_ci    }
22012a9d9c8Sopenharmony_ci
22112a9d9c8Sopenharmony_ci    assert!(v, "Should've been restored when going out of scope");
22212a9d9c8Sopenharmony_ci}
22312a9d9c8Sopenharmony_ci
22412a9d9c8Sopenharmony_ciimpl Drop for bindings::InheritsFromVirtualDestructor {
22512a9d9c8Sopenharmony_ci    fn drop(&mut self) {
22612a9d9c8Sopenharmony_ci        unsafe {
22712a9d9c8Sopenharmony_ci            bindings::InheritsFromVirtualDestructor_InheritsFromVirtualDestructor_destructor(self)
22812a9d9c8Sopenharmony_ci        }
22912a9d9c8Sopenharmony_ci    }
23012a9d9c8Sopenharmony_ci}
23112a9d9c8Sopenharmony_ci
23212a9d9c8Sopenharmony_ci#[test]
23312a9d9c8Sopenharmony_cifn test_virtual_dtor() {
23412a9d9c8Sopenharmony_ci    unsafe {
23512a9d9c8Sopenharmony_ci        {
23612a9d9c8Sopenharmony_ci            let b = bindings::InheritsFromVirtualDestructor::new();
23712a9d9c8Sopenharmony_ci            // Let it go out of scope.
23812a9d9c8Sopenharmony_ci        }
23912a9d9c8Sopenharmony_ci
24012a9d9c8Sopenharmony_ci        assert_eq!(bindings::InheritsFromVirtualDestructor_sDestructorCount, 1);
24112a9d9c8Sopenharmony_ci        assert_eq!(bindings::VirtualDestructor_sDestructorCount, 1);
24212a9d9c8Sopenharmony_ci    }
24312a9d9c8Sopenharmony_ci}
24412a9d9c8Sopenharmony_ci
24512a9d9c8Sopenharmony_ci#[test]
24612a9d9c8Sopenharmony_cifn test_item_rename() {
24712a9d9c8Sopenharmony_ci    assert_eq!(bindings::CONST_VALUE, 3);
24812a9d9c8Sopenharmony_ci    assert_eq!(unsafe { bindings::function_name() }, 4);
24912a9d9c8Sopenharmony_ci
25012a9d9c8Sopenharmony_ci    let _foo = bindings::foo {
25112a9d9c8Sopenharmony_ci        member: bindings::bar { foo: 2 },
25212a9d9c8Sopenharmony_ci    };
25312a9d9c8Sopenharmony_ci}
25412a9d9c8Sopenharmony_ci
25512a9d9c8Sopenharmony_ci#[test]
25612a9d9c8Sopenharmony_cifn test_matching_with_rename() {
25712a9d9c8Sopenharmony_ci    assert_eq!(bindings::enum_to_be_constified_THREE, 3);
25812a9d9c8Sopenharmony_ci    assert_eq!(unsafe { bindings::TEMPLATED_CONST_VALUE.len() }, 30);
25912a9d9c8Sopenharmony_ci}
26012a9d9c8Sopenharmony_ci
26112a9d9c8Sopenharmony_ci#[test]
26212a9d9c8Sopenharmony_cifn test_macro_customintkind_path() {
26312a9d9c8Sopenharmony_ci    let v: &std::any::Any = &bindings::TESTMACRO_CUSTOMINTKIND_PATH;
26412a9d9c8Sopenharmony_ci    assert!(v.is::<MacroInteger>())
26512a9d9c8Sopenharmony_ci}
26612a9d9c8Sopenharmony_ci
26712a9d9c8Sopenharmony_ci#[test]
26812a9d9c8Sopenharmony_cifn test_homogeneous_aggregate_float_union() {
26912a9d9c8Sopenharmony_ci    unsafe {
27012a9d9c8Sopenharmony_ci        let coord = &bindings::coord(1., 2., 3., 4.);
27112a9d9c8Sopenharmony_ci        assert_eq!([1., 2., 3., 4.], coord.v)
27212a9d9c8Sopenharmony_ci    }
27312a9d9c8Sopenharmony_ci}
27412a9d9c8Sopenharmony_ci
27512a9d9c8Sopenharmony_ci#[test]
27612a9d9c8Sopenharmony_cifn test_custom_derive() {
27712a9d9c8Sopenharmony_ci    // The `add_derives` callback should have added `#[derive(PartialEq)]`
27812a9d9c8Sopenharmony_ci    // to the `Test` struct. If it didn't, this will fail to compile.
27912a9d9c8Sopenharmony_ci    let test1 = unsafe { bindings::Test::new(5) };
28012a9d9c8Sopenharmony_ci    let test2 = unsafe { bindings::Test::new(6) };
28112a9d9c8Sopenharmony_ci    assert_ne!(test1, test2);
28212a9d9c8Sopenharmony_ci
28312a9d9c8Sopenharmony_ci    // The `add_derives` callback should have added `#[derive(PartialOrd)]`
28412a9d9c8Sopenharmony_ci    // to the `MyOrderedEnum` enum. If it didn't, this will fail to compile.
28512a9d9c8Sopenharmony_ci
28612a9d9c8Sopenharmony_ci    let micron = unsafe { bindings::MyOrderedEnum::MICRON };
28712a9d9c8Sopenharmony_ci    let meter = unsafe { bindings::MyOrderedEnum::METER };
28812a9d9c8Sopenharmony_ci    let lightyear = unsafe { bindings::MyOrderedEnum::LIGHTYEAR };
28912a9d9c8Sopenharmony_ci
29012a9d9c8Sopenharmony_ci    assert!(meter < lightyear);
29112a9d9c8Sopenharmony_ci    assert!(meter > micron);
29212a9d9c8Sopenharmony_ci}
29312a9d9c8Sopenharmony_ci
29412a9d9c8Sopenharmony_ci#[test]
29512a9d9c8Sopenharmony_cifn test_wrap_static_fns() {
29612a9d9c8Sopenharmony_ci    // GH-1090: https://github.com/rust-lang/rust-bindgen/issues/1090
29712a9d9c8Sopenharmony_ci    unsafe {
29812a9d9c8Sopenharmony_ci        let f = extern_bindings::foo();
29912a9d9c8Sopenharmony_ci        assert_eq!(11, f);
30012a9d9c8Sopenharmony_ci
30112a9d9c8Sopenharmony_ci        let b = extern_bindings::bar();
30212a9d9c8Sopenharmony_ci        assert_eq!(1, b);
30312a9d9c8Sopenharmony_ci
30412a9d9c8Sopenharmony_ci        let t = extern_bindings::takes_ptr(&mut 1);
30512a9d9c8Sopenharmony_ci        assert_eq!(2, t);
30612a9d9c8Sopenharmony_ci
30712a9d9c8Sopenharmony_ci        extern "C" fn function(x: i32) -> i32 {
30812a9d9c8Sopenharmony_ci            x + 1
30912a9d9c8Sopenharmony_ci        }
31012a9d9c8Sopenharmony_ci
31112a9d9c8Sopenharmony_ci        let tp = extern_bindings::takes_fn_ptr(Some(function));
31212a9d9c8Sopenharmony_ci        assert_eq!(2, tp);
31312a9d9c8Sopenharmony_ci
31412a9d9c8Sopenharmony_ci        let tf = extern_bindings::takes_fn(Some(function));
31512a9d9c8Sopenharmony_ci        assert_eq!(3, tf);
31612a9d9c8Sopenharmony_ci
31712a9d9c8Sopenharmony_ci        let ta = extern_bindings::takes_alias(Some(function));
31812a9d9c8Sopenharmony_ci        assert_eq!(4, ta);
31912a9d9c8Sopenharmony_ci
32012a9d9c8Sopenharmony_ci        let tq =
32112a9d9c8Sopenharmony_ci            extern_bindings::takes_qualified(&(&5 as *const _) as *const _);
32212a9d9c8Sopenharmony_ci        assert_eq!(5, tq);
32312a9d9c8Sopenharmony_ci    }
32412a9d9c8Sopenharmony_ci}
325