1use jrsonnet_evaluator::{2 error::Result,3 function::{builtin, FuncVal},4 throw, ObjValueBuilder, State, Thunk, Val,5};67#[macro_export]8macro_rules! ensure_eq {9 ($a:expr, $b:expr $(,)?) => {{10 let a = &$a;11 let b = &$b;12 if a != b {13 ::jrsonnet_evaluator::throw!("assertion failed: a != b\na={:#?}\nb={:#?}", a, b)14 }15 }};16}1718#[macro_export]19macro_rules! ensure {20 ($v:expr $(,)?) => {21 if !$v {22 ::jrsonnet_evaluator::throw!("assertion failed: {}", stringify!($v))23 }24 };25}2627#[macro_export]28macro_rules! ensure_val_eq {29 ($a:expr, $b:expr) => {{30 if !::jrsonnet_evaluator::val::equals(&$a.clone(), &$b.clone())? {31 use ::jrsonnet_evaluator::manifest::JsonFormat;32 ::jrsonnet_evaluator::throw!(33 "assertion failed: a != b\na={:#?}\nb={:#?}",34 $a.manifest(JsonFormat::default())?,35 $b.manifest(JsonFormat::default())?,36 )37 }38 }};39}4041#[builtin]42fn assert_throw(lazy: Thunk<Val>, message: String) -> Result<bool> {43 match lazy.evaluate() {44 Ok(_) => {45 throw!("expected argument to throw on evaluation, but it returned instead")46 }47 Err(e) => {48 let error = format!("{}", e.error());49 ensure_eq!(message, error);50 }51 }52 Ok(true)53}5455#[builtin]56fn param_names(fun: FuncVal) -> Vec<String> {57 match fun {58 FuncVal::Id => vec!["x".to_string()],59 FuncVal::Normal(func) => func60 .params61 .iter()62 .map(|p| p.0.name().unwrap_or_else(|| "<unnamed>".into()).to_string())63 .collect(),64 FuncVal::StaticBuiltin(b) => b65 .params()66 .iter()67 .map(|p| p.name().as_str().unwrap_or(&"<unnamed>").to_string())68 .collect(),69 FuncVal::Builtin(b) => b70 .params()71 .iter()72 .map(|p| p.name().as_str().unwrap_or(&"<unnamed>").to_string())73 .collect(),74 }75}7677#[allow(dead_code)]78pub fn with_test(s: &State) {79 let mut bobj = ObjValueBuilder::new();80 bobj.member("assertThrow".into())81 .hide()82 .value_unchecked(Val::Func(FuncVal::StaticBuiltin(assert_throw::INST)));83 bobj.member("paramNames".into())84 .hide()85 .value_unchecked(Val::Func(FuncVal::StaticBuiltin(param_names::INST)));8687 s.add_global("test".into(), Thunk::evaluated(Val::Obj(bobj.build())))88}