#![allow(unused_variables)]
use std::collections::HashMap;
use interstellar::p;
use interstellar::storage::Graph;
use interstellar::traversal::__;
use interstellar::value::Value;
use crate::common::graphs::{create_medium_graph, create_small_graph};
#[test]
fn choose_with_predicate_true_branch() {
let tg = create_medium_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v()
.has_label("person")
.choose(
__.has_value("status", "active"),
__.out_labels(&["knows"]),
__.out_labels(&["created"]),
)
.to_list();
assert!(!results.is_empty());
}
#[test]
fn choose_with_predicate_false_branch() {
let tg = create_medium_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v_ids([tg.bob])
.choose(
__.has_value("status", "active"),
__.out_labels(&["knows"]),
__.out_labels(&["created"]),
)
.to_list();
assert!(!results.is_empty());
}
#[test]
fn choose_with_constant_branches() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v()
.choose(
__.has_label("person"),
__.constant(Value::String("is_person".to_string())),
__.constant(Value::String("is_other".to_string())),
)
.to_list();
assert_eq!(results.len(), 4);
let person_count = results
.iter()
.filter(|v| *v == &Value::String("is_person".to_string()))
.count();
assert_eq!(person_count, 3);
}
#[test]
fn choose_with_value_extraction() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v()
.choose(
__.has_label("person"),
__.values("age"),
__.values("version"),
)
.to_list();
assert_eq!(results.len(), 4);
}
#[test]
fn coalesce_returns_first_match() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v()
.has_label("person")
.coalesce(vec![__.values("nickname"), __.values("name")])
.to_list();
assert_eq!(results.len(), 3);
assert!(results.contains(&Value::String("Alice".to_string())));
}
#[test]
fn coalesce_with_constant_fallback() {
let graph = Graph::new();
graph.add_vertex("test", {
let mut props = HashMap::new();
props.insert("name".to_string(), Value::String("HasName".to_string()));
props
});
graph.add_vertex("test", HashMap::new());
let snapshot = graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v()
.coalesce(vec![
__.values("name"),
__.constant(Value::String("Unknown".to_string())),
])
.to_list();
assert_eq!(results.len(), 2);
assert!(results.contains(&Value::String("HasName".to_string())));
assert!(results.contains(&Value::String("Unknown".to_string())));
}
#[test]
fn coalesce_with_navigation() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v_ids([tg.alice])
.coalesce(vec![__.out_labels(&["manages"]), __.out_labels(&["knows"])])
.to_list();
assert_eq!(results.len(), 1);
assert_eq!(results[0].as_vertex_id(), Some(tg.bob));
}
#[test]
fn coalesce_all_empty_returns_empty() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v_ids([tg.graphdb])
.coalesce(vec![__.out_labels(&["manages"]), __.out_labels(&["owns"])])
.to_list();
assert!(results.is_empty());
}
#[test]
fn union_combines_traversals() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v_ids([tg.alice])
.union(vec![__.out_labels(&["knows"]), __.out_labels(&["uses"])])
.to_list();
assert_eq!(results.len(), 2);
}
#[test]
fn union_with_different_depths() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v_ids([tg.alice])
.union(vec![
__.out_labels(&["knows"]),
__.out_labels(&["knows"]).out_labels(&["knows"]),
])
.dedup()
.to_list();
assert_eq!(results.len(), 2);
}
#[test]
fn union_with_values() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v_ids([tg.alice])
.union(vec![__.values("name"), __.values("age")])
.to_list();
assert_eq!(results.len(), 2);
assert!(results.contains(&Value::String("Alice".to_string())));
assert!(results.contains(&Value::Int(30)));
}
#[test]
fn union_preserves_duplicates() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v_ids([tg.alice])
.union(vec![__.out_labels(&["knows"]), __.out_labels(&["knows"])])
.to_list();
assert_eq!(results.len(), 2);
}
#[test]
fn optional_with_match() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v_ids([tg.alice])
.optional(__.out_labels(&["knows"]))
.to_list();
assert_eq!(results.len(), 1);
assert_eq!(results[0].as_vertex_id(), Some(tg.bob));
}
#[test]
fn optional_without_match_returns_input() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v_ids([tg.alice])
.optional(__.out_labels(&["manages"]))
.to_list();
assert_eq!(results.len(), 1);
assert_eq!(results[0].as_vertex_id(), Some(tg.alice));
}
#[test]
fn optional_in_chain() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v_ids([tg.alice])
.out_labels(&["knows"])
.optional(__.out_labels(&["manages"]))
.values("name")
.to_list();
assert_eq!(results.len(), 1);
assert_eq!(results[0], Value::String("Bob".to_string()));
}
#[test]
fn and_requires_all_conditions() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v()
.has_label("person")
.and_(vec![
__.has_where("age", p::gt(25i64)),
__.out_labels(&["knows"]),
])
.to_list();
assert!(results.len() >= 2);
}
#[test]
fn and_with_empty_branch_filters_all() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v()
.has_label("person")
.and_(vec![
__.has_where("age", p::gt(100i64)),
__.out_labels(&["knows"]),
])
.to_list();
assert!(results.is_empty());
}
#[test]
fn or_matches_any_condition() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v()
.has_label("person")
.or_(vec![
__.has_where("age", p::lt(26i64)),
__.has_where("age", p::gt(34i64)),
])
.to_list();
assert_eq!(results.len(), 2);
}
#[test]
fn or_with_navigation_conditions() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v()
.or_(vec![__.out_labels(&["knows"]), __.out_labels(&["uses"])])
.to_list();
assert!(!results.is_empty());
}
#[test]
fn not_filters_matching() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g.v().not(__.out_labels(&["knows"])).to_list();
assert!(!results.is_empty());
let ids: Vec<_> = results.iter().filter_map(|v| v.as_vertex_id()).collect();
assert!(ids.contains(&tg.graphdb));
}
#[test]
fn not_with_property_condition() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v()
.has_label("person")
.not(__.has_where("age", p::gt(30i64)))
.to_list();
assert_eq!(results.len(), 2);
}
#[test]
fn where_with_exists_pattern() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v()
.has_label("person")
.where_(__.out_labels(&["knows"]))
.to_list();
assert_eq!(results.len(), 3);
}
#[test]
fn where_with_count_predicate() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v()
.has_label("person")
.where_(__.out_labels(&["knows"]))
.to_list();
assert!(!results.is_empty());
}
#[test]
fn where_with_property_match() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v()
.has_label("person")
.where_(__.out_labels(&["knows"]).has_where("age", p::lt(30i64)))
.to_list();
assert!(!results.is_empty());
}
#[test]
fn nested_choose() {
let tg = create_medium_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v()
.has_label("person")
.choose(
__.has_value("status", "active"),
__.choose(
__.has_where("age", p::gt(30i64)),
__.constant(Value::String("active_senior".to_string())),
__.constant(Value::String("active_junior".to_string())),
),
__.constant(Value::String("inactive".to_string())),
)
.to_list();
assert_eq!(results.len(), 3);
}
#[test]
fn coalesce_in_union() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v_ids([tg.alice])
.union(vec![
__.out_labels(&["knows"]),
__.coalesce(vec![__.out_labels(&["manages"]), __.out_labels(&["uses"])]),
])
.to_list();
assert_eq!(results.len(), 2);
}