Array.prototype.reduce.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. load("test-common.js");
  2. try {
  3. assert(Array.prototype.reduce.length === 1);
  4. assertThrowsError(() => {
  5. [1].reduce();
  6. }, {
  7. error: TypeError,
  8. message: "Array.prototype.reduce() requires at least one argument"
  9. });
  10. assertThrowsError(() => {
  11. [1].reduce(undefined);
  12. }, {
  13. error: TypeError,
  14. message: "undefined is not a function"
  15. });
  16. assertThrowsError(() => {
  17. [].reduce((a, x) => x);
  18. }, {
  19. error: TypeError,
  20. message: "Reduce of empty array with no initial value"
  21. });
  22. assertThrowsError(() => {
  23. [, ,].reduce((a, x) => x);
  24. }, {
  25. error: TypeError,
  26. message: "Reduce of empty array with no initial value"
  27. });
  28. [1, 2].reduce(function () { assert(this === undefined) });
  29. var callbackCalled = 0;
  30. var callback = () => { callbackCalled++; return true };
  31. assert([1].reduce(callback) === 1);
  32. assert(callbackCalled === 0);
  33. assert([, 1].reduce(callback) === 1);
  34. assert(callbackCalled === 0);
  35. callbackCalled = 0;
  36. assert([1, 2, 3].reduce(callback) === true);
  37. assert(callbackCalled === 2);
  38. callbackCalled = 0;
  39. assert([, , 1, 2, 3].reduce(callback) === true);
  40. assert(callbackCalled === 2);
  41. callbackCalled = 0;
  42. assert([1, , , 10, , 100, , ,].reduce(callback) === true);
  43. assert(callbackCalled === 2);
  44. var constantlySad = () => ":^(";
  45. var result = [].reduce(constantlySad, ":^)");
  46. assert(result === ":^)");
  47. result = [":^0"].reduce(constantlySad, ":^)");
  48. assert(result === ":^(");
  49. result = [":^0"].reduce(constantlySad);
  50. assert(result === ":^0");
  51. result = [5, 4, 3, 2, 1].reduce((accum, elem) => accum + elem);
  52. assert(result === 15);
  53. result = [1, 2, 3, 4, 5, 6].reduce((accum, elem) => accum + elem, 100);
  54. assert(result === 121);
  55. result = [6, 5, 4, 3, 2, 1].reduce((accum, elem) => { return accum + elem }, 100);
  56. assert(result === 121);
  57. var indexes = [];
  58. result = ["foo", 1, true].reduce((a, v, i) => { indexes.push(i) });
  59. assert(result === undefined);
  60. assert(indexes.length === 2);
  61. assert(indexes[0] === 1);
  62. assert(indexes[1] === 2);
  63. indexes = [];
  64. result = ["foo", 1, true].reduce((a, v, i) => { indexes.push(i) }, "foo");
  65. assert(result === undefined);
  66. assert(indexes.length === 3);
  67. assert(indexes[0] === 0);
  68. assert(indexes[1] === 1);
  69. assert(indexes[2] === 2);
  70. var mutable = { prop: 0 };
  71. result = ["foo", 1, true].reduce((a, v) => { a.prop = v; return a; }, mutable);
  72. assert(result === mutable);
  73. assert(result.prop === true);
  74. var a1 = [1, 2];
  75. var a2 = null;
  76. a1.reduce((a, v, i, t) => { a2 = t });
  77. assert(a1 === a2);
  78. console.log("PASS");
  79. } catch (e) {
  80. console.log("FAIL: " + e);
  81. }