pnc-engine 0.2.1

Core engine for PNC: arbitrary-precision RPN evaluation, units, and persistence
Documentation
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);
}