spreadsheet
typeScript/javascript spreadsheet parser, with formulas.
git clone https://git.vogt.world/spreadsheet.git
Log | Files | README.md
← All files
name: tests/Formulas/MathTest.ts
-rw-r--r--
46373
   1import {
   2  ABS,
   3  ACOS,
   4  ACOSH,
   5  ACOTH,
   6  ASIN,
   7  ASINH,
   8  ATAN,
   9  ATAN2,
  10  ATANH,
  11  COT,
  12  COTH,
  13  COSH,
  14  COS,
  15  COUNTUNIQUE,
  16  EVEN,
  17  ERF,
  18  ERFC,
  19  INT,
  20  ISEVEN,
  21  ISODD,
  22  MULTIPLY,
  23  MOD,
  24  ODD,
  25  SIN,
  26  SINH,
  27  SUM,
  28  SQRT,
  29  SQRTPI,
  30  PI,
  31  POWER,
  32  LOG,
  33  LOG10,
  34  LN,
  35  TAN,
  36  TANH,
  37  ROUND,
  38  ROUNDDOWN,
  39  ROUNDUP,
  40  SUMPRODUCT,
  41  SUMIF,
  42  SUMSQ,
  43  SUMX2MY2,
  44  SUMX2PY2,
  45  FLOOR,
  46  IF,
  47  COUNTIF,
  48  COUNTIFS,
  49  CEILING,
  50  TRUNC,
  51  RADIANS,
  52  DEGREES,
  53  COMBIN,
  54  MINUS,
  55  RAND,
  56  RANDBETWEEN,
  57  SIGN,
  58  DIVIDE,
  59  EQ,
  60  GT,
  61  GTE,
  62  LT,
  63  LTE,
  64  NE,
  65  GCD,
  66  LCM,
  67  GAMMALN,
  68  PRODUCT,
  69  QUOTIENT,
  70  UPLUS,
  71  UMINUS,
  72  MROUND,
  73  FACTDOUBLE,
  74  UNARY_PERCENT,
  75  MULTINOMIAL,
  76  SERIESSUM,
  77  SUBTOTAL
  78} from "../../src/Formulas/Math";
  79import * as ERRORS from "../../src/Errors";
  80import {
  81  assertEquals,
  82  catchAndAssertEquals,
  83  test
  84} from "../Utils/Asserts";
  85
  86
  87test("MROUND", function(){
  88  assertEquals(MROUND(4.12121, 22), 0);
  89  assertEquals(MROUND(10, 0), 0);
  90  assertEquals(MROUND(10, 2), 10);
  91  assertEquals(MROUND(21, 14), 28);
  92  catchAndAssertEquals(function() {
  93    MROUND.apply(this, [10]);
  94  }, ERRORS.NA_ERROR);
  95  catchAndAssertEquals(function() {
  96    MROUND.apply(this, [10, 1, 1]);
  97  }, ERRORS.NA_ERROR);
  98});
  99
 100
 101test("FACTDOUBLE", function(){
 102  assertEquals(FACTDOUBLE(7), 105);
 103  assertEquals(FACTDOUBLE(6), 48);
 104  assertEquals(FACTDOUBLE(3), 3);
 105  catchAndAssertEquals(function() {
 106    FACTDOUBLE(-1);
 107  }, ERRORS.NUM_ERROR);
 108  catchAndAssertEquals(function() {
 109    FACTDOUBLE.apply(this, []);
 110  }, ERRORS.NA_ERROR);
 111  catchAndAssertEquals(function() {
 112    FACTDOUBLE.apply(this, [10, 10]);
 113  }, ERRORS.NA_ERROR);
 114});
 115
 116
 117test("GAMMALN", function(){
 118  assertEquals(GAMMALN(4.5), 2.453736570842444);
 119  assertEquals(GAMMALN(3), 0.6931471805599443);
 120  catchAndAssertEquals(function() {
 121    GAMMALN(0)
 122  }, ERRORS.NUM_ERROR);
 123  catchAndAssertEquals(function() {
 124    GAMMALN.apply(this, []);
 125  }, ERRORS.NA_ERROR);
 126  catchAndAssertEquals(function() {
 127    GAMMALN.apply(this, [10, 10]);
 128  }, ERRORS.NA_ERROR);
 129});
 130
 131
 132test("LCM", function(){
 133  assertEquals(LCM(2, 5), 10);
 134  assertEquals(LCM(10, 100), 100);
 135  assertEquals(LCM(12, 18), 36);
 136  assertEquals(LCM(12, 18, 24), 72);
 137  catchAndAssertEquals(function() {
 138    LCM.apply(this, []);
 139  }, ERRORS.NA_ERROR);
 140});
 141
 142
 143test("UPLUS", function(){
 144  assertEquals(UPLUS(2), 2);
 145  assertEquals(UPLUS(false), false);
 146  assertEquals(UPLUS([1, 2, 3]), 1);
 147  assertEquals(UPLUS("hello"), "hello");
 148  catchAndAssertEquals(function() {
 149    UPLUS.apply(this, []);
 150  }, ERRORS.NA_ERROR);
 151});
 152
 153
 154test("UMINUS", function(){
 155  assertEquals(UMINUS(2), -2);
 156  assertEquals(UMINUS(-1), 1);
 157  assertEquals(UMINUS(false), 0);
 158  assertEquals(UMINUS(0), 0);
 159  assertEquals(UMINUS([1, 2, 3]), -1);
 160  catchAndAssertEquals(function() {
 161    UMINUS.apply(this, []);
 162  }, ERRORS.NA_ERROR);
 163});
 164
 165
 166test("PRODUCT", function(){
 167  assertEquals(PRODUCT(2, 5), 10);
 168  assertEquals(PRODUCT(2, 5, 4, 2, 8, 1, 77, 2, 3, 1), 295680);
 169  assertEquals(PRODUCT(2, 5, 4, 2, 8, [1, 77, 2], 3, 1), 295680);
 170  assertEquals(PRODUCT(0, 1), 0);
 171  assertEquals(PRODUCT(8, "1992/2/2"), 269088);
 172  catchAndAssertEquals(function() {
 173    PRODUCT.apply(this, [1, [], 1]);
 174  }, ERRORS.REF_ERROR);
 175  catchAndAssertEquals(function() {
 176    PRODUCT.apply(this, [1]);
 177  }, ERRORS.NA_ERROR);
 178  catchAndAssertEquals(function() {
 179    PRODUCT.apply(this, []);
 180  }, ERRORS.NA_ERROR);
 181});
 182
 183
 184test("QUOTIENT", function(){
 185  assertEquals(QUOTIENT(2, 2), 1);
 186  assertEquals(QUOTIENT(4, 2), 2);
 187  catchAndAssertEquals(function() {
 188    QUOTIENT(1, 0);
 189  }, ERRORS.DIV_ZERO_ERROR);
 190  catchAndAssertEquals(function() {
 191    QUOTIENT.apply(this, [1]);
 192  }, ERRORS.NA_ERROR);
 193  catchAndAssertEquals(function() {
 194    QUOTIENT.apply(this, [1, 2, 3]);
 195  }, ERRORS.NA_ERROR);
 196});
 197
 198
 199test("GCD", function(){
 200  assertEquals(GCD(10, 100), 10);
 201  assertEquals(GCD(22, 44), 22);
 202  assertEquals(GCD(18, 24), 6);
 203  assertEquals(GCD(7, 9), 1);
 204  assertEquals(GCD(14, 21, 42), 7);
 205  catchAndAssertEquals(function() {
 206    GCD.apply(this, []);
 207  }, ERRORS.NA_ERROR);
 208});
 209
 210
 211test("ABS", function(){
 212  assertEquals(ABS(-10), 10);
 213  assertEquals(ABS(-10.111), 10.111);
 214  assertEquals(ABS(0), 0);
 215  assertEquals(ABS(false), 0);
 216  assertEquals(ABS("-44"), 44);
 217  catchAndAssertEquals(function() {
 218    ABS.apply(this, []);
 219  }, ERRORS.NA_ERROR);
 220  catchAndAssertEquals(function() {
 221    ABS.apply(this, ["str"]);
 222  }, ERRORS.VALUE_ERROR);
 223});
 224
 225
 226test("ACOS", function(){
 227  assertEquals(ACOS(0), 1.5707963267948966);
 228  assertEquals(ACOS(-1), 3.141592653589793);
 229  assertEquals(ACOS(1), 0);
 230  assertEquals(ACOS("-1"), 3.141592653589793);
 231  assertEquals(ACOS(false), 1.5707963267948966);
 232  catchAndAssertEquals(function() {
 233    ACOS("str");
 234  }, ERRORS.VALUE_ERROR);
 235  catchAndAssertEquals(function() {
 236    ACOS(2);
 237  }, ERRORS.NUM_ERROR);
 238  catchAndAssertEquals(function() {
 239    ACOS.apply(this, []);
 240  }, ERRORS.NA_ERROR);
 241});
 242
 243
 244test("ACOSH", function(){
 245  assertEquals(ACOSH(22), 3.783672704329451);
 246  assertEquals(ACOSH(1), 0);
 247  assertEquals(ACOSH("11"), 3.0889699048446033);
 248  catchAndAssertEquals(function() {
 249    ACOSH(-1);
 250  }, ERRORS.NUM_ERROR);
 251  catchAndAssertEquals(function() {
 252    ACOSH("str");
 253  }, ERRORS.VALUE_ERROR);
 254  catchAndAssertEquals(function() {
 255    ACOSH(false);
 256  }, ERRORS.NUM_ERROR);
 257  catchAndAssertEquals(function() {
 258    ACOSH.apply(this, []);
 259  }, ERRORS.NA_ERROR);
 260});
 261
 262
 263test("ACOTH", function(){
 264  assertEquals(ACOTH(22), 0.04548588910286339);
 265  assertEquals(ACOTH(-1.1), -1.522261218861711);
 266  assertEquals(ACOTH("-22"), -0.04548588910286338);
 267  catchAndAssertEquals(function() {
 268    ACOTH(-1);
 269  }, ERRORS.NUM_ERROR);
 270  catchAndAssertEquals(function() {
 271    ACOTH("str");
 272  }, ERRORS.VALUE_ERROR);
 273  catchAndAssertEquals(function() {
 274    ACOTH(false);
 275  }, ERRORS.NUM_ERROR);
 276  catchAndAssertEquals(function() {
 277    ACOTH.apply(this, []);
 278  }, ERRORS.NA_ERROR);
 279});
 280
 281
 282test("ASIN", function(){
 283  assertEquals(ASIN(0), 0);
 284  assertEquals(ASIN(1), 1.5707963267948966);
 285  assertEquals(ASIN("1"), 1.5707963267948966);
 286  assertEquals(ASIN(false), 0);
 287  catchAndAssertEquals(function() {
 288    ASIN(2);
 289  }, ERRORS.NUM_ERROR);
 290  catchAndAssertEquals(function() {
 291    ASIN("str");
 292  }, ERRORS.VALUE_ERROR);
 293  catchAndAssertEquals(function() {
 294    ASIN.apply(this, []);
 295  }, ERRORS.NA_ERROR);
 296});
 297
 298
 299test("ASINH", function(){
 300  assertEquals(ASINH(1), 0.8813735870195429);
 301  assertEquals(ASINH(0), 0);
 302  assertEquals(ASINH("1"), 0.8813735870195429);
 303  assertEquals(ASINH(false), 0);
 304  assertEquals(ASINH(true), 0.8813735870195429);
 305  catchAndAssertEquals(function() {
 306    ASINH("str");
 307  }, ERRORS.VALUE_ERROR);
 308  catchAndAssertEquals(function() {
 309    ASINH.apply(this, []);
 310  }, ERRORS.NA_ERROR);
 311});
 312
 313
 314test("ATAN", function(){
 315  assertEquals(ATAN(1), 0.7853981633974483);
 316  assertEquals(ATAN(0), 0);
 317  assertEquals(ATAN("1"), 0.7853981633974483);
 318  assertEquals(ATAN(false), 0);
 319  assertEquals(ATAN(true), 0.7853981633974483);
 320  catchAndAssertEquals(function() {
 321    ATAN("str");
 322  }, ERRORS.VALUE_ERROR);
 323  catchAndAssertEquals(function() {
 324    ATAN.apply(this, []);
 325  }, ERRORS.NA_ERROR);
 326});
 327
 328
 329test("ATAN2", function(){
 330  assertEquals(ATAN2(4, 3), 0.6435011087932844);
 331  assertEquals(ATAN2(-1, -1), -2.356194490192345);
 332  catchAndAssertEquals(function() {
 333    ATAN2(0, 0);
 334  }, ERRORS.DIV_ZERO_ERROR);
 335  assertEquals(ATAN2(1, 0), 0);
 336  assertEquals(ATAN2(0, 1), 1.5707963267948966);
 337  assertEquals(ATAN2(-1, "-1"), -2.356194490192345);
 338  assertEquals(ATAN2(true, false), 0);
 339  assertEquals(ATAN2(true, true), 0.7853981633974483);
 340  catchAndAssertEquals(function() {
 341    ATAN2("str", false);
 342  }, ERRORS.VALUE_ERROR);
 343  catchAndAssertEquals(function() {
 344    ATAN2.apply(this, []);
 345  }, ERRORS.NA_ERROR);
 346});
 347
 348
 349test("ATANH", function(){
 350  assertEquals(ATANH(0.51), 0.5627297693521489);
 351  assertEquals(ATANH(0.44), 0.4722308044204257);
 352  assertEquals(ATANH(0), 0);
 353  assertEquals(ATANH("0.1"), 0.10033534773107558);
 354  assertEquals(ATANH(false), 0);
 355  catchAndAssertEquals(function() {
 356    ATANH(true);
 357  }, ERRORS.NUM_ERROR);
 358  catchAndAssertEquals(function() {
 359    ATANH("str");
 360  }, ERRORS.VALUE_ERROR);
 361});
 362
 363
 364test("CEILING", function(){
 365  assertEquals(CEILING(10.1), 11);
 366  assertEquals(CEILING("10.1"), 11);
 367  assertEquals(CEILING(10.11111111, 0.1), 10.2);
 368  assertEquals(CEILING(10.22222222, 0.1), 10.3);
 369  assertEquals(CEILING(10.33333333, 0.2), 10.4);
 370  assertEquals(CEILING(10.33333333, 0.1), 10.4);
 371  assertEquals(CEILING([10.33333333], 0.1), 10.4);
 372  assertEquals(CEILING(10.22222222, 5), 15);
 373  assertEquals(CEILING(10.22222222, 8), 16);
 374  assertEquals(CEILING(10.22222222, true), 11);
 375  catchAndAssertEquals(function() {
 376    CEILING(10, 0);
 377  }, ERRORS.DIV_ZERO_ERROR);
 378  catchAndAssertEquals(function() {
 379    CEILING.apply(this, [10, 1, 2]);
 380  }, ERRORS.NA_ERROR);
 381  catchAndAssertEquals(function() {
 382    CEILING.apply(this, []);
 383  }, ERRORS.NA_ERROR);
 384});
 385
 386
 387test("COMBIN", function(){
 388  assertEquals(COMBIN(4, 2), 6);
 389  assertEquals(COMBIN(4.999, 2.888), 6);
 390  assertEquals(COMBIN([4, "str"], [2]), 6);
 391  assertEquals(COMBIN(0, 0), 1);
 392  catchAndAssertEquals(function() {
 393    COMBIN(2, "str");
 394  }, ERRORS.VALUE_ERROR);
 395  catchAndAssertEquals(function() {
 396    COMBIN(2, []);
 397  }, ERRORS.REF_ERROR);
 398  catchAndAssertEquals(function() {
 399    COMBIN(2, 4);
 400  }, ERRORS.NUM_ERROR);
 401  catchAndAssertEquals(function() {
 402    COMBIN(0, 1);
 403  }, ERRORS.NUM_ERROR);
 404  catchAndAssertEquals(function() {
 405    COMBIN.apply(this, []);
 406  }, ERRORS.NA_ERROR);
 407  catchAndAssertEquals(function() {
 408    COMBIN.apply(this, [4]);
 409  }, ERRORS.NA_ERROR);
 410  catchAndAssertEquals(function() {
 411    COMBIN.apply(this, [4, 2, 66]);
 412  }, ERRORS.NA_ERROR);
 413});
 414
 415
 416test("COS", function(){
 417  assertEquals(COS(PI()), -1);
 418  assertEquals(COS(1), 0.5403023058681398);
 419  assertEquals(COS(false), 1);
 420  assertEquals(COS(true), 0.5403023058681398);
 421  assertEquals(COS(""), 1);
 422  assertEquals(COS("0"), 1);
 423  catchAndAssertEquals(function() {
 424    COS("str");
 425  }, ERRORS.VALUE_ERROR);
 426  catchAndAssertEquals(function() {
 427    COS.apply(this, []);
 428  }, ERRORS.NA_ERROR);
 429  catchAndAssertEquals(function() {
 430    COS.apply(this, [1, 1]);
 431  }, ERRORS.NA_ERROR);
 432  assertEquals(COS([0, "str"]), 1);
 433});
 434
 435
 436test("COSH", function(){
 437  assertEquals(COSH(PI()), 11.591953275521519);
 438  assertEquals(COSH(1), 1.5430806348152437);
 439  assertEquals(COSH(false), 1);
 440  assertEquals(COSH(0), 1);
 441  assertEquals(COSH(true), 1.5430806348152437);
 442  assertEquals(COSH(""), 1);
 443  assertEquals(COSH([0, "str"]), 1);
 444  catchAndAssertEquals(function() {
 445    COSH("str");
 446  }, ERRORS.VALUE_ERROR);
 447  catchAndAssertEquals(function() {
 448    COSH.apply(this, []);
 449  }, ERRORS.NA_ERROR);
 450  catchAndAssertEquals(function() {
 451    COSH.apply(this, [1, 1]);
 452  }, ERRORS.NA_ERROR);
 453});
 454
 455
 456test("COT", function(){
 457  assertEquals(COT(30), -0.15611995216165922);
 458  assertEquals(COT(1), 0.6420926159343306);
 459  assertEquals(COT(true), 0.6420926159343306);
 460  assertEquals(COT([1, "str"]), 0.6420926159343306);
 461  catchAndAssertEquals(function() {
 462    COT(false);
 463  }, ERRORS.DIV_ZERO_ERROR);
 464  catchAndAssertEquals(function() {
 465    COT(0);
 466  }, ERRORS.DIV_ZERO_ERROR);
 467  catchAndAssertEquals(function() {
 468    COT("");
 469  }, ERRORS.DIV_ZERO_ERROR);
 470  catchAndAssertEquals(function() {
 471    COT("str");
 472  }, ERRORS.VALUE_ERROR);
 473  catchAndAssertEquals(function() {
 474    COT.apply(this, []);
 475  }, ERRORS.NA_ERROR);
 476  catchAndAssertEquals(function() {
 477    COT.apply(this, [1, 1]);
 478  }, ERRORS.NA_ERROR);
 479});
 480
 481
 482test("COTH", function(){
 483  assertEquals(COTH(30), 1);
 484  assertEquals(COTH(1), 1.3130352854993315);
 485  assertEquals(COTH(true), 1.3130352854993315);
 486  assertEquals(COTH([1, "str"]), 1.3130352854993315);
 487  assertEquals(COTH(-1), -1.3130352854993315);
 488  catchAndAssertEquals(function() {
 489    COTH(false);
 490  }, ERRORS.DIV_ZERO_ERROR);
 491  catchAndAssertEquals(function() {
 492    COTH(0);
 493  }, ERRORS.DIV_ZERO_ERROR);
 494  catchAndAssertEquals(function() {
 495    COTH("");
 496  }, ERRORS.DIV_ZERO_ERROR);
 497  catchAndAssertEquals(function() {
 498    COTH("str");
 499  }, ERRORS.VALUE_ERROR);
 500  catchAndAssertEquals(function() {
 501    COTH.apply(this, []);
 502  }, ERRORS.NA_ERROR);
 503  catchAndAssertEquals(function() {
 504    COTH.apply(this, [1, 1]);
 505  }, ERRORS.NA_ERROR);
 506});
 507
 508
 509test("COUNTIF", function(){
 510  assertEquals(COUNTIF(10, "= 10"), 1);
 511  assertEquals(COUNTIF([1, 5, 5, [5, 5, 5, 5], 10, 5], "= 5"), 7);
 512  assertEquals(COUNTIF([1, 5, 5, [5, 5, 5, 5], [], 10, 5], "= 5"), 7);
 513  assertEquals(COUNTIF([1, 5, 5, [5, 5, "5", "5.000"], [], 10, 5], "= 5"), 7);
 514  assertEquals(COUNTIF([1, 5, 10], ">4"), 2);
 515  assertEquals(COUNTIF([1, 2, 2, 2, 2, 2, 2, 2], ">1"), 7);
 516  assertEquals(COUNTIF([1, 5, 10], 5), 1);
 517  assertEquals(COUNTIF([1, 5, 5, 5, 10, 5], 5), 4);
 518  assertEquals(COUNTIF([1, 5, 5, 5, 10, 5], 10), 1);
 519  assertEquals(COUNTIF([1, 5, 5, 5, 10, 5], ">5"), 1);
 520  assertEquals(COUNTIF([1, 5, 5, 5, 10, 5], "=5"), 4);
 521  assertEquals(COUNTIF([1, 5, 5, 5, 10, 5], "=10"), 1);
 522  assertEquals(COUNTIF([1, 5, 5, 5, 10, 5], "=     10  "), 1);
 523  assertEquals(COUNTIF([1, 5, 5, 5, 10, 5], ">0"), 6);
 524  assertEquals(COUNTIF([1, 5, 5, 5, 10, 5], ">=5"), 5);
 525  assertEquals(COUNTIF([1, 5, 5, 5, 10, 5], "<10"), 5);
 526  assertEquals(COUNTIF([1, 5, 5, 5, 10, 5, 44], "<=10"), 6);
 527  assertEquals(COUNTIF([1, 5, 5, 5, 10, 5], ">4.99"), 5);
 528  assertEquals(COUNTIF([1, 5, 5, 5, 10, 5], "<4.99"), 1);
 529  assertEquals(COUNTIF([1, 5, 5, 5, 10, 5], "=     1.0.0  "), 0);
 530  assertEquals(COUNTIF([1, 5, 5, 5, 10, 5], "=>5"), 0);
 531  assertEquals(COUNTIF([1, 5, 5, 5, 10, 5], "==5"), 0);
 532  assertEquals(COUNTIF(["mom", "pop", "dad", "etc", "boom"], "*o*"), 3);
 533  assertEquals(COUNTIF(["mom", "pop", "dad", "etc", "mom"], "mom"), 2);
 534  assertEquals(COUNTIF(["mom", "pop", "dad", "etc", "mom"], "?o?"), 3);
 535  assertEquals(COUNTIF(["mom", "pop", "dad", "etc", "mom"], "???"), 5);
 536  assertEquals(COUNTIF(["mom", "pop", "dad", "etc", "mom"], "????"), 0);
 537  assertEquals(COUNTIF(["mom", "pop", "dad", "etc", "mom"], "?"), 0);
 538  // dollar sign and negative values
 539  assertEquals(COUNTIF([1, 5, 5, 5, 10, 5], "=$5"), 4);
 540  assertEquals(COUNTIF([1, -5, -5, -5, 10, -5], "=-$5"), 4);
 541  assertEquals(COUNTIF([1, -5, -5, -5, 10, -5], "=-5"), 4);
 542  assertEquals(COUNTIF([1, 5, 5, 5, 10, 5], ">$5"), 1);
 543  assertEquals(COUNTIF([1, 5, 5, 5, 10, 5], "=$10"), 1);
 544  assertEquals(COUNTIF([1, 5, 5, 5, 10, 5], "=  $ 10"), 1);
 545  catchAndAssertEquals(function() {
 546    COUNTIF.apply(this, [[0, 1, 0, 1]]);
 547  }, ERRORS.NA_ERROR);
 548  catchAndAssertEquals(function() {
 549    COUNTIF.apply(this, []);
 550  }, ERRORS.NA_ERROR);
 551  catchAndAssertEquals(function() {
 552    COUNTIF.apply(this, [[], "=1", []]);
 553  }, ERRORS.NA_ERROR);
 554});
 555
 556
 557test("COUNTIFS", function(){
 558  // All COUNTIF tests should also work on COUNTIFS
 559  assertEquals(COUNTIFS([1, 5, 10], ">4"), 2);
 560  assertEquals(COUNTIFS([1, 2, 2, 2, 2, 2, 2, 2], ">1"), 7);
 561  assertEquals(COUNTIFS([1, 5, 10], 5), 1);
 562  assertEquals(COUNTIFS([1, 5, 5, 5, 10, 5], 5), 4);
 563  assertEquals(COUNTIFS([1, 5, 5, 5, 10, 5], 10), 1);
 564  assertEquals(COUNTIFS([1, 5, 5, 5, 10, 5], ">5"), 1);
 565  assertEquals(COUNTIFS([1, 5, 5, 5, 10, 5], "=5"), 4);
 566  assertEquals(COUNTIFS([1, 5, 5, 5, 10, 5], "=10"), 1);
 567  assertEquals(COUNTIFS([1, 5, 5, 5, 10, 5], "=     10  "), 1);
 568  assertEquals(COUNTIFS([1, 5, 5, 5, 10, 5], ">0"), 6);
 569  assertEquals(COUNTIFS([1, 5, 5, 5, 10, 5], ">=5"), 5);
 570  assertEquals(COUNTIFS([1, 5, 5, 5, 10, 5], "<10"), 5);
 571  assertEquals(COUNTIFS([1, 5, 5, 5, 10, 5, 44], "<=10"), 6);
 572  assertEquals(COUNTIFS([1, 5, 5, 5, 10, 5], ">4.99"), 5);
 573  assertEquals(COUNTIFS([1, 5, 5, 5, 10, 5], "<4.99"), 1);
 574  assertEquals(COUNTIFS([1, 5, 5, 5, 10, 5], "=     1.0.0  "), 0);
 575  assertEquals(COUNTIFS([1, 5, 5, 5, 10, 5], "=>5"), 0);
 576  assertEquals(COUNTIFS([1, 5, 5, 5, 10, 5], "==5"), 0);
 577  assertEquals(COUNTIFS(["mom", "pop", "dad", "etc", "boom"], "*o*"), 3);
 578  assertEquals(COUNTIFS(["mom", "pop", "dad", "etc", "mom"], "mom"), 2);
 579  assertEquals(COUNTIFS(["mom", "pop", "dad", "etc", "mom"], "?o?"), 3);
 580  assertEquals(COUNTIFS(["mom", "pop", "dad", "etc", "mom"], "???"), 5);
 581  assertEquals(COUNTIFS(["mom", "pop", "dad", "etc", "mom"], "????"), 0);
 582  assertEquals(COUNTIFS(["mom", "pop", "dad", "etc", "mom"], "?"), 0);
 583  // Now actually test COUNTIFS
 584  assertEquals(COUNTIFS([1, 5, 5, [5, 5, 5, 5], 10, 5], "= 5"), 7);
 585  assertEquals(COUNTIFS([1, 5, 5, [5, 5, 5, 5], [], 10, 5], "= 5"), 7);
 586  assertEquals(COUNTIFS([1, 5, 5, [5, 5, 5, 5], [], 10, 8], "> 4", [false, false, false, [true, true, true, true], [], false, false], "= true"), 0);
 587  assertEquals(COUNTIFS([1, 5, 5, [5, 5, 5, 5], [], 10, 8], "> 4", [false, false, false, ["A", "A", "A", "A"], [], false, false], "= 'A'"), 0);
 588  assertEquals(COUNTIFS([1, 5, 5, [5, 5, 5, 5], [], 10, 8], "> 4", [1, 5, 5, [5, 5, 5, 5], [], 10, 8], "> 5"), 2);
 589  assertEquals(COUNTIFS([1, 5, 5, [5, 5, "5", "5.000"], [], 10, 5], "= 5"), 7);
 590  assertEquals(COUNTIFS([1, 5, 10, 20], ">4", [0, 0, 1, 1], "=1"), 2);
 591  assertEquals(COUNTIFS([1, 5, 10, 20], ">4", [0, 0, 1, 1], "=1"), 2);
 592  assertEquals(COUNTIFS([1, 5, 10, 20], ">4", [0, 0, 1, 1], "=1", [0, 0, 1, 1], "=1"), 2);
 593  assertEquals(COUNTIFS([1, 5, 10, 20, 40], ">4", [0, 0, 1, 1, 1], "=1", [0, 0, 0, 0, 0], "=1"), 0);
 594  assertEquals(COUNTIFS([1, 2, 3, 4], ">3", [true, true, false, true], true), 1);
 595  catchAndAssertEquals(function() {
 596    COUNTIFS([1, 5, 10, 20], ">4", [0, 0], "=1");
 597  }, ERRORS.VALUE_ERROR);
 598});
 599
 600
 601test("COUNTUNIQUE", function(){
 602  assertEquals(COUNTUNIQUE([1, 1, 10]), 2);
 603  assertEquals(COUNTUNIQUE(["1", 1, 10]), 3);
 604  assertEquals(COUNTUNIQUE(["1", 1, 10, ""]), 4);
 605  assertEquals(COUNTUNIQUE(["1", 1, 10, "", ""]), 4);
 606  assertEquals(COUNTUNIQUE(["1", 1, 10, "", " "]), 5);
 607  assertEquals(COUNTUNIQUE(["1", 1, 10, []]), 4);
 608  assertEquals(COUNTUNIQUE(["", " ", [""], []]), 2);
 609  assertEquals(COUNTUNIQUE([[""], []]), 1);
 610  catchAndAssertEquals(function() {
 611    COUNTUNIQUE.apply(this, []);
 612  }, ERRORS.NA_ERROR);
 613});
 614
 615
 616test("DEGREES", function(){
 617  assertEquals(DEGREES(PI()), 180);
 618  assertEquals(DEGREES([PI(), "str"]), 180);
 619  assertEquals(DEGREES(false), 0);
 620  assertEquals(DEGREES(true), 57.29577951308232);
 621  assertEquals(DEGREES(1), 57.29577951308232);
 622  assertEquals(DEGREES(12), 687.5493541569879);
 623  catchAndAssertEquals(function() {
 624    DEGREES("str");
 625  }, ERRORS.VALUE_ERROR);
 626  catchAndAssertEquals(function() {
 627    DEGREES.apply(this, []);
 628  }, ERRORS.NA_ERROR);
 629  catchAndAssertEquals(function() {
 630    DEGREES.apply(this, [10, 10]);
 631  }, ERRORS.NA_ERROR);
 632});
 633
 634
 635test("ERF", function(){
 636  assertEquals(ERF(2), 0.9953222650189527);
 637  assertEquals(ERF("2"), 0.9953222650189527);
 638  assertEquals(ERF(0), 1.1102230246251565e-16);
 639  assertEquals(ERF(1), 0.8427007929497149);
 640  assertEquals(ERF(true), 0.8427007929497149);
 641  assertEquals(ERF(false), 1.1102230246251565e-16);
 642  catchAndAssertEquals(function() {
 643    ERF.apply(this, []);
 644  }, ERRORS.NA_ERROR);
 645  catchAndAssertEquals(function() {
 646    ERF([]);
 647  }, ERRORS.REF_ERROR);
 648  assertEquals(ERF(1, 2), 0.15262147206923782);
 649  assertEquals(ERF(2, 1), -0.15262147206923782);
 650});
 651
 652
 653test("ERFC", function(){
 654  assertEquals(ERFC(2), 0.004677734981047288);
 655  assertEquals(ERFC("2"), 0.004677734981047288);
 656  assertEquals(ERFC(0), 1);
 657  assertEquals(ERFC(1), 0.1572992070502851);
 658  assertEquals(ERFC(-1), 1.842700792949715);
 659  assertEquals(ERFC(-10), 2);
 660  catchAndAssertEquals(function() {
 661    ERFC.apply(this, []);
 662  }, ERRORS.NA_ERROR);
 663  catchAndAssertEquals(function() {
 664    ERFC([]);
 665  }, ERRORS.REF_ERROR);
 666});
 667
 668
 669test("EVEN", function(){
 670  assertEquals(EVEN(3), 4);
 671  assertEquals(EVEN(4), 4);
 672  assertEquals(EVEN(5), 6);
 673  assertEquals(EVEN("4"), 4);
 674  assertEquals(EVEN(false), 0);
 675  assertEquals(EVEN(true), 2);
 676  assertEquals(EVEN([11, 22]), 12);
 677  assertEquals(EVEN([10, 22, "str"]), 10);
 678  catchAndAssertEquals(function() {
 679    EVEN.apply(this, []);
 680  }, ERRORS.NA_ERROR);
 681  catchAndAssertEquals(function() {
 682    EVEN.apply(this, [1, 2, 3]);
 683  }, ERRORS.NA_ERROR);
 684  catchAndAssertEquals(function() {
 685    EVEN("str");
 686  }, ERRORS.VALUE_ERROR);
 687});
 688
 689
 690test("FLOOR", function(){
 691  assertEquals(FLOOR(10.1), 10);
 692  assertEquals(FLOOR("10.1"), 10);
 693  assertEquals(FLOOR(10.11111111, 0.1), 10.1);
 694  assertEquals(FLOOR(10.22222222, 0.1), 10.2);
 695  assertEquals(FLOOR(10.33333333, 0.2), 10.2);
 696  assertEquals(FLOOR(10.33333333, 0.1), 10.3);
 697  assertEquals(FLOOR([10.33333333], 0.1), 10.3);
 698  assertEquals(FLOOR(10.22222222, 5), 10);
 699  assertEquals(FLOOR(10.22222222, 8), 8);
 700  assertEquals(FLOOR(10.22222222, true), 10);
 701  catchAndAssertEquals(function() {
 702    FLOOR(10, 0);
 703  }, ERRORS.DIV_ZERO_ERROR);
 704  catchAndAssertEquals(function() {
 705    FLOOR.apply(this, [10, 1, 2]);
 706  }, ERRORS.NA_ERROR);
 707  catchAndAssertEquals(function() {
 708    FLOOR.apply(this, []);
 709  }, ERRORS.NA_ERROR);
 710});
 711
 712
 713test("IF", function(){
 714  assertEquals(IF(true, "hit", "miss"), "hit");
 715  assertEquals(IF(false, "hit", "miss"), "miss");
 716  assertEquals(IF("", "hit", "miss"), "miss");
 717  assertEquals(IF("", "hit", "miss"), "miss");
 718  assertEquals(IF([true], "hit", "miss"), "hit");
 719  assertEquals(IF([false], "hit", "miss"), "miss");
 720  assertEquals(IF([""], "hit", "miss"), "miss");
 721  assertEquals(IF([""], "hit", "miss"), "miss");
 722  catchAndAssertEquals(function() {
 723    IF("str", 1, 2);
 724  }, ERRORS.VALUE_ERROR);
 725  catchAndAssertEquals(function() {
 726    IF([], 1, 2);
 727  }, ERRORS.REF_ERROR);
 728});
 729
 730
 731test("INT", function(){
 732  assertEquals(INT(99.33), 99);
 733  assertEquals(INT(99.99), 99);
 734  assertEquals(INT(true), 1);
 735  assertEquals(INT(false), 0);
 736  assertEquals(INT(""), 0);
 737  assertEquals(INT([1.1, "str"]), 1);
 738  catchAndAssertEquals(function() {
 739    INT.apply(this, [100, 10]);
 740  }, ERRORS.NA_ERROR);
 741  catchAndAssertEquals(function() {
 742    INT.apply(this, []);
 743  }, ERRORS.NA_ERROR);
 744  catchAndAssertEquals(function() {
 745    INT("str");
 746  }, ERRORS.VALUE_ERROR);
 747});
 748
 749
 750test("ISEVEN", function(){
 751  assertEquals(ISEVEN(4), true);
 752  assertEquals(ISEVEN(3), false);
 753  assertEquals(ISEVEN(4.1), true);
 754  assertEquals(ISEVEN(false), true);
 755  assertEquals(ISEVEN(true), false);
 756  assertEquals(ISEVEN([4]), true);
 757  catchAndAssertEquals(function() {
 758    ISEVEN.apply(this, [100, 10]);
 759  }, ERRORS.NA_ERROR);
 760  catchAndAssertEquals(function() {
 761    ISEVEN.apply(this, []);
 762  }, ERRORS.NA_ERROR);
 763  catchAndAssertEquals(function() {
 764    ISEVEN("");
 765  }, ERRORS.VALUE_ERROR);
 766});
 767
 768
 769test("ISODD", function(){
 770  assertEquals(ISODD(4), false);
 771  assertEquals(ISODD(3), true);
 772  assertEquals(ISODD(4.1), false);
 773  assertEquals(ISODD(false), false);
 774  assertEquals(ISODD(true), true);
 775  assertEquals(ISODD([4]), false);
 776  catchAndAssertEquals(function() {
 777    ISODD.apply(this, [100, 10]);
 778  }, ERRORS.NA_ERROR);
 779  catchAndAssertEquals(function() {
 780    ISODD.apply(this, []);
 781  }, ERRORS.NA_ERROR);
 782  catchAndAssertEquals(function() {
 783    ISODD("");
 784  }, ERRORS.VALUE_ERROR);
 785});
 786
 787
 788test("LN", function(){
 789  assertEquals(LN(100), 4.605170185988092);
 790  assertEquals(LN("100"), 4.605170185988092);
 791  assertEquals(LN(1), 0);
 792  assertEquals(LN(true), 0);
 793  catchAndAssertEquals(function() {
 794    LN(false);
 795  }, ERRORS.NUM_ERROR);
 796  catchAndAssertEquals(function() {
 797    LN("str");
 798  }, ERRORS.VALUE_ERROR);
 799  catchAndAssertEquals(function() {
 800    LN.apply(this, []);
 801  }, ERRORS.NA_ERROR);
 802  catchAndAssertEquals(function() {
 803    LN.apply(this, [10, 10]);
 804  }, ERRORS.NA_ERROR);
 805});
 806
 807
 808test("LOG", function(){
 809  assertEquals(LOG(256, 2), 8);
 810  assertEquals(LOG(100, 10), 2);
 811  assertEquals(LOG(256, 10), 2.408239965311849);
 812  assertEquals(LOG(1, 2), 0);
 813  catchAndAssertEquals(function() {
 814    LOG("str", 10);
 815  }, ERRORS.VALUE_ERROR);
 816  catchAndAssertEquals(function() {
 817    LOG(256, 0);
 818  }, ERRORS.NUM_ERROR);
 819  catchAndAssertEquals(function() {
 820    LOG(256, 1);
 821  }, ERRORS.DIV_ZERO_ERROR);
 822  catchAndAssertEquals(function() {
 823    LOG(256, false);
 824  }, ERRORS.NUM_ERROR);
 825  catchAndAssertEquals(function() {
 826    LOG(256, true);
 827  }, ERRORS.DIV_ZERO_ERROR);
 828  catchAndAssertEquals(function() {
 829    LOG.apply(this, [10]);
 830  }, ERRORS.NA_ERROR);
 831});
 832
 833
 834test("LOG10", function(){
 835  assertEquals(LOG10(100), 2);
 836  assertEquals(LOG10("100"), 2);
 837  assertEquals(LOG10(1), 0);
 838  assertEquals(LOG10(10.1), 1.0043213737826424);
 839  catchAndAssertEquals(function() {
 840    LOG10(false);
 841  }, ERRORS.NUM_ERROR);
 842  catchAndAssertEquals(function() {
 843    LOG10("");
 844  }, ERRORS.NUM_ERROR);
 845  catchAndAssertEquals(function() {
 846    LOG10("str");
 847  }, ERRORS.VALUE_ERROR);
 848  catchAndAssertEquals(function() {
 849    LOG10.apply(this, []);
 850  }, ERRORS.NA_ERROR);
 851  catchAndAssertEquals(function() {
 852    LOG10.apply(this, [10, 10]);
 853  }, ERRORS.NA_ERROR);
 854});
 855
 856
 857test("MOD", function(){
 858  assertEquals(MOD(10, 3), 1);
 859  assertEquals(MOD(10, "3"), 1);
 860  assertEquals(MOD(10.1, 3), 1.0999999999999996);
 861  assertEquals(MOD(10, 3.1), 0.6999999999999997);
 862  catchAndAssertEquals(function() {
 863    MOD.apply(this, [10, 3, 10]);
 864  }, ERRORS.NA_ERROR);
 865  catchAndAssertEquals(function() {
 866    MOD.apply(this, [[10, 3]]);
 867  }, ERRORS.NA_ERROR);
 868  catchAndAssertEquals(function() {
 869    MOD(0, 0);
 870  }, ERRORS.DIV_ZERO_ERROR);
 871  catchAndAssertEquals(function() {
 872    MOD.apply(this, [10]);
 873  }, ERRORS.NA_ERROR);
 874  catchAndAssertEquals(function() {
 875    MOD(10, false);
 876  }, ERRORS.DIV_ZERO_ERROR);
 877  catchAndAssertEquals(function() {
 878    MOD(10, 0);
 879  }, ERRORS.DIV_ZERO_ERROR);
 880  catchAndAssertEquals(function() {
 881    MOD(10, "str");
 882  }, ERRORS.VALUE_ERROR);
 883});
 884
 885
 886test("ODD", function(){
 887  assertEquals(ODD(2), 3);
 888  assertEquals(ODD(4), 5);
 889  assertEquals(ODD(5), 5);
 890  assertEquals(ODD("4"), 5);
 891  assertEquals(ODD(false), 1);
 892  assertEquals(ODD(true), 1);
 893  assertEquals(ODD([10, 22]), 11);
 894  assertEquals(ODD([10, 22, "str"]), 11);
 895  catchAndAssertEquals(function() {
 896    ODD.apply(this, []);
 897  }, ERRORS.NA_ERROR);
 898  catchAndAssertEquals(function() {
 899    ODD.apply(this, [1, 2, 3]);
 900  }, ERRORS.NA_ERROR);
 901  catchAndAssertEquals(function() {
 902    ODD("str");
 903  }, ERRORS.VALUE_ERROR);
 904});
 905
 906
 907test("PI", function(){
 908  assertEquals(PI(), 3.141592653589793);
 909  catchAndAssertEquals(function() {
 910    PI.apply(this, [1]);
 911  }, ERRORS.NA_ERROR);
 912});
 913
 914
 915test("POWER", function(){
 916  assertEquals(POWER(4, 10), 1048576);
 917  assertEquals(POWER(4, false), 1);
 918  assertEquals(POWER(4, true), 4);
 919  assertEquals(POWER([4], [10]), 1048576);
 920  assertEquals(POWER([4], [10, "str"]), 1048576);
 921  catchAndAssertEquals(function() {
 922    POWER(4, "str");
 923  }, ERRORS.VALUE_ERROR);
 924  catchAndAssertEquals(function() {
 925    POWER.apply(this, []);
 926  }, ERRORS.NA_ERROR);
 927  catchAndAssertEquals(function() {
 928    POWER.apply(this, [4]);
 929  }, ERRORS.NA_ERROR);
 930  catchAndAssertEquals(function() {
 931    POWER.apply(this, [4, 10, 22]);
 932  }, ERRORS.NA_ERROR);
 933});
 934
 935
 936test("RADIANS", function(){
 937  assertEquals(RADIANS(180), 3.141592653589793);
 938  assertEquals(RADIANS(false), 0);
 939  assertEquals(RADIANS(true), 0.017453292519943295);
 940  catchAndAssertEquals(function() {
 941    RADIANS("str");
 942  }, ERRORS.VALUE_ERROR);
 943  catchAndAssertEquals(function() {
 944    RADIANS.apply(this, []);
 945  }, ERRORS.NA_ERROR);
 946  catchAndAssertEquals(function() {
 947    RADIANS.apply(this, [4, 10]);
 948  }, ERRORS.NA_ERROR);
 949});
 950
 951
 952test("ROUND", function(){
 953  assertEquals(ROUND(99.44, 1), 99.4);
 954  assertEquals(ROUND(99.44, 0), 99);
 955  assertEquals(ROUND(99.4444444444444, 9), 99.444444444);
 956  assertEquals(ROUND("99.44", 0), 99);
 957  assertEquals(ROUND([99.44, 22.222], [1, 4]), 99.4);
 958  catchAndAssertEquals(function() {
 959    ROUND.apply(this, []);
 960  }, ERRORS.NA_ERROR);
 961  catchAndAssertEquals(function() {
 962    ROUND.apply(this, [99.44, 1, 44]);
 963  }, ERRORS.NA_ERROR);
 964  catchAndAssertEquals(function() {
 965    ROUND(99.999, "str");
 966  }, ERRORS.VALUE_ERROR);
 967});
 968
 969
 970test("ROUNDDOWN", function(){
 971  assertEquals(ROUNDDOWN(99.46, 1), 99.4);
 972  assertEquals(ROUNDDOWN(99.99, 1), 99.9);
 973  assertEquals(ROUNDDOWN(99.5555555555555, 9), 99.555555555);
 974  assertEquals(ROUNDDOWN(99.99), 99);
 975  assertEquals(ROUNDDOWN("99.99"), 99);
 976  assertEquals(ROUNDDOWN([99.46666, 22.222], [1, 4]), 99.4);
 977  catchAndAssertEquals(function() {
 978    ROUNDDOWN.apply(this, []);
 979  }, ERRORS.NA_ERROR);
 980  catchAndAssertEquals(function() {
 981    ROUNDDOWN.apply(this, [99.44, 1, 44]);
 982  }, ERRORS.NA_ERROR);
 983  catchAndAssertEquals(function() {
 984    ROUNDDOWN(99.999, "str");
 985  }, ERRORS.VALUE_ERROR);
 986});
 987
 988
 989test("ROUNDUP", function(){
 990  assertEquals(ROUNDUP(99.46, 1), 99.5);
 991  assertEquals(ROUNDUP(99.99, 1), 100);
 992  assertEquals(ROUNDUP(99.5555555555555, 9), 99.555555556);
 993  assertEquals(ROUNDUP(99.99), 100);
 994  assertEquals(ROUNDUP("99.99"), 100);
 995  assertEquals(ROUNDUP([99.46666, 22.222], [1, 4]), 99.5);
 996  catchAndAssertEquals(function() {
 997    ROUNDUP.apply(this, []);
 998  }, ERRORS.NA_ERROR);
 999  catchAndAssertEquals(function() {
1000    ROUNDUP.apply(this, [99.44, 1, 44]);
1001  }, ERRORS.NA_ERROR);
1002  catchAndAssertEquals(function() {
1003    ROUNDUP(99.999, "str");
1004  }, ERRORS.VALUE_ERROR);
1005});
1006
1007
1008test("SIN", function(){
1009  assertEquals(SIN(0), 0);
1010  assertEquals(SIN(1), 0.8414709848078965);
1011  assertEquals(SIN(PI() / 2), 1);
1012  assertEquals(SIN(PI()), 0);
1013  assertEquals(SIN(true), 0.8414709848078965);
1014  assertEquals(SIN(false), 0);
1015  assertEquals(SIN("0"), 0);
1016  assertEquals(SIN(""), 0);
1017  catchAndAssertEquals(function() {
1018    SIN("str");
1019  }, ERRORS.VALUE_ERROR);
1020  assertEquals(SIN([1]), 0.8414709848078965);
1021  assertEquals(SIN([[1]]), 0.8414709848078965);
1022  assertEquals(SIN([1, "str"]), 0.8414709848078965);
1023  catchAndAssertEquals(function() {
1024    SIN.apply(this, [1, 44]);
1025  }, ERRORS.NA_ERROR);
1026});
1027
1028
1029test("SINH", function(){
1030  assertEquals(SINH(PI()), 11.548739357257748);
1031  assertEquals(SINH(1), 1.1752011936438014);
1032  assertEquals(SINH(false), 0);
1033  assertEquals(SINH(true), 1.1752011936438014);
1034  assertEquals(SINH(""), 0);
1035  assertEquals(SINH("0"), 0);
1036  catchAndAssertEquals(function() {
1037    SINH("str");
1038  }, ERRORS.VALUE_ERROR);
1039  assertEquals(SINH([10]), 11013.232874703393);
1040  assertEquals(SINH([[10]]), 11013.232874703393);
1041  catchAndAssertEquals(function() {
1042    SIN([[]]);
1043  }, ERRORS.REF_ERROR);
1044  assertEquals(SINH([[10, "str"]]), 11013.232874703393);
1045});
1046
1047
1048test("SQRT", function(){
1049  assertEquals(SQRT(9), 3);
1050  assertEquals(SQRT("9"), 3);
1051  assertEquals(SQRT(4), 2);
1052  assertEquals(SQRT(false), 0);
1053  assertEquals(SQRT(true), 1);
1054  assertEquals(SQRT(""), 0);
1055  catchAndAssertEquals(function() {
1056    SQRT("str");
1057  }, ERRORS.VALUE_ERROR);
1058  catchAndAssertEquals(function() {
1059    SQRT(-9);
1060  }, ERRORS.VALUE_ERROR);
1061  catchAndAssertEquals(function() {
1062    SQRT.apply(this, []);
1063  }, ERRORS.NA_ERROR);
1064  catchAndAssertEquals(function() {
1065    SQRT.apply(this, [4, 4]);
1066  }, ERRORS.NA_ERROR);
1067});
1068
1069
1070test("SQRTPI", function(){
1071  assertEquals(SQRTPI(9), 5.317361552716548);
1072  assertEquals(SQRTPI("9"), 5.317361552716548);
1073  assertEquals(SQRTPI([9]), 5.317361552716548);
1074  assertEquals(SQRTPI(0), 0);
1075  assertEquals(SQRTPI(1), 1.7724538509055159);
1076  assertEquals(SQRTPI(""), 0);
1077  catchAndAssertEquals(function() {
1078    SQRTPI("str");
1079  }, ERRORS.VALUE_ERROR);
1080  catchAndAssertEquals(function() {
1081    SQRTPI(-1);
1082  }, ERRORS.NUM_ERROR);
1083  catchAndAssertEquals(function() {
1084    SQRTPI.apply(this, []);
1085  }, ERRORS.NA_ERROR);
1086  catchAndAssertEquals(function() {
1087    SQRTPI.apply(this, [4, 4]);
1088  }, ERRORS.NA_ERROR);
1089});
1090
1091
1092test("SUM", function(){
1093  assertEquals(SUM(10), 10);
1094  assertEquals(SUM(10, 10), 20);
1095  assertEquals(SUM(10, [5, 5]), 20);
1096  assertEquals(SUM("10", [5, 5]), 20);
1097  assertEquals(SUM(false, [10, 10]), 20);
1098  assertEquals(SUM(true, [10, 10]), 21);
1099  catchAndAssertEquals(function() {
1100    SUM([10, 10], "");
1101  }, ERRORS.VALUE_ERROR);
1102  catchAndAssertEquals(function() {
1103    SUM([10, 10], "str");
1104  }, ERRORS.VALUE_ERROR);
1105  catchAndAssertEquals(function() {
1106    SUM();
1107  }, ERRORS.NA_ERROR);
1108});
1109
1110
1111test("SUMIF", function(){
1112  assertEquals(SUMIF([1, 5, 10, [1, 1, 1, 1, 1], []], 1), 6);
1113  assertEquals(SUMIF([], 1), 0);
1114  assertEquals(SUMIF([1, 5, 10, [1, 1, "1.0", "1", 1]], 1), 4);
1115  assertEquals(SUMIF([1, 5, 10], 5), 5);
1116  assertEquals(SUMIF([1, 5, 5, 5, 10, 5], 5), 20);
1117  assertEquals(SUMIF([1, 5, 5, 5, 10, 5], 10), 10);
1118  assertEquals(SUMIF([1, 5, 5, 5, 10, 5], ">5"), 10);
1119  assertEquals(SUMIF([1, 5, 5, 5, 10, 5], "=5"), 20);
1120  assertEquals(SUMIF([1, 5, 5, 5, 10, 5], "=1"), 1);
1121  assertEquals(SUMIF([1, 5, 5, 5, 10, 5], "=     1  "), 1);
1122  assertEquals(SUMIF([1, 5, 5, 5, 10, 5], ">0"), 31);
1123  assertEquals(SUMIF([1, 5, 5, 5, 10, 5], ">=5"), 30);
1124  assertEquals(SUMIF([1, 5, 5, 5, 10, 5], "<10"), 21);
1125  assertEquals(SUMIF([1, 5, 5, 5, 10, 5, 44], "<=10"), 31);
1126  assertEquals(SUMIF([1, 5, 5, 5, 10, 5], ">4.99"), 30);
1127  assertEquals(SUMIF([1, 5, 5, 5, 10, 5], "<4.99"), 1);
1128  assertEquals(SUMIF([1, 5, 5, 5, 10, 5], "=     1.0.0  "), 0);
1129  assertEquals(SUMIF([1, 5, 5, 5, 10, 5], "=>5"), 0);
1130  assertEquals(SUMIF([1, 5, 5, 5, 10, 5], "==5"), 0);
1131  assertEquals(SUMIF(["m", "m", 3, 11, true], "m"), 0);
1132  assertEquals(SUMIF(["m", "p", "m"], "m", [1, 1, 1]), 2);
1133  assertEquals(SUMIF(["p", "p", "p"], "m", [1, 1, 1]), 0);
1134  assertEquals(SUMIF(["p", "p", "p"], "", [1, 1, 1]), 0);
1135  assertEquals(SUMIF(["p", "p", "p"], "*", [1, 1, 1]), 3);
1136  assertEquals(SUMIF(["mom", "pop", "pap"], "*o*", [1, 1, 1]), 2);
1137  assertEquals(SUMIF(["mom", "pop", "pap"], "*a*", [1, 1, 1]), 1);
1138  assertEquals(SUMIF(["mom", "pop", "pap"], "p*p", [1, 1, 1]), 2);
1139  assertEquals(SUMIF(["mom", "pop", "pap"], "p*p", [1, 1, 1]), 2);
1140  assertEquals(SUMIF(["mom", "pop", "pap"], "p*p", [1, 1,]), 1);
1141  assertEquals(SUMIF(["pop", "pap"], "p*p", [1, 2, 4]), 3);
1142  assertEquals(SUMIF(["mom", "pop", "dad", "etc", "boom"], "*o*", [1, 1, 1, 1, 1]), 3);
1143  assertEquals(SUMIF(["mom", "pop", "dad", "etc", "mom"], "mom", [1, 1, 1, 1, 1]), 2);
1144  assertEquals(SUMIF(["mom", "pop", "dad", "etc", "mom"], "?o?", [1, 1, 1, 1, 1]), 3);
1145  assertEquals(SUMIF(["mom", "pop", "dad", "etc", "mom"], "???", [1, 1, 1, 1, 1]), 5);
1146  assertEquals(SUMIF(["mom", "pop", "dad", "etc", "mom"], "????", [1, 1, 1, 1, 1]), 0);
1147  assertEquals(SUMIF([0, 1, 0, 1], "=1", [1, 2, 4, 8]), 10);
1148  catchAndAssertEquals(function() {
1149    SUMIF.apply(this, [[0, 1, 0, 1]]);
1150  }, ERRORS.NA_ERROR);
1151  catchAndAssertEquals(function() {
1152    SUMIF.apply(this, []);
1153  }, ERRORS.NA_ERROR);
1154  catchAndAssertEquals(function() {
1155    SUMIF.apply(this, [[], "=1", [], true]);
1156  }, ERRORS.NA_ERROR);
1157});
1158
1159
1160test("SUMPRODUCT", function(){
1161  assertEquals(SUMPRODUCT([1, 5, 10], [2, 2, 2]), 32);
1162  assertEquals(SUMPRODUCT([1, 5, 10], [2, 2, 2], [2, 2, 2]), 64);
1163  assertEquals(SUMPRODUCT([1, 5, 10], [1, 2, 2], [1, 4, 4]), 121);
1164  assertEquals(SUMPRODUCT([1, 5, 10]), 16);
1165  assertEquals(SUMPRODUCT([1, 5, 10, ""]), 16);
1166  assertEquals(SUMPRODUCT([1, 5, 10, 200], [2, 2, 2, ""]), 32);
1167  assertEquals(SUMPRODUCT([1, 5, 10, "str"]), 16);
1168  assertEquals(SUMPRODUCT([10, 10, 22, "str"], [2, 2, [2, 2]]), 84);
1169  assertEquals(SUMPRODUCT(1, 5, 10), 50);
1170  assertEquals(SUMPRODUCT([1, 5, 10]), 16);
1171  catchAndAssertEquals(function() {
1172    SUMPRODUCT([1, 5, 10], [2, 2]);
1173  }, ERRORS.VALUE_ERROR);
1174  catchAndAssertEquals(function() {
1175    SUMPRODUCT([1, 5, 10], [2, 2, 2, []]);
1176  }, ERRORS.REF_ERROR);
1177  catchAndAssertEquals(function() {
1178    SUMPRODUCT();
1179  }, ERRORS.NA_ERROR);
1180});
1181
1182
1183test("SUMSQ", function(){
1184  assertEquals(SUMSQ([1, 5, 10], 10), 226);
1185  assertEquals(SUMSQ([10, 10, 22, ""]), 684);
1186  assertEquals(SUMSQ(10, 10, 22), 684);
1187  assertEquals(SUMSQ(10, 10, "22", true), 685);
1188  assertEquals(SUMSQ(10, 10, "22", false), 684);
1189  assertEquals(SUMSQ([10, 10, 22, true]), 684);
1190  catchAndAssertEquals(function() {
1191    SUMSQ([10, 10, 22, "", []]);
1192  }, ERRORS.REF_ERROR);
1193  catchAndAssertEquals(function() {
1194    SUMSQ([]);
1195  }, ERRORS.REF_ERROR);
1196  catchAndAssertEquals(function() {
1197    SUMSQ.apply(this, []);
1198  }, ERRORS.NA_ERROR);
1199});
1200
1201
1202test("SUMX2MY2", function(){
1203  assertEquals(SUMX2MY2([1,2,3],[4,5,6]), -63);
1204  assertEquals(SUMX2MY2([1, 2, 3], [[4, 5], [6]]), -63);
1205  assertEquals(SUMX2MY2(["1",2,3],[4,5,6]), -48);
1206  assertEquals(SUMX2MY2(["",2,3],[4,5,6]), -48);
1207  assertEquals(SUMX2MY2([false,2,3],[4,5,6]), -48);
1208  assertEquals(SUMX2MY2([true,2,3],[4,5,6]), -48);
1209  catchAndAssertEquals(function() {
1210    SUMX2MY2([1,2,3],[4,5, []]);
1211  }, ERRORS.REF_ERROR);
1212  catchAndAssertEquals(function() {
1213    SUMX2MY2.apply(this, [[1,2,3],[4,5]]);
1214  }, ERRORS.NA_ERROR);
1215  catchAndAssertEquals(function() {
1216    SUMX2MY2.apply(this, []);
1217  }, ERRORS.NA_ERROR);
1218});
1219
1220
1221test("SUMX2PY2", function(){
1222  assertEquals(SUMX2PY2([1, 2, 3], [4, 5, 6]), 91);
1223  assertEquals(SUMX2PY2([1, 2, 3], [[4, 5], [6]]), 91);
1224  assertEquals(SUMX2PY2(["1",2,3],[4,5,6]), 74);
1225  assertEquals(SUMX2PY2(["",2,3],[4,5,6]), 74);
1226  assertEquals(SUMX2PY2([false,2,3],[4,5,6]), 74);
1227  assertEquals(SUMX2PY2([true,2,3],[4,5,6]), 74);
1228  catchAndAssertEquals(function() {
1229    SUMX2PY2([1,2,3],[4,5, []]);
1230  }, ERRORS.REF_ERROR);
1231  catchAndAssertEquals(function() {
1232    SUMX2PY2.apply(this, [[1,2,3],[4,5]]);
1233  }, ERRORS.NA_ERROR);
1234  catchAndAssertEquals(function() {
1235    SUMX2PY2.apply(this, []);
1236  }, ERRORS.NA_ERROR);
1237});
1238
1239
1240test("TAN", function(){
1241  assertEquals(TAN(0), 0);
1242  assertEquals(TAN(1), 1.5574077246549023);
1243  assertEquals(TAN(PI() / 2), 16331239353195370);
1244  assertEquals(TAN(PI()), 0);
1245  assertEquals(TAN(false), 0);
1246  assertEquals(TAN(true), 1.5574077246549023);
1247  assertEquals(TAN(""), 0);
1248  assertEquals(TAN("0"), 0);
1249  catchAndAssertEquals(function() {
1250    TAN("str");
1251  }, ERRORS.VALUE_ERROR);
1252  catchAndAssertEquals(function() {
1253    TAN.apply(this, []);
1254  }, ERRORS.NA_ERROR);
1255  catchAndAssertEquals(function() {
1256    TAN.apply(this, [1, 1]);
1257  }, ERRORS.NA_ERROR);
1258  assertEquals(TAN([1, 44]), 1.5574077246549023);
1259  assertEquals(TAN([1, "str"]), 1.5574077246549023);
1260});
1261
1262
1263test("TANH", function(){
1264  assertEquals(TANH(0), 0);
1265  assertEquals(TANH(1), 0.7615941559557649);
1266  assertEquals(TANH(PI() / 2), 0.9171523356672744);
1267  assertEquals(TANH(PI()), 0.99627207622075);
1268  assertEquals(TANH(false), 0);
1269  assertEquals(TANH(true), 0.7615941559557649);
1270  assertEquals(TANH(""), 0);
1271  assertEquals(TANH("0"), 0);
1272  catchAndAssertEquals(function() {
1273    TANH("str");
1274  }, ERRORS.VALUE_ERROR);
1275  catchAndAssertEquals(function() {
1276    TANH.apply(this, []);
1277  }, ERRORS.NA_ERROR);
1278  catchAndAssertEquals(function() {
1279    TANH.apply(this, [1, 1]);
1280  }, ERRORS.NA_ERROR);
1281  assertEquals(TANH([1, 44]), 0.7615941559557649);
1282  assertEquals(TANH([1, "str"]), 0.7615941559557649);
1283});
1284
1285
1286test("TRUNC", function(){
1287  assertEquals(TRUNC(PI(), 2), 3.14);
1288  assertEquals(TRUNC("3.141592653589793", "2"), 3.14);
1289  assertEquals(TRUNC(PI(), 1), 3.1);
1290  assertEquals(TRUNC(PI(), 0), 3);
1291  assertEquals(TRUNC(PI(), false), 3);
1292  assertEquals(TRUNC(PI(), -1), 0);
1293  assertEquals(TRUNC(31.41592653589793, -1), 30);
1294  assertEquals(TRUNC([31.41592653589793], [-1]), 30);
1295  assertEquals(TRUNC(31111.41592653589793, -4), 30000);
1296  assertEquals(TRUNC(31111.41592653589793, -2), 31100);
1297  catchAndAssertEquals(function() {
1298    TRUNC.apply(this, []);
1299  }, ERRORS.NA_ERROR);
1300  catchAndAssertEquals(function() {
1301    TRUNC.apply(this, [3.1, 1, 1]);
1302  }, ERRORS.NA_ERROR);
1303});
1304
1305
1306test("MULTIPLY", function(){
1307  assertEquals(MULTIPLY(2, 2), 4);
1308  assertEquals(MULTIPLY(2, "2"), 4);
1309  assertEquals(MULTIPLY([2, []], ["2"]), 4);
1310  catchAndAssertEquals(function() {
1311    MULTIPLY.apply(this, [3.1, 1, 1]);
1312  }, ERRORS.NA_ERROR);
1313  catchAndAssertEquals(function() {
1314    MULTIPLY.apply(this, [1]);
1315  }, ERRORS.NA_ERROR);
1316});
1317
1318
1319test("Minus", function(){
1320  assertEquals(MINUS(2, 2), 0);
1321  assertEquals(MINUS(2, 10), -8);
1322  assertEquals(MINUS(2, "12"), -10);
1323  assertEquals(MINUS([4, []], ["2"]), 2);
1324  catchAndAssertEquals(function() {
1325    MINUS.apply(this, [3.1, 1, 1]);
1326  }, ERRORS.NA_ERROR);
1327  catchAndAssertEquals(function() {
1328    MINUS.apply(this, [1]);
1329  }, ERRORS.NA_ERROR);
1330});
1331
1332
1333test("DIVIDE", function(){
1334  assertEquals(DIVIDE(2, 2), 1);
1335  assertEquals(DIVIDE(10, 2), 5);
1336  assertEquals(DIVIDE(2, "12"), 0.16666666666666666);
1337  assertEquals(DIVIDE([4, []], ["2"]), 2);
1338  catchAndAssertEquals(function() {
1339    DIVIDE.apply(this, [3.1, 1, 1]);
1340  }, ERRORS.NA_ERROR);
1341  catchAndAssertEquals(function() {
1342    DIVIDE.apply(this, [1]);
1343  }, ERRORS.NA_ERROR);
1344  catchAndAssertEquals(function() {
1345    DIVIDE.apply(this, [1, 1, 1]);
1346  }, ERRORS.NA_ERROR);
1347});
1348
1349
1350test("EQ", function(){
1351  assertEquals(EQ(2, 2), true);
1352  assertEquals(EQ("2", 2), false);
1353  assertEquals(EQ("2", "2"), true);
1354  assertEquals(EQ("abc", "abc"), true);
1355  assertEquals(EQ(true, true), true);
1356  assertEquals(EQ(false, true), false);
1357  assertEquals(EQ(false, false), true);
1358  assertEquals(EQ(0, 0), true);
1359  catchAndAssertEquals(function() {
1360    EQ.apply(this, [3.1, 1, 1]);
1361  }, ERRORS.NA_ERROR);
1362  catchAndAssertEquals(function() {
1363    EQ.apply(this, [1]);
1364  }, ERRORS.NA_ERROR);
1365});
1366
1367
1368test("GT", function(){
1369  assertEquals(GT(2, 2), false);
1370  assertEquals(GT(2, 3), false);
1371  assertEquals(GT(2, 1), true);
1372  assertEquals(GT("abc", "a"), true);
1373  assertEquals(GT("abc", "abcd"), false);
1374  assertEquals(GT(false, false), false);
1375  assertEquals(GT(true, false), true);
1376  catchAndAssertEquals(function() {
1377    GT.apply(this, [3]);
1378  }, ERRORS.NA_ERROR);
1379  catchAndAssertEquals(function() {
1380    GT.apply(this, [3, 3, 3]);
1381  }, ERRORS.NA_ERROR);
1382});
1383
1384
1385test("GTE", function(){
1386  assertEquals(GTE(2, 2), true);
1387  assertEquals(GTE(2, 3), false);
1388  assertEquals(GTE(2, 1), true);
1389  assertEquals(GTE("abc", "a"), true);
1390  assertEquals(GTE("abc", "abc"), true);
1391  assertEquals(GTE("abc", "abcd"), false);
1392  assertEquals(GTE(false, false), true);
1393  assertEquals(GTE(true, false), true);
1394  catchAndAssertEquals(function() {
1395    GTE.apply(this, [3]);
1396  }, ERRORS.NA_ERROR);
1397  catchAndAssertEquals(function() {
1398    GTE.apply(this, [3, 3, 3]);
1399  }, ERRORS.NA_ERROR);
1400});
1401
1402
1403test("LT", function(){
1404  assertEquals(LT(2, 2), false);
1405  assertEquals(LT(2, 3), true);
1406  assertEquals(LT(2, 1), false);
1407  assertEquals(LT("abc", "a"), false);
1408  assertEquals(LT("abc", "abc"), false);
1409  assertEquals(LT("abc", "abcd"), true);
1410  assertEquals(LT(false, false), false);
1411  assertEquals(LT(true, false), false);
1412  assertEquals(LT(false, true), true);
1413  catchAndAssertEquals(function() {
1414    LT.apply(this, [3]);
1415  }, ERRORS.NA_ERROR);
1416  catchAndAssertEquals(function() {
1417    LT.apply(this, [3, 3, 3]);
1418  }, ERRORS.NA_ERROR);
1419});
1420
1421
1422test("NE", function(){
1423  assertEquals(NE(2, 2), false);
1424  assertEquals(NE(2, 3), true);
1425  assertEquals(NE(2, 1), true);
1426  assertEquals(NE("abc", "a"), true);
1427  assertEquals(NE("abc", "abc"), false);
1428  assertEquals(NE("abc", "abcd"), true);
1429  assertEquals(NE(false, false), false);
1430  assertEquals(NE(true, false), true);
1431  assertEquals(NE(false, true), true);
1432  catchAndAssertEquals(function() {
1433    NE.apply(this, [3]);
1434  }, ERRORS.NA_ERROR);
1435  catchAndAssertEquals(function() {
1436    NE.apply(this, [3, 3, 3]);
1437  }, ERRORS.NA_ERROR);
1438});
1439
1440
1441test("LTE", function(){
1442  assertEquals(LTE(2, 2), true);
1443  assertEquals(LTE(2, 3), true);
1444  assertEquals(LTE(2, 1), false);
1445  assertEquals(LTE("abc", "a"), false);
1446  assertEquals(LTE("abc", "abc"), true);
1447  assertEquals(LTE("abc", "abcd"), true);
1448  assertEquals(LTE(false, false), true);
1449  assertEquals(LTE(true, false), false);
1450  assertEquals(LTE(false, true), true);
1451  assertEquals(LTE(true, true), true);
1452  catchAndAssertEquals(function() {
1453    LTE.apply(this, [3]);
1454  }, ERRORS.NA_ERROR);
1455  catchAndAssertEquals(function() {
1456    LTE.apply(this, [3, 3, 3]);
1457  }, ERRORS.NA_ERROR);
1458});
1459
1460
1461test("RAND", function(){
1462  catchAndAssertEquals(function() {
1463    RAND.apply(this, [3]);
1464  }, ERRORS.NA_ERROR);
1465});
1466
1467
1468test("RANDBETWEEN", function(){
1469  for(var i = 0; i < 1000; i++) {
1470    var x = RANDBETWEEN(1, 4);
1471    assertEquals(x >= 1, true);
1472    assertEquals(x <= 4, true);
1473    x = RANDBETWEEN(-1, 1);
1474    assertEquals(x >= -1, true);
1475    assertEquals(x <= 1, true);
1476  }
1477  catchAndAssertEquals(function() {
1478    RANDBETWEEN.apply(this, [3]);
1479  }, ERRORS.NA_ERROR);
1480  catchAndAssertEquals(function() {
1481    RANDBETWEEN.apply(this, [3, 4, 5]);
1482  }, ERRORS.NA_ERROR);
1483});
1484
1485
1486test("SIGN", function(){
1487  assertEquals(SIGN(2), 1);
1488  assertEquals(SIGN(0), 0);
1489  assertEquals(SIGN(-100), -1);
1490  assertEquals(SIGN([0]), 0);
1491  assertEquals(SIGN("0"), 0);
1492  assertEquals(SIGN(false), 0);
1493  assertEquals(SIGN(true), 1);
1494  catchAndAssertEquals(function() {
1495    SIGN.apply(this, [3, 2]);
1496  }, ERRORS.NA_ERROR);
1497});
1498
1499
1500test("UNARY_PERCENT", function(){
1501  assertEquals(UNARY_PERCENT(100), 1);
1502  assertEquals(UNARY_PERCENT(2), 0.02);
1503  assertEquals(UNARY_PERCENT(0), 0);
1504  catchAndAssertEquals(function() {
1505    UNARY_PERCENT.apply(this, []);
1506  }, ERRORS.NA_ERROR);
1507});
1508
1509
1510test("MULTINOMIAL", function(){
1511  assertEquals(MULTINOMIAL(1, 2, 3), 60);
1512  assertEquals(MULTINOMIAL(1, 33, 100), 2.4592658588587683e+33);
1513  assertEquals(MULTINOMIAL(2, 22), 276);
1514  assertEquals(MULTINOMIAL(3), 1);
1515  catchAndAssertEquals(function() {
1516    MULTINOMIAL.apply(this, []);
1517  }, ERRORS.NA_ERROR);
1518});
1519
1520
1521test("SERIESSUM", function(){
1522  assertEquals(SERIESSUM(1, 0, 1, [4, 5, 6]), 15);
1523  assertEquals(SERIESSUM(1, 0, 1, [4, 5, 6, 10, 22]), 47);
1524  assertEquals(SERIESSUM(3, 0, 2, [4, 5, 6]), 535);
1525  assertEquals(SERIESSUM(3, 0, 2, [4, 5, 6, 10]), 7825);
1526  assertEquals(SERIESSUM(3, 2, 2, [4, 5, 6, 10]), 70425);
1527  catchAndAssertEquals(function() {
1528    SERIESSUM.apply(this, [1, 0, 1, [4, 5, 6], 10])
1529  }, ERRORS.NA_ERROR);
1530  catchAndAssertEquals(function() {
1531    SERIESSUM.apply(this, [1, 0, 1])
1532  }, ERRORS.NA_ERROR);
1533});
1534
1535
1536test("SUBTOTAL", function(){
1537  assertEquals(SUBTOTAL(1, [1, 2, 3, 4, 5, 6, 7]), 4);
1538  assertEquals(SUBTOTAL(1, [1, 2, 3, 4, 5, 6, 7], [4, 5, 6, 7, 8, 9, 10]), 5.5);
1539  assertEquals(SUBTOTAL(2, [1, 2, 3, 4, 5, 6, 7], [4, 5, 6, 7, 8, 9, 10]), 14);
1540  assertEquals(SUBTOTAL(3, [1, 2, 3, 4, 5, 6, 7], [4, 5, 6, 7, 8, 9, 10]), 14);
1541  assertEquals(SUBTOTAL(4, [1, 2, 3, 4, 5, 6, 7], [4, 5, 6, 7, 8, 9, 10]), 10);
1542  assertEquals(SUBTOTAL(5, [1, 2, 3, 4, 5, 6, 7], [4, 5, 6, 7, 8, 9, 10]), 1);
1543  assertEquals(SUBTOTAL(6, [1, 2, 3, 4, 5, 6, 7], [4, 5, 6, 7, 8, 9, 10]), 3048192000);
1544  assertEquals(SUBTOTAL(7, [1, 2, 3, 4, 5, 6, 7], [4, 5, 6, 7, 8, 9, 10]), 2.5943726083138543);
1545  assertEquals(SUBTOTAL(8, [1, 2, 3, 4, 5, 6, 7], [4, 5, 6, 7, 8, 9, 10]), 2.5);
1546  assertEquals(SUBTOTAL(9, [1, 2, 3, 4, 5, 6, 7], [4, 5, 6, 7, 8, 9, 10]), 77);
1547  assertEquals(SUBTOTAL(10, [1, 2, 3, 4, 5, 6, 7], [4, 5, 6, 7, 8, 9, 10]), 6.730769230769231);
1548  assertEquals(SUBTOTAL(11, [1, 2, 3, 4, 5, 6, 7], [4, 5, 6, 7, 8, 9, 10]), 6.25);
1549  catchAndAssertEquals(function() {
1550    SUBTOTAL(0, [1, 2, 3, 4, 5, 6, 7]);
1551  }, ERRORS.VALUE_ERROR);
1552  catchAndAssertEquals(function() {
1553    SUBTOTAL(12, [1, 2, 3, 4, 5, 6, 7]);
1554  }, ERRORS.VALUE_ERROR);
1555  catchAndAssertEquals(function() {
1556    SUBTOTAL.apply(this, [1])
1557  }, ERRORS.NA_ERROR);
1558});