blob: 527d7090c79d1050ee76c072ec2e574322ff037a [file] [log] [blame]
David Tolnay821402b2020-10-04 19:48:01 -07001use cxx_gen::{generate_header_and_cc, Opt};
David Tolnay1f7a7e52020-10-04 19:49:10 -07002use std::str;
David Tolnay821402b2020-10-04 19:48:01 -07003
David Tolnay1f7a7e52020-10-04 19:49:10 -07004const BRIDGE0: &str = r#"
David Tolnay821402b2020-10-04 19:48:01 -07005 #[cxx::bridge]
6 mod ffi {
7 extern "C" {
8 pub fn do_cpp_thing(foo: &str);
9 }
10 }
11"#;
12
13#[test]
David Tolnay1f7a7e52020-10-04 19:49:10 -070014fn test_extern_c_function() {
David Tolnay821402b2020-10-04 19:48:01 -070015 let opt = Opt::default();
David Tolnay1f7a7e52020-10-04 19:49:10 -070016 let source = BRIDGE0.parse().unwrap();
17 let generated = generate_header_and_cc(source, &opt).unwrap();
18 let output = str::from_utf8(&generated.implementation).unwrap();
David Tolnay821402b2020-10-04 19:48:01 -070019 // To avoid continual breakage we won't test every byte.
20 // Let's look for the major features.
David Tolnay8f16ae72020-10-08 18:21:13 -070021 assert!(output.contains("void cxxbridge05$do_cpp_thing(::rust::Str::Repr foo)"));
David Tolnay821402b2020-10-04 19:48:01 -070022}
23
24#[test]
David Tolnay1f7a7e52020-10-04 19:49:10 -070025fn test_impl_annotation() {
David Tolnay821402b2020-10-04 19:48:01 -070026 let mut opt = Opt::default();
27 opt.cxx_impl_annotations = Some("ANNOTATION".to_owned());
David Tolnay1f7a7e52020-10-04 19:49:10 -070028 let source = BRIDGE0.parse().unwrap();
29 let generated = generate_header_and_cc(source, &opt).unwrap();
30 let output = str::from_utf8(&generated.implementation).unwrap();
David Tolnay8f16ae72020-10-08 18:21:13 -070031 assert!(output.contains("ANNOTATION void cxxbridge05$do_cpp_thing(::rust::Str::Repr foo)"));
David Tolnay821402b2020-10-04 19:48:01 -070032}