sim 0.12.0

Sim is a discrete event simulation package that facilitates Rust- and npm-based simulation products and projects
Documentation
#[cfg(feature = "simx")]
use {
    sim::input_modeling::ContinuousRandomVariable,
    sim::models::{
        Batcher, Coupled, DevsModel, ExternalOutputCoupling, Generator, InternalCoupling, Model,
        Processor,
    },
    std::fs,
};

#[cfg(feature = "simx")]
fn strip_whitespace(string: String) -> String {
    string.chars().filter(|c| !c.is_whitespace()).collect()
}

#[test]
#[cfg(feature = "simx")]
fn batcher_event_rules() {
    let batcher = Batcher::new(String::from("job"), String::from("job"), 0.5, 10, false);

    let batcher_event_rules = fs::read_to_string("tests/data/batcher_event_rules.json")
        .expect("Unable to read tests/batcher_event_rules.json");

    assert_eq!(
        strip_whitespace(batcher.event_rules()),
        strip_whitespace(batcher_event_rules)
    );
}

#[test]
#[cfg(feature = "simx")]
fn generator_event_rules() {
    let generator = Generator::new(
        ContinuousRandomVariable::Exp { lambda: 0.5 },
        None,
        String::from("job"),
        false,
    );

    let generator_event_rules = fs::read_to_string("tests/data/generator_event_rules.json")
        .expect("Unable to read tests/generator_event_rules.json");

    assert_eq!(
        strip_whitespace(generator.event_rules()),
        strip_whitespace(generator_event_rules)
    );
}

#[test]
#[cfg(feature = "simx")]
fn coupled_event_rules() {
    let coupled = Model::new(
        String::from("coupled-01"),
        Box::new(Coupled::new(
            Vec::new(),
            vec![String::from("start"), String::from("stop")],
            vec![
                Model::new(
                    String::from("generator-01"),
                    Box::new(Generator::new(
                        ContinuousRandomVariable::Exp { lambda: 0.007 },
                        None,
                        String::from("job"),
                        false,
                    )),
                ),
                Model::new(
                    String::from("processor-01"),
                    Box::new(Processor::new(
                        ContinuousRandomVariable::Exp { lambda: 0.011 },
                        Some(14),
                        String::from("job"),
                        String::from("processed"),
                        false,
                    )),
                ),
            ],
            Vec::new(),
            vec![
                ExternalOutputCoupling {
                    source_id: String::from("generator-01"),
                    source_port: String::from("job"),
                    target_port: String::from("start"),
                },
                ExternalOutputCoupling {
                    source_id: String::from("processor-01"),
                    source_port: String::from("processed"),
                    target_port: String::from("stop"),
                },
            ],
            vec![InternalCoupling {
                source_id: String::from("generator-01"),
                target_id: String::from("processor-01"),
                source_port: String::from("job"),
                target_port: String::from("job"),
            }],
        )),
    );
    let coupled_event_rules = fs::read_to_string("tests/data/coupled_event_rules.json")
        .expect("Unable to read tests/coupled_event_rules.json");

    assert_eq!(
        strip_whitespace(coupled.event_rules()),
        strip_whitespace(coupled_event_rules)
    );
}