diff --git a/src/options/dir_action.rs b/src/options/dir_action.rs index 24387ded4c7d08d04368dc22b97a410197866c68..19a370e025c8c145001a8d1f9a1bb4bd802b6433 100644 --- a/src/options/dir_action.rs +++ b/src/options/dir_action.rs @@ -12,6 +12,11 @@ impl DirAction { let list = matches.has(&flags::LIST_DIRS); let tree = matches.has(&flags::TREE); + // Early check for --level when it wouldn’t do anything + if !recurse && !tree && matches.get(&flags::LEVEL).is_some() { + return Err(Misfire::Useless2(&flags::LEVEL, &flags::RECURSE, &flags::TREE)); + } + match (recurse, list, tree) { // You can't --list-dirs along with --recurse or --tree because @@ -45,3 +50,56 @@ impl RecurseOptions { Ok(RecurseOptions { tree, max_depth }) } } + + +#[cfg(test)] +mod test { + use super::*; + use std::ffi::OsString; + use options::flags; + + pub fn os(input: &'static str) -> OsString { + let mut os = OsString::new(); + os.push(input); + os + } + + macro_rules! test { + ($name:ident: $type:ident <- $inputs:expr => $result:expr) => { + #[test] + fn $name() { + use options::parser::{parse, Args, Arg}; + use std::ffi::OsString; + + static TEST_ARGS: &[&Arg] = &[ &flags::RECURSE, &flags::LIST_DIRS, &flags::TREE, &flags::LEVEL ]; + + let bits = $inputs.as_ref().into_iter().map(|&o| os(o)).collect::>(); + let results = parse(&Args(TEST_ARGS), bits.iter()); + assert_eq!($type::deduce(results.as_ref().unwrap()), $result); + } + }; + } + + + // Default behaviour + test!(empty: DirAction <- [] => Ok(DirAction::List)); + + // Listing files as directories + test!(dirs_short: DirAction <- ["-d"] => Ok(DirAction::AsFile)); + test!(dirs_long: DirAction <- ["--list-dirs"] => Ok(DirAction::AsFile)); + + // Recursing + test!(rec_short: DirAction <- ["-R"] => Ok(DirAction::Recurse(RecurseOptions { tree: false, max_depth: None }))); + test!(rec_long: DirAction <- ["--recurse"] => Ok(DirAction::Recurse(RecurseOptions { tree: false, max_depth: None }))); + test!(rec_lim_short: DirAction <- ["-RL4"] => Ok(DirAction::Recurse(RecurseOptions { tree: false, max_depth: Some(4) }))); + test!(rec_lim_short_2: DirAction <- ["-RL=5"] => Ok(DirAction::Recurse(RecurseOptions { tree: false, max_depth: Some(5) }))); + test!(rec_lim_long: DirAction <- ["--recurse", "--level", "666"] => Ok(DirAction::Recurse(RecurseOptions { tree: false, max_depth: Some(666) }))); + test!(rec_lim_long_2: DirAction <- ["--recurse", "--level=0118"] => Ok(DirAction::Recurse(RecurseOptions { tree: false, max_depth: Some(118) }))); + test!(rec_tree: DirAction <- ["--recurse", "--tree"] => Ok(DirAction::Recurse(RecurseOptions { tree: true, max_depth: None }))); + test!(rec_short_tree: DirAction <- ["--tree", "--recurse"] => Ok(DirAction::Recurse(RecurseOptions { tree: true, max_depth: None }))); + + // Errors + test!(error: DirAction <- ["--list-dirs", "--recurse"] => Err(Misfire::Conflict(&flags::RECURSE, &flags::LIST_DIRS))); + test!(error_2: DirAction <- ["--list-dirs", "--tree"] => Err(Misfire::Conflict(&flags::TREE, &flags::LIST_DIRS))); + test!(underwaterlevel: DirAction <- ["--level=4"] => Err(Misfire::Useless2(&flags::LEVEL, &flags::RECURSE, &flags::TREE))); +} diff --git a/src/options/flags.rs b/src/options/flags.rs index 6e4790f6952e297c2fa0f8c182c5074375e54e85..8f24dab79403a096813508b697c22800ab2b3684 100644 --- a/src/options/flags.rs +++ b/src/options/flags.rs @@ -23,7 +23,7 @@ pub static COLOUR_SCALE: Arg = Arg { short: None, long: "colour-scale", takes_va // filtering and sorting options pub static ALL: Arg = Arg { short: Some(b'a'), long: "all", takes_value: TakesValue::Forbidden }; pub static LIST_DIRS: Arg = Arg { short: Some(b'd'), long: "list-dirs", takes_value: TakesValue::Forbidden }; -pub static LEVEL: Arg = Arg { short: Some(b'L'), long: "level", takes_value: TakesValue::Forbidden }; +pub static LEVEL: Arg = Arg { short: Some(b'L'), long: "level", takes_value: TakesValue::Necessary }; pub static REVERSE: Arg = Arg { short: Some(b'r'), long: "reverse", takes_value: TakesValue::Forbidden }; pub static SORT: Arg = Arg { short: Some(b's'), long: "sort", takes_value: TakesValue::Necessary }; pub static IGNORE_GLOB: Arg = Arg { short: Some(b'I'), long: "ignore-glob", takes_value: TakesValue::Necessary }; diff --git a/src/options/mod.rs b/src/options/mod.rs index 1e4d2fb347b35f32071cc47e66b2d2ad5a447544..6e831b0852027262ab1bedb2f75236108db13f46 100644 --- a/src/options/mod.rs +++ b/src/options/mod.rs @@ -325,11 +325,4 @@ mod test { assert_eq!(opts.unwrap_err(), Misfire::Useless(&flags::EXTENDED, false, &flags::LONG)) } } - - #[test] - fn level_without_recurse_or_tree() { - let args = [ os("--level"), os("69105") ]; - let opts = Options::getopts(&args); - assert_eq!(opts.unwrap_err(), Misfire::Useless2(&flags::LEVEL, &flags::RECURSE, &flags::TREE)) - } }