traceforge 0.2.1

TraceForge is a model checker for concurrent and distributed programs written in Rust
Documentation
use traceforge::*;
use channel::{Builder, Channel};
use msg::Message;

fn unique_channel<T: Message + Clone + 'static>() -> Channel<T> {
    Builder::new().build()
}

#[test]
fn dropped() {
    let stats = traceforge::verify(
        Config::builder()
            .with_lossy(1)
            .with_cons_type(ConsType::FIFO)
            .build(),
        move || {
            let ch = unique_channel();
            ch.0.send_lossy_msg(1);
        },
    );
    assert_eq!(stats.execs, 2);
}

#[test]
fn lossy_channel() {
    let stats = traceforge::verify(
        Config::builder()
            .with_lossy(1)
            .with_cons_type(ConsType::FIFO)
            .build(),
        move || {
            let (sender, receiver) = unique_channel();
            sender.send_lossy_msg(1);
            sender.send_msg(2);
            let _ = thread::spawn(move || {
                assume!(receiver.recv_msg_block() == 2);
            });
        },
    );
    assert_eq!(stats.execs, 1);
}

#[test]
fn lossy_channel_rev_max() {
    for b in 1..3 {
        let stats = traceforge::verify(
            Config::builder()
                .with_lossy(b)
                .with_cons_type(ConsType::FIFO)
                .build(),
            move || {
                let (sender, receiver) = unique_channel();
                let _ = thread::spawn(move || {
                    let v = receiver.recv_msg();
                    assume!(v == Some(2));
                });
                let senderp = sender.clone();
                let _ = thread::spawn(move || {
                    sender.send_lossy_msg(1);
                });
                let _ = thread::spawn(move || {
                    senderp.send_msg(2);
                });
            },
        );
        assert_eq!(stats.execs, 2);
    }
}