use crate::{parse_query, parse_query_from};
mod aggregate;
mod autogenerated;
mod builder;
mod builtin_functions;
mod disjunctions;
mod error;
mod fetch;
mod functions;
mod group;
mod group_aggregate;
mod list;
mod match_queries;
mod modifiers;
mod nonquery;
mod pipeline;
mod regex;
mod schema_queries;
mod sugar;
mod write_queries;
macro_rules! assert_valid_eq_repr {
($expected:ident, $parsed:ident, $query:ident) => {
let parsed = $parsed;
let query = $query;
assert_eq!(format!("{:#}", parsed), query, "\n{parsed:#}\n\n{query}\n");
};
}
use assert_valid_eq_repr;
#[test]
fn test_parsing_query_prefix() {
let input = r#"
define
entity person;
match
"#;
let (_query, remainder_index) = parse_query_from(input).unwrap();
assert!(&input[remainder_index..].trim().starts_with("match"));
let input = r#"
define
entity person;
end;
"#;
let (_query, remainder_index) = parse_query_from(input).unwrap();
assert!(&input[remainder_index..].trim().is_empty());
let input = r#"
define
# --- Common properties ---
attribute id, value string; # an inline comment
attribute type, value string;
# TODO: testing containing comments and newlines...
# --- Properties listed by multiple objects ---
attribute description, value string;
# TODO: struct types
"#;
let (_query, remainder_index) = parse_query_from(input).unwrap();
assert!(&input[remainder_index..].trim().is_empty());
}
#[test]
fn test_escape_string() {
let input = r#"This has \"double quotes\" and a single-quoted backslash: '\\'"#;
let query = format!(
r#"insert
$_ isa movie,
has title "{input}";"#
);
let parsed = parse_query(&query).unwrap();
assert_valid_eq_repr!(expected, parsed, query);
}
#[test]
fn when_parsing_query_with_comments_they_are_ignored() {
let query = r#"match
# there's a comment here
$x isa###WOW HERES ANOTHER###
movie; reduce $c1 = count($x);"#;
let uncommented = r#"match
$x isa movie;
reduce $c1 = count($x);"#;
let parsed = parse_query(query).unwrap();
assert_valid_eq_repr!(expected, parsed, uncommented);
}