js/src/tests/ecma_5/misc/function-definition-evaluate.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 // |reftest| skip-if(!xulRuntime.shell) -- needs evaluate()
     2 /*
     3  * Any copyright is dedicated to the Public Domain.
     4  * http://creativecommons.org/licenses/publicdomain/
     5  */
     7 //-----------------------------------------------------------------------------
     8 var BUGNUMBER = 577325;
     9 var summary = 'Implement the ES5 algorithm for processing function statements';
    11 print(BUGNUMBER + ": " + summary);
    13 /**************
    14  * BEGIN TEST *
    15  **************/
    17 var outer, desc;
    19 ///////////////////////////////////////////////////
    20 // Function definitions over accessor properties //
    21 ///////////////////////////////////////////////////
    23 var getCalled, setCalled;
    25 // configurable properties get blown away
    27 getCalled = false, setCalled = false;
    28 Object.defineProperty(this, "acc1",
    29                       {
    30                         get: function() { getCalled = true; throw "FAIL get 1"; },
    31                         set: function(v) { setCalled = true; throw "FAIL set 1 " + v; },
    32                         configurable: true,
    33                         enumerable: false
    34                       });
    36 // does not throw
    37 outer = undefined;
    38 evaluate("function acc1() { throw 'FAIL redefined 1'; } outer = acc1;");
    39 assertEq(getCalled, false);
    40 assertEq(setCalled, false);
    41 assertEq(typeof acc1, "function");
    42 assertEq(acc1, outer);
    43 desc = Object.getOwnPropertyDescriptor(this, "acc1");
    44 assertEq(desc.value, acc1);
    45 assertEq(desc.writable, true);
    46 assertEq(desc.enumerable, true);
    47 assertEq(desc.configurable, false);
    50 getCalled = false, setCalled = false;
    51 Object.defineProperty(this, "acc2",
    52                       {
    53                         get: function() { getCalled = true; throw "FAIL get 2"; },
    54                         set: function(v) { setCalled = true; throw "FAIL set 2 " + v; },
    55                         configurable: true,
    56                         enumerable: true
    57                       });
    59 // does not throw
    60 outer = undefined;
    61 evaluate("function acc2() { throw 'FAIL redefined 2'; } outer = acc2;");
    62 assertEq(getCalled, false);
    63 assertEq(setCalled, false);
    64 assertEq(typeof acc2, "function");
    65 assertEq(acc2, outer);
    66 desc = Object.getOwnPropertyDescriptor(this, "acc2");
    67 assertEq(desc.value, acc2);
    68 assertEq(desc.writable, true);
    69 assertEq(desc.enumerable, true);
    70 assertEq(desc.configurable, false);
    73 // non-configurable properties produce a TypeError
    75 getCalled = false, setCalled = false;
    76 Object.defineProperty(this, "acc3",
    77                       {
    78                         get: function() { getCalled = true; throw "FAIL get 3"; },
    79                         set: function(v) { setCalled = true; throw "FAIL set 3 " + v; },
    80                         configurable: false,
    81                         enumerable: true
    82                       });
    84 outer = undefined;
    85 try
    86 {
    87   evaluate("function acc3() { throw 'FAIL redefined 3'; }; outer = acc3");
    88   throw new Error("should have thrown trying to redefine global function " +
    89                   "over a non-configurable, enumerable accessor");
    90 }
    91 catch (e)
    92 {
    93   assertEq(e instanceof TypeError, true,
    94            "global function definition, when that function would overwrite " +
    95            "a non-configurable, enumerable accessor, must throw a TypeError " +
    96            "per ES5+errata: " + e);
    97   desc = Object.getOwnPropertyDescriptor(this, "acc3");
    98   assertEq(typeof desc.get, "function");
    99   assertEq(typeof desc.set, "function");
   100   assertEq(desc.enumerable, true);
   101   assertEq(desc.configurable, false);
   102   assertEq(outer, undefined);
   103   assertEq(getCalled, false);
   104   assertEq(setCalled, false);
   105 }
   108 getCalled = false, setCalled = false;
   109 Object.defineProperty(this, "acc4",
   110                       {
   111                         get: function() { getCalled = true; throw "FAIL get 4"; },
   112                         set: function(v) { setCalled = true; throw "FAIL set 4 " + v; },
   113                         configurable: false,
   114                         enumerable: false
   115                       });
   117 outer = undefined;
   118 try
   119 {
   120   evaluate("function acc4() { throw 'FAIL redefined 4'; }; outer = acc4");
   121   throw new Error("should have thrown trying to redefine global function " +
   122                   "over a non-configurable, non-enumerable accessor");
   123 }
   124 catch (e)
   125 {
   126   assertEq(e instanceof TypeError, true,
   127            "global function definition, when that function would overwrite " +
   128            "a non-configurable, non-enumerable accessor, must throw a " +
   129            "TypeError per ES5+errata: " + e);
   130   desc = Object.getOwnPropertyDescriptor(this, "acc4");
   131   assertEq(typeof desc.get, "function");
   132   assertEq(typeof desc.set, "function");
   133   assertEq(desc.enumerable, false);
   134   assertEq(desc.configurable, false);
   135   assertEq(outer, undefined);
   136   assertEq(getCalled, false);
   137   assertEq(setCalled, false);
   138 }
   141 ///////////////////////////////////////////////
   142 // Function definitions over data properties //
   143 ///////////////////////////////////////////////
   146 // configurable properties, regardless of other attributes, get blown away
   148 Object.defineProperty(this, "data1",
   149                       {
   150                         configurable: true,
   151                         enumerable: true,
   152                         writable: true,
   153                         value: "data1"
   154                       });
   156 outer = undefined;
   157 evaluate("function data1() { return 'data1 function'; } outer = data1;");
   158 assertEq(typeof data1, "function");
   159 assertEq(data1, outer);
   160 desc = Object.getOwnPropertyDescriptor(this, "data1");
   161 assertEq(desc.configurable, false);
   162 assertEq(desc.enumerable, true);
   163 assertEq(desc.writable, true);
   164 assertEq(desc.value, data1);
   167 Object.defineProperty(this, "data2",
   168                       {
   169                         configurable: true,
   170                         enumerable: true,
   171                         writable: false,
   172                         value: "data2"
   173                       });
   175 outer = undefined;
   176 evaluate("function data2() { return 'data2 function'; } outer = data2;");
   177 assertEq(typeof data2, "function");
   178 assertEq(data2, outer);
   179 desc = Object.getOwnPropertyDescriptor(this, "data2");
   180 assertEq(desc.configurable, false);
   181 assertEq(desc.enumerable, true);
   182 assertEq(desc.writable, true);
   183 assertEq(desc.value, data2);
   186 Object.defineProperty(this, "data3",
   187                       {
   188                         configurable: true,
   189                         enumerable: false,
   190                         writable: true,
   191                         value: "data3"
   192                       });
   194 outer = undefined;
   195 evaluate("function data3() { return 'data3 function'; } outer = data3;");
   196 assertEq(typeof data3, "function");
   197 assertEq(data3, outer);
   198 desc = Object.getOwnPropertyDescriptor(this, "data3");
   199 assertEq(desc.configurable, false);
   200 assertEq(desc.enumerable, true);
   201 assertEq(desc.writable, true);
   202 assertEq(desc.value, data3);
   205 Object.defineProperty(this, "data4",
   206                       {
   207                         configurable: true,
   208                         enumerable: false,
   209                         writable: false,
   210                         value: "data4"
   211                       });
   213 outer = undefined;
   214 evaluate("function data4() { return 'data4 function'; } outer = data4;");
   215 assertEq(typeof data4, "function");
   216 assertEq(data4, outer);
   217 desc = Object.getOwnPropertyDescriptor(this, "data4");
   218 assertEq(desc.value, data4);
   219 assertEq(desc.writable, true);
   220 assertEq(desc.enumerable, true);
   221 assertEq(desc.configurable, false);
   224 // non-configurable data properties are trickier
   226 Object.defineProperty(this, "data5",
   227                       {
   228                         configurable: false,
   229                         enumerable: true,
   230                         writable: true,
   231                         value: "data5"
   232                       });
   234 outer = undefined;
   235 evaluate("function data5() { return 'data5 function'; } outer = data5;");
   236 assertEq(typeof data5, "function");
   237 assertEq(data5, outer);
   238 desc = Object.getOwnPropertyDescriptor(this, "data5");
   239 assertEq(desc.configurable, false);
   240 assertEq(desc.enumerable, true);
   241 assertEq(desc.writable, true);
   242 assertEq(desc.value, data5);
   245 Object.defineProperty(this, "data6",
   246                       {
   247                         configurable: false,
   248                         enumerable: true,
   249                         writable: false,
   250                         value: "data6"
   251                       });
   253 outer = undefined;
   254 try
   255 {
   256   evaluate("function data6() { return 'data6 function'; } outer = data6;");
   257   throw new Error("should have thrown trying to redefine global function " +
   258                   "over a non-configurable, enumerable, non-writable accessor");
   259 }
   260 catch (e)
   261 {
   262   assertEq(e instanceof TypeError, true,
   263            "global function definition, when that function would overwrite " +
   264            "a non-configurable, enumerable, non-writable data property, must " +
   265            "throw a TypeError per ES5+errata: " + e);
   266   assertEq(data6, "data6");
   267   assertEq(outer, undefined);
   268   desc = Object.getOwnPropertyDescriptor(this, "data6");
   269   assertEq(desc.configurable, false);
   270   assertEq(desc.enumerable, true);
   271   assertEq(desc.writable, false);
   272   assertEq(desc.value, "data6");
   273 }
   276 Object.defineProperty(this, "data7",
   277                       {
   278                         configurable: false,
   279                         enumerable: false,
   280                         writable: true,
   281                         value: "data7"
   282                       });
   284 outer = undefined;
   285 try
   286 {
   287   evaluate("function data7() { return 'data7 function'; } outer = data7;");
   288   throw new Error("should have thrown trying to redefine global function " +
   289                   "over a non-configurable, non-enumerable, writable data" +
   290                   "property");
   291 }
   292 catch (e)
   293 {
   294   assertEq(e instanceof TypeError, true,
   295            "global function definition, when that function would overwrite " +
   296            "a non-configurable, non-enumerable, writable data property, must " +
   297            "throw a TypeError per ES5+errata: " + e);
   298   assertEq(data7, "data7");
   299   assertEq(outer, undefined);
   300   desc = Object.getOwnPropertyDescriptor(this, "data7");
   301   assertEq(desc.configurable, false);
   302   assertEq(desc.enumerable, false);
   303   assertEq(desc.writable, true);
   304   assertEq(desc.value, "data7");
   305 }
   308 Object.defineProperty(this, "data8",
   309                       {
   310                         configurable: false,
   311                         enumerable: false,
   312                         writable: false,
   313                         value: "data8"
   314                       });
   316 outer = undefined;
   317 try
   318 {
   319   evaluate("function data8() { return 'data8 function'; } outer = data8;");
   320   throw new Error("should have thrown trying to redefine global function " +
   321                   "over a non-configurable, non-enumerable, non-writable data" +
   322                   "property");
   323 }
   324 catch (e)
   325 {
   326   assertEq(e instanceof TypeError, true,
   327            "global function definition, when that function would overwrite " +
   328            "a non-configurable, non-enumerable, non-writable data property, " +
   329            "must throw a TypeError per ES5+errata: " + e);
   330   assertEq(data8, "data8");
   331   assertEq(outer, undefined);
   332   desc = Object.getOwnPropertyDescriptor(this, "data8");
   333   assertEq(desc.configurable, false);
   334   assertEq(desc.enumerable, false);
   335   assertEq(desc.writable, false);
   336   assertEq(desc.value, "data8");
   337 }
   339 /******************************************************************************/
   341 if (typeof reportCompare === "function")
   342   reportCompare(true, true);
   344 print("All tests passed!");

mercurial