Squashed 'vendor/ruvector/' content from commit b64c2172

git-subtree-dir: vendor/ruvector
git-subtree-split: b64c21726f2bb37286d9ee36a7869fef60cc6900
This commit is contained in:
ruv
2026-02-28 14:39:40 -05:00
commit d803bfe2b1
7854 changed files with 3522914 additions and 0 deletions

View File

@@ -0,0 +1,166 @@
//! Integration tests for Cypher parser
use ruvector_graph::cypher::{ast::*, parse_cypher};
#[test]
fn test_simple_match_query() {
let query = "MATCH (n:Person) RETURN n";
let result = parse_cypher(query);
assert!(
result.is_ok(),
"Failed to parse simple MATCH query: {:?}",
result.err()
);
let ast = result.unwrap();
assert_eq!(ast.statements.len(), 2); // MATCH and RETURN
}
#[test]
fn test_match_with_where() {
let query = "MATCH (n:Person) WHERE n.age > 30 RETURN n.name";
let result = parse_cypher(query);
assert!(
result.is_ok(),
"Failed to parse MATCH with WHERE: {:?}",
result.err()
);
}
#[test]
fn test_relationship_pattern() {
let query = "MATCH (a:Person)-[r:KNOWS]->(b:Person) RETURN a, r, b";
let result = parse_cypher(query);
assert!(
result.is_ok(),
"Failed to parse relationship pattern: {:?}",
result.err()
);
}
#[test]
fn test_create_node() {
let query = "CREATE (n:Person {name: 'Alice', age: 30})";
let result = parse_cypher(query);
assert!(
result.is_ok(),
"Failed to parse CREATE query: {:?}",
result.err()
);
}
#[test]
#[ignore = "Hyperedge syntax not yet implemented in parser"]
fn test_hyperedge_pattern() {
let query = "MATCH (a)-[r:TRANSACTION]->(b, c, d) RETURN a, r, b, c, d";
let result = parse_cypher(query);
assert!(
result.is_ok(),
"Failed to parse hyperedge: {:?}",
result.err()
);
let ast = result.unwrap();
assert!(ast.has_hyperedges(), "Query should contain hyperedges");
}
#[test]
fn test_aggregation_functions() {
let query = "MATCH (n:Person) RETURN COUNT(n), AVG(n.age), MAX(n.salary)";
let result = parse_cypher(query);
assert!(
result.is_ok(),
"Failed to parse aggregation query: {:?}",
result.err()
);
}
#[test]
fn test_order_by_limit() {
let query = "MATCH (n:Person) RETURN n.name ORDER BY n.age DESC LIMIT 10";
let result = parse_cypher(query);
assert!(
result.is_ok(),
"Failed to parse ORDER BY LIMIT: {:?}",
result.err()
);
}
#[test]
fn test_complex_query() {
let query = r#"
MATCH (a:Person)-[r:KNOWS]->(b:Person)
WHERE a.age > 30 AND b.name = 'Alice'
RETURN a.name, b.name, r.since
ORDER BY r.since DESC
LIMIT 10
"#;
let result = parse_cypher(query);
assert!(
result.is_ok(),
"Failed to parse complex query: {:?}",
result.err()
);
}
#[test]
#[ignore = "CREATE relationship with properties not yet fully implemented"]
fn test_create_relationship() {
let query = r#"
MATCH (a:Person), (b:Person)
WHERE a.name = 'Alice' AND b.name = 'Bob'
CREATE (a)-[:KNOWS {since: 2024}]->(b)
"#;
let result = parse_cypher(query);
assert!(
result.is_ok(),
"Failed to parse CREATE relationship: {:?}",
result.err()
);
}
#[test]
#[ignore = "MERGE ON CREATE SET not yet implemented"]
fn test_merge_pattern() {
let query = "MERGE (n:Person {name: 'Alice'}) ON CREATE SET n.created = 2024";
let result = parse_cypher(query);
assert!(result.is_ok(), "Failed to parse MERGE: {:?}", result.err());
}
#[test]
fn test_with_clause() {
let query = r#"
MATCH (n:Person)
WITH n, n.age AS age
WHERE age > 30
RETURN n.name, age
"#;
let result = parse_cypher(query);
assert!(
result.is_ok(),
"Failed to parse WITH clause: {:?}",
result.err()
);
}
#[test]
fn test_path_pattern() {
let query = "MATCH p = (a:Person)-[*1..3]->(b:Person) RETURN p";
let result = parse_cypher(query);
assert!(
result.is_ok(),
"Failed to parse path pattern: {:?}",
result.err()
);
}
#[test]
fn test_is_read_only() {
let query1 = "MATCH (n:Person) RETURN n";
let ast1 = parse_cypher(query1).unwrap();
assert!(ast1.is_read_only());
let query2 = "CREATE (n:Person {name: 'Alice'})";
let ast2 = parse_cypher(query2).unwrap();
assert!(!ast2.is_read_only());
}