Skip to content

Commit

Permalink
Add unit and integration tests
Browse files Browse the repository at this point in the history
  • Loading branch information
nwagner84 committed Jan 6, 2024
1 parent 7340e8a commit 8ec519a
Show file tree
Hide file tree
Showing 3 changed files with 129 additions and 0 deletions.
22 changes: 22 additions & 0 deletions crates/pica-matcher/src/common.rs
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,28 @@ mod tests {
assert!(parse_relational_op_usize.parse(b"=?").is_err());
}

#[test]
fn parse_quantifier() {
use super::parse_quantifier;

macro_rules! parse_success {
($input:expr, $expected:expr) => {
assert_eq!(
parse_quantifier.parse($input.as_bytes()).unwrap(),
$expected
);
};
}

parse_success!("ALL ", Quantifier::All);
parse_success!("∀", Quantifier::All);
parse_success!("ANY ", Quantifier::Any);
parse_success!("∃", Quantifier::Any);

assert!(parse_quantifier.parse(b"ALL").is_err());
assert!(parse_quantifier.parse(b"ANY").is_err());
}

#[test]
fn parse_string_single_quoted() {
use super::parse_string_single_quoted;
Expand Down
27 changes: 27 additions & 0 deletions crates/pica-matcher/tests/field_matcher/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,33 @@ fn subfields_matcher_is_match() -> TestResult {
let field = field!("002@", '0', "Olfo");
assert!(!matcher.is_match(&field, &options));

// ALL-quantified
let matcher = SubfieldsMatcher::new("ALL [email protected] == 'ger'");
let options = MatcherOptions::default();
let fields = vec![field!("010@", 'a', "ger")];
assert!(matcher.is_match(&fields, &options));

let matcher =
SubfieldsMatcher::new("ALL 010@{#a == 1 && a == 'ger'}");
let options = MatcherOptions::default();
let fields =
vec![field!("010@", 'a', "ger"), field!("010@", 'a', "eng")];
assert!(!matcher.is_match(&fields, &options));

// ANY-quantified
let matcher = SubfieldsMatcher::new("ANY [email protected] == 'ger'");
let options = MatcherOptions::default();
let fields =
vec![field!("010@", 'a', "ger"), field!("010@", 'a', "eng")];
assert!(matcher.is_match(&fields, &options));

let matcher =
SubfieldsMatcher::new("ANY 010@{#a == 1 && a == 'ger'}");
let options = MatcherOptions::default();
let fields =
vec![field!("010@", 'a', "fra"), field!("010@", 'a', "eng")];
assert!(!matcher.is_match(&fields, &options));

Ok(())
}

Expand Down
80 changes: 80 additions & 0 deletions crates/pica-matcher/tests/subfield_matcher/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,40 @@ fn relational_matcher_equal() {
assert!(matcher.is_match(&subfield!('0', "abc"), &options));
assert!(matcher.is_match(&subfield!('0', "ABC"), &options));

// ALL-quantified
let matcher = RelationMatcher::new("ALL 0 =^ 'ab'");
let options = MatcherOptions::default();

assert!(matcher.is_match(&subfield!('0', "abc"), &options));
assert!(!matcher.is_match(&subfield!('0', "ABC"), &options));
assert!(matcher.is_match(
[
&subfield!('0', "ab"),
&subfield!('1', "def"),
&subfield!('0', "abc"),
],
&options
));

assert!(!matcher.is_match(
[&subfield!('0', "ab"), &subfield!('0', "bc")],
&options
));

// ANY-quantified
let matcher = RelationMatcher::new("ANY 0 =^ 'ab'");
let options = MatcherOptions::default();

assert!(matcher.is_match(
[&subfield!('0', "def"), &subfield!('0', "abc")],
&options
));

assert!(!matcher.is_match(
[&subfield!('0', "def"), &subfield!('0', "bcd")],
&options
));

// multiple subfields
let matcher = RelationMatcher::new("0 == 'abc'");
let options = MatcherOptions::default();
Expand Down Expand Up @@ -427,6 +461,26 @@ fn regex_matcher_is_match() -> TestResult {
let subfields = [&subfield!('0', "foo"), &subfield!('0', "bar")];
assert!(!matcher.is_match(subfields, &options));

// ALL-quantified
let matcher = RegexMatcher::from_str(r"ALL 0 =~ '^[A-Z]\\d+$'")?;
let options = MatcherOptions::default();

let subfields = [&subfield!('0', "A123"), &subfield!('0', "Y456")];
assert!(matcher.is_match(subfields, &options));

let subfields = [&subfield!('0', "123A"), &subfield!('0', "Y456")];
assert!(!matcher.is_match(subfields, &options));

// ANY-quantified
let matcher = RegexMatcher::from_str(r"ANY 0 =~ '^[A-Z]\\d+$'")?;
let options = MatcherOptions::default();

let subfields = [&subfield!('0', "123A"), &subfield!('0', "Y456")];
assert!(matcher.is_match(subfields, &options));

let subfields = [&subfield!('0', "123A"), &subfield!('0', "456Y")];
assert!(!matcher.is_match(subfields, &options));

Ok(())
}

Expand Down Expand Up @@ -517,6 +571,32 @@ fn in_matcher_is_match() -> TestResult {
let subfields = [&subfield!('a', "000"), &subfield!('z', "xyz")];
assert!(!matcher.is_match(subfields, &options));

// ALL-quantified
let matcher = InMatcher::from_str("ALL 0 in ['abc', 'def']")?;
let options = MatcherOptions::default();

let subfields = [&subfield!('0', "def"), &subfield!('0', "abc")];
assert!(matcher.is_match(subfields, &options));

let matcher = InMatcher::from_str("ALL a in ['000', '999']")?;
let options = MatcherOptions::default();

let subfields = [&subfield!('a', "000"), &subfield!('a', "xyz")];
assert!(!matcher.is_match(subfields, &options));

// ANY-quantified
let matcher = InMatcher::from_str("ANY 0 in ['abc', 'def']")?;
let options = MatcherOptions::default();

let subfields = [&subfield!('0', "xyz"), &subfield!('0', "abc")];
assert!(matcher.is_match(subfields, &options));

let matcher = InMatcher::from_str("ANY a in ['000', '999']")?;
let options = MatcherOptions::default();

let subfields = [&subfield!('a', "111"), &subfield!('a', "222")];
assert!(!matcher.is_match(subfields, &options));

Ok(())
}

Expand Down

0 comments on commit 8ec519a

Please sign in to comment.