1use std::{2 fs, io,3 path::{Path, PathBuf},4};56use jrsonnet_evaluator::{7 manifest::JsonFormat,8 trace::{CompactFormat, PathResolver, TraceFormat},9 FileImportResolver, State,10};11use jrsonnet_stdlib::ContextInitializer;12mod common;13use common::ContextInitializer as TestContextInitializer;1415fn run(file: &Path) -> String {16 let mut s = State::builder();17 s.context_initializer((18 ContextInitializer::new(PathResolver::new_cwd_fallback()),19 TestContextInitializer,20 ))21 .import_resolver(FileImportResolver::default());22 let s = s.build();2324 let _entered = s.enter();2526 let trace_format = CompactFormat {27 resolver: PathResolver::FileName,28 max_trace: 20,29 padding: 4,30 };3132 let v = match s.import(file) {33 Ok(v) => v,34 Err(e) => return trace_format.format(&e).unwrap(),35 };36 match v.manifest(JsonFormat::default()) {37 Ok(v) => v,38 Err(e) => trace_format.format(&e).unwrap(),39 }40}4142#[test]43fn test() -> io::Result<()> {44 use json_structural_diff::JsonDiff;4546 let mut root = PathBuf::from(env!("CARGO_MANIFEST_DIR"));47 root.push("golden");4849 for entry in fs::read_dir(&root)? {50 let entry = entry?;51 if !entry.path().extension().map_or(false, |e| e == "jsonnet") {52 continue;53 }5455 let result = run(&entry.path());5657 let mut golden_path = entry.path();58 golden_path.set_extension("jsonnet.golden");5960 if !golden_path.exists() {61 fs::write(golden_path, &result)?;62 continue;63 }6465 let golden = fs::read_to_string(golden_path)?;6667 match (serde_json::from_str(&result), serde_json::from_str(&golden)) {68 (Err(_), Ok(_)) => assert_eq!(69 result,70 golden,71 "unexpected error for golden {}",72 entry.path().display()73 ),74 (Ok(_), Err(_)) => assert_eq!(75 result,76 golden,77 "expected error for golden {}",78 entry.path().display()79 ),80 (Ok(result), Ok(golden)) => {81 82 let diff = JsonDiff::diff_string(&golden, &result, false);83 if let Some(diff) = diff {84 panic!(85 "Result \n{result:#}\n\86 and golden \n{golden:#}\n\87 did not match structurally:\n{diff:#}\n\88 for golden {}",89 entry.path().display()90 );91 }92 }93 (Err(_), Err(_)) => {}94 };9596 assert_eq!(97 result,98 golden,99 "golden didn't match for {}",100 entry.path().display()101 );102 }103104 Ok(())105}