use super::*;
#[test]
fn truncate_under_closed_graph_keeps_bound_type() {
let shared = SharedGraph::builder(GraphId::new(150))
.bound_to(person_graph_type())
.unwrap()
.build()
.unwrap();
let mut txn = shared.begin_write();
let (alice, bob) = {
let mut m = txn.mutator();
let alice = m
.create_node(
LabelSet::single(db_string("Person")),
prop("name", Value::String(db_string("Alice"))),
)
.unwrap();
let bob = m
.create_node(
LabelSet::single(db_string("Person")),
prop("name", Value::String(db_string("Bob"))),
)
.unwrap();
m.create_edge(
db_string("KNOWS"),
alice,
bob,
prop("since", Value::Int(2020)),
)
.unwrap();
(alice, bob)
};
txn.commit().unwrap();
assert_eq!(shared.read().node_count(), 2);
assert_eq!(shared.read().edge_count(), 1);
assert!(shared.is_closed());
let mut txn = shared.begin_write();
{
let mut m = txn.mutator();
m.truncate_node_type(db_string("Person")).unwrap();
}
txn.commit()
.expect("truncate under a closed graph commits — it removes instances, not the type");
{
let read = shared.read();
assert_eq!(read.node_count(), 0, "all Person instances removed");
assert_eq!(
read.edge_count(),
0,
"incident KNOWS edge removed — no dangling edge"
);
assert!(!read.is_node_alive(alice));
assert!(!read.is_node_alive(bob));
assert!(
read.nodes_with_label(&db_string("Person")).is_none(),
"Person label bucket cleared after truncate"
);
}
assert!(
shared.is_closed(),
"TRUNCATE keeps the graph closed / bound type intact"
);
let mut txn = shared.begin_write();
{
let mut m = txn.mutator();
m.create_node(
LabelSet::single(db_string("Person")),
prop("name", Value::String(db_string("Carol"))),
)
.unwrap();
}
txn.commit()
.expect("Person type still declared after truncate — a valid insert still commits");
assert_eq!(shared.read().node_count(), 1);
}