extern crate nbindgen;
use std::path::Path;
use std::process::Command;
use std::{env, fs, str};
fn run_cbindgen(cbindgen_path: &'static str, path: &Path, output: &Path) {
let program = Path::new(cbindgen_path);
let mut command = Command::new(&program);
command.arg("-o").arg(output);
if env::var("NBINDGEN_TEST_VERIFY").is_ok() {
command.arg("--verify");
}
let mut config = path.clone().to_path_buf();
config.set_extension("toml");
if config.exists() {
command.arg("--config").arg(config);
}
command.arg(path);
println!("Running: {:?}", command);
let cbindgen_output = command.output().expect("failed to execute process");
assert!(
cbindgen_output.status.success(),
"cbindgen failed: {:?} with error: {}",
output,
str::from_utf8(&cbindgen_output.stderr).unwrap_or_default()
);
}
fn compile(cbindgen_output: &Path) {
let cc = "nim";
let mut object = cbindgen_output.to_path_buf();
object.set_extension("o");
let mut command = Command::new(cc);
command.arg("check").arg(cbindgen_output);
println!("Running: {:?}", command);
let out = command.output().expect("failed to compile");
assert!(out.status.success(), "Output failed to compile: {:?}", out);
if object.exists() {
fs::remove_file(object).unwrap();
}
}
fn run_compile_test(cbindgen_path: &'static str, name: &'static str, path: &Path) {
let crate_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
let mut output = Path::new(&crate_dir).join("tests").join("expectations");
output.push(format!("{}.nim", name.replace("-", "_")));
run_cbindgen(cbindgen_path, path, &output);
compile(&output);
}
fn test_file(cbindgen_path: &'static str, name: &'static str, filename: &'static str) {
let test = Path::new(filename);
run_compile_test(cbindgen_path, name, &test);
}
macro_rules! test_file {
($cbindgen_path:expr, $test_function_name:ident, $name:expr, $file:tt) => {
#[test]
fn $test_function_name() {
test_file($cbindgen_path, $name, $file);
}
};
}
include!(concat!(env!("OUT_DIR"), "/tests.rs"));