#![allow(unused_variables)]
use interstellar::p;
use interstellar::traversal::__;
use interstellar::value::Value;
use crate::common::graphs::{create_org_graph, create_small_graph};
#[test]
fn repeat_times_zero_returns_start() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v_ids([tg.alice])
.repeat(__.out_labels(&["knows"]))
.times(0)
.to_list();
assert_eq!(results.len(), 1);
assert_eq!(results[0].as_vertex_id(), Some(tg.alice));
}
#[test]
fn repeat_times_one() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v_ids([tg.alice])
.repeat(__.out_labels(&["knows"]))
.times(1)
.to_list();
assert_eq!(results.len(), 1);
assert_eq!(results[0].as_vertex_id(), Some(tg.bob));
}
#[test]
fn repeat_times_two() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v_ids([tg.alice])
.repeat(__.out_labels(&["knows"]))
.times(2)
.to_list();
assert_eq!(results.len(), 1);
assert_eq!(results[0].as_vertex_id(), Some(tg.charlie));
}
#[test]
fn repeat_times_three_with_cycle() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v_ids([tg.alice])
.repeat(__.out_labels(&["knows"]))
.times(3)
.to_list();
assert_eq!(results.len(), 1);
assert_eq!(results[0].as_vertex_id(), Some(tg.alice));
}
#[test]
fn repeat_times_from_multiple_starts() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v_ids([tg.alice, tg.bob])
.repeat(__.out_labels(&["knows"]))
.times(1)
.to_list();
assert_eq!(results.len(), 2);
}
#[test]
fn repeat_until_condition_met() {
let org = create_org_graph();
let snapshot = org.snapshot();
let g = snapshot.gremlin();
let results = g
.v_ids([org.dev1])
.repeat(__.out_labels(&["reports_to"]))
.until(__.has_where("level", p::eq(0i64)))
.to_list();
assert_eq!(results.len(), 1);
assert_eq!(results[0].as_vertex_id(), Some(org.ceo));
}
#[test]
fn repeat_until_with_max_loops() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v_ids([tg.alice])
.repeat(__.out_labels(&["knows"]))
.until(__.has_label("software"))
.times(5)
.to_list();
assert!(!results.is_empty());
}
#[test]
fn repeat_until_immediate_match() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v_ids([tg.alice])
.repeat(__.out_labels(&["knows"]))
.until(__.has_label("person"))
.to_list();
assert!(!results.is_empty());
}
#[test]
fn repeat_emit_all_intermediate() {
let org = create_org_graph();
let snapshot = org.snapshot();
let g = snapshot.gremlin();
let results = g
.v_ids([org.dev1])
.repeat(__.out_labels(&["reports_to"]))
.times(3)
.emit()
.to_list();
assert_eq!(results.len(), 3);
}
#[test]
fn repeat_emit_first() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v_ids([tg.alice])
.repeat(__.out_labels(&["knows"]))
.times(2)
.emit()
.emit_first()
.to_list();
assert_eq!(results.len(), 3);
let ids: Vec<_> = results.iter().filter_map(|v| v.as_vertex_id()).collect();
assert!(ids.contains(&tg.alice));
assert!(ids.contains(&tg.bob));
assert!(ids.contains(&tg.charlie));
}
#[test]
fn repeat_emit_if_condition() {
let org = create_org_graph();
let snapshot = org.snapshot();
let g = snapshot.gremlin();
let results = g
.v_ids([org.dev1])
.repeat(__.out_labels(&["reports_to"]))
.times(3)
.emit_if(__.has_where("level", p::lte(1i64)))
.to_list();
assert_eq!(results.len(), 2);
}
#[test]
fn repeat_emit_with_until() {
let org = create_org_graph();
let snapshot = org.snapshot();
let g = snapshot.gremlin();
let results = g
.v_ids([org.dev1])
.repeat(__.out_labels(&["reports_to"]))
.until(__.has_where("level", p::eq(0i64)))
.emit()
.to_list();
assert!(results.len() >= 3);
}
#[test]
fn repeat_with_path_tracking() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let paths = g
.v_ids([tg.alice])
.with_path()
.repeat(__.out_labels(&["knows"]))
.times(2)
.path()
.to_list();
assert_eq!(paths.len(), 1);
if let Value::List(path) = &paths[0] {
assert_eq!(path.len(), 3);
}
}
#[test]
fn repeat_emit_with_path() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let paths = g
.v_ids([tg.alice])
.with_path()
.repeat(__.out_labels(&["knows"]))
.times(2)
.emit()
.path()
.to_list();
assert_eq!(paths.len(), 2);
}
#[test]
fn repeat_with_dedup_avoids_revisit() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v_ids([tg.alice])
.repeat(__.out_labels(&["knows"]))
.times(6)
.emit()
.dedup()
.to_list();
assert!(results.len() <= 3);
}
#[test]
fn repeat_both_directions() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v_ids([tg.bob])
.repeat(__.both_labels(&["knows"]))
.times(1)
.dedup()
.to_list();
assert_eq!(results.len(), 2);
}
#[test]
fn repeat_both_multiple_hops() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v_ids([tg.bob])
.repeat(__.both_labels(&["knows"]))
.times(2)
.dedup()
.to_list();
assert!(!results.is_empty());
}
#[test]
fn repeat_with_filter_inside() {
let org = create_org_graph();
let snapshot = org.snapshot();
let g = snapshot.gremlin();
let results = g
.v_ids([org.dev1])
.repeat(__.out_labels(&["reports_to"]).has_label("employee"))
.times(3)
.to_list();
assert!(!results.is_empty());
}
#[test]
fn repeat_with_values_inside() {
let org = create_org_graph();
let snapshot = org.snapshot();
let g = snapshot.gremlin();
let names = g
.v_ids([org.dev1])
.repeat(__.out_labels(&["reports_to"]))
.times(3)
.emit()
.values("name")
.to_list();
assert_eq!(names.len(), 3);
assert!(names.contains(&Value::String("Eng Manager 1".to_string())));
assert!(names.contains(&Value::String("CTO".to_string())));
assert!(names.contains(&Value::String("CEO".to_string())));
}
#[test]
fn repeat_times_with_no_outgoing() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g.v_ids([tg.graphdb]).repeat(__.out()).times(3).to_list();
assert_eq!(results.len(), 1);
assert_eq!(results[0].as_vertex_id(), Some(tg.graphdb));
}
#[test]
fn repeat_from_leaf_with_emit_first() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v_ids([tg.graphdb])
.repeat(__.out())
.times(3)
.emit()
.emit_first()
.to_list();
assert_eq!(results.len(), 1);
assert_eq!(results[0].as_vertex_id(), Some(tg.graphdb));
}
#[test]
fn chained_repeat_equivalent_pattern() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results = g
.v_ids([tg.alice])
.repeat(__.out_labels(&["knows"]))
.times(2)
.to_list();
assert_eq!(results.len(), 1);
assert_eq!(results[0].as_vertex_id(), Some(tg.charlie));
}
#[test]
fn find_all_descendants() {
let org = create_org_graph();
let snapshot = org.snapshot();
let g = snapshot.gremlin();
let reports = g
.v_ids([org.ceo])
.repeat(__.in_labels(&["reports_to"]))
.times(4)
.emit()
.to_list();
assert_eq!(reports.len(), 9);
}
#[test]
fn find_all_ancestors() {
let org = create_org_graph();
let snapshot = org.snapshot();
let g = snapshot.gremlin();
let managers = g
.v_ids([org.dev1])
.repeat(__.out_labels(&["reports_to"]))
.times(3)
.emit()
.to_list();
assert_eq!(managers.len(), 3);
}
#[test]
fn count_hierarchy_depth() {
let org = create_org_graph();
let snapshot = org.snapshot();
let g = snapshot.gremlin();
let path = g
.v_ids([org.dev1])
.with_path()
.repeat(__.out_labels(&["reports_to"]))
.until(__.has_where("level", p::eq(0i64)))
.path()
.to_list();
if let Value::List(p) = &path[0] {
assert_eq!(p.len(), 4);
}
}