asynkit 0.1.0

Abstractions for runtime-independent crates
Documentation
pub mod runtime;
pub mod tcp;
pub mod time;

macro_rules! test {
    ($runtime:ty, $threads:literal, $module:ident :: $test:ident) => {
        #[test]
        fn $test() {
            <$runtime>::new($threads).block_on($crate::$module::$test::<$runtime>());
        }
    };
}

macro_rules! test_panic {
    ($runtime:ty, $threads:literal, $module:ident :: $test:ident) => {
        #[test]
        #[should_panic]
        fn $test() {
            <$runtime>::new($threads).block_on($crate::$module::$test::<$runtime>());
        }
    };
}

#[macro_export]
macro_rules! test_suite {
    ($name:ident, $runtime:ty) => {
        mod $name {
            mod runtime {
                use runtime::Runtime;

                test!(
                    $runtime,
                    1,
                    runtime::block_on_returns_completed_future_value
                );
                test!($runtime, 1, runtime::defer_spawn_returns_joined_task_result);
                test!(
                    $runtime,
                    1,
                    runtime::defer_join_returns_deferred_future_output
                );
                test!(
                    $runtime,
                    1,
                    runtime::defer_spawn_after_runtime_dropped_returns_disconnected
                );
                test_panic!(
                    $runtime,
                    2,
                    runtime::spawn_local_panics_on_multi_threaded_runtime
                );
                test!(
                    $runtime,
                    1,
                    runtime::spawn_local_returns_result_on_single_threaded_runtime
                );
            }

            mod tcp {
                use runtime::Runtime;

                test!($runtime, 1, tcp::listener_bind_succeeds_on_localhost);
                test!($runtime, 1, tcp::stream_connect_succeeds_to_bound_listener);
                test!($runtime, 1, tcp::stream_read_write_round_trip_succeeds);
            }

            mod time {
                use runtime::Runtime;

                test!(
                    $runtime,
                    1,
                    time::sleep_delays_for_at_least_requested_duration
                );
                test!(
                    $runtime,
                    1,
                    time::timeout_returns_ok_when_future_completes_in_time
                );
                test!(
                    $runtime,
                    1,
                    time::timeout_returns_timed_out_when_future_exceeds_limit
                );
                test!(
                    $runtime,
                    1,
                    time::timeout_with_zero_duration_returns_immediate_future
                );
            }
        }
    };
}

#[cfg(feature = "tokio")]
test_suite!(tokio, ::runtime::tokio::Tokio);