pnc-engine 0.2.0

Core engine for PNC: arbitrary-precision RPN evaluation, units, and persistence
Documentation
use pnc_engine::{parse, value::Value};

#[test]
fn parse_integer() {
    let mut stack = Vec::new();
    parse::eval_line(&mut stack, "42").unwrap();
    assert_eq!(stack, vec![Value::Int(42.into())]);
}

#[test]
fn parse_rational() {
    let mut stack = Vec::new();
    parse::eval_line(&mut stack, "3 4 /").unwrap(); // 3/4? actually 3 4 / -> 3/4
    assert_eq!(
        stack,
        vec![Value::Rational(num_rational::BigRational::new(
            3.into(),
            4.into()
        ))]
    );
}

#[test]
fn parse_unknown_token_errors() {
    let mut stack = Vec::new();
    let err = parse::eval_line(&mut stack, "&").unwrap_err();
    assert!(matches!(err, pnc_engine::PncError::Parse(_)));
}

#[test]
fn parse_unknown_command_errors() {
    let mut stack = Vec::new();
    let err = parse::eval_line(&mut stack, "foo").unwrap_err();
    assert!(matches!(err, pnc_engine::PncError::UnknownCommand(_)));
}

#[test]
fn parse_division_by_zero_errors() {
    let mut stack = Vec::new();
    let err = parse::eval_line(&mut stack, "1 0 /").unwrap_err();
    assert!(matches!(err, pnc_engine::PncError::DivisionByZero));
}

#[test]
fn is_number_token_recognizes_numbers() {
    assert!(pnc_engine::parse::is_number_token("42"));
    assert!(pnc_engine::parse::is_number_token("-3"));
    assert!(pnc_engine::parse::is_number_token("1/2"));
}

#[test]
fn is_number_token_rejects_non_numbers() {
    assert!(!pnc_engine::parse::is_number_token("foo"));
    assert!(!pnc_engine::parse::is_number_token("+"));
    assert!(!pnc_engine::parse::is_number_token(""));
}