blob: 25a5955b2e0b722f2e88164bff4d7bfbe2cbf526 [file]
// Copyright 2021 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#![cfg(test)]
/// Makes a banjo backend test.
/// Arguments:
/// id: name of test
/// backend: backend generator (CBackend, etc...)
/// golden file: file to compare against generated output
#[macro_export]
macro_rules! codegen_test {
( $id:ident, $backend: ident, $golden_file:expr ) => {
#[test]
fn $id() -> Result<(), anyhow::Error> {
use fidlgen_banjo_lib::{backends, fidl::FidlIr};
use pretty_assertions::assert_eq;
let ir: FidlIr = serde_json::from_str(test_irs::$id::IR)?;
let mut output = vec![];
let expected = include_str!($golden_file);
{
let mut backend: Box<dyn backends::Backend<'_, _>> =
Box::new(backends::$backend::new(&mut output));
backend.codegen(ir).unwrap();
}
let output = String::from_utf8(output).unwrap();
assert_eq!(output, expected);
Ok(())
}
};
}
mod c {
macro_rules! c_test {
( $id:ident ) => {
codegen_test!($id, CBackend, concat!("c/", stringify!($id), ".h"));
};
}
c_test!(alias);
c_test!(alignment);
c_test!(api);
c_test!(attributes);
c_test!(binary);
c_test!(buffer);
c_test!(callback);
c_test!(constants);
c_test!(empty);
c_test!(enums);
c_test!(example0);
c_test!(example1);
c_test!(example2);
c_test!(example3);
c_test!(example4);
c_test!(example6);
c_test!(example7);
c_test!(example8);
c_test!(example9);
c_test!(fidlhandle);
c_test!(handles);
c_test!(interface);
c_test!(order);
c_test!(order1);
c_test!(order2);
c_test!(order3);
c_test!(order4);
c_test!(order5);
c_test!(order6);
c_test!(passcallback);
c_test!(point);
c_test!(preservenames);
c_test!(protocolarray);
c_test!(protocolbase);
c_test!(protocolhandle);
c_test!(protocolothertypes);
c_test!(protocolprimitive);
c_test!(protocolvector);
c_test!(references);
c_test!(simple);
c_test!(tables);
c_test!(types);
c_test!(union);
c_test!(view);
}
mod rust {
macro_rules! rust_test {
( $id:ident ) => {
codegen_test!($id, RustBackend, concat!("rust/", stringify!($id), ".rs"));
};
}
rust_test!(alignment);
rust_test!(attributes);
rust_test!(empty);
rust_test!(enums);
rust_test!(example0);
rust_test!(example1);
rust_test!(example2);
rust_test!(example3);
rust_test!(example4);
rust_test!(example6);
rust_test!(example7);
rust_test!(example8);
rust_test!(example9);
rust_test!(point);
rust_test!(rustderive);
rust_test!(simple);
rust_test!(tables);
rust_test!(types);
rust_test!(view);
}
mod cpp {
macro_rules! cpp_test {
( $id:ident ) => {
codegen_test!($id, CppBackend, concat!("cpp/", stringify!($id), ".h"));
};
}
cpp_test!(buffer);
cpp_test!(callback);
cpp_test!(empty);
cpp_test!(example4);
cpp_test!(example6);
cpp_test!(example7);
cpp_test!(example9);
cpp_test!(handles);
cpp_test!(interface);
cpp_test!(protocolarray);
cpp_test!(protocolbase);
cpp_test!(protocolhandle);
cpp_test!(protocolothertypes);
cpp_test!(protocolprimitive);
cpp_test!(protocolvector);
cpp_test!(references);
cpp_test!(simple);
cpp_test!(view);
}
mod cpp_internal {
macro_rules! cpp_internal_test {
( $id:ident ) => {
codegen_test!($id, CppInternalBackend, concat!("cpp/", stringify!($id), "-internal.h"));
};
}
cpp_internal_test!(callback);
cpp_internal_test!(empty);
cpp_internal_test!(example4);
cpp_internal_test!(example6);
cpp_internal_test!(example7);
cpp_internal_test!(example9);
cpp_internal_test!(handles);
cpp_internal_test!(interface);
cpp_internal_test!(protocolarray);
cpp_internal_test!(protocolbase);
cpp_internal_test!(protocolhandle);
cpp_internal_test!(protocolothertypes);
cpp_internal_test!(protocolprimitive);
cpp_internal_test!(protocolvector);
cpp_internal_test!(simple);
cpp_internal_test!(view);
}
mod cpp_mock {
macro_rules! cpp_mock_test {
( $id:ident ) => {
codegen_test!($id, CppMockBackend, concat!("cpp/mock-", stringify!($id), ".h"));
};
}
cpp_mock_test!(interface);
cpp_mock_test!(passcallback);
cpp_mock_test!(protocolarray);
cpp_mock_test!(protocolbase);
cpp_mock_test!(protocolhandle);
cpp_mock_test!(protocolothertypes);
cpp_mock_test!(protocolprimitive);
cpp_mock_test!(protocolvector);
}