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

mercurial