git.delta.rocks / jrsonnet / refs/commits / 298a27826605

difftreelog

source

tests/tests/golden.rs2.2 KiBsourcehistory
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				// Show diff relative to golden`.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}