@pawells/math-extended 1.0.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 (195) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +319 -0
  3. package/build/angles.d.ts +31 -0
  4. package/build/angles.d.ts.map +1 -0
  5. package/build/angles.js +85 -0
  6. package/build/angles.js.map +1 -0
  7. package/build/angles.spec.d.ts +2 -0
  8. package/build/angles.spec.d.ts.map +1 -0
  9. package/build/angles.spec.js +147 -0
  10. package/build/angles.spec.js.map +1 -0
  11. package/build/clamp.d.ts +17 -0
  12. package/build/clamp.d.ts.map +1 -0
  13. package/build/clamp.js +19 -0
  14. package/build/clamp.js.map +1 -0
  15. package/build/clamp.spec.d.ts +2 -0
  16. package/build/clamp.spec.d.ts.map +1 -0
  17. package/build/clamp.spec.js +19 -0
  18. package/build/clamp.spec.js.map +1 -0
  19. package/build/documentation-validation.spec.d.ts +11 -0
  20. package/build/documentation-validation.spec.d.ts.map +1 -0
  21. package/build/documentation-validation.spec.js +401 -0
  22. package/build/documentation-validation.spec.js.map +1 -0
  23. package/build/index.d.ts +8 -0
  24. package/build/index.d.ts.map +1 -0
  25. package/build/index.js +8 -0
  26. package/build/index.js.map +1 -0
  27. package/build/interpolation.d.ts +175 -0
  28. package/build/interpolation.d.ts.map +1 -0
  29. package/build/interpolation.js +369 -0
  30. package/build/interpolation.js.map +1 -0
  31. package/build/interpolation.spec.d.ts +2 -0
  32. package/build/interpolation.spec.d.ts.map +1 -0
  33. package/build/interpolation.spec.js +480 -0
  34. package/build/interpolation.spec.js.map +1 -0
  35. package/build/matrices/arithmetic.d.ts +411 -0
  36. package/build/matrices/arithmetic.d.ts.map +1 -0
  37. package/build/matrices/arithmetic.js +954 -0
  38. package/build/matrices/arithmetic.js.map +1 -0
  39. package/build/matrices/arithmetic.spec.d.ts +2 -0
  40. package/build/matrices/arithmetic.spec.d.ts.map +1 -0
  41. package/build/matrices/arithmetic.spec.js +915 -0
  42. package/build/matrices/arithmetic.spec.js.map +1 -0
  43. package/build/matrices/asserts.d.ts +306 -0
  44. package/build/matrices/asserts.d.ts.map +1 -0
  45. package/build/matrices/asserts.js +396 -0
  46. package/build/matrices/asserts.js.map +1 -0
  47. package/build/matrices/asserts.spec.d.ts +2 -0
  48. package/build/matrices/asserts.spec.d.ts.map +1 -0
  49. package/build/matrices/asserts.spec.js +565 -0
  50. package/build/matrices/asserts.spec.js.map +1 -0
  51. package/build/matrices/core.d.ts +168 -0
  52. package/build/matrices/core.d.ts.map +1 -0
  53. package/build/matrices/core.js +457 -0
  54. package/build/matrices/core.js.map +1 -0
  55. package/build/matrices/core.spec.d.ts +2 -0
  56. package/build/matrices/core.spec.d.ts.map +1 -0
  57. package/build/matrices/core.spec.js +634 -0
  58. package/build/matrices/core.spec.js.map +1 -0
  59. package/build/matrices/decompositions.d.ts +326 -0
  60. package/build/matrices/decompositions.d.ts.map +1 -0
  61. package/build/matrices/decompositions.js +816 -0
  62. package/build/matrices/decompositions.js.map +1 -0
  63. package/build/matrices/decompositions.spec.d.ts +2 -0
  64. package/build/matrices/decompositions.spec.d.ts.map +1 -0
  65. package/build/matrices/decompositions.spec.js +195 -0
  66. package/build/matrices/decompositions.spec.js.map +1 -0
  67. package/build/matrices/index.d.ts +9 -0
  68. package/build/matrices/index.d.ts.map +1 -0
  69. package/build/matrices/index.js +9 -0
  70. package/build/matrices/index.js.map +1 -0
  71. package/build/matrices/linear-algebra.d.ts +64 -0
  72. package/build/matrices/linear-algebra.d.ts.map +1 -0
  73. package/build/matrices/linear-algebra.js +253 -0
  74. package/build/matrices/linear-algebra.js.map +1 -0
  75. package/build/matrices/linear-algebra.spec.d.ts +2 -0
  76. package/build/matrices/linear-algebra.spec.d.ts.map +1 -0
  77. package/build/matrices/linear-algebra.spec.js +355 -0
  78. package/build/matrices/linear-algebra.spec.js.map +1 -0
  79. package/build/matrices/normalization.d.ts +62 -0
  80. package/build/matrices/normalization.d.ts.map +1 -0
  81. package/build/matrices/normalization.js +167 -0
  82. package/build/matrices/normalization.js.map +1 -0
  83. package/build/matrices/normalization.spec.d.ts +2 -0
  84. package/build/matrices/normalization.spec.d.ts.map +1 -0
  85. package/build/matrices/normalization.spec.js +335 -0
  86. package/build/matrices/normalization.spec.js.map +1 -0
  87. package/build/matrices/transformations.d.ts +484 -0
  88. package/build/matrices/transformations.d.ts.map +1 -0
  89. package/build/matrices/transformations.js +592 -0
  90. package/build/matrices/transformations.js.map +1 -0
  91. package/build/matrices/transformations.spec.d.ts +2 -0
  92. package/build/matrices/transformations.spec.d.ts.map +1 -0
  93. package/build/matrices/transformations.spec.js +755 -0
  94. package/build/matrices/transformations.spec.js.map +1 -0
  95. package/build/matrices/types.d.ts +134 -0
  96. package/build/matrices/types.d.ts.map +1 -0
  97. package/build/matrices/types.js +6 -0
  98. package/build/matrices/types.js.map +1 -0
  99. package/build/quaternions/asserts.d.ts +77 -0
  100. package/build/quaternions/asserts.d.ts.map +1 -0
  101. package/build/quaternions/asserts.js +175 -0
  102. package/build/quaternions/asserts.js.map +1 -0
  103. package/build/quaternions/asserts.spec.d.ts +2 -0
  104. package/build/quaternions/asserts.spec.d.ts.map +1 -0
  105. package/build/quaternions/asserts.spec.js +320 -0
  106. package/build/quaternions/asserts.spec.js.map +1 -0
  107. package/build/quaternions/conversions.d.ts +73 -0
  108. package/build/quaternions/conversions.d.ts.map +1 -0
  109. package/build/quaternions/conversions.js +179 -0
  110. package/build/quaternions/conversions.js.map +1 -0
  111. package/build/quaternions/conversions.spec.d.ts +2 -0
  112. package/build/quaternions/conversions.spec.d.ts.map +1 -0
  113. package/build/quaternions/conversions.spec.js +344 -0
  114. package/build/quaternions/conversions.spec.js.map +1 -0
  115. package/build/quaternions/core.d.ts +203 -0
  116. package/build/quaternions/core.d.ts.map +1 -0
  117. package/build/quaternions/core.js +374 -0
  118. package/build/quaternions/core.js.map +1 -0
  119. package/build/quaternions/core.spec.d.ts +2 -0
  120. package/build/quaternions/core.spec.d.ts.map +1 -0
  121. package/build/quaternions/core.spec.js +294 -0
  122. package/build/quaternions/core.spec.js.map +1 -0
  123. package/build/quaternions/index.d.ts +7 -0
  124. package/build/quaternions/index.d.ts.map +1 -0
  125. package/build/quaternions/index.js +7 -0
  126. package/build/quaternions/index.js.map +1 -0
  127. package/build/quaternions/interpolation.d.ts +54 -0
  128. package/build/quaternions/interpolation.d.ts.map +1 -0
  129. package/build/quaternions/interpolation.js +201 -0
  130. package/build/quaternions/interpolation.js.map +1 -0
  131. package/build/quaternions/interpolation.spec.d.ts +2 -0
  132. package/build/quaternions/interpolation.spec.d.ts.map +1 -0
  133. package/build/quaternions/interpolation.spec.js +64 -0
  134. package/build/quaternions/interpolation.spec.js.map +1 -0
  135. package/build/quaternions/predefined.d.ts +36 -0
  136. package/build/quaternions/predefined.d.ts.map +1 -0
  137. package/build/quaternions/predefined.js +42 -0
  138. package/build/quaternions/predefined.js.map +1 -0
  139. package/build/quaternions/predefined.spec.d.ts +2 -0
  140. package/build/quaternions/predefined.spec.d.ts.map +1 -0
  141. package/build/quaternions/predefined.spec.js +35 -0
  142. package/build/quaternions/predefined.spec.js.map +1 -0
  143. package/build/quaternions/types.d.ts +55 -0
  144. package/build/quaternions/types.d.ts.map +1 -0
  145. package/build/quaternions/types.js +7 -0
  146. package/build/quaternions/types.js.map +1 -0
  147. package/build/random.d.ts +66 -0
  148. package/build/random.d.ts.map +1 -0
  149. package/build/random.js +115 -0
  150. package/build/random.js.map +1 -0
  151. package/build/random.spec.d.ts +2 -0
  152. package/build/random.spec.d.ts.map +1 -0
  153. package/build/random.spec.js +267 -0
  154. package/build/random.spec.js.map +1 -0
  155. package/build/vectors/asserts.d.ts +182 -0
  156. package/build/vectors/asserts.d.ts.map +1 -0
  157. package/build/vectors/asserts.js +285 -0
  158. package/build/vectors/asserts.js.map +1 -0
  159. package/build/vectors/asserts.spec.d.ts +2 -0
  160. package/build/vectors/asserts.spec.d.ts.map +1 -0
  161. package/build/vectors/asserts.spec.js +260 -0
  162. package/build/vectors/asserts.spec.js.map +1 -0
  163. package/build/vectors/core.d.ts +507 -0
  164. package/build/vectors/core.d.ts.map +1 -0
  165. package/build/vectors/core.js +825 -0
  166. package/build/vectors/core.js.map +1 -0
  167. package/build/vectors/core.spec.d.ts +2 -0
  168. package/build/vectors/core.spec.d.ts.map +1 -0
  169. package/build/vectors/core.spec.js +343 -0
  170. package/build/vectors/core.spec.js.map +1 -0
  171. package/build/vectors/index.d.ts +6 -0
  172. package/build/vectors/index.d.ts.map +1 -0
  173. package/build/vectors/index.js +6 -0
  174. package/build/vectors/index.js.map +1 -0
  175. package/build/vectors/interpolation.d.ts +404 -0
  176. package/build/vectors/interpolation.d.ts.map +1 -0
  177. package/build/vectors/interpolation.js +585 -0
  178. package/build/vectors/interpolation.js.map +1 -0
  179. package/build/vectors/interpolation.spec.d.ts +2 -0
  180. package/build/vectors/interpolation.spec.d.ts.map +1 -0
  181. package/build/vectors/interpolation.spec.js +378 -0
  182. package/build/vectors/interpolation.spec.js.map +1 -0
  183. package/build/vectors/predefined.d.ts +191 -0
  184. package/build/vectors/predefined.d.ts.map +1 -0
  185. package/build/vectors/predefined.js +191 -0
  186. package/build/vectors/predefined.js.map +1 -0
  187. package/build/vectors/predefined.spec.d.ts +2 -0
  188. package/build/vectors/predefined.spec.d.ts.map +1 -0
  189. package/build/vectors/predefined.spec.js +333 -0
  190. package/build/vectors/predefined.spec.js.map +1 -0
  191. package/build/vectors/types.d.ts +62 -0
  192. package/build/vectors/types.d.ts.map +1 -0
  193. package/build/vectors/types.js +6 -0
  194. package/build/vectors/types.js.map +1 -0
  195. package/package.json +75 -0
@@ -0,0 +1,565 @@
1
+ import { AssertMatrix, AssertMatrix1, AssertMatrix2, AssertMatrix3, AssertMatrix4, AssertMatrices, AssertMatrixRow, AssertMatrixValue, MatrixError, } from './asserts.js';
2
+ describe('Matrix Assertions', () => {
3
+ describe('MatrixError', () => {
4
+ test('should create MatrixError with default message', () => {
5
+ const error = new MatrixError();
6
+ expect(error.name).toBe('MatrixError');
7
+ expect(error.message).toBe('');
8
+ expect(error instanceof Error).toBe(true);
9
+ expect(error instanceof MatrixError).toBe(true);
10
+ });
11
+ test('should create MatrixError with custom message', () => {
12
+ const message = 'Custom matrix error message';
13
+ const error = new MatrixError(message);
14
+ expect(error.name).toBe('MatrixError');
15
+ expect(error.message).toBe(message);
16
+ expect(error instanceof Error).toBe(true);
17
+ expect(error instanceof MatrixError).toBe(true);
18
+ });
19
+ test('should maintain proper prototype chain', () => {
20
+ const error = new MatrixError('Test');
21
+ expect(Object.getPrototypeOf(error)).toBe(MatrixError.prototype);
22
+ });
23
+ });
24
+ describe('AssertMatrix', () => {
25
+ describe('valid matrices', () => {
26
+ test('should accept valid 2x2 matrix', () => {
27
+ const matrix = [[1, 2], [3, 4]];
28
+ expect(() => AssertMatrix(matrix)).not.toThrow();
29
+ });
30
+ test('should accept valid 3x3 matrix', () => {
31
+ const matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
32
+ expect(() => AssertMatrix(matrix)).not.toThrow();
33
+ });
34
+ test('should accept rectangular matrix', () => {
35
+ const matrix = [[1, 2, 3], [4, 5, 6]];
36
+ expect(() => AssertMatrix(matrix)).not.toThrow();
37
+ });
38
+ test('should accept single element matrix', () => {
39
+ const matrix = [[5]];
40
+ expect(() => AssertMatrix(matrix)).not.toThrow();
41
+ });
42
+ test('should accept matrix with zeros', () => {
43
+ const matrix = [[0, 0], [0, 0]];
44
+ expect(() => AssertMatrix(matrix)).not.toThrow();
45
+ });
46
+ test('should accept matrix with negative numbers', () => {
47
+ const matrix = [[-1, -2], [-3, -4]];
48
+ expect(() => AssertMatrix(matrix)).not.toThrow();
49
+ });
50
+ test('should accept matrix with floating point numbers', () => {
51
+ const matrix = [[1.5, 2.7], [3.14, 4.2]];
52
+ expect(() => AssertMatrix(matrix)).not.toThrow();
53
+ });
54
+ });
55
+ describe('invalid matrices', () => {
56
+ test('should throw for non-array input', () => {
57
+ expect(() => AssertMatrix('not a matrix')).toThrow(MatrixError);
58
+ expect(() => AssertMatrix(42)).toThrow(MatrixError);
59
+ expect(() => AssertMatrix(null)).toThrow(MatrixError);
60
+ expect(() => AssertMatrix(undefined)).toThrow(MatrixError);
61
+ });
62
+ test('should throw for matrix with non-numeric elements', () => {
63
+ const matrix = [[1, 'invalid'], [3, 4]];
64
+ expect(() => AssertMatrix(matrix)).toThrow(MatrixError);
65
+ });
66
+ test('should throw for matrix with NaN elements', () => {
67
+ const matrix = [[1, NaN], [3, 4]];
68
+ expect(() => AssertMatrix(matrix)).toThrow(MatrixError);
69
+ });
70
+ test('should throw for matrix with non-array rows', () => {
71
+ const matrix = [1, 2, 3];
72
+ expect(() => AssertMatrix(matrix)).toThrow(MatrixError);
73
+ });
74
+ });
75
+ describe('size constraints', () => {
76
+ test('should accept matrix with exact size tuple', () => {
77
+ const matrix = [[1, 2, 3], [4, 5, 6]];
78
+ expect(() => AssertMatrix(matrix, { size: [2, 3] })).not.toThrow();
79
+ });
80
+ test('should throw for matrix with wrong size tuple', () => {
81
+ const matrix = [[1, 2], [3, 4]];
82
+ expect(() => AssertMatrix(matrix, { size: [3, 3] })).toThrow(MatrixError);
83
+ });
84
+ test('should accept square matrix with exact size number', () => {
85
+ const matrix = [[1, 2], [3, 4]];
86
+ expect(() => AssertMatrix(matrix, { size: 2 })).not.toThrow();
87
+ });
88
+ test('should throw for non-square matrix when size number specified', () => {
89
+ const matrix = [[1, 2, 3], [4, 5, 6]];
90
+ expect(() => AssertMatrix(matrix, { size: 2 })).toThrow(MatrixError);
91
+ });
92
+ test('should accept matrix with exact rows', () => {
93
+ const matrix = [[1, 2], [3, 4], [5, 6]];
94
+ expect(() => AssertMatrix(matrix, { rows: 3 })).not.toThrow();
95
+ });
96
+ test('should throw for matrix with wrong rows', () => {
97
+ const matrix = [[1, 2], [3, 4]];
98
+ expect(() => AssertMatrix(matrix, { rows: 3 })).toThrow(MatrixError);
99
+ });
100
+ test('should accept matrix with exact columns', () => {
101
+ const matrix = [[1, 2, 3], [4, 5, 6]];
102
+ expect(() => AssertMatrix(matrix, { columns: 3 })).not.toThrow();
103
+ });
104
+ test('should throw for matrix with wrong columns', () => {
105
+ const matrix = [[1, 2], [3, 4]];
106
+ expect(() => AssertMatrix(matrix, { columns: 3 })).toThrow(MatrixError);
107
+ });
108
+ test('should accept matrix with minimum rows', () => {
109
+ const matrix = [[1, 2], [3, 4], [5, 6]];
110
+ expect(() => AssertMatrix(matrix, { minRows: 2 })).not.toThrow();
111
+ });
112
+ test('should throw for matrix with too few rows', () => {
113
+ const matrix = [[1, 2]];
114
+ expect(() => AssertMatrix(matrix, { minRows: 3 })).toThrow(MatrixError);
115
+ });
116
+ test('should accept matrix with maximum rows', () => {
117
+ const matrix = [[1, 2], [3, 4]];
118
+ expect(() => AssertMatrix(matrix, { maxRows: 3 })).not.toThrow();
119
+ });
120
+ test('should throw for matrix with too many rows', () => {
121
+ const matrix = [[1, 2], [3, 4], [5, 6], [7, 8]];
122
+ expect(() => AssertMatrix(matrix, { maxRows: 3 })).toThrow(MatrixError);
123
+ });
124
+ test('should accept matrix with minimum columns', () => {
125
+ const matrix = [[1, 2, 3], [4, 5, 6]];
126
+ expect(() => AssertMatrix(matrix, { minColumns: 2 })).not.toThrow();
127
+ });
128
+ test('should throw for matrix with too few columns', () => {
129
+ const matrix = [[1], [2]];
130
+ expect(() => AssertMatrix(matrix, { minColumns: 3 })).toThrow(MatrixError);
131
+ });
132
+ test('should accept matrix with maximum columns', () => {
133
+ const matrix = [[1, 2], [3, 4]];
134
+ expect(() => AssertMatrix(matrix, { maxColumns: 3 })).not.toThrow();
135
+ });
136
+ test('should throw for matrix with too many columns', () => {
137
+ const matrix = [[1, 2, 3, 4], [5, 6, 7, 8]];
138
+ expect(() => AssertMatrix(matrix, { maxColumns: 3 })).toThrow(MatrixError);
139
+ });
140
+ test('should accept square matrix when square constraint is true', () => {
141
+ const matrix = [[1, 2], [3, 4]];
142
+ expect(() => AssertMatrix(matrix, { square: true })).not.toThrow();
143
+ });
144
+ test('should throw for non-square matrix when square constraint is true', () => {
145
+ const matrix = [[1, 2, 3], [4, 5, 6]];
146
+ expect(() => AssertMatrix(matrix, { square: true })).toThrow(MatrixError);
147
+ });
148
+ });
149
+ describe('combined constraints', () => {
150
+ test('should accept matrix meeting all constraints', () => {
151
+ const matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
152
+ expect(() => AssertMatrix(matrix, {
153
+ minRows: 2,
154
+ maxRows: 5,
155
+ minColumns: 2,
156
+ maxColumns: 5,
157
+ square: true,
158
+ })).not.toThrow();
159
+ });
160
+ test('should throw when any constraint is violated', () => {
161
+ const matrix = [[1, 2, 3], [4, 5, 6]];
162
+ expect(() => AssertMatrix(matrix, {
163
+ minRows: 2,
164
+ square: true,
165
+ })).toThrow(MatrixError);
166
+ });
167
+ });
168
+ describe('custom exceptions', () => {
169
+ test('should use custom exception message', () => {
170
+ const matrix = 'invalid';
171
+ expect(() => AssertMatrix(matrix, {}, { message: 'Custom error message' }))
172
+ .toThrow('Custom error message');
173
+ });
174
+ });
175
+ });
176
+ describe('AssertMatrixRow', () => {
177
+ test('should accept valid number array', () => {
178
+ const row = [1, 2, 3, 4];
179
+ expect(() => AssertMatrixRow(row)).not.toThrow();
180
+ });
181
+ test('should accept empty array', () => {
182
+ const row = [];
183
+ expect(() => AssertMatrixRow(row)).not.toThrow();
184
+ });
185
+ test('should accept array with floating point numbers', () => {
186
+ const row = [1.5, 2.7, 3.14];
187
+ expect(() => AssertMatrixRow(row)).not.toThrow();
188
+ });
189
+ test('should accept array with negative numbers', () => {
190
+ const row = [-1, -2.5, -3];
191
+ expect(() => AssertMatrixRow(row)).not.toThrow();
192
+ });
193
+ test('should accept array with zeros', () => {
194
+ const row = [0, 0, 0];
195
+ expect(() => AssertMatrixRow(row)).not.toThrow();
196
+ });
197
+ test('should throw for non-array input', () => {
198
+ expect(() => AssertMatrixRow('not an array')).toThrow(MatrixError);
199
+ expect(() => AssertMatrixRow(42)).toThrow(MatrixError);
200
+ expect(() => AssertMatrixRow(null)).toThrow(MatrixError);
201
+ expect(() => AssertMatrixRow(undefined)).toThrow(MatrixError);
202
+ });
203
+ test('should throw for array with non-numeric elements', () => {
204
+ const row = [1, 'invalid', 3];
205
+ expect(() => AssertMatrixRow(row)).toThrow(MatrixError);
206
+ });
207
+ test('should throw for array with NaN elements', () => {
208
+ const row = [1, NaN, 3];
209
+ expect(() => AssertMatrixRow(row)).toThrow(MatrixError);
210
+ });
211
+ test('should throw for array with Infinity elements', () => {
212
+ const row = [1, Infinity, 3];
213
+ expect(() => AssertMatrixRow(row)).toThrow(MatrixError);
214
+ });
215
+ test('should throw for array with -Infinity elements', () => {
216
+ const row = [1, -Infinity, 3];
217
+ expect(() => AssertMatrixRow(row)).toThrow(MatrixError);
218
+ });
219
+ test('should include row index in error message when provided', () => {
220
+ const row = 'invalid';
221
+ expect(() => AssertMatrixRow(row, { rowIndex: 2 }))
222
+ .toThrow('Matrix row at row 2 must be an array');
223
+ });
224
+ });
225
+ describe('AssertMatrixValue', () => {
226
+ test('should accept valid finite numbers', () => {
227
+ expect(() => AssertMatrixValue(42)).not.toThrow();
228
+ expect(() => AssertMatrixValue(0)).not.toThrow();
229
+ expect(() => AssertMatrixValue(-5)).not.toThrow();
230
+ expect(() => AssertMatrixValue(3.14)).not.toThrow();
231
+ expect(() => AssertMatrixValue(-2.7)).not.toThrow();
232
+ });
233
+ test('should throw for non-numeric values', () => {
234
+ expect(() => AssertMatrixValue('string')).toThrow(MatrixError);
235
+ expect(() => AssertMatrixValue(true)).toThrow(MatrixError);
236
+ expect(() => AssertMatrixValue([])).toThrow(MatrixError);
237
+ expect(() => AssertMatrixValue({})).toThrow(MatrixError);
238
+ expect(() => AssertMatrixValue(null)).toThrow(MatrixError);
239
+ expect(() => AssertMatrixValue(undefined)).toThrow(MatrixError);
240
+ });
241
+ test('should throw for NaN', () => {
242
+ expect(() => AssertMatrixValue(NaN)).toThrow(MatrixError);
243
+ });
244
+ test('should throw for Infinity', () => {
245
+ expect(() => AssertMatrixValue(Infinity)).toThrow(MatrixError);
246
+ });
247
+ test('should throw for -Infinity', () => {
248
+ expect(() => AssertMatrixValue(-Infinity)).toThrow(MatrixError);
249
+ });
250
+ test('should include position in error message when provided', () => {
251
+ expect(() => AssertMatrixValue('invalid', { rowIndex: 1, columnIndex: 2 }))
252
+ .toThrow('Matrix value at row 1, column 2 must be a finite number');
253
+ });
254
+ });
255
+ describe('AssertMatrices', () => {
256
+ describe('without transposition', () => {
257
+ test('should accept matrices with identical dimensions', () => {
258
+ const a = [[1, 2], [3, 4]];
259
+ const b = [[5, 6], [7, 8]];
260
+ expect(() => AssertMatrices(a, b)).not.toThrow();
261
+ });
262
+ test('should accept larger matrices with identical dimensions', () => {
263
+ const a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
264
+ const b = [[9, 8, 7], [6, 5, 4], [3, 2, 1]];
265
+ expect(() => AssertMatrices(a, b)).not.toThrow();
266
+ });
267
+ test('should accept single element matrices', () => {
268
+ const a = [[1]];
269
+ const b = [[2]];
270
+ expect(() => AssertMatrices(a, b)).not.toThrow();
271
+ });
272
+ test('should throw for matrices with different row counts', () => {
273
+ const a = [[1, 2], [3, 4]];
274
+ const b = [[5, 6], [7, 8], [9, 10]];
275
+ expect(() => AssertMatrices(a, b)).toThrow(MatrixError);
276
+ });
277
+ test('should throw for matrices with different column counts', () => {
278
+ const a = [[1, 2, 3], [4, 5, 6]];
279
+ const b = [[7, 8], [9, 10]];
280
+ expect(() => AssertMatrices(a, b)).toThrow(MatrixError);
281
+ });
282
+ test('should throw for matrices with completely different dimensions', () => {
283
+ const a = [[1, 2]];
284
+ const b = [[3], [4], [5]];
285
+ expect(() => AssertMatrices(a, b)).toThrow(MatrixError);
286
+ });
287
+ });
288
+ describe('with transposition allowed', () => {
289
+ test('should accept matrices compatible for standard multiplication', () => {
290
+ const a = [[1, 2], [3, 4]]; // 2x2
291
+ const b = [[5, 6], [7, 8]]; // 2x2
292
+ expect(() => AssertMatrices(a, b, { transposition: true })).not.toThrow();
293
+ });
294
+ test('should accept matrices where A columns = B rows', () => {
295
+ const a = [[1, 2, 3], [4, 5, 6]]; // 3x2
296
+ const b = [[7, 8], [9, 10], [11, 12]]; // 2x3
297
+ expect(() => AssertMatrices(a, b, { transposition: true })).not.toThrow();
298
+ });
299
+ test('should accept matrices where A columns = B columns (B transposed)', () => {
300
+ const a = [[1, 2], [3, 4]]; // 2x2
301
+ const b = [[5, 7], [6, 8]]; // 2x2, could be transposed to 2x2
302
+ expect(() => AssertMatrices(a, b, { transposition: true })).not.toThrow();
303
+ });
304
+ test('should accept matrices where A rows = B rows (A transposed)', () => {
305
+ const a = [[1, 2], [3, 4]]; // 2x2
306
+ const b = [[5, 6], [7, 8]]; // 2x2
307
+ expect(() => AssertMatrices(a, b, { transposition: true })).not.toThrow();
308
+ });
309
+ test('should accept matrices where A rows = B columns (both transposed)', () => {
310
+ const a = [[1, 2, 3], [4, 5, 6]]; // 3x2
311
+ const b = [[7, 8, 9], [10, 11, 12]]; // 3x2
312
+ expect(() => AssertMatrices(a, b, { transposition: true })).not.toThrow();
313
+ });
314
+ test('should throw for completely incompatible matrices', () => {
315
+ const a = [[1, 2], [3, 4], [5, 6]]; // 2x3
316
+ const b = [[7], [8], [9], [10]]; // 1x4
317
+ expect(() => AssertMatrices(a, b, { transposition: true })).toThrow(MatrixError);
318
+ });
319
+ });
320
+ describe('invalid inputs', () => {
321
+ test('should throw for invalid first matrix', () => {
322
+ const a = 'invalid';
323
+ const b = [[1, 2], [3, 4]];
324
+ expect(() => AssertMatrices(a, b)).toThrow(MatrixError);
325
+ });
326
+ test('should throw for invalid second matrix', () => {
327
+ const a = [[1, 2], [3, 4]];
328
+ const b = 'invalid';
329
+ expect(() => AssertMatrices(a, b)).toThrow(MatrixError);
330
+ });
331
+ test('should throw for both invalid matrices', () => {
332
+ const a = 'invalid';
333
+ const b = 'also invalid';
334
+ expect(() => AssertMatrices(a, b)).toThrow(MatrixError);
335
+ });
336
+ });
337
+ });
338
+ describe('AssertMatrix1', () => {
339
+ test('should accept valid 1x1 matrix', () => {
340
+ const matrix = [[5]];
341
+ expect(() => AssertMatrix1(matrix)).not.toThrow();
342
+ });
343
+ test('should accept 1x1 matrix with zero', () => {
344
+ const matrix = [[0]];
345
+ expect(() => AssertMatrix1(matrix)).not.toThrow();
346
+ });
347
+ test('should accept 1x1 matrix with negative number', () => {
348
+ const matrix = [[-3.14]];
349
+ expect(() => AssertMatrix1(matrix)).not.toThrow();
350
+ });
351
+ test('should throw for 2x2 matrix', () => {
352
+ const matrix = [[1, 2], [3, 4]];
353
+ expect(() => AssertMatrix1(matrix)).toThrow(MatrixError);
354
+ });
355
+ test('should throw for 1x2 matrix', () => {
356
+ const matrix = [[1, 2]];
357
+ expect(() => AssertMatrix1(matrix)).toThrow(MatrixError);
358
+ });
359
+ test('should throw for 2x1 matrix', () => {
360
+ const matrix = [[1], [2]];
361
+ expect(() => AssertMatrix1(matrix)).toThrow(MatrixError);
362
+ });
363
+ test('should throw for empty matrix', () => {
364
+ const matrix = [];
365
+ expect(() => AssertMatrix1(matrix)).toThrow(MatrixError);
366
+ });
367
+ test('should throw for non-matrix input', () => {
368
+ expect(() => AssertMatrix1('invalid')).toThrow(MatrixError);
369
+ expect(() => AssertMatrix1(42)).toThrow(MatrixError);
370
+ });
371
+ });
372
+ describe('AssertMatrix2', () => {
373
+ test('should accept valid 2x2 matrix', () => {
374
+ const matrix = [[1, 2], [3, 4]];
375
+ expect(() => AssertMatrix2(matrix)).not.toThrow();
376
+ });
377
+ test('should accept 2x2 matrix with zeros', () => {
378
+ const matrix = [[0, 0], [0, 0]];
379
+ expect(() => AssertMatrix2(matrix)).not.toThrow();
380
+ });
381
+ test('should accept 2x2 matrix with negative numbers', () => {
382
+ const matrix = [[-1, -2], [-3, -4]];
383
+ expect(() => AssertMatrix2(matrix)).not.toThrow();
384
+ });
385
+ test('should accept 2x2 matrix with floating point numbers', () => {
386
+ const matrix = [[1.5, 2.7], [3.14, 4.2]];
387
+ expect(() => AssertMatrix2(matrix)).not.toThrow();
388
+ });
389
+ test('should throw for 1x1 matrix', () => {
390
+ const matrix = [[5]];
391
+ expect(() => AssertMatrix2(matrix)).toThrow(MatrixError);
392
+ });
393
+ test('should throw for 3x3 matrix', () => {
394
+ const matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
395
+ expect(() => AssertMatrix2(matrix)).toThrow(MatrixError);
396
+ });
397
+ test('should throw for 2x3 matrix', () => {
398
+ const matrix = [[1, 2, 3], [4, 5, 6]];
399
+ expect(() => AssertMatrix2(matrix)).toThrow(MatrixError);
400
+ });
401
+ test('should throw for 3x2 matrix', () => {
402
+ const matrix = [[1, 2], [3, 4], [5, 6]];
403
+ expect(() => AssertMatrix2(matrix)).toThrow(MatrixError);
404
+ });
405
+ test('should throw for non-matrix input', () => {
406
+ expect(() => AssertMatrix2('invalid')).toThrow(MatrixError);
407
+ expect(() => AssertMatrix2([])).toThrow(MatrixError);
408
+ });
409
+ });
410
+ describe('AssertMatrix3', () => {
411
+ test('should accept valid 3x3 matrix', () => {
412
+ const matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
413
+ expect(() => AssertMatrix3(matrix)).not.toThrow();
414
+ });
415
+ test('should accept 3x3 identity matrix', () => {
416
+ const matrix = [[1, 0, 0], [0, 1, 0], [0, 0, 1]];
417
+ expect(() => AssertMatrix3(matrix)).not.toThrow();
418
+ });
419
+ test('should accept 3x3 matrix with mixed numbers', () => {
420
+ const matrix = [[-1.5, 0, 2.7], [3, -4, 5.14], [0, 7, -8.9]];
421
+ expect(() => AssertMatrix3(matrix)).not.toThrow();
422
+ });
423
+ test('should throw for 2x2 matrix', () => {
424
+ const matrix = [[1, 2], [3, 4]];
425
+ expect(() => AssertMatrix3(matrix)).toThrow(MatrixError);
426
+ });
427
+ test('should throw for 4x4 matrix', () => {
428
+ const matrix = [
429
+ [1, 2, 3, 4],
430
+ [5, 6, 7, 8],
431
+ [9, 10, 11, 12],
432
+ [13, 14, 15, 16],
433
+ ];
434
+ expect(() => AssertMatrix3(matrix)).toThrow(MatrixError);
435
+ });
436
+ test('should throw for 3x2 matrix', () => {
437
+ const matrix = [[1, 2], [3, 4], [5, 6]];
438
+ expect(() => AssertMatrix3(matrix)).toThrow(MatrixError);
439
+ });
440
+ test('should throw for 2x3 matrix', () => {
441
+ const matrix = [[1, 2, 3], [4, 5, 6]];
442
+ expect(() => AssertMatrix3(matrix)).toThrow(MatrixError);
443
+ });
444
+ test('should throw for non-matrix input', () => {
445
+ expect(() => AssertMatrix3('invalid')).toThrow(MatrixError);
446
+ expect(() => AssertMatrix3(null)).toThrow(MatrixError);
447
+ });
448
+ });
449
+ describe('AssertMatrix4', () => {
450
+ test('should accept valid 4x4 matrix', () => {
451
+ const matrix = [
452
+ [1, 2, 3, 4],
453
+ [5, 6, 7, 8],
454
+ [9, 10, 11, 12],
455
+ [13, 14, 15, 16],
456
+ ];
457
+ expect(() => AssertMatrix4(matrix)).not.toThrow();
458
+ });
459
+ test('should accept 4x4 identity matrix', () => {
460
+ const matrix = [
461
+ [1, 0, 0, 0],
462
+ [0, 1, 0, 0],
463
+ [0, 0, 1, 0],
464
+ [0, 0, 0, 1],
465
+ ];
466
+ expect(() => AssertMatrix4(matrix)).not.toThrow();
467
+ });
468
+ test('should accept 4x4 matrix with mixed numbers', () => {
469
+ const matrix = [
470
+ [-1.5, 0, 2.7, -3],
471
+ [4, -5.14, 6, 0],
472
+ [0, 7.2, -8, 9],
473
+ [10, 0, -11.5, 12],
474
+ ];
475
+ expect(() => AssertMatrix4(matrix)).not.toThrow();
476
+ });
477
+ test('should throw for 3x3 matrix', () => {
478
+ const matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];
479
+ expect(() => AssertMatrix4(matrix)).toThrow(MatrixError);
480
+ });
481
+ test('should throw for 5x5 matrix', () => {
482
+ const matrix = [
483
+ [1, 2, 3, 4, 5],
484
+ [6, 7, 8, 9, 10],
485
+ [11, 12, 13, 14, 15],
486
+ [16, 17, 18, 19, 20],
487
+ [21, 22, 23, 24, 25],
488
+ ];
489
+ expect(() => AssertMatrix4(matrix)).toThrow(MatrixError);
490
+ });
491
+ test('should throw for 4x3 matrix', () => {
492
+ const matrix = [
493
+ [1, 2, 3],
494
+ [4, 5, 6],
495
+ [7, 8, 9],
496
+ [10, 11, 12],
497
+ ];
498
+ expect(() => AssertMatrix4(matrix)).toThrow(MatrixError);
499
+ });
500
+ test('should throw for 3x4 matrix', () => {
501
+ const matrix = [
502
+ [1, 2, 3, 4],
503
+ [5, 6, 7, 8],
504
+ [9, 10, 11, 12],
505
+ ];
506
+ expect(() => AssertMatrix4(matrix)).toThrow(MatrixError);
507
+ });
508
+ test('should throw for non-matrix input', () => {
509
+ expect(() => AssertMatrix4('invalid')).toThrow(MatrixError);
510
+ expect(() => AssertMatrix4(undefined)).toThrow(MatrixError);
511
+ });
512
+ });
513
+ describe('error message specificity', () => {
514
+ test('AssertMatrix should provide specific error messages for size constraints', () => {
515
+ const matrix = [[1, 2], [3, 4]]; // 2x2
516
+ expect(() => AssertMatrix(matrix, { size: [3, 3] }))
517
+ .toThrow('Matrix has 2 rows, expected exactly 3');
518
+ expect(() => AssertMatrix(matrix, { size: 3 }))
519
+ .toThrow('Square matrix has 2 rows, expected exactly 3');
520
+ expect(() => AssertMatrix(matrix, { rows: 3 }))
521
+ .toThrow('Matrix has 2 rows, expected exactly 3');
522
+ expect(() => AssertMatrix(matrix, { columns: 3 }))
523
+ .toThrow('Matrix has 2 columns, expected exactly 3');
524
+ expect(() => AssertMatrix(matrix, { minRows: 5 }))
525
+ .toThrow('Matrix has 2 rows, minimum required is 5');
526
+ expect(() => AssertMatrix(matrix, { maxRows: 1 }))
527
+ .toThrow('Matrix has 2 rows, maximum allowed is 1');
528
+ expect(() => AssertMatrix(matrix, { minColumns: 5 }))
529
+ .toThrow('Matrix has 2 columns, minimum required is 5');
530
+ expect(() => AssertMatrix(matrix, { maxColumns: 1 }))
531
+ .toThrow('Matrix has 2 columns, maximum allowed is 1');
532
+ expect(() => AssertMatrix([[1, 2, 3], [4, 5, 6]], { square: true }))
533
+ .toThrow('Matrix must be square but has 2 rows and 3 columns');
534
+ });
535
+ test('AssertMatrices should provide specific error messages', () => {
536
+ const a = [[1, 2], [3, 4]]; // 2x2
537
+ const b = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]; // 3x3
538
+ expect(() => AssertMatrices(a, b))
539
+ .toThrow('Matrices must have identical dimensions for addition/subtraction. Matrix A is 2×2, Matrix B is 3×3');
540
+ const c = [[1, 2], [3, 4], [5, 6]]; // 3x2
541
+ const d = [[1], [2], [3], [4]]; // 4x1
542
+ expect(() => AssertMatrices(c, d, { transposition: true }))
543
+ .toThrow('Matrices are not compatible for multiplication even with transposition. Matrix A is 3×2, Matrix B is 4×1');
544
+ });
545
+ });
546
+ describe('edge cases', () => {
547
+ test('should throw for empty matrix', () => {
548
+ const emptyMatrix = [];
549
+ expect(() => AssertMatrix(emptyMatrix)).toThrow('Matrix must have at least one row and one column');
550
+ });
551
+ test('should throw for matrix with empty rows', () => {
552
+ const matrix = [[], []];
553
+ expect(() => AssertMatrix(matrix)).toThrow('Matrix must have at least one row and one column');
554
+ });
555
+ test('should handle very large numbers', () => {
556
+ const matrix = [[Number.MAX_VALUE, Number.MIN_VALUE]];
557
+ expect(() => AssertMatrix(matrix)).not.toThrow();
558
+ });
559
+ test('should handle very small numbers', () => {
560
+ const matrix = [[Number.EPSILON, -Number.EPSILON]];
561
+ expect(() => AssertMatrix(matrix)).not.toThrow();
562
+ });
563
+ });
564
+ });
565
+ //# sourceMappingURL=asserts.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asserts.spec.js","sourceRoot":"","sources":["../../src/matrices/asserts.spec.ts"],"names":[],"mappings":"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"}