mirror of
https://github.com/tc39/test262.git
synced 2025-05-03 22:40:28 +02:00
* [javascriptcore-test262-automation] changes from git@github.com:WebKit/webkit.git at sha 949e26452cfa153a7f4afe593da97e2fe9e1b706 on Tue Jul 03 2018 14:35:15 GMT-0400 (Eastern Daylight Time)
452 lines
12 KiB
JavaScript
452 lines
12 KiB
JavaScript
function assert(b) {
|
|
if (!b)
|
|
throw new Error("bad assertion");
|
|
}
|
|
|
|
{
|
|
let target = {x: 20};
|
|
let called = false;
|
|
let handler = {
|
|
getOwnPropertyDescriptor: function(theTarget, propName) {
|
|
called = true;
|
|
assert(theTarget === target);
|
|
assert(propName === "x");
|
|
return undefined;
|
|
}
|
|
};
|
|
let proxy = new Proxy(target, handler);
|
|
for (let i = 0; i < 500; i++) {
|
|
assert(Object.getOwnPropertyDescriptor(proxy, "x") === undefined);
|
|
assert(called);
|
|
called = false;
|
|
}
|
|
}
|
|
|
|
{
|
|
let target = {};
|
|
let handler = {
|
|
getOwnPropertyDescriptor: function(theTarget, propName) {
|
|
return 25;
|
|
}
|
|
};
|
|
let proxy = new Proxy(target, handler);
|
|
for (let i = 0; i < 500; i++) {
|
|
let threw = false;
|
|
try {
|
|
Object.getOwnPropertyDescriptor(proxy, "x");
|
|
} catch(e) {
|
|
assert(e.toString() === "TypeError: result of 'getOwnPropertyDescriptor' call should either be an Object or undefined");
|
|
threw = true;
|
|
}
|
|
assert(threw);
|
|
}
|
|
}
|
|
|
|
{
|
|
let target = {};
|
|
Object.defineProperty(target, "x", {
|
|
enumerable: true,
|
|
configurable: false
|
|
});
|
|
let handler = {
|
|
getOwnPropertyDescriptor: function(theTarget, propName) {
|
|
assert(theTarget === target);
|
|
assert(propName === "x");
|
|
return undefined;
|
|
}
|
|
};
|
|
let proxy = new Proxy(target, handler);
|
|
for (let i = 0; i < 500; i++) {
|
|
let threw = false;
|
|
try {
|
|
Object.getOwnPropertyDescriptor(proxy, "x");
|
|
} catch(e) {
|
|
assert(e.toString() === "TypeError: When the result of 'getOwnPropertyDescriptor' is undefined the target must be configurable");
|
|
threw = true;
|
|
}
|
|
assert(threw);
|
|
}
|
|
}
|
|
|
|
{
|
|
let target = {};
|
|
Object.defineProperty(target, "x", {
|
|
enumerable: true,
|
|
configurable: true
|
|
});
|
|
let handler = {
|
|
getOwnPropertyDescriptor: function(theTarget, propName) {
|
|
assert(theTarget === target);
|
|
assert(propName === "x");
|
|
return {configurable: false};
|
|
}
|
|
};
|
|
let proxy = new Proxy(target, handler);
|
|
for (let i = 0; i < 500; i++) {
|
|
let threw = false;
|
|
try {
|
|
Object.getOwnPropertyDescriptor(proxy, "x");
|
|
} catch(e) {
|
|
assert(e.toString() === "TypeError: Result from 'getOwnPropertyDescriptor' can't be non-configurable when the 'target' doesn't have it as an own property or if it is a configurable own property on 'target'");
|
|
threw = true;
|
|
}
|
|
assert(threw);
|
|
}
|
|
}
|
|
|
|
{
|
|
let target = {};
|
|
Object.defineProperty(target, "x", {
|
|
enumerable: false,
|
|
configurable: false
|
|
});
|
|
let handler = {
|
|
getOwnPropertyDescriptor: function(theTarget, propName) {
|
|
assert(theTarget === target);
|
|
assert(propName === "x");
|
|
return {enumerable: true};
|
|
}
|
|
};
|
|
let proxy = new Proxy(target, handler);
|
|
for (let i = 0; i < 500; i++) {
|
|
let threw = false;
|
|
try {
|
|
Object.getOwnPropertyDescriptor(proxy, "x");
|
|
} catch(e) {
|
|
assert(e.toString() === "TypeError: Result from 'getOwnPropertyDescriptor' fails the IsCompatiblePropertyDescriptor test");
|
|
threw = true;
|
|
}
|
|
assert(threw);
|
|
}
|
|
}
|
|
|
|
{
|
|
let target = {};
|
|
let handler = {
|
|
getOwnPropertyDescriptor: 45
|
|
};
|
|
let proxy = new Proxy(target, handler);
|
|
for (let i = 0; i < 500; i++) {
|
|
let threw = false;
|
|
try {
|
|
Object.getOwnPropertyDescriptor(proxy, "x");
|
|
} catch(e) {
|
|
assert(e.toString() === "TypeError: 'getOwnPropertyDescriptor' property of a Proxy's handler should be callable");
|
|
threw = true;
|
|
}
|
|
assert(threw);
|
|
}
|
|
}
|
|
|
|
{
|
|
let target = {};
|
|
let handler = {
|
|
getOwnPropertyDescriptor: null
|
|
};
|
|
Object.defineProperty(target, "x", {
|
|
enumerable: true,
|
|
configurable: false
|
|
});
|
|
let proxy = new Proxy(target, handler);
|
|
for (let i = 0; i < 500; i++) {
|
|
let pDesc = Object.getOwnPropertyDescriptor(proxy, "x");
|
|
assert(pDesc.configurable === false);
|
|
assert(pDesc.enumerable === true);
|
|
}
|
|
}
|
|
|
|
{
|
|
let target = {};
|
|
let handler = {
|
|
getOwnPropertyDescriptor: undefined
|
|
};
|
|
Object.defineProperty(target, "x", {
|
|
enumerable: true,
|
|
configurable: false
|
|
});
|
|
let proxy = new Proxy(target, handler);
|
|
for (let i = 0; i < 500; i++) {
|
|
let pDesc = Object.getOwnPropertyDescriptor(proxy, "x");
|
|
assert(pDesc.configurable === false);
|
|
assert(pDesc.enumerable === true);
|
|
}
|
|
}
|
|
|
|
{
|
|
let target = {};
|
|
let handler = { };
|
|
Object.defineProperty(target, "x", {
|
|
enumerable: true,
|
|
configurable: false
|
|
});
|
|
let proxy = new Proxy(target, handler);
|
|
for (let i = 0; i < 500; i++) {
|
|
let pDesc = Object.getOwnPropertyDescriptor(proxy, "x");
|
|
assert(pDesc.configurable === false);
|
|
assert(pDesc.enumerable === true);
|
|
}
|
|
}
|
|
|
|
{
|
|
let target = {};
|
|
let error = null;
|
|
let handler = { get getOwnPropertyDescriptor() {
|
|
error = new Error("blah");
|
|
throw error;
|
|
}};
|
|
Object.defineProperty(target, "x", {
|
|
enumerable: true,
|
|
configurable: false
|
|
});
|
|
let proxy = new Proxy(target, handler);
|
|
for (let i = 0; i < 500; i++) {
|
|
let threw = false;
|
|
try {
|
|
let pDesc = Object.getOwnPropertyDescriptor(proxy, "x");
|
|
} catch(e) {
|
|
threw = true;
|
|
assert(e === error);
|
|
}
|
|
assert(threw);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
Object.prototype.fooBarBaz = 20; // Make for-in go over the prototype chain to the top.
|
|
|
|
{
|
|
let target = {};
|
|
let called = false;
|
|
let handler = {
|
|
getOwnPropertyDescriptor: function() {
|
|
called = true;
|
|
return undefined;
|
|
}
|
|
};
|
|
let proxy = new Proxy(target, handler);
|
|
for (let i = 0; i < 1000; i++) {
|
|
let set = new Set();
|
|
for (let p in proxy) {
|
|
set.add(p);
|
|
}
|
|
assert(set.has("fooBarBaz"));
|
|
assert(called);
|
|
called = false;
|
|
}
|
|
}
|
|
|
|
{
|
|
let target = {};
|
|
let called = false;
|
|
let handler = {
|
|
getOwnPropertyDescriptor: function() {
|
|
called = true;
|
|
return undefined;
|
|
}
|
|
};
|
|
|
|
let proxy = new Proxy(target, handler);
|
|
let proxyish = Object.create(proxy, {
|
|
x: {value: 20, enumerable: true},
|
|
y: {value: 20, enumerable: true}
|
|
});
|
|
for (let i = 0; i < 1000; i++) {
|
|
let set = new Set;
|
|
for (let p in proxyish) {
|
|
set.add(p);
|
|
}
|
|
assert(set.has("x"));
|
|
assert(set.has("y"));
|
|
assert(set.has("fooBarBaz"));
|
|
assert(called);
|
|
called = false;
|
|
}
|
|
}
|
|
|
|
{
|
|
let target = {};
|
|
Object.defineProperty(target, "x", {
|
|
enumerable: false,
|
|
configurable: false,
|
|
writable: true,
|
|
value: 50
|
|
});
|
|
let handler = {
|
|
getOwnPropertyDescriptor: function(theTarget, propName) {
|
|
return {enumerable: false, value: 45};
|
|
}
|
|
};
|
|
let proxy = new Proxy(target, handler);
|
|
for (let i = 0; i < 500; i++) {
|
|
let desc = Object.getOwnPropertyDescriptor(proxy, "x");
|
|
assert(desc.configurable === false);
|
|
assert(desc.enumerable === false);
|
|
assert(desc.writable === false);
|
|
assert(desc.value === 45);
|
|
}
|
|
}
|
|
|
|
{
|
|
let target = {};
|
|
Object.defineProperty(target, "x", {
|
|
enumerable: false,
|
|
configurable: false,
|
|
writable: true
|
|
});
|
|
let handler = {
|
|
getOwnPropertyDescriptor: function(theTarget, propName) {
|
|
return {enumerable: false, value: 45};
|
|
}
|
|
};
|
|
let proxy = new Proxy(target, handler);
|
|
for (let i = 0; i < 500; i++) {
|
|
let desc = Object.getOwnPropertyDescriptor(proxy, "x");
|
|
assert(desc.configurable === false);
|
|
assert(desc.enumerable === false);
|
|
assert(desc.writable === false);
|
|
assert(desc.value === 45);
|
|
}
|
|
}
|
|
|
|
{
|
|
let target = {};
|
|
Object.defineProperty(target, "x", {
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true
|
|
});
|
|
let handler = {
|
|
getOwnPropertyDescriptor: function(theTarget, propName) {
|
|
return {configurable: true, value: 45, enumerable: true};
|
|
}
|
|
};
|
|
let proxy = new Proxy(target, handler);
|
|
for (let i = 0; i < 500; i++) {
|
|
let desc = Object.getOwnPropertyDescriptor(proxy, "x");
|
|
assert(desc.configurable === true);
|
|
assert(desc.enumerable === true);
|
|
assert(desc.writable === false);
|
|
assert(desc.value === 45);
|
|
}
|
|
}
|
|
|
|
{
|
|
let target = {};
|
|
let handler = {
|
|
getOwnPropertyDescriptor: function(theTarget, propName) {
|
|
return {configurable: true, value: 45, enumerable: true};
|
|
}
|
|
};
|
|
let proxy = new Proxy(target, handler);
|
|
for (let i = 0; i < 500; i++) {
|
|
let desc = Object.getOwnPropertyDescriptor(proxy, "x");
|
|
assert(desc.configurable === true);
|
|
assert(desc.enumerable === true);
|
|
assert(desc.writable === false);
|
|
assert(desc.value === 45);
|
|
}
|
|
}
|
|
|
|
{
|
|
let target = {};
|
|
Object.defineProperty(target, "x", {
|
|
get: function() { return 25; },
|
|
set: function() { return 50; },
|
|
configurable: false
|
|
});
|
|
let handler = {
|
|
getOwnPropertyDescriptor: function(theTarget, propName) {
|
|
return {configurable: false, set:function(){}, get:function(){} };
|
|
}
|
|
};
|
|
let proxy = new Proxy(target, handler);
|
|
for (let i = 0; i < 500; i++) {
|
|
let threw = false;
|
|
try {
|
|
Object.getOwnPropertyDescriptor(proxy, "x");
|
|
} catch(e) {
|
|
threw = true;
|
|
assert(e.toString() === "TypeError: Result from 'getOwnPropertyDescriptor' fails the IsCompatiblePropertyDescriptor test");
|
|
}
|
|
assert(threw);
|
|
}
|
|
}
|
|
|
|
{
|
|
let target = {};
|
|
Object.defineProperty(target, "x", {
|
|
get: function() { return 25; },
|
|
set: function() { return 50; },
|
|
configurable: true
|
|
});
|
|
let a = function() { };
|
|
let b = function() {}
|
|
let handler = {
|
|
getOwnPropertyDescriptor: function(theTarget, propName) {
|
|
return {configurable: true, set: a, get: b };
|
|
}
|
|
};
|
|
let proxy = new Proxy(target, handler);
|
|
for (let i = 0; i < 500; i++) {
|
|
let result = Object.getOwnPropertyDescriptor(proxy, "x");
|
|
assert(result.configurable);
|
|
assert(result.set === a);
|
|
assert(result.get === b);
|
|
}
|
|
}
|
|
|
|
{
|
|
let target = {};
|
|
Object.defineProperty(target, "x", {
|
|
get: function() { return 25; },
|
|
set: function() { return 50; },
|
|
configurable: false
|
|
});
|
|
let handler = {
|
|
getOwnPropertyDescriptor: function(theTarget, propName) {
|
|
return {configurable: false, set:function(){}, get:function(){} };
|
|
}
|
|
};
|
|
let proxy = new Proxy(target, handler);
|
|
for (let i = 0; i < 500; i++) {
|
|
let threw = false;
|
|
try {
|
|
Object.getOwnPropertyDescriptor(proxy, "x");
|
|
} catch(e) {
|
|
threw = true;
|
|
assert(e.toString() === "TypeError: Result from 'getOwnPropertyDescriptor' fails the IsCompatiblePropertyDescriptor test");
|
|
}
|
|
assert(threw);
|
|
}
|
|
}
|
|
|
|
{
|
|
let target = {};
|
|
let setter = function() { };
|
|
let getter = function() { };
|
|
Object.defineProperty(target, "x", {
|
|
get: getter,
|
|
set: setter,
|
|
configurable: false
|
|
});
|
|
let handler = {
|
|
getOwnPropertyDescriptor: function(theTarget, propName) {
|
|
return {
|
|
configurable: false,
|
|
set: setter,
|
|
get: getter
|
|
};
|
|
}
|
|
};
|
|
let proxy = new Proxy(target, handler);
|
|
for (let i = 0; i < 500; i++) {
|
|
let desc = Object.getOwnPropertyDescriptor(proxy, "x");
|
|
assert(desc.configurable === false);
|
|
assert(desc.get === getter);
|
|
assert(desc.set === setter);
|
|
assert(desc.enumerable === false);
|
|
assert(desc.writable === undefined);
|
|
}
|
|
}
|