complex.test.js (22386B)
1 var assert = require("assert"); 2 3 var Complex = require("../complex.js"); 4 5 var functionTests = [{ 6 set: Complex.I, 7 fn: "mul", 8 param: Complex(Math.PI).exp(), 9 expect: "23.140692632779267i" 10 }, { 11 set: new Complex(1, 4), 12 fn: "mul", 13 param: 3, 14 expect: "3 + 12i" 15 }, { 16 set: "4 + 3i", 17 fn: "add", 18 param: "-3 - 2i", 19 expect: "1 + i" 20 }, { 21 set: "3i", 22 fn: "add", 23 param: "-2i", 24 expect: "i" 25 }, { 26 set: "4", 27 fn: "add", 28 param: "-3", 29 expect: "1" 30 }, { 31 set: 9, 32 fn: "sqrt", 33 expect: "3" 34 }, { 35 set: -9, 36 fn: "sqrt", 37 expect: "3i" 38 }, { 39 set: "-36", 40 fn: "sqrt", 41 expect: "6i" 42 }, { 43 set: "36i", 44 fn: "sqrt", 45 expect: "4.242640687119285 + 4.242640687119285i" 46 }, { 47 set: Infinity, 48 fn: "mul", 49 param: "i", 50 expect: "Infinity" 51 }, { 52 set: "-36i", 53 fn: "sqrt", 54 expect: "4.242640687119285 - 4.242640687119285i" 55 }, { 56 set: "4 + 2i", 57 fn: "div", 58 param: "0", 59 expect: "Infinity" 60 }, { 61 set: "0", 62 fn: "div", 63 param: Infinity, 64 expect: "0" 65 }, { 66 set: -Infinity, 67 fn: "div", 68 param: 0, 69 expect: "Infinity" 70 }, { 71 set: Infinity, 72 fn: "div", 73 param: Infinity, 74 expect: "NaN" 75 }, { 76 set: 0, 77 fn: "div", 78 param: 0, 79 expect: "NaN" 80 }, { 81 set: "4 + 2i", 82 fn: "div", 83 param: "1 + i", 84 expect: "3 - i" 85 }, { 86 set: "25", 87 fn: "div", 88 param: "3 - 4i", 89 expect: "3 + 4i" 90 }, { 91 set: "3 - 2i", 92 fn: "div", 93 param: "i", 94 expect: "-2 - 3i" 95 }, { 96 set: "4i", 97 fn: "mul", 98 param: "-5i", 99 expect: "20" 100 }, { 101 set: "3 - 6i", 102 fn: "mul", 103 param: "i", 104 expect: "6 + 3i" 105 }, { 106 set: Infinity, 107 fn: "mul", 108 param: 0, 109 expect: "NaN" 110 }, { 111 set: "3 + 4i", 112 fn: "add", 113 param: "5 - 7i", 114 expect: "8 - 3i" 115 }, { 116 set: Infinity, 117 fn: "add", 118 param: Infinity, 119 expect: "NaN" 120 }, { 121 set: -Infinity, 122 fn: "sub", 123 param: -Infinity, 124 expect: "NaN" 125 }, { 126 set: "6i", 127 fn: "div", 128 param: "3 - 12i", 129 expect: "-0.47058823529411764 + 0.11764705882352941i" 130 }, { 131 set: "36 + 36i", 132 fn: "sqrt", 133 expect: "6.59210468080686 + 2.730539163373364i" 134 }, { 135 set: "36 - 36i", 136 fn: "sqrt", 137 expect: "6.59210468080686 - 2.730539163373364i" 138 }, { 139 set: "-36 + 36i", 140 fn: "sqrt", 141 expect: "2.730539163373364 + 6.59210468080686i" 142 }, { 143 set: "-36 - 36i", 144 fn: "sqrt", 145 expect: "2.730539163373364 - 6.59210468080686i" 146 }, { 147 set: "0", 148 fn: "sqrt", 149 expect: "0" 150 }, { 151 set: Math.E, 152 fn: "log", 153 expect: "1" 154 }, { 155 set: 0, 156 fn: "log", 157 expect: "Infinity" 158 }, { 159 set: Infinity, 160 fn: "mul", 161 param: 3, 162 expect: "Infinity" 163 }, { 164 set: "-1", 165 fn: "log", 166 expect: Math.PI + "i" 167 }, { 168 set: "i", 169 fn: "log", 170 expect: (Math.PI / 2) + "i" 171 }, { 172 set: "3 + 2i", 173 fn: "log", 174 expect: Math.log(13) / 2 + " + " + Math.atan2(2, 3) + "i" 175 }, { 176 set: "3 - 2i", 177 fn: "log", 178 expect: Math.log(13) / 2 + " - " + Math.atan2(2, 3) + "i" 179 }, { 180 set: 1, 181 fn: "exp", 182 expect: "" + Math.E 183 }, { 184 set: "i", 185 fn: "exp", 186 expect: Math.cos(1) + " + " + Math.sin(1) + "i" 187 }, { 188 set: "i", 189 fn: "mul", 190 param: "i", 191 expect: "-1" 192 }, { 193 set: "3 + 2i", 194 fn: "exp", 195 expect: "-8.358532650935372 + 18.263727040666765i" 196 }, { 197 set: "3 - 2i", 198 fn: "exp", 199 expect: "-8.358532650935372 - 18.263727040666765i" 200 }, { 201 set: "3 - 2i", 202 fn: "expm1", 203 expect: "-9.358532650935372 - 18.263727040666765i" 204 }, { 205 set: "0", 206 fn: "expm1", 207 expect: "0" 208 }, { 209 set: "1e-6", 210 fn: "expm1", 211 expect: "0.0000010000005000001665" 212 }, { 213 set: "1e-5 + 5i", 214 fn: "expm1", 215 expect: "-0.716334977900736 - 0.9589338639538314i" 216 }, { 217 set: "1.2e-7 - 2e-6i", 218 fn: "expm1", 219 expect: "1.1999800719976027e-7 - 0.000002000000239998681i" 220 }, { 221 set: "3", 222 fn: "pow", 223 param: "3", 224 expect: "27" 225 }, { 226 set: -2, 227 fn: "pow", 228 param: 1.5, 229 expect: "-2.82842712474619i" 230 }, { 231 set: -8, 232 fn: "pow", 233 param: 1 / 3, 234 expect: "1 + 1.732050807568877i" 235 }, { 236 set: -25, 237 fn: "sqrt", 238 expect: "5i" 239 }, { 240 set: -25, 241 fn: "pow", 242 param: 0.5, 243 expect: "5i" 244 }, { 245 set: "0", 246 fn: "pow", 247 param: "1+i", 248 expect: "0" 249 }, { 250 set: "i", 251 fn: "pow", 252 param: "0", 253 expect: "1" 254 }, { 255 set: "87", 256 fn: "pow", 257 param: "3", 258 expect: "658503" 259 }, { 260 set: "i", 261 fn: "pow", 262 param: "1", 263 expect: "i" 264 }, { 265 set: "i", 266 fn: "pow", 267 param: "2", 268 expect: "-1" 269 }, { 270 set: "i", 271 fn: "pow", 272 param: "3", 273 expect: "-i" 274 }, { 275 set: "i", 276 fn: "pow", 277 param: "4", 278 expect: "1" 279 }, { 280 set: "i", 281 fn: "pow", 282 param: "5", 283 expect: "i" 284 }, { 285 set: 7, 286 fn: "pow", 287 param: 2, 288 expect: '49' 289 }, { 290 set: 0, 291 fn: "pow", 292 param: 2, 293 expect: '0' 294 }, { 295 set: "3i", 296 fn: "pow", 297 param: "3i", 298 expect: "-0.008876640735623678 - 0.0013801328997494863i" 299 }, { 300 set: { re: 3, im: 4 }, 301 fn: "abs", 302 expect: "5" 303 }, { 304 set: { re: 10, im: 24 }, 305 fn: "abs", 306 expect: "26" 307 }, { 308 set: "+++++--+1 + 4i", 309 fn: "mul", 310 param: "3 + 2i", 311 expect: "-5 + 14i" 312 }, { 313 set: "4 + 16i", 314 fn: "div", 315 param: "4.0000", 316 expect: "1 + 4i" 317 }, { 318 set: { re: -7.1, im: 2.5 }, 319 fn: "neg", 320 expect: "7.1 - 2.5i" 321 }, { 322 set: { re: 1, im: 1 }, 323 fn: "div", 324 param: { re: 3, im: 4 }, 325 expect: 7 / 25 + " - " + 1 / 25 + "i" 326 }, { 327 set: new Complex(-7.1, 2.5), 328 fn: "neg", 329 expect: "7.1 - 2.5i" 330 }, { 331 set: { re: 1, im: 1 }, 332 fn: "arg", 333 expect: "" + Math.PI / 4 334 }, { 335 set: { re: -1, im: -1 }, 336 fn: "arg", 337 expect: "" + -3 * Math.PI / 4 338 }, { 339 set: { re: 0, im: 1 }, 340 fn: "arg", 341 expect: "" + Math.PI / 2 342 }, { 343 set: { re: 1, im: 0.5 * Math.sqrt(4 / 3) }, 344 fn: "arg", 345 expect: "" + Math.PI / 6 346 }, { 347 set: "3 + 4i", 348 fn: "conjugate", 349 expect: "3 - 4i" 350 }, { 351 set: { re: 99, im: 50 }, 352 fn: "conjugate", 353 expect: "99 - 50i" 354 }, { 355 set: { re: 0, im: 0 }, 356 fn: "conjugate", 357 expect: "0" 358 }, { 359 set: { re: 1, im: 23 }, 360 fn: "conjugate", 361 expect: "1 - 23i" 362 }, { 363 set: "2 + 8i", 364 fn: "div", 365 param: new Complex(1, 2), 366 expect: "3.6 + 0.8i" 367 }, { 368 set: "2 + 8i", 369 fn: "div", 370 param: "2 + 8i", 371 expect: "1" 372 }, { 373 set: -Infinity, 374 fn: "div", 375 param: 3, 376 expect: "Infinity" 377 }, { 378 set: "3+4i", 379 fn: "add", 380 param: "5 - i", 381 expect: "8 + 3i" 382 }, { 383 set: { re: 1, im: 2 }, 384 fn: "add", 385 param: "4 + 6i", 386 expect: "5 + 8i" 387 }, { 388 set: { re: 5, im: 8 }, 389 fn: "sub", 390 param: "4 + 6i", 391 expect: "1 + 2i" 392 }, { 393 set: "3 + 4i", 394 fn: "sub", 395 param: "2 - 5i", 396 expect: "1 + 9i" 397 }, { 398 set: "1 + 2i", 399 fn: "pow", 400 param: "2", 401 expect: "-2.999999999999999 + 4.000000000000001i" 402 }, { 403 set: "1 + 2i", 404 fn: "pow", 405 param: "1 + 2i", 406 expect: "-0.22251715680177267 + 0.10070913113607541i" 407 }, { 408 set: { re: 1, im: 2 }, 409 fn: "pow", 410 param: new Complex(3, 4), 411 expect: "0.1290095940744669 + 0.03392409290517001i" 412 }, { 413 fn: "abs", 414 set: new Complex(3, 4), 415 expect: "5" 416 }, { 417 param: 2, 418 fn: "pow", 419 set: new Complex(1, 2), 420 expect: "-2.999999999999999 + 4.000000000000001i" 421 }, { 422 set: "i", 423 fn: "pow", 424 param: 7, 425 expect: "-i" 426 }, { 427 set: "2+3i", 428 fn: "mul", 429 param: "4+5i", 430 expect: "-7 + 22i" 431 }, { 432 set: "3 + 4i", 433 fn: "mul", 434 param: "2 - 5i", 435 expect: "26 - 7i" 436 }, { 437 set: "i", 438 fn: "pow", 439 param: 4, 440 expect: "1" 441 }, { 442 set: "i", 443 fn: "pow", 444 param: 5, 445 expect: "i" 446 }, { 447 set: "0-0i", 448 fn: "pow", 449 param: 2, 450 expect: "0" 451 }, { 452 set: "0-0i", 453 fn: "pow", 454 param: 0, 455 expect: "1" 456 }, { 457 set: "1 + 4i", 458 fn: "sqrt", 459 expect: "1.600485180440241 + 1.2496210676876531i" 460 }, { 461 set: { re: -3, im: 4 }, 462 fn: "sqrt", 463 expect: "1 + 2i" 464 }, { 465 set: { re: 3, im: -4 }, 466 fn: "sqrt", 467 expect: "2 - i" 468 }, { 469 set: { re: -3, im: -4 }, 470 fn: "sqrt", 471 expect: "1 - 2i" 472 }, { 473 set: [-2, 0], 474 fn: "pow", 475 param: 2, 476 expect: "4" 477 }, { 478 set: { abs: 1, arg: 0 }, 479 fn: "equals", 480 param: { re: 1, im: 0 }, 481 expect: "true" 482 }, { 483 set: -Complex.E.pow(2), 484 fn: "log", 485 expect: "2 + 3.141592653589793i" 486 }, { 487 set: "4 + 3i", 488 fn: "log", 489 expect: "1.6094379124341003 + 0.6435011087932844i" 490 }, { 491 set: "4 + 3i", 492 fn: "exp", 493 expect: "-54.051758861078156 + 7.704891372731154i" 494 }, { 495 set: "1-2i", 496 fn: "sqrt", 497 expect: "1.272019649514069 - 0.7861513777574233i" 498 }, { 499 set: { re: 1, im: 2 }, 500 fn: "sin", 501 expect: "3.165778513216168 + 1.9596010414216063i" 502 }, { 503 set: "i", 504 fn: "cos", 505 expect: "1.5430806348152437" 506 }, { 507 set: "i", 508 fn: "acos", 509 expect: "1.5707963267948966 - 0.8813735870195428i" 510 }, { 511 set: { re: 1, im: 2 }, 512 fn: "cos", 513 expect: "2.0327230070196656 - 3.0518977991518i" 514 }, { 515 set: { re: 1, im: 2 }, 516 fn: "tan", 517 expect: "0.03381282607989669 + 1.0147936161466335i" 518 }, { 519 set: { re: 1, im: 3 }, 520 fn: "sinh", 521 expect: "-1.1634403637032504 + 0.21775955162215221i" 522 }, { 523 set: { re: 1, im: 3 }, 524 fn: "cosh", 525 expect: "-1.5276382501165433 + 0.1658444019189788i" 526 }, { 527 set: { re: 1, im: 3 }, 528 fn: "tanh", 529 expect: "0.7680176472869112 - 0.059168539566050726i" 530 }, { 531 set: { re: 1, im: 3 }, 532 fn: "inverse", 533 expect: "0.1 - 0.3i" 534 }, { 535 set: "3+4i", 536 fn: "inverse", 537 expect: "0.12 - 0.16i" // 3/25 - (4/25)i 538 }, { 539 set: { re: 0.5, im: -0.5 }, 540 fn: "inverse", 541 expect: "1 + i" 542 }, { 543 set: "1 + i", 544 fn: "inverse", 545 expect: "0.5 - 0.5i" 546 }, { 547 set: "0", 548 fn: "inverse", 549 expect: "Infinity" 550 }, { 551 set: Infinity, 552 fn: "inverse", 553 expect: "0" 554 }, { 555 set: Complex['EPSILON'], 556 fn: "equals", 557 param: 1e-16, 558 expect: "true" 559 }, { 560 set: 0, 561 fn: "equals", 562 param: "5i", 563 expect: "false" 564 }, { 565 set: 5, 566 fn: "equals", 567 param: "5i", 568 expect: "false" 569 }, { 570 set: 5, 571 fn: "equals", 572 param: 5, 573 expect: "true" 574 }, { 575 set: "10i", 576 fn: "equals", 577 param: "10i", 578 expect: "true" 579 }, { 580 set: "2 + 3i", 581 fn: "equals", 582 param: "2 + 3i", 583 expect: "true" 584 }, { 585 set: "2 + 3i", 586 fn: "equals", 587 param: "5i", 588 expect: "false" 589 }, { 590 set: "2 + 3i", 591 fn: "round", 592 param: "0", 593 expect: "2 + 3i" 594 }, { 595 set: "2.5 + 3.5i", 596 fn: "round", 597 param: "1", 598 expect: "2.5 + 3.5i" 599 }, { 600 set: "2.5 + 3.5i", 601 fn: "sign", 602 param: null, 603 expect: "0.5812381937190965 + 0.813733471206735i" 604 }, { 605 set: "10 + 24i", 606 fn: "sign", 607 param: null, 608 expect: "0.38461538461538464 + 0.9230769230769231i" 609 }, { 610 set: "1e3i", 611 fn: "add", 612 param: "3e-3 + 1e2i", 613 expect: "0.003 + 1100i" 614 }, { 615 set: "3.14-4i", 616 fn: "coth", 617 expect: "0.9994481238383576 + 0.0037048958915019857i" 618 }, { 619 set: "8i-31", 620 fn: "cot", 621 expect: "1.6636768291213935e-7 - 1.0000001515864902i" 622 }, { 623 set: Complex(1, 1).sub(0, 1), // Distance 624 fn: "abs", 625 expect: "1" 626 }, { 627 set: Complex(1, 1), // Rotate around center 628 fn: "mul", 629 param: { abs: 1, arg: Math.PI / 2 }, 630 expect: "-0.9999999999999999 + i" 631 }, { 632 set: Complex(1, 1).sub(0, 1).mul({ abs: 1, arg: Math.PI / 2 }), // Rotate around another point 633 fn: "add", 634 param: "i", 635 expect: "2i" 636 }, { 637 set: Complex(0, 10000000000), 638 fn: "log", 639 param: null, 640 expect: "23.025850929940457 + 1.5707963267948966i" 641 }, { 642 set: Complex(0, 1000000000000000), 643 fn: "log", 644 param: null, 645 expect: "34.538776394910684 + 1.5707963267948966i" 646 }, { 647 set: Complex(0, 100000000000000000), 648 fn: "log", 649 param: null, 650 expect: "39.14394658089878 + 1.5707963267948966i" 651 }, { 652 set: Complex(0, 10000000000000000000), 653 fn: "log", 654 param: null, 655 expect: "43.74911676688687 + 1.5707963267948966i" 656 }, { 657 set: Complex(0, 1e+30), 658 fn: "log", 659 param: null, 660 expect: "69.07755278982137 + 1.5707963267948966i" 661 }, { 662 set: Complex(1, 10000000000), 663 fn: "log", 664 param: null, 665 expect: "23.025850929940454 + 1.5707963266948965i" 666 }, { 667 set: Complex(1, 1000000000000000), 668 fn: "log", 669 param: null, 670 expect: "34.538776394910684 + 1.5707963267948957i" 671 }, { 672 set: Complex(1, 100000000000000000), 673 fn: "log", 674 param: null, 675 expect: "39.14394658089878 + 1.5707963267948966i" 676 }, { 677 set: Complex(1, 10000000000000000000), 678 fn: "log", 679 param: null, 680 expect: "43.74911676688687 + 1.5707963267948966i" 681 }, { 682 set: Complex(1, 1e+30), 683 fn: "log", 684 param: null, 685 expect: "69.07755278982137 + 1.5707963267948966i" 686 }, { 687 set: Complex(-1, 10000000000), 688 fn: "log", 689 param: null, 690 expect: "23.025850929940454 + 1.5707963268948968i" 691 }, { 692 set: Complex(-1, 1000000000000000), 693 fn: "log", 694 param: null, 695 expect: "34.538776394910684 + 1.5707963267948977i" 696 }, { 697 set: Complex(-1, 100000000000000000), 698 fn: "log", 699 param: null, 700 expect: "39.14394658089878 + 1.5707963267948968i" 701 }, { 702 set: Complex(-1, 10000000000000000000), 703 fn: "log", 704 param: null, 705 expect: "43.74911676688687 + 1.5707963267948966i" 706 }, { 707 set: Complex(-1, 1e+30), 708 fn: "log", 709 param: null, 710 expect: "69.07755278982137 + 1.5707963267948966i" 711 }]; 712 713 var constructorTests = [{ 714 set: null, 715 expect: "0" 716 }, { 717 set: undefined, 718 expect: "0" 719 }, { 720 set: "foo", 721 error: "SyntaxError: Invalid Param" 722 }, { 723 set: {}, 724 error: "SyntaxError: Invalid Param" 725 }, { 726 set: " + i", 727 expect: "i" 728 }, { 729 set: "3+4i", 730 expect: "3 + 4i" 731 }, { 732 set: "i", 733 expect: "i" 734 }, { 735 set: "3", 736 expect: "3" 737 }, { 738 set: [9, 8], 739 expect: "9 + 8i" 740 }, { 741 set: "2.3", 742 expect: "2.3" 743 }, { 744 set: "2.3", 745 expect: "2.3" 746 }, { 747 set: "0", 748 expect: "0" 749 }, { 750 set: "-0", 751 expect: "0" 752 }, { 753 set: { re: -0, im: 0 }, 754 expect: "0" 755 }, { 756 set: { re: 0, im: -0 }, 757 expect: "0" 758 }, { 759 set: Infinity, 760 expect: "Infinity" 761 }, { 762 set: -Infinity, 763 expect: "Infinity" 764 }, { 765 set: { re: Infinity, im: 0 }, 766 expect: "Infinity" 767 }, { 768 set: { re: -Infinity, im: 0 }, 769 expect: "Infinity" 770 }, { 771 set: { re: 0, im: Infinity }, 772 expect: "Infinity" 773 }, { 774 set: { re: 0, im: -Infinity }, 775 expect: "Infinity" 776 }, { 777 set: " + 7 - i + 3i - + + + + 43 + 2i - i4 + - 33 + 65 - 1 ", 778 expect: "-5" 779 }, { 780 set: " + 7 - i + 3i - + + + + 43 + 2i - i4 + - 33 + 65 - 1 + ", 781 error: "SyntaxError: Invalid Param" 782 }, { 783 set: "-3x + 4", 784 error: "SyntaxError: Invalid Param" 785 }, { 786 set: "- + 7", 787 expect: "-7" 788 }, { 789 set: "4 5i", 790 error: "SyntaxError: Invalid Param" 791 }, { 792 set: "-", 793 error: "SyntaxError: Invalid Param" 794 }, { 795 set: "2.2e-1-3.2e-1i", 796 expect: "0.22 - 0.32i" 797 }, { 798 set: "2.2.", 799 error: "SyntaxError: Invalid Param" 800 }, { 801 set: { r: 0, phi: 4 }, 802 expect: "0" 803 }, { 804 set: { r: 1, phi: 1 }, 805 expect: "0.5403023058681398 + 0.8414709848078965i" 806 }, { 807 set: { r: Infinity, phi: 0 }, 808 expect: "Infinity" 809 }, { 810 set: { r: Infinity, phi: 2 }, 811 expect: "Infinity" 812 }, { 813 set: { r: Infinity, phi: Infinity }, 814 expect: "NaN" 815 }, { 816 set: { r: Infinity, phi: NaN }, 817 expect: "NaN" 818 } 819 ]; 820 821 for (let i = 0, len = constructorTests.length; i < len; ++i) { 822 if (constructorTests[i].set != null && constructorTests[i].set.hasOwnProperty('r')) { 823 constructorTests.push({ 824 set: { 825 abs: constructorTests[i].set.r, 826 arg: constructorTests[i].set.phi, 827 }, 828 expect: constructorTests[i].expect 829 }) 830 } 831 } 832 833 834 function stringify(value) { 835 return JSON.stringify(value, function replacer(key, val) { 836 if (typeof val === "number") { 837 return val.toString(); 838 } 839 return val; 840 }) 841 } 842 843 function describeTest(test) { 844 var ctor = "new Complex(" + (test.set !== undefined ? stringify(test.set) : "") + ")"; 845 846 var fnCall = test.fn == null 847 ? "" 848 : "." + test.fn + "(" + (test.param !== undefined ? stringify(test.param) : "") + ")"; 849 850 var expectedResult = test.expect == null 851 ? "" 852 : " === " + stringify(test.expect); 853 854 var error = test.error == null 855 ? "" 856 : " should throw " + test.error; 857 858 return ctor + fnCall + expectedResult + error; 859 } 860 861 describe("Complex functions", function () { 862 863 for (var i = 0; i < functionTests.length; i++) { 864 865 (function (test) { 866 867 it(describeTest(test), function () { 868 if (test.error) { 869 try { 870 new Complex(test.set)[test.fn](test.param); 871 } catch (e) { 872 assert.strictEqual(e.toString(), test.error.toString()); 873 } 874 } else { 875 assert.strictEqual(new Complex(test.set)[test.fn](test.param).toString(), test.expect); 876 } 877 }); 878 })(functionTests[i]); 879 } 880 }); 881 882 describe("Complex constructor", function () { 883 884 for (var i = 0; i < constructorTests.length; i++) { 885 886 (function (test) { 887 it(describeTest(test), function () { 888 if (test.error) { 889 try { 890 new Complex(test.set); 891 } catch (e) { 892 assert.strictEqual(e.toString(), test.error.toString()); 893 } 894 } else { 895 assert.strictEqual(new Complex(test.set).toString(), test.expect); 896 } 897 }); 898 })(constructorTests[i]); 899 } 900 }); 901 902 describe("Complex Details", function () { 903 904 it("should work with different params", function () { 905 assert.strictEqual(Complex(1, -1).toString(), "1 - i"); 906 assert.strictEqual(Complex(0, 0).toString(), "0"); 907 assert.strictEqual(Complex(0, 2).toString(), "2i"); 908 assert.strictEqual(Complex.I.toString(), "i"); 909 assert.strictEqual(Complex(0, -2).toString(), "-2i"); 910 assert.strictEqual(Complex({ re: 0, im: -2 }).toString(), "-2i"); 911 }); 912 913 it("Complex Combinations", function () { 914 915 var zero = Complex(0, 0), one = Complex(1, 1), two = Complex(2, 2); 916 917 assert.strictEqual(zero.toString(), "0"); 918 assert.strictEqual(one.toString(), "1 + i"); 919 assert(one.neg().equals(Complex(-1, -1))); 920 assert(one.conjugate().equals(Complex(1, -1))); 921 assert.strictEqual(one.abs(), Math.SQRT2); 922 assert.strictEqual(one.arg(), Math.PI / 4); 923 assert.strictEqual(one.add(one).toString(), two.toString()); 924 assert.strictEqual(one.sub(one).toString(), zero.toString()); 925 assert.strictEqual(one.mul(2).toString(), two.toString()); 926 assert.strictEqual(one.mul(one).toString(), Complex(0, 2).toString()); 927 assert.strictEqual(one.div(2).toString(), "0.5 + 0.5i"); 928 assert.strictEqual(one.div(one).toString(), "1"); 929 assert.strictEqual(one.div(0).toString(), "Infinity"); 930 assert.strictEqual(one.exp().toString(), "1.4686939399158851 + 2.2873552871788423i"); 931 assert.strictEqual(one.log().toString(), "0.34657359027997264 + 0.7853981633974483i"); 932 assert.strictEqual(one.pow(one).toString(), "0.2739572538301211 + 0.5837007587586147i"); 933 assert.strictEqual(one.pow(zero).toString(), "1"); 934 assert.strictEqual(one.sqrt().toString(), "1.09868411346781 + 0.45508986056222733i"); 935 assert.strictEqual(one.sin().toString(), "1.2984575814159773 + 0.6349639147847361i"); 936 assert.strictEqual(one.cos().toString(), "0.8337300251311491 - 0.9888977057628651i"); 937 assert.strictEqual(one.tan().toString(), "0.27175258531951174 + 1.0839233273386948i"); 938 assert.strictEqual(one.asin().toString(), "0.6662394324925153 + 1.0612750619050355i"); 939 assert.strictEqual(one.acos().toString(), "0.9045568943023813 - 1.0612750619050355i"); 940 assert.strictEqual(one.atan().toString(), "1.0172219678978514 + 0.40235947810852507i"); 941 942 assert.strictEqual(Complex(3, 4).abs(), 5); 943 944 assert.strictEqual(Complex("5i + 3").log().exp().toString(), "3 + 5i") 945 assert.strictEqual(Complex("-2i - 1").log().exp().toString(), "-1 - 2i") 946 }); 947 948 it("should calculate distributed conjugate", function () { 949 950 var c1 = Complex(7, 3); 951 var c2 = Complex(1, 2); 952 953 var r1 = c1.add(c2).conjugate(); 954 var r2 = c1.conjugate().add(c2.conjugate()); 955 956 assert.strictEqual(r1.toString(), r2.toString()); 957 }); 958 959 it("should be raised to power of 6", function () { 960 var c1 = Complex(2, 2); 961 962 var t = c1.pow(6); 963 964 assert.strictEqual(t.toString(), "-9.405287417451663e-14 - 511.9999999999995i"); 965 }); 966 967 it("should handle inverse trig fns", function () { 968 969 var values = [ 970 new Complex(2.3, 1.4), 971 new Complex(-2.3, 1.4), 972 new Complex(-2.3, -1.4), 973 new Complex(2.3, -1.4)]; 974 975 var fns = ['sin', 'cos', 'tan']; 976 977 for (var i = 0; i < values.length; i++) { 978 979 for (var j = 0; j < 3; j++) { 980 981 var a = values[i]['a' + fns[j]]()[fns[j]](); 982 983 var res = values[i]; 984 985 assert(Math.abs(a.re - res.re) < 1e-12 && Math.abs(a.im - res.im) < 1e-12); 986 } 987 } 988 }); 989 990 it('should handle get real part', function () { 991 assert.strictEqual(Complex({ abs: 1, arg: Math.PI / 4 }).re, Math.SQRT2 / 2); 992 }); 993 994 it('should handle get complex part', function () { 995 assert.strictEqual(Complex({ abs: 1, arg: Math.PI / 4 }).im, 0.7071067811865475); 996 }); 997 998 it('should handle sum', function () { 999 assert.strictEqual(Complex({ abs: 1, arg: 0 }).add({ abs: 1, arg: Math.PI / 2 }).abs(), Math.SQRT2); 1000 assert.strictEqual(Complex({ abs: 1, arg: 0 }).add({ abs: 1, arg: Math.PI / 2 }).arg(), Math.PI / 4); 1001 }); 1002 1003 it('should handle conjugate', function () { 1004 assert.strictEqual(Complex({ abs: 1, arg: Math.PI / 4 }).conjugate().toString(), Complex({ abs: 1, arg: -Math.PI / 4 }).toString()); 1005 }); 1006 1007 it('should handle substract', function () { 1008 assert.strictEqual(Complex({ abs: 1, arg: 0 }).sub({ abs: 1, arg: Math.PI / 2 }).abs().toString(), "1.414213562373095"); 1009 assert.strictEqual(Complex({ abs: 1, arg: 0 }).sub({ abs: 1, arg: Math.PI / 2 }).arg().toString(), "-0.7853981633974484"); 1010 }); 1011 1012 it('should handle arg for the first quadrant', function () { 1013 assert.strictEqual(Complex({ re: 1, im: 1 }).arg(), Math.PI / 4); 1014 }); 1015 1016 it('should handle arg for the second quadrant', function () { 1017 assert.strictEqual(Complex({ re: -1, im: 1 }).arg(), 3 * Math.PI / 4); 1018 }); 1019 1020 it('should handle arg for the third quadrant', function () { 1021 assert.strictEqual(Complex({ re: -1, im: -1 }).arg(), -3 * Math.PI / 4); 1022 }); 1023 1024 it('should handle arg for the fourth quadrant', function () { 1025 assert.strictEqual(Complex({ re: 1, im: -1 }).arg(), -Math.PI / 4); 1026 }); 1027 1028 it('should handle arg for the fourth and first quadrant', function () { 1029 assert.strictEqual(Complex({ re: 1, im: 0 }).arg(), 0); 1030 }); 1031 1032 it('should handle arg for first and second quadrant', function () { 1033 assert.strictEqual(Complex({ re: 0, im: 1 }).arg(), Math.PI / 2); 1034 }); 1035 1036 it('should handle arg for the second and third quadrant', function () { 1037 assert.strictEqual(Complex({ re: -1, im: 0 }).arg(), Math.PI); 1038 }); 1039 1040 it('should handle arg for the third and fourth quadrant', function () { 1041 assert.strictEqual(Complex({ re: 0, im: -1 }).arg(), -Math.PI / 2); 1042 }); 1043 1044 it("should eat its own dog food", function () { 1045 1046 var a = Complex(1, -5).toString(); 1047 var b = Complex(a).toString(); 1048 var c = Complex(b).mul(a); 1049 1050 assert.strictEqual(c.toString(), '-24 - 10i'); 1051 }); 1052 1053 it("should calculate the absolute value of i", function () { 1054 1055 var a = Complex("i").sign().inverse().mul("i"); 1056 1057 assert.strictEqual(a.toString(), '1'); 1058 }); 1059 1060 it('should take the natural logarithm', function () { 1061 var n = Complex(Math.E * Math.E).log().div("i").mul(-Math.PI * 2, 1); 1062 1063 assert.strictEqual(n.toString(), '2 + ' + 4 * Math.PI + "i"); 1064 }); 1065 1066 });