slint/tests/driver/nodejs.rs
Simon Hausmann cb081a6bda Test that loading types from the include path works
This uses the recently added "hooks" or APIs to pass an include path that's specified in the test case itself.
2020-07-19 18:31:10 +02:00

69 lines
2.8 KiB
Rust

use std::error::Error;
use std::{fs::File, io::Write, path::PathBuf};
lazy_static::lazy_static! {
static ref NATIVE_LIB: PathBuf = {
use test_driver_lib::Message;
let mut res = PathBuf::new();
test_driver_lib::run_cargo(&env!("CARGO"), "build", &["-p", "sixtyfps-node"], |message| {
if let Message::CompilerArtifact(artifact) = message {
if artifact.target.name != "sixtyfps_node_native" {
return Ok(());
}
assert!(res.as_os_str().is_empty(), "There must be only one target with name 'sixtyfps_node_native'");
res = artifact.filenames[0].clone();
} else if let Message::CompilerMessage(cm) = message {
println!("{}", cm);
}
Ok(())
}).expect("Could not run cargo build to extract native node plugin path");
assert!(!res.as_os_str().is_empty(), "Did not find the native nodejs lib (sixtyfps_node_native)");
res
};
}
pub fn test(testcase: &test_driver_lib::TestCase) -> Result<(), Box<dyn Error>> {
let native_lib = NATIVE_LIB.as_os_str();
let mut sixtyfpspath = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
sixtyfpspath.pop(); // driver
sixtyfpspath.pop(); // tests
sixtyfpspath.push("api/sixtyfps-node/lib/index.js");
let dir = tempfile::tempdir()?;
let mut main_js = File::create(dir.path().join("main.js"))?;
write!(
main_js,
r#"
const assert = require('assert').strict;
require("{sixtyfpspath}");
let sixtyfps = require("{path}");
"#,
sixtyfpspath = sixtyfpspath.to_string_lossy(),
path = testcase.absolute_path.to_string_lossy()
)?;
let source = std::fs::read_to_string(&testcase.absolute_path)?;
let include_paths = test_driver_lib::extract_include_paths(&source);
for x in test_driver_lib::extract_test_functions(&source).filter(|x| x.language_id == "js") {
write!(main_js, "{{\n {}\n}}\n", x.source.replace("\n", "\n "))?;
}
let output = std::process::Command::new("node")
.arg(dir.path().join("main.js"))
.current_dir(dir.path())
.env("SIXTYFPS_NODE_NATIVE_LIB", native_lib)
.env("SIXTYFPS_INCLUDE_PATH", std::env::join_paths(include_paths).unwrap())
.stdout(std::process::Stdio::piped())
.stderr(std::process::Stdio::piped())
.output()
.map_err(|err| format!("Could not launch npm start: {}", err))?;
if !output.status.success() {
print!("{}", String::from_utf8_lossy(output.stdout.as_ref()));
print!("{}", String::from_utf8_lossy(output.stderr.as_ref()));
return Err(String::from_utf8_lossy(output.stderr.as_ref()).to_owned().into());
}
Ok(())
}