1 use std::path::Path;
2
3 use wasmtime::{Result, bail, error::Context};
4
5 macro_rules! genexpand {
6 ($id:ident $name:tt $path:tt) => {
7 process_expanded($path, "", wasmtime::component::bindgen!({
8 path: $path,
9 stringify: true,
10 }))?;
11
12 process_expanded($path, "_async", wasmtime::component::bindgen!({
13 path: $path,
14 stringify: true,
15 imports: { default: async },
16 exports: { default: async },
17 }))?;
18
19 process_expanded($path, "_concurrent", wasmtime::component::bindgen!({
20 path: $path,
21 imports: { default: async | store },
22 exports: { default: async | store },
23 stringify: true,
24 }))?;
25
26 process_expanded($path, "_tracing_async", wasmtime::component::bindgen!({
27 path: $path,
28 imports: { default: async | tracing },
29 exports: { default: async | tracing },
30 stringify: true,
31 }))?;
32 };
33 }
34
process_expanded(path: &str, suffix: &str, src: &str) -> Result<()>35 fn process_expanded(path: &str, suffix: &str, src: &str) -> Result<()> {
36 let formatted_src = {
37 let syn_file = syn::parse_file(src).unwrap();
38 prettyplease::unparse(&syn_file)
39 };
40 let expanded_path = {
41 let mut stem = Path::new(path).file_stem().unwrap().to_os_string();
42 stem.push(suffix);
43 Path::new("tests/expanded").join(stem).with_extension("rs")
44 };
45 if std::env::var("BINDGEN_TEST_BLESS").is_ok_and(|val| !val.is_empty()) {
46 std::fs::write(expanded_path, formatted_src)?;
47 } else {
48 match std::fs::read_to_string(&expanded_path) {
49 Ok(expected) if formatted_src == expected => (),
50 Ok(expected) => {
51 bail!(
52 "checked-in expanded bindings from {expanded_path:?} \
53 do not match those generated from {path:?}
54 \n\
55 {diff}\n\
56 \n\
57 This test assertion can be automatically updated by setting the\n\
58 BINDGEN_TEST_BLESS=1 environment variable when running this test.",
59 diff = similar::TextDiff::from_lines(&expected, &formatted_src)
60 .unified_diff()
61 .header("expected", "actual")
62 )
63 }
64 Err(err) => return Err(err).with_context(|| {
65 format!(
66 "failed to read {expanded_path:?}; re-run with BINDGEN_TEST_BLESS=1 to create"
67 )
68 }),
69 }
70 }
71 Ok(())
72 }
73
74 #[test]
expand_wits() -> Result<()>75 fn expand_wits() -> Result<()> {
76 component_macro_test_helpers::foreach!(genexpand);
77 Ok(())
78 }
79