Chromium Code Reviews| Index: test/mjsunit/harmony/proxies-define-property.js |
| diff --git a/test/mjsunit/harmony/proxies-define-property.js b/test/mjsunit/harmony/proxies-define-property.js |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..a10388647ca43cb0bbe2204ebd7524bcf64e272f |
| --- /dev/null |
| +++ b/test/mjsunit/harmony/proxies-define-property.js |
| @@ -0,0 +1,69 @@ |
| +// Copyright 2015 the V8 project authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +// Flags: --harmony-proxies |
| + |
| +// Check basic call to trap. |
| + |
| +var g_target, g_name, g_desc; |
| +var handler = { |
| + defineProperty: function(target, name, desc) { |
| + g_target = target; |
| + g_name = name; |
| + g_desc = desc; |
| + return true; |
| + } |
| +} |
| +var target = {} |
| +var proxy = new Proxy(target, handler); |
| +var desc = { value: 1, writable: true, configurable: true, enumerable: true }; |
| +Object.defineProperty(proxy, "foo", desc); |
| +assertSame(target, g_target); |
| +assertEquals("foo", g_name); |
| +assertEquals(desc, g_desc); |
| + |
| +// Check specific steps in the spec: |
| + |
| +// Step 6: Trap isn't callable. |
| +handler.defineProperty = 1; |
| +assertThrows("Object.defineProperty(proxy, 'foo', {value: 2})"); |
|
neis
2015/11/17 21:37:40
Here and below, check that it throws a TypeError.
Jakob Kummerow
2015/11/18 14:35:50
Done.
|
| + |
| +// Step 7: Trap is undefined. |
| +handler.defineProperty = undefined; |
| +Object.defineProperty(proxy, "prop1", desc); |
| +assertEquals(desc, Object.getOwnPropertyDescriptor(target, "prop1")); |
| +var target2 = {}; |
| +var proxy2 = new Proxy(target2, {}); |
| +Object.defineProperty(proxy2, "prop2", desc); |
| +assertEquals(desc, Object.getOwnPropertyDescriptor(target2, "prop2")); |
| + |
| +// Step 9: Property name is passed to the trap as a string. |
| +handler.defineProperty = function(t, name, d) { g_name = name; return true; }; |
| +Object.defineProperty(proxy, 0, desc); |
| +assertTrue(typeof g_name === "string"); |
| +assertEquals("0", g_name); |
| + |
| +// Step 10: Trap returns false. |
| +handler.defineProperty = function(t, n, d) { return false; } |
| +assertThrows("Object.defineProperty(proxy, 'foo', desc)"); |
| + |
| +// Step 15a: Trap returns true for adding a property to a non-extensible target. |
| +handler.defineProperty = function(t, n, d) { return true; } |
| +Object.freeze(target); |
| +assertThrows("Object.defineProperty(proxy, 'foo', desc)"); |
| + |
| +// Step 15b: Trap returns true for adding a non-configurable property. |
| +target = {}; |
| +desc = {value: 1, writable: true, configurable: false, enumerable: true}; |
| +assertThrows("Object.defineProperty(proxy, 'foo', desc)"); |
|
neis
2015/11/17 21:37:40
Maybe also test the special case of this special c
Jakob Kummerow
2015/11/18 14:35:50
Done.
|
| + |
| +// Step 16a: Trap returns true for non-compatible property descriptor. |
| +Object.defineProperty(target, "foo", |
| + {value: 1, writable: false, configurable: false}); |
| +assertThrows("Object.defineProperty(proxy, 'foo', {value: 2})"); |
| + |
| +// Step 16b: Trap returns true for overwriting a configurable property |
| +// with a non-configurable descriptor. |
| +target.bar = "baz"; |
| +assertThrows("Object.defineProperty(proxy, 'bar', {configurable: false})"); |