mirror of
				https://github.com/tc39/test262.git
				synced 2025-10-31 03:34:08 +01: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)
		
			
				
	
	
		
			657 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			657 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| function assert(b) {
 | |
|     if (!b)
 | |
|         throw new Error("Bad assertion");
 | |
| }
 | |
| 
 | |
| {
 | |
|     let target = {
 | |
|         x: 30
 | |
|     };
 | |
| 
 | |
|     let called = false;
 | |
|     let handler = {
 | |
|         set: 45
 | |
|     };
 | |
| 
 | |
|     let proxy = new Proxy(target, handler);
 | |
|     for (let i = 0; i < 1000; i++) {
 | |
|         let threw = false;
 | |
|         try {
 | |
|             proxy.x = 40;
 | |
|         } catch(e) {
 | |
|             assert(e.toString() === "TypeError: 'set' property of a Proxy's handler should be callable");
 | |
|             threw = true;
 | |
|         }
 | |
|         assert(threw);
 | |
|     }
 | |
| }
 | |
| 
 | |
| {
 | |
|     let target = {
 | |
|         x: 30
 | |
|     };
 | |
| 
 | |
|     let error = null;
 | |
|     let handler = {
 | |
|         get set() {
 | |
|             error = new Error;
 | |
|             throw error;
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     let proxy = new Proxy(target, handler);
 | |
|     for (let i = 0; i < 1000; i++) {
 | |
|         let threw = false;
 | |
|         try {
 | |
|             proxy.x = 40;
 | |
|         } catch(e) {
 | |
|             assert(e === error);
 | |
|             threw = true;
 | |
|         }
 | |
|         assert(threw);
 | |
|         error = null;
 | |
|     }
 | |
| }
 | |
| 
 | |
| {
 | |
|     let target = {
 | |
|         x: 30
 | |
|     };
 | |
| 
 | |
|     let error = null;
 | |
|     let handler = {
 | |
|         set: function() {
 | |
|             error = new Error;
 | |
|             throw error;
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     let proxy = new Proxy(target, handler);
 | |
|     for (let i = 0; i < 1000; i++) {
 | |
|         let threw = false;
 | |
|         try {
 | |
|             proxy.x = 40;
 | |
|         } catch(e) {
 | |
|             assert(e === error);
 | |
|             threw = true;
 | |
|         }
 | |
|         assert(threw);
 | |
|         error = null;
 | |
|     }
 | |
| }
 | |
| 
 | |
| {
 | |
|     let target = { };
 | |
|     Object.defineProperty(target, "x", {
 | |
|         configurable: false,
 | |
|         writable: false,
 | |
|         value: 500
 | |
|     });
 | |
| 
 | |
|     let called = false;
 | |
|     let handler = {
 | |
|         set: function(theTarget, propName, value, receiver) {
 | |
|             assert(theTarget === target);
 | |
|             called = true;
 | |
|             theTarget[propName] = value;
 | |
|             return false;    
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     let proxy = new Proxy(target, handler);
 | |
|     for (let i = 0; i < 1000; i++) {
 | |
|         proxy.x = 40;
 | |
|         assert(called);
 | |
|         assert(proxy.x === 500);
 | |
|         assert(target.x === 500);
 | |
|         called = false;
 | |
|     }
 | |
| }
 | |
| 
 | |
| {
 | |
|     let target = { };
 | |
|     Object.defineProperty(target, "x", {
 | |
|         configurable: false,
 | |
|         writable: false,
 | |
|         value: 500
 | |
|     });
 | |
| 
 | |
|     let handler = {
 | |
|         set: function(theTarget, propName, value, receiver) {
 | |
|             assert(theTarget === target);
 | |
|             theTarget[propName] = value;
 | |
|             return true;
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     let proxy = new Proxy(target, handler);
 | |
|     for (let i = 0; i < 1000; i++) {
 | |
|         let threw = false;
 | |
|         try {
 | |
|             proxy.x = 40;
 | |
|         } catch(e) {
 | |
|             threw = true;
 | |
|             assert(e.toString() === "TypeError: Proxy handler's 'set' on a non-configurable and non-writable property on 'target' should either return false or be the same value already on the 'target'");
 | |
|         }
 | |
|         assert(threw);
 | |
|     }
 | |
| }
 | |
| 
 | |
| {
 | |
|     let target = { };
 | |
|     Object.defineProperty(target, "x", {
 | |
|         configurable: false,
 | |
|         get: function() {
 | |
|             return 25;
 | |
|         }
 | |
|     });
 | |
| 
 | |
|     let called = false;
 | |
|     let handler = {
 | |
|         set: function(theTarget, propName, value, receiver) {
 | |
|             assert(theTarget === target);
 | |
|             called = true;
 | |
|             theTarget[propName] = value;
 | |
|             return false;
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     let proxy = new Proxy(target, handler);
 | |
|     for (let i = 0; i < 1000; i++) {
 | |
|         proxy.x = 40;
 | |
|         assert(proxy.x === 25);
 | |
|         assert(called);
 | |
|         called = false;
 | |
|     }
 | |
| }
 | |
| 
 | |
| {
 | |
|     let target = { };
 | |
|     Object.defineProperty(target, "x", {
 | |
|         configurable: false,
 | |
|         get: function() {
 | |
|             return 25;
 | |
|         }
 | |
|     });
 | |
| 
 | |
|     let called = false;
 | |
|     let handler = {
 | |
|         set: function(theTarget, propName, value, receiver) {
 | |
|             assert(theTarget === target);
 | |
|             called = true;
 | |
|             theTarget[propName] = value;
 | |
|             return true;
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     let proxy = new Proxy(target, handler);
 | |
|     for (let i = 0; i < 1000; i++) {
 | |
|         let threw = false;
 | |
|         try {
 | |
|             proxy.x = 40;
 | |
|         } catch(e) {
 | |
|             threw = true;
 | |
|             assert(e.toString() === "TypeError: Proxy handler's 'set' method on a non-configurable accessor property without a setter should return false");
 | |
|         }
 | |
|         assert(threw);
 | |
|     }
 | |
| }
 | |
| 
 | |
| {
 | |
|     let target = { };
 | |
|     Object.defineProperty(target, "x", {
 | |
|         configurable: false,
 | |
|         writable: true,
 | |
|         value: 50
 | |
|     });
 | |
| 
 | |
|     let called = false;
 | |
|     let handler = {
 | |
|         set: function(theTarget, propName, value, receiver) {
 | |
|             assert(theTarget === target);
 | |
|             called = true;
 | |
|             theTarget[propName] = value;
 | |
|             return true;
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     let proxy = new Proxy(target, handler);
 | |
|     for (let i = 0; i < 1000; i++) {
 | |
|         proxy.x = i;
 | |
|         assert(called);
 | |
|         assert(proxy.x === i);
 | |
|         assert(target.x === i);
 | |
|         called = false;
 | |
|     }
 | |
| }
 | |
| 
 | |
| {
 | |
|     let target = {
 | |
|         x: 30
 | |
|     };
 | |
| 
 | |
|     let called = false;
 | |
|     let handler = {
 | |
|         set: function(theTarget, propName, value, receiver) {
 | |
|             assert(target === theTarget);
 | |
|             assert(receiver === proxy);
 | |
|             called = true;
 | |
|             theTarget[propName] = value;
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     let proxy = new Proxy(target, handler);
 | |
|     for (let i = 0; i < 1000; i++) {
 | |
|         proxy.x = i;
 | |
|         assert(called);
 | |
|         assert(proxy.x === i);
 | |
|         assert(target.x === i);
 | |
|         called = false;
 | |
| 
 | |
|         proxy["y"] = i;
 | |
|         assert(called);
 | |
|         assert(proxy.y === i);
 | |
|         assert(target.y === i);
 | |
|         called = false;
 | |
|     }
 | |
| }
 | |
| 
 | |
| {
 | |
|     let target = {
 | |
|         x: 30
 | |
|     };
 | |
| 
 | |
|     let called = false;
 | |
|     let handler = {
 | |
|         set: function(theTarget, propName, value, receiver) {
 | |
|             assert(target === theTarget);
 | |
|             assert(receiver === proxy);
 | |
|             called = true;
 | |
|             theTarget[propName] = value;
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     let proxy = new Proxy(target, handler);
 | |
|     for (let i = 0; i < 1000; i++) {
 | |
|         proxy.x = i;
 | |
|         assert(called);
 | |
|         assert(proxy.x === i);
 | |
|         assert(target.x === i);
 | |
|         called = false;
 | |
| 
 | |
|         proxy["y"] = i;
 | |
|         assert(called);
 | |
|         assert(proxy.y === i);
 | |
|         assert(target.y === i);
 | |
|         called = false;
 | |
|     }
 | |
| }
 | |
| 
 | |
| {
 | |
|     let target = [];
 | |
| 
 | |
|     let called = false;
 | |
|     let handler = { };
 | |
| 
 | |
|     let proxy = new Proxy(target, handler);
 | |
|     for (let i = 0; i < 1000; i++) {
 | |
|         proxy[i] = i;
 | |
|         assert(proxy[i] === i);
 | |
|         assert(target[i] === i);
 | |
|     }
 | |
| }
 | |
| 
 | |
| {
 | |
|     let target = [];
 | |
| 
 | |
|     let called = false;
 | |
|     let handler = {
 | |
|         set: function(theTarget, propName, value, receiver) {
 | |
|             assert(target === theTarget);
 | |
|             assert(receiver === proxy);
 | |
|             called = true;
 | |
|             theTarget[propName] = value;
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     let proxy = new Proxy(target, handler);
 | |
|     for (let i = 0; i < 1000; i++) {
 | |
|         proxy[i] = i;
 | |
|         assert(proxy[i] === i);
 | |
|         assert(target[i] === i);
 | |
|         assert(called);
 | |
|         called = false;
 | |
|     }
 | |
| }
 | |
| 
 | |
| {
 | |
|     let target = [];
 | |
| 
 | |
|     let called = false;
 | |
|     let handler = {
 | |
|         set: function(theTarget, propName, value, receiver) {
 | |
|             assert(target === theTarget);
 | |
|             assert(receiver === proxy);
 | |
|             called = true;
 | |
|             theTarget[propName] = value;
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     let proxy = new Proxy(target, handler);
 | |
|     for (let i = 0; i < 1000; i++) {
 | |
|         proxy[i] = i;
 | |
|         assert(proxy[i] === i);
 | |
|         assert(target[i] === i);
 | |
|         assert(called);
 | |
|         called = false;
 | |
|     }
 | |
| }
 | |
| 
 | |
| {
 | |
|     let called = false;
 | |
|     let throughProxy = false;
 | |
|     let target = {
 | |
|         set x(v) {
 | |
|             assert(this === target);
 | |
|             this._x = v;
 | |
|             called = true;
 | |
|         },
 | |
|         get x() {
 | |
|             if (throughProxy)
 | |
|                 assert(this === proxy);
 | |
|             else
 | |
|                 assert(this === target);
 | |
|             return this._x;
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     let handler = {
 | |
|         set: function(theTarget, propName, value, receiver) {
 | |
|             assert(target === theTarget);
 | |
|             assert(receiver === proxy);
 | |
|             theTarget[propName] = value;
 | |
|             return true;
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     let proxy = new Proxy(target, handler);
 | |
|     for (let i = 0; i < 1000; i++) {
 | |
|         proxy.x = i;
 | |
|         assert(called);
 | |
|         throughProxy = true;
 | |
|         assert(proxy.x === i);
 | |
|         throughProxy = false;
 | |
|         assert(target.x === i);
 | |
|         assert(proxy._x === i);
 | |
|         assert(target._x === i);
 | |
|         called = false;
 | |
|     }
 | |
| }
 | |
| 
 | |
| {
 | |
|     let called = false;
 | |
|     let target = {};
 | |
|     let handler = {
 | |
|         set: function(theTarget, propName, value, receiver) {
 | |
|             assert(target === theTarget);
 | |
|             assert(receiver === obj);
 | |
|             theTarget[propName] = value;
 | |
|             called = true;
 | |
|             return true;
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     let proxy = new Proxy(target, handler);
 | |
|     let obj = Object.create(proxy, {
 | |
|         own: {
 | |
|             writable: true,
 | |
|             configurable: true,
 | |
|             value: null
 | |
|         }
 | |
|     });
 | |
|     for (let i = 0; i < 1000; i++) {
 | |
|         obj.own = i;
 | |
|         assert(!called);
 | |
|         assert(obj.own === i);
 | |
| 
 | |
|         obj.notOwn = i;
 | |
|         assert(target.notOwn === i);
 | |
|         assert(proxy.notOwn === i);
 | |
|         assert(obj.notOwn === i);
 | |
|         assert(called);
 | |
|         called = false;
 | |
|     }
 | |
| }
 | |
| 
 | |
| {
 | |
|     let target = {};
 | |
|     let handler = { };
 | |
| 
 | |
|     let proxy = new Proxy(target, handler);
 | |
|     let obj = Object.create(proxy, {
 | |
|         own: {
 | |
|             writable: true,
 | |
|             configurable: true,
 | |
|             value: null
 | |
|         }
 | |
|     });
 | |
|     for (let i = 0; i < 1000; i++) {
 | |
|         obj.own = i;
 | |
|         assert(obj.own === i);
 | |
|         assert(proxy.own === undefined);
 | |
| 
 | |
|         obj.notOwn = i;
 | |
|         // The receiver is always |obj|.
 | |
|         // obj.[[Set]](P, V, obj) -> Proxy.[[Set]](P, V, obj) -> target.[[Set]](P, V, obj)
 | |
|         assert(target.notOwn === undefined);
 | |
|         assert(proxy.notOwn === undefined);
 | |
|         assert(obj.notOwn === i);
 | |
|     }
 | |
| }
 | |
| 
 | |
| {
 | |
|     let called = false;
 | |
|     let target = {};
 | |
|     let handler = {
 | |
|         set: function(theTarget, propName, value, receiver) {
 | |
|             assert(target === theTarget);
 | |
|             assert(receiver === obj);
 | |
|             theTarget[propName] = value;
 | |
|             called = true;
 | |
|             return true;
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     let proxy = new Proxy(target, handler);
 | |
|     let obj = Object.create(proxy, {
 | |
|         [0]: {
 | |
|             writable: true,
 | |
|             configurable: true,
 | |
|             value: null
 | |
|         }
 | |
|     });
 | |
|     for (let i = 0; i < 1000; i++) {
 | |
|         obj[0] = i;
 | |
|         assert(!called);
 | |
|         assert(obj[0] === i);
 | |
|         assert(proxy[0] === undefined);
 | |
| 
 | |
|         obj[1] = i;
 | |
|         assert(target[1] === i);
 | |
|         assert(proxy[1] === i);
 | |
|         assert(obj[1] === i);
 | |
|         assert(called);
 | |
|         called = false;
 | |
|     }
 | |
| }
 | |
| 
 | |
| {
 | |
|     let target = {};
 | |
|     let handler = { };
 | |
| 
 | |
|     let proxy = new Proxy(target, handler);
 | |
|     let obj = Object.create(proxy, {
 | |
|         [0]: {
 | |
|             writable: true,
 | |
|             configurable: true,
 | |
|             value: null
 | |
|         }
 | |
|     });
 | |
|     for (let i = 0; i < 1000; i++) {
 | |
|         obj[0] = i;
 | |
|         assert(obj[0] === i);
 | |
|         assert(proxy[0] === undefined);
 | |
| 
 | |
|         obj[1] = i;
 | |
|         // The receiver is always |obj|.
 | |
|         // obj.[[Set]](P, V, obj) -> Proxy.[[Set]](P, V, obj) -> target.[[Set]](P, V, obj)
 | |
|         assert(target[1] === undefined);
 | |
|         assert(proxy[1] === undefined);
 | |
|         assert(obj[1] === i);
 | |
|     }
 | |
| }
 | |
| 
 | |
| {
 | |
|     let called = false;
 | |
|     let target = {};
 | |
|     let handler = {
 | |
|         set: function(theTarget, propName, value, receiver) {
 | |
|             assert(target === theTarget);
 | |
|             assert(receiver === obj);
 | |
|             theTarget[propName] = value;
 | |
|             called = true;
 | |
|             return true;
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     let proxy = new Proxy(target, handler);
 | |
|     let obj = Object.create(proxy, {
 | |
|         [0]: {
 | |
|             writable: true,
 | |
|             configurable: true,
 | |
|             value: null
 | |
|         }
 | |
|     });
 | |
|     for (let i = 0; i < 1000; i++) {
 | |
|         obj[0] = i;
 | |
|         assert(!called);
 | |
|         assert(obj[0] === i);
 | |
|         assert(proxy[0] === undefined);
 | |
| 
 | |
|         obj[1] = i;
 | |
|         assert(target[1] === i);
 | |
|         assert(proxy[1] === i);
 | |
|         assert(obj[1] === i);
 | |
|         assert(called);
 | |
|         called = false;
 | |
|     }
 | |
| }
 | |
| 
 | |
| {
 | |
|     let called = false;
 | |
|     let target = [25];
 | |
|     let handler = {
 | |
|         set: function(theTarget, propName, value, receiver) {
 | |
|             assert(target === theTarget);
 | |
|             assert(receiver === obj);
 | |
|             theTarget[propName] = value;
 | |
|             called = true;
 | |
|             return true;
 | |
|         }
 | |
|     };
 | |
| 
 | |
|     let proxy = new Proxy(target, handler);
 | |
|     let obj = Object.create(proxy, {
 | |
|         [0]: {
 | |
|             writable: true,
 | |
|             configurable: true,
 | |
|             value: null
 | |
|         }
 | |
|     });
 | |
|     for (let i = 0; i < 1000; i++) {
 | |
|         obj[0] = i;
 | |
|         assert(!called);
 | |
|         assert(obj[0] === i);
 | |
|         assert(proxy[0] === 25);
 | |
| 
 | |
|         obj[1] = i;
 | |
|         assert(target[1] === i);
 | |
|         assert(proxy[1] === i);
 | |
|         assert(obj[1] === i);
 | |
|         assert(called);
 | |
|         called = false;
 | |
|     }
 | |
| }
 | |
| 
 | |
| {
 | |
|     let called = false;
 | |
|     let ogTarget = {};
 | |
|     let target = new Proxy(ogTarget, {
 | |
|         set: function(theTarget, propName, value, receiver) {
 | |
|             assert(theTarget === ogTarget);
 | |
|             assert(receiver === obj);
 | |
|             called = true;
 | |
|             theTarget[propName] = value;
 | |
|         }
 | |
|     });
 | |
|     let handler = { };
 | |
| 
 | |
|     let proxy = new Proxy(target, handler);
 | |
|     let obj = Object.create(proxy, {
 | |
|         own: {
 | |
|             writable: true,
 | |
|             configurable: true,
 | |
|             value: null
 | |
|         }
 | |
|     });
 | |
|     for (let i = 0; i < 1000; i++) {
 | |
|         obj.own = i;
 | |
|         assert(!called);
 | |
|         assert(obj.own === i);
 | |
|         assert(proxy.own === undefined);
 | |
| 
 | |
|         obj.notOwn = i;
 | |
|         assert(target.notOwn === i);
 | |
|         assert(proxy.notOwn === i);
 | |
|         assert(obj.notOwn === i);
 | |
|         assert(called);
 | |
|         called = false;
 | |
|     }
 | |
| }
 | |
| 
 | |
| {
 | |
|     let called = false;
 | |
|     let ogTarget = [25];
 | |
|     let target = new Proxy(ogTarget, {
 | |
|         set: function(theTarget, propName, value, receiver) {
 | |
|             assert(theTarget === ogTarget);
 | |
|             assert(receiver === obj);
 | |
|             called = true;
 | |
|             theTarget[propName] = value;
 | |
|         }
 | |
|     });
 | |
|     let handler = { };
 | |
| 
 | |
|     let proxy = new Proxy(target, handler);
 | |
|     let obj = Object.create(proxy, {
 | |
|         [0]: {
 | |
|             writable: true,
 | |
|             configurable: true,
 | |
|             value: null
 | |
|         }
 | |
|     });
 | |
|     for (let i = 0; i < 1000; i++) {
 | |
|         obj[0] = i;
 | |
|         assert(!called);
 | |
|         assert(obj[0] === i);
 | |
|         assert(proxy[0] === 25);
 | |
| 
 | |
|         obj[1] = i;
 | |
|         assert(target[1] === i);
 | |
|         assert(proxy[1] === i);
 | |
|         assert(obj[1] === i);
 | |
|         assert(called);
 | |
|         called = false;
 | |
|     }
 | |
| }
 |