dsh_api 0.10.0

DSH resource management API client
Documentation
use dsh_api::query_processor::{
  ExactMatchQueryProcessor, ExpressionQueryProcessor, Match, Part, QueryProcessor, RegexQueryProcessor, StringQueryProcessor, SubstringQueryProcessor,
};

#[test]
fn test_exact_match_query_processor() {
  let haystacks: [(&str, &str, Option<Match>); 4] = [("aa", "", None), ("aa", "a", None), ("aa", "aa", Some(Match::simple())), ("aa", "aaa", None)];
  for (pattern, haystack, matching) in haystacks {
    let exact_match_query_processor = ExactMatchQueryProcessor::create(pattern).unwrap();
    assert_eq!(exact_match_query_processor.describe(), format!("match the string \"{}\"", pattern));
    assert_eq!(exact_match_query_processor.matching(haystack), matching);
  }
}

#[test]
fn test_string_query_processor() {
  let patterns_haystacks: [(&str, &str, Option<Match>); 14] = [
    ("A", "", None),
    ("A", "b", None),
    ("A", "a", Some(Match::parts(vec![Part::matching("a")]))),
    ("A", "aa", Some(Match::parts(vec![Part::matching("a"), Part::matching("a")]))),
    ("AA", "aa", Some(Match::parts(vec![Part::matching("aa")]))),
    ("AA", "aaa", Some(Match::parts(vec![Part::matching("aa"), Part::non_matching("a")]))),
    ("A", "aaa", Some(Match::parts(vec![Part::matching("a"), Part::matching("a"), Part::matching("a")]))),
    (
      "A",
      "aab",
      Some(Match::parts(vec![Part::matching("a"), Part::matching("a"), Part::non_matching("b")])),
    ),
    (
      "A",
      "aba",
      Some(Match::parts(vec![Part::matching("a"), Part::non_matching("b"), Part::matching("a")])),
    ),
    ("A", "abb", Some(Match::parts(vec![Part::matching("a"), Part::non_matching("bb")]))),
    (
      "A",
      "baa",
      Some(Match::parts(vec![Part::non_matching("b"), Part::matching("a"), Part::matching("a")])),
    ),
    (
      "A",
      "bab",
      Some(Match::parts(vec![Part::non_matching("b"), Part::matching("a"), Part::non_matching("b")])),
    ),
    ("A", "bba", Some(Match::parts(vec![Part::non_matching("bb"), Part::matching("a")]))),
    ("A", "bbb", None),
  ];
  for (pattern, haystack, matching) in patterns_haystacks {
    println!("{} -> {}", pattern, haystack);
    let string_query_processor = StringQueryProcessor::new(pattern, true, true);
    assert_eq!(string_query_processor.matching(haystack), matching);
  }
}

#[test]
fn test_substring_query_processor() {
  let patterns_haystacks: [(&str, &str, Option<Match>); 14] = [
    ("a", "", None),
    ("a", "b", None),
    ("a", "a", Some(Match::parts(vec![Part::matching("a")]))),
    ("a", "aa", Some(Match::parts(vec![Part::matching("a"), Part::matching("a")]))),
    ("aa", "aa", Some(Match::parts(vec![Part::matching("aa")]))),
    ("aa", "aaa", Some(Match::parts(vec![Part::matching("aa"), Part::non_matching("a")]))),
    ("a", "aaa", Some(Match::parts(vec![Part::matching("a"), Part::matching("a"), Part::matching("a")]))),
    (
      "a",
      "aab",
      Some(Match::parts(vec![Part::matching("a"), Part::matching("a"), Part::non_matching("b")])),
    ),
    (
      "a",
      "aba",
      Some(Match::parts(vec![Part::matching("a"), Part::non_matching("b"), Part::matching("a")])),
    ),
    ("a", "abb", Some(Match::parts(vec![Part::matching("a"), Part::non_matching("bb")]))),
    (
      "a",
      "baa",
      Some(Match::parts(vec![Part::non_matching("b"), Part::matching("a"), Part::matching("a")])),
    ),
    (
      "a",
      "bab",
      Some(Match::parts(vec![Part::non_matching("b"), Part::matching("a"), Part::non_matching("b")])),
    ),
    ("a", "bba", Some(Match::parts(vec![Part::non_matching("bb"), Part::matching("a")]))),
    ("a", "bbb", None),
  ];
  for (pattern, haystack, matching) in patterns_haystacks {
    let substring_query_processor = SubstringQueryProcessor::create(pattern).unwrap();
    assert_eq!(substring_query_processor.describe(), format!("match substring \"{}\"", pattern));
    assert_eq!(substring_query_processor.matching(haystack), matching);
    let string_query_processor = StringQueryProcessor::create(pattern, true, false).unwrap();
    assert_eq!(string_query_processor.matching(haystack), matching);
  }
}

#[test]
fn test_regex_query_processor() {
  let haystacks: [(&str, &str, Option<Match>); 19] = [
    ("a+", "", None),
    ("a+", "b", None),
    ("a+", "a", Some(Match::parts(vec![Part::matching("a")]))),
    ("a+", "aaa", Some(Match::parts(vec![Part::matching("aaa")]))),
    (
      "a+",
      "bbabbbaab",
      Some(Match::parts(vec![
        Part::non_matching("bb"),
        Part::matching("a"),
        Part::non_matching("bbb"),
        Part::matching("aa"),
        Part::non_matching("b"),
      ])),
    ),
    (
      "a+",
      "aaabbabbbaab",
      Some(Match::parts(vec![
        Part::matching("aaa"),
        Part::non_matching("bb"),
        Part::matching("a"),
        Part::non_matching("bbb"),
        Part::matching("aa"),
        Part::non_matching("b"),
      ])),
    ),
    (
      "a+",
      "bbabbbaabaaa",
      Some(Match::parts(vec![
        Part::non_matching("bb"),
        Part::matching("a"),
        Part::non_matching("bbb"),
        Part::matching("aa"),
        Part::non_matching("b"),
        Part::matching("aaa"),
      ])),
    ),
    (
      "a+",
      "aaabbabbbaabaaa",
      Some(Match::parts(vec![
        Part::matching("aaa"),
        Part::non_matching("bb"),
        Part::matching("a"),
        Part::non_matching("bbb"),
        Part::matching("aa"),
        Part::non_matching("b"),
        Part::matching("aaa"),
      ])),
    ),
    ("aa", "", None),
    ("aa", "bbb", None),
    ("aa", "aa", Some(Match::parts(vec![Part::matching("aa")]))),
    ("aa", "aaa", Some(Match::parts(vec![Part::matching("aa"), Part::non_matching("a")]))),
    ("aa", "aaaa", Some(Match::parts(vec![Part::matching("aa"), Part::matching("aa")]))),
    (
      "aa",
      "aaaaa",
      Some(Match::parts(vec![Part::matching("aa"), Part::matching("aa"), Part::non_matching("a")])),
    ),
    ("aa", "aaabb", Some(Match::parts(vec![Part::matching("aa".to_string()), Part::non_matching("abb")]))),
    (
      "aa",
      "bbaaabbbaaab",
      Some(Match::parts(vec![
        Part::non_matching("bb"),
        Part::matching("aa"),
        Part::non_matching("abbb"),
        Part::matching("aa"),
        Part::non_matching("ab"),
      ])),
    ),
    (
      "aa",
      "aaabbabbbaab",
      Some(Match::parts(vec![
        Part::matching("aa"),
        Part::non_matching("abbabbb"),
        Part::matching("aa"),
        Part::non_matching("b"),
      ])),
    ),
    (
      "aa",
      "bbabbbaabaaa",
      Some(Match::parts(vec![
        Part::non_matching("bbabbb"),
        Part::matching("aa"),
        Part::non_matching("b"),
        Part::matching("aa"),
        Part::non_matching("a"),
      ])),
    ),
    (
      "aa",
      "aaabbabbbaabaaa",
      Some(Match::parts(vec![
        Part::matching("aa"),
        Part::non_matching("abbabbb"),
        Part::matching("aa"),
        Part::non_matching("b"),
        Part::matching("aa"),
        Part::non_matching("a"),
      ])),
    ),
  ];
  for (pattern, haystack, matching) in haystacks {
    let regex_query_processor = RegexQueryProcessor::create(pattern).unwrap();
    assert_eq!(regex_query_processor.describe(), format!("match against regular expression \"{}\"", pattern));
    assert_eq!(regex_query_processor.matching(haystack), matching);
  }
}

#[test]
fn test_expression_query_processor() {
  let expression_query_processor = ExpressionQueryProcessor::new("vhost");
  assert_eq!(expression_query_processor.describe(), "match against dsh expression vhost()");
  assert_eq!(
    expression_query_processor.matching("{ vhost('par') }").unwrap(),
    Match::expression("vhost", "par", None::<String>)
  );
  assert_eq!(
    expression_query_processor.matching("{ vhost('par1', 'par2') }").unwrap(),
    Match::expression("vhost", "par1", Some("par2".to_string()))
  );
}