es6IsConcatSpreadable.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. WScript.LoadScriptFile("..\\UnitTestFramework\\UnitTestFramework.js");
  6. function areEqual(a,b)
  7. {
  8. assert.areEqual(a.length,b.length);
  9. for(var i = 0;i < a.length; i++)
  10. {
  11. assert.areEqual(a[i],b[i]);
  12. }
  13. }
  14. function compareConcats(a,b)
  15. {
  16. var c = a.concat(b);
  17. b[Symbol.isConcatSpreadable] = false;
  18. var d = a.concat(b);
  19. assert.areEqual(b,d[a.length],"Indexing d at a.length should return b");
  20. for(var i = 0;i < a.length; i++)
  21. {
  22. assert.areEqual(a[i],c[i],"confirm array a makes up the first half of array c");
  23. assert.areEqual(a[i],d[i],"confirm array a makes up the first half of array d");
  24. }
  25. for(var i = 0;i < b.length; i++)
  26. {
  27. assert.areEqual(b[i],c[a.length+i],"confirm array b makes up the second half of array c");
  28. assert.areEqual(b[i],d[a.length][i],"confirm array b makes up a sub array at d[a.length]");
  29. }
  30. assert.areEqual(a.length+1,d.length,"since we are not flattening the top level array grows only by 1");
  31. excludeLengthCheck = false;
  32. delete b[Symbol.isConcatSpreadable];
  33. }
  34. var tests = [
  35. {
  36. name: "nativeInt Arrays",
  37. body: function ()
  38. {
  39. var a = [1,2,3];
  40. var b = [4,5,6];
  41. compareConcats(a,b);
  42. }
  43. },
  44. {
  45. name: "nativefloat Arrays",
  46. body: function ()
  47. {
  48. var a = [1.1,2.2,3.3];
  49. var b = [4.4,5.5,6.6];
  50. compareConcats(a,b);
  51. }
  52. },
  53. {
  54. name: "Var Arrays",
  55. body: function ()
  56. {
  57. var a = ["a","b","c"];
  58. var b = ["d","e","f"];
  59. compareConcats(a,b);
  60. }
  61. },
  62. {
  63. name: "intermixed Arrays",
  64. body: function ()
  65. {
  66. var a = [1.1,"b",3];
  67. var b = [4,5.5,"f"];
  68. compareConcats(a,b);
  69. }
  70. },
  71. {
  72. name: "concating spreadable objects",
  73. body: function ()
  74. {
  75. var a = [1,2,3,4,5,6,7,8,9,10];
  76. var b = [1,2,3].concat(4, 5, { [Symbol.isConcatSpreadable]: true, 0: 6, 1: 7, 2: 8, "length" : 3 }, 9, 10);
  77. areEqual(a,b);
  78. // Test to confirm we Spread to nothing when length is not set
  79. var a = [1,2,3,4,5,9,10];
  80. var b = [1,2,3].concat(4, 5, { [Symbol.isConcatSpreadable]: true, 0: 6, 1: 7, 2: 8}, 9, 10);
  81. areEqual(a,b);
  82. }
  83. },
  84. {
  85. name: " concat with non-arrays",
  86. body: function ()
  87. {
  88. var a = [1.1,2.1,3.1];
  89. var b = 4.1;
  90. compareConcats(a,b);
  91. var a = [1,2,3];
  92. var b = 4;
  93. compareConcats(a,b);
  94. var a = [1,2,3];
  95. var b = "b";
  96. compareConcats(a,b);
  97. var a = [1,2,3];
  98. var b = true;
  99. compareConcats(a,b);
  100. }
  101. },
  102. {
  103. name: "override with constructors",
  104. body: function ()
  105. {
  106. var a = [1,2,3];
  107. var b = [4.4,5.5,6.6];
  108. var c = [Object, {}, undefined, Math.sin];
  109. for(var i = 0; i < c.length;i++)
  110. {
  111. a['constructor'] = c[i];
  112. compareConcats(a,b);
  113. }
  114. var o = [];
  115. o.constructor = function()
  116. {
  117. var a = new Array(100);
  118. a[0] = 10;
  119. return a;
  120. }
  121. areEqual([1,2,3],o.concat([1,2,3]));
  122. }
  123. }
  124. ];
  125. testRunner.runTests(tests, { verbose: WScript.Arguments[0] != "summary" });