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]44#[allow(dead_code)]45fn assert_throw(lazy: Thunk<Val>, message: String) -> Result<bool> {46 match lazy.evaluate() {47 Ok(_) => {48 bail!("expected argument to throw on evaluation, but it returned instead")49 }50 Err(e) => {51 let error = format!("{}", e.error());52 ensure_eq!(message, error);53 }54 }55 Ok(true)56}5758#[builtin]59#[allow(dead_code)]60fn param_names(fun: FuncVal) -> Vec<String> {61 fun.params()62 .iter()63 .map(|v| v.name().as_str().unwrap_or("<unnamed>").to_owned())64 .collect()65}6667#[derive(Trace)]68#[allow(dead_code)]69pub struct ContextInitializer;70impl ContextInitializerT for ContextInitializer {71 fn populate(&self, _for_file: Source, builder: &mut ContextBuilder) {72 let mut bobj = ObjValueBuilder::new();73 bobj.method("assertThrow", assert_throw {});74 bobj.method("paramNames", param_names {});7576 builder.bind("test", Thunk::evaluated(Val::Obj(bobj.build())));77 }7879 fn as_any(&self) -> &dyn std::any::Any {80 self81 }82}