UNPKG

@dxzmpk/js-algorithms-data-structures

Version:

Algorithms and data-structures implemented on JavaScript

233 lines (190 loc) 8.08 kB
import GraphVertex from '../../../../data-structures/graph/GraphVertex'; import GraphEdge from '../../../../data-structures/graph/GraphEdge'; import Graph from '../../../../data-structures/graph/Graph'; import articulationPoints from '../articulationPoints'; describe('articulationPoints', () => { it('should find articulation points in simple graph', () => { const vertexA = new GraphVertex('A'); const vertexB = new GraphVertex('B'); const vertexC = new GraphVertex('C'); const vertexD = new GraphVertex('D'); const edgeAB = new GraphEdge(vertexA, vertexB); const edgeBC = new GraphEdge(vertexB, vertexC); const edgeCD = new GraphEdge(vertexC, vertexD); const graph = new Graph(); graph .addEdge(edgeAB) .addEdge(edgeBC) .addEdge(edgeCD); const articulationPointsSet = Object.values(articulationPoints(graph)); expect(articulationPointsSet.length).toBe(2); expect(articulationPointsSet[0].getKey()).toBe(vertexC.getKey()); expect(articulationPointsSet[1].getKey()).toBe(vertexB.getKey()); }); it('should find articulation points in simple graph with back edge', () => { const vertexA = new GraphVertex('A'); const vertexB = new GraphVertex('B'); const vertexC = new GraphVertex('C'); const vertexD = new GraphVertex('D'); const edgeAB = new GraphEdge(vertexA, vertexB); const edgeBC = new GraphEdge(vertexB, vertexC); const edgeCD = new GraphEdge(vertexC, vertexD); const edgeAC = new GraphEdge(vertexA, vertexC); const graph = new Graph(); graph .addEdge(edgeAB) .addEdge(edgeAC) .addEdge(edgeBC) .addEdge(edgeCD); const articulationPointsSet = Object.values(articulationPoints(graph)); expect(articulationPointsSet.length).toBe(1); expect(articulationPointsSet[0].getKey()).toBe(vertexC.getKey()); }); it('should find articulation points in simple graph with back edge #2', () => { const vertexA = new GraphVertex('A'); const vertexB = new GraphVertex('B'); const vertexC = new GraphVertex('C'); const vertexD = new GraphVertex('D'); const vertexE = new GraphVertex('E'); const edgeAB = new GraphEdge(vertexA, vertexB); const edgeBC = new GraphEdge(vertexB, vertexC); const edgeCD = new GraphEdge(vertexC, vertexD); const edgeAE = new GraphEdge(vertexA, vertexE); const edgeCE = new GraphEdge(vertexC, vertexE); const graph = new Graph(); graph .addEdge(edgeAB) .addEdge(edgeAE) .addEdge(edgeCE) .addEdge(edgeBC) .addEdge(edgeCD); const articulationPointsSet = Object.values(articulationPoints(graph)); expect(articulationPointsSet.length).toBe(1); expect(articulationPointsSet[0].getKey()).toBe(vertexC.getKey()); }); it('should find articulation points in graph', () => { const vertexA = new GraphVertex('A'); const vertexB = new GraphVertex('B'); const vertexC = new GraphVertex('C'); const vertexD = new GraphVertex('D'); const vertexE = new GraphVertex('E'); const vertexF = new GraphVertex('F'); const vertexG = new GraphVertex('G'); const vertexH = new GraphVertex('H'); const edgeAB = new GraphEdge(vertexA, vertexB); const edgeBC = new GraphEdge(vertexB, vertexC); const edgeAC = new GraphEdge(vertexA, vertexC); const edgeCD = new GraphEdge(vertexC, vertexD); const edgeDE = new GraphEdge(vertexD, vertexE); const edgeEG = new GraphEdge(vertexE, vertexG); const edgeEF = new GraphEdge(vertexE, vertexF); const edgeGF = new GraphEdge(vertexG, vertexF); const edgeFH = new GraphEdge(vertexF, vertexH); const graph = new Graph(); graph .addEdge(edgeAB) .addEdge(edgeBC) .addEdge(edgeAC) .addEdge(edgeCD) .addEdge(edgeDE) .addEdge(edgeEG) .addEdge(edgeEF) .addEdge(edgeGF) .addEdge(edgeFH); const articulationPointsSet = Object.values(articulationPoints(graph)); expect(articulationPointsSet.length).toBe(4); expect(articulationPointsSet[0].getKey()).toBe(vertexF.getKey()); expect(articulationPointsSet[1].getKey()).toBe(vertexE.getKey()); expect(articulationPointsSet[2].getKey()).toBe(vertexD.getKey()); expect(articulationPointsSet[3].getKey()).toBe(vertexC.getKey()); }); it('should find articulation points in graph starting with articulation root vertex', () => { const vertexA = new GraphVertex('A'); const vertexB = new GraphVertex('B'); const vertexC = new GraphVertex('C'); const vertexD = new GraphVertex('D'); const vertexE = new GraphVertex('E'); const vertexF = new GraphVertex('F'); const vertexG = new GraphVertex('G'); const vertexH = new GraphVertex('H'); const edgeAB = new GraphEdge(vertexA, vertexB); const edgeBC = new GraphEdge(vertexB, vertexC); const edgeAC = new GraphEdge(vertexA, vertexC); const edgeCD = new GraphEdge(vertexC, vertexD); const edgeDE = new GraphEdge(vertexD, vertexE); const edgeEG = new GraphEdge(vertexE, vertexG); const edgeEF = new GraphEdge(vertexE, vertexF); const edgeGF = new GraphEdge(vertexG, vertexF); const edgeFH = new GraphEdge(vertexF, vertexH); const graph = new Graph(); graph .addEdge(edgeDE) .addEdge(edgeAB) .addEdge(edgeBC) .addEdge(edgeAC) .addEdge(edgeCD) .addEdge(edgeEG) .addEdge(edgeEF) .addEdge(edgeGF) .addEdge(edgeFH); const articulationPointsSet = Object.values(articulationPoints(graph)); expect(articulationPointsSet.length).toBe(4); expect(articulationPointsSet[0].getKey()).toBe(vertexF.getKey()); expect(articulationPointsSet[1].getKey()).toBe(vertexE.getKey()); expect(articulationPointsSet[2].getKey()).toBe(vertexC.getKey()); expect(articulationPointsSet[3].getKey()).toBe(vertexD.getKey()); }); it('should find articulation points in yet another graph #1', () => { const vertexA = new GraphVertex('A'); const vertexB = new GraphVertex('B'); const vertexC = new GraphVertex('C'); const vertexD = new GraphVertex('D'); const vertexE = new GraphVertex('E'); const edgeAB = new GraphEdge(vertexA, vertexB); const edgeAC = new GraphEdge(vertexA, vertexC); const edgeBC = new GraphEdge(vertexB, vertexC); const edgeCD = new GraphEdge(vertexC, vertexD); const edgeDE = new GraphEdge(vertexD, vertexE); const graph = new Graph(); graph .addEdge(edgeAB) .addEdge(edgeAC) .addEdge(edgeBC) .addEdge(edgeCD) .addEdge(edgeDE); const articulationPointsSet = Object.values(articulationPoints(graph)); expect(articulationPointsSet.length).toBe(2); expect(articulationPointsSet[0].getKey()).toBe(vertexD.getKey()); expect(articulationPointsSet[1].getKey()).toBe(vertexC.getKey()); }); it('should find articulation points in yet another graph #2', () => { const vertexA = new GraphVertex('A'); const vertexB = new GraphVertex('B'); const vertexC = new GraphVertex('C'); const vertexD = new GraphVertex('D'); const vertexE = new GraphVertex('E'); const vertexF = new GraphVertex('F'); const vertexG = new GraphVertex('G'); const edgeAB = new GraphEdge(vertexA, vertexB); const edgeAC = new GraphEdge(vertexA, vertexC); const edgeBC = new GraphEdge(vertexB, vertexC); const edgeCD = new GraphEdge(vertexC, vertexD); const edgeCE = new GraphEdge(vertexC, vertexE); const edgeCF = new GraphEdge(vertexC, vertexF); const edgeEG = new GraphEdge(vertexE, vertexG); const edgeFG = new GraphEdge(vertexF, vertexG); const graph = new Graph(); graph .addEdge(edgeAB) .addEdge(edgeAC) .addEdge(edgeBC) .addEdge(edgeCD) .addEdge(edgeCE) .addEdge(edgeCF) .addEdge(edgeEG) .addEdge(edgeFG); const articulationPointsSet = Object.values(articulationPoints(graph)); expect(articulationPointsSet.length).toBe(1); expect(articulationPointsSet[0].getKey()).toBe(vertexC.getKey()); }); });