blob: 5cfd97b97178c08c49cc645b3daac4781deb8ca5 [file] [log] [blame]
David Tolnaya95b2342020-04-09 23:26:05 -07001#![allow(
2 clippy::boxed_local,
3 clippy::ptr_arg,
4 clippy::trivially_copy_pass_by_ref
5)]
David Tolnay265f6a02020-03-18 20:13:55 -07006
David Tolnaya62cca22020-05-07 21:52:16 -07007pub mod module;
8
David Tolnay5df0a712020-09-24 15:58:28 -04009use cxx::{CxxString, CxxVector, UniquePtr};
David Tolnayb6c5ea72020-03-16 13:36:28 -070010use std::fmt::{self, Display};
David Tolnayad5b8af2020-01-26 16:59:13 -080011
David Tolnay97c72102020-01-25 16:49:00 -080012#[cxx::bridge(namespace = tests)]
13pub mod ffi {
Stephen Crane9e48d5b2020-08-21 12:17:02 -070014 #[derive(Clone)]
David Tolnayad5b8af2020-01-26 16:59:13 -080015 struct Shared {
16 z: usize,
17 }
18
Joel Galensonc03402a2020-04-23 17:31:09 -070019 enum Enum {
20 AVal,
21 BVal = 2020,
22 CVal,
23 }
24
David Tolnay97c72102020-01-25 16:49:00 -080025 extern "C" {
David Tolnayd41eef52020-10-07 16:33:55 -070026 include!("tests/ffi/tests.h");
David Tolnayad5b8af2020-01-26 16:59:13 -080027
28 type C;
29
30 fn c_return_primitive() -> usize;
31 fn c_return_shared() -> Shared;
David Tolnaybe13d8a2020-03-06 15:45:39 -080032 fn c_return_box() -> Box<R>;
David Tolnayad5b8af2020-01-26 16:59:13 -080033 fn c_return_unique_ptr() -> UniquePtr<C>;
34 fn c_return_ref(shared: &Shared) -> &usize;
David Tolnay18d93b62020-08-27 00:55:48 -070035 fn c_return_mut(shared: &mut Shared) -> &mut usize;
David Tolnayad5b8af2020-01-26 16:59:13 -080036 fn c_return_str(shared: &Shared) -> &str;
Adrian Taylorf5dd5522020-04-13 16:50:14 -070037 fn c_return_sliceu8(shared: &Shared) -> &[u8];
David Tolnayad5b8af2020-01-26 16:59:13 -080038 fn c_return_rust_string() -> String;
39 fn c_return_unique_ptr_string() -> UniquePtr<CxxString>;
David Tolnaye1dcdf72020-04-24 17:40:55 -070040 fn c_return_unique_ptr_vector_u8() -> UniquePtr<CxxVector<u8>>;
41 fn c_return_unique_ptr_vector_f64() -> UniquePtr<CxxVector<f64>>;
David Tolnay47e239d2020-08-28 00:32:04 -070042 fn c_return_unique_ptr_vector_string() -> UniquePtr<CxxVector<CxxString>>;
David Tolnaye1dcdf72020-04-24 17:40:55 -070043 fn c_return_unique_ptr_vector_shared() -> UniquePtr<CxxVector<Shared>>;
David Tolnay1bcc9fe2020-04-25 13:51:07 -070044 fn c_return_unique_ptr_vector_opaque() -> UniquePtr<CxxVector<C>>;
David Tolnayde5340e2020-04-25 14:03:21 -070045 fn c_return_ref_vector(c: &C) -> &CxxVector<u8>;
David Tolnay18d93b62020-08-27 00:55:48 -070046 fn c_return_mut_vector(c: &mut C) -> &mut CxxVector<u8>;
David Tolnayb41e74c2020-04-25 15:06:18 -070047 fn c_return_rust_vec() -> Vec<u8>;
David Tolnay77989692020-04-25 15:57:47 -070048 fn c_return_ref_rust_vec(c: &C) -> &Vec<u8>;
David Tolnay18d93b62020-08-27 00:55:48 -070049 fn c_return_mut_rust_vec(c: &mut C) -> &mut Vec<u8>;
David Tolnay33f56ad2020-08-27 17:06:35 -070050 fn c_return_rust_vec_string() -> Vec<String>;
Joel Galensonba676072020-04-27 15:55:45 -070051 fn c_return_identity(_: usize) -> usize;
52 fn c_return_sum(_: usize, _: usize) -> usize;
David Tolnayf6a89f22020-05-10 23:39:27 -070053 fn c_return_enum(n: u16) -> Enum;
David Tolnayad5b8af2020-01-26 16:59:13 -080054
55 fn c_take_primitive(n: usize);
56 fn c_take_shared(shared: Shared);
57 fn c_take_box(r: Box<R>);
David Tolnaya7d00e82020-03-06 15:50:14 -080058 fn c_take_ref_r(r: &R);
David Tolnayad5b8af2020-01-26 16:59:13 -080059 fn c_take_ref_c(c: &C);
60 fn c_take_str(s: &str);
Adrian Taylorf5dd5522020-04-13 16:50:14 -070061 fn c_take_sliceu8(s: &[u8]);
David Tolnayad5b8af2020-01-26 16:59:13 -080062 fn c_take_rust_string(s: String);
63 fn c_take_unique_ptr_string(s: UniquePtr<CxxString>);
David Tolnay9b304202020-04-25 13:54:55 -070064 fn c_take_unique_ptr_vector_u8(v: UniquePtr<CxxVector<u8>>);
65 fn c_take_unique_ptr_vector_f64(v: UniquePtr<CxxVector<f64>>);
David Tolnay47e239d2020-08-28 00:32:04 -070066 fn c_take_unique_ptr_vector_string(v: UniquePtr<CxxVector<CxxString>>);
David Tolnay9b304202020-04-25 13:54:55 -070067 fn c_take_unique_ptr_vector_shared(v: UniquePtr<CxxVector<Shared>>);
David Tolnay2244d1f2020-04-25 13:58:18 -070068 fn c_take_ref_vector(v: &CxxVector<u8>);
David Tolnayd2ce8a92020-04-25 16:16:45 -070069 fn c_take_rust_vec(v: Vec<u8>);
70 fn c_take_rust_vec_shared(v: Vec<Shared>);
David Tolnay33f56ad2020-08-27 17:06:35 -070071 fn c_take_rust_vec_string(v: Vec<String>);
Stephen Crane9e48d5b2020-08-21 12:17:02 -070072 fn c_take_rust_vec_index(v: Vec<u8>);
73 fn c_take_rust_vec_shared_index(v: Vec<Shared>);
myronahnda9be502020-04-29 05:47:23 +070074 fn c_take_rust_vec_shared_forward_iterator(v: Vec<Shared>);
David Tolnayd2ce8a92020-04-25 16:16:45 -070075 fn c_take_ref_rust_vec(v: &Vec<u8>);
David Tolnay33f56ad2020-08-27 17:06:35 -070076 fn c_take_ref_rust_vec_string(v: &Vec<String>);
Stephen Crane9e48d5b2020-08-21 12:17:02 -070077 fn c_take_ref_rust_vec_index(v: &Vec<u8>);
myronahnda9be502020-04-29 05:47:23 +070078 fn c_take_ref_rust_vec_copy(v: &Vec<u8>);
David Tolnay0c8c0f22020-07-21 17:57:46 -070079 /*
80 // https://github.com/dtolnay/cxx/issues/232
David Tolnay75dca2e2020-03-25 20:17:52 -070081 fn c_take_callback(callback: fn(String) -> usize);
David Tolnay0c8c0f22020-07-21 17:57:46 -070082 */
Joel Galensonc03402a2020-04-23 17:31:09 -070083 fn c_take_enum(e: Enum);
David Tolnayebef4a22020-03-17 15:33:47 -070084
85 fn c_try_return_void() -> Result<()>;
86 fn c_try_return_primitive() -> Result<usize>;
87 fn c_fail_return_primitive() -> Result<usize>;
David Tolnay99642622020-03-25 13:07:35 -070088 fn c_try_return_box() -> Result<Box<R>>;
89 fn c_try_return_ref(s: &String) -> Result<&String>;
90 fn c_try_return_str(s: &str) -> Result<&str>;
Adrian Taylorf5dd5522020-04-13 16:50:14 -070091 fn c_try_return_sliceu8(s: &[u8]) -> Result<&[u8]>;
David Tolnay99642622020-03-25 13:07:35 -070092 fn c_try_return_rust_string() -> Result<String>;
93 fn c_try_return_unique_ptr_string() -> Result<UniquePtr<CxxString>>;
David Tolnay8b9d1762020-04-25 16:05:46 -070094 fn c_try_return_rust_vec() -> Result<Vec<u8>>;
David Tolnay33f56ad2020-08-27 17:06:35 -070095 fn c_try_return_rust_vec_string() -> Result<Vec<String>>;
David Tolnay77989692020-04-25 15:57:47 -070096 fn c_try_return_ref_rust_vec(c: &C) -> Result<&Vec<u8>>;
Joel Galenson3d4f6122020-04-07 15:54:05 -070097
98 fn get(self: &C) -> usize;
99 fn set(self: &mut C, n: usize) -> usize;
Joel Galensone1e969d2020-04-21 12:50:20 -0700100 fn get2(&self) -> usize;
101 fn set2(&mut self, n: usize) -> usize;
myronahne3b78ea2020-05-23 01:08:13 +0700102 fn set_succeed(&mut self, n: usize) -> Result<usize>;
103 fn get_fail(&mut self) -> Result<usize>;
David Tolnay3bbcdbb2020-10-09 19:29:44 -0700104
105 #[rust_name = "i32_overloaded_method"]
106 fn cOverloadedMethod(&self, x: i32) -> String;
107 #[rust_name = "str_overloaded_method"]
108 fn cOverloadedMethod(&self, x: &str) -> String;
109 #[rust_name = "i32_overloaded_function"]
110 fn cOverloadedFunction(x: i32) -> String;
111 #[rust_name = "str_overloaded_function"]
112 fn cOverloadedFunction(x: &str) -> String;
David Tolnay97c72102020-01-25 16:49:00 -0800113 }
David Tolnayad5b8af2020-01-26 16:59:13 -0800114
Joel Galenson0f654ff2020-05-04 20:04:21 -0700115 extern "C" {
116 type COwnedEnum;
117 }
118
David Tolnayf6a89f22020-05-10 23:39:27 -0700119 #[repr(u32)]
Joel Galenson0f654ff2020-05-04 20:04:21 -0700120 enum COwnedEnum {
121 CVal1,
122 CVal2,
123 }
124
David Tolnayad5b8af2020-01-26 16:59:13 -0800125 extern "Rust" {
126 type R;
Joel Galensonc1c4e7a2020-04-15 10:21:00 -0700127 type R2;
David Tolnayad5b8af2020-01-26 16:59:13 -0800128
129 fn r_return_primitive() -> usize;
130 fn r_return_shared() -> Shared;
David Tolnay5cd8d612020-03-06 15:56:30 -0800131 fn r_return_box() -> Box<R>;
David Tolnay4b3a66e2020-03-06 16:14:00 -0800132 fn r_return_unique_ptr() -> UniquePtr<C>;
David Tolnayad5b8af2020-01-26 16:59:13 -0800133 fn r_return_ref(shared: &Shared) -> &usize;
David Tolnay18d93b62020-08-27 00:55:48 -0700134 fn r_return_mut(shared: &mut Shared) -> &mut usize;
David Tolnayad5b8af2020-01-26 16:59:13 -0800135 fn r_return_str(shared: &Shared) -> &str;
136 fn r_return_rust_string() -> String;
David Tolnay85db24862020-03-06 16:24:41 -0800137 fn r_return_unique_ptr_string() -> UniquePtr<CxxString>;
David Tolnay83c69e92020-04-25 16:59:39 -0700138 fn r_return_rust_vec() -> Vec<u8>;
David Tolnay33f56ad2020-08-27 17:06:35 -0700139 fn r_return_rust_vec_string() -> Vec<String>;
David Tolnay83c69e92020-04-25 16:59:39 -0700140 fn r_return_ref_rust_vec(shared: &Shared) -> &Vec<u8>;
David Tolnay18d93b62020-08-27 00:55:48 -0700141 fn r_return_mut_rust_vec(shared: &mut Shared) -> &mut Vec<u8>;
Joel Galensonba676072020-04-27 15:55:45 -0700142 fn r_return_identity(_: usize) -> usize;
143 fn r_return_sum(_: usize, _: usize) -> usize;
Joel Galensonc03402a2020-04-23 17:31:09 -0700144 fn r_return_enum(n: u32) -> Enum;
David Tolnayad5b8af2020-01-26 16:59:13 -0800145
146 fn r_take_primitive(n: usize);
147 fn r_take_shared(shared: Shared);
148 fn r_take_box(r: Box<R>);
149 fn r_take_unique_ptr(c: UniquePtr<C>);
150 fn r_take_ref_r(r: &R);
151 fn r_take_ref_c(c: &C);
152 fn r_take_str(s: &str);
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700153 fn r_take_sliceu8(s: &[u8]);
David Tolnayad5b8af2020-01-26 16:59:13 -0800154 fn r_take_rust_string(s: String);
155 fn r_take_unique_ptr_string(s: UniquePtr<CxxString>);
David Tolnay5df0a712020-09-24 15:58:28 -0400156 fn r_take_ref_vector(v: &CxxVector<u8>);
David Tolnay80631e92020-09-24 16:07:30 -0400157 fn r_take_ref_empty_vector(v: &CxxVector<u64>);
David Tolnay83c69e92020-04-25 16:59:39 -0700158 fn r_take_rust_vec(v: Vec<u8>);
David Tolnay33f56ad2020-08-27 17:06:35 -0700159 fn r_take_rust_vec_string(v: Vec<String>);
David Tolnay83c69e92020-04-25 16:59:39 -0700160 fn r_take_ref_rust_vec(v: &Vec<u8>);
David Tolnay33f56ad2020-08-27 17:06:35 -0700161 fn r_take_ref_rust_vec_string(v: &Vec<String>);
Joel Galensonc03402a2020-04-23 17:31:09 -0700162 fn r_take_enum(e: Enum);
David Tolnayb6c5ea72020-03-16 13:36:28 -0700163
David Tolnaycecada62020-03-17 01:45:58 -0700164 fn r_try_return_void() -> Result<()>;
David Tolnayb6c5ea72020-03-16 13:36:28 -0700165 fn r_try_return_primitive() -> Result<usize>;
David Tolnay22602b42020-09-21 18:04:05 -0400166 fn r_try_return_box() -> Result<Box<R>>;
David Tolnayb6c5ea72020-03-16 13:36:28 -0700167 fn r_fail_return_primitive() -> Result<usize>;
Joel Galensonc1c4e7a2020-04-15 10:21:00 -0700168
169 fn r_return_r2(n: usize) -> Box<R2>;
170 fn get(self: &R2) -> usize;
171 fn set(self: &mut R2, n: usize) -> usize;
David Tolnay3bbcdbb2020-10-09 19:29:44 -0700172
173 #[cxx_name = "rAliasedFunction"]
174 fn r_aliased_function(x: i32) -> String;
David Tolnayad5b8af2020-01-26 16:59:13 -0800175 }
176}
177
David Tolnaybe13d8a2020-03-06 15:45:39 -0800178pub type R = usize;
David Tolnayad5b8af2020-01-26 16:59:13 -0800179
Joel Galensonc1c4e7a2020-04-15 10:21:00 -0700180pub struct R2(usize);
181
182impl R2 {
183 fn get(&self) -> usize {
184 self.0
185 }
186
187 fn set(&mut self, n: usize) -> usize {
188 self.0 = n;
189 n
190 }
191}
192
David Tolnayb6c5ea72020-03-16 13:36:28 -0700193#[derive(Debug)]
194struct Error;
195
196impl std::error::Error for Error {}
197
198impl Display for Error {
199 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
200 f.write_str("rust error")
201 }
202}
203
David Tolnayad5b8af2020-01-26 16:59:13 -0800204fn r_return_primitive() -> usize {
205 2020
206}
207
208fn r_return_shared() -> ffi::Shared {
209 ffi::Shared { z: 2020 }
210}
211
David Tolnay5cd8d612020-03-06 15:56:30 -0800212fn r_return_box() -> Box<R> {
213 Box::new(2020)
214}
215
David Tolnay4b3a66e2020-03-06 16:14:00 -0800216fn r_return_unique_ptr() -> UniquePtr<ffi::C> {
217 extern "C" {
218 fn cxx_test_suite_get_unique_ptr() -> *mut ffi::C;
219 }
220 unsafe { UniquePtr::from_raw(cxx_test_suite_get_unique_ptr()) }
221}
222
David Tolnayad5b8af2020-01-26 16:59:13 -0800223fn r_return_ref(shared: &ffi::Shared) -> &usize {
224 &shared.z
225}
226
David Tolnay18d93b62020-08-27 00:55:48 -0700227fn r_return_mut(shared: &mut ffi::Shared) -> &mut usize {
228 &mut shared.z
229}
230
David Tolnayad5b8af2020-01-26 16:59:13 -0800231fn r_return_str(shared: &ffi::Shared) -> &str {
232 let _ = shared;
233 "2020"
234}
235
236fn r_return_rust_string() -> String {
237 "2020".to_owned()
238}
239
David Tolnay85db24862020-03-06 16:24:41 -0800240fn r_return_unique_ptr_string() -> UniquePtr<CxxString> {
241 extern "C" {
242 fn cxx_test_suite_get_unique_ptr_string() -> *mut CxxString;
243 }
244 unsafe { UniquePtr::from_raw(cxx_test_suite_get_unique_ptr_string()) }
245}
246
David Tolnay83c69e92020-04-25 16:59:39 -0700247fn r_return_rust_vec() -> Vec<u8> {
248 Vec::new()
249}
250
David Tolnay33f56ad2020-08-27 17:06:35 -0700251fn r_return_rust_vec_string() -> Vec<String> {
252 Vec::new()
253}
254
David Tolnay83c69e92020-04-25 16:59:39 -0700255fn r_return_ref_rust_vec(shared: &ffi::Shared) -> &Vec<u8> {
256 let _ = shared;
257 unimplemented!()
258}
259
David Tolnay18d93b62020-08-27 00:55:48 -0700260fn r_return_mut_rust_vec(shared: &mut ffi::Shared) -> &mut Vec<u8> {
261 let _ = shared;
262 unimplemented!()
263}
264
Joel Galensonba676072020-04-27 15:55:45 -0700265fn r_return_identity(n: usize) -> usize {
266 n
267}
268
269fn r_return_sum(n1: usize, n2: usize) -> usize {
270 n1 + n2
271}
272
Joel Galensonc03402a2020-04-23 17:31:09 -0700273fn r_return_enum(n: u32) -> ffi::Enum {
David Tolnay884d91f2020-05-05 10:17:23 -0700274 if n == 0 {
Joel Galensonc03402a2020-04-23 17:31:09 -0700275 ffi::Enum::AVal
276 } else if n <= 2020 {
277 ffi::Enum::BVal
278 } else {
279 ffi::Enum::CVal
280 }
281}
282
David Tolnayad5b8af2020-01-26 16:59:13 -0800283fn r_take_primitive(n: usize) {
David Tolnayf306da42020-02-22 19:55:43 -0800284 assert_eq!(n, 2020);
David Tolnayad5b8af2020-01-26 16:59:13 -0800285}
286
287fn r_take_shared(shared: ffi::Shared) {
David Tolnayf306da42020-02-22 19:55:43 -0800288 assert_eq!(shared.z, 2020);
David Tolnayad5b8af2020-01-26 16:59:13 -0800289}
290
291fn r_take_box(r: Box<R>) {
292 let _ = r;
293}
294
295fn r_take_unique_ptr(c: UniquePtr<ffi::C>) {
296 let _ = c;
297}
298
299fn r_take_ref_r(r: &R) {
300 let _ = r;
301}
302
303fn r_take_ref_c(c: &ffi::C) {
304 let _ = c;
305}
306
307fn r_take_str(s: &str) {
David Tolnayf306da42020-02-22 19:55:43 -0800308 assert_eq!(s, "2020");
David Tolnayad5b8af2020-01-26 16:59:13 -0800309}
310
311fn r_take_rust_string(s: String) {
David Tolnayf306da42020-02-22 19:55:43 -0800312 assert_eq!(s, "2020");
David Tolnayad5b8af2020-01-26 16:59:13 -0800313}
314
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700315fn r_take_sliceu8(s: &[u8]) {
316 assert_eq!(s.len(), 5);
David Tolnayefe81052020-04-14 16:28:24 -0700317 assert_eq!(std::str::from_utf8(s).unwrap(), "2020\0");
Adrian Taylorf5dd5522020-04-13 16:50:14 -0700318}
319
David Tolnayad5b8af2020-01-26 16:59:13 -0800320fn r_take_unique_ptr_string(s: UniquePtr<CxxString>) {
David Tolnayf306da42020-02-22 19:55:43 -0800321 assert_eq!(s.as_ref().unwrap().to_str().unwrap(), "2020");
David Tolnay97c72102020-01-25 16:49:00 -0800322}
David Tolnayb6c5ea72020-03-16 13:36:28 -0700323
David Tolnay5df0a712020-09-24 15:58:28 -0400324fn r_take_ref_vector(v: &CxxVector<u8>) {
325 let slice = v.as_slice();
326 assert_eq!(slice, [20, 2, 0]);
327}
328
David Tolnay80631e92020-09-24 16:07:30 -0400329fn r_take_ref_empty_vector(v: &CxxVector<u64>) {
330 assert!(v.as_slice().is_empty());
331 assert!(v.is_empty());
332}
333
David Tolnay83c69e92020-04-25 16:59:39 -0700334fn r_take_rust_vec(v: Vec<u8>) {
335 let _ = v;
336}
337
David Tolnay33f56ad2020-08-27 17:06:35 -0700338fn r_take_rust_vec_string(v: Vec<String>) {
339 let _ = v;
340}
341
David Tolnay83c69e92020-04-25 16:59:39 -0700342fn r_take_ref_rust_vec(v: &Vec<u8>) {
343 let _ = v;
344}
345
David Tolnay33f56ad2020-08-27 17:06:35 -0700346fn r_take_ref_rust_vec_string(v: &Vec<String>) {
347 let _ = v;
348}
349
Joel Galensonc03402a2020-04-23 17:31:09 -0700350fn r_take_enum(e: ffi::Enum) {
351 let _ = e;
352}
353
David Tolnaycecada62020-03-17 01:45:58 -0700354fn r_try_return_void() -> Result<(), Error> {
355 Ok(())
356}
357
David Tolnayb6c5ea72020-03-16 13:36:28 -0700358fn r_try_return_primitive() -> Result<usize, Error> {
359 Ok(2020)
360}
361
David Tolnay22602b42020-09-21 18:04:05 -0400362fn r_try_return_box() -> Result<Box<R>, Error> {
363 Ok(Box::new(2020))
364}
365
David Tolnayb6c5ea72020-03-16 13:36:28 -0700366fn r_fail_return_primitive() -> Result<usize, Error> {
367 Err(Error)
368}
Joel Galensonc1c4e7a2020-04-15 10:21:00 -0700369
370fn r_return_r2(n: usize) -> Box<R2> {
371 Box::new(R2(n))
372}
David Tolnay3bbcdbb2020-10-09 19:29:44 -0700373
374fn r_aliased_function(x: i32) -> String {
375 x.to_string()
376}