1use jrsonnet_evaluator::{2 ContextBuilder, ContextInitializer as ContextInitializerT, ObjValueBuilder, Result, Thunk, Val,3 bail,4 function::{FuncVal, builtin},5 parser::Source,6};7use jrsonnet_gcmodule::Trace;89#[macro_export]10macro_rules! ensure_eq {11 ($a:expr, $b:expr $(,)?) => {{12 let a = &$a;13 let b = &$b;14 if a != b {15 ::jrsonnet_evaluator::bail!("assertion failed: a != b\na={a:#?}\nb={b:#?}")16 }17 }};18}1920#[macro_export]21macro_rules! ensure {22 ($v:expr $(,)?) => {23 if !$v {24 ::jrsonnet_evaluator::bail!("assertion failed: {}", stringify!($v))25 }26 };27}2829#[macro_export]30macro_rules! ensure_val_eq {31 ($a:expr, $b:expr) => {{32 if !::jrsonnet_evaluator::val::equals(&$a.clone(), &$b.clone())? {33 use ::jrsonnet_evaluator::manifest::JsonFormat;34 ::jrsonnet_evaluator::bail!(35 "assertion failed: a != b\na={:#?}\nb={:#?}",36 $a.manifest(JsonFormat::default())?,37 $b.manifest(JsonFormat::default())?,38 )39 }40 }};41}4243#[builtin]44fn assert_throw(lazy: Thunk<Val>, message: String) -> Result<bool> {45 match lazy.evaluate() {46 Ok(_) => {47 bail!("expected argument to throw on evaluation, but it returned instead")48 }49 Err(e) => {50 let error = format!("{}", e.error());51 ensure_eq!(message, error);52 }53 }54 Ok(true)55}5657#[builtin]58fn param_names(fun: FuncVal) -> Vec<String> {59 fun.params()60 .iter()61 .map(|v| v.name().as_str().unwrap_or("<unnamed>").to_owned())62 .collect()63}6465#[derive(Trace)]66#[allow(dead_code)]67pub struct ContextInitializer;68impl ContextInitializerT for ContextInitializer {69 fn populate(&self, _for_file: Source, builder: &mut ContextBuilder) {70 let mut bobj = ObjValueBuilder::new();71 bobj.method("assertThrow", assert_throw::INST);72 bobj.method("paramNames", param_names::INST);7374 builder.bind("test", Thunk::evaluated(Val::Obj(bobj.build())));75 }7677 fn as_any(&self) -> &dyn std::any::Any {78 self79 }80}