conch-runtime 0.1.2

A library for evaluating/executing programs written in the shell programming language.
Documentation
extern crate conch_runtime as runtime;

use runtime::future::{Async, EnvFuture, Poll};

#[derive(Debug, Copy, Clone)]
struct MockFuture(Option<Result<(), ()>>);

impl MockFuture {
    fn ok() -> Self {
        MockFuture(Some(Ok(())))
    }

    fn err() -> Self {
        MockFuture(Some(Err(())))
    }
}

impl EnvFuture<()> for MockFuture {
    type Item = ();
    type Error = ();

    fn poll(&mut self, _env: &mut ()) -> Poll<Self::Item, Self::Error> {
        self.0.take().expect("cannot be polled after completion").map(Async::Ready)
    }

    fn cancel(&mut self, _env: &mut ()) {
        let _ = self.0.take().expect("cannot cancel after completion");
    }
}

#[test]
fn poll_after_success() {
    let env = &mut ();
    let mut future = MockFuture::ok().fuse();

    assert_eq!(future.poll(env), Ok(Async::Ready(())));
    assert_eq!(future.poll(env), Ok(Async::NotReady));
}

#[test]
fn poll_after_error() {
    let env = &mut ();
    let mut future = MockFuture::err().fuse();

    assert_eq!(future.poll(env), Err(()));
    assert_eq!(future.poll(env), Ok(Async::NotReady));
}

#[test]
fn poll_after_cancel() {
    let env = &mut ();
    let mut future = MockFuture::ok().fuse();

    future.cancel(env);
    assert_eq!(future.poll(env), Ok(Async::NotReady));
}

#[test]
fn cancel_after_success() {
    let env = &mut ();
    let mut future = MockFuture::ok().fuse();

    assert_eq!(future.poll(env), Ok(Async::Ready(())));
    future.cancel(env);
}

#[test]
fn cancel_after_error() {
    let env = &mut ();
    let mut future = MockFuture::err().fuse();

    assert_eq!(future.poll(env), Err(()));
    future.cancel(env);
}

#[test]
fn cancel_after_cancel() {
    let env = &mut ();
    let mut future = MockFuture::ok().fuse();

    future.cancel(env);
    future.cancel(env);
}