Added parsing for operators and modifiers

This commit is contained in:
Ådne E. Moldesæter 2020-06-22 22:13:06 +02:00
parent 964ce47501
commit 565e97905a
2 changed files with 26 additions and 4 deletions

View File

@ -5,9 +5,18 @@ mod lib_test;
fn parse_dice_segments<'a>(cmd: &'a str) -> Vec<regex::Captures<'a>> {
let regex = Regex::new(r#"(?x)
(?P<op>[+\-/*])?
\s*
(?:
(?:
(?P<count>\d+)? # count (optional)
d
(?P<size>\d+) # dice size
(?:d(?P<drop>\d+))?
) | (?:
(?P<mod>\d+)
)
)
"#).expect("Failed to compile regex");
regex.captures_iter(cmd).collect()

View File

@ -3,13 +3,26 @@ use super::*;
#[test]
fn test_roll_dice() {
let mut results = parse_dice_segments("2d6");
assert_eq!(results.len(), 1);
assert_eq!(results[0]["count"], *"2");
assert_eq!(results[0]["size"], *"6");
results = parse_dice_segments("2d6+1d20");
results = parse_dice_segments("2d6 + 1d20");
assert_eq!(results.len(), 2);
assert_eq!(results[1].name("op").map(|i| i.as_str()), Some("+"));
assert_eq!(results[1].name("count").map(|i| i.as_str()), Some("1"));
assert_eq!(results[1]["size"], *"20");
results = parse_dice_segments("4d6d1");
assert_eq!(results.len(), 1);
assert_eq!(results[0].name("drop").map(|i| i.as_str()), Some("1"));
results = parse_dice_segments("3d8+8");
assert_eq!(results.len(), 2);
assert_eq!(results[1].name("op").map(|i| i.as_str()), Some("+"));
assert_eq!(results[1].name("mod").map(|i| i.as_str()), Some("8"));
}