extern crate conch_runtime; use conch_runtime::error::IsFatalError; use conch_runtime::spawn::substitution; use std::io::Error as IoError; mod support; pub use self::support::*; fn run_substitution(cmds: I) -> Result where I: IntoIterator, S: Spawn, S::Error: IsFatalError + From, { let (mut lp, env) = new_env_with_threads(2); let future = substitution(cmds) .pin_env(env) .flatten(); lp.run(future) } #[test] fn should_resolve_to_cmd_output() { let cmds = vec!( MockOutCmd::Out("hello "), MockOutCmd::Out("world!"), ); assert_eq!(run_substitution(cmds), Ok("hello world!".to_owned())); } #[test] fn should_resolve_successfully_for_no_commands() { let cmds = Vec::::new(); assert_eq!(run_substitution(cmds), Ok(String::new())); } #[test] fn should_swallow_errors_and_return_partial_output() { let msg = "hello"; let cmds = vec!( MockOutCmd::Out(msg), MockOutCmd::Cmd(mock_error(false)), ); assert_eq!(run_substitution(cmds), Ok(msg.to_owned())); let cmds = vec!( MockOutCmd::Out(msg), MockOutCmd::Cmd(mock_error(true)), MockOutCmd::Out("world!"), ); assert_eq!(run_substitution(cmds), Ok(msg.to_owned())); } #[test] fn should_trim_trailing_newlines() { let cmds = vec!( MockOutCmd::Out("hello\n\n"), MockOutCmd::Out("world\n\n"), ); assert_eq!(run_substitution(cmds), Ok("hello\n\nworld".to_owned())); let cmds = vec!( MockOutCmd::Out("hello\r\n"), MockOutCmd::Out("world\r\n\r\n"), ); assert_eq!(run_substitution(cmds), Ok("hello\r\nworld".to_owned())); let cmds = vec!( MockOutCmd::Out("hello\r\n"), MockOutCmd::Out("world\r\r\r\n"), ); assert_eq!(run_substitution(cmds), Ok("hello\r\nworld\r\r".to_owned())); }