#![allow(unused_variables)]
use interstellar::traversal::__;
use interstellar::value::Value;
use crate::common::graphs::create_small_graph;
#[test]
fn key_step_extracts_property_keys() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let keys: Vec<Value> = g.v_ids([tg.alice]).properties().key().to_list();
assert_eq!(keys.len(), 2);
let key_strings: Vec<String> = keys
.iter()
.filter_map(|v| {
if let Value::String(s) = v {
Some(s.clone())
} else {
None
}
})
.collect();
assert!(key_strings.contains(&"name".to_string()));
assert!(key_strings.contains(&"age".to_string()));
}
#[test]
fn value_step_extracts_property_values() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let values: Vec<Value> = g.v_ids([tg.alice]).properties().value().to_list();
assert_eq!(values.len(), 2);
assert!(values.contains(&Value::String("Alice".to_string())));
assert!(values.contains(&Value::Int(30)));
}
#[test]
fn key_and_value_work_with_filtered_properties() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let keys: Vec<Value> = g
.v_ids([tg.alice])
.properties_keys(["name"])
.key()
.to_list();
assert_eq!(keys, vec![Value::String("name".to_string())]);
let values: Vec<Value> = g
.v_ids([tg.alice])
.properties_keys(["name"])
.value()
.to_list();
assert_eq!(values, vec![Value::String("Alice".to_string())]);
}
#[test]
fn key_value_chain_on_all_vertices() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let names: Vec<Value> = g.v().properties_keys(["name"]).value().to_list();
assert_eq!(names.len(), 4);
assert!(names.contains(&Value::String("Alice".to_string())));
assert!(names.contains(&Value::String("Bob".to_string())));
assert!(names.contains(&Value::String("Charlie".to_string())));
assert!(names.contains(&Value::String("GraphDB".to_string())));
}
#[test]
fn loops_returns_zero_outside_repeat() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let loop_counts: Vec<Value> = g.v_ids([tg.alice]).loops().to_list();
assert_eq!(loop_counts, vec![Value::Int(0)]);
}
#[test]
fn loops_increments_within_repeat() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results: Vec<Value> = g
.v_ids([tg.alice])
.repeat(__.out_labels(&["knows"]))
.times(2)
.emit()
.loops()
.to_list();
assert!(!results.is_empty());
for result in &results {
if let Value::Int(n) = result {
assert!(*n >= 0 && *n <= 2);
}
}
}
#[test]
fn loops_with_until_condition() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results: Vec<Value> = g
.v_ids([tg.alice])
.repeat(__.out_labels(&["knows"]))
.until(__.has_value("name", "Charlie"))
.loops()
.to_list();
assert!(!results.is_empty());
}
#[test]
fn index_wraps_values_with_position() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let indexed: Vec<Value> = g.v().has_label("person").values("name").index().to_list();
assert_eq!(indexed.len(), 3);
for (expected_idx, result) in indexed.iter().enumerate() {
if let Value::List(pair) = result {
assert_eq!(pair.len(), 2);
assert_eq!(pair[1], Value::Int(expected_idx as i64));
} else {
panic!("Expected [value, index] pair");
}
}
}
#[test]
fn index_starts_at_zero() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let first: Option<Value> = g.inject([100i64, 200i64, 300i64]).index().next();
if let Some(Value::List(pair)) = first {
assert_eq!(pair[0], Value::Int(100));
assert_eq!(pair[1], Value::Int(0)); } else {
panic!("Expected [value, index] pair");
}
}
#[test]
fn index_preserves_traverser_metadata() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let results: Vec<Value> = g
.v_ids([tg.alice])
.as_("start")
.out_labels(&["knows"])
.values("name")
.index()
.to_list();
assert!(!results.is_empty());
for result in &results {
if let Value::List(pair) = result {
assert_eq!(pair.len(), 2);
} else {
panic!("Expected [value, index] pair");
}
}
}
#[test]
fn property_map_extracts_all_properties() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let maps: Vec<Value> = g.v_ids([tg.alice]).property_map().to_list();
assert_eq!(maps.len(), 1);
if let Value::Map(map) = &maps[0] {
assert!(map.contains_key("name"));
assert!(map.contains_key("age"));
if let Some(Value::List(name_list)) = map.get("name") {
assert_eq!(name_list.len(), 1);
if let Value::Map(prop_obj) = &name_list[0] {
assert_eq!(
prop_obj.get("key"),
Some(&Value::String("name".to_string()))
);
assert_eq!(
prop_obj.get("value"),
Some(&Value::String("Alice".to_string()))
);
}
} else {
panic!("Expected name to be a list");
}
} else {
panic!("Expected Value::Map");
}
}
#[test]
fn property_map_with_specific_keys() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let maps: Vec<Value> = g.v_ids([tg.alice]).property_map_keys(["name"]).to_list();
assert_eq!(maps.len(), 1);
if let Value::Map(map) = &maps[0] {
assert!(map.contains_key("name"));
assert!(!map.contains_key("age"));
} else {
panic!("Expected Value::Map");
}
}
#[test]
fn property_map_on_edges() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let maps: Vec<Value> = g.e_ids([tg.alice_knows_bob]).property_map().to_list();
assert_eq!(maps.len(), 1);
if let Value::Map(map) = &maps[0] {
assert!(map.contains_key("since"));
if let Some(Value::List(since_list)) = map.get("since") {
assert_eq!(since_list.len(), 1);
if let Value::Map(prop_obj) = &since_list[0] {
assert_eq!(
prop_obj.get("key"),
Some(&Value::String("since".to_string()))
);
assert_eq!(prop_obj.get("value"), Some(&Value::Int(2020)));
}
}
} else {
panic!("Expected Value::Map");
}
}
#[test]
fn property_map_returns_empty_for_non_elements() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let maps: Vec<Value> = g.inject([42i64]).property_map().to_list();
assert_eq!(maps.len(), 1);
if let Value::Map(map) = &maps[0] {
assert!(map.is_empty());
} else {
panic!("Expected Value::Map");
}
}
#[test]
fn key_value_difference_from_values() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let direct_values: Vec<Value> = g.v_ids([tg.alice]).values("name").to_list();
assert_eq!(direct_values, vec![Value::String("Alice".to_string())]);
let prop_values: Vec<Value> = g
.v_ids([tg.alice])
.properties_keys(["name"])
.value()
.to_list();
assert_eq!(prop_values, vec![Value::String("Alice".to_string())]);
assert_eq!(direct_values, prop_values);
}
#[test]
fn value_map_vs_property_map() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let value_maps: Vec<Value> = g.v_ids([tg.alice]).value_map().to_list();
let property_maps: Vec<Value> = g.v_ids([tg.alice]).property_map().to_list();
assert_eq!(value_maps.len(), 1);
assert_eq!(property_maps.len(), 1);
if let Value::Map(vmap) = &value_maps[0] {
if let Some(Value::List(name_list)) = vmap.get("name") {
assert_eq!(name_list[0], Value::String("Alice".to_string()));
}
}
if let Value::Map(pmap) = &property_maps[0] {
if let Some(Value::List(name_list)) = pmap.get("name") {
if let Value::Map(prop_obj) = &name_list[0] {
assert_eq!(
prop_obj.get("value"),
Some(&Value::String("Alice".to_string()))
);
}
}
}
}
#[test]
fn index_with_dedup() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let indexed: Vec<Value> = g
.v()
.has_label("person")
.out_labels(&["knows"])
.dedup()
.values("name")
.index()
.to_list();
for (i, result) in indexed.iter().enumerate() {
if let Value::List(pair) = result {
assert_eq!(pair[1], Value::Int(i as i64));
}
}
}
#[test]
fn anonymous_traversal_key_value() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let keys: Vec<Value> = g.v_ids([tg.alice]).properties().local(__.key()).to_list();
assert_eq!(keys.len(), 2);
let values: Vec<Value> = g.v_ids([tg.alice]).properties().local(__.value()).to_list();
assert_eq!(values.len(), 2);
}
#[test]
fn anonymous_traversal_index() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let indexed: Vec<Value> = g.inject([1i64, 2i64, 3i64]).local(__.index()).to_list();
assert_eq!(indexed.len(), 3);
}
#[test]
fn anonymous_traversal_property_map() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let maps: Vec<Value> = g.v_ids([tg.alice]).local(__.property_map()).to_list();
assert_eq!(maps.len(), 1);
if let Value::Map(map) = &maps[0] {
assert!(map.contains_key("name"));
assert!(map.contains_key("age"));
}
}
#[test]
fn complex_metadata_pipeline() {
let tg = create_small_graph();
let snapshot = tg.graph.snapshot();
let g = snapshot.gremlin();
let indexed_keys: Vec<Value> = g
.v()
.has_label("person")
.properties()
.key()
.dedup()
.index()
.to_list();
assert_eq!(indexed_keys.len(), 2);
for (i, result) in indexed_keys.iter().enumerate() {
if let Value::List(pair) = result {
assert_eq!(pair.len(), 2);
assert_eq!(pair[1], Value::Int(i as i64));
}
}
}