defineProperty.js 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548
  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. if (typeof (WScript) != "undefined") {
  6. WScript.LoadScriptFile("..\\UnitTestFramework\\UnitTestFramework.js", "self");
  7. }
  8. var tests = {
  9. // Note: each test has name (string) and body (function) properties.
  10. // Success is when the body does not throw, failure -- when it throws.
  11. test01: {
  12. name: "8.12.9.4.a (variation 1): define generic property, check default attrbitues",
  13. body: function () {
  14. var o = helpers.getDummyObject();
  15. var propertyName = "foo02";
  16. var pd = {};
  17. Object.defineProperty(o, propertyName, pd);
  18. var expected = { writable: false, value: undefined, configurable: false, enumerable: false };
  19. assert.areEqual(expected, Object.getOwnPropertyDescriptor(o, propertyName), "wrong value of getOwnPropertyDescriptor");
  20. }
  21. },
  22. test02: {
  23. name: "8.12.9.4.a (variation 2): define data property, check default attrbitues",
  24. body: function () {
  25. var o = helpers.getDummyObject();
  26. var propertyName = "foo03";
  27. var pd = { value: 0 };
  28. Object.defineProperty(o, propertyName, pd);
  29. var expected = { writable: false, value: 0, configurable: false, enumerable: false };
  30. assert.areEqual(expected, Object.getOwnPropertyDescriptor(o, propertyName), "wrong value of getOwnPropertyDescriptor");
  31. }
  32. },
  33. test03: {
  34. name: "8.12.9.4.a (variation 3): define generic property by specifying some attributes, check attrbitues",
  35. body: function () {
  36. var o = helpers.getDummyObject();
  37. var propertyName = "foo02_v3";
  38. var pd = { configurable: true, writable: false };
  39. Object.defineProperty(o, propertyName, pd);
  40. var expected = { writable: false, value: undefined, configurable: true, enumerable: false };
  41. assert.areEqual(expected, Object.getOwnPropertyDescriptor(o, propertyName), "wrong value of getOwnPropertyDescriptor");
  42. }
  43. },
  44. test04: {
  45. name: "8.12.9.4.b: define accessor property, check default attrbitues",
  46. body: function () {
  47. var o = helpers.getDummyObject();
  48. var propertyName = "foo04";
  49. var getter = function () { return this.Value };
  50. var pd = { get: getter };
  51. Object.defineProperty(o, propertyName, pd);
  52. var expected = { get: getter, set: undefined, configurable: false, enumerable: false };
  53. assert.areEqual(expected, Object.getOwnPropertyDescriptor(o, propertyName), "wrong value of getOwnPropertyDescriptor");
  54. }
  55. },
  56. test05: {
  57. name: "8.12.9.5: re-define property: use descriptor with all fields absent, check that nothing happens to previous descriptor",
  58. body: function () {
  59. var propertyName = "foo05";
  60. var o = { foo05: 1 };
  61. var pd = {};
  62. Object.defineProperty(o, propertyName, pd);
  63. var expected = { writable: true, value: 1, configurable: true, enumerable: true };
  64. assert.areEqual(expected, Object.getOwnPropertyDescriptor(o, propertyName), "wrong value of getOwnPropertyDescriptor");
  65. }
  66. },
  67. test06: {
  68. name: "8.12.9.6: re-define property: use equal descriptor with data field, check that nothing happens to previous descriptor",
  69. body: function () {
  70. var propertyName = "foo06";
  71. var o = { foo06: 1 };
  72. var pd = { value: 1 };
  73. Object.defineProperty(o, propertyName, pd);
  74. var expected = { writable: true, value: 1, configurable: true, enumerable: true };
  75. assert.areEqual(expected, Object.getOwnPropertyDescriptor(o, propertyName), "wrong value of getOwnPropertyDescriptor");
  76. }
  77. },
  78. // where we are:
  79. // - re-define
  80. // - desc is not empty
  81. // - desc and current are not the same
  82. test07: {
  83. name: "8.12.9.7.a: re-define property: current descriptor is not configurable and descriptor is configurable, check that it throws TypeError",
  84. body: function () {
  85. var o = helpers.getDummyObject();
  86. var propertyName = "foo07";
  87. var pd = { value: 0, configurable: false };
  88. Object.defineProperty(o, propertyName, pd);
  89. pd = { value: 1, configurable: true };
  90. assert.throws(function() { Object.defineProperty(o, propertyName, pd); }, TypeError);
  91. }
  92. },
  93. test08: {
  94. name: "8.12.9.7.b (variation 1): re-define property: current descriptor is not configurable and descriptor enumerable is specified and it's negation of current enumerable, check that it throws TypeError",
  95. body: function () {
  96. var o = helpers.getDummyObject();
  97. var propertyName = "foo08";
  98. var pd = { value: 0 };
  99. Object.defineProperty(o, propertyName, pd);
  100. pd = { value: 1, enumerable: true };
  101. assert.throws(function() { Object.defineProperty(o, propertyName, pd); }, TypeError);
  102. }
  103. },
  104. test09: {
  105. name: "8.12.9.7.b (variation 2): re-define property: current descriptor is not configurable and descriptor enumerable is not specified, check that it does not throw",
  106. body: function () {
  107. var o = helpers.getDummyObject();
  108. var propertyName = "foo09";
  109. var pd = { value: 0, writable: true }; // set writable to true to avoid throw code path.
  110. Object.defineProperty(o, propertyName, pd);
  111. pd = { value: 1, writable: false };
  112. Object.defineProperty(o, propertyName, pd);
  113. var expected = { writable: false, value: 1, configurable: false, enumerable: false };
  114. assert.areEqual(expected, Object.getOwnPropertyDescriptor(o, propertyName), "wrong value of getOwnPropertyDescriptor");
  115. }
  116. },
  117. test10: {
  118. name: "8.12.9.7.b (variation 3): re-define property: current descriptor is not configurable and descriptor enumerable is same as current enumerable, check that it does not throw",
  119. body: function () {
  120. var o = helpers.getDummyObject();
  121. var propertyName = "foo10";
  122. var pd = { value: 0, writable: true }; // set writable to true to avoid throw code path.
  123. Object.defineProperty(o, propertyName, pd);
  124. pd = { value: 1, enumerable: false, writable: false };
  125. Object.defineProperty(o, propertyName, pd);
  126. var expected = { writable: false, value: 1, configurable: false, enumerable: false };
  127. assert.areEqual(expected, Object.getOwnPropertyDescriptor(o, propertyName), "wrong value of getOwnPropertyDescriptor");
  128. }
  129. },
  130. test11: {
  131. name: "8.12.9.8: re-define property: descriptor is not empty, generic and is different from current",
  132. body: function () {
  133. var o = helpers.getDummyObject();
  134. var propertyName = "foo11";
  135. var pd = { value: 0, configurable: true };
  136. Object.defineProperty(o, propertyName, pd);
  137. pd = { enumerable: true }; // change enumerable to make sure that descriptor is different from current.
  138. Object.defineProperty(o, propertyName, pd);
  139. var expected = { writable: false, value: 0, configurable: true, enumerable: true };
  140. assert.areEqual(expected, Object.getOwnPropertyDescriptor(o, propertyName), "wrong value of getOwnPropertyDescriptor");
  141. }
  142. },
  143. // where we are:
  144. // - re-define
  145. // - desc is not empty
  146. // - desc and current are not the same
  147. // - descriptor.IsData != current.IsData
  148. test12: {
  149. name: "8.12.9.9.a: re-define property: descriptor.IsData != current.IsData and current is not configurable, check that it throws TypeError",
  150. body: function () {
  151. var o = helpers.getDummyObject();
  152. var propertyName = "foo12";
  153. var pd = { value: 0, configurable: false };
  154. Object.defineProperty(o, propertyName, pd);
  155. pd = { get: function () { return this.Value; } };
  156. assert.throws(function() { Object.defineProperty(o, propertyName, pd); }, TypeError);
  157. }
  158. },
  159. test13: {
  160. name: "8.12.9.9.b (variation 1): re-define property: convert from data to accessor descriptor, check that configurable/enumerable (true) are preserved",
  161. body: function () {
  162. var o = helpers.getDummyObject();
  163. var propertyName = "foo13";
  164. var pd = { value: 0, configurable: true, enumerable: true };
  165. Object.defineProperty(o, propertyName, pd);
  166. var getter = function() { return this.Value; };
  167. pd = { get: getter };
  168. Object.defineProperty(o, propertyName, pd);
  169. var expected = { get: getter, set: undefined, configurable: true, enumerable: true };
  170. assert.areEqual(expected, Object.getOwnPropertyDescriptor(o, propertyName), "wrong value of getOwnPropertyDescriptor");
  171. }
  172. },
  173. test14: {
  174. name: "8.12.9.9.b (variation 2): re-define property: convert from data to accessor descriptor, check that enumerable (false) is preserved",
  175. body: function () {
  176. var o = helpers.getDummyObject();
  177. var propertyName = "foo14";
  178. var pd = { value: 0, configurable: true, enumerable: false };
  179. Object.defineProperty(o, propertyName, pd);
  180. var getter = function () { return this.Value; };
  181. pd = { get: getter };
  182. Object.defineProperty(o, propertyName, pd);
  183. var expected = { get: getter, set: undefined, configurable: true, enumerable: false };
  184. assert.areEqual(expected, Object.getOwnPropertyDescriptor(o, propertyName), "wrong value of getOwnPropertyDescriptor");
  185. }
  186. },
  187. test15: {
  188. name: "8.12.9.9.b (variation 3): re-define property: convert from data to accessor descriptor, check that configurable/enumerable not preserved when specified by descriptor",
  189. body: function () {
  190. var o = helpers.getDummyObject();
  191. var propertyName = "foo15";
  192. var pd = { value: 0, configurable: true, enumerable: true };
  193. Object.defineProperty(o, propertyName, pd);
  194. var getter = function () { return this.Value; };
  195. pd = { get: getter, configurable: false };
  196. Object.defineProperty(o, propertyName, pd);
  197. var expected = { get: getter, set: undefined, configurable: false, enumerable: true };
  198. assert.areEqual(expected, Object.getOwnPropertyDescriptor(o, propertyName), "wrong value of getOwnPropertyDescriptor");
  199. }
  200. },
  201. test16: {
  202. name: "8.12.9.9.c (variation 1): re-define property: convert from accessor to data descriptor, check that configurable/enumerable (true) are preserved",
  203. body: function () {
  204. var o = helpers.getDummyObject();
  205. var propertyName = "foo16";
  206. var pd = {
  207. set: function (arg) { helpers.writeln("setter was called"); this.Value = arg; },
  208. configurable: true,
  209. enumerable: true
  210. };
  211. Object.defineProperty(o, propertyName, pd);
  212. pd = { value: 1 };
  213. Object.defineProperty(o, propertyName, pd);
  214. var expected = { writable: false, value: 1, configurable: true, enumerable: true };
  215. assert.areEqual(expected, Object.getOwnPropertyDescriptor(o, propertyName), "wrong value of getOwnPropertyDescriptor");
  216. }
  217. },
  218. test17: {
  219. name: "8.12.9.9.c (variation 2): re-define property: convert from accessor to data descriptor, check that enumerable (false) is preserved",
  220. body: function () {
  221. var o = helpers.getDummyObject();
  222. var propertyName = "foo17";
  223. var pd = {
  224. set: function (arg) { helpers.writeln("setter was called"); this.Value = arg; },
  225. configurable: true,
  226. enumerable: false
  227. };
  228. Object.defineProperty(o, propertyName, pd);
  229. pd = { value: 1 };
  230. Object.defineProperty(o, propertyName, pd);
  231. var expected = { writable: false, value: 1, configurable: true, enumerable: false };
  232. assert.areEqual(expected, Object.getOwnPropertyDescriptor(o, propertyName), "wrong value of getOwnPropertyDescriptor");
  233. }
  234. },
  235. test18: {
  236. name: "8.12.9.9.c (variation 3): re-define property: convert from accessor to data descriptor, check that configurable/enumerable (true/false) not preserved when specified by descriptor (false/absent)",
  237. body: function () {
  238. var o = helpers.getDummyObject();
  239. var propertyName = "foo18";
  240. var pd = {
  241. set: function (arg) { helpers.writeln("setter was called"); this.Value = arg; },
  242. configurable: true,
  243. enumerable: false
  244. };
  245. Object.defineProperty(o, propertyName, pd);
  246. pd = { value: 1, configurable: false };
  247. Object.defineProperty(o, propertyName, pd);
  248. // expected: configurable/enumerable = false/false.
  249. var expected = { writable: false, value: 1, configurable: false, enumerable: false };
  250. assert.areEqual(expected, Object.getOwnPropertyDescriptor(o, propertyName), "wrong value of getOwnPropertyDescriptor");
  251. }
  252. },
  253. test19: {
  254. name: "8.12.9.9.c (variation 4): re-define property: convert from accessor to data descriptor, check that configurable/enumerable (true/true) not preserved when specified by descriptor (absent/false)",
  255. body: function () {
  256. var o = helpers.getDummyObject();
  257. var propertyName = "foo19";
  258. var pd = {
  259. set: function (arg) { helpers.writeln("setter was called"); this.Value = arg; },
  260. configurable: true,
  261. enumerable: true
  262. };
  263. Object.defineProperty(o, propertyName, pd);
  264. pd = { value: 1, enumerable: false };
  265. Object.defineProperty(o, propertyName, pd);
  266. // expected: configurable/enumerable = true/false.
  267. var expected = { writable: false, value: 1, configurable: true, enumerable: false };
  268. assert.areEqual(expected, Object.getOwnPropertyDescriptor(o, propertyName), "wrong value of getOwnPropertyDescriptor");
  269. }
  270. },
  271. // where we are:
  272. // - re-define
  273. // - desc is not empty
  274. // - desc and current are not the same
  275. // - descriptor is data, current is data
  276. test20: {
  277. name: "8.12.9.10.a (variation 1): re-define data property: current is not configurable/not writable and descriptor writable is absent/value is same",
  278. body: function () {
  279. var o = helpers.getDummyObject();
  280. var propertyName = "foo20";
  281. var pd = { value: 1 };
  282. Object.defineProperty(o, propertyName, pd);
  283. pd = { value: 1 };
  284. Object.defineProperty(o, propertyName, pd);
  285. var expected = { writable: false, value: 1, configurable: false, enumerable: false };
  286. assert.areEqual(expected, Object.getOwnPropertyDescriptor(o, propertyName), "wrong value of getOwnPropertyDescriptor");
  287. }
  288. },
  289. test21: {
  290. name: "8.12.9.10.a.i: re-define data property: current is not configurable/not writable and descriptor is writable, check that it throws TypeError",
  291. body: function () {
  292. var o = helpers.getDummyObject();
  293. var propertyName = "foo21";
  294. var pd = { value: 1 };
  295. Object.defineProperty(o, propertyName, pd);
  296. pd = { value: 2, writable: true };
  297. assert.throws(function() { Object.defineProperty(o, propertyName, pd); }, TypeError, '', 'Cannot redefine non-configurable property \'foo21\'');
  298. return true;
  299. }
  300. },
  301. test22: {
  302. name: "8.12.9.10.a.ii: re-define data property: current is not configurable/not writable and descriptor writable is false and value is different, check that it throws TypeError",
  303. body: function () {
  304. var o = helpers.getDummyObject();
  305. var propertyName = "foo22";
  306. var pd = { value: 1 };
  307. Object.defineProperty(o, propertyName, pd);
  308. pd = { value: 2, writable: false };
  309. assert.throws(function() { Object.defineProperty(o, propertyName, pd); }, TypeError, '', 'Cannot modify non-writable property \'foo22\'');
  310. }
  311. },
  312. test23: {
  313. name: "8.12.9.10.a (variation 2): re-define data property: current is configurable",
  314. body: function () {
  315. var propertyName = "foo23";
  316. var o = { foo23: 1 };
  317. var pd = { value: 2, writable: false };
  318. Object.defineProperty(o, propertyName, pd);
  319. var expected = { writable: false, value: 2, configurable: true, enumerable: true };
  320. assert.areEqual(expected, Object.getOwnPropertyDescriptor(o, propertyName), "wrong value of getOwnPropertyDescriptor");
  321. }
  322. },
  323. // where we are:
  324. // - re-define
  325. // - desc is not empty
  326. // - desc and current are not the same
  327. // - descriptor is accessor, current is accessor
  328. test24: {
  329. name: "Test: 8.12.9.11 (variation 1): re-define accessor property: current configurable is true: valid case",
  330. body: function () {
  331. var propertyName = "foo24";
  332. var o = {
  333. get foo24() { return this.Value; },
  334. set foo24(arg) { helpers.writeln("old setter"); this.Value = arg; }
  335. };
  336. var newGetter = function() { return 2; };
  337. var newSetter = function(arg) { helpers.writeln("new setter"); }
  338. var pd = { get: newGetter, set: newSetter };
  339. Object.defineProperty(o, propertyName, pd);
  340. var expected = { get: newGetter, set: newSetter, configurable: true, enumerable: true };
  341. assert.areEqual(expected, Object.getOwnPropertyDescriptor(o, propertyName), "wrong value of getOwnPropertyDescriptor");
  342. }
  343. },
  344. test25: {
  345. name: "8.12.9.11.a.i: re-define accessor property: current configurable is false, descriptor specifies setter as different, expect TypeError",
  346. body: function () {
  347. var propertyName = "foo25";
  348. var o = helpers.getDummyObject();
  349. var pd = { set: function(arg) { helpers.writeln("old setter"); this.Value = arg; } };
  350. Object.defineProperty(o, propertyName, pd);
  351. pd = { set: function(arg) { helpers.writeln("new setter"); } };
  352. assert.throws(function() { Object.defineProperty(o, propertyName, pd); }, TypeError);
  353. }
  354. },
  355. test26: {
  356. name: "8.12.9.11.a.ii: re-define accessor property: current configurable is false, descriptor specifies getter as different, expect TypeError",
  357. body: function () {
  358. var propertyName = "foo26";
  359. var o = helpers.getDummyObject();
  360. var pd = { get: function() { return this.Value; }, };
  361. Object.defineProperty(o, propertyName, pd);
  362. pd = { get: function() { helpers.writeln("new getter"); return 2; } };
  363. assert.throws(function() { Object.defineProperty(o, propertyName, pd); }, TypeError);
  364. }
  365. },
  366. test27: {
  367. name: "8.12.9.11 (variation 2): re-define accessor property: current configurable is true and no getter, descriptor specifies getter as undefined, setter as same",
  368. body: function () {
  369. var propertyName = "foo27";
  370. var o = helpers.getDummyObject();
  371. var setter = function(arg) { helpers.writeln("setter") };
  372. var pd = { set: setter };
  373. Object.defineProperty(o, propertyName, pd);
  374. pd = { get: undefined, set: setter };
  375. Object.defineProperty(o, propertyName, pd);
  376. var expected = { get: undefined, set: setter, configurable: false, enumerable: false };
  377. assert.areEqual(expected, Object.getOwnPropertyDescriptor(o, propertyName), "wrong value of getOwnPropertyDescriptor");
  378. }
  379. },
  380. test28: {
  381. name: "Re-define property from data to accessor property. Make sure that setter is called when setting the value.",
  382. body: function () {
  383. // define a data property.
  384. var propertyName = "foo28";
  385. var o = helpers.getDummyObject();
  386. var pd = { value: 1, configurable: true };
  387. Object.defineProperty(o, propertyName, pd);
  388. // re-define the property to be accessor property.
  389. var log = "";
  390. var getter = function() { log += "getter was called."; return this.Value; }
  391. var setter = function(arg) { log += "setter was called."; this.Value = arg; };
  392. pd = { get: getter, set: setter };
  393. Object.defineProperty(o, propertyName, pd);
  394. // set the value and get it.
  395. var newValue = 2;
  396. o[propertyName] = newValue;
  397. var actualValue = o[propertyName];
  398. // validate.
  399. var expected = { get: getter, set: setter, configurable: true, enumerable: false };
  400. assert.areEqual(expected, Object.getOwnPropertyDescriptor(o, propertyName), "wrong value of getOwnPropertyDescriptor");
  401. assert.areEqual("setter was called.getter was called.", log, "wrong log");
  402. assert.areEqual(newValue, actualValue, "wrong value");
  403. }
  404. },
  405. test29: {
  406. name: "Define property 'length' as accessor property on array: check that it throws TypeError.",
  407. body: function () {
  408. assert.throws(
  409. function() { Object.defineProperty([], "length", {configurable: false, get: function() {return 2;}}); },
  410. TypeError);
  411. assert.throws(
  412. function() { Object.defineProperty(Array.prototype, "length", {configurable: false, get: function() {return 2;}}); },
  413. TypeError);
  414. }
  415. },
  416. // Where we are: some tests for specific issues.
  417. test30: {
  418. name: "Define property with getter specified as undefined, then access the property (WOOB bug 1123281)",
  419. body: function () {
  420. var o = helpers.getDummyObject();
  421. var propertyName = "foo30";
  422. var pd = { get: undefined };
  423. Object.defineProperty(o, propertyName, pd);
  424. assert.areEqual(undefined, o[propertyName]);
  425. }
  426. },
  427. test31: {
  428. name: "Define property with setter specified as undefined, then set the property (WOOB bug 1123281)",
  429. body: function () {
  430. var o = helpers.getDummyObject();
  431. var propertyName = "foo31";
  432. var pd = { set: undefined };
  433. Object.defineProperty(o, propertyName, pd);
  434. o[propertyName] = 1; // Make sure this does not throw.
  435. assert.areEqual(undefined, o[propertyName]); // Just in case try to access the property.
  436. }
  437. },
  438. test32: {
  439. name: "Convert data to accessor property with getter specified as undefined, then access the property (WOOB bug 1123281)",
  440. body: function () {
  441. var o = helpers.getDummyObject();
  442. var propertyName = "foo32";
  443. var pd = { configurable: true, value: 0 };
  444. Object.defineProperty(o, propertyName, pd);
  445. pd = { get: undefined };
  446. Object.defineProperty(o, propertyName, pd);
  447. assert.areEqual(undefined, o[propertyName]);
  448. }
  449. },
  450. test33: {
  451. name: "Convert data to accessor property with setter specified as undefined, then set the property (WOOB bug 1123281)",
  452. body: function () {
  453. var o = helpers.getDummyObject();
  454. var propertyName = "foo33";
  455. var pd = { configurable: true, value: 0 };
  456. Object.defineProperty(o, propertyName, pd);
  457. pd = { set: undefined };
  458. Object.defineProperty(o, propertyName, pd);
  459. o[propertyName] = 1; // Make sure this does not throw.
  460. assert.areEqual(undefined, o[propertyName]); // Just in case try to access the property.
  461. }
  462. },
  463. test34: {
  464. name: "Convert accessor to a data property for non-extensible object (WIN8 bug 463559)",
  465. body: function () {
  466. var o = helpers.getDummyObject();
  467. var propertyName = "x";
  468. Object.defineProperty(o, propertyName, {
  469. get: function() { return 0; },
  470. set: function(val) { helpers.writeln("setter was called although it shouldn't"); },
  471. configurable: true
  472. });
  473. Object.preventExtensions(o);
  474. var val = 1;
  475. Object.defineProperty(o, propertyName, { value: val, });
  476. var expected = { value: val, configurable: true, enumerable: false, writable: false };
  477. assert.areEqual(expected, Object.getOwnPropertyDescriptor(o, propertyName), "wrong value of getOwnPropertyDescriptor");
  478. assert.areEqual(val, o[propertyName], "the property value is wrong");
  479. assert.areEqual(false, Object.isExtensible(o), "isExtensible() changed");
  480. }
  481. },
  482. // Note: this test irreversibly changes the dummy object (that's important when dummy object is document/window),
  483. // it should in the very end.
  484. test_last_01: {
  485. name: "8.12.9.3: define property for non-extensible object, check that it throws TypeError",
  486. body: function () {
  487. var o = helpers.getDummyObject();
  488. Object.preventExtensions(o);
  489. var propertyName = "foo01";
  490. var pd = {};
  491. assert.throws(function() { Object.defineProperty(o, propertyName, pd); }, TypeError);
  492. }
  493. }
  494. }; // tests.
  495. testRunner.runTests(tests);