assign.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Copyright (c) ChakraCore Project Contributors. All rights reserved.
  4. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  5. //-------------------------------------------------------------------------------------------------------
  6. // @ts-check
  7. /// <reference path="..\UnitTestFramework\UnitTestFramework.js" />
  8. WScript.LoadScriptFile("..\\UnitTestFramework\\UnitTestFramework.js");
  9. var tests = [
  10. {
  11. name: "simple copy",
  12. body: function ()
  13. {
  14. let orig = {};
  15. let sym = Symbol("c");
  16. orig.a = 1;
  17. orig.b = "asdf";
  18. orig[sym] = "qwert";
  19. let newObj = Object.assign({}, orig);
  20. assert.areEqual(newObj.b, orig.b);
  21. assert.areEqual(newObj.a, orig.a);
  22. assert.areEqual(newObj[sym], orig[sym]);
  23. }
  24. },
  25. {
  26. name: "non-path type handler",
  27. body: function ()
  28. {
  29. let orig = {};
  30. orig.a = 1;
  31. orig.b = "asdf";
  32. delete orig.a;
  33. let newObj = Object.assign({}, orig);
  34. assert.areEqual(newObj.b, orig.b);
  35. assert.areEqual(newObj.a, orig.a);
  36. }
  37. },
  38. {
  39. name: "has getter",
  40. body: function ()
  41. {
  42. let orig = {};
  43. orig.a = 1;
  44. Object.defineProperty(orig, 'b', {
  45. get: function() { return "asdf"; }, enumerable: true
  46. });
  47. let newObj = Object.assign({}, orig);
  48. assert.areEqual(newObj.b, orig.b);
  49. assert.areEqual(newObj.a, orig.a);
  50. }
  51. },
  52. {
  53. name: "has setter",
  54. body: function ()
  55. {
  56. let orig = {};
  57. orig.a = 1;
  58. Object.defineProperty(orig, 'b', {
  59. set: function() { }, enumerable: true
  60. });
  61. let newObj = Object.assign({}, orig);
  62. assert.areEqual(newObj.b, orig.b);
  63. assert.areEqual(newObj.a, orig.a);
  64. }
  65. },
  66. {
  67. name: "different proto",
  68. body: function ()
  69. {
  70. let protoObj = {};
  71. let orig = Object.create(protoObj);
  72. orig.a = 1;
  73. orig.b = "asdf";
  74. let newObj = Object.assign({}, orig);
  75. assert.areEqual(newObj.b, orig.b);
  76. assert.areEqual(newObj.a, orig.a);
  77. }
  78. },
  79. {
  80. name: "non-enumerable",
  81. body: function ()
  82. {
  83. let orig = {};
  84. orig.a = 1;
  85. Object.defineProperty(orig, 'b', {
  86. value: "asdf", enumerable: false
  87. });
  88. let newObj = Object.assign({}, orig);
  89. assert.areEqual(newObj.b, undefined);
  90. assert.areEqual(newObj.a, orig.a);
  91. }
  92. },
  93. {
  94. name: "proto accessor",
  95. body: function ()
  96. {
  97. Object.defineProperty(Object.prototype, 'b', {
  98. get: function() { return "asdf"; }
  99. });
  100. let orig = {};
  101. orig.a = 1;
  102. let newObj = Object.assign({}, orig);
  103. assert.areEqual(newObj.b, "asdf");
  104. assert.areEqual(newObj.a, orig.a);
  105. }
  106. },
  107. {
  108. name: "has object array",
  109. body: function ()
  110. {
  111. let orig = {};
  112. orig.a = 1;
  113. orig[0] = 2;
  114. let newObj = Object.assign({}, orig);
  115. assert.areEqual(newObj.a, orig.a);
  116. assert.areEqual(newObj[0], orig[0]);
  117. }
  118. },
  119. {
  120. name: "target has object array",
  121. body: function ()
  122. {
  123. let orig = {};
  124. orig.a = 1;
  125. orig[0] = 2;
  126. let newObj = {};
  127. newObj[0] = 3;
  128. Object.assign(newObj, orig);
  129. assert.areEqual(newObj.a, orig.a);
  130. assert.areEqual(newObj[0], orig[0]);
  131. }
  132. },
  133. {
  134. name: "has object array with non-enumerable prop",
  135. body: function ()
  136. {
  137. let orig = {};
  138. orig.a = 1;
  139. orig[0] = 2;
  140. Object.defineProperty(orig, '1', {
  141. value: "3", enumerable: false
  142. });
  143. let newObj = Object.assign({}, orig);
  144. assert.areEqual(newObj.a, orig.a);
  145. assert.areEqual(newObj[0], orig[0]);
  146. assert.areEqual(newObj[1], undefined);
  147. }
  148. },
  149. {
  150. name: "Throw on assign to read-only",
  151. body() {
  152. const obj = {
  153. get prop() { return 1; }
  154. };
  155. assert.throws(() => Object.assign(obj, obj), TypeError, "Object.assign should throw (readonly property)");
  156. }
  157. }
  158. ];
  159. testRunner.runTests(tests, { verbose: WScript.Arguments[0] != "summary" });