simple-squiggle

A restricted subset of Squiggle
Log | Files | Refs | README

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 });