1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/js/src/tests/ecma_5/extensions/proxy-__proto__.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,81 @@ 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 +var gTestfile = 'proxy-__proto__.js'; 1.10 +var BUGNUMBER = 770344; 1.11 +var summary = "Behavior of __proto__ on proxies"; 1.12 + 1.13 +print(BUGNUMBER + ": " + summary); 1.14 + 1.15 +/************** 1.16 + * BEGIN TEST * 1.17 + **************/ 1.18 + 1.19 +var protoDesc = Object.getOwnPropertyDescriptor(Object.prototype, "__proto__"); 1.20 +var protoGetter = protoDesc.get; 1.21 +var protoSetter = protoDesc.set; 1.22 + 1.23 +function pp(arr) 1.24 +{ 1.25 + return arr.map(function(v) { return "" + v; }).join(", "); 1.26 +} 1.27 + 1.28 +function testProxy(creator, args, proto) 1.29 +{ 1.30 + print("Now testing behavior for " + 1.31 + "Proxy." + creator + "(" + pp(args) + ")"); 1.32 + 1.33 + var pobj = Proxy[creator].apply(Proxy, args); 1.34 + 1.35 + // Check [[Prototype]] before attempted mutation 1.36 + assertEq(Object.getPrototypeOf(pobj), proto); 1.37 + assertEq(protoGetter.call(pobj), proto); 1.38 + 1.39 + // Attempt [[Prototype]] mutation 1.40 + protoSetter.call(pobj, null); 1.41 + 1.42 + // Check [[Prototype]] after attempted mutation 1.43 + assertEq(Object.getPrototypeOf(pobj), null); 1.44 + assertEq(protoGetter.call(pobj), null); 1.45 +} 1.46 + 1.47 +// Proxy object with non-null [[Prototype]] 1.48 +var nonNullProto = { toString: function() { return "non-null prototype"; } }; 1.49 +var nonNullHandler = { toString: function() { return "non-null handler"; } }; 1.50 +testProxy("create", [nonNullHandler, nonNullProto], nonNullProto); 1.51 + 1.52 +// Proxy object with null [[Prototype]] 1.53 +var nullProto = null; 1.54 +var nullHandler = { toString: function() { return "null handler"; } }; 1.55 +testProxy("create", [nullHandler, nullProto], nullProto); 1.56 + 1.57 +// Proxy function with [[Call]] 1.58 +var callForCallOnly = function () { }; 1.59 +callForCallOnly.toString = function() { return "callForCallOnly"; }; 1.60 +var callOnlyHandler = { toString: function() { return "call-only handler"; } }; 1.61 +testProxy("createFunction", 1.62 + [callOnlyHandler, callForCallOnly], Function.prototype); 1.63 + 1.64 +// Proxy function with [[Call]] and [[Construct]] 1.65 +var callForCallConstruct = function() { }; 1.66 +callForCallConstruct.toString = function() { return "call/construct call"; }; 1.67 +var constructForCallConstruct = function() { }; 1.68 +constructForCallConstruct.toString = 1.69 + function() { return "call/construct construct"; }; 1.70 +var handlerForCallConstruct = 1.71 + { toString: function() { return "call/construct handler"; } }; 1.72 +testProxy("createFunction", 1.73 + [handlerForCallConstruct, 1.74 + callForCallConstruct, 1.75 + constructForCallConstruct], 1.76 + Function.prototype); 1.77 + 1.78 + 1.79 +/******************************************************************************/ 1.80 + 1.81 +if (typeof reportCompare === "function") 1.82 + reportCompare(true, true); 1.83 + 1.84 +print("Tests complete");