Skip to content

Commit 0d7d0d9

Browse files
Add tests for DisjointSetUnionBySize
1 parent 1d7e76c commit 0d7d0d9

File tree

1 file changed

+146
-0
lines changed

1 file changed

+146
-0
lines changed
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
package com.thealgorithms.datastructures.disjointsetunion;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertNotEquals;
5+
import static org.junit.jupiter.api.Assertions.assertNotNull;
6+
7+
import org.junit.jupiter.api.Test;
8+
9+
public class DisjointSetUnionBySizeTest {
10+
11+
@Test
12+
public void testMakeSet() {
13+
DisjointSetUnionBySize<Integer> dsu = new DisjointSetUnionBySize<>();
14+
DisjointSetUnionBySize.Node<Integer> node = dsu.makeSet(1);
15+
assertNotNull(node);
16+
assertEquals(node, node.parent);
17+
assertEquals(1, node.size);
18+
}
19+
20+
@Test
21+
public void testUnionFindSet() {
22+
DisjointSetUnionBySize<Integer> dsu = new DisjointSetUnionBySize<>();
23+
DisjointSetUnionBySize.Node<Integer> node1 = dsu.makeSet(1);
24+
DisjointSetUnionBySize.Node<Integer> node2 = dsu.makeSet(2);
25+
DisjointSetUnionBySize.Node<Integer> node3 = dsu.makeSet(3);
26+
DisjointSetUnionBySize.Node<Integer> node4 = dsu.makeSet(4);
27+
28+
dsu.unionSets(node1, node2);
29+
dsu.unionSets(node3, node2);
30+
dsu.unionSets(node3, node4);
31+
dsu.unionSets(node1, node3);
32+
33+
DisjointSetUnionBySize.Node<Integer> root1 = dsu.findSet(node1);
34+
DisjointSetUnionBySize.Node<Integer> root2 = dsu.findSet(node2);
35+
DisjointSetUnionBySize.Node<Integer> root3 = dsu.findSet(node3);
36+
DisjointSetUnionBySize.Node<Integer> root4 = dsu.findSet(node4);
37+
38+
assertEquals(root1, root2);
39+
assertEquals(root1, root3);
40+
assertEquals(root1, root4);
41+
assertEquals(4, root1.size);
42+
}
43+
44+
@Test
45+
public void testFindSetOnSingleNode() {
46+
DisjointSetUnionBySize<String> dsu = new DisjointSetUnionBySize<>();
47+
DisjointSetUnionBySize.Node<String> node = dsu.makeSet("A");
48+
assertEquals(node, dsu.findSet(node));
49+
}
50+
51+
@Test
52+
public void testUnionAlreadyConnectedNodes() {
53+
DisjointSetUnionBySize<Integer> dsu = new DisjointSetUnionBySize<>();
54+
DisjointSetUnionBySize.Node<Integer> node1 = dsu.makeSet(1);
55+
DisjointSetUnionBySize.Node<Integer> node2 = dsu.makeSet(2);
56+
DisjointSetUnionBySize.Node<Integer> node3 = dsu.makeSet(3);
57+
58+
dsu.unionSets(node1, node2);
59+
dsu.unionSets(node2, node3);
60+
61+
// Union nodes that are already connected
62+
dsu.unionSets(node1, node3);
63+
64+
// All should have the same root
65+
DisjointSetUnionBySize.Node<Integer> root = dsu.findSet(node1);
66+
assertEquals(root, dsu.findSet(node2));
67+
assertEquals(root, dsu.findSet(node3));
68+
assertEquals(3, root.size);
69+
}
70+
71+
@Test
72+
public void testMultipleMakeSets() {
73+
DisjointSetUnionBySize<Integer> dsu = new DisjointSetUnionBySize<>();
74+
DisjointSetUnionBySize.Node<Integer> node1 = dsu.makeSet(1);
75+
DisjointSetUnionBySize.Node<Integer> node2 = dsu.makeSet(2);
76+
DisjointSetUnionBySize.Node<Integer> node3 = dsu.makeSet(3);
77+
78+
assertNotEquals(node1, node2);
79+
assertNotEquals(node2, node3);
80+
assertNotEquals(node1, node3);
81+
82+
assertEquals(node1, node1.parent);
83+
assertEquals(node2, node2.parent);
84+
assertEquals(node3, node3.parent);
85+
assertEquals(1, node1.size);
86+
assertEquals(1, node2.size);
87+
assertEquals(1, node3.size);
88+
}
89+
90+
@Test
91+
public void testPathCompression() {
92+
DisjointSetUnionBySize<Integer> dsu = new DisjointSetUnionBySize<>();
93+
DisjointSetUnionBySize.Node<Integer> node1 = dsu.makeSet(1);
94+
DisjointSetUnionBySize.Node<Integer> node2 = dsu.makeSet(2);
95+
DisjointSetUnionBySize.Node<Integer> node3 = dsu.makeSet(3);
96+
97+
dsu.unionSets(node1, node2);
98+
dsu.unionSets(node2, node3);
99+
100+
// After findSet, path compression should update parent to root directly
101+
DisjointSetUnionBySize.Node<Integer> root = dsu.findSet(node3);
102+
assertEquals(root, node1);
103+
assertEquals(node1, node3.parent);
104+
assertEquals(3, root.size);
105+
}
106+
107+
@Test
108+
public void testMultipleDisjointSets() {
109+
DisjointSetUnionBySize<Integer> dsu = new DisjointSetUnionBySize<>();
110+
DisjointSetUnionBySize.Node<Integer> node1 = dsu.makeSet(1);
111+
DisjointSetUnionBySize.Node<Integer> node2 = dsu.makeSet(2);
112+
DisjointSetUnionBySize.Node<Integer> node3 = dsu.makeSet(3);
113+
DisjointSetUnionBySize.Node<Integer> node4 = dsu.makeSet(4);
114+
DisjointSetUnionBySize.Node<Integer> node5 = dsu.makeSet(5);
115+
DisjointSetUnionBySize.Node<Integer> node6 = dsu.makeSet(6);
116+
117+
// Create two separate components
118+
dsu.unionSets(node1, node2);
119+
dsu.unionSets(node2, node3);
120+
121+
dsu.unionSets(node4, node5);
122+
dsu.unionSets(node5, node6);
123+
124+
// Verify they are separate
125+
assertEquals(dsu.findSet(node1), dsu.findSet(node2));
126+
assertEquals(dsu.findSet(node2), dsu.findSet(node3));
127+
assertEquals(dsu.findSet(node4), dsu.findSet(node5));
128+
assertEquals(dsu.findSet(node5), dsu.findSet(node6));
129+
130+
assertNotEquals(dsu.findSet(node1), dsu.findSet(node4));
131+
assertNotEquals(dsu.findSet(node3), dsu.findSet(node6));
132+
}
133+
134+
@Test
135+
public void testEmptyValues() {
136+
DisjointSetUnionBySize<String> dsu = new DisjointSetUnionBySize<>();
137+
DisjointSetUnionBySize.Node<String> emptyNode = dsu.makeSet("");
138+
DisjointSetUnionBySize.Node<String> nullNode = dsu.makeSet(null);
139+
140+
assertEquals(emptyNode, dsu.findSet(emptyNode));
141+
assertEquals(nullNode, dsu.findSet(nullNode));
142+
143+
dsu.unionSets(emptyNode, nullNode);
144+
assertEquals(dsu.findSet(emptyNode), dsu.findSet(nullNode));
145+
}
146+
}

0 commit comments

Comments
 (0)