rvs 0.5.0

A library for defining and evaluating random variables using a simple DSL
Documentation
use std::env::current_dir;
use std::collections::HashMap;

#[test]
fn readme() {
    let model = rvs::parse(
        &rvs::SearchPath::new(vec![current_dir().unwrap()]),
        "import examples::readme;",
    ).unwrap();

    let pattern = model.get_variable_by_name("pattern").unwrap();
    let mut pattern = pattern.borrow_mut();
    let expected: Vec<u32> = vec![2, 0, 1, 0, 2, 0, 1, 0];
    let actual: Vec<u32> = (0..expected.len()).map(|_| pattern.next()).collect();
    assert_eq!(expected, actual);

    let sample_with_replacement = model.get_variable_by_name("sample_with_replacement").unwrap();
    let mut sample_with_replacement = sample_with_replacement.borrow_mut();
    let mut results: HashMap<u32, u32> = HashMap::new();
    for _ in 0..90 {
        let entry = results.entry(sample_with_replacement.next()).or_insert(0);
        *entry += 1;
    }
    assert_eq!(results.len(), 3);
    for i in 0..3 {
        assert!(results[&i] >= 30 - 5 && results[&i] <= 30 + 5);
    }

    let weighted_sample_with_replacement = model.get_variable_by_name("weighted_sample_with_replacement").unwrap();
    let mut weighted_sample_with_replacement = weighted_sample_with_replacement.borrow_mut();
    let mut results: HashMap<u32, u32> = HashMap::new();
    for _ in 0..1000 {
        let entry = results.entry(weighted_sample_with_replacement.next()).or_insert(0);
        *entry += 1;
    }
    println!("weighted_sample_with_replacement: {:?}", results);
    assert_eq!(results.len(), 3);
    assert!(results[&0] >= 400 - 50 && results[&0] <= 400 + 50);
    assert!(results[&1] >= 500 - 50 && results[&1] <= 500 + 50);
    assert!(results[&2] >= 100 - 50 && results[&2] <= 100 + 50);
}