package com.thealgorithms.graph; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; class BronKerboschTest { @Test @DisplayName("Complete graph returns single clique") void completeGraph() { List> adjacency = buildGraph(4); addUndirectedEdge(adjacency, 0, 1); addUndirectedEdge(adjacency, 0, 2); addUndirectedEdge(adjacency, 0, 3); addUndirectedEdge(adjacency, 1, 2); addUndirectedEdge(adjacency, 1, 3); addUndirectedEdge(adjacency, 2, 3); List> cliques = BronKerbosch.findMaximalCliques(adjacency); assertEquals(1, cliques.size()); assertEquals(Set.of(0, 1, 2, 3), cliques.get(0)); } @Test @DisplayName("Path graph produces individual edges") void pathGraph() { List> adjacency = buildGraph(3); addUndirectedEdge(adjacency, 0, 1); addUndirectedEdge(adjacency, 1, 2); List> cliques = BronKerbosch.findMaximalCliques(adjacency); Set> result = new HashSet<>(cliques); Set> expected = Set.of(Set.of(0, 1), Set.of(1, 2)); assertEquals(expected, result); } @Test @DisplayName("Disconnected graph finds cliques per component") void disconnectedGraph() { List> adjacency = buildGraph(5); addUndirectedEdge(adjacency, 0, 1); addUndirectedEdge(adjacency, 0, 2); addUndirectedEdge(adjacency, 1, 2); addUndirectedEdge(adjacency, 3, 4); List> cliques = BronKerbosch.findMaximalCliques(adjacency); Set> result = new HashSet<>(cliques); Set> expected = Set.of(Set.of(0, 1, 2), Set.of(3, 4)); assertEquals(expected, result); } @Test @DisplayName("Null neighbor set triggers exception") void nullNeighborSet() { List> adjacency = new ArrayList<>(); adjacency.add(null); assertThrows(IllegalArgumentException.class, () -> BronKerbosch.findMaximalCliques(adjacency)); } private static List> buildGraph(int n) { List> graph = new ArrayList<>(n); for (int i = 0; i < n; i++) { graph.add(new HashSet<>()); } return graph; } private static void addUndirectedEdge(List> graph, int u, int v) { graph.get(u).add(v); graph.get(v).add(u); } }