git.delta.rocks / jrsonnet / refs/commits / afca77d1e35b

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