()
| 629 | |
| 630 | #[test] |
| 631 | fn empty_vertices_produce_auto_merge() { |
| 632 | let mut txn = MockTxn::new(); |
| 633 | let store = MemoryChangeStore::new(); |
| 634 | |
| 635 | // All three are empty content (structural inodes). |
| 636 | let hash = make_change(&store, b""); |
| 637 | let id = NodeId::new(1); |
| 638 | txn.register(id, hash); |
| 639 | |
| 640 | let engine = SemanticMergeEngine::new(&txn, &store); |
| 641 | |
| 642 | // Empty vertices: start == end. |
| 643 | let v1 = GraphNode::new(id, ChangePosition::new(0), ChangePosition::new(0)); |
| 644 | let v2 = GraphNode::new(id, ChangePosition::new(0), ChangePosition::new(0)); |
| 645 | let ancestor = GraphNode::new(id, ChangePosition::new(0), ChangePosition::new(0)); |
| 646 | |
| 647 | let group = ConflictGroup::new(vec![v1, v2]).with_ancestor(ancestor); |
| 648 | let outcome = engine.try_merge(&group).unwrap(); |
| 649 | |
| 650 | // Empty tokens on all sides → trivially merged. |
| 651 | assert!( |
| 652 | outcome.is_auto_merged(), |
| 653 | "expected AutoMerged for empty, got {:?}", |
| 654 | outcome |
| 655 | ); |
| 656 | assert!(outcome.content().is_empty()); |
| 657 | } |
| 658 | |
| 659 | // ---- SemanticMergeEngine: exposes references --------------------------- |
| 660 |
nothing calls this directly
no test coverage detected