use crate::interpreter::val_eq;
use crate::prelude::*;
use crate::tremor_fn;
use crate::{registry::Registry, TRUE};
pub fn load(registry: &mut Registry) {
registry.insert(tremor_fn! (test|assert(ctx, desc, expected, got) {
if val_eq(expected, got) {
Ok(TRUE)
} else if ctx.panic_on_assert {
Err(to_runtime_error(format!(r#"
Assertion for {desc} failed:
expected: {}
got: {}
"#, expected.encode(), got.encode())))
} else {
Ok(Value::from(vec![(*expected).clone(), (*got).clone()]))
}
}));
}
#[cfg(test)]
mod tests {
#![allow(clippy::unwrap_used)]
use super::*;
use crate::registry::FResult;
#[test]
fn test() -> FResult<()> {
let mut reg = Registry::default();
load(&mut reg);
let fun = reg.find("test", "assert")?;
let mut ctx = EventContext::new(0, None);
let one = Value::from(1_u64);
let two = Value::from(2_i64);
assert_eq!(
fun.invoke(&ctx, &[&Value::from("DESC"), &one, &one]),
Ok(Value::from(true))
);
assert_eq!(
fun.invoke(&ctx, &[&Value::from("DESC"), &one, &two]),
Ok(Value::from(vec![one.clone(), two.clone()]))
);
ctx.panic_on_assert = true;
assert!(fun
.invoke(&ctx, &[&Value::from("DESC"), &one, &two])
.is_err());
Ok(())
}
}