use gix_pathspec::parse::Error; use crate::parse::check_against_baseline; #[test]fn empty_input() { let input = ""; assert!(!check_against_baseline(input), "This pathspec is valid in git: {input}"); let output = gix_pathspec::parse(input.as_bytes(), Default::default()); assert!(output.is_err()); assert!(matches!(output.unwrap_err(), Error::EmptyString));} #[test]fn invalid_short_signatures() { let inputs = vec![ ":\"()", ":#()", ":%()", ":&()", ":'()", ":,()", ":-()", ":;()", ":<()", ":=()", ":>()", ":@()", ":_()", ":`()", ":~()", ]; for input in inputs.into_iter() { assert!(!check_against_baseline(input), "This pathspec is valid in git: {input}"); let output = gix_pathspec::parse(input.as_bytes(), Default::default()); assert!(output.is_err()); assert!(matches!(output.unwrap_err(), Error::Unimplemented { .. })); }} #[test]fn invalid_keywords() { let inputs = vec![ ":( )some/path", ":(tp)some/path", ":(top, exclude)some/path", ":(top,exclude,icse)some/path", ]; for input in inputs.into_iter() { assert!(!check_against_baseline(input), "This pathspec is valid in git: {input}"); let output = gix_pathspec::parse(input.as_bytes(), Default::default()); assert!(output.is_err()); assert!(matches!(output.unwrap_err(), Error::InvalidKeyword { .. })); }} #[test]fn invalid_attributes() { let inputs = vec![ ":(attr:+invalidAttr)some/path", ":(attr:validAttr +invalidAttr)some/path", ":(attr:+invalidAttr,attr:valid)some/path", r":(attr:inva\lid)some/path", ]; for input in inputs { assert!(!check_against_baseline(input), "This pathspec is valid in git: {input}"); let output = gix_pathspec::parse(input.as_bytes(), Default::default()); assert!(output.is_err(), "This pathspec did not produce an error {input}"); assert!(matches!(output.unwrap_err(), Error::InvalidAttribute { .. })); }} #[test]fn invalid_attribute_values() { let inputs = vec![ r":(attr:v=inva#lid)some/path", r":(attr:v=inva\\lid)some/path", r":(attr:v=invalid\\)some/path", r":(attr:v=invalid\#)some/path", r":(attr:v=inva\=lid)some/path", r":(attr:a=valid b=inva\#lid)some/path", ":(attr:v=val��)", ":(attr:pr=pre��x:,)�", ]; for input in inputs { assert!(!check_against_baseline(input), "This pathspec is valid in git: {input}"); let output = gix_pathspec::parse(input.as_bytes(), Default::default()); assert!(output.is_err(), "This pathspec did not produce an error {input}"); assert!( matches!(output.unwrap_err(), Error::InvalidAttributeValue { .. }), "Errors did not match for pathspec: {input}" ); }} #[test]fn escape_character_at_end_of_attribute_value() { let inputs = vec![ r":(attr:v=invalid\)some/path", r":(attr:v=invalid\ )some/path", r":(attr:v=invalid\ valid)some/path", ]; for input in inputs { assert!(!check_against_baseline(input), "This pathspec is valid in git: {input}"); let output = gix_pathspec::parse(input.as_bytes(), Default::default()); assert!(output.is_err(), "This pathspec did not produce an error {input}"); assert!(matches!(output.unwrap_err(), Error::TrailingEscapeCharacter)); }} #[test]fn empty_attribute_specification() { let input = ":(attr:)"; assert!(!check_against_baseline(input), "This pathspec is valid in git: {input}"); let output = gix_pathspec::parse(input.as_bytes(), Default::default()); assert!(output.is_err()); assert!(matches!(output.unwrap_err(), Error::EmptyAttribute));} #[test]fn multiple_attribute_specifications() { let input = ":(attr:one,attr:two)some/path"; assert!(!check_against_baseline(input), "This pathspec is valid in git: {input}"); let output = gix_pathspec::parse(input.as_bytes(), Default::default()); assert!(output.is_err()); assert!(matches!(output.unwrap_err(), Error::MultipleAttributeSpecifications));} #[test]fn missing_parentheses() { let input = ":(top"; assert!(!check_against_baseline(input), "This pathspec is valid in git: {input}"); let output = gix_pathspec::parse(input.as_bytes(), Default::default()); assert!(output.is_err()); assert!(matches!(output.unwrap_err(), Error::MissingClosingParenthesis));} #[test]fn glob_and_literal_keywords_present() { let input = ":(glob,literal)some/path"; assert!(!check_against_baseline(input), "This pathspec is valid in git: {input}"); let output = gix_pathspec::parse(input.as_bytes(), Default::default()); assert!(output.is_err()); assert!(matches!(output.unwrap_err(), Error::IncompatibleSearchModes));}
use gix_pathspec::parse::Error;
use crate::parse::check_against_baseline;
#[test]
fn empty_input() {
let input = "";
assert!(!check_against_baseline(input), "This pathspec is valid in git: {input}");
let output = gix_pathspec::parse(input.as_bytes(), Default::default());
assert!(output.is_err());
assert!(matches!(output.unwrap_err(), Error::EmptyString));
}
#[test]
fn invalid_short_signatures() {
let inputs = vec![
":\"()", ":#()", ":%()", ":&()", ":'()", ":,()", ":-()", ":;()", ":<()", ":=()", ":>()", ":@()", ":_()",
":`()", ":~()",
];
for input in inputs.into_iter() {
assert!(!check_against_baseline(input), "This pathspec is valid in git: {input}");
let output = gix_pathspec::parse(input.as_bytes(), Default::default());
assert!(output.is_err());
assert!(matches!(output.unwrap_err(), Error::Unimplemented { .. }));
}
}
#[test]
fn invalid_keywords() {
let inputs = vec![
":( )some/path",
":(tp)some/path",
":(top, exclude)some/path",
":(top,exclude,icse)some/path",
];
for input in inputs.into_iter() {
assert!(!check_against_baseline(input), "This pathspec is valid in git: {input}");
let output = gix_pathspec::parse(input.as_bytes(), Default::default());
assert!(output.is_err());
assert!(matches!(output.unwrap_err(), Error::InvalidKeyword { .. }));
}
}
#[test]
fn invalid_attributes() {
let inputs = vec![
":(attr:+invalidAttr)some/path",
":(attr:validAttr +invalidAttr)some/path",
":(attr:+invalidAttr,attr:valid)some/path",
r":(attr:inva\lid)some/path",
];
for input in inputs {
assert!(!check_against_baseline(input), "This pathspec is valid in git: {input}");
let output = gix_pathspec::parse(input.as_bytes(), Default::default());
assert!(output.is_err(), "This pathspec did not produce an error {input}");
assert!(matches!(output.unwrap_err(), Error::InvalidAttribute { .. }));
}
}
#[test]
fn invalid_attribute_values() {
let inputs = vec![
r":(attr:v=inva#lid)some/path",
r":(attr:v=inva\\lid)some/path",
r":(attr:v=invalid\\)some/path",
r":(attr:v=invalid\#)some/path",
r":(attr:v=inva\=lid)some/path",
r":(attr:a=valid b=inva\#lid)some/path",
":(attr:v=val��)",
":(attr:pr=pre��x:,)�",
];
for input in inputs {
assert!(!check_against_baseline(input), "This pathspec is valid in git: {input}");
let output = gix_pathspec::parse(input.as_bytes(), Default::default());
assert!(output.is_err(), "This pathspec did not produce an error {input}");
assert!(
matches!(output.unwrap_err(), Error::InvalidAttributeValue { .. }),
"Errors did not match for pathspec: {input}"
);
}
}
#[test]
fn escape_character_at_end_of_attribute_value() {
let inputs = vec![
r":(attr:v=invalid\)some/path",
r":(attr:v=invalid\ )some/path",
r":(attr:v=invalid\ valid)some/path",
];
for input in inputs {
assert!(!check_against_baseline(input), "This pathspec is valid in git: {input}");
let output = gix_pathspec::parse(input.as_bytes(), Default::default());
assert!(output.is_err(), "This pathspec did not produce an error {input}");
assert!(matches!(output.unwrap_err(), Error::TrailingEscapeCharacter));
}
}
#[test]
fn empty_attribute_specification() {
let input = ":(attr:)";
assert!(!check_against_baseline(input), "This pathspec is valid in git: {input}");
let output = gix_pathspec::parse(input.as_bytes(), Default::default());
assert!(output.is_err());
assert!(matches!(output.unwrap_err(), Error::EmptyAttribute));
}
#[test]
fn multiple_attribute_specifications() {
let input = ":(attr:one,attr:two)some/path";
assert!(!check_against_baseline(input), "This pathspec is valid in git: {input}");
let output = gix_pathspec::parse(input.as_bytes(), Default::default());
assert!(output.is_err());
assert!(matches!(output.unwrap_err(), Error::MultipleAttributeSpecifications));
}
#[test]
fn missing_parentheses() {
let input = ":(top";
assert!(!check_against_baseline(input), "This pathspec is valid in git: {input}");
let output = gix_pathspec::parse(input.as_bytes(), Default::default());
assert!(output.is_err());
assert!(matches!(output.unwrap_err(), Error::MissingClosingParenthesis));
}
#[test]
fn glob_and_literal_keywords_present() {
let input = ":(glob,literal)some/path";
assert!(!check_against_baseline(input), "This pathspec is valid in git: {input}");
let output = gix_pathspec::parse(input.as_bytes(), Default::default());
assert!(output.is_err());
assert!(matches!(output.unwrap_err(), Error::IncompatibleSearchModes));
}