| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486 |
- //-------------------------------------------------------------------------------------------------------
- // Copyright (C) Microsoft. All rights reserved.
- // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
- //-------------------------------------------------------------------------------------------------------
- var echo = WScript.Echo;
- function guarded_call(func) {
- try {
- func();
- } catch (e) {
- echo(e.name + " : " + e.message);
- }
- }
- var testCount = 0;
- function scenario(title, func) {
- if (testCount > 0) {
- echo("\n");
- }
- echo((testCount++) + ".", title);
- guarded_call(func);
- }
- function dumpProp(obj, name) {
- var desc = Object.getOwnPropertyDescriptor(obj, name);
- var s = " " + name + ": " + obj[name];
- if (desc) {
- if (desc.enumerable) { s += " enumerable"; }
- if (desc.configurable) { s += " configurable"; }
- if (desc.writable) { s += " writable"; }
- if (desc.getter) { s += " getter"; }
- if (desc.setter) { s += " setter"; }
- }
- echo(s);
- }
- scenario("[[Value]] absent, set enumerable: true", function () {
- var o = [];
- guarded_call(function () {
- Object.defineProperty(o, "length", { enumerable: true });
- });
- dumpProp(o, "length");
- });
- scenario("[[Value]] absent, set configurable: true", function () {
- var o = [];
- guarded_call(function () {
- Object.defineProperty(o, "length", { configurable: true });
- });
- dumpProp(o, "length");
- });
- scenario("[[Value]] absent, empty descriptor", function () {
- var o = [];
- Object.defineProperty(o, "length", {});
- dumpProp(o, "length");
- });
- scenario("[[Value]] absent, no change", function () {
- var o = [];
- Object.defineProperty(o, "length", { enumerable: false, configurable: false });
- dumpProp(o, "length");
- });
- scenario("[[Value]] absent, set writable: true", function () {
- var o = [];
- Object.defineProperty(o, "length", { writable: true });
- dumpProp(o, "length");
- o.length = 10;
- echo(" length:", o.length);
- });
- scenario("[[Value]] absent, set writable: false", function () {
- var o = [];
- Object.defineProperty(o, "length", { writable: false });
- dumpProp(o, "length");
- o.length = 10;
- echo(" length:", o.length);
- });
- scenario("[[Value]] absent, set multiple -- configurable: false, writable: false", function () {
- var o = [];
- guarded_call(function () {
- Object.defineProperty(o, "length", { configurable: false, writable: false });
- });
- dumpProp(o, "length");
- });
- scenario("[[Value]] absent, set multiple -- enumerable: false, writable: false", function () {
- var o = [];
- guarded_call(function () {
- Object.defineProperty(o, "length", { enumerable: false, writable: false });
- });
- dumpProp(o, "length");
- });
- scenario("[[Value]] invalid 1", function () {
- var o = [0, 1, 2];
- guarded_call(function () {
- Object.defineProperty(o, "length", { value: Infinity });
- });
- dumpProp(o, "length");
- echo(" ", o);
- });
- scenario("[[Value]] invalid 2", function () {
- var o = [0, 1, 2];
- guarded_call(function () {
- Object.defineProperty(o, "length", { value: -3 });
- });
- dumpProp(o, "length");
- echo(" ", o);
- });
- scenario("newLen >= oldLen, set enumerable: true", function () {
- var o = [0, 1, 2];
- guarded_call(function () {
- Object.defineProperty(o, "length", { value: 5, enumerable: true });
- });
- dumpProp(o, "length");
- echo(" ", o);
- });
- scenario("newLen >= oldLen, set enumerable: false", function () {
- var o = [0, 1, 2];
- Object.defineProperty(o, "length", { value: 5, enumerable: false });
- dumpProp(o, "length");
- echo(" ", o);
- });
- scenario("newLen >= oldLen, set configurable: true", function () {
- var o = [0, 1, 2];
- guarded_call(function () {
- Object.defineProperty(o, "length", { value: 5, configurable: true });
- });
- dumpProp(o, "length");
- echo(" ", o);
- });
- scenario("newLen >= oldLen, set configurable: false", function () {
- var o = [0, 1, 2];
- Object.defineProperty(o, "length", { value: 5, configurable: false });
- dumpProp(o, "length");
- echo(" ", o);
- });
- scenario("newLen >= oldLen, set configurable: false, enumerable: false", function () {
- var o = [0, 1, 2];
- Object.defineProperty(o, "length", { value: 5, configurable: false, enumerable: false });
- dumpProp(o, "length");
- echo(" ", o);
- });
- scenario("newLen >= oldLen, set configurable: false, enumerable: true", function () {
- var o = [0, 1, 2];
- Object.defineProperty(o, "length", { value: 5, configurable: false, enumerable: true });
- dumpProp(o, "length");
- echo(" ", o);
- });
- scenario("newLen >= oldLen, set writable: true", function () {
- var o = [0, 1, 2];
- Object.defineProperty(o, "length", { value: 5, writable: true });
- dumpProp(o, "length");
- echo(" ", o);
- o.length = 10;
- echo(" ", o);
- });
- scenario("newLen >= oldLen, set writable: false", function () {
- var o = [0, 1, 2];
- Object.defineProperty(o, "length", { value: 5, writable: false });
- dumpProp(o, "length");
- echo(" ", o);
- o.length = 10;
- echo(" ", o);
- });
- scenario("newLen < oldLen, oldLen writable: false", function () {
- var o = [0, 1, 2];
- Object.defineProperty(o, "length", { writable: false });
- guarded_call(function () {
- Object.defineProperty(o, "length", { value: 2, writable: true });
- });
- dumpProp(o, "length");
- echo(" ", o);
- o.length = 10;
- echo(" ", o);
- });
- scenario("newLen < oldLen, set enumerable: true", function () {
- var o = [0, 1, 2];
- guarded_call(function () {
- Object.defineProperty(o, "length", { value: 2, enumerable: true });
- });
- dumpProp(o, "length");
- echo(" ", o);
- });
- scenario("newLen < oldLen, set configurable: true", function () {
- var o = [0, 1, 2];
- guarded_call(function () {
- Object.defineProperty(o, "length", { value: 2, configurable: true });
- });
- dumpProp(o, "length");
- echo(" ", o);
- });
- scenario("newLen < oldLen, set writable: true", function () {
- var o = [0, 1, 2];
- Object.defineProperty(o, "length", { value: 2, writable: true });
- dumpProp(o, "length");
- echo(" ", o);
- o.length = 10;
- echo(" ", o);
- });
- scenario("newLen < oldLen, set writable: false", function () {
- var o = [0, 1, 2];
- Object.defineProperty(o, "length", { value: 2, writable: false });
- dumpProp(o, "length");
- echo(" ", o);
- o.length = 10;
- echo(" ", o);
- });
- scenario("newLen < oldLen, set writable: true, an element can't delete", function () {
- var o = [0, 1, 2, 3, 4, 5];
- Object.defineProperty(o, 3, { configurable: false });
- dumpProp(o, 3);
- guarded_call(function () {
- Object.defineProperty(o, "length", { value: 2, writable: true });
- });
- dumpProp(o, "length");
- echo(" ", o);
- });
- scenario("newLen < oldLen, set writable: false, an element can't delete", function () {
- var o = [0, 1, 2, 3, 4, 5];
- Object.defineProperty(o, 3, { configurable: false });
- dumpProp(o, 3);
- guarded_call(function () {
- Object.defineProperty(o, "length", { value: 2, writable: false });
- });
- dumpProp(o, "length");
- echo(" ", o);
- });
- scenario("newLen < oldLen, an accessor can't delete", function () {
- var o = [0, 1, 2, 3, 4, 5];
- Object.defineProperty(o, 3, { get: function(){ return "get 3"}, configurable: false });
- dumpProp(o, 3);
- guarded_call(function () {
- Object.defineProperty(o, "length", { value: 2, writable: false });
- });
- dumpProp(o, "length");
- echo(" ", o);
- });
- scenario("newLen < oldLen, an element can't delete, newLen == it", function () {
- var o = [0, 1, 2, 3, 4, 5];
- Object.defineProperty(o, 3, { configurable: false });
- dumpProp(o, 3);
- guarded_call(function () {
- Object.defineProperty(o, "length", { value: 3, writable: false });
- });
- dumpProp(o, "length");
- echo(" ", o);
- });
- scenario("newLen < oldLen, an element can't delete, but newLen beyond it", function () {
- var o = [0, 1, 2, 3, 4, 5];
- Object.defineProperty(o, 3, { configurable: false });
- dumpProp(o, 3);
- Object.defineProperty(o, "length", { value: 4, writable: false });
- dumpProp(o, "length");
- echo(" ", o);
- });
- scenario("newLen < oldLen, many attributes", function () {
- var o = [];
- for (var i = 0; i < 10; i++) {
- if (i % 2) {
- Object.defineProperty(o, i, { value: i, configurable: true });
- } else {
- var getValue = "get" + i;
- Object.defineProperty(o, i, { get: function () { return getValue; }, configurable: true });
- }
- dumpProp(o, i);
- }
- echo(" ", o);
- Object.defineProperty(o, "length", { value: 4, writable: false });
- dumpProp(o, "length");
- echo(" ", o);
- for (var i = 0; i < 10; i++) {
- dumpProp(o, i);
- }
- });
- scenario("newLen < oldLen, many attributes, one cannot delete", function () {
- var o = [];
- for (var i = 0; i < 10; i++) {
- if (i % 2) {
- var b = (i !== 5);
- Object.defineProperty(o, i, { value: i, configurable: b });
- } else {
- var getValue = "get" + i;
- Object.defineProperty(o, i, { get: function () { return getValue; }, configurable: true });
- }
- dumpProp(o, i);
- }
- echo(" ", o);
- guarded_call(function () {
- Object.defineProperty(o, "length", { value: 4, writable: false });
- });
- dumpProp(o, "length");
- echo(" ", o);
- for (var i = 0; i < 10; i++) {
- dumpProp(o, i);
- }
- });
- scenario("newLen < oldLen, many attributes, data item cannot delete", function () {
- var o = [];
- for (var i = 0; i < 10; i++) {
- if (i % 2) {
- Object.defineProperty(o, i, { value: i, configurable: true });
- } else {
- var getValue = "get" + i;
- Object.defineProperty(o, i, { get: function () { return getValue; }, configurable: true });
- }
- }
- // append some data item not in attribute map
- for (var i = 10; i < 15; i++) {
- o[i] = i;
- }
- Object.seal(o);
- echo(" ", o);
- guarded_call(function () {
- Object.defineProperty(o, "length", { value: 4, writable: false });
- });
- dumpProp(o, "length");
- echo(" ", o);
- });
- scenario("newLen < oldLen, a few attributes, one cannot delete", function () {
- var o = [];
- for (var i = 0; i < 10; i++) {
- if (i % 5) {
- o[i] = i;
- } else {
- Object.defineProperty(o, i, { value: i, configurable: false });
- }
- }
- echo(" ", o);
- guarded_call(function () {
- Object.defineProperty(o, "length", { value: 3, writable: false });
- });
- dumpProp(o, "length");
- echo(" ", o);
- });
- scenario("newLen < oldLen, no attributes, data item cannot delete", function () {
- var o = [];
- for (var i = 0; i < 10; i++) {
- o[i] = i;
- }
- Object.seal(o);
- echo(" ", o);
- guarded_call(function () {
- Object.defineProperty(o, "length", { value: 3, writable: false });
- });
- dumpProp(o, "length");
- echo(" ", o);
- });
- scenario("[[Put]] length: newLen < oldLen, many attributes", function () {
- var o = [];
- for (var i = 0; i < 10; i++) {
- if (i % 2) {
- Object.defineProperty(o, i, { value: i, configurable: true });
- } else {
- var getValue = "get" + i;
- Object.defineProperty(o, i, { get: function () { return getValue; }, configurable: true });
- }
- dumpProp(o, i);
- }
- echo(" ", o);
- o.length = 4;
- dumpProp(o, "length");
- echo(" ", o);
- for (var i = 0; i < 10; i++) {
- dumpProp(o, i);
- }
- });
- scenario("[[Put]] length: newLen < oldLen, many attributes, one cannot delete", function () {
- var o = [];
- for (var i = 0; i < 10; i++) {
- if (i % 2) {
- var b = (i !== 5);
- Object.defineProperty(o, i, { value: i, configurable: b });
- } else {
- var getValue = "get" + i;
- Object.defineProperty(o, i, { get: function () { return getValue; }, configurable: true });
- }
- dumpProp(o, i);
- }
- echo(" ", o);
- o.length = 4; // This would throw in strict mode
- dumpProp(o, "length");
- echo(" ", o);
- for (var i = 0; i < 10; i++) {
- dumpProp(o, i);
- }
- });
- scenario("Add item beyond non-writable length", function () {
- var o = [0, 1, 2, 3, 4, 5];
- Object.defineProperty(o, "length", { writable: false });
- guarded_call(function () {
- Object.defineProperty(o, 9, { value: 9, enumerable: true, configurable: true, writable: false });
- });
- echo(" ", o);
- });
- scenario("Add accessor beyond non-writable length", function () {
- var o = [0, 1, 2, 3, 4, 5];
- Object.defineProperty(o, "length", { writable: false });
- guarded_call(function () {
- Object.defineProperty(o, 9, { get: function () { return "get9"; }, configurable: true });
- });
- echo(" ", o);
- });
- scenario("SetItem beyond non-writable length", function () {
- var o = [0, 1, 2, 3, 4, 5];
- Object.defineProperty(o, "length", { writable: false });
- o[9] = 9; // This would throw in strict mode
- echo(" ", o);
- });
- scenario("SetItem with name beyond non-writable length", function () {
- var o = [0, 1, 2, 3, 4, 5];
- Object.defineProperty(o, "length", { writable: false });
- var name = "9";
- o[name] = 9; // This would throw in strict mode
- echo(" ", o);
- });
- scenario("freeze should set length writable: false", function () {
- var o = [0, 1, 2, 3, 4, 5];
- Object.freeze(o);
- dumpProp(o, "length");
- });
- scenario("isFrozen should check length writable", function () {
- var o = [0, 1, 2, 3, 4, 5];
- for (var i = 0; i < o.length; i++) {
- Object.defineProperty(o, i, { writable: false, configurable: false });
- }
- Object.preventExtensions(o);
- echo("isFrozen:", Object.isFrozen(o)); // false, because length writable
- Object.defineProperty(o, "length", { writable: false });
- echo("isFrozen:", Object.isFrozen(o));
- });
|