diff --git a/src/builtins/test.rs b/src/builtins/test.rs index e8d4b63b9d49e26b8dcef1101f6c98e770f453e7..7346a6ced28e771934a66d194a8db6cce25e8c83 100644 --- a/src/builtins/test.rs +++ b/src/builtins/test.rs @@ -126,7 +126,7 @@ fn evaluate_arguments<W: io::Write>(arguments: &[&str], buffer: &mut W) -> Resul buffer.flush().map_err(|x| x.description().to_owned())?; Ok(true) } - Some(&s) if s.starts_with("-") => { + Some(&s) if s.starts_with("-") && s[1..].starts_with(char::is_alphabetic) => { // Access the second character in the flag string: this will be type of the flag. // If no flag was given, return `SUCCESS` s.chars().nth(1).map_or(Ok(true), |flag| { @@ -209,10 +209,10 @@ fn get_modified_file_time(filename: &str) -> Option<SystemTime> { } /// Attempt to parse a &str as a usize. -fn parse_integers(left: &str, right: &str) -> Result<(Option<usize>, Option<usize>), String> { - let parse_integer = |input: &str| -> Result<Option<usize>, String> { +fn parse_integers(left: &str, right: &str) -> Result<(Option<isize>, Option<isize>), String> { + let parse_integer = |input: &str| -> Result<Option<isize>, String> { match input - .parse::<usize>() + .parse::<isize>() .map_err(|_| format!("test: integer expression expected: {:?}", input)) { Err(why) => Err(String::from(why)), @@ -369,28 +369,42 @@ fn test_integers_arguments() { // Equal To assert_eq!(evaluate_arguments(&["10", "-eq", "10"], &mut buffer), Ok(true)); assert_eq!(evaluate_arguments(&["10", "-eq", "5"], &mut buffer), Ok(false)); + assert_eq!(evaluate_arguments(&["-10", "-eq", "-10"], &mut buffer), Ok(true)); + assert_eq!(evaluate_arguments(&["-10", "-eq", "10"], &mut buffer), Ok(false)); // Greater Than or Equal To assert_eq!(evaluate_arguments(&["10", "-ge", "10"], &mut buffer), Ok(true)); assert_eq!(evaluate_arguments(&["10", "-ge", "5"], &mut buffer), Ok(true)); assert_eq!(evaluate_arguments(&["5", "-ge", "10"], &mut buffer), Ok(false)); + assert_eq!(evaluate_arguments(&["-9", "-ge", "-10"], &mut buffer), Ok(true)); + assert_eq!(evaluate_arguments(&["-10", "-ge", "-10"], &mut buffer), Ok(true)); + assert_eq!(evaluate_arguments(&["-10", "-ge", "10"], &mut buffer), Ok(false)); // Less Than or Equal To assert_eq!(evaluate_arguments(&["5", "-le", "5"], &mut buffer), Ok(true)); assert_eq!(evaluate_arguments(&["5", "-le", "10"], &mut buffer), Ok(true)); assert_eq!(evaluate_arguments(&["10", "-le", "5"], &mut buffer), Ok(false)); + assert_eq!(evaluate_arguments(&["-11", "-le", "-10"], &mut buffer), Ok(true)); + assert_eq!(evaluate_arguments(&["-10", "-le", "-10"], &mut buffer), Ok(true)); + assert_eq!(evaluate_arguments(&["10", "-le", "-10"], &mut buffer), Ok(false)); // Less Than assert_eq!(evaluate_arguments(&["5", "-lt", "10"], &mut buffer), Ok(true)); assert_eq!(evaluate_arguments(&["10", "-lt", "5"], &mut buffer), Ok(false)); + assert_eq!(evaluate_arguments(&["-11", "-lt", "-10"], &mut buffer), Ok(true)); + assert_eq!(evaluate_arguments(&["10", "-lt", "-10"], &mut buffer), Ok(false)); // Greater Than assert_eq!(evaluate_arguments(&["10", "-gt", "5"], &mut buffer), Ok(true)); assert_eq!(evaluate_arguments(&["5", "-gt", "10"], &mut buffer), Ok(false)); + assert_eq!(evaluate_arguments(&["-9", "-gt", "-10"], &mut buffer), Ok(true)); + assert_eq!(evaluate_arguments(&["-10", "-gt", "10"], &mut buffer), Ok(false)); // Not Equal To assert_eq!(evaluate_arguments(&["10", "-ne", "5"], &mut buffer), Ok(true)); assert_eq!(evaluate_arguments(&["5", "-ne", "5"], &mut buffer), Ok(false)); + assert_eq!(evaluate_arguments(&["-10", "-ne", "-10"], &mut buffer), Ok(false)); + assert_eq!(evaluate_arguments(&["-10", "-ne", "10"], &mut buffer), Ok(true)); } #[test]