@minecraft/math 2.2.11 → 2.3.0
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/api-report/math.api.md +127 -0
- package/dist/minecraft-math.d.ts +1034 -431
- package/dist/minecraft-math.js +833 -6
- package/dist/minecraft-math.js.map +3 -3
- package/lib/__mocks__/minecraft-server.js +17 -0
- package/lib/__mocks__/minecraft-server.js.map +1 -0
- package/lib/src/aabb/coreHelpers.js +282 -0
- package/lib/src/aabb/coreHelpers.js.map +1 -0
- package/lib/src/aabb/coreHelpers.test.js +227 -0
- package/lib/src/aabb/coreHelpers.test.js.map +1 -0
- package/lib/src/aabb/index.js +4 -0
- package/lib/src/aabb/index.js.map +1 -0
- package/lib/src/general/clamp.js.map +1 -0
- package/lib/src/general/index.js.map +1 -0
- package/lib/{index.js → src/index.js} +1 -0
- package/lib/src/index.js.map +1 -0
- package/lib/src/index.test.js.map +1 -0
- package/lib/{vector3 → src/vector3}/coreHelpers.js +294 -2
- package/lib/src/vector3/coreHelpers.js.map +1 -0
- package/lib/src/vector3/coreHelpers.test.js +578 -0
- package/lib/src/vector3/coreHelpers.test.js.map +1 -0
- package/lib/src/vector3/index.js.map +1 -0
- package/lib/src/vector3/vectorWrapper.js +509 -0
- package/lib/src/vector3/vectorWrapper.js.map +1 -0
- package/lib/src/vector3/vectorWrapper.test.js +575 -0
- package/lib/src/vector3/vectorWrapper.test.js.map +1 -0
- package/lib/types/math-beta.d.ts +1034 -431
- package/lib/types/math-public.d.ts +1034 -431
- package/lib/types/math.d.ts +1034 -431
- package/package.json +1 -1
- package/lib/general/clamp.js.map +0 -1
- package/lib/general/index.js.map +0 -1
- package/lib/index.js.map +0 -1
- package/lib/index.test.js.map +0 -1
- package/lib/vector3/coreHelpers.js.map +0 -1
- package/lib/vector3/coreHelpers.test.js +0 -264
- package/lib/vector3/coreHelpers.test.js.map +0 -1
- package/lib/vector3/index.js.map +0 -1
- package/lib/vector3/vectorWrapper.js +0 -230
- package/lib/vector3/vectorWrapper.js.map +0 -1
- package/lib/vector3/vectorWrapper.test.js +0 -228
- package/lib/vector3/vectorWrapper.test.js.map +0 -1
- /package/lib/{general → src/general}/clamp.js +0 -0
- /package/lib/{general → src/general}/index.js +0 -0
- /package/lib/{index.test.js → src/index.test.js} +0 -0
- /package/lib/{vector3 → src/vector3}/index.js +0 -0
|
@@ -0,0 +1,575 @@
|
|
|
1
|
+
// Copyright (c) Microsoft Corporation.
|
|
2
|
+
// Licensed under the MIT License.
|
|
3
|
+
import { describe, expect, it } from 'vitest';
|
|
4
|
+
import { VECTOR2_ZERO, Vector2Utils, VECTOR3_ZERO, Vector3Utils, VectorXZUtils } from './coreHelpers.js';
|
|
5
|
+
import { Vector2Builder, Vector3Builder, VectorXZBuilder } from './vectorWrapper.js';
|
|
6
|
+
/**
|
|
7
|
+
* Underlying functionality is validated by coreHelpers tests, primary concern here is consistency of results
|
|
8
|
+
* between the two implementations
|
|
9
|
+
*/
|
|
10
|
+
describe('Vector3Builder', () => {
|
|
11
|
+
it('should be able to be constructed from a Vector3 or three numbers', () => {
|
|
12
|
+
const vectorA = new Vector3Builder({ x: 1, y: 2, z: 3 });
|
|
13
|
+
const vectorB = new Vector3Builder(1, 2, 3);
|
|
14
|
+
expect(vectorA.x).toBe(1);
|
|
15
|
+
expect(vectorA.y).toBe(2);
|
|
16
|
+
expect(vectorA.z).toBe(3);
|
|
17
|
+
expect(vectorA).toEqual(vectorB);
|
|
18
|
+
});
|
|
19
|
+
it('should be able to assign a Vector3', () => {
|
|
20
|
+
const vector = new Vector3Builder(1, 2, 3);
|
|
21
|
+
const updated = vector.assign({ x: 4, y: 5, z: 6 });
|
|
22
|
+
expect(updated.x).toBe(4);
|
|
23
|
+
expect(updated.y).toBe(5);
|
|
24
|
+
expect(updated.z).toBe(6);
|
|
25
|
+
expect(updated).toBe(vector); // Referential equality must be preserved
|
|
26
|
+
});
|
|
27
|
+
it('should be able to check equality with the same result as the coreHelpers function', () => {
|
|
28
|
+
const vectorA = new Vector3Builder(1, 2, 3);
|
|
29
|
+
const vectorB = new Vector3Builder(1, 2, 3);
|
|
30
|
+
const vectorC = new Vector3Builder(4, 5, 6);
|
|
31
|
+
expect(vectorA.equals(vectorB)).toBe(Vector3Utils.equals(vectorA, vectorB));
|
|
32
|
+
expect(vectorA.equals(vectorC)).toBe(Vector3Utils.equals(vectorA, vectorC));
|
|
33
|
+
});
|
|
34
|
+
it('should be able to add a vector3 with the same result as the coreHelpers function', () => {
|
|
35
|
+
const vectorA = new Vector3Builder(1, 2, 3);
|
|
36
|
+
const vectorB = new Vector3Builder(4, 5, 6);
|
|
37
|
+
const vectorC = Vector3Utils.add(vectorA, vectorB);
|
|
38
|
+
const result = vectorA.add(vectorB);
|
|
39
|
+
expect(result).toEqual(vectorC);
|
|
40
|
+
expect(vectorA).toBe(result); // Referential equality must be preserved
|
|
41
|
+
// Subsequent chained adds should work as expected
|
|
42
|
+
const toAdd = { x: 1, y: 1, z: 1 };
|
|
43
|
+
const resultTwo = vectorA.add(toAdd).add(toAdd).add(toAdd);
|
|
44
|
+
expect(resultTwo).toEqual({ x: 8, y: 10, z: 12 });
|
|
45
|
+
expect(resultTwo).toBe(vectorA); // Referential equality must be preserved
|
|
46
|
+
});
|
|
47
|
+
it('should be able to add a partial vector3 with the same result as the coreHelpers function', () => {
|
|
48
|
+
const vectorA = new Vector3Builder(1, 2, 3);
|
|
49
|
+
const vectorB = { x: 4, z: 6 };
|
|
50
|
+
const vectorC = Vector3Utils.add(vectorA, vectorB);
|
|
51
|
+
const result = vectorA.add(vectorB);
|
|
52
|
+
expect(result).toEqual(vectorC);
|
|
53
|
+
expect(vectorA).toBe(result); // Referential equality must be preserved
|
|
54
|
+
});
|
|
55
|
+
it('should be able to subtract a vector3 with the same result as the coreHelpers function', () => {
|
|
56
|
+
const vectorA = new Vector3Builder(5, 7, 9);
|
|
57
|
+
const vectorB = new Vector3Builder(4, 5, 6);
|
|
58
|
+
const vectorC = Vector3Utils.subtract(vectorA, vectorB);
|
|
59
|
+
const result = vectorA.subtract(vectorB);
|
|
60
|
+
expect(result).toEqual(vectorC);
|
|
61
|
+
expect(vectorA).toBe(result); // Referential equality must be preserved
|
|
62
|
+
// Subsequent chained subtracts should work as expected
|
|
63
|
+
const toSubtract = { x: 1, y: 1, z: 1 };
|
|
64
|
+
const resultTwo = vectorA.subtract(toSubtract).subtract(toSubtract).subtract(toSubtract);
|
|
65
|
+
expect(resultTwo).toEqual({ x: -2, y: -1, z: 0 });
|
|
66
|
+
expect(resultTwo).toBe(vectorA); // Referential equality must be preserved
|
|
67
|
+
});
|
|
68
|
+
it('should be able to subtract a partial vector3 with the same result as the coreHelpers function', () => {
|
|
69
|
+
const vectorA = new Vector3Builder(1, 2, 3);
|
|
70
|
+
const vectorB = { x: 4, z: 6 };
|
|
71
|
+
const vectorC = Vector3Utils.subtract(vectorA, vectorB);
|
|
72
|
+
const result = vectorA.subtract(vectorB);
|
|
73
|
+
expect(result).toEqual(vectorC);
|
|
74
|
+
expect(vectorA).toBe(result); // Referential equality must be preserved
|
|
75
|
+
});
|
|
76
|
+
it('should be able to scale a vector3 with the same result as the coreHelpers function', () => {
|
|
77
|
+
const vectorA = new Vector3Builder(1, 2, 3);
|
|
78
|
+
const vectorB = Vector3Utils.scale(vectorA, 3);
|
|
79
|
+
const result = vectorA.scale(3);
|
|
80
|
+
expect(result).toEqual(vectorB);
|
|
81
|
+
expect(vectorA).toBe(result); // Referential equality must be preserved
|
|
82
|
+
// Subsequent chained subtracts should work as expected
|
|
83
|
+
const resultTwo = vectorA.scale(3).scale(3);
|
|
84
|
+
expect(resultTwo).toEqual({ x: 27, y: 54, z: 81 });
|
|
85
|
+
expect(resultTwo).toBe(vectorA); // Referential equality must be preserved
|
|
86
|
+
});
|
|
87
|
+
it('should be able to compute the dot product with the same result as the coreHelpers function', () => {
|
|
88
|
+
const vectorA = new Vector3Builder(1, 2, 3);
|
|
89
|
+
const vectorB = new Vector3Builder(4, 5, 6);
|
|
90
|
+
const dotProduct = Vector3Utils.dot(vectorA, vectorB);
|
|
91
|
+
const result = vectorA.dot(vectorB);
|
|
92
|
+
expect(result).toEqual(dotProduct);
|
|
93
|
+
});
|
|
94
|
+
it('should be able to compute the cross product with the same result as the coreHelpers function', () => {
|
|
95
|
+
const vectorA = new Vector3Builder(1, 2, 3);
|
|
96
|
+
const vectorB = new Vector3Builder(4, 5, 6);
|
|
97
|
+
const vectorC = Vector3Utils.cross(vectorA, vectorB);
|
|
98
|
+
const result = vectorA.cross(vectorB);
|
|
99
|
+
expect(result).toEqual(vectorC);
|
|
100
|
+
expect(vectorA).toBe(result); // Referential equality must be preserved
|
|
101
|
+
// Subsequent chained subtracts should work as expected
|
|
102
|
+
const toCross = { x: 1, y: 1, z: 1 };
|
|
103
|
+
const resultTwo = vectorA.cross(toCross).cross(toCross);
|
|
104
|
+
expect(resultTwo).toEqual({ x: 9, y: -18, z: 9 });
|
|
105
|
+
expect(resultTwo).toBe(vectorA); // Referential equality must be preserved
|
|
106
|
+
});
|
|
107
|
+
it('should be able to compute the magnitude with the same result as the coreHelpers function', () => {
|
|
108
|
+
const vectorA = new Vector3Builder(1, 2, 3);
|
|
109
|
+
const mag = Vector3Utils.magnitude(vectorA);
|
|
110
|
+
expect(vectorA.magnitude()).toEqual(mag);
|
|
111
|
+
});
|
|
112
|
+
it('should be able to compute the distance between two vectors with the same result as the coreHelpers function', () => {
|
|
113
|
+
const vectorA = new Vector3Builder(1, 2, 3);
|
|
114
|
+
const vectorB = new Vector3Builder(4, 5, 6);
|
|
115
|
+
const mag = Vector3Utils.distance(vectorA, vectorB);
|
|
116
|
+
expect(vectorA.distance(vectorB)).toEqual(mag);
|
|
117
|
+
});
|
|
118
|
+
it('should be able to normalize the vector with the same result as the coreHelpers function', () => {
|
|
119
|
+
const vectorA = new Vector3Builder(1, 2, 3);
|
|
120
|
+
const vectorB = Vector3Utils.normalize(vectorA);
|
|
121
|
+
const result = vectorA.normalize();
|
|
122
|
+
expect(result).toEqual(vectorB);
|
|
123
|
+
expect(vectorA).toBe(result); // Referential equality must be preserved
|
|
124
|
+
});
|
|
125
|
+
it('should be able to compute the floor of the vector with the same result as the coreHelpers function', () => {
|
|
126
|
+
const vectorA = new Vector3Builder(1.33, 2.14, 3.55);
|
|
127
|
+
const vectorB = Vector3Utils.floor(vectorA);
|
|
128
|
+
const result = vectorA.floor();
|
|
129
|
+
expect(result).toEqual(vectorB);
|
|
130
|
+
expect(vectorA).toBe(result); // Referential equality must be preserved
|
|
131
|
+
});
|
|
132
|
+
it('should be able to compute the ceil of the vector with the same result as the coreHelpers function', () => {
|
|
133
|
+
const vectorA = new Vector3Builder(1.33, 2.14, 3.55);
|
|
134
|
+
const vectorB = Vector3Utils.ceil(vectorA);
|
|
135
|
+
const result = vectorA.ceil();
|
|
136
|
+
expect(result).toEqual(vectorB);
|
|
137
|
+
expect(vectorA).toBe(result); // Referential equality must be preserved
|
|
138
|
+
});
|
|
139
|
+
it('should be able to compute the min of two vectors with the same result as the coreHelpers function', () => {
|
|
140
|
+
const vectorA = new Vector3Builder(1, 2, 3);
|
|
141
|
+
const vectorB = { x: 4, y: 5, z: 6 };
|
|
142
|
+
const vectorC = Vector3Utils.min(vectorA, vectorB);
|
|
143
|
+
const result = vectorA.min(vectorB);
|
|
144
|
+
expect(result).toEqual(vectorC);
|
|
145
|
+
expect(vectorA).toBe(result); // Referential equality must be preserved
|
|
146
|
+
});
|
|
147
|
+
it('should be able to compute the max of two vectors with the same result as the coreHelpers function', () => {
|
|
148
|
+
const vectorA = new Vector3Builder(1, 2, 3);
|
|
149
|
+
const vectorB = { x: 4, y: 5, z: 6 };
|
|
150
|
+
const vectorC = Vector3Utils.max(vectorA, vectorB);
|
|
151
|
+
const result = vectorA.max(vectorB);
|
|
152
|
+
expect(result).toEqual(vectorC);
|
|
153
|
+
expect(vectorA).toBe(result); // Referential equality must be preserved
|
|
154
|
+
});
|
|
155
|
+
it('should be able to clamp the vector with the same result as the coreHelpers function', () => {
|
|
156
|
+
const vectorA = new Vector3Builder(1, 2, 3);
|
|
157
|
+
const minVec = { x: 0, y: 1.5 };
|
|
158
|
+
const maxVec = { x: 2, z: 2.5 };
|
|
159
|
+
const vectorB = Vector3Utils.clamp(vectorA, { min: minVec, max: maxVec });
|
|
160
|
+
const result = vectorA.clamp({ min: minVec, max: maxVec });
|
|
161
|
+
expect(result).toEqual(vectorB);
|
|
162
|
+
expect(vectorA).toBe(result); // Referential equality must be preserved
|
|
163
|
+
});
|
|
164
|
+
it('should be able to compute a string representation of the vector with the same result as the coreHelpers function', () => {
|
|
165
|
+
const vectorA = new Vector3Builder(1.33, 2.14, 3.55);
|
|
166
|
+
const vectorB = Vector3Utils.toString(vectorA, { decimals: 1, delimiter: ' ' });
|
|
167
|
+
const result = vectorA.toString({ decimals: 1, delimiter: ' ' });
|
|
168
|
+
expect(result).toEqual(vectorB);
|
|
169
|
+
});
|
|
170
|
+
it('should be able to compute a string representation of the vector with the same result as the coreHelpers function using a string', () => {
|
|
171
|
+
const regular = '1.33, 2.14, 3.55';
|
|
172
|
+
const alternateDelimiter = '1.33+2.14+3.55';
|
|
173
|
+
const vectorBuilderA = new Vector3Builder(regular);
|
|
174
|
+
const vectorBuilderB = new Vector3Builder(alternateDelimiter, '+');
|
|
175
|
+
const vectorA = Vector3Utils.fromString(regular);
|
|
176
|
+
const vectorB = Vector3Utils.fromString(alternateDelimiter, '+');
|
|
177
|
+
expect(vectorBuilderA).toEqual(vectorA);
|
|
178
|
+
expect(vectorBuilderB).toEqual(vectorB);
|
|
179
|
+
});
|
|
180
|
+
it('makes a 0 vector for invalid string', () => {
|
|
181
|
+
const regular = '1.33, sdfg, 3.55';
|
|
182
|
+
expect(new Vector3Builder(regular)).toEqual(VECTOR3_ZERO);
|
|
183
|
+
});
|
|
184
|
+
it('should be able compute the lerp halfway between two vectors with the same result as the coreHelpers function', () => {
|
|
185
|
+
const vectorA = new Vector3Builder(5, 6, 3);
|
|
186
|
+
const vectorB = new Vector3Builder(4, 2, 6);
|
|
187
|
+
const ratio = 0.4;
|
|
188
|
+
const resultA = Vector3Utils.lerp(vectorA, vectorB, ratio);
|
|
189
|
+
const resultB = vectorA.lerp(vectorB, ratio);
|
|
190
|
+
expect(resultA).toEqual(resultB);
|
|
191
|
+
});
|
|
192
|
+
it('should be able compute the slerp halfway between two vectors with the same result as the coreHelpers function', () => {
|
|
193
|
+
const vectorA = new Vector3Builder(5, 6, 3);
|
|
194
|
+
const vectorB = new Vector3Builder(4, 2, 6);
|
|
195
|
+
const ratio = 0.4;
|
|
196
|
+
const resultA = Vector3Utils.slerp(vectorA, vectorB, ratio);
|
|
197
|
+
const resultB = vectorA.slerp(vectorB, ratio);
|
|
198
|
+
expect(resultA).toEqual(resultB);
|
|
199
|
+
});
|
|
200
|
+
it('should be able to multiply with the same result as the coreHelpers function', () => {
|
|
201
|
+
const vectorA = new Vector3Builder(5, 6, 3);
|
|
202
|
+
const vectorB = new Vector3Builder(4, 2, 6);
|
|
203
|
+
const resultA = Vector3Utils.multiply(vectorA, vectorB);
|
|
204
|
+
const resultB = vectorA.multiply(vectorB);
|
|
205
|
+
expect(resultA).toEqual(resultB);
|
|
206
|
+
});
|
|
207
|
+
it('should be able to rotate over x with the same result as the coreHelpers function', () => {
|
|
208
|
+
const vectorA = new Vector3Builder(5, 6, 3);
|
|
209
|
+
const angle = Math.PI / 2;
|
|
210
|
+
const resultA = Vector3Utils.rotateX(vectorA, angle);
|
|
211
|
+
const resultB = vectorA.rotateX(angle);
|
|
212
|
+
expect(resultA).toEqual(resultB);
|
|
213
|
+
});
|
|
214
|
+
it('should be able to rotate over y with the same result as the coreHelpers function', () => {
|
|
215
|
+
const vectorA = new Vector3Builder(5, 6, 3);
|
|
216
|
+
const angle = Math.PI / 2;
|
|
217
|
+
const resultA = Vector3Utils.rotateY(vectorA, angle);
|
|
218
|
+
const resultB = vectorA.rotateY(angle);
|
|
219
|
+
expect(resultA).toEqual(resultB);
|
|
220
|
+
});
|
|
221
|
+
it('should be able to rotate over z with the same result as the coreHelpers function', () => {
|
|
222
|
+
const vectorA = new Vector3Builder(5, 6, 3);
|
|
223
|
+
const angle = Math.PI / 2;
|
|
224
|
+
const resultA = Vector3Utils.rotateZ(vectorA, angle);
|
|
225
|
+
const resultB = vectorA.rotateZ(angle);
|
|
226
|
+
expect(resultA).toEqual(resultB);
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
describe('Vector2Builder', () => {
|
|
230
|
+
it('should be able to compute a string representation of the vector with the same result as the coreHelpers function', () => {
|
|
231
|
+
const vectorA = new Vector2Builder(1.33, 2.14);
|
|
232
|
+
const vectorB = Vector2Utils.toString(vectorA, { decimals: 1, delimiter: ' ' });
|
|
233
|
+
const result = vectorA.toString({ decimals: 1, delimiter: ' ' });
|
|
234
|
+
expect(result).toEqual(vectorB);
|
|
235
|
+
});
|
|
236
|
+
it('should be able to compute a string representation of the vector with the same result as the coreHelpers function using a string', () => {
|
|
237
|
+
const regular = '1.33, 2.14';
|
|
238
|
+
const alternateDelimiter = '1.33+2.14';
|
|
239
|
+
const vectorBuilderA = new Vector2Builder(regular);
|
|
240
|
+
const vectorBuilderB = new Vector2Builder(alternateDelimiter, '+');
|
|
241
|
+
const vectorA = Vector2Utils.fromString(regular);
|
|
242
|
+
const vectorB = Vector2Utils.fromString(alternateDelimiter, '+');
|
|
243
|
+
expect(vectorBuilderA).toEqual(vectorA);
|
|
244
|
+
expect(vectorBuilderB).toEqual(vectorB);
|
|
245
|
+
});
|
|
246
|
+
it('makes a 0 vector for invalid string', () => {
|
|
247
|
+
const regular = '1.33, sdfg';
|
|
248
|
+
expect(new Vector2Builder(regular)).toEqual(VECTOR2_ZERO);
|
|
249
|
+
});
|
|
250
|
+
it('should be able to assign a Vector2', () => {
|
|
251
|
+
const vector = new Vector2Builder(1, 2);
|
|
252
|
+
const updated = vector.assign({ x: 4, y: 5 });
|
|
253
|
+
expect(updated.x).toBe(4);
|
|
254
|
+
expect(updated.y).toBe(5);
|
|
255
|
+
expect(updated).toBe(vector); // Referential equality must be preserved
|
|
256
|
+
});
|
|
257
|
+
it('should be able to check equality with the same result as the coreHelpers function', () => {
|
|
258
|
+
const vectorA = new Vector2Builder(1, 2);
|
|
259
|
+
const vectorB = new Vector2Builder(1, 2);
|
|
260
|
+
const vectorC = new Vector2Builder(4, 5);
|
|
261
|
+
expect(vectorA.equals(vectorB)).toBe(Vector2Utils.equals(vectorA, vectorB));
|
|
262
|
+
expect(vectorA.equals(vectorC)).toBe(Vector2Utils.equals(vectorA, vectorC));
|
|
263
|
+
});
|
|
264
|
+
it('should be able to add a vector2 with the same result as the coreHelpers function', () => {
|
|
265
|
+
const vectorA = new Vector2Builder(1, 2);
|
|
266
|
+
const vectorB = new Vector2Builder(4, 5);
|
|
267
|
+
const vectorC = Vector2Utils.add(vectorA, vectorB);
|
|
268
|
+
const result = vectorA.add(vectorB);
|
|
269
|
+
expect(result).toEqual(vectorC);
|
|
270
|
+
expect(vectorA).toBe(result); // Referential equality must be preserved
|
|
271
|
+
// Subsequent chained adds should work as expected
|
|
272
|
+
const toAdd = { x: 1, y: 1 };
|
|
273
|
+
const resultTwo = vectorA.add(toAdd).add(toAdd).add(toAdd);
|
|
274
|
+
expect(resultTwo).toEqual({ x: 8, y: 10 });
|
|
275
|
+
expect(resultTwo).toBe(vectorA); // Referential equality must be preserved
|
|
276
|
+
});
|
|
277
|
+
it('should be able to add a partial vector2 with the same result as the coreHelpers function', () => {
|
|
278
|
+
const vectorA = new Vector2Builder(1, 2);
|
|
279
|
+
const vectorB = { x: 4 };
|
|
280
|
+
const vectorC = Vector2Utils.add(vectorA, vectorB);
|
|
281
|
+
const result = vectorA.add(vectorB);
|
|
282
|
+
expect(result).toEqual(vectorC);
|
|
283
|
+
expect(vectorA).toBe(result); // Referential equality must be preserved
|
|
284
|
+
});
|
|
285
|
+
it('should be able to subtract a vector2 with the same result as the coreHelpers function', () => {
|
|
286
|
+
const vectorA = new Vector2Builder(5, 7);
|
|
287
|
+
const vectorB = new Vector2Builder(4, 5);
|
|
288
|
+
const vectorC = Vector2Utils.subtract(vectorA, vectorB);
|
|
289
|
+
const result = vectorA.subtract(vectorB);
|
|
290
|
+
expect(result).toEqual(vectorC);
|
|
291
|
+
expect(vectorA).toBe(result); // Referential equality must be preserved
|
|
292
|
+
// Subsequent chained subtracts should work as expected
|
|
293
|
+
const toSubtract = { x: 1, y: 1 };
|
|
294
|
+
const resultTwo = vectorA.subtract(toSubtract).subtract(toSubtract).subtract(toSubtract);
|
|
295
|
+
expect(resultTwo).toEqual({ x: -2, y: -1 });
|
|
296
|
+
expect(resultTwo).toBe(vectorA); // Referential equality must be preserved
|
|
297
|
+
});
|
|
298
|
+
it('should be able to subtract a partial vector2 with the same result as the coreHelpers function', () => {
|
|
299
|
+
const vectorA = new Vector2Builder(1, 2);
|
|
300
|
+
const vectorB = { x: 4 };
|
|
301
|
+
const vectorC = Vector2Utils.subtract(vectorA, vectorB);
|
|
302
|
+
const result = vectorA.subtract(vectorB);
|
|
303
|
+
expect(result).toEqual(vectorC);
|
|
304
|
+
expect(vectorA).toBe(result); // Referential equality must be preserved
|
|
305
|
+
});
|
|
306
|
+
it('should be able to scale a vector2 with the same result as the coreHelpers function', () => {
|
|
307
|
+
const vectorA = new Vector2Builder(1, 2);
|
|
308
|
+
const vectorB = Vector2Utils.scale(vectorA, 3);
|
|
309
|
+
const result = vectorA.scale(3);
|
|
310
|
+
expect(result).toEqual(vectorB);
|
|
311
|
+
expect(vectorA).toBe(result); // Referential equality must be preserved
|
|
312
|
+
// Subsequent chained subtracts should work as expected
|
|
313
|
+
const resultTwo = vectorA.scale(3).scale(3);
|
|
314
|
+
expect(resultTwo).toEqual({ x: 27, y: 54 });
|
|
315
|
+
expect(resultTwo).toBe(vectorA); // Referential equality must be preserved
|
|
316
|
+
});
|
|
317
|
+
it('should be able to compute the dot product with the same result as the coreHelpers function', () => {
|
|
318
|
+
const vectorA = new Vector2Builder(1, 2);
|
|
319
|
+
const vectorB = new Vector2Builder(4, 5);
|
|
320
|
+
const dotProduct = Vector2Utils.dot(vectorA, vectorB);
|
|
321
|
+
const result = vectorA.dot(vectorB);
|
|
322
|
+
expect(result).toEqual(dotProduct);
|
|
323
|
+
});
|
|
324
|
+
it('should be able to compute the magnitude with the same result as the coreHelpers function', () => {
|
|
325
|
+
const vectorA = new Vector2Builder(1, 2);
|
|
326
|
+
const mag = Vector2Utils.magnitude(vectorA);
|
|
327
|
+
expect(vectorA.magnitude()).toEqual(mag);
|
|
328
|
+
});
|
|
329
|
+
it('should be able to compute the distance between two vectors with the same result as the coreHelpers function', () => {
|
|
330
|
+
const vectorA = new Vector2Builder(1, 2);
|
|
331
|
+
const vectorB = new Vector2Builder(4, 5);
|
|
332
|
+
const mag = Vector2Utils.distance(vectorA, vectorB);
|
|
333
|
+
expect(vectorA.distance(vectorB)).toEqual(mag);
|
|
334
|
+
});
|
|
335
|
+
it('should be able to normalize the vector with the same result as the coreHelpers function', () => {
|
|
336
|
+
const vectorA = new Vector2Builder(1, 2);
|
|
337
|
+
const vectorB = Vector2Utils.normalize(vectorA);
|
|
338
|
+
const result = vectorA.normalize();
|
|
339
|
+
expect(result).toEqual(vectorB);
|
|
340
|
+
expect(vectorA).toBe(result); // Referential equality must be preserved
|
|
341
|
+
});
|
|
342
|
+
it('should be able to compute the floor of the vector with the same result as the coreHelpers function', () => {
|
|
343
|
+
const vectorA = new Vector2Builder(1.33, 2.14);
|
|
344
|
+
const vectorB = Vector2Utils.floor(vectorA);
|
|
345
|
+
const result = vectorA.floor();
|
|
346
|
+
expect(result).toEqual(vectorB);
|
|
347
|
+
expect(vectorA).toBe(result); // Referential equality must be preserved
|
|
348
|
+
});
|
|
349
|
+
it('should be able to clamp the vector with the same result as the coreHelpers function', () => {
|
|
350
|
+
const vectorA = new Vector2Builder(1, 2);
|
|
351
|
+
const minVec = { x: 0, y: 1.5 };
|
|
352
|
+
const maxVec = { x: 2 };
|
|
353
|
+
const vectorB = Vector2Utils.clamp(vectorA, { min: minVec, max: maxVec });
|
|
354
|
+
const result = vectorA.clamp({ min: minVec, max: maxVec });
|
|
355
|
+
expect(result).toEqual(vectorB);
|
|
356
|
+
expect(vectorA).toBe(result); // Referential equality must be preserved
|
|
357
|
+
});
|
|
358
|
+
it('should be able to compute a string representation of the vector with the same result as the coreHelpers function', () => {
|
|
359
|
+
const vectorA = new Vector2Builder(1.33, 2.14);
|
|
360
|
+
const vectorB = Vector2Utils.toString(vectorA, { decimals: 1, delimiter: ' ' });
|
|
361
|
+
const result = vectorA.toString({ decimals: 1, delimiter: ' ' });
|
|
362
|
+
expect(result).toEqual(vectorB);
|
|
363
|
+
});
|
|
364
|
+
it('should be able to compute a string representation of the vector with the same result as the coreHelpers function using a string', () => {
|
|
365
|
+
const regular = '1.33, 2.14';
|
|
366
|
+
const alternateDelimiter = '1.33+2.14';
|
|
367
|
+
const vectorBuilderA = new Vector2Builder(regular);
|
|
368
|
+
const vectorBuilderB = new Vector2Builder(alternateDelimiter, '+');
|
|
369
|
+
const vectorA = Vector2Utils.fromString(regular);
|
|
370
|
+
const vectorB = Vector2Utils.fromString(alternateDelimiter, '+');
|
|
371
|
+
expect(vectorBuilderA).toEqual(vectorA);
|
|
372
|
+
expect(vectorBuilderB).toEqual(vectorB);
|
|
373
|
+
});
|
|
374
|
+
it('makes a 0 vector for invalid string', () => {
|
|
375
|
+
const regular = '1.33, sdfg, 3.55';
|
|
376
|
+
expect(new Vector2Builder(regular)).toEqual(VECTOR2_ZERO);
|
|
377
|
+
});
|
|
378
|
+
it('should be able compute the lerp halfway between two vectors with the same result as the coreHelpers function', () => {
|
|
379
|
+
const vectorA = new Vector2Builder(5, 6);
|
|
380
|
+
const vectorB = new Vector2Builder(4, 2);
|
|
381
|
+
const ratio = 0.4;
|
|
382
|
+
const resultA = Vector2Utils.lerp(vectorA, vectorB, ratio);
|
|
383
|
+
const resultB = vectorA.lerp(vectorB, ratio);
|
|
384
|
+
expect(resultA).toEqual(resultB);
|
|
385
|
+
});
|
|
386
|
+
it('should be able compute the slerp halfway between two vectors with the same result as the coreHelpers function', () => {
|
|
387
|
+
const vectorA = new Vector2Builder(5, 6);
|
|
388
|
+
const vectorB = new Vector2Builder(4, 2);
|
|
389
|
+
const ratio = 0.4;
|
|
390
|
+
const resultA = Vector2Utils.slerp(vectorA, vectorB, ratio);
|
|
391
|
+
const resultB = vectorA.slerp(vectorB, ratio);
|
|
392
|
+
expect(resultA).toEqual(resultB);
|
|
393
|
+
});
|
|
394
|
+
it('should be able to multiply with the same result as the coreHelpers function', () => {
|
|
395
|
+
const vectorA = new Vector2Builder(5, 6);
|
|
396
|
+
const vectorB = new Vector2Builder(4, 2);
|
|
397
|
+
const resultA = Vector2Utils.multiply(vectorA, vectorB);
|
|
398
|
+
const resultB = vectorA.multiply(vectorB);
|
|
399
|
+
expect(resultA).toEqual(resultB);
|
|
400
|
+
});
|
|
401
|
+
});
|
|
402
|
+
describe('VectorXZBuilder', () => {
|
|
403
|
+
it('should be able to compute a string representation of the vector with the same result as the coreHelpers function', () => {
|
|
404
|
+
const vectorA = new VectorXZBuilder(1.33, 2.14);
|
|
405
|
+
const vectorB = VectorXZUtils.toString(vectorA, { decimals: 1, delimiter: ' ' });
|
|
406
|
+
const result = vectorA.toString({ decimals: 1, delimiter: ' ' });
|
|
407
|
+
expect(result).toEqual(vectorB);
|
|
408
|
+
});
|
|
409
|
+
it('should be able to compute a string representation of the vector with the same result as the coreHelpers function using a string', () => {
|
|
410
|
+
const regular = '1.33, 2.14';
|
|
411
|
+
const alternateDelimiter = '1.33+2.14';
|
|
412
|
+
const vectorBuilderA = new VectorXZBuilder(regular);
|
|
413
|
+
const vectorBuilderB = new VectorXZBuilder(alternateDelimiter, '+');
|
|
414
|
+
const vectorA = VectorXZUtils.fromString(regular);
|
|
415
|
+
const vectorB = VectorXZUtils.fromString(alternateDelimiter, '+');
|
|
416
|
+
expect(vectorBuilderA).toEqual(vectorA);
|
|
417
|
+
expect(vectorBuilderB).toEqual(vectorB);
|
|
418
|
+
});
|
|
419
|
+
it('makes a 0 vector for invalid string', () => {
|
|
420
|
+
const regular = '1.33, sdfg';
|
|
421
|
+
expect(new VectorXZBuilder(regular)).toEqual({ x: 0, z: 0 });
|
|
422
|
+
});
|
|
423
|
+
it('should be able to assign a VectorXZ', () => {
|
|
424
|
+
const vector = new VectorXZBuilder(1, 2);
|
|
425
|
+
const updated = vector.assign({ x: 4, z: 5 });
|
|
426
|
+
expect(updated.x).toBe(4);
|
|
427
|
+
expect(updated.z).toBe(5);
|
|
428
|
+
expect(updated).toBe(vector); // Referential equality must be preserved
|
|
429
|
+
});
|
|
430
|
+
it('should be able to check equality with the same result as the coreHelpers function', () => {
|
|
431
|
+
const vectorA = new VectorXZBuilder(1, 2);
|
|
432
|
+
const vectorB = new VectorXZBuilder(1, 2);
|
|
433
|
+
const vectorC = new VectorXZBuilder(4, 5);
|
|
434
|
+
expect(vectorA.equals(vectorB)).toBe(VectorXZUtils.equals(vectorA, vectorB));
|
|
435
|
+
expect(vectorA.equals(vectorC)).toBe(VectorXZUtils.equals(vectorA, vectorC));
|
|
436
|
+
});
|
|
437
|
+
it('should be able to add a vectorXZ with the same result as the coreHelpers function', () => {
|
|
438
|
+
const vectorA = new VectorXZBuilder(1, 2);
|
|
439
|
+
const vectorB = new VectorXZBuilder(4, 5);
|
|
440
|
+
const vectorC = VectorXZUtils.add(vectorA, vectorB);
|
|
441
|
+
const result = vectorA.add(vectorB);
|
|
442
|
+
expect(result).toEqual(vectorC);
|
|
443
|
+
expect(vectorA).toBe(result); // Referential equality must be preserved
|
|
444
|
+
// Subsequent chained adds should work as expected
|
|
445
|
+
const toAdd = { x: 1, z: 1 };
|
|
446
|
+
const resultTwo = vectorA.add(toAdd).add(toAdd).add(toAdd);
|
|
447
|
+
expect(resultTwo).toEqual({ x: 8, z: 10 });
|
|
448
|
+
expect(resultTwo).toBe(vectorA); // Referential equality must be preserved
|
|
449
|
+
});
|
|
450
|
+
it('should be able to add a partial vectorXZ with the same result as the coreHelpers function', () => {
|
|
451
|
+
const vectorA = new VectorXZBuilder(1, 2);
|
|
452
|
+
const vectorB = { x: 4 };
|
|
453
|
+
const vectorC = VectorXZUtils.add(vectorA, vectorB);
|
|
454
|
+
const result = vectorA.add(vectorB);
|
|
455
|
+
expect(result).toEqual(vectorC);
|
|
456
|
+
expect(vectorA).toBe(result); // Referential equality must be preserved
|
|
457
|
+
});
|
|
458
|
+
it('should be able to subtract a vectorXZ with the same result as the coreHelpers function', () => {
|
|
459
|
+
const vectorA = new VectorXZBuilder(5, 7);
|
|
460
|
+
const vectorB = new VectorXZBuilder(4, 5);
|
|
461
|
+
const vectorC = VectorXZUtils.subtract(vectorA, vectorB);
|
|
462
|
+
const result = vectorA.subtract(vectorB);
|
|
463
|
+
expect(result).toEqual(vectorC);
|
|
464
|
+
expect(vectorA).toBe(result); // Referential equality must be preserved
|
|
465
|
+
// Subsequent chained subtracts should work as expected
|
|
466
|
+
const toSubtract = { x: 1, z: 1 };
|
|
467
|
+
const resultTwo = vectorA.subtract(toSubtract).subtract(toSubtract).subtract(toSubtract);
|
|
468
|
+
expect(resultTwo).toEqual({ x: -2, z: -1 });
|
|
469
|
+
expect(resultTwo).toBe(vectorA); // Referential equality must be preserved
|
|
470
|
+
});
|
|
471
|
+
it('should be able to subtract a partial vectorXZ with the same result as the coreHelpers function', () => {
|
|
472
|
+
const vectorA = new VectorXZBuilder(1, 2);
|
|
473
|
+
const vectorB = { x: 4 };
|
|
474
|
+
const vectorC = VectorXZUtils.subtract(vectorA, vectorB);
|
|
475
|
+
const result = vectorA.subtract(vectorB);
|
|
476
|
+
expect(result).toEqual(vectorC);
|
|
477
|
+
expect(vectorA).toBe(result); // Referential equality must be preserved
|
|
478
|
+
});
|
|
479
|
+
it('should be able to scale a vectorXZ with the same result as the coreHelpers function', () => {
|
|
480
|
+
const vectorA = new VectorXZBuilder(1, 2);
|
|
481
|
+
const vectorB = VectorXZUtils.scale(vectorA, 3);
|
|
482
|
+
const result = vectorA.scale(3);
|
|
483
|
+
expect(result).toEqual(vectorB);
|
|
484
|
+
expect(vectorA).toBe(result); // Referential equality must be preserved
|
|
485
|
+
// Subsequent chained subtracts should work as expected
|
|
486
|
+
const resultTwo = vectorA.scale(3).scale(3);
|
|
487
|
+
expect(resultTwo).toEqual({ x: 27, z: 54 });
|
|
488
|
+
expect(resultTwo).toBe(vectorA); // Referential equality must be preserved
|
|
489
|
+
});
|
|
490
|
+
it('should be able to compute the dot product with the same result as the coreHelpers function', () => {
|
|
491
|
+
const vectorA = new VectorXZBuilder(1, 2);
|
|
492
|
+
const vectorB = new VectorXZBuilder(4, 5);
|
|
493
|
+
const dotProduct = VectorXZUtils.dot(vectorA, vectorB);
|
|
494
|
+
const result = vectorA.dot(vectorB);
|
|
495
|
+
expect(result).toEqual(dotProduct);
|
|
496
|
+
});
|
|
497
|
+
it('should be able to compute the magnitude with the same result as the coreHelpers function', () => {
|
|
498
|
+
const vectorA = new VectorXZBuilder(1, 2);
|
|
499
|
+
const mag = VectorXZUtils.magnitude(vectorA);
|
|
500
|
+
expect(vectorA.magnitude()).toEqual(mag);
|
|
501
|
+
});
|
|
502
|
+
it('should be able to compute the distance between two vectors with the same result as the coreHelpers function', () => {
|
|
503
|
+
const vectorA = new VectorXZBuilder(1, 2);
|
|
504
|
+
const vectorB = new VectorXZBuilder(4, 5);
|
|
505
|
+
const mag = VectorXZUtils.distance(vectorA, vectorB);
|
|
506
|
+
expect(vectorA.distance(vectorB)).toEqual(mag);
|
|
507
|
+
});
|
|
508
|
+
it('should be able to normalize the vector with the same result as the coreHelpers function', () => {
|
|
509
|
+
const vectorA = new VectorXZBuilder(1, 2);
|
|
510
|
+
const vectorB = VectorXZUtils.normalize(vectorA);
|
|
511
|
+
const result = vectorA.normalize();
|
|
512
|
+
expect(result).toEqual(vectorB);
|
|
513
|
+
expect(vectorA).toBe(result); // Referential equality must be preserved
|
|
514
|
+
});
|
|
515
|
+
it('should be able to compute the floor of the vector with the same result as the coreHelpers function', () => {
|
|
516
|
+
const vectorA = new VectorXZBuilder(1.33, 2.14);
|
|
517
|
+
const vectorB = VectorXZUtils.floor(vectorA);
|
|
518
|
+
const result = vectorA.floor();
|
|
519
|
+
expect(result).toEqual(vectorB);
|
|
520
|
+
expect(vectorA).toBe(result); // Referential equality must be preserved
|
|
521
|
+
});
|
|
522
|
+
it('should be able to clamp the vector with the same result as the coreHelpers function', () => {
|
|
523
|
+
const vectorA = new VectorXZBuilder(1, 2);
|
|
524
|
+
const minVec = { x: 0, z: 1.5 };
|
|
525
|
+
const maxVec = { x: 2 };
|
|
526
|
+
const vectorB = VectorXZUtils.clamp(vectorA, { min: minVec, max: maxVec });
|
|
527
|
+
const result = vectorA.clamp({ min: minVec, max: maxVec });
|
|
528
|
+
expect(result).toEqual(vectorB);
|
|
529
|
+
expect(vectorA).toBe(result); // Referential equality must be preserved
|
|
530
|
+
});
|
|
531
|
+
it('should be able to compute a string representation of the vector with the same result as the coreHelpers function', () => {
|
|
532
|
+
const vectorA = new VectorXZBuilder(1.33, 2.14);
|
|
533
|
+
const vectorB = VectorXZUtils.toString(vectorA, { decimals: 1, delimiter: ' ' });
|
|
534
|
+
const result = vectorA.toString({ decimals: 1, delimiter: ' ' });
|
|
535
|
+
expect(result).toEqual(vectorB);
|
|
536
|
+
});
|
|
537
|
+
it('should be able to compute a string representation of the vector with the same result as the coreHelpers function using a string', () => {
|
|
538
|
+
const regular = '1.33, 2.14';
|
|
539
|
+
const alternateDelimiter = '1.33+2.14';
|
|
540
|
+
const vectorBuilderA = new VectorXZBuilder(regular);
|
|
541
|
+
const vectorBuilderB = new VectorXZBuilder(alternateDelimiter, '+');
|
|
542
|
+
const vectorA = VectorXZUtils.fromString(regular);
|
|
543
|
+
const vectorB = VectorXZUtils.fromString(alternateDelimiter, '+');
|
|
544
|
+
expect(vectorBuilderA).toEqual(vectorA);
|
|
545
|
+
expect(vectorBuilderB).toEqual(vectorB);
|
|
546
|
+
});
|
|
547
|
+
it('makes a 0 vector for invalid string', () => {
|
|
548
|
+
const regular = '1.33, sdfg, 3.55';
|
|
549
|
+
expect(new VectorXZBuilder(regular)).toEqual({ x: 0, z: 0 });
|
|
550
|
+
});
|
|
551
|
+
it('should be able compute the lerp halfway between two vectors with the same result as the coreHelpers function', () => {
|
|
552
|
+
const vectorA = new VectorXZBuilder(5, 6);
|
|
553
|
+
const vectorB = new VectorXZBuilder(4, 2);
|
|
554
|
+
const ratio = 0.4;
|
|
555
|
+
const resultA = VectorXZUtils.lerp(vectorA, vectorB, ratio);
|
|
556
|
+
const resultB = vectorA.lerp(vectorB, ratio);
|
|
557
|
+
expect(resultA).toEqual(resultB);
|
|
558
|
+
});
|
|
559
|
+
it('should be able compute the slerp halfway between two vectors with the same result as the coreHelpers function', () => {
|
|
560
|
+
const vectorA = new VectorXZBuilder(5, 6);
|
|
561
|
+
const vectorB = new VectorXZBuilder(4, 2);
|
|
562
|
+
const ratio = 0.4;
|
|
563
|
+
const resultA = VectorXZUtils.slerp(vectorA, vectorB, ratio);
|
|
564
|
+
const resultB = vectorA.slerp(vectorB, ratio);
|
|
565
|
+
expect(resultA).toEqual(resultB);
|
|
566
|
+
});
|
|
567
|
+
it('should be able to multiply with the same result as the coreHelpers function', () => {
|
|
568
|
+
const vectorA = new VectorXZBuilder(5, 6);
|
|
569
|
+
const vectorB = new VectorXZBuilder(4, 2);
|
|
570
|
+
const resultA = VectorXZUtils.multiply(vectorA, vectorB);
|
|
571
|
+
const resultB = vectorA.multiply(vectorB);
|
|
572
|
+
expect(resultA).toEqual(resultB);
|
|
573
|
+
});
|
|
574
|
+
});
|
|
575
|
+
//# sourceMappingURL=vectorWrapper.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vectorWrapper.test.js","sourceRoot":"","sources":["../../../src/vector3/vectorWrapper.test.ts"],"names":[],"mappings":"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"}
|