• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Tests immutability of operand[s] for all applicable methods.
2// Also tests each Decimal.prototype method against its equivalent Decimal method where applicable.
3if (typeof T === 'undefined') require('../setup');
4
5T('immutability', function () {
6
7  Decimal.config({
8    precision: 20,
9    rounding: 4,
10    toExpNeg: -7,
11    toExpPos: 21,
12    minE: -9e15,
13    maxE: 9e15
14  });
15
16  // Integer [0, 9e15), with each possible number of digits, [1, 16], equally likely.
17  function randInt() {
18    return Math.floor(Math.random() * 9e15 / Math.pow(10, Math.random() * 16 | 0));
19  }
20
21  var a, aa, b, bb, i, k, n, t, v, x, y, z;
22
23  t = T.assertEqualDecimal;
24
25  v = [
26    0,
27    NaN,
28    Infinity,
29    -Infinity,
30    0.5,
31    -0.5,
32    1,
33    -1,
34    (x = Decimal.random()),
35    x.neg(),
36    (x = randInt()),
37    -x,
38    (x = Decimal.random().plus(randInt())),
39    x.neg()
40  ];
41
42  for (i = 0; i < v.length; i++) {
43    a = new Decimal(v[i]);
44    aa = new Decimal(v[i]);
45    k = (Math.random() * 10 | 0) / 10;
46    b = k == 0.5 ? new Decimal(a) : a[k < 0.5 ? 'plus' : 'minus'](Decimal.random().plus(randInt()));
47    bb = new Decimal(b);
48    n = Math.random() * 20 + 1 | 0;
49
50    x = a.absoluteValue();
51    t(a, aa);
52    y = a.abs();
53    t(a, aa);
54    z = Decimal.abs(a);
55    t(a, aa);
56
57    t(x, y);
58    t(y, z);
59
60    x = a.ceil();
61    t(a, aa);
62    y = Decimal.ceil(a);
63    t(a, aa);
64
65    t(x, y);
66
67    x = a.comparedTo(b);
68    t(a, aa);
69    t(b, bb);
70    y = a.cmp(b);
71    t(a, aa);
72    t(b, bb);
73
74    T.assertEqual(x, y);
75
76    x = a.cosine();
77    t(a, aa);
78    y = a.cos();
79    t(a, aa);
80    z = Decimal.cos(a);
81    t(a, aa);
82
83    t(x, y);
84    t(y, z);
85
86    x = a.cubeRoot();
87    t(a, aa);
88    y = a.cbrt();
89    t(a, aa);
90    z = Decimal.cbrt(a);
91    t(a, aa);
92
93    t(x, y);
94    t(y, z);
95
96    x = a.decimalPlaces();
97    t(a, aa);
98    y = a.dp();
99    t(a, aa);
100
101    T.assertEqual(x, y);
102
103    x = a.dividedBy(b);
104    t(a, aa);
105    t(b, bb);
106    y = a.div(b);
107    t(a, aa);
108    t(b, bb);
109    z = Decimal.div(a, b);
110    t(a, aa);
111    t(b, bb);
112
113    t(x, y);
114    t(y, z);
115
116    x = a.dividedToIntegerBy(b);
117    t(a, aa);
118    t(b, bb);
119    y = a.divToInt(b);
120    t(a, aa);
121    t(b, bb);
122
123    t(x, y);
124
125    x = a.equals(b);
126    t(a, aa);
127    t(b, bb);
128    y = a.eq(b);
129    t(a, aa);
130    t(b, bb);
131
132    T.assertEqual(x, y);
133
134    x = a.floor();
135    t(a, aa);
136    y = Decimal.floor(a);
137    t(a, aa);
138
139    t(x, y);
140
141    x = a.greaterThan(b);
142    t(a, aa);
143    t(b, bb);
144    y = a.gt(b);
145    t(a, aa);
146    t(b, bb);
147
148    T.assertEqual(x, y);
149
150    x = a.greaterThanOrEqualTo(b);
151    t(a, aa);
152    t(b, bb);
153    y = a.gte(b);
154    t(a, aa);
155    t(b, bb);
156
157    T.assertEqual(x, y);
158
159    // Omit hyperbolic methods if a is large, as they are too time-consuming.
160    if (a.abs().lt(1000)) {
161      x = a.hyperbolicCosine();
162      t(a, aa);
163      y = a.cosh();
164      t(a, aa);
165      z = Decimal.cosh(a);
166      t(a, aa);
167
168      t(x, y);
169      t(y, z);
170
171      x = a.hyperbolicSine();
172      t(a, aa);
173      y = a.sinh();
174      t(a, aa);
175      z = Decimal.sinh(a);
176      t(a, aa);
177
178      t(x, y);
179      t(y, z);
180
181      x = a.hyperbolicTangent();
182      t(a, aa);
183      y = a.tanh();
184      t(a, aa);
185      z = Decimal.tanh(a);
186      t(a, aa);
187
188      t(x, y);
189      t(y, z);
190    }
191
192    // a [-1, 1]
193    x = a.inverseCosine();
194    t(a, aa);
195    y = a.acos();
196    t(a, aa);
197    z = Decimal.acos(a);
198    t(a, aa);
199
200    t(x, y);
201    t(y, z);
202
203    // a [1, Infinity]
204    x = a.inverseHyperbolicCosine();
205    t(a, aa);
206    y = a.acosh();
207    t(a, aa);
208    z = Decimal.acosh(a);
209    t(a, aa);
210
211    t(x, y);
212    t(y, z);
213
214    x = a.inverseHyperbolicSine();
215    t(a, aa);
216    y = a.asinh();
217    t(a, aa);
218    z = Decimal.asinh(a);
219    t(a, aa);
220
221    t(x, y);
222    t(y, z);
223
224    // a [-1, 1]
225    x = a.inverseHyperbolicTangent();
226    t(a, aa);
227    y = a.atanh();
228    t(a, aa);
229    z = Decimal.atanh(a);
230    t(a, aa);
231
232    t(x, y);
233    t(y, z);
234
235    // a [-1, 1]
236    x = a.inverseSine();
237    t(a, aa);
238    y = a.asin();
239    t(a, aa);
240    z = Decimal.asin(a);
241    t(a, aa);
242
243    t(x, y);
244    t(y, z);
245
246    x = a.inverseTangent();
247    t(a, aa);
248    y = a.atan();
249    t(a, aa);
250    z = Decimal.atan(a);
251    t(a, aa);
252
253    t(x, y);
254    t(y, z);
255
256    a.isFinite();
257    t(a, aa);
258
259    x = a.isInteger();
260    t(a, aa);
261    y = a.isInt();
262    t(a, aa);
263
264    T.assertEqual(x, y);
265
266    a.isNaN();
267    t(a, aa);
268
269    x = a.isNegative();
270    t(a, aa);
271    y = a.isNeg();
272    t(a, aa);
273
274    T.assertEqual(x, y);
275
276    x = a.isPositive();
277    t(a, aa);
278    y = a.isPos();
279    t(a, aa);
280
281    T.assertEqual(x, y);
282
283    a.isZero();
284    t(a, aa);
285
286    x = a.lessThan(b);
287    t(a, aa);
288    t(b, bb);
289    y = a.lt(b);
290    t(a, aa);
291    t(b, bb);
292
293    T.assertEqual(x, y);
294
295    x = a.lessThanOrEqualTo(b);
296    t(a, aa);
297    t(b, bb);
298    y = a.lte(b);
299    t(a, aa);
300    t(b, bb);
301
302    T.assertEqual(x, y);
303
304    x = a.logarithm();
305    t(a, aa);
306    y = a.log();
307    t(a, aa);
308    z = Decimal.log(a);
309    t(a, aa);
310
311    t(x, y);
312    t(y, z);
313
314    x = a.minus(b);
315    t(a, aa);
316    t(b, bb);
317    y = a.sub(b);
318    t(a, aa);
319    t(b, bb);
320    z = Decimal.sub(a, b);
321    t(a, aa);
322    t(b, bb);
323
324    t(x, y);
325    t(y, z);
326
327    x = a.modulo(b);
328    t(a, aa);
329    t(b, bb);
330    y = a.mod(b);
331    t(a, aa);
332    t(b, bb);
333    z = Decimal.mod(a, b);
334    t(a, aa);
335    t(b, bb);
336
337    t(x, y);
338    t(y, z);
339
340    x = a.naturalExponential();
341    t(a, aa);
342    y = a.exp();
343    t(a, aa);
344    z = Decimal.exp(a);
345    t(a, aa);
346
347    t(x, y);
348    t(y, z);
349
350    x = a.naturalLogarithm();
351    t(a, aa);
352    y = a.ln();
353    t(a, aa);
354    z = Decimal.ln(a);
355    t(a, aa);
356
357    t(x, y);
358    t(y, z);
359
360    x = a.negated();
361    t(a, aa);
362    y = a.neg();
363    t(a, aa);
364
365    t(x, y);
366
367    x = a.plus(b);
368    t(a, aa);
369    t(b, bb);
370    y = a.add(b);
371    t(a, aa);
372    t(b, bb);
373    z = Decimal.add(a, b);
374    t(a, aa);
375    t(b, bb);
376
377    t(x, y);
378    t(y, z);
379
380    x = a.precision();
381    t(a, aa);
382    y = a.sd();
383    t(a, aa);
384
385    T.assertEqual(x, y);
386
387    x = a.round();
388    t(a, aa);
389    y = Decimal.round(a);
390    t(a, aa);
391
392    t(x, y);
393
394    x = a.sine();
395    t(a, aa);
396    y = a.sin();
397    t(a, aa);
398    z = Decimal.sin(a);
399    t(a, aa);
400
401    t(x, y);
402    t(y, z);
403
404    x = a.squareRoot();
405    t(a, aa);
406    y = a.sqrt();
407    t(a, aa);
408    z = Decimal.sqrt(a);
409    t(a, aa);
410
411    t(x, y);
412    t(y, z);
413
414    x = a.tangent();
415    t(a, aa);
416    y = a.tan();
417    t(a, aa);
418    z = Decimal.tan(a);
419    t(a, aa);
420
421    t(x, y);
422    t(y, z);
423
424    x = a.times(b);
425    t(a, aa);
426    t(b, bb);
427    y = a.mul(b);
428    t(a, aa);
429    t(b, bb);
430    z = Decimal.mul(a, b);
431    t(a, aa);
432    t(b, bb);
433
434    t(x, y);
435    t(y, z);
436
437    a.toBinary();
438    t(a, aa);
439
440    x = a.toDecimalPlaces(n);
441    t(a, aa);
442    y = a.toDP(n);
443    t(a, aa);
444
445    t(x, y);
446
447    a.toExponential(n);
448    t(a, aa);
449
450    a.toFixed(n);
451    t(a, aa);
452
453    a.toFraction();
454    t(a, aa);
455
456    x = a.toHexadecimal();
457    t(a, aa);
458    y = a.toHex();
459    t(a, aa);
460
461    T.assertEqual(x, y);
462
463    a.toJSON();
464    t(a, aa);
465
466    a.toNearest(b);
467    t(a, aa);
468    t(b, bb);
469
470    a.toNumber();
471    t(a, aa);
472
473    a.toOctal();
474    t(a, aa);
475
476    x = a.toPower(b);
477    t(a, aa);
478    t(b, bb);
479    y = a.pow(b);
480    t(a, aa);
481    t(b, bb);
482    z = Decimal.pow(a, b);
483    t(a, aa);
484    t(b, bb);
485
486    t(x, y);
487    t(y, z);
488
489    a.toPrecision(n);
490    t(a, aa);
491
492    x = a.toSignificantDigits(n);
493    t(a, aa);
494    y = a.toSD(n);
495    t(a, aa);
496
497    t(x, y);
498
499    a.toString();
500    t(a, aa);
501
502    x = a.truncated();
503    t(a, aa);
504    y = a.trunc();
505    t(a, aa);
506    z = Decimal.trunc(a);
507    t(a, aa);
508
509    t(x, y);
510    t(y, z);
511
512    a.valueOf();
513    t(a, aa);
514
515    Decimal.atan2(a, b);
516    t(a, aa);
517    t(b, bb);
518
519
520    Decimal.hypot(a, b);
521    t(a, aa);
522    t(b, bb);
523
524    x = Decimal.log(a, 10);
525    t(a, aa);
526    y = Decimal.log10(a);
527    t(a, aa);
528
529    t(x, y);
530
531    x = Decimal.log(a, 2);
532    t(a, aa);
533    y = Decimal.log2(a);
534    t(a, aa);
535
536    t(x, y);
537
538    Decimal.max(a, b);
539    t(a, aa);
540    t(b, bb);
541
542    Decimal.min(a, b);
543    t(a, aa);
544    t(b, bb);
545
546    Decimal.sign(a);
547    t(a, aa);
548  }
549});
550
551/*
552// All methods tested above except:
553Decimal.clone();
554Decimal.config();
555Decimal.noConflict();
556Decimal.random();
557*/
558