js/src/tests/ecma_5/extensions/es5ish-defineGetter-defineSetter.js

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 // Any copyright is dedicated to the Public Domain.
     2 // http://creativecommons.org/licenses/publicdomain/
     4 //-----------------------------------------------------------------------------
     5 var BUGNUMBER = 715821;
     6 var summary = "Implement __define[GS]etter__ using Object.defineProperty";
     8 print(BUGNUMBER + ": " + summary);
    10 /*************
    11  * UTILITIES *
    12  *************/
    14 function s(desc)
    15 {
    16   if (typeof desc === "undefined")
    17     return "<undefined>";
    18   assertEq(typeof desc, "object");
    19   assertEq(desc !== null, true);
    21   var str = "<enumerable: <" + desc.enumerable + ">, " +
    22             " configurable: <" + desc.configurable + ">,";
    24   if (desc.hasOwnProperty("value"))
    25   {
    26     return str +
    27            " value: <" + desc.value + ">," +
    28            " writable: <" + desc.writable + ">>";
    29   }
    31   return str +
    32          " get: <" + desc.get + ">," +
    33          " set: <" + desc.set + ">>";
    34 }
    36 function checkField(field, desc, expected)
    37 {
    38   var present = desc.hasOwnProperty(field);
    39   assertEq(present, expected.hasOwnProperty(field),
    40            field + " presence mismatch (got " + s(desc) + ", expected " + s(expected) + ")");
    41   if (present)
    42   {
    43     assertEq(desc[field], expected[field],
    44              field + " value mismatch (got " + s(desc) + ", expected " + s(expected) + ")");
    45   }
    46 }
    48 function check(obj, prop, expected)
    49 {
    50   var desc = Object.getOwnPropertyDescriptor(obj, prop);
    51   assertEq(typeof desc, typeof expected,
    52            "type mismatch (got " + s(desc) + ", expected " + s(expected) + ")");
    54   assertEq(desc.hasOwnProperty("get"), desc.hasOwnProperty("set"),
    55            "bad descriptor: " + s(desc));
    56   assertEq(desc.hasOwnProperty("value"), desc.hasOwnProperty("writable"),
    57            "bad descriptor: " + s(desc));
    59   assertEq(desc.hasOwnProperty("get"), !desc.hasOwnProperty("value"),
    60            "bad descriptor: " + s(desc));
    62   checkField("get", desc, expected);
    63   checkField("set", desc, expected);
    64   checkField("value", desc, expected);
    65   checkField("writable", desc, expected);
    66   checkField("enumerable", desc, expected);
    67   checkField("configurable", desc, expected);
    68 }
    70 function expectTypeError(f)
    71 {
    72   try
    73   {
    74     f();
    75     throw new Error("no error thrown");
    76   }
    77   catch (e)
    78   {
    79     assertEq(e instanceof TypeError, true,
    80              "wrong error thrown: got " + e + ", not a TypeError");
    81   }
    82 }
    84 /**************
    85  * BEGIN TEST *
    86  **************/
    88 // Adding a new getter, overwriting an existing one
    90 function g1() { }
    91 var gobj = {};
    92 gobj.__defineGetter__("foo", g1);
    93 check(gobj, "foo", { get: g1, set: undefined, enumerable: true, configurable: true });
    95 function g2() { }
    96 gobj.__defineGetter__("foo", g2);
    97 check(gobj, "foo", { get: g2, set: undefined, enumerable: true, configurable: true });
    99 /******************************************************************************/
   101 // Adding a new setter, overwriting an existing one
   103 function s1() { }
   104 var sobj = {};
   105 sobj.__defineSetter__("bar", s1);
   106 check(sobj, "bar", { get: undefined, set: s1, enumerable: true, configurable: true });
   108 function s2() { }
   109 sobj.__defineSetter__("bar", s2);
   110 check(sobj, "bar", { get: undefined, set: s2, enumerable: true, configurable: true });
   112 /******************************************************************************/
   114 // Adding a new getter, then adding a setter
   115 // Changing an existing accessor's enumerability, then "null"-changing the accessor
   116 // Changing an accessor's configurability, then "null"-changing and real-changing the accessor
   118 function g3() { }
   119 var gsobj = {};
   120 gsobj.__defineGetter__("baz", g3);
   121 check(gsobj, "baz", { get: g3, set: undefined, enumerable: true, configurable: true });
   123 function s3() { }
   124 gsobj.__defineSetter__("baz", s3);
   125 check(gsobj, "baz", { get: g3, set: s3, enumerable: true, configurable: true });
   127 Object.defineProperty(gsobj, "baz", { enumerable: false });
   128 check(gsobj, "baz", { get: g3, set: s3, enumerable: false, configurable: true });
   130 gsobj.__defineGetter__("baz", g3);
   131 check(gsobj, "baz", { get: g3, set: s3, enumerable: true, configurable: true });
   133 Object.defineProperty(gsobj, "baz", { enumerable: false });
   134 check(gsobj, "baz", { get: g3, set: s3, enumerable: false, configurable: true });
   136 gsobj.__defineSetter__("baz", s3);
   137 check(gsobj, "baz", { get: g3, set: s3, enumerable: true, configurable: true });
   139 Object.defineProperty(gsobj, "baz", { configurable: false });
   140 expectTypeError(function() { gsobj.__defineSetter__("baz", s2); });
   141 expectTypeError(function() { gsobj.__defineSetter__("baz", s3); });
   142 check(gsobj, "baz", { get: g3, set: s3, enumerable: true, configurable: false });
   144 /******************************************************************************/
   146 // Adding a new setter, then adding a getter
   147 // Changing an existing accessor's enumerability, then "null"-changing the accessor
   148 // Changing an accessor's configurability, then "null"-changing and real-changing the accessor
   150 function s4() { }
   151 var sgobj = {};
   152 sgobj.__defineSetter__("baz", s4);
   153 check(sgobj, "baz", { get: undefined, set: s4, enumerable: true, configurable: true });
   155 function g4() { }
   156 sgobj.__defineGetter__("baz", g4);
   157 check(sgobj, "baz", { get: g4, set: s4, enumerable: true, configurable: true });
   159 Object.defineProperty(sgobj, "baz", { enumerable: false });
   160 check(sgobj, "baz", { get: g4, set: s4, enumerable: false, configurable: true });
   162 sgobj.__defineSetter__("baz", s4);
   163 check(sgobj, "baz", { get: g4, set: s4, enumerable: true, configurable: true });
   165 Object.defineProperty(sgobj, "baz", { enumerable: false });
   166 check(sgobj, "baz", { get: g4, set: s4, enumerable: false, configurable: true });
   168 sgobj.__defineSetter__("baz", s4);
   169 check(sgobj, "baz", { get: g4, set: s4, enumerable: true, configurable: true });
   171 Object.defineProperty(sgobj, "baz", { configurable: false });
   172 expectTypeError(function() { sgobj.__defineGetter__("baz", g3); });
   173 expectTypeError(function() { sgobj.__defineSetter__("baz", s4); });
   174 check(sgobj, "baz", { get: g4, set: s4, enumerable: true, configurable: false });
   176 /******************************************************************************/
   178 // Adding a getter over a writable data property
   180 function g5() { }
   181 var gover = { quux: 17 };
   182 check(gover, "quux", { value: 17, writable: true, enumerable: true, configurable: true });
   184 gover.__defineGetter__("quux", g5);
   185 check(gover, "quux", { get: g5, set: undefined, enumerable: true, configurable: true });
   187 /******************************************************************************/
   189 // Adding a setter over a writable data property
   191 function s5() { }
   192 var sover = { quux: 17 };
   193 check(sover, "quux", { value: 17, writable: true, enumerable: true, configurable: true });
   195 sover.__defineSetter__("quux", s5);
   196 check(sover, "quux", { get: undefined, set: s5, enumerable: true, configurable: true });
   198 /******************************************************************************/
   200 // Adding a getter over a non-writable data property
   202 function g6() { }
   203 var gnover = { eit: 17 };
   204 check(gnover, "eit", { value: 17, writable: true, enumerable: true, configurable: true });
   205 Object.defineProperty(gnover, "eit", { writable: false });
   206 check(gnover, "eit", { value: 17, writable: false, enumerable: true, configurable: true });
   208 gnover.__defineGetter__("eit", g6);
   209 check(gnover, "eit", { get: g6, set: undefined, enumerable: true, configurable: true });
   211 /******************************************************************************/
   213 // Adding a setter over a non-writable data property
   215 function s6() { }
   216 var snover = { eit: 17 };
   217 check(snover, "eit", { value: 17, writable: true, enumerable: true, configurable: true });
   218 Object.defineProperty(snover, "eit", { writable: false });
   219 check(snover, "eit", { value: 17, writable: false, enumerable: true, configurable: true });
   221 snover.__defineSetter__("eit", s6);
   222 check(snover, "eit", { get: undefined, set: s6, enumerable: true, configurable: true });
   224 /******************************************************************************/
   226 // Adding a getter over a non-configurable, writable data property
   228 function g7() { }
   229 var gncover = { moo: 17 };
   230 check(gncover, "moo", { value: 17, writable: true, enumerable: true, configurable: true });
   231 Object.defineProperty(gncover, "moo", { configurable: false });
   232 check(gncover, "moo", { value: 17, writable: true, enumerable: true, configurable: false });
   234 expectTypeError(function() { gncover.__defineGetter__("moo", g7); });
   235 check(gncover, "moo", { value: 17, writable: true, enumerable: true, configurable: false });
   237 /******************************************************************************/
   239 // Adding a setter over a non-configurable, writable data property
   241 function s7() { }
   242 var sncover = { moo: 17 };
   243 check(sncover, "moo", { value: 17, writable: true, enumerable: true, configurable: true });
   244 Object.defineProperty(sncover, "moo", { configurable: false });
   245 check(sncover, "moo", { value: 17, writable: true, enumerable: true, configurable: false });
   247 expectTypeError(function() { sncover.__defineSetter__("moo", s7); });
   248 check(sncover, "moo", { value: 17, writable: true, enumerable: true, configurable: false });
   250 /******************************************************************************/
   252 // Adding a getter over a non-configurable, non-writable data property
   254 function g8() { }
   255 var gncwover = { fwoosh: 17 };
   256 check(gncwover, "fwoosh", { value: 17, writable: true, enumerable: true, configurable: true });
   257 Object.defineProperty(gncwover, "fwoosh", { writable: false, configurable: false });
   258 check(gncwover, "fwoosh", { value: 17, writable: false, enumerable: true, configurable: false });
   260 expectTypeError(function() { gncwover.__defineGetter__("fwoosh", g7); });
   261 check(gncwover, "fwoosh", { value: 17, writable: false, enumerable: true, configurable: false });
   263 /******************************************************************************/
   265 // Adding a setter over a non-configurable, non-writable data property
   267 function s8() { }
   268 var sncwover = { fwoosh: 17 };
   269 check(sncwover, "fwoosh", { value: 17, writable: true, enumerable: true, configurable: true });
   270 Object.defineProperty(sncwover, "fwoosh", { writable: false, configurable: false });
   271 check(sncwover, "fwoosh", { value: 17, writable: false, enumerable: true, configurable: false });
   273 expectTypeError(function() { sncwover.__defineSetter__("fwoosh", s7); });
   274 check(sncwover, "fwoosh", { value: 17, writable: false, enumerable: true, configurable: false });
   276 /******************************************************************************/
   278 if (typeof reportCompare === "function")
   279   reportCompare(true, true);
   281 print("Tests complete");

mercurial