testing: improve DisjointSetUnionTest (#6440)

* testing: improve DisjointSetUnionTest

* testing: redundant variable for DisjointSetUnionTest
This commit is contained in:
Oleksandr Klymenko
2025-07-25 20:04:52 +02:00
committed by GitHub
parent 040d3850ac
commit 032f75c0f4

View File

@@ -122,4 +122,109 @@ public class DisjointSetUnionTest {
assertEquals(root, node1);
assertEquals(node1, node3.parent);
}
@Test
public void testUnionByRankSmallerToLarger() {
DisjointSetUnion<Integer> dsu = new DisjointSetUnion<>();
Node<Integer> node1 = dsu.makeSet(1);
Node<Integer> node2 = dsu.makeSet(2);
Node<Integer> node3 = dsu.makeSet(3);
// Create tree with node1 as root and rank 1
dsu.unionSets(node1, node2);
assertEquals(1, node1.rank);
assertEquals(0, node2.rank);
// Union single node (rank 0) with tree (rank 1)
// Smaller rank tree should attach to larger rank tree
dsu.unionSets(node3, node1);
assertEquals(node1, dsu.findSet(node3));
assertEquals(1, node1.rank); // Rank should not increase
}
@Test
public void testUnionByRankEqualRanks() {
DisjointSetUnion<Integer> dsu = new DisjointSetUnion<>();
Node<Integer> node1 = dsu.makeSet(1);
Node<Integer> node2 = dsu.makeSet(2);
Node<Integer> node3 = dsu.makeSet(3);
Node<Integer> node4 = dsu.makeSet(4);
// Create two trees of equal rank (1)
dsu.unionSets(node1, node2);
dsu.unionSets(node3, node4);
assertEquals(1, node1.rank);
assertEquals(1, node3.rank);
// Union two trees of equal rank
dsu.unionSets(node1, node3);
Node<Integer> root = dsu.findSet(node1);
assertEquals(2, root.rank); // Rank should increase by 1
}
@Test
public void testLargeChainPathCompression() {
DisjointSetUnion<Integer> dsu = new DisjointSetUnion<>();
Node<Integer> node1 = dsu.makeSet(1);
Node<Integer> node2 = dsu.makeSet(2);
Node<Integer> node3 = dsu.makeSet(3);
Node<Integer> node4 = dsu.makeSet(4);
Node<Integer> node5 = dsu.makeSet(5);
// Create a long chain: 1 -> 2 -> 3 -> 4 -> 5
dsu.unionSets(node1, node2);
dsu.unionSets(node2, node3);
dsu.unionSets(node3, node4);
dsu.unionSets(node4, node5);
// Find from the deepest node
Node<Integer> root = dsu.findSet(node5);
// Path compression should make all nodes point directly to root
assertEquals(root, node5.parent);
assertEquals(root, node4.parent);
assertEquals(root, node3.parent);
assertEquals(root, node2.parent);
assertEquals(root, node1.parent);
}
@Test
public void testMultipleDisjointSets() {
DisjointSetUnion<Integer> dsu = new DisjointSetUnion<>();
Node<Integer> node1 = dsu.makeSet(1);
Node<Integer> node2 = dsu.makeSet(2);
Node<Integer> node3 = dsu.makeSet(3);
Node<Integer> node4 = dsu.makeSet(4);
Node<Integer> node5 = dsu.makeSet(5);
Node<Integer> node6 = dsu.makeSet(6);
// Create two separate components
dsu.unionSets(node1, node2);
dsu.unionSets(node2, node3);
dsu.unionSets(node4, node5);
dsu.unionSets(node5, node6);
// Verify they are separate
assertEquals(dsu.findSet(node1), dsu.findSet(node2));
assertEquals(dsu.findSet(node2), dsu.findSet(node3));
assertEquals(dsu.findSet(node4), dsu.findSet(node5));
assertEquals(dsu.findSet(node5), dsu.findSet(node6));
assertNotEquals(dsu.findSet(node1), dsu.findSet(node4));
assertNotEquals(dsu.findSet(node3), dsu.findSet(node6));
}
@Test
public void testEmptyValues() {
DisjointSetUnion<String> dsu = new DisjointSetUnion<>();
Node<String> emptyNode = dsu.makeSet("");
Node<String> nullNode = dsu.makeSet(null);
assertEquals(emptyNode, dsu.findSet(emptyNode));
assertEquals(nullNode, dsu.findSet(nullNode));
dsu.unionSets(emptyNode, nullNode);
assertEquals(dsu.findSet(emptyNode), dsu.findSet(nullNode));
}
}