Something went wrong. Try again.
Rust CLI for tangled
Something went wrong. Try again.
2.1 kB · 61 lines
Rust
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162//! Golden-file tests for the lexicon code generator.//!//! Run with `XTASK_BLESS=1 cargo test -p xtask` to update the expected files//! after intentional generator changes, then review the diff.
use std::collections::BTreeMap;use std::path::{Path, PathBuf};
#[test]fn generated_output_matches_golden_files() { let fixtures = Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/fixtures"); let generated = xtask::codegen::generate(&fixtures.join("lexicons")).unwrap(); assert!( generated.warnings.is_empty(), "unexpected warnings: {:#?}", generated.warnings );
let expected_dir = fixtures.join("expected"); if std::env::var_os("XTASK_BLESS").is_some() { if expected_dir.exists() { std::fs::remove_dir_all(&expected_dir).unwrap(); } for (path, content) in &generated.files { let full = expected_dir.join(path); std::fs::create_dir_all(full.parent().unwrap()).unwrap(); std::fs::write(full, content).unwrap(); } return; }
let mut expected = BTreeMap::new(); read_tree(&expected_dir, &expected_dir, &mut expected); let generated_paths: Vec<_> = generated.files.keys().cloned().collect(); let expected_paths: Vec<_> = expected.keys().cloned().collect(); assert_eq!( generated_paths, expected_paths, "file set changed; run XTASK_BLESS=1 cargo test -p xtask and review" ); for (path, content) in &generated.files { assert_eq!( content, &expected[path], "{} changed; run XTASK_BLESS=1 cargo test -p xtask and review", path.display() ); }}
fn read_tree(root: &Path, dir: &Path, out: &mut BTreeMap<PathBuf, String>) { for entry in std::fs::read_dir(dir).unwrap() { let path = entry.unwrap().path(); if path.is_dir() { read_tree(root, &path, out); } else { out.insert( path.strip_prefix(root).unwrap().to_path_buf(), std::fs::read_to_string(&path).unwrap(), ); } }}