| // Part of the Crubit project, under the Apache License v2.0 with LLVM | |
| // Exceptions. See /LICENSE for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| use composable_bridging_lib::*; | |
| use googletest::prelude::*; | |
| #[gtest] | |
| fn test_vec3() { | |
| expect_eq!(MakeVec3(1.0, 2.0, 3.0), Vec3 { x: 1.0, y: 2.0, z: 3.0 }); | |
| } | |
| #[gtest] | |
| fn test_pair() { | |
| expect_eq!(MakePair(1, 2.0, true), ((1, 2.0), true)); | |
| } | |
| #[gtest] | |
| fn test_optional() { | |
| expect_eq!(MakeOptionalVec3(1.0, 2.0, 3.0, true), Some(Vec3 { x: 1.0, y: 2.0, z: 3.0 })); | |
| expect_eq!(MakeOptionalVec3(1.0, 2.0, 3.0, false), None); | |
| } | |
| #[gtest] | |
| fn test_map_multiply() { | |
| expect_eq!( | |
| MapMultiply(Some(Vec3 { x: 1.0, y: 2.0, z: 3.0 }), 2.0), | |
| Some(Vec3 { x: 2.0, y: 4.0, z: 6.0 }) | |
| ); | |
| expect_eq!(MapMultiply(None, 2.0), None); | |
| } | |
| #[gtest] | |
| fn test_stuff() { | |
| expect_eq!(MakeStuff(), (None, Some((3.14, Vec3 { x: 1.0, y: 2.0, z: 3.0 })))); | |
| } | |
| #[gtest] | |
| fn test_vec3_of_structs() { | |
| expect_eq!( | |
| MakeVec3OfStructs(Stuff { i: 1, f: 2.0 }, Stuff { i: 3, f: 4.0 }, Stuff { i: 5, f: 6.0 }), | |
| Vec3 { x: Stuff { i: 1, f: 2.0 }, y: Stuff { i: 3, f: 4.0 }, z: Stuff { i: 5, f: 6.0 } } | |
| ); | |
| } | |
| #[gtest] | |
| fn test_greeting() { | |
| expect_eq!(ReturnProperGreeting(), cc_std::std::string::from("Hello, world!")); | |
| expect_true!(IsProperGreeting(cc_std::std::string::from("Hello, world!"))); | |
| expect_false!(IsProperGreeting(cc_std::std::string::from("Hi, world!"))); | |
| } | |
| #[gtest] | |
| fn test_properly_greet_stuff() { | |
| expect_eq!( | |
| ProperlyGreetStuff(Stuff { i: 1, f: 2.0 }), | |
| (cc_std::std::string::from("Hello, world!"), Stuff { i: 1, f: 2.0 }) | |
| ); | |
| } | |
| #[gtest] | |
| fn test_string_view_by_value() { | |
| fn live(value: cc_std::std::raw_string_view) -> &'static [u8] { | |
| unsafe { &*value.as_raw_bytes() } | |
| } | |
| expect_eq!(live(StringViewByValue("Hello".into())), b"Hello"); | |
| } | |
| #[gtest] | |
| fn test_return_optional_string_view() { | |
| fn live(value: Option<cc_std::std::raw_string_view>) -> Option<&'static [u8]> { | |
| value.map(|sv| unsafe { &*sv.as_raw_bytes() }) | |
| } | |
| expect_eq!(live(ReturnOptionalStringView(true, "Hello".into())), live(Some("Hello".into()))); | |
| expect_eq!(live(ReturnOptionalStringView(false, "Hello".into())), live(None)); | |
| } | |
| #[gtest] | |
| fn test_return_slice_ref_string_view() { | |
| let value: &[cc_std::std::raw_string_view] = | |
| &[cc_std::std::raw_string_view::from("return slice ref string view test")]; | |
| // TODO(b/440573418): Eventually this should take an `Alias<[cc_std::std::raw_string_view]>`, | |
| let result: *const [cc_std::std::raw_string_view] = | |
| unsafe { ReturnSliceRefStringView(value as *const [_]) }; | |
| let result: &[cc_std::std::raw_string_view] = unsafe { &*result }; | |
| assert_that!(result.len(), eq(1)); | |
| let value: &[u8] = unsafe { &*value[0].as_raw_bytes() }; | |
| let result: &[u8] = unsafe { &*result[0].as_raw_bytes() }; | |
| expect_that!(result, eq(value)) | |
| } | |
| #[gtest] | |
| fn test_status_of_pointer_is_bridged() { | |
| let result = AcceptsVoidPtrAndReturnsStatusErrorIfNull(core::ptr::null_mut()); | |
| expect_that!( | |
| result, | |
| status_rs_matchers::status_is(status::absl::StatusErrorCode::InvalidArgument) | |
| ); | |
| let mut thing = true; | |
| let void_ptr: *mut core::ffi::c_void = &raw mut thing as *mut _; | |
| let result = AcceptsVoidPtrAndReturnsStatusErrorIfNull(void_ptr); | |
| expect_that!(result, ok(eq(&void_ptr)),); | |
| } | |
| #[gtest] | |
| fn test_status_of_slice_ref_is_bridged_as_slice_ptr() { | |
| let empty_slice: &[core::ffi::c_int] = &[]; | |
| let result = AcceptsSliceAndReturnsStatusErrorIfEmpty(empty_slice as *const _); | |
| expect_that!( | |
| result, | |
| status_rs_matchers::status_is(status::absl::StatusErrorCode::InvalidArgument) | |
| ); | |
| let non_empty_slice: &[core::ffi::c_int] = &[1, 2, 3]; | |
| let result = AcceptsSliceAndReturnsStatusErrorIfEmpty(non_empty_slice as *const _); | |
| expect_that!(result, ok(eq(&(non_empty_slice as *const _)))); | |
| } | |
| #[gtest] | |
| fn test_optional_my_struct() { | |
| let x = ReturnOptionalMyStruct(); | |
| assert_eq!(x.unwrap().x, 42); | |
| } |