#![cfg(feature = "conch-parser")]
extern crate conch_runtime;
use conch_runtime::eval::{Fields, remove_largest_prefix};
#[macro_use]
mod support;
pub use self::support::*;
fn eval<W: Into<Option<MockWord>>>(param: &MockParam, word: W)
-> Result<Fields<String>, MockErr>
{
let mut env = ();
remove_largest_prefix(param, word.into(), &mut env)
.pin_env(env)
.wait()
}
#[test]
fn should_evaluate_appropriately() {
let must_not_run = mock_word_panic("should not run");
let mock_word = mock_word_fields(Fields::Single("abc*d".to_owned()));
let mock_word_wild = mock_word_fields(Fields::Single("*".to_owned()));
let mock_word_split = mock_word_fields(Fields::Split(vec!(
"abc".to_owned(),
"\u{1F4A9}".to_owned(),
)));
let param = MockParam::Fields(None);
assert_eq!(eval(¶m, must_not_run.clone()), Ok(Fields::Zero));
assert_eq!(eval(¶m, None), Ok(Fields::Zero));
let s = "abc \u{1F4A9}dabcde".to_owned();
let param = MockParam::Fields(Some(Fields::Single(s.clone())));
assert_eq!(eval(¶m, mock_word.clone()), Ok(Fields::Single("e".to_owned())));
assert_eq!(eval(¶m, mock_word_wild), Ok(Fields::Single(String::new())));
assert_eq!(eval(¶m, mock_word_split), Ok(Fields::Single("dabcde".to_owned())));
assert_eq!(eval(¶m, None), Ok(Fields::Single(s.clone())));
let fields = Fields::Single("".to_owned());
let param = MockParam::Fields(Some(fields.clone()));
assert_eq!(eval(¶m, mock_word.clone()), Ok(fields.clone()));
assert_eq!(eval(¶m, None), Ok(fields.clone()));
let param = MockParam::Split(false, Fields::Single("foo".to_owned()));
eval(¶m, None).unwrap();
}
#[test]
fn should_propagate_errors_from_word_if_applicable() {
let must_not_run = mock_word_panic("should not run");
let param = MockParam::Fields(None);
eval(¶m, must_not_run.clone()).unwrap();
eval(¶m, None).unwrap();
let param = MockParam::Fields(Some(Fields::Single("foo".to_owned())));
assert_eq!(eval(¶m, mock_word_error(false)), Err(MockErr::Fatal(false)));
eval(¶m, None).unwrap();
let param = MockParam::Fields(Some(Fields::Single("".to_owned())));
assert_eq!(eval(¶m, mock_word_error(true)), Err(MockErr::Fatal(true)));
eval(¶m, None).unwrap();
}
#[test]
fn should_propagate_cancel_if_required() {
let env = &mut ();
let must_not_run = Some(mock_word_panic("should not run"));
let must_cancel = Some(mock_word_must_cancel());
let param = MockParam::Fields(None);
test_cancel!(remove_largest_prefix(¶m, must_not_run.clone(), env));
test_cancel!(remove_largest_prefix::<_, MockWord, _>(¶m, None, env));
let param = MockParam::Fields(Some(Fields::Single("foo".to_owned())));
test_cancel!(remove_largest_prefix(¶m, must_cancel.clone(), env));
test_cancel!(remove_largest_prefix::<_, MockWord, _>(¶m, None, env));
let param = MockParam::Fields(Some(Fields::Single("".to_owned())));
test_cancel!(remove_largest_prefix(¶m, must_cancel.clone(), env));
test_cancel!(remove_largest_prefix::<_, MockWord, _>(¶m, None, env));
}