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 trace_format = CompactFormat {25 resolver: PathResolver::FileName,26 max_trace: 20,27 padding: 4,28 };2930 let v = match s.import(file) {31 Ok(v) => v,32 Err(e) => return trace_format.format(&e).unwrap(),33 };34 match v.manifest(JsonFormat::default()) {35 Ok(v) => v.to_string(),36 Err(e) => trace_format.format(&e).unwrap(),37 }38}3940#[test]41fn test() -> io::Result<()> {42 use json_structural_diff::JsonDiff;4344 let mut root = PathBuf::from(env!("CARGO_MANIFEST_DIR"));45 root.push("golden");4647 for entry in fs::read_dir(&root)? {48 let entry = entry?;49 if !entry.path().extension().map_or(false, |e| e == "jsonnet") {50 continue;51 }5253 let result = run(&entry.path());5455 let mut golden_path = entry.path();56 golden_path.set_extension("jsonnet.golden");5758 if !golden_path.exists() {59 fs::write(golden_path, &result)?;60 } else {61 let golden = fs::read_to_string(golden_path)?;6263 match (serde_json::from_str(&result), serde_json::from_str(&golden)) {64 (Err(_), Ok(_)) => assert_eq!(65 result,66 golden,67 "unexpected error for golden {}",68 entry.path().display()69 ),70 (Ok(_), Err(_)) => assert_eq!(71 result,72 golden,73 "expected error for golden {}",74 entry.path().display()75 ),76 (Ok(result), Ok(golden)) => {77 78 let diff = JsonDiff::diff_string(&golden, &result, false);79 if let Some(diff) = diff {80 panic!(81 "Result \n{result:#}\n\82 and golden \n{golden:#}\n\83 did not match structurally:\n{diff:#}\n\84 for golden {}",85 entry.path().display()86 );87 }88 }89 (Err(_), Err(_)) => {}90 };9192 assert_eq!(93 result,94 golden,95 "golden didn't match for {}",96 entry.path().display()97 )98 }99 }100101 Ok(())102}