extern crate conch_runtime; use conch_runtime::spawn::{GuardBodyPair, if_cmd}; #[macro_use] mod support; pub use self::support::*; macro_rules! run_env { ($future:expr) => {{ let (mut lp, env) = new_env(); lp.run($future.pin_env(env).flatten()) }} } #[test] fn should_run_body_of_successful_guard() { let should_not_run = mock_panic("must not run"); let exit = ExitStatus::Code(42); let cmd = if_cmd( vec!( GuardBodyPair { guard: vec!(mock_status(EXIT_ERROR)), body: vec!(should_not_run.clone()), }, GuardBodyPair { guard: vec!(mock_error(false)), body: vec!(should_not_run.clone()), }, GuardBodyPair { guard: vec!(mock_status(EXIT_SUCCESS)), body: vec!(mock_status(exit)), }, ), Some(vec!(should_not_run.clone())), ); assert_eq!(run_env!(cmd), Ok(exit)); } #[test] fn should_run_else_branch_if_present_and_no_successful_guards() { let should_not_run = mock_panic("must not run"); let exit = ExitStatus::Code(42); let cmd = if_cmd( vec!( GuardBodyPair { guard: vec!(mock_status(EXIT_ERROR)), body: vec!(should_not_run.clone()), }, ), Some(vec!(mock_status(exit))), ); assert_eq!(run_env!(cmd), Ok(exit)); let cmd = if_cmd( vec!( GuardBodyPair { guard: vec!(mock_status(EXIT_ERROR)), body: vec!(should_not_run.clone()), }, ), None, ); assert_eq!(run_env!(cmd), Ok(EXIT_SUCCESS)); let cmd = if_cmd(vec!(), Some(vec!(mock_status(exit)))); assert_eq!(run_env!(cmd), Ok(exit)); let cmd = if_cmd(Vec::>>::new(), None); assert_eq!(run_env!(cmd), Ok(EXIT_SUCCESS)); } #[test] fn should_propagate_fatal_errors() { let should_not_run = mock_panic("must not run"); let cmd = if_cmd( vec!( GuardBodyPair { guard: vec!(mock_error(true), should_not_run.clone()), body: vec!(should_not_run.clone()), }, ), Some(vec!(should_not_run.clone())), ); assert_eq!(run_env!(cmd), Err(MockErr::Fatal(true))); let cmd = if_cmd(vec!(), Some(vec!(mock_error(true)))); assert_eq!(run_env!(cmd), Err(MockErr::Fatal(true))); } #[test] fn should_propagate_cancel() { let (_lp, mut env) = new_env(); let should_not_run = mock_panic("must not run"); let cmd = if_cmd( vec!( GuardBodyPair { guard: vec!(mock_must_cancel()), body: vec!(should_not_run.clone()), }, GuardBodyPair { guard: vec!(should_not_run.clone()), body: vec!(should_not_run.clone()), }, ), Some(vec!(should_not_run.clone())), ); test_cancel!(cmd, env); let cmd = if_cmd( vec!( GuardBodyPair { guard: vec!(mock_status(EXIT_SUCCESS)), body: vec!(mock_must_cancel()), }, GuardBodyPair { guard: vec!(should_not_run.clone()), body: vec!(should_not_run.clone()), }, ), Some(vec!(should_not_run.clone())), ); test_cancel!(cmd, env); let cmd = if_cmd( vec!(), Some(vec!(mock_must_cancel())), ); test_cancel!(cmd, env); }