use std::sync::Arc;
use kip::{eval, parse, EmptyResolver, RegistryBuilder};
fn reg() -> Arc<kip::Registry> {
RegistryBuilder::from_seed().freeze()
}
fn eval_unit(expr: &str) -> String {
let reg = reg();
let ast = parse(expr, ®).unwrap();
let val = eval(ast.as_ref(), ®, &EmptyResolver).unwrap();
let qty = val.quantity().unwrap();
format!("{}", qty.unit)
}
#[test]
fn mul_pow_collects_like_unit() {
assert_eq!(eval_unit("(1 in) * (1 in)^3"), "in^4");
}
#[test]
fn stress_formula_unit() {
let reg = reg();
let ast = parse("(100 kip*in * 6 in) / (200 in^4)", ®).unwrap();
let val = eval(ast.as_ref(), ®, &EmptyResolver).unwrap();
let qty = val.quantity().unwrap();
assert_eq!(format!("{}", qty.unit), "kip/in^2");
}
#[test]
fn complete_cancel_is_dimensionless() {
assert_eq!(eval_unit("(3 kip) / (3 kip)"), "1");
}
#[test]
fn partial_cancel_in_denominator() {
assert_eq!(eval_unit("(1 in^4) / (1 in^3)"), "in");
}
#[test]
fn product_with_inverse() {
assert_eq!(eval_unit("(1 lbf) / (1 in^2)"), "lbf/in^2");
}
#[test]
fn sqrt_half_exponent() {
let reg = reg();
let ast = parse("sqrt(1 in^2)", ®).unwrap();
let val = eval(ast.as_ref(), ®, &EmptyResolver).unwrap();
let qty = val.quantity().unwrap();
assert_eq!(format!("{}", qty.unit), "in");
}
#[test]
fn dimensionless_stays_dimensionless() {
assert_eq!(eval_unit("2 * 3"), "1");
}