js/src/tests/ecma_5/misc/function-definition-eval.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/js/src/tests/ecma_5/misc/function-definition-eval.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,343 @@
     1.4 +/*
     1.5 + * Any copyright is dedicated to the Public Domain.
     1.6 + * http://creativecommons.org/licenses/publicdomain/
     1.7 + */
     1.8 +
     1.9 +//-----------------------------------------------------------------------------
    1.10 +var BUGNUMBER = 577325;
    1.11 +var summary = 'Implement the ES5 algorithm for processing function statements';
    1.12 +
    1.13 +print(BUGNUMBER + ": " + summary);
    1.14 +
    1.15 +/**************
    1.16 + * BEGIN TEST *
    1.17 + **************/
    1.18 +
    1.19 +var outer, desc;
    1.20 +
    1.21 +///////////////////////////////////////////////////
    1.22 +// Function definitions over accessor properties //
    1.23 +///////////////////////////////////////////////////
    1.24 +
    1.25 +var getCalled, setCalled;
    1.26 +
    1.27 +// configurable properties get blown away
    1.28 +
    1.29 +getCalled = false, setCalled = false;
    1.30 +Object.defineProperty(this, "acc1",
    1.31 +                      {
    1.32 +                        get: function() { getCalled = true; throw "FAIL get 1"; },
    1.33 +                        set: function(v) { setCalled = true; throw "FAIL set 1 " + v; },
    1.34 +                        configurable: true,
    1.35 +                        enumerable: false
    1.36 +                      });
    1.37 +
    1.38 +// does not throw
    1.39 +outer = undefined;
    1.40 +eval("function acc1() { throw 'FAIL redefined 1'; } outer = acc1;");
    1.41 +assertEq(getCalled, false);
    1.42 +assertEq(setCalled, false);
    1.43 +assertEq(typeof acc1, "function");
    1.44 +assertEq(acc1, outer);
    1.45 +desc = Object.getOwnPropertyDescriptor(this, "acc1");
    1.46 +assertEq(desc.value, acc1);
    1.47 +assertEq(desc.writable, true);
    1.48 +assertEq(desc.enumerable, true);
    1.49 +assertEq(desc.configurable, true);
    1.50 +
    1.51 +
    1.52 +getCalled = false, setCalled = false;
    1.53 +Object.defineProperty(this, "acc2",
    1.54 +                      {
    1.55 +                        get: function() { getCalled = true; throw "FAIL get 2"; },
    1.56 +                        set: function(v) { setCalled = true; throw "FAIL set 2 " + v; },
    1.57 +                        configurable: true,
    1.58 +                        enumerable: true
    1.59 +                      });
    1.60 +
    1.61 +// does not throw
    1.62 +outer = undefined;
    1.63 +eval("function acc2() { throw 'FAIL redefined 2'; } outer = acc2;");
    1.64 +assertEq(getCalled, false);
    1.65 +assertEq(setCalled, false);
    1.66 +assertEq(typeof acc2, "function");
    1.67 +assertEq(acc2, outer);
    1.68 +desc = Object.getOwnPropertyDescriptor(this, "acc2");
    1.69 +assertEq(desc.value, acc2);
    1.70 +assertEq(desc.writable, true);
    1.71 +assertEq(desc.enumerable, true);
    1.72 +assertEq(desc.configurable, true);
    1.73 +
    1.74 +
    1.75 +// non-configurable properties produce a TypeError
    1.76 +
    1.77 +getCalled = false, setCalled = false;
    1.78 +Object.defineProperty(this, "acc3",
    1.79 +                      {
    1.80 +                        get: function() { getCalled = true; throw "FAIL get 3"; },
    1.81 +                        set: function(v) { setCalled = true; throw "FAIL set 3 " + v; },
    1.82 +                        configurable: false,
    1.83 +                        enumerable: true
    1.84 +                      });
    1.85 +
    1.86 +outer = undefined;
    1.87 +try
    1.88 +{
    1.89 +  eval("function acc3() { throw 'FAIL redefined 3'; }; outer = acc3");
    1.90 +  throw new Error("should have thrown trying to redefine global function " +
    1.91 +                  "over a non-configurable, enumerable accessor");
    1.92 +}
    1.93 +catch (e)
    1.94 +{
    1.95 +  assertEq(e instanceof TypeError, true,
    1.96 +           "global function definition, when that function would overwrite " +
    1.97 +           "a non-configurable, enumerable accessor, must throw a TypeError " +
    1.98 +           "per ES5+errata: " + e);
    1.99 +  desc = Object.getOwnPropertyDescriptor(this, "acc3");
   1.100 +  assertEq(typeof desc.get, "function");
   1.101 +  assertEq(typeof desc.set, "function");
   1.102 +  assertEq(desc.enumerable, true);
   1.103 +  assertEq(desc.configurable, false);
   1.104 +  assertEq(outer, undefined);
   1.105 +  assertEq(getCalled, false);
   1.106 +  assertEq(setCalled, false);
   1.107 +}
   1.108 +
   1.109 +
   1.110 +getCalled = false, setCalled = false;
   1.111 +Object.defineProperty(this, "acc4",
   1.112 +                      {
   1.113 +                        get: function() { getCalled = true; throw "FAIL get 4"; },
   1.114 +                        set: function(v) { setCalled = true; throw "FAIL set 4 " + v; },
   1.115 +                        configurable: false,
   1.116 +                        enumerable: false
   1.117 +                      });
   1.118 +
   1.119 +outer = undefined;
   1.120 +try
   1.121 +{
   1.122 +  eval("function acc4() { throw 'FAIL redefined 4'; }; outer = acc4");
   1.123 +  throw new Error("should have thrown trying to redefine global function " +
   1.124 +                  "over a non-configurable, non-enumerable accessor");
   1.125 +}
   1.126 +catch (e)
   1.127 +{
   1.128 +  assertEq(e instanceof TypeError, true,
   1.129 +           "global function definition, when that function would overwrite " +
   1.130 +           "a non-configurable, non-enumerable accessor, must throw a " +
   1.131 +           "TypeError per ES5+errata: " + e);
   1.132 +  desc = Object.getOwnPropertyDescriptor(this, "acc4");
   1.133 +  assertEq(typeof desc.get, "function");
   1.134 +  assertEq(typeof desc.set, "function");
   1.135 +  assertEq(desc.enumerable, false);
   1.136 +  assertEq(desc.configurable, false);
   1.137 +  assertEq(outer, undefined);
   1.138 +  assertEq(getCalled, false);
   1.139 +  assertEq(setCalled, false);
   1.140 +}
   1.141 +
   1.142 +
   1.143 +///////////////////////////////////////////////
   1.144 +// Function definitions over data properties //
   1.145 +///////////////////////////////////////////////
   1.146 +
   1.147 +
   1.148 +// configurable properties, regardless of other attributes, get blown away
   1.149 +
   1.150 +Object.defineProperty(this, "data1",
   1.151 +                      {
   1.152 +                        configurable: true,
   1.153 +                        enumerable: true,
   1.154 +                        writable: true,
   1.155 +                        value: "data1"
   1.156 +                      });
   1.157 +
   1.158 +outer = undefined;
   1.159 +eval("function data1() { return 'data1 function'; } outer = data1;");
   1.160 +assertEq(typeof data1, "function");
   1.161 +assertEq(data1, outer);
   1.162 +desc = Object.getOwnPropertyDescriptor(this, "data1");
   1.163 +assertEq(desc.configurable, true);
   1.164 +assertEq(desc.enumerable, true);
   1.165 +assertEq(desc.writable, true);
   1.166 +assertEq(desc.value, data1);
   1.167 +
   1.168 +
   1.169 +Object.defineProperty(this, "data2",
   1.170 +                      {
   1.171 +                        configurable: true,
   1.172 +                        enumerable: true,
   1.173 +                        writable: false,
   1.174 +                        value: "data2"
   1.175 +                      });
   1.176 +
   1.177 +outer = undefined;
   1.178 +eval("function data2() { return 'data2 function'; } outer = data2;");
   1.179 +assertEq(typeof data2, "function");
   1.180 +assertEq(data2, outer);
   1.181 +desc = Object.getOwnPropertyDescriptor(this, "data2");
   1.182 +assertEq(desc.configurable, true);
   1.183 +assertEq(desc.enumerable, true);
   1.184 +assertEq(desc.writable, true);
   1.185 +assertEq(desc.value, data2);
   1.186 +
   1.187 +
   1.188 +Object.defineProperty(this, "data3",
   1.189 +                      {
   1.190 +                        configurable: true,
   1.191 +                        enumerable: false,
   1.192 +                        writable: true,
   1.193 +                        value: "data3"
   1.194 +                      });
   1.195 +
   1.196 +outer = undefined;
   1.197 +eval("function data3() { return 'data3 function'; } outer = data3;");
   1.198 +assertEq(typeof data3, "function");
   1.199 +assertEq(data3, outer);
   1.200 +desc = Object.getOwnPropertyDescriptor(this, "data3");
   1.201 +assertEq(desc.configurable, true);
   1.202 +assertEq(desc.enumerable, true);
   1.203 +assertEq(desc.writable, true);
   1.204 +assertEq(desc.value, data3);
   1.205 +
   1.206 +
   1.207 +Object.defineProperty(this, "data4",
   1.208 +                      {
   1.209 +                        configurable: true,
   1.210 +                        enumerable: false,
   1.211 +                        writable: false,
   1.212 +                        value: "data4"
   1.213 +                      });
   1.214 +
   1.215 +outer = undefined;
   1.216 +eval("function data4() { return 'data4 function'; } outer = data4;");
   1.217 +assertEq(typeof data4, "function");
   1.218 +assertEq(data4, outer);
   1.219 +desc = Object.getOwnPropertyDescriptor(this, "data4");
   1.220 +assertEq(desc.value, data4);
   1.221 +assertEq(desc.writable, true);
   1.222 +assertEq(desc.enumerable, true);
   1.223 +assertEq(desc.configurable, true);
   1.224 +
   1.225 +
   1.226 +// non-configurable data properties are trickier
   1.227 +
   1.228 +Object.defineProperty(this, "data5",
   1.229 +                      {
   1.230 +                        configurable: false,
   1.231 +                        enumerable: true,
   1.232 +                        writable: true,
   1.233 +                        value: "data5"
   1.234 +                      });
   1.235 +
   1.236 +outer = undefined;
   1.237 +eval("function data5() { return 'data5 function'; } outer = data5;");
   1.238 +assertEq(typeof data5, "function");
   1.239 +assertEq(data5, outer);
   1.240 +desc = Object.getOwnPropertyDescriptor(this, "data5");
   1.241 +assertEq(desc.configurable, false);
   1.242 +assertEq(desc.enumerable, true);
   1.243 +assertEq(desc.writable, true);
   1.244 +assertEq(desc.value, data5);
   1.245 +
   1.246 +
   1.247 +Object.defineProperty(this, "data6",
   1.248 +                      {
   1.249 +                        configurable: false,
   1.250 +                        enumerable: true,
   1.251 +                        writable: false,
   1.252 +                        value: "data6"
   1.253 +                      });
   1.254 +
   1.255 +outer = undefined;
   1.256 +try
   1.257 +{
   1.258 +  eval("function data6() { return 'data6 function'; } outer = data6;");
   1.259 +  throw new Error("should have thrown trying to redefine global function " +
   1.260 +                  "over a non-configurable, enumerable, non-writable accessor");
   1.261 +}
   1.262 +catch (e)
   1.263 +{
   1.264 +  assertEq(e instanceof TypeError, true,
   1.265 +           "global function definition, when that function would overwrite " +
   1.266 +           "a non-configurable, enumerable, non-writable data property, must " +
   1.267 +           "throw a TypeError per ES5+errata: " + e);
   1.268 +  assertEq(data6, "data6");
   1.269 +  assertEq(outer, undefined);
   1.270 +  desc = Object.getOwnPropertyDescriptor(this, "data6");
   1.271 +  assertEq(desc.configurable, false);
   1.272 +  assertEq(desc.enumerable, true);
   1.273 +  assertEq(desc.writable, false);
   1.274 +  assertEq(desc.value, "data6");
   1.275 +}
   1.276 +
   1.277 +
   1.278 +Object.defineProperty(this, "data7",
   1.279 +                      {
   1.280 +                        configurable: false,
   1.281 +                        enumerable: false,
   1.282 +                        writable: true,
   1.283 +                        value: "data7"
   1.284 +                      });
   1.285 +
   1.286 +outer = undefined;
   1.287 +try
   1.288 +{
   1.289 +  eval("function data7() { return 'data7 function'; } outer = data7;");
   1.290 +  throw new Error("should have thrown trying to redefine global function " +
   1.291 +                  "over a non-configurable, non-enumerable, writable data" +
   1.292 +                  "property");
   1.293 +}
   1.294 +catch (e)
   1.295 +{
   1.296 +  assertEq(e instanceof TypeError, true,
   1.297 +           "global function definition, when that function would overwrite " +
   1.298 +           "a non-configurable, non-enumerable, writable data property, must " +
   1.299 +           "throw a TypeError per ES5+errata: " + e);
   1.300 +  assertEq(data7, "data7");
   1.301 +  assertEq(outer, undefined);
   1.302 +  desc = Object.getOwnPropertyDescriptor(this, "data7");
   1.303 +  assertEq(desc.configurable, false);
   1.304 +  assertEq(desc.enumerable, false);
   1.305 +  assertEq(desc.writable, true);
   1.306 +  assertEq(desc.value, "data7");
   1.307 +}
   1.308 +
   1.309 +
   1.310 +Object.defineProperty(this, "data8",
   1.311 +                      {
   1.312 +                        configurable: false,
   1.313 +                        enumerable: false,
   1.314 +                        writable: false,
   1.315 +                        value: "data8"
   1.316 +                      });
   1.317 +
   1.318 +outer = undefined;
   1.319 +try
   1.320 +{
   1.321 +  eval("function data8() { return 'data8 function'; } outer = data8;");
   1.322 +  throw new Error("should have thrown trying to redefine global function " +
   1.323 +                  "over a non-configurable, non-enumerable, non-writable data" +
   1.324 +                  "property");
   1.325 +}
   1.326 +catch (e)
   1.327 +{
   1.328 +  assertEq(e instanceof TypeError, true,
   1.329 +           "global function definition, when that function would overwrite " +
   1.330 +           "a non-configurable, non-enumerable, non-writable data property, " +
   1.331 +           "must throw a TypeError per ES5+errata: " + e);
   1.332 +  assertEq(data8, "data8");
   1.333 +  assertEq(outer, undefined);
   1.334 +  desc = Object.getOwnPropertyDescriptor(this, "data8");
   1.335 +  assertEq(desc.configurable, false);
   1.336 +  assertEq(desc.enumerable, false);
   1.337 +  assertEq(desc.writable, false);
   1.338 +  assertEq(desc.value, "data8");
   1.339 +}
   1.340 +
   1.341 +/******************************************************************************/
   1.342 +
   1.343 +if (typeof reportCompare === "function")
   1.344 +  reportCompare(true, true);
   1.345 +
   1.346 +print("All tests passed!");

mercurial