Array.prototype.reduceRight.js 2.9 KB

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