plotnik-compiler 0.3.2

Compiler for Plotnik query language (parser, analyzer, bytecode emitter)
Documentation
use crate::query::QueryAnalyzed;

#[test]
fn backreference_error() {
    let q = QueryAnalyzed::expect(r"Q = (identifier =~ /(.)\1/)");
    assert!(!q.is_valid());
    insta::assert_snapshot!(q.dump_diagnostics(), @r"
    error: backreferences are not supported in regex
      |
    1 | Q = (identifier =~ /(.)\1/)
      |                        ^^
    ");
}

#[test]
fn lookahead_error() {
    let q = QueryAnalyzed::expect(r"Q = (identifier =~ /foo(?=bar)/)");
    assert!(!q.is_valid());
    insta::assert_snapshot!(q.dump_diagnostics(), @r"
    error: lookahead/lookbehind is not supported in regex
      |
    1 | Q = (identifier =~ /foo(?=bar)/)
      |                         ^^
    ");
}

#[test]
fn lookbehind_error() {
    let q = QueryAnalyzed::expect(r"Q = (identifier =~ /(?<=foo)bar/)");
    assert!(!q.is_valid());
    insta::assert_snapshot!(q.dump_diagnostics(), @r"
    error: lookahead/lookbehind is not supported in regex
      |
    1 | Q = (identifier =~ /(?<=foo)bar/)
      |                      ^^^
    ");
}

#[test]
fn named_capture_error() {
    let q = QueryAnalyzed::expect(r"Q = (identifier =~ /(?P<name>foo)/)");
    assert!(!q.is_valid());
    insta::assert_snapshot!(q.dump_diagnostics(), @r"
    error: named captures are not supported in regex
      |
    1 | Q = (identifier =~ /(?P<name>foo)/)
      |                      ^^^^^^^^
    ");
}

#[test]
fn syntax_error() {
    let q = QueryAnalyzed::expect(r"Q = (identifier =~ /[/)");
    assert!(!q.is_valid());
    insta::assert_snapshot!(q.dump_diagnostics(), @r"
    error: invalid regex syntax: unclosed character class
      |
    1 | Q = (identifier =~ /[/)
      |                     ^
    ");
}

#[test]
fn empty_regex_error() {
    let q = QueryAnalyzed::expect(r"Q = (identifier =~ //)");
    assert!(!q.is_valid());
    insta::assert_snapshot!(q.dump_diagnostics(), @r"
    error: empty regex pattern
      |
    1 | Q = (identifier =~ //)
      |                    ^^
    ");
}

#[test]
fn valid_regex() {
    let q = QueryAnalyzed::expect(r"Q = (identifier =~ /^test_/)");
    assert!(q.is_valid());
}

#[test]
fn valid_string_predicate() {
    let q = QueryAnalyzed::expect(r#"Q = (identifier == "foo")"#);
    assert!(q.is_valid());
}