#![allow(unused_variables)]
use interstellar::gql::{compile, parse, GqlError};
use interstellar::prelude::*;
use interstellar::storage::Graph;
use std::collections::HashMap;
use std::sync::Arc;
fn create_test_graph() -> Arc<Graph> {
let graph = Arc::new(Graph::new());
let mut alice_props = HashMap::new();
alice_props.insert("name".to_string(), Value::from("Alice"));
alice_props.insert("age".to_string(), Value::from(30i64));
graph.add_vertex("Person", alice_props);
let mut bob_props = HashMap::new();
bob_props.insert("name".to_string(), Value::from("Bob"));
bob_props.insert("age".to_string(), Value::from(25i64));
graph.add_vertex("Person", bob_props);
let mut charlie_props = HashMap::new();
charlie_props.insert("name".to_string(), Value::from("Charlie"));
charlie_props.insert("age".to_string(), Value::from(35i64));
graph.add_vertex("Person", charlie_props);
let mut acme_props = HashMap::new();
acme_props.insert("name".to_string(), Value::from("Acme Corp"));
graph.add_vertex("Company", acme_props);
let mut globex_props = HashMap::new();
globex_props.insert("name".to_string(), Value::from("Globex"));
graph.add_vertex("Company", globex_props);
graph
}
#[test]
fn test_gql_match_with_label() {
let graph = create_test_graph();
let snapshot = graph.snapshot();
let results = graph.gql("MATCH (n:Person) RETURN n").unwrap();
assert_eq!(results.len(), 3);
for result in &results {
assert!(matches!(result, Value::Vertex(_)));
}
}
#[test]
fn test_gql_match_different_label() {
let graph = create_test_graph();
let snapshot = graph.snapshot();
let results = graph.gql("MATCH (c:Company) RETURN c").unwrap();
assert_eq!(results.len(), 2);
}
#[test]
fn test_gql_match_all_vertices() {
let graph = create_test_graph();
let snapshot = graph.snapshot();
let results = graph.gql("MATCH (n) RETURN n").unwrap();
assert_eq!(results.len(), 5);
}
#[test]
fn test_gql_match_no_results() {
let graph = create_test_graph();
let snapshot = graph.snapshot();
let results = graph.gql("MATCH (x:NonExistent) RETURN x").unwrap();
assert_eq!(results.len(), 0);
}
#[test]
fn test_gql_empty_graph() {
let graph = Arc::new(Graph::new());
let snapshot = graph.snapshot();
let results = graph.gql("MATCH (n:Person) RETURN n").unwrap();
assert_eq!(results.len(), 0);
}
#[test]
fn test_gql_case_insensitive_keywords() {
let graph = create_test_graph();
let snapshot = graph.snapshot();
let r1 = graph.gql("match (n:Person) return n").unwrap();
assert_eq!(r1.len(), 3);
let r2 = graph.gql("MATCH (n:Person) RETURN n").unwrap();
assert_eq!(r2.len(), 3);
let r3 = graph.gql("Match (n:Person) Return n").unwrap();
assert_eq!(r3.len(), 3);
}
#[test]
fn test_gql_whitespace_tolerance() {
let graph = create_test_graph();
let snapshot = graph.snapshot();
let results = graph
.gql(" MATCH ( n : Person ) RETURN n ")
.unwrap();
assert_eq!(results.len(), 3);
}
#[test]
fn test_gql_parse_error_missing_return() {
let graph = Arc::new(Graph::new());
let snapshot = graph.snapshot();
let result = graph.gql("MATCH (n:Person)");
assert!(result.is_err());
assert!(matches!(result, Err(GqlError::Parse(_))));
}
#[test]
fn test_gql_parse_error_missing_match() {
let result = parse("RETURN n");
assert!(result.is_err());
}
#[test]
fn test_gql_parse_error_unclosed_paren() {
let graph = Arc::new(Graph::new());
let snapshot = graph.snapshot();
let result = graph.gql("MATCH (n:Person RETURN n");
assert!(result.is_err());
assert!(matches!(result, Err(GqlError::Parse(_))));
}
#[test]
fn test_gql_compile_error_undefined_variable() {
let graph = Arc::new(Graph::new());
let snapshot = graph.snapshot();
let result = graph.gql("MATCH (n:Person) RETURN x");
assert!(result.is_err());
assert!(matches!(result, Err(GqlError::Compile(_))));
}
#[test]
fn test_gql_method_on_snapshot() {
let graph = Arc::new(Graph::new());
let props = HashMap::new();
graph.add_vertex("Test", props);
let snapshot = graph.snapshot();
let results = graph.gql("MATCH (n:Test) RETURN n").unwrap();
assert_eq!(results.len(), 1);
}
#[test]
fn test_gql_multiple_queries_same_snapshot() {
let graph = create_test_graph();
let snapshot = graph.snapshot();
let persons = graph.gql("MATCH (p:Person) RETURN p").unwrap();
let companies = graph.gql("MATCH (c:Company) RETURN c").unwrap();
let all = graph.gql("MATCH (n) RETURN n").unwrap();
assert_eq!(persons.len(), 3);
assert_eq!(companies.len(), 2);
assert_eq!(all.len(), 5);
}
#[test]
fn test_parse_function_export() {
let query = parse("MATCH (n:Person) RETURN n").unwrap();
assert_eq!(query.match_clause.patterns.len(), 1);
assert_eq!(query.return_clause.items.len(), 1);
}
#[test]
fn test_compile_function_export() {
let graph = create_test_graph();
let snapshot = graph.snapshot();
let query = parse("MATCH (n:Person) RETURN n").unwrap();
let results = compile(&query, &snapshot).unwrap();
assert_eq!(results.len(), 3);
}