execution-context 0.1.0

An experimental .NET inspired execution context
Documentation
#[macro_use]
extern crate execution_context;

use execution_context::ExecutionContext;
use std::thread;

#[test]
fn test_basic_propagation() {
    flow_local!(static TEST: u32 = 42);
    assert_eq!(*TEST.get(), 42);

    let ec = ExecutionContext::capture();
    TEST.set(23);
    assert_eq!(*TEST.get(), 23);
    ec.run(|| {
        assert_eq!(*TEST.get(), 42);
    });
}

#[test]
fn test_basic_propagation_to_threads() {
    flow_local!(static TEST: u32 = 42);
    assert_eq!(*TEST.get(), 42);

    let ec = ExecutionContext::capture();
    TEST.set(23);
    assert_eq!(*TEST.get(), 23);
    thread::spawn(move || {
        ec.run(|| {
            assert_eq!(*TEST.get(), 42);
            TEST.set(22);
        });
    }).join().unwrap();

    assert_eq!(*TEST.get(), 23);
}

#[test]
fn test_flow_suppression() {
    flow_local!(static TEST: u32 = 42);

    {
        let _guard = ExecutionContext::suppress_flow();
        TEST.set(11111);

        assert!(ExecutionContext::is_flow_suppressed());

        let ec = ExecutionContext::capture();
        ec.run(|| {
            assert!(!ExecutionContext::is_flow_suppressed());
            assert_eq!(*TEST.get(), 42);
        });
    }

    assert!(!ExecutionContext::is_flow_suppressed());
}

#[test]
fn test_flow_disabling() {
    flow_local!(static TEST: u32 = 42);

    {
        let _guard = ExecutionContext::disable_flow();
        TEST.set(11111);

        assert!(ExecutionContext::is_flow_suppressed());

        let ec = ExecutionContext::capture();
        ec.run(|| {
            assert!(ExecutionContext::is_flow_suppressed());
            assert_eq!(*TEST.get(), 42);
        });
    }

    assert!(!ExecutionContext::is_flow_suppressed());
}