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