1+ import { AdjacencyList } from './adj-list' ;
2+
3+ describe ( 'Adjacency List' , ( ) => {
4+ let adjList ;
5+ beforeEach ( ( ) => {
6+ adjList = new AdjacencyList ( true ) ;
7+ } ) ;
8+
9+ it ( 'should create adjacency list object' , ( ) => {
10+ expect ( adjList ) . toBeDefined ( ) ;
11+ expect ( adjList . vertices ) . toBeDefined ( ) ;
12+ } ) ;
13+
14+ it ( 'should have empty vertices when adjacency list object is created' , ( ) => {
15+ expect ( adjList . vertices . size ) . toBe ( 0 ) ;
16+ } ) ;
17+
18+ it ( 'should add node through addNode method' , ( ) => {
19+ expect ( adjList . vertices . size ) . toBe ( 0 ) ;
20+
21+ adjList . addNode ( 'A' ) ;
22+ expect ( adjList . vertices . size ) . toBe ( 1 ) ;
23+ expect ( adjList . vertices . get ( 'A' ) . len ) . toBe ( 0 ) ;
24+
25+ adjList . addNode ( 'B' ) ;
26+ expect ( adjList . vertices . size ) . toBe ( 2 ) ;
27+ expect ( adjList . vertices . get ( 'B' ) . len ) . toBe ( 0 ) ;
28+ } ) ;
29+
30+ it ( 'should delete the node from the map' , ( ) => {
31+ expect ( adjList . vertices . size ) . toBe ( 0 ) ;
32+
33+ adjList . addNode ( 'A' ) ;
34+ expect ( adjList . vertices . size ) . toBe ( 1 ) ;
35+
36+ adjList . removeNode ( 'A' ) ;
37+ expect ( adjList . vertices . size ) . toBe ( 0 ) ;
38+ expect ( adjList . vertices . has ( 'A' ) ) . toBeFalsy ( ) ;
39+ } ) ;
40+
41+ describe ( 'Insert Operation' , ( ) => {
42+ let unDirectedGraph ;
43+ beforeEach ( ( ) => {
44+ unDirectedGraph = new AdjacencyList ( false ) ;
45+
46+ adjList . addNode ( 'A' ) ;
47+ adjList . addNode ( 'B' ) ;
48+ } ) ;
49+
50+ it ( 'should add an edge of weight 20 between A and B' , ( ) => {
51+ adjList . addEdge ( 'A' , 'B' , 200 ) ;
52+ const vertexA = adjList . vertices . get ( 'A' ) ;
53+ expect ( vertexA . len ) . toBe ( 1 ) ;
54+
55+ const lookupB = vertexA . lookup ( 'B' ) ;
56+ expect ( lookupB . hasVal ) . toBeTruthy ( ) ;
57+ expect ( lookupB . currentNode . details . weight ) . toBe ( 200 ) ;
58+ } ) ;
59+ it ( 'should add edge between B and C' , ( ) => {
60+ expect ( adjList . vertices . size ) . toBe ( 2 ) ;
61+
62+ adjList . addEdge ( 'B' , 'C' ) ;
63+ expect ( adjList . vertices . size ) . toBe ( 3 ) ;
64+ const vertexB = adjList . vertices . get ( 'B' ) ;
65+ expect ( vertexB . len ) . toBe ( 1 ) ;
66+
67+ const lookupC = vertexB . lookup ( 'C' ) ;
68+ expect ( lookupC . hasVal ) . toBeTruthy ( ) ;
69+ expect ( lookupC . currentNode . details . weight ) . toBe ( undefined ) ;
70+ } ) ;
71+ it ( 'should add edge A and B in undirected graph' , ( ) => {
72+ expect ( unDirectedGraph . vertices . size ) . toBe ( 0 ) ;
73+
74+ unDirectedGraph . addEdge ( 'A' , 'B' ) ;
75+ expect ( unDirectedGraph . vertices . size ) . toBe ( 2 ) ;
76+
77+ const vertexA = unDirectedGraph . vertices . get ( 'A' ) ;
78+ expect ( vertexA . len ) . toBe ( 1 ) ;
79+ const lookupB = vertexA . lookup ( 'B' ) ;
80+ expect ( lookupB . hasVal ) . toBeTruthy ( ) ;
81+
82+ const vertexB = unDirectedGraph . vertices . get ( 'B' ) ;
83+ expect ( vertexB . len ) . toBe ( 1 ) ;
84+ const lookupA = vertexB . lookup ( 'A' ) ;
85+ expect ( lookupA . hasVal ) . toBeTruthy ( ) ;
86+ } ) ;
87+ } ) ;
88+
89+ describe ( 'Delete Edge Operation' , ( ) => {
90+ beforeEach ( ( ) => {
91+ adjList . addEdge ( 'A' , 'B' ) ;
92+ adjList . addEdge ( 'A' , 'C' ) ;
93+ } ) ;
94+
95+ it ( 'should delete edge A -> C' , ( ) => {
96+ expect ( adjList . vertices . size ) . toBe ( 3 ) ;
97+ const vertexA = adjList . vertices . get ( 'A' ) ;
98+ expect ( vertexA . len ) . toBe ( 2 ) ;
99+ expect ( vertexA . lookup ( 'C' ) . hasVal ) . toBeTruthy ( ) ;
100+ adjList . removeEdge ( 'A' , 'C' ) ;
101+ expect ( vertexA . len ) . toBe ( 1 ) ;
102+ expect ( vertexA . lookup ( 'C' ) . hasVal ) . toBeFalsy ( ) ;
103+ } ) ;
104+ it ( 'should return error while deleting edge D -> A' , ( ) => {
105+ expect ( adjList . removeEdge ( 'D' , 'A' ) . message ) . toBe ( 'No edge present between D and A' ) ;
106+ } ) ;
107+
108+ describe ( 'For undirectional Graph' , ( ) => {
109+ let undirectedList ;
110+ beforeEach ( ( ) => {
111+ undirectedList = new AdjacencyList ( false ) ;
112+ undirectedList . addEdge ( 'A' , 'B' ) ;
113+ undirectedList . addEdge ( 'A' , 'C' ) ;
114+ } ) ;
115+
116+ it ( 'should delete edge A -> C and edge C -> A' , ( ) => {
117+ expect ( undirectedList . vertices . size ) . toBe ( 3 ) ;
118+ const msg = undirectedList . removeEdge ( 'A' , 'C' ) ;
119+ expect ( undirectedList . vertices . get ( 'A' ) . lookup ( 'C' ) . hasVal ) . toBeFalsy ( ) ;
120+ expect ( undirectedList . vertices . get ( 'C' ) . lookup ( 'A' ) . hasVal ) . toBeFalsy ( ) ;
121+ expect ( msg ) . toBe ( void 0 ) ;
122+ } ) ;
123+ } ) ;
124+ } ) ;
125+
126+ describe ( 'Delete Vertex Operation' , ( ) => {
127+ beforeEach ( ( ) => {
128+ adjList . addEdge ( 'A' , 'B' ) ;
129+ adjList . addEdge ( 'A' , 'C' ) ;
130+ } ) ;
131+
132+ it ( 'should delete vertex C and finally edge A -> C' , ( ) => {
133+ expect ( adjList . vertices . size ) . toBe ( 3 ) ;
134+ expect ( adjList . vertices . get ( 'A' ) . len ) . toBe ( 2 ) ;
135+ expect ( adjList . vertices . get ( 'A' ) . lookup ( 'C' ) . hasVal ) . toBeTruthy ( ) ;
136+
137+ adjList . removeNode ( 'C' ) ;
138+ expect ( adjList . vertices . size ) . toBe ( 2 ) ;
139+ expect ( adjList . vertices . get ( 'A' ) . len ) . toBe ( 1 ) ;
140+ expect ( adjList . vertices . get ( 'A' ) . lookup ( 'C' ) . hasVal ) . toBeFalsy ( ) ;
141+ } ) ;
142+
143+ describe ( 'For undirectional Graph' , ( ) => {
144+ let undirectedList ;
145+ beforeEach ( ( ) => {
146+ undirectedList = new AdjacencyList ( false ) ;
147+ undirectedList . addEdge ( 'A' , 'B' ) ;
148+ undirectedList . addEdge ( 'A' , 'C' ) ;
149+ } ) ;
150+
151+ it ( 'should delete node C and also vertices A -> C and C -> A' , ( ) => {
152+ expect ( undirectedList . vertices . size ) . toBe ( 3 ) ;
153+ expect ( undirectedList . vertices . get ( 'A' ) . len ) . toBe ( 2 ) ;
154+ expect ( undirectedList . vertices . get ( 'A' ) . lookup ( 'C' ) . hasVal ) . toBeTruthy ( ) ;
155+ expect ( undirectedList . vertices . get ( 'C' ) . len ) . toBe ( 1 ) ;
156+ expect ( undirectedList . vertices . get ( 'C' ) . lookup ( 'A' ) . hasVal ) . toBeTruthy ( ) ;
157+
158+ undirectedList . removeNode ( 'C' ) ;
159+
160+ expect ( undirectedList . vertices . size ) . toBe ( 2 ) ;
161+ expect ( undirectedList . vertices . get ( 'A' ) . len ) . toBe ( 1 ) ;
162+ expect ( undirectedList . vertices . get ( 'A' ) . lookup ( 'C' ) . hasVal ) . toBeFalsy ( ) ;
163+ expect ( undirectedList . vertices . has ( 'C' ) ) . toBeFalsy ( ) ;
164+ } ) ;
165+ } ) ;
166+ } ) ;
167+
168+ describe ( 'Get edge weight' , ( ) => {
169+ beforeEach ( ( ) => {
170+ adjList . addEdge ( 'A' , 'B' , 200 ) ;
171+ adjList . addEdge ( 'A' , 'C' , 150 ) ;
172+ adjList . addEdge ( 'B' , 'C' , 250 ) ;
173+ } ) ;
174+
175+ it ( 'should get 200 as weight between edge A and B' , ( ) => {
176+ const weight = adjList . getEdgeWeight ( 'A' , 'B' ) ;
177+ expect ( weight ) . toBe ( 200 ) ;
178+ } ) ;
179+ it ( 'should get 150 as weight between edge A and C' , ( ) => {
180+ const weight = adjList . getEdgeWeight ( 'A' , 'C' ) ;
181+ expect ( weight ) . toBe ( 150 ) ;
182+ } ) ;
183+ it ( 'should get Error for weight between edge A and D' , ( ) => {
184+ const weight = adjList . getEdgeWeight ( 'A' , 'D' ) ;
185+ expect ( weight . message ) . toBe ( 'Edge not found between A and D' ) ;
186+ } ) ;
187+ it ( 'should get Error for weight between edge D and A' , ( ) => {
188+ const weight = adjList . getEdgeWeight ( 'D' , 'A' ) ;
189+ expect ( weight . message ) . toBe ( 'Edge not found between D and A' ) ;
190+ } ) ;
191+ } ) ;
192+ } ) ;
0 commit comments