data-structure-typed 1.39.0 → 1.39.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +2 -2
  3. package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
  4. package/dist/cjs/data-structures/binary-tree/binary-indexed-tree.js.map +1 -1
  5. package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +86 -32
  6. package/dist/cjs/data-structures/binary-tree/binary-tree.js +8 -8
  7. package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
  8. package/dist/cjs/data-structures/binary-tree/bst.d.ts +6 -6
  9. package/dist/cjs/data-structures/binary-tree/bst.js +2 -2
  10. package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
  11. package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
  12. package/dist/cjs/data-structures/binary-tree/tree-multiset.d.ts +2 -2
  13. package/dist/cjs/data-structures/binary-tree/tree-multiset.js.map +1 -1
  14. package/dist/cjs/data-structures/graph/abstract-graph.d.ts +1 -1
  15. package/dist/cjs/data-structures/graph/abstract-graph.js +1 -1
  16. package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
  17. package/dist/cjs/data-structures/graph/directed-graph.js.map +1 -1
  18. package/dist/cjs/data-structures/graph/map-graph.d.ts +1 -1
  19. package/dist/cjs/data-structures/graph/map-graph.js +1 -1
  20. package/dist/cjs/data-structures/graph/map-graph.js.map +1 -1
  21. package/dist/cjs/data-structures/graph/undirected-graph.js.map +1 -1
  22. package/dist/cjs/data-structures/hash/hash-map.js.map +1 -1
  23. package/dist/cjs/data-structures/hash/tree-map.js.map +1 -1
  24. package/dist/cjs/data-structures/hash/tree-set.js.map +1 -1
  25. package/dist/cjs/data-structures/heap/heap.js.map +1 -1
  26. package/dist/cjs/data-structures/heap/max-heap.js.map +1 -1
  27. package/dist/cjs/data-structures/heap/min-heap.js.map +1 -1
  28. package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
  29. package/dist/cjs/data-structures/matrix/matrix.js.map +1 -1
  30. package/dist/cjs/data-structures/matrix/matrix2d.d.ts +1 -2
  31. package/dist/cjs/data-structures/matrix/matrix2d.js +3 -7
  32. package/dist/cjs/data-structures/matrix/matrix2d.js.map +1 -1
  33. package/dist/cjs/data-structures/matrix/vector2d.d.ts +0 -1
  34. package/dist/cjs/data-structures/matrix/vector2d.js +0 -1
  35. package/dist/cjs/data-structures/matrix/vector2d.js.map +1 -1
  36. package/dist/cjs/data-structures/priority-queue/max-priority-queue.js.map +1 -1
  37. package/dist/cjs/data-structures/priority-queue/min-priority-queue.js.map +1 -1
  38. package/dist/cjs/data-structures/priority-queue/priority-queue.js.map +1 -1
  39. package/dist/cjs/data-structures/queue/deque.js.map +1 -1
  40. package/dist/cjs/data-structures/queue/queue.js.map +1 -1
  41. package/dist/cjs/interfaces/binary-tree.d.ts +2 -2
  42. package/dist/cjs/types/data-structures/binary-tree/binary-tree.d.ts +0 -2
  43. package/dist/cjs/types/helpers.d.ts +1 -4
  44. package/dist/cjs/types/helpers.js.map +1 -1
  45. package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +2 -2
  46. package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +86 -32
  47. package/dist/mjs/data-structures/binary-tree/binary-tree.js +8 -8
  48. package/dist/mjs/data-structures/binary-tree/bst.d.ts +6 -6
  49. package/dist/mjs/data-structures/binary-tree/bst.js +2 -2
  50. package/dist/mjs/data-structures/binary-tree/tree-multiset.d.ts +2 -2
  51. package/dist/mjs/data-structures/graph/abstract-graph.d.ts +1 -1
  52. package/dist/mjs/data-structures/graph/abstract-graph.js +1 -1
  53. package/dist/mjs/data-structures/graph/map-graph.d.ts +1 -1
  54. package/dist/mjs/data-structures/graph/map-graph.js +1 -1
  55. package/dist/mjs/data-structures/matrix/matrix2d.d.ts +1 -2
  56. package/dist/mjs/data-structures/matrix/matrix2d.js +3 -7
  57. package/dist/mjs/data-structures/matrix/vector2d.d.ts +0 -1
  58. package/dist/mjs/data-structures/matrix/vector2d.js +0 -1
  59. package/dist/mjs/interfaces/binary-tree.d.ts +2 -2
  60. package/dist/mjs/types/data-structures/binary-tree/binary-tree.d.ts +0 -2
  61. package/dist/mjs/types/helpers.d.ts +1 -4
  62. package/dist/umd/data-structure-typed.min.js +1 -1
  63. package/dist/umd/data-structure-typed.min.js.map +1 -1
  64. package/package.json +5 -5
  65. package/src/data-structures/binary-tree/avl-tree.ts +5 -4
  66. package/src/data-structures/binary-tree/binary-indexed-tree.ts +1 -1
  67. package/src/data-structures/binary-tree/binary-tree.ts +37 -93
  68. package/src/data-structures/binary-tree/bst.ts +11 -17
  69. package/src/data-structures/binary-tree/rb-tree.ts +2 -1
  70. package/src/data-structures/binary-tree/tree-multiset.ts +4 -3
  71. package/src/data-structures/graph/abstract-graph.ts +12 -11
  72. package/src/data-structures/graph/directed-graph.ts +2 -1
  73. package/src/data-structures/graph/map-graph.ts +2 -2
  74. package/src/data-structures/graph/undirected-graph.ts +5 -4
  75. package/src/data-structures/hash/hash-map.ts +1 -1
  76. package/src/data-structures/hash/tree-map.ts +1 -2
  77. package/src/data-structures/hash/tree-set.ts +1 -2
  78. package/src/data-structures/heap/heap.ts +2 -2
  79. package/src/data-structures/heap/max-heap.ts +1 -1
  80. package/src/data-structures/heap/min-heap.ts +1 -1
  81. package/src/data-structures/linked-list/singly-linked-list.ts +1 -1
  82. package/src/data-structures/matrix/matrix.ts +1 -1
  83. package/src/data-structures/matrix/matrix2d.ts +1 -3
  84. package/src/data-structures/matrix/vector2d.ts +1 -4
  85. package/src/data-structures/priority-queue/max-priority-queue.ts +1 -1
  86. package/src/data-structures/priority-queue/min-priority-queue.ts +1 -1
  87. package/src/data-structures/priority-queue/priority-queue.ts +1 -1
  88. package/src/data-structures/queue/deque.ts +4 -5
  89. package/src/data-structures/queue/queue.ts +1 -1
  90. package/src/interfaces/binary-tree.ts +2 -2
  91. package/src/types/data-structures/binary-tree/binary-tree.ts +0 -4
  92. package/src/types/data-structures/matrix/navigator.ts +1 -1
  93. package/src/types/helpers.ts +1 -7
  94. package/src/types/utils/utils.ts +1 -1
  95. package/src/types/utils/validate-type.ts +2 -2
  96. package/test/integration/bst.test.ts +1 -1
  97. package/test/unit/data-structures/binary-tree/avl-tree.test.ts +142 -2
  98. package/test/unit/data-structures/binary-tree/binary-tree.test.ts +270 -48
  99. package/test/unit/data-structures/binary-tree/bst.test.ts +394 -4
  100. package/test/unit/data-structures/binary-tree/overall.test.ts +1 -1
  101. package/test/unit/data-structures/binary-tree/rb-tree.test.ts +73 -7
  102. package/test/unit/data-structures/binary-tree/tree-multiset.test.ts +242 -187
  103. package/test/unit/data-structures/graph/directed-graph.test.ts +34 -4
  104. package/test/unit/data-structures/graph/map-graph.test.ts +82 -1
  105. package/test/unit/data-structures/graph/undirected-graph.test.ts +82 -0
  106. package/test/unit/data-structures/heap/heap.test.ts +2 -2
  107. package/test/unit/data-structures/linked-list/doubly-linked-list.test.ts +1 -1
  108. package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +3 -3
  109. package/test/unit/data-structures/matrix/matrix2d.test.ts +207 -0
  110. package/test/unit/data-structures/matrix/navigator.test.ts +166 -1
  111. package/test/unit/data-structures/matrix/vector2d.test.ts +171 -0
  112. package/test/unit/data-structures/priority-queue/max-priority-queue.test.ts +2 -2
  113. package/test/unit/data-structures/queue/deque.test.ts +264 -1
  114. package/test/unit/data-structures/queue/queue.test.ts +3 -1
  115. package/test/utils/big-o.ts +1 -1
@@ -57,3 +57,85 @@ describe('UndirectedGraph Operation Test', () => {
57
57
  expect(Array.from(dijkstraResult?.seen ?? []).map(vertex => vertex.key)).toEqual(['A', 'B', 'D']);
58
58
  });
59
59
  });
60
+
61
+ describe('UndirectedGraph', () => {
62
+ let undirectedGraph: UndirectedGraph<UndirectedVertex<string>, UndirectedEdge<string>>;
63
+
64
+ beforeEach(() => {
65
+ // Create a new UndirectedGraph instance before each test
66
+ undirectedGraph = new UndirectedGraph<UndirectedVertex<string>, UndirectedEdge<string>>();
67
+ });
68
+
69
+ // Test adding vertices to the graph
70
+ it('should add vertices to the graph', () => {
71
+ const vertexA = new UndirectedVertex('A', 'Location A');
72
+ const vertexB = new UndirectedVertex('B', 'Location B');
73
+
74
+ undirectedGraph.addVertex(vertexA);
75
+ undirectedGraph.addVertex(vertexB);
76
+
77
+ expect(undirectedGraph.hasVertex('A')).toBe(true);
78
+ expect(undirectedGraph.hasVertex('B')).toBe(true);
79
+ });
80
+
81
+ // Test adding edges to the graph
82
+ it('should add edges to the graph', () => {
83
+ const vertexA = new UndirectedVertex('A', 'Location A');
84
+ const vertexB = new UndirectedVertex('B', 'Location B');
85
+ const edgeAB = new UndirectedEdge('A', 'B', 1, 'Edge between A and B');
86
+
87
+ undirectedGraph.addVertex(vertexA);
88
+ undirectedGraph.addVertex(vertexB);
89
+ undirectedGraph.addEdge(edgeAB);
90
+
91
+ expect(undirectedGraph.hasEdge('A', 'B')).toBe(true);
92
+ });
93
+
94
+ // Test getting neighbors of a vertex
95
+ it('should return the neighbors of a vertex', () => {
96
+ const vertexA = new UndirectedVertex('A', 'Location A');
97
+ const vertexB = new UndirectedVertex('B', 'Location B');
98
+ const vertexC = new UndirectedVertex('C', 'Location C');
99
+ const edgeAB = new UndirectedEdge('A', 'B', 1, 'Edge between A and B');
100
+ const edgeBC = new UndirectedEdge('B', 'C', 2, 'Edge between B and C');
101
+
102
+ undirectedGraph.addVertex(vertexA);
103
+ undirectedGraph.addVertex(vertexB);
104
+ undirectedGraph.addVertex(vertexC);
105
+ undirectedGraph.addEdge(edgeAB);
106
+ undirectedGraph.addEdge(edgeBC);
107
+
108
+ const neighborsOfA = undirectedGraph.getNeighbors('A');
109
+ const neighborsOfB = undirectedGraph.getNeighbors('B');
110
+
111
+ expect(neighborsOfA).toEqual([vertexB]);
112
+ expect(neighborsOfB).toEqual([vertexA, vertexC]);
113
+ });
114
+
115
+ // Test degree of a vertex
116
+ it('should return the degree of a vertex', () => {
117
+ const vertexA = new UndirectedVertex('A', 'Location A');
118
+ const vertexB = new UndirectedVertex('B', 'Location B');
119
+ const vertexC = new UndirectedVertex('C', 'Location C');
120
+ const edgeAB = new UndirectedEdge('A', 'B', 3, 'Edge between A and B');
121
+ const edgeBC = new UndirectedEdge('B', 'C', 4, 'Edge between B and C');
122
+
123
+ edgeAB.vertices = edgeAB.vertices;
124
+ expect(undirectedGraph.edges.size).toBe(0);
125
+ undirectedGraph.addVertex(vertexA);
126
+ undirectedGraph.addVertex(vertexB);
127
+ undirectedGraph.addVertex(vertexC);
128
+ undirectedGraph.addEdge(edgeAB);
129
+ undirectedGraph.addEdge(edgeBC);
130
+
131
+ const degreeOfA = undirectedGraph.degreeOf('A');
132
+ const degreeOfB = undirectedGraph.degreeOf('B');
133
+ const degreeOfC = undirectedGraph.degreeOf('C');
134
+ expect(undirectedGraph.edgeSet().length).toBe(2);
135
+ expect(undirectedGraph.getEndsOfEdge(edgeBC)?.length).toBe(2);
136
+
137
+ expect(degreeOfA).toBe(1);
138
+ expect(degreeOfB).toBe(2);
139
+ expect(degreeOfC).toBe(1);
140
+ });
141
+ });
@@ -22,7 +22,7 @@ describe('Heap Operation Test', () => {
22
22
  });
23
23
 
24
24
  it('should object heap work well', function () {
25
- const minHeap = new MinHeap<{ a: string; key: number }>({comparator: (a, b) => a.key - b.key});
25
+ const minHeap = new MinHeap<{a: string; key: number}>({comparator: (a, b) => a.key - b.key});
26
26
  minHeap.add({key: 1, a: 'a1'});
27
27
  minHeap.add({key: 6, a: 'a6'});
28
28
  minHeap.add({key: 2, a: 'a2'});
@@ -37,7 +37,7 @@ describe('Heap Operation Test', () => {
37
37
  i++;
38
38
  }
39
39
 
40
- const maxHeap = new MaxHeap<{ key: number; a: string }>({comparator: (a, b) => b.key - a.key});
40
+ const maxHeap = new MaxHeap<{key: number; a: string}>({comparator: (a, b) => b.key - a.key});
41
41
  maxHeap.add({key: 1, a: 'a1'});
42
42
  maxHeap.add({key: 6, a: 'a6'});
43
43
  maxHeap.add({key: 5, a: 'a5'});
@@ -3,7 +3,7 @@ import {bigO, magnitude} from '../../../utils';
3
3
 
4
4
  describe('DoublyLinkedList Operation Test', () => {
5
5
  let list: DoublyLinkedList<number>;
6
- let objectList: DoublyLinkedList<{ keyA: number }>;
6
+ let objectList: DoublyLinkedList<{keyA: number}>;
7
7
 
8
8
  beforeEach(() => {
9
9
  list = new DoublyLinkedList();
@@ -3,10 +3,10 @@ import {bigO, magnitude} from '../../../utils';
3
3
 
4
4
  describe('SinglyLinkedList Operation Test', () => {
5
5
  let list: SinglyLinkedList<number>;
6
- let objectList: SinglyLinkedList<{ keyA: number }>;
6
+ let objectList: SinglyLinkedList<{keyA: number}>;
7
7
  beforeEach(() => {
8
8
  list = new SinglyLinkedList<number>();
9
- objectList = new SinglyLinkedList<{ keyA: number }>();
9
+ objectList = new SinglyLinkedList<{keyA: number}>();
10
10
  });
11
11
 
12
12
  describe('push', () => {
@@ -393,7 +393,7 @@ describe('SinglyLinkedList Performance Test', () => {
393
393
  }
394
394
 
395
395
  // expect(performance.now() - startPopTime).toBeLessThan(bigO.LINEAR);
396
- expect(performance.now() - startPopTime).toBeLessThan(bigO.LINEAR * 300);
396
+ expect(performance.now() - startPopTime).toBeLessThan(bigO.LINEAR * 400);
397
397
  });
398
398
  });
399
399
  describe('SinglyLinkedList', () => {
@@ -1,5 +1,7 @@
1
1
  import {Matrix2D, Vector2D} from '../../../../src';
2
+ import {isDebugTest} from '../../../config';
2
3
 
4
+ const isDebug = isDebugTest;
3
5
  describe('Matrix2D', () => {
4
6
  it('should initialize with default identity matrix', () => {
5
7
  const matrix = new Matrix2D();
@@ -136,3 +138,208 @@ describe('Matrix2D', () => {
136
138
  expect(result.m).toEqual(expectedMatrix);
137
139
  });
138
140
  });
141
+
142
+ describe('Vector2D', () => {
143
+ it('should create a vector with default values', () => {
144
+ const vector = new Vector2D();
145
+ expect(vector.x).toBe(0);
146
+ expect(vector.y).toBe(0);
147
+ expect(vector.w).toBe(1);
148
+ });
149
+
150
+ it('should correctly calculate vector length', () => {
151
+ const vector = new Vector2D(3, 4);
152
+ expect(vector.length).toBe(5);
153
+ });
154
+
155
+ it('should correctly add two vectors', () => {
156
+ const vector1 = new Vector2D(2, 3);
157
+ const vector2 = new Vector2D(1, 2);
158
+ const result = Vector2D.add(vector1, vector2);
159
+ expect(result.x).toBe(3);
160
+ expect(result.y).toBe(5);
161
+ });
162
+
163
+ // Add more test cases for Vector2D methods
164
+ });
165
+
166
+ describe('Matrix2D', () => {
167
+ it('should create an identity matrix by default', () => {
168
+ const matrix = new Matrix2D();
169
+ expect(matrix.m).toEqual(Matrix2D.identity);
170
+ });
171
+
172
+ it('should correctly add two matrices', () => {
173
+ const matrix1 = new Matrix2D([
174
+ [1, 2, 3],
175
+ [4, 5, 6],
176
+ [7, 8, 9]
177
+ ]);
178
+ const matrix2 = new Matrix2D([
179
+ [9, 8, 7],
180
+ [6, 5, 4],
181
+ [3, 2, 1]
182
+ ]);
183
+ const result = Matrix2D.add(matrix1, matrix2);
184
+ expect(result.m).toEqual([
185
+ [10, 10, 10],
186
+ [10, 10, 10],
187
+ [10, 10, 10]
188
+ ]);
189
+ });
190
+
191
+ // Add more test cases for Matrix2D methods
192
+ });
193
+
194
+ describe('Matrix2D', () => {
195
+ it('should create a matrix with default identity values', () => {
196
+ const matrix = new Matrix2D();
197
+ expect(matrix.m).toEqual(Matrix2D.identity);
198
+ });
199
+
200
+ it('should create a matrix from a Vector2D', () => {
201
+ const vector = new Vector2D(2, 3);
202
+ const matrix = new Matrix2D(vector);
203
+ expect(matrix.m).toEqual([
204
+ [2, 0, 0],
205
+ [3, 1, 0],
206
+ [1, 0, 1]
207
+ ]);
208
+ });
209
+
210
+ it('should correctly add two matrices', () => {
211
+ const matrix1 = new Matrix2D([
212
+ [1, 2, 3],
213
+ [4, 5, 6],
214
+ [7, 8, 9]
215
+ ]);
216
+ const matrix2 = new Matrix2D([
217
+ [9, 8, 7],
218
+ [6, 5, 4],
219
+ [3, 2, 1]
220
+ ]);
221
+ const result = Matrix2D.add(matrix1, matrix2);
222
+ expect(result.m).toEqual([
223
+ [10, 10, 10],
224
+ [10, 10, 10],
225
+ [10, 10, 10]
226
+ ]);
227
+ });
228
+
229
+ it('should correctly subtract two matrices', () => {
230
+ const matrix1 = new Matrix2D([
231
+ [5, 4, 3],
232
+ [2, 1, 0],
233
+ [0, 1, 2]
234
+ ]);
235
+ const matrix2 = new Matrix2D([
236
+ [4, 3, 2],
237
+ [1, 0, 1],
238
+ [2, 1, 0]
239
+ ]);
240
+ const result = Matrix2D.subtract(matrix1, matrix2);
241
+ expect(result.m).toEqual([
242
+ [1, 1, 1],
243
+ [1, 1, -1],
244
+ [-2, 0, 2]
245
+ ]);
246
+ });
247
+
248
+ it('should correctly multiply two matrices', () => {
249
+ const matrix1 = new Matrix2D([
250
+ [1, 2, 3],
251
+ [4, 5, 6],
252
+ [7, 8, 9]
253
+ ]);
254
+ const matrix2 = new Matrix2D([
255
+ [9, 8, 7],
256
+ [6, 5, 4],
257
+ [3, 2, 1]
258
+ ]);
259
+ const result = Matrix2D.multiply(matrix1, matrix2);
260
+ expect(result.m).toEqual([
261
+ [30, 24, 18],
262
+ [84, 69, 54],
263
+ [138, 114, 90]
264
+ ]);
265
+ });
266
+
267
+ it('should correctly multiply a matrix by a value', () => {
268
+ const matrix = new Matrix2D([
269
+ [2, 3, 4],
270
+ [5, 6, 7],
271
+ [8, 9, 10]
272
+ ]);
273
+ const value = 2;
274
+ const result = Matrix2D.multiplyByValue(matrix, value);
275
+ expect(result.m).toEqual([
276
+ [4, 6, 8],
277
+ [10, 12, 14],
278
+ [16, 18, 20]
279
+ ]);
280
+ });
281
+
282
+ it('should correctly multiply a matrix by a vector', () => {
283
+ const matrix = new Matrix2D([
284
+ [2, 3, 4],
285
+ [5, 6, 7],
286
+ [8, 9, 10]
287
+ ]);
288
+ const vector = new Vector2D(2, 3);
289
+ const result = Matrix2D.multiplyByVector(matrix, vector);
290
+ isDebug && console.log(JSON.stringify(result));
291
+ expect(result).toEqual({x: 17, y: 35, w: 1});
292
+ });
293
+
294
+ it('should correctly create a view matrix', () => {
295
+ const width = 800;
296
+ const height = 600;
297
+ const viewMatrix = Matrix2D.view(width, height);
298
+ expect(viewMatrix.m).toEqual([
299
+ [1, 0, 400],
300
+ [0, -1, 300],
301
+ [0, 0, 1]
302
+ ]);
303
+ });
304
+
305
+ it('should correctly scale a matrix', () => {
306
+ const factor = 3;
307
+ const scaledMatrix = Matrix2D.scale(factor);
308
+ expect(scaledMatrix.m).toEqual([
309
+ [3, 0, 0],
310
+ [0, 3, 0],
311
+ [0, 0, 3]
312
+ ]);
313
+ });
314
+
315
+ it('should correctly rotate a matrix', () => {
316
+ const radians = Math.PI / 4; // 45 degrees
317
+ const rotationMatrix = Matrix2D.rotate(radians);
318
+ console.log(JSON.stringify(rotationMatrix.m));
319
+ expect(rotationMatrix.m).toEqual([
320
+ [0.7071067811865476, -0.7071067811865475, 0],
321
+ [0.7071067811865475, 0.7071067811865476, 0],
322
+ [0, 0, 1]
323
+ ]);
324
+ });
325
+
326
+ it('should correctly translate a matrix', () => {
327
+ const translationVector = new Vector2D(2, 3);
328
+ const translationMatrix = Matrix2D.translate(translationVector);
329
+ expect(translationMatrix.m).toEqual([
330
+ [1, 0, 2],
331
+ [0, 1, 3],
332
+ [0, 0, 1]
333
+ ]);
334
+ });
335
+
336
+ it('should correctly convert a matrix to a vector', () => {
337
+ const matrix = new Matrix2D([
338
+ [2, 3, 4],
339
+ [5, 6, 7],
340
+ [8, 9, 10]
341
+ ]);
342
+ const vector = matrix.toVector();
343
+ expect(vector).toEqual(new Vector2D(2, 5));
344
+ });
345
+ });
@@ -1,5 +1,7 @@
1
1
  import {Character, Navigator, NavigatorParams, Turning} from '../../../../src';
2
+ import {isDebugTest} from '../../../config';
2
3
 
4
+ const isDebug = isDebugTest;
3
5
  const exampleMatrix: number[][] = [
4
6
  [0, 0, 0, 0],
5
7
  [0, 1, 1, 0],
@@ -17,7 +19,7 @@ const exampleTurning: Turning = {
17
19
  // Create a sample move callback function
18
20
  const exampleOnMove = () => {
19
21
  expect(true).toBeTruthy();
20
- // console.log(`Moved to position (${cur[0]}, ${cur[1]})`);
22
+ // isDebug && console.log(`Moved to position (${cur[0]}, ${cur[1]})`);
21
23
  };
22
24
 
23
25
  // Create an initial parameter object for the example
@@ -77,3 +79,166 @@ describe('Navigator class', () => {
77
79
  expect(navigator.check('left')).toBe(false); // Open path
78
80
  });
79
81
  });
82
+
83
+ describe('Navigator', () => {
84
+ it('should correctly navigate the grid', () => {
85
+ // Define a sample grid and initial parameters
86
+ const matrix: number[][] = [
87
+ [0, 0, 1],
88
+ [0, 1, 0],
89
+ [0, 0, 0]
90
+ ];
91
+
92
+ const turning: Turning = {
93
+ up: 'right',
94
+ right: 'down',
95
+ down: 'left',
96
+ left: 'up'
97
+ };
98
+
99
+ const init: NavigatorParams<number>['init'] = {
100
+ cur: [0, 0], // Initial position
101
+ charDir: 'right', // Initial character direction
102
+ VISITED: 2 // Value to mark visited cells
103
+ };
104
+
105
+ // Initialize the navigator
106
+ const navigator = new Navigator({
107
+ matrix,
108
+ turning,
109
+ init,
110
+ onMove: cur => cur
111
+ });
112
+
113
+ // Define a function to track visited cells
114
+ const visitedCells: number[][] = [];
115
+ const onMove = (cur: number[]) => {
116
+ visitedCells.push([...cur]);
117
+ };
118
+
119
+ // Attach the onMove function
120
+ navigator.onMove = onMove;
121
+
122
+ // Start the navigation
123
+ navigator.start();
124
+
125
+ // The character should have navigated the grid correctly
126
+ expect(visitedCells).toEqual([
127
+ [0, 1],
128
+ [0, 2],
129
+ [1, 2],
130
+ [2, 2],
131
+ [2, 1],
132
+ [2, 0],
133
+ [1, 0],
134
+ [1, 1]
135
+ ]);
136
+ });
137
+
138
+ it('should not move if there are no valid moves', () => {
139
+ // Define a sample grid with no valid moves
140
+ const matrix: number[][] = [
141
+ [1, 1],
142
+ [1, 1]
143
+ ];
144
+
145
+ const turning: Turning = {
146
+ up: 'right',
147
+ right: 'down',
148
+ down: 'left',
149
+ left: 'up'
150
+ };
151
+
152
+ const init: NavigatorParams<number>['init'] = {
153
+ cur: [0, 0], // Initial position
154
+ charDir: 'right', // Initial character direction
155
+ VISITED: 2 // Value to mark visited cells
156
+ };
157
+
158
+ // Initialize the navigator
159
+ const navigator = new Navigator({
160
+ matrix,
161
+ turning,
162
+ init,
163
+ onMove: cur => cur
164
+ });
165
+
166
+ // Define a function to track visited cells
167
+ const visitedCells: number[][] = [];
168
+ const onMove = (cur: number[]) => {
169
+ visitedCells.push([...cur]);
170
+ };
171
+
172
+ // Attach the onMove function
173
+ navigator.onMove = onMove;
174
+
175
+ // Start the navigation
176
+ navigator.start();
177
+
178
+ // The character should not move
179
+ isDebug && console.log(visitedCells);
180
+ expect(visitedCells).toEqual([
181
+ [0, 1],
182
+ [1, 1],
183
+ [1, 0]
184
+ ]);
185
+ });
186
+
187
+ it('should handle edge cases and turns correctly', () => {
188
+ // Define a sample grid with turns and edge cases
189
+ const matrix: number[][] = [
190
+ [1, 0, 0, 0],
191
+ [1, 0, 1, 0],
192
+ [0, 0, 1, 1]
193
+ ];
194
+
195
+ const turning: Turning = {
196
+ up: 'right',
197
+ right: 'down',
198
+ down: 'left',
199
+ left: 'up'
200
+ };
201
+
202
+ const init: NavigatorParams<number>['init'] = {
203
+ cur: [0, 0], // Initial position
204
+ charDir: 'right', // Initial character direction
205
+ VISITED: 2 // Value to mark visited cells
206
+ };
207
+
208
+ // Initialize the navigator
209
+ const navigator = new Navigator({
210
+ matrix,
211
+ turning,
212
+ init,
213
+ onMove: cur => cur
214
+ });
215
+
216
+ // Define a function to track visited cells
217
+ const visitedCells: number[][] = [];
218
+ const onMove = (cur: number[]) => {
219
+ visitedCells.push([...cur]);
220
+ };
221
+
222
+ // Attach the onMove function
223
+ navigator.onMove = onMove;
224
+
225
+ // Start the navigation
226
+ navigator.start();
227
+
228
+ // The character should have navigated the grid, handled turns, and edge cases
229
+ isDebug && console.log(visitedCells);
230
+ expect(visitedCells).toEqual([
231
+ [0, 1],
232
+ [0, 2],
233
+ [0, 3],
234
+ [1, 3],
235
+ [2, 3],
236
+ [2, 2],
237
+ [2, 1],
238
+ [2, 0],
239
+ [1, 0],
240
+ [1, 1],
241
+ [1, 2]
242
+ ]);
243
+ });
244
+ });
@@ -0,0 +1,171 @@
1
+ import {Vector2D} from '../../../../src';
2
+
3
+ describe('Vector2D', () => {
4
+ it('should create a vector with default values', () => {
5
+ const vector = new Vector2D();
6
+ expect(vector.x).toBe(0);
7
+ expect(vector.y).toBe(0);
8
+ expect(vector.w).toBe(1);
9
+ });
10
+
11
+ it('should correctly check if a vector is zero', () => {
12
+ const nonZeroVector = new Vector2D(3, 4);
13
+ const zeroVector = new Vector2D(0, 0);
14
+ expect(nonZeroVector.isZero).toBe(false);
15
+ expect(zeroVector.isZero).toBe(true);
16
+ });
17
+
18
+ it('should correctly calculate vector length', () => {
19
+ const vector = new Vector2D(3, 4);
20
+ expect(vector.length).toBe(5);
21
+ });
22
+
23
+ it('should correctly calculate squared vector length', () => {
24
+ const vector = new Vector2D(3, 4);
25
+ expect(vector.lengthSq).toBe(25);
26
+ });
27
+
28
+ it('should correctly round vector components', () => {
29
+ const vector = new Vector2D(3.6, 4.3);
30
+ const roundedVector = vector.rounded;
31
+ expect(roundedVector.x).toBe(4);
32
+ expect(roundedVector.y).toBe(4);
33
+ });
34
+
35
+ it('should correctly add two vectors', () => {
36
+ const vector1 = new Vector2D(2, 3);
37
+ const vector2 = new Vector2D(1, 2);
38
+ const result = Vector2D.add(vector1, vector2);
39
+ expect(result.x).toBe(3);
40
+ expect(result.y).toBe(5);
41
+ });
42
+
43
+ it('should correctly subtract two vectors', () => {
44
+ const vector1 = new Vector2D(4, 5);
45
+ const vector2 = new Vector2D(1, 2);
46
+ const result = Vector2D.subtract(vector1, vector2);
47
+ expect(result.x).toBe(3);
48
+ expect(result.y).toBe(3);
49
+ });
50
+
51
+ it('should correctly subtract value from a vector', () => {
52
+ const vector = new Vector2D(5, 7);
53
+ const result = Vector2D.subtractValue(vector, 3);
54
+ expect(result.x).toBe(2);
55
+ expect(result.y).toBe(4);
56
+ });
57
+
58
+ it('should correctly multiply a vector by a value', () => {
59
+ const vector = new Vector2D(2, 3);
60
+ const result = Vector2D.multiply(vector, 4);
61
+ expect(result.x).toBe(8);
62
+ expect(result.y).toBe(12);
63
+ });
64
+
65
+ it('should correctly divide a vector by a value', () => {
66
+ const vector = new Vector2D(6, 8);
67
+ const result = Vector2D.divide(vector, 2);
68
+ expect(result.x).toBe(3);
69
+ expect(result.y).toBe(4);
70
+ });
71
+
72
+ it('should correctly check if two vectors are equal', () => {
73
+ const vector1 = new Vector2D(3, 4);
74
+ const vector2 = new Vector2D(3, 4);
75
+ const vector3 = new Vector2D(4, 5);
76
+ expect(Vector2D.equals(vector1, vector2)).toBe(true);
77
+ expect(Vector2D.equals(vector1, vector3)).toBe(false);
78
+ });
79
+
80
+ it('should correctly check if two vectors are equal within a rounding factor', () => {
81
+ const vector1 = new Vector2D(3, 4);
82
+ const vector2 = new Vector2D(2.9, 3.9);
83
+ const vector3 = new Vector2D(4, 5);
84
+ expect(Vector2D.equalsRounded(vector1, vector2, 0.2)).toBe(true);
85
+ expect(Vector2D.equalsRounded(vector1, vector3, 0.2)).toBe(false);
86
+ });
87
+
88
+ it('should correctly normalize a vector', () => {
89
+ const vector = new Vector2D(3, 4);
90
+ const normalized = Vector2D.normalize(vector);
91
+ expect(normalized.x).toBeCloseTo(0.6);
92
+ expect(normalized.y).toBeCloseTo(0.8);
93
+ });
94
+
95
+ it('should correctly truncate a vector', () => {
96
+ const vector = new Vector2D(3, 4);
97
+ const truncated = Vector2D.truncate(vector, 4);
98
+ expect(truncated.length).toBeLessThanOrEqual(4);
99
+ });
100
+
101
+ it('should correctly get the perpendicular vector', () => {
102
+ const vector = new Vector2D(3, 4);
103
+ const perpendicular = Vector2D.perp(vector);
104
+ expect(Vector2D.dot(vector, perpendicular)).toBe(0);
105
+ });
106
+
107
+ it('should correctly reverse the vector', () => {
108
+ const vector = new Vector2D(3, 4);
109
+ const reversed = Vector2D.reverse(vector);
110
+ expect(reversed.x).toBe(-3);
111
+ expect(reversed.y).toBe(-4);
112
+ });
113
+
114
+ it('should correctly get the absolute vector', () => {
115
+ const vector = new Vector2D(-3, 4);
116
+ const absVector = Vector2D.abs(vector);
117
+ expect(absVector.x).toBe(3);
118
+ expect(absVector.y).toBe(4);
119
+ });
120
+
121
+ it('should correctly calculate the dot product of two vectors', () => {
122
+ const vector1 = new Vector2D(2, 3);
123
+ const vector2 = new Vector2D(4, 5);
124
+ const dotProduct = Vector2D.dot(vector1, vector2);
125
+ expect(dotProduct).toBe(23);
126
+ });
127
+
128
+ it('should correctly calculate the distance between two vectors', () => {
129
+ const vector1 = new Vector2D(1, 1);
130
+ const vector2 = new Vector2D(4, 5);
131
+ const distance = Vector2D.distance(vector1, vector2);
132
+ expect(distance).toBeCloseTo(5);
133
+ });
134
+
135
+ it('should correctly calculate the squared distance between two vectors', () => {
136
+ const vector1 = new Vector2D(1, 1);
137
+ const vector2 = new Vector2D(4, 5);
138
+ const distanceSq = Vector2D.distanceSq(vector1, vector2);
139
+ expect(distanceSq).toBe(25);
140
+ });
141
+
142
+ it('should correctly determine the sign of the cross product of two vectors', () => {
143
+ const vector1 = new Vector2D(2, 3);
144
+ const vector2 = new Vector2D(4, 5);
145
+ const sign = Vector2D.sign(vector1, vector2);
146
+ expect(sign).toBe(-1); // Assuming specific vector values, the result may vary
147
+ });
148
+
149
+ it('should correctly calculate the angle between a vector and the negative y-axis', () => {
150
+ const vector = new Vector2D(3, 4);
151
+ const angle = Vector2D.angle(vector);
152
+ expect(angle).toBeCloseTo(2.498091544796509, 3);
153
+ });
154
+
155
+ it('should create a random vector within the specified range', () => {
156
+ const maxX = 10;
157
+ const maxY = 10;
158
+ const randomVector = Vector2D.random(maxX, maxY);
159
+ expect(randomVector.x).toBeGreaterThanOrEqual(-maxX / 2);
160
+ expect(randomVector.x).toBeLessThanOrEqual(maxX / 2);
161
+ expect(randomVector.y).toBeGreaterThanOrEqual(-maxY / 2);
162
+ expect(randomVector.y).toBeLessThanOrEqual(maxY / 2);
163
+ });
164
+
165
+ it('should zero the vector components', () => {
166
+ const vector = new Vector2D(3, 4);
167
+ vector.zero();
168
+ expect(vector.x).toBe(0);
169
+ expect(vector.y).toBe(0);
170
+ });
171
+ });