1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/js/src/tests/ecma_5/extensions/es5ish-defineGetter-defineSetter.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,281 @@ 1.4 +// Any copyright is dedicated to the Public Domain. 1.5 +// http://creativecommons.org/licenses/publicdomain/ 1.6 + 1.7 +//----------------------------------------------------------------------------- 1.8 +var BUGNUMBER = 715821; 1.9 +var summary = "Implement __define[GS]etter__ using Object.defineProperty"; 1.10 + 1.11 +print(BUGNUMBER + ": " + summary); 1.12 + 1.13 +/************* 1.14 + * UTILITIES * 1.15 + *************/ 1.16 + 1.17 +function s(desc) 1.18 +{ 1.19 + if (typeof desc === "undefined") 1.20 + return "<undefined>"; 1.21 + assertEq(typeof desc, "object"); 1.22 + assertEq(desc !== null, true); 1.23 + 1.24 + var str = "<enumerable: <" + desc.enumerable + ">, " + 1.25 + " configurable: <" + desc.configurable + ">,"; 1.26 + 1.27 + if (desc.hasOwnProperty("value")) 1.28 + { 1.29 + return str + 1.30 + " value: <" + desc.value + ">," + 1.31 + " writable: <" + desc.writable + ">>"; 1.32 + } 1.33 + 1.34 + return str + 1.35 + " get: <" + desc.get + ">," + 1.36 + " set: <" + desc.set + ">>"; 1.37 +} 1.38 + 1.39 +function checkField(field, desc, expected) 1.40 +{ 1.41 + var present = desc.hasOwnProperty(field); 1.42 + assertEq(present, expected.hasOwnProperty(field), 1.43 + field + " presence mismatch (got " + s(desc) + ", expected " + s(expected) + ")"); 1.44 + if (present) 1.45 + { 1.46 + assertEq(desc[field], expected[field], 1.47 + field + " value mismatch (got " + s(desc) + ", expected " + s(expected) + ")"); 1.48 + } 1.49 +} 1.50 + 1.51 +function check(obj, prop, expected) 1.52 +{ 1.53 + var desc = Object.getOwnPropertyDescriptor(obj, prop); 1.54 + assertEq(typeof desc, typeof expected, 1.55 + "type mismatch (got " + s(desc) + ", expected " + s(expected) + ")"); 1.56 + 1.57 + assertEq(desc.hasOwnProperty("get"), desc.hasOwnProperty("set"), 1.58 + "bad descriptor: " + s(desc)); 1.59 + assertEq(desc.hasOwnProperty("value"), desc.hasOwnProperty("writable"), 1.60 + "bad descriptor: " + s(desc)); 1.61 + 1.62 + assertEq(desc.hasOwnProperty("get"), !desc.hasOwnProperty("value"), 1.63 + "bad descriptor: " + s(desc)); 1.64 + 1.65 + checkField("get", desc, expected); 1.66 + checkField("set", desc, expected); 1.67 + checkField("value", desc, expected); 1.68 + checkField("writable", desc, expected); 1.69 + checkField("enumerable", desc, expected); 1.70 + checkField("configurable", desc, expected); 1.71 +} 1.72 + 1.73 +function expectTypeError(f) 1.74 +{ 1.75 + try 1.76 + { 1.77 + f(); 1.78 + throw new Error("no error thrown"); 1.79 + } 1.80 + catch (e) 1.81 + { 1.82 + assertEq(e instanceof TypeError, true, 1.83 + "wrong error thrown: got " + e + ", not a TypeError"); 1.84 + } 1.85 +} 1.86 + 1.87 +/************** 1.88 + * BEGIN TEST * 1.89 + **************/ 1.90 + 1.91 +// Adding a new getter, overwriting an existing one 1.92 + 1.93 +function g1() { } 1.94 +var gobj = {}; 1.95 +gobj.__defineGetter__("foo", g1); 1.96 +check(gobj, "foo", { get: g1, set: undefined, enumerable: true, configurable: true }); 1.97 + 1.98 +function g2() { } 1.99 +gobj.__defineGetter__("foo", g2); 1.100 +check(gobj, "foo", { get: g2, set: undefined, enumerable: true, configurable: true }); 1.101 + 1.102 +/******************************************************************************/ 1.103 + 1.104 +// Adding a new setter, overwriting an existing one 1.105 + 1.106 +function s1() { } 1.107 +var sobj = {}; 1.108 +sobj.__defineSetter__("bar", s1); 1.109 +check(sobj, "bar", { get: undefined, set: s1, enumerable: true, configurable: true }); 1.110 + 1.111 +function s2() { } 1.112 +sobj.__defineSetter__("bar", s2); 1.113 +check(sobj, "bar", { get: undefined, set: s2, enumerable: true, configurable: true }); 1.114 + 1.115 +/******************************************************************************/ 1.116 + 1.117 +// Adding a new getter, then adding a setter 1.118 +// Changing an existing accessor's enumerability, then "null"-changing the accessor 1.119 +// Changing an accessor's configurability, then "null"-changing and real-changing the accessor 1.120 + 1.121 +function g3() { } 1.122 +var gsobj = {}; 1.123 +gsobj.__defineGetter__("baz", g3); 1.124 +check(gsobj, "baz", { get: g3, set: undefined, enumerable: true, configurable: true }); 1.125 + 1.126 +function s3() { } 1.127 +gsobj.__defineSetter__("baz", s3); 1.128 +check(gsobj, "baz", { get: g3, set: s3, enumerable: true, configurable: true }); 1.129 + 1.130 +Object.defineProperty(gsobj, "baz", { enumerable: false }); 1.131 +check(gsobj, "baz", { get: g3, set: s3, enumerable: false, configurable: true }); 1.132 + 1.133 +gsobj.__defineGetter__("baz", g3); 1.134 +check(gsobj, "baz", { get: g3, set: s3, enumerable: true, configurable: true }); 1.135 + 1.136 +Object.defineProperty(gsobj, "baz", { enumerable: false }); 1.137 +check(gsobj, "baz", { get: g3, set: s3, enumerable: false, configurable: true }); 1.138 + 1.139 +gsobj.__defineSetter__("baz", s3); 1.140 +check(gsobj, "baz", { get: g3, set: s3, enumerable: true, configurable: true }); 1.141 + 1.142 +Object.defineProperty(gsobj, "baz", { configurable: false }); 1.143 +expectTypeError(function() { gsobj.__defineSetter__("baz", s2); }); 1.144 +expectTypeError(function() { gsobj.__defineSetter__("baz", s3); }); 1.145 +check(gsobj, "baz", { get: g3, set: s3, enumerable: true, configurable: false }); 1.146 + 1.147 +/******************************************************************************/ 1.148 + 1.149 +// Adding a new setter, then adding a getter 1.150 +// Changing an existing accessor's enumerability, then "null"-changing the accessor 1.151 +// Changing an accessor's configurability, then "null"-changing and real-changing the accessor 1.152 + 1.153 +function s4() { } 1.154 +var sgobj = {}; 1.155 +sgobj.__defineSetter__("baz", s4); 1.156 +check(sgobj, "baz", { get: undefined, set: s4, enumerable: true, configurable: true }); 1.157 + 1.158 +function g4() { } 1.159 +sgobj.__defineGetter__("baz", g4); 1.160 +check(sgobj, "baz", { get: g4, set: s4, enumerable: true, configurable: true }); 1.161 + 1.162 +Object.defineProperty(sgobj, "baz", { enumerable: false }); 1.163 +check(sgobj, "baz", { get: g4, set: s4, enumerable: false, configurable: true }); 1.164 + 1.165 +sgobj.__defineSetter__("baz", s4); 1.166 +check(sgobj, "baz", { get: g4, set: s4, enumerable: true, configurable: true }); 1.167 + 1.168 +Object.defineProperty(sgobj, "baz", { enumerable: false }); 1.169 +check(sgobj, "baz", { get: g4, set: s4, enumerable: false, configurable: true }); 1.170 + 1.171 +sgobj.__defineSetter__("baz", s4); 1.172 +check(sgobj, "baz", { get: g4, set: s4, enumerable: true, configurable: true }); 1.173 + 1.174 +Object.defineProperty(sgobj, "baz", { configurable: false }); 1.175 +expectTypeError(function() { sgobj.__defineGetter__("baz", g3); }); 1.176 +expectTypeError(function() { sgobj.__defineSetter__("baz", s4); }); 1.177 +check(sgobj, "baz", { get: g4, set: s4, enumerable: true, configurable: false }); 1.178 + 1.179 +/******************************************************************************/ 1.180 + 1.181 +// Adding a getter over a writable data property 1.182 + 1.183 +function g5() { } 1.184 +var gover = { quux: 17 }; 1.185 +check(gover, "quux", { value: 17, writable: true, enumerable: true, configurable: true }); 1.186 + 1.187 +gover.__defineGetter__("quux", g5); 1.188 +check(gover, "quux", { get: g5, set: undefined, enumerable: true, configurable: true }); 1.189 + 1.190 +/******************************************************************************/ 1.191 + 1.192 +// Adding a setter over a writable data property 1.193 + 1.194 +function s5() { } 1.195 +var sover = { quux: 17 }; 1.196 +check(sover, "quux", { value: 17, writable: true, enumerable: true, configurable: true }); 1.197 + 1.198 +sover.__defineSetter__("quux", s5); 1.199 +check(sover, "quux", { get: undefined, set: s5, enumerable: true, configurable: true }); 1.200 + 1.201 +/******************************************************************************/ 1.202 + 1.203 +// Adding a getter over a non-writable data property 1.204 + 1.205 +function g6() { } 1.206 +var gnover = { eit: 17 }; 1.207 +check(gnover, "eit", { value: 17, writable: true, enumerable: true, configurable: true }); 1.208 +Object.defineProperty(gnover, "eit", { writable: false }); 1.209 +check(gnover, "eit", { value: 17, writable: false, enumerable: true, configurable: true }); 1.210 + 1.211 +gnover.__defineGetter__("eit", g6); 1.212 +check(gnover, "eit", { get: g6, set: undefined, enumerable: true, configurable: true }); 1.213 + 1.214 +/******************************************************************************/ 1.215 + 1.216 +// Adding a setter over a non-writable data property 1.217 + 1.218 +function s6() { } 1.219 +var snover = { eit: 17 }; 1.220 +check(snover, "eit", { value: 17, writable: true, enumerable: true, configurable: true }); 1.221 +Object.defineProperty(snover, "eit", { writable: false }); 1.222 +check(snover, "eit", { value: 17, writable: false, enumerable: true, configurable: true }); 1.223 + 1.224 +snover.__defineSetter__("eit", s6); 1.225 +check(snover, "eit", { get: undefined, set: s6, enumerable: true, configurable: true }); 1.226 + 1.227 +/******************************************************************************/ 1.228 + 1.229 +// Adding a getter over a non-configurable, writable data property 1.230 + 1.231 +function g7() { } 1.232 +var gncover = { moo: 17 }; 1.233 +check(gncover, "moo", { value: 17, writable: true, enumerable: true, configurable: true }); 1.234 +Object.defineProperty(gncover, "moo", { configurable: false }); 1.235 +check(gncover, "moo", { value: 17, writable: true, enumerable: true, configurable: false }); 1.236 + 1.237 +expectTypeError(function() { gncover.__defineGetter__("moo", g7); }); 1.238 +check(gncover, "moo", { value: 17, writable: true, enumerable: true, configurable: false }); 1.239 + 1.240 +/******************************************************************************/ 1.241 + 1.242 +// Adding a setter over a non-configurable, writable data property 1.243 + 1.244 +function s7() { } 1.245 +var sncover = { moo: 17 }; 1.246 +check(sncover, "moo", { value: 17, writable: true, enumerable: true, configurable: true }); 1.247 +Object.defineProperty(sncover, "moo", { configurable: false }); 1.248 +check(sncover, "moo", { value: 17, writable: true, enumerable: true, configurable: false }); 1.249 + 1.250 +expectTypeError(function() { sncover.__defineSetter__("moo", s7); }); 1.251 +check(sncover, "moo", { value: 17, writable: true, enumerable: true, configurable: false }); 1.252 + 1.253 +/******************************************************************************/ 1.254 + 1.255 +// Adding a getter over a non-configurable, non-writable data property 1.256 + 1.257 +function g8() { } 1.258 +var gncwover = { fwoosh: 17 }; 1.259 +check(gncwover, "fwoosh", { value: 17, writable: true, enumerable: true, configurable: true }); 1.260 +Object.defineProperty(gncwover, "fwoosh", { writable: false, configurable: false }); 1.261 +check(gncwover, "fwoosh", { value: 17, writable: false, enumerable: true, configurable: false }); 1.262 + 1.263 +expectTypeError(function() { gncwover.__defineGetter__("fwoosh", g7); }); 1.264 +check(gncwover, "fwoosh", { value: 17, writable: false, enumerable: true, configurable: false }); 1.265 + 1.266 +/******************************************************************************/ 1.267 + 1.268 +// Adding a setter over a non-configurable, non-writable data property 1.269 + 1.270 +function s8() { } 1.271 +var sncwover = { fwoosh: 17 }; 1.272 +check(sncwover, "fwoosh", { value: 17, writable: true, enumerable: true, configurable: true }); 1.273 +Object.defineProperty(sncwover, "fwoosh", { writable: false, configurable: false }); 1.274 +check(sncwover, "fwoosh", { value: 17, writable: false, enumerable: true, configurable: false }); 1.275 + 1.276 +expectTypeError(function() { sncwover.__defineSetter__("fwoosh", s7); }); 1.277 +check(sncwover, "fwoosh", { value: 17, writable: false, enumerable: true, configurable: false }); 1.278 + 1.279 +/******************************************************************************/ 1.280 + 1.281 +if (typeof reportCompare === "function") 1.282 + reportCompare(true, true); 1.283 + 1.284 +print("Tests complete");