use pnc_engine::{parse, value::Value};
#[test]
fn mod_ints() {
let mut stack = Vec::new();
parse::eval_line(&mut stack, "7 3 mod").unwrap();
assert_eq!(stack, vec![Value::Int(1.into())]);
}
#[test]
fn mod_preserves_same_unit() {
let mut stack = Vec::new();
parse::eval_line(&mut stack, "10 c 3 c mod").unwrap();
assert_eq!(
stack,
vec![Value::Unit {
number: Box::new(Value::Int(1.into())),
unit: pnc_engine::unit::UnitId::Celsius,
}]
);
}
#[test]
fn mod_mixed_units_is_unitless() {
let mut stack = Vec::new();
parse::eval_line(&mut stack, "10 c 3 f mod").unwrap();
assert_eq!(stack, vec![Value::Int(1.into())]);
}
#[test]
fn mod_rational_truncated_toward_zero() {
let mut stack = Vec::new();
parse::eval_line(&mut stack, "7/2 3/4 mod").unwrap();
assert_eq!(
stack,
vec![Value::Rational(num_rational::BigRational::new(
1.into(),
2.into()
))]
);
}
#[test]
fn to_rational_preserves_unit() {
let mut stack = Vec::new();
parse::eval_line(&mut stack, "100 c to_rational").unwrap();
assert_eq!(
stack,
vec![Value::Unit {
number: Box::new(Value::Rational(num_rational::BigRational::new(
100.into(),
1.into()
))),
unit: pnc_engine::unit::UnitId::Celsius,
}]
);
}
#[test]
fn to_int_drops_unit() {
let mut stack = Vec::new();
parse::eval_line(&mut stack, "100 c to_int").unwrap();
assert_eq!(
stack,
vec![Value::Unit {
number: Box::new(Value::Int(100.into())),
unit: pnc_engine::unit::UnitId::Celsius,
}]
);
}
#[test]
fn rational_digit_cap_counts_magnitude() {
pnc_engine::ops::set_rational_digit_cap(3);
let mut stack = Vec::new();
parse::eval_line(&mut stack, "0 -123/1 +").unwrap();
let mut stack = Vec::new();
assert!(parse::eval_line(&mut stack, "0 -1234/1 +").is_err());
pnc_engine::ops::set_rational_digit_cap(10_000);
}