Skip to content

Commit a94f12b

Browse files
committed
Adding test for new annotations.
1 parent 5a8b1b7 commit a94f12b

File tree

1 file changed

+58
-18
lines changed

1 file changed

+58
-18
lines changed

gen/src/mod.rs

Lines changed: 58 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -31,34 +31,74 @@ pub(super) struct Opt {
3131

3232
pub(super) fn do_generate_bridge(path: &Path, opt: Opt) -> Vec<u8> {
3333
let header = false;
34-
generate(path, opt, header)
34+
generate_from_path(path, opt, header)
3535
}
3636

3737
pub(super) fn do_generate_header(path: &Path, opt: Opt) -> Vec<u8> {
3838
let header = true;
39-
generate(path, opt, header)
39+
generate_from_path(path, opt, header)
4040
}
4141

42-
fn generate(path: &Path, opt: Opt, header: bool) -> Vec<u8> {
42+
fn generate_from_path(path: &Path, opt: Opt, header: bool) -> Vec<u8> {
4343
let source = match fs::read_to_string(path) {
4444
Ok(source) => source,
4545
Err(err) => format_err(path, "", Error::Io(err)),
4646
};
47-
match (|| -> Result<_> {
48-
proc_macro2::fallback::force();
49-
let ref mut errors = Errors::new();
50-
let syntax = syn::parse_file(&source)?;
51-
let bridge = find::find_bridge_mod(syntax)?;
52-
let ref namespace = bridge.namespace;
53-
let ref apis = syntax::parse_items(errors, bridge.module);
54-
let ref types = Types::collect(errors, apis);
55-
errors.propagate()?;
56-
check::typecheck(errors, namespace, apis, types);
57-
errors.propagate()?;
58-
let out = write::gen(namespace, apis, types, opt, header);
59-
Ok(out)
60-
})() {
61-
Ok(out) => out.content(),
47+
match generate(&source, opt, header) {
48+
Ok(out) => out,
6249
Err(err) => format_err(path, &source, err),
6350
}
6451
}
52+
53+
fn generate(source: &str, opt: Opt, header: bool) -> Result<Vec<u8>> {
54+
proc_macro2::fallback::force();
55+
let ref mut errors = Errors::new();
56+
let syntax = syn::parse_file(&source)?;
57+
let bridge = find::find_bridge_mod(syntax)?;
58+
let ref namespace = bridge.namespace;
59+
let ref apis = syntax::parse_items(errors, bridge.module);
60+
let ref types = Types::collect(errors, apis);
61+
errors.propagate()?;
62+
check::typecheck(errors, namespace, apis, types);
63+
errors.propagate()?;
64+
let out = write::gen(namespace, apis, types, opt, header);
65+
Ok(out.content())
66+
}
67+
68+
#[cfg(test)]
69+
mod tests {
70+
use crate::gen::{generate, Opt};
71+
72+
const CPP_EXAMPLE: &'static str = r#"
73+
#[cxx::bridge]
74+
mod ffi {
75+
extern "C" {
76+
pub fn do_cpp_thing(foo: &str);
77+
}
78+
}
79+
"#;
80+
81+
#[test]
82+
fn test_cpp() {
83+
let opts = Opt {
84+
include: Vec::new(),
85+
cxx_impl_annotations: None,
86+
};
87+
let output = generate(CPP_EXAMPLE, opts, false).unwrap();
88+
let output = std::str::from_utf8(&output).unwrap();
89+
// To avoid continual breakage we won't test every byte.
90+
// Let's look for the major features.
91+
assert!(output.contains("void cxxbridge03$do_cpp_thing(::rust::Str::Repr foo)"));
92+
}
93+
94+
#[test]
95+
fn test_annotation() {
96+
let opts = Opt {
97+
include: Vec::new(),
98+
cxx_impl_annotations: Some("ANNOTATION".to_string()),
99+
};
100+
let output = generate(CPP_EXAMPLE, opts, false).unwrap();
101+
let output = std::str::from_utf8(&output).unwrap();
102+
assert!(output.contains("ANNOTATION void cxxbridge03$do_cpp_thing(::rust::Str::Repr foo)"));
103+
}
104+
}

0 commit comments

Comments
 (0)