mirror of
https://github.com/tc39/test262.git
synced 2025-07-29 00:44:32 +02:00
Improve Proxy/ownKeys invariants coverage (#2384)
* Add non-configurable invariant test * Add non-extensible invariant test
This commit is contained in:
parent
79591ae6c8
commit
1aac32e2f8
@ -0,0 +1,54 @@
|
|||||||
|
// Copyright (C) 2019 Alexey Shvayka. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
esid: sec-object.keys
|
||||||
|
description: >
|
||||||
|
Proxy [[OwnPropertyKeys]] trap does not skip non-enumerable keys when validating invariant:
|
||||||
|
* The result List must contain the keys of all non-configurable own properties of
|
||||||
|
the target object.
|
||||||
|
info: |
|
||||||
|
Object.keys ( O )
|
||||||
|
|
||||||
|
...
|
||||||
|
2. Let nameList be ? EnumerableOwnPropertyNames(obj, "key").
|
||||||
|
|
||||||
|
EnumerableOwnPropertyNames ( O, kind )
|
||||||
|
|
||||||
|
...
|
||||||
|
2. Let ownKeys be ? O.[[OwnPropertyKeys]]().
|
||||||
|
|
||||||
|
[[OwnPropertyKeys]] ( )
|
||||||
|
|
||||||
|
...
|
||||||
|
11. Let targetKeys be ? target.[[OwnPropertyKeys]]().
|
||||||
|
...
|
||||||
|
15. Let targetNonconfigurableKeys be a new empty List.
|
||||||
|
16. For each element key of targetKeys, do
|
||||||
|
a. Let desc be ? target.[[GetOwnProperty]](key).
|
||||||
|
b. If desc is not undefined and desc.[[Configurable]] is false, then
|
||||||
|
i. Append key as an element of targetNonconfigurableKeys.
|
||||||
|
...
|
||||||
|
18. Let uncheckedResultKeys be a new List which is a copy of trapResult.
|
||||||
|
19. For each key that is an element of targetNonconfigurableKeys, do
|
||||||
|
a. If key is not an element of uncheckedResultKeys, throw a TypeError exception.
|
||||||
|
features: [Proxy]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var target = {};
|
||||||
|
Object.defineProperty(target, 'prop', {
|
||||||
|
value: 1,
|
||||||
|
writable: true,
|
||||||
|
enumerable: false,
|
||||||
|
configurable: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
var proxy = new Proxy(target, {
|
||||||
|
ownKeys: function() {
|
||||||
|
return [];
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.throws(TypeError, function() {
|
||||||
|
Object.keys(proxy);
|
||||||
|
});
|
@ -0,0 +1,56 @@
|
|||||||
|
// Copyright (C) 2019 Alexey Shvayka. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
|
/*---
|
||||||
|
esid: sec-object.keys
|
||||||
|
description: >
|
||||||
|
Proxy [[OwnPropertyKeys]] trap does not skip non-enumerable keys when validating invariant:
|
||||||
|
* If the target object is not extensible, then the result List must contain all the keys of
|
||||||
|
the own properties of the target object and no other values.
|
||||||
|
info: |
|
||||||
|
Object.keys ( O )
|
||||||
|
|
||||||
|
...
|
||||||
|
2. Let nameList be ? EnumerableOwnPropertyNames(obj, "key").
|
||||||
|
|
||||||
|
EnumerableOwnPropertyNames ( O, kind )
|
||||||
|
|
||||||
|
...
|
||||||
|
2. Let ownKeys be ? O.[[OwnPropertyKeys]]().
|
||||||
|
|
||||||
|
[[OwnPropertyKeys]] ( )
|
||||||
|
|
||||||
|
...
|
||||||
|
11. Let targetKeys be ? target.[[OwnPropertyKeys]]().
|
||||||
|
16. For each element key of targetKeys, do
|
||||||
|
a. Let desc be ? target.[[GetOwnProperty]](key).
|
||||||
|
b. If desc is not undefined and desc.[[Configurable]] is false, then
|
||||||
|
...
|
||||||
|
c. Else,
|
||||||
|
i. Append key as an element of targetConfigurableKeys.
|
||||||
|
...
|
||||||
|
18. Let uncheckedResultKeys be a new List which is a copy of trapResult.
|
||||||
|
...
|
||||||
|
21. For each key that is an element of targetConfigurableKeys, do
|
||||||
|
a. If key is not an element of uncheckedResultKeys, throw a TypeError exception.
|
||||||
|
features: [Proxy]
|
||||||
|
---*/
|
||||||
|
|
||||||
|
var target = {};
|
||||||
|
Object.defineProperty(target, 'prop', {
|
||||||
|
value: 2,
|
||||||
|
writable: true,
|
||||||
|
enumerable: false,
|
||||||
|
configurable: true,
|
||||||
|
});
|
||||||
|
Object.preventExtensions(target);
|
||||||
|
|
||||||
|
var proxy = new Proxy(target, {
|
||||||
|
ownKeys: function() {
|
||||||
|
return [];
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
assert.throws(TypeError, function() {
|
||||||
|
Object.keys(proxy);
|
||||||
|
});
|
Loading…
x
Reference in New Issue
Block a user