rvs 0.5.0

A library for defining and evaluating random variables using a simple DSL
Documentation
mod util;
use crate::util::*;

use std::collections::HashMap;

#[test]
fn distribution() {
    let a = expr_to_var("r{10: 0, 90: 1}").unwrap();
    let mut a = a.borrow_mut();

    let mut actual: HashMap<u32, u32> = HashMap::new();

    for _ in 0..1000 {
        let entry = actual.entry(a.next()).or_insert(0);
        *entry += 1;
    }

    println!("expected:{{0: 100, 1: 900}} actual:{:?}", actual);
    assert!(actual[&0] >= 100 - 20 && actual[&0] <= 100 + 20);
    assert!(actual[&1] >= 900 - 20 && actual[&1] <= 900 + 20);
}

#[test]
fn selects_another_subexpr_when_current_subexpr_done() {
    let a = expr_to_var("r{1: Pattern(0, 1), 1: Pattern(2, 3)}").unwrap();
    let mut a = a.borrow_mut();

    for _ in 0..100 {
        let value = a.next();

        match value {
            0 => assert_eq!(a.next(), 1),
            2 => assert_eq!(a.next(), 3),
            value => assert!(value == 0 || value == 2),
        }
    }
}

#[test]
fn done_when_sub_expr_done() {
    let a = expr_to_var("r{1: Pattern(0, 1), 1: Pattern(2, 3)}").unwrap();
    let mut a = a.borrow_mut();

    assert_eq!(a.done(), false);

    let expected: Vec<bool> = vec![false, true].into_iter().cycle().take(32).collect();
    let actual: Vec<bool> = (0..expected.len())
        .map(|_| {
            a.next();
            a.done()
        })
        .collect();

    assert_eq!(expected, actual);
}