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