mirror of
https://git.proxmox.com/git/rustc
synced 2025-08-17 21:52:25 +00:00
79 lines
2.6 KiB
Rust
79 lines
2.6 KiB
Rust
use anyhow::{Context, Result};
|
|
use pretty_assertions::assert_eq;
|
|
use std::{fs, path::Path};
|
|
use wit_component::WitPrinter;
|
|
use wit_parser::Resolve;
|
|
|
|
/// This is a test which iterates over the `tests/merge` directory and treats
|
|
/// each subdirectory as its own test. Each subdirectory has an `into` and a
|
|
/// `from` folder which represent two different `Resolve` sets, each with their
|
|
/// own set of dependencies as well.
|
|
///
|
|
/// Each test will merge the `from` into the `into` and assert that everything
|
|
/// is valid along the way. On successful merge the resulting documents
|
|
/// are printed and asserted against expectations. Failures assert the
|
|
/// correct error message.
|
|
#[test]
|
|
fn merging() -> Result<()> {
|
|
drop(env_logger::try_init());
|
|
|
|
for entry in fs::read_dir("tests/merge")? {
|
|
let path = entry?.path();
|
|
if !path.is_dir() {
|
|
continue;
|
|
}
|
|
|
|
let test_case = path.file_stem().unwrap().to_str().unwrap();
|
|
println!("testing {test_case}");
|
|
|
|
let mut from = Resolve::default();
|
|
from.push_dir(&path.join("from"))?;
|
|
let mut into = Resolve::default();
|
|
into.push_dir(&path.join("into"))?;
|
|
|
|
from.assert_valid();
|
|
into.assert_valid();
|
|
|
|
match into.merge(from) {
|
|
Ok(_) => {
|
|
assert!(
|
|
!test_case.starts_with("bad-"),
|
|
"should have failed to merge"
|
|
);
|
|
into.assert_valid();
|
|
for (id, pkg) in into.packages.iter() {
|
|
let expected = path
|
|
.join("merge")
|
|
.join(&pkg.name.name)
|
|
.with_extension("wit");
|
|
let output = WitPrinter::default().print(&into, id, &[])?;
|
|
assert_output(&expected, &output)?;
|
|
}
|
|
}
|
|
Err(e) => {
|
|
assert!(test_case.starts_with("bad-"), "failed to merge with {e:?}");
|
|
assert_output(&path.join("error.txt"), &format!("{e:#}"))?;
|
|
}
|
|
}
|
|
}
|
|
|
|
Ok(())
|
|
}
|
|
|
|
fn assert_output(expected: &Path, actual: &str) -> Result<()> {
|
|
if std::env::var_os("BLESS").is_some() {
|
|
fs::create_dir_all(expected.parent().unwrap())?;
|
|
fs::write(expected, actual).with_context(|| format!("failed to write {expected:?}"))?;
|
|
} else {
|
|
assert_eq!(
|
|
fs::read_to_string(expected)
|
|
.with_context(|| format!("failed to read {expected:?}"))?
|
|
.replace("\r\n", "\n"),
|
|
actual,
|
|
"expectation `{}` did not match actual",
|
|
expected.display(),
|
|
);
|
|
}
|
|
Ok(())
|
|
}
|