data-structure-typed 1.38.9 → 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.
- package/CHANGELOG.md +1 -1
- package/README.md +9 -9
- package/dist/cjs/data-structures/binary-tree/avl-tree.d.ts +2 -2
- package/dist/cjs/data-structures/binary-tree/avl-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/binary-indexed-tree.d.ts +8 -0
- package/dist/cjs/data-structures/binary-tree/binary-indexed-tree.js +17 -0
- package/dist/cjs/data-structures/binary-tree/binary-indexed-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/binary-tree.d.ts +86 -32
- package/dist/cjs/data-structures/binary-tree/binary-tree.js +8 -8
- package/dist/cjs/data-structures/binary-tree/binary-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/bst.d.ts +6 -6
- package/dist/cjs/data-structures/binary-tree/bst.js +2 -2
- package/dist/cjs/data-structures/binary-tree/bst.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/rb-tree.js.map +1 -1
- package/dist/cjs/data-structures/binary-tree/tree-multiset.d.ts +2 -2
- package/dist/cjs/data-structures/binary-tree/tree-multiset.js.map +1 -1
- package/dist/cjs/data-structures/graph/abstract-graph.d.ts +4 -4
- package/dist/cjs/data-structures/graph/abstract-graph.js +5 -5
- package/dist/cjs/data-structures/graph/abstract-graph.js.map +1 -1
- package/dist/cjs/data-structures/graph/directed-graph.d.ts +4 -4
- package/dist/cjs/data-structures/graph/directed-graph.js +6 -6
- package/dist/cjs/data-structures/graph/directed-graph.js.map +1 -1
- package/dist/cjs/data-structures/graph/map-graph.d.ts +1 -1
- package/dist/cjs/data-structures/graph/map-graph.js +1 -1
- package/dist/cjs/data-structures/graph/map-graph.js.map +1 -1
- package/dist/cjs/data-structures/graph/undirected-graph.d.ts +3 -3
- package/dist/cjs/data-structures/graph/undirected-graph.js +4 -4
- package/dist/cjs/data-structures/graph/undirected-graph.js.map +1 -1
- package/dist/cjs/data-structures/hash/hash-map.js.map +1 -1
- package/dist/cjs/data-structures/hash/tree-map.js.map +1 -1
- package/dist/cjs/data-structures/hash/tree-set.js.map +1 -1
- package/dist/cjs/data-structures/heap/heap.d.ts +10 -5
- package/dist/cjs/data-structures/heap/heap.js +10 -10
- package/dist/cjs/data-structures/heap/heap.js.map +1 -1
- package/dist/cjs/data-structures/heap/max-heap.d.ts +4 -1
- package/dist/cjs/data-structures/heap/max-heap.js +9 -7
- package/dist/cjs/data-structures/heap/max-heap.js.map +1 -1
- package/dist/cjs/data-structures/heap/min-heap.d.ts +4 -1
- package/dist/cjs/data-structures/heap/min-heap.js +9 -7
- package/dist/cjs/data-structures/heap/min-heap.js.map +1 -1
- package/dist/cjs/data-structures/linked-list/singly-linked-list.js.map +1 -1
- package/dist/cjs/data-structures/matrix/matrix.js.map +1 -1
- package/dist/cjs/data-structures/matrix/matrix2d.d.ts +1 -2
- package/dist/cjs/data-structures/matrix/matrix2d.js +3 -7
- package/dist/cjs/data-structures/matrix/matrix2d.js.map +1 -1
- package/dist/cjs/data-structures/matrix/vector2d.d.ts +0 -1
- package/dist/cjs/data-structures/matrix/vector2d.js +0 -1
- package/dist/cjs/data-structures/matrix/vector2d.js.map +1 -1
- package/dist/cjs/data-structures/priority-queue/max-priority-queue.d.ts +4 -1
- package/dist/cjs/data-structures/priority-queue/max-priority-queue.js +9 -7
- package/dist/cjs/data-structures/priority-queue/max-priority-queue.js.map +1 -1
- package/dist/cjs/data-structures/priority-queue/min-priority-queue.d.ts +4 -1
- package/dist/cjs/data-structures/priority-queue/min-priority-queue.js +9 -7
- package/dist/cjs/data-structures/priority-queue/min-priority-queue.js.map +1 -1
- package/dist/cjs/data-structures/priority-queue/priority-queue.d.ts +5 -2
- package/dist/cjs/data-structures/priority-queue/priority-queue.js +2 -2
- package/dist/cjs/data-structures/priority-queue/priority-queue.js.map +1 -1
- package/dist/cjs/data-structures/queue/deque.js.map +1 -1
- package/dist/cjs/data-structures/queue/queue.js.map +1 -1
- package/dist/cjs/interfaces/binary-tree.d.ts +2 -2
- package/dist/cjs/types/data-structures/binary-tree/binary-tree.d.ts +0 -2
- package/dist/cjs/types/helpers.d.ts +1 -4
- package/dist/cjs/types/helpers.js.map +1 -1
- package/dist/mjs/data-structures/binary-tree/avl-tree.d.ts +2 -2
- package/dist/mjs/data-structures/binary-tree/binary-indexed-tree.d.ts +8 -0
- package/dist/mjs/data-structures/binary-tree/binary-indexed-tree.js +17 -0
- package/dist/mjs/data-structures/binary-tree/binary-tree.d.ts +86 -32
- package/dist/mjs/data-structures/binary-tree/binary-tree.js +8 -8
- package/dist/mjs/data-structures/binary-tree/bst.d.ts +6 -6
- package/dist/mjs/data-structures/binary-tree/bst.js +2 -2
- package/dist/mjs/data-structures/binary-tree/tree-multiset.d.ts +2 -2
- package/dist/mjs/data-structures/graph/abstract-graph.d.ts +4 -4
- package/dist/mjs/data-structures/graph/abstract-graph.js +5 -5
- package/dist/mjs/data-structures/graph/directed-graph.d.ts +4 -4
- package/dist/mjs/data-structures/graph/directed-graph.js +6 -6
- package/dist/mjs/data-structures/graph/map-graph.d.ts +1 -1
- package/dist/mjs/data-structures/graph/map-graph.js +1 -1
- package/dist/mjs/data-structures/graph/undirected-graph.d.ts +3 -3
- package/dist/mjs/data-structures/graph/undirected-graph.js +4 -4
- package/dist/mjs/data-structures/heap/heap.d.ts +10 -5
- package/dist/mjs/data-structures/heap/heap.js +10 -10
- package/dist/mjs/data-structures/heap/max-heap.d.ts +4 -1
- package/dist/mjs/data-structures/heap/max-heap.js +9 -7
- package/dist/mjs/data-structures/heap/min-heap.d.ts +4 -1
- package/dist/mjs/data-structures/heap/min-heap.js +9 -7
- package/dist/mjs/data-structures/matrix/matrix2d.d.ts +1 -2
- package/dist/mjs/data-structures/matrix/matrix2d.js +3 -7
- package/dist/mjs/data-structures/matrix/vector2d.d.ts +0 -1
- package/dist/mjs/data-structures/matrix/vector2d.js +0 -1
- package/dist/mjs/data-structures/priority-queue/max-priority-queue.d.ts +4 -1
- package/dist/mjs/data-structures/priority-queue/max-priority-queue.js +9 -7
- package/dist/mjs/data-structures/priority-queue/min-priority-queue.d.ts +4 -1
- package/dist/mjs/data-structures/priority-queue/min-priority-queue.js +9 -7
- package/dist/mjs/data-structures/priority-queue/priority-queue.d.ts +5 -2
- package/dist/mjs/data-structures/priority-queue/priority-queue.js +2 -2
- package/dist/mjs/interfaces/binary-tree.d.ts +2 -2
- package/dist/mjs/types/data-structures/binary-tree/binary-tree.d.ts +0 -2
- package/dist/mjs/types/helpers.d.ts +1 -4
- package/dist/umd/data-structure-typed.min.js +1 -1
- package/dist/umd/data-structure-typed.min.js.map +1 -1
- package/package.json +5 -5
- package/src/data-structures/binary-tree/avl-tree.ts +5 -4
- package/src/data-structures/binary-tree/binary-indexed-tree.ts +21 -1
- package/src/data-structures/binary-tree/binary-tree.ts +37 -93
- package/src/data-structures/binary-tree/bst.ts +11 -17
- package/src/data-structures/binary-tree/rb-tree.ts +2 -1
- package/src/data-structures/binary-tree/tree-multiset.ts +4 -3
- package/src/data-structures/graph/abstract-graph.ts +16 -15
- package/src/data-structures/graph/directed-graph.ts +8 -7
- package/src/data-structures/graph/map-graph.ts +2 -2
- package/src/data-structures/graph/undirected-graph.ts +9 -8
- package/src/data-structures/hash/hash-map.ts +1 -1
- package/src/data-structures/hash/tree-map.ts +1 -2
- package/src/data-structures/hash/tree-set.ts +1 -2
- package/src/data-structures/heap/heap.ts +12 -12
- package/src/data-structures/heap/max-heap.ts +8 -6
- package/src/data-structures/heap/min-heap.ts +8 -6
- package/src/data-structures/linked-list/singly-linked-list.ts +1 -1
- package/src/data-structures/matrix/matrix.ts +1 -1
- package/src/data-structures/matrix/matrix2d.ts +1 -3
- package/src/data-structures/matrix/vector2d.ts +1 -4
- package/src/data-structures/priority-queue/max-priority-queue.ts +8 -6
- package/src/data-structures/priority-queue/min-priority-queue.ts +8 -6
- package/src/data-structures/priority-queue/priority-queue.ts +3 -3
- package/src/data-structures/queue/deque.ts +4 -5
- package/src/data-structures/queue/queue.ts +1 -1
- package/src/interfaces/binary-tree.ts +2 -2
- package/src/types/data-structures/binary-tree/binary-tree.ts +0 -4
- package/src/types/data-structures/matrix/navigator.ts +1 -1
- package/src/types/helpers.ts +1 -7
- package/src/types/utils/utils.ts +1 -1
- package/src/types/utils/validate-type.ts +2 -2
- package/test/unit/data-structures/binary-tree/avl-tree.test.ts +141 -1
- package/test/unit/data-structures/binary-tree/binary-index-tree.test.ts +35 -0
- package/test/unit/data-structures/binary-tree/binary-tree.test.ts +269 -47
- package/test/unit/data-structures/binary-tree/bst.test.ts +391 -1
- package/test/unit/data-structures/binary-tree/rb-tree.test.ts +73 -7
- package/test/unit/data-structures/binary-tree/tree-multiset.test.ts +241 -186
- package/test/unit/data-structures/graph/directed-graph.test.ts +37 -7
- package/test/unit/data-structures/graph/map-graph.test.ts +82 -1
- package/test/unit/data-structures/graph/overall.test.ts +2 -2
- package/test/unit/data-structures/graph/undirected-graph.test.ts +84 -2
- package/test/unit/data-structures/heap/heap.test.ts +2 -2
- package/test/unit/data-structures/heap/max-heap.test.ts +1 -1
- package/test/unit/data-structures/heap/min-heap.test.ts +1 -1
- package/test/unit/data-structures/linked-list/singly-linked-list.test.ts +1 -1
- package/test/unit/data-structures/matrix/matrix2d.test.ts +207 -0
- package/test/unit/data-structures/matrix/navigator.test.ts +166 -1
- package/test/unit/data-structures/matrix/vector2d.test.ts +171 -0
- package/test/unit/data-structures/priority-queue/max-priority-queue.test.ts +3 -3
- package/test/unit/data-structures/priority-queue/priority-queue.test.ts +10 -10
- package/test/unit/data-structures/queue/deque.test.ts +264 -1
- package/test/unit/data-structures/queue/queue.test.ts +3 -1
|
@@ -20,7 +20,7 @@ describe('Overall Graph Operation Test', () => {
|
|
|
20
20
|
expect(graph.hasEdge('A', 'B')).toBe(true); // true
|
|
21
21
|
expect(graph.hasEdge('B', 'A')).toBe(false); // false
|
|
22
22
|
|
|
23
|
-
graph.
|
|
23
|
+
graph.deleteEdgeSrcToDest('A', 'B');
|
|
24
24
|
graph.hasEdge('A', 'B'); // false
|
|
25
25
|
expect(graph.hasEdge('A', 'B')).toBe(false); // false
|
|
26
26
|
|
|
@@ -38,7 +38,7 @@ describe('Overall Graph Operation Test', () => {
|
|
|
38
38
|
graph.addVertex('B');
|
|
39
39
|
graph.addVertex('C');
|
|
40
40
|
graph.addVertex('D');
|
|
41
|
-
graph.
|
|
41
|
+
graph.deleteVertex('C');
|
|
42
42
|
graph.addEdge('A', 'B');
|
|
43
43
|
graph.addEdge('B', 'D');
|
|
44
44
|
|
|
@@ -40,7 +40,7 @@ describe('UndirectedGraph Operation Test', () => {
|
|
|
40
40
|
graph.addVertex(vertex2);
|
|
41
41
|
graph.addEdge(edge);
|
|
42
42
|
|
|
43
|
-
expect(graph.
|
|
43
|
+
expect(graph.deleteEdge(edge)).toBe(edge);
|
|
44
44
|
expect(graph.hasEdge('A', 'B')).toBe(false);
|
|
45
45
|
});
|
|
46
46
|
|
|
@@ -49,7 +49,7 @@ describe('UndirectedGraph Operation Test', () => {
|
|
|
49
49
|
graph.addVertex('B');
|
|
50
50
|
graph.addVertex('C');
|
|
51
51
|
graph.addVertex('D');
|
|
52
|
-
graph.
|
|
52
|
+
graph.deleteVertex('C');
|
|
53
53
|
graph.addEdge('A', 'B');
|
|
54
54
|
graph.addEdge('B', 'D');
|
|
55
55
|
|
|
@@ -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}>((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}>((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'});
|
|
@@ -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 *
|
|
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
|
+
});
|