conch-runtime 0.1.2

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

use void::Void;

use conch_runtime::error::IsFatalError;
use conch_runtime::spawn::subshell;
use futures::Future;

mod support;
pub use self::support::*;

fn run_subshell<I>(cmds: I) -> Result<ExitStatus, <I::Item as Spawn<DefaultEnvRc>>::Error>
    where I: IntoIterator,
          I::Item: Spawn<DefaultEnvRc>,
          <I::Item as Spawn<DefaultEnvRc>>::Error: IsFatalError + From<Void>
{
    let (mut lp, env) = new_env();
    let future = subshell(cmds, &env).flatten();
    lp.run(future)
}

#[test]
fn should_resolve_to_last_status() {
    let exit = ExitStatus::Code(42);
    let cmds = vec!(
        mock_status(EXIT_SUCCESS),
        mock_status(exit),
    );

    assert_eq!(run_subshell(cmds), Ok(exit));
}

#[test]
fn should_resolve_successfully_for_no_commands() {
    let cmds = Vec::<MockCmd>::new();
    assert_eq!(run_subshell(cmds), Ok(EXIT_SUCCESS));
}

#[test]
fn should_swallow_errors() {
    let cmds = vec!(
        mock_error(false),
        mock_status(EXIT_SUCCESS),
    );

    assert_eq!(run_subshell(cmds), Ok(EXIT_SUCCESS));

    let cmds = vec!(
        mock_error(true),
        mock_status(EXIT_SUCCESS),
    );

    assert_eq!(run_subshell(cmds), Ok(EXIT_ERROR));
}

#[test]
fn should_terminate_on_fatal_errors_but_swallow_them() {
    let cmds = vec!(
        mock_error(true),
        mock_panic("should not run"),
    );

    assert_eq!(run_subshell(cmds), Ok(EXIT_ERROR));
}

#[test]
fn should_isolate_parent_env_from_any_changes() {
    let (mut lp, mut env) = new_env();

    let original_status = ExitStatus::Code(5);
    env.set_last_status(original_status);

    let cmds = vec!(
        mock_status(ExitStatus::Code(42)),
    );

    let future = subshell(cmds, &env).flatten();
    lp.run(future).expect("subshell failed");

    assert_eq!(env.last_status(), original_status);
}