use decypher::sema::analyze;
use decypher::{ErrorKind, parse};
#[test]
fn with_hides_previous_variables() {
let query = parse("MATCH (n) WITH n.name AS name WHERE n.other IS NOT NULL RETURN name")
.expect("should parse");
let result = analyze(&query);
assert!(result.is_err());
let errs = result.unwrap_err();
assert_eq!(errs.len(), 1);
match errs.errors[0].kind() {
ErrorKind::UnresolvedVariable { name } => {
assert_eq!(name, "n");
}
_ => panic!(
"expected UnresolvedVariable, got {:?}",
errs.errors[0].kind()
),
}
}
#[test]
fn with_unaliased_property_projection_requires_alias() {
let query = parse("MATCH (n) WITH n.name RETURN name").expect("should parse");
let result = analyze(&query);
assert!(result.is_err());
let errs = result.unwrap_err();
assert_eq!(errs.len(), 1);
match errs.errors[0].kind() {
ErrorKind::UnresolvedVariable { name } => {
assert_eq!(name, "name");
}
_ => panic!(
"expected UnresolvedVariable, got {:?}",
errs.errors[0].kind()
),
}
}
#[test]
fn with_variable_projection_binds() {
let query = parse("MATCH (n) WITH n RETURN n").expect("should parse");
let result = analyze(&query);
assert!(result.is_ok(), "analysis failed: {:?}", result);
}
#[test]
fn with_multiple_parts() {
let query = parse("MATCH (a) WITH a.x AS x MATCH (b) WITH x, b.y AS y RETURN x, y")
.expect("should parse");
let result = analyze(&query);
assert!(result.is_ok(), "analysis failed: {:?}", result);
}
#[test]
fn with_scope_prevents_access_to_earlier_vars() {
let query = parse("MATCH (a), (b) WITH a RETURN b").expect("should parse");
let result = analyze(&query);
assert!(result.is_err());
let errs = result.unwrap_err();
assert_eq!(errs.len(), 1);
match errs.errors[0].kind() {
ErrorKind::UnresolvedVariable { name } => {
assert_eq!(name, "b");
}
_ => panic!(
"expected UnresolvedVariable, got {:?}",
errs.errors[0].kind()
),
}
}
#[test]
fn with_star_projection() {
let query = parse("MATCH (n) WITH * RETURN n").expect("should parse");
let result = analyze(&query);
assert!(result.is_ok(), "analysis failed: {:?}", result);
}