rdice-core 0.1.1

Reusable dice, tray, expression parsing, rolling, and analysis primitives
Documentation
use rdice_core::error::DiceError;
use rdice_core::expr::{parse_dice_only_exprs, parse_roll_exprs};

#[test]
fn parse_roll_exprs_expands_repeated_dice() {
    let parsed = parse_roll_exprs(&["5d6"]).unwrap();
    assert_eq!(parsed.dice, vec!["d6", "d6", "d6", "d6", "d6"]);
    assert!(parsed.modifiers.is_empty());
}

#[test]
fn parse_roll_exprs_supports_mixed_dice_and_modifiers() {
    let parsed = parse_roll_exprs(&["3d6", "2d20", "d100", "2custom", "5", "-3"]).unwrap();
    assert_eq!(
        parsed.dice,
        vec!["d6", "d6", "d6", "d20", "d20", "d100", "custom", "custom"]
    );
    assert_eq!(parsed.modifiers, vec![5, -3]);
}

#[test]
fn parse_dice_only_rejects_modifiers_and_bare_numbers() {
    let err = parse_dice_only_exprs(&["2d6", "+5"]).unwrap_err();
    assert!(matches!(err, DiceError::InvalidExpression(_)));

    let err = parse_dice_only_exprs(&["5"]).unwrap_err();
    assert!(matches!(err, DiceError::InvalidExpression(_)));
}