mirror of
				https://github.com/tc39/test262.git
				synced 2025-11-03 21:24:30 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			169 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			169 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
// Copyright (C) 2017 Caitlin Potter. All rights reserved.
 | 
						|
// This code is governed by the BSD license found in the LICENSE file.
 | 
						|
 | 
						|
/*---
 | 
						|
esid: sec-object.keys
 | 
						|
description: >
 | 
						|
  Object.keys() observably performs [[GetOwnProperty]]
 | 
						|
info: |
 | 
						|
  19.1.2.16 Object.keys ( O )
 | 
						|
 | 
						|
  1. Let obj be ? ToObject(O).
 | 
						|
  2. Let nameList be ? EnumerableOwnProperties(obj, "key").
 | 
						|
  ...
 | 
						|
 | 
						|
  7.3.21 EnumerableOwnProperties ( O, kind )
 | 
						|
 | 
						|
  1. Assert: Type(O) is Object.
 | 
						|
  2. Let ownKeys be ? O.[[OwnPropertyKeys]]().
 | 
						|
  3. Let properties be a new empty List.
 | 
						|
  4. For each element key of ownKeys in List order, do
 | 
						|
    a. If Type(key) is String, then
 | 
						|
      i. Let desc be ? O.[[GetOwnProperty]](key).
 | 
						|
      ...
 | 
						|
features: [Symbol]
 | 
						|
---*/
 | 
						|
 | 
						|
let log = [];
 | 
						|
let s = Symbol("test");
 | 
						|
let target = {
 | 
						|
  x: true
 | 
						|
};
 | 
						|
 | 
						|
let ownKeys = {
 | 
						|
  get length() {
 | 
						|
    log.push({
 | 
						|
      name: "get ownKeys['length']",
 | 
						|
      receiver: this
 | 
						|
    });
 | 
						|
    return 3;
 | 
						|
  },
 | 
						|
 | 
						|
  get 0() {
 | 
						|
    log.push({
 | 
						|
      name: "get ownKeys[0]",
 | 
						|
      receiver: this
 | 
						|
    });
 | 
						|
    return "a";
 | 
						|
  },
 | 
						|
 | 
						|
  get 1() {
 | 
						|
    log.push({
 | 
						|
      name: "get ownKeys[1]",
 | 
						|
      receiver: this
 | 
						|
    });
 | 
						|
    return s;
 | 
						|
  },
 | 
						|
 | 
						|
  get 2() {
 | 
						|
    log.push({
 | 
						|
      name: "get ownKeys[2]",
 | 
						|
      receiver: this
 | 
						|
    });
 | 
						|
    return "b";
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
let ownKeysDescriptors = {
 | 
						|
  "a": {
 | 
						|
    enumerable: true,
 | 
						|
    configurable: true,
 | 
						|
    value: 1
 | 
						|
  },
 | 
						|
 | 
						|
  "b": {
 | 
						|
    enumerable: false,
 | 
						|
    configurable: true,
 | 
						|
    value: 2
 | 
						|
  },
 | 
						|
 | 
						|
  [s]: {
 | 
						|
    enumerable: true,
 | 
						|
    configurable: true,
 | 
						|
    value: 3
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
let handler = {
 | 
						|
  get ownKeys() {
 | 
						|
    log.push({
 | 
						|
      name: "get handler.ownKeys",
 | 
						|
      receiver: this
 | 
						|
    });
 | 
						|
    return (...args) => {
 | 
						|
      log.push({
 | 
						|
        name: "call handler.ownKeys",
 | 
						|
        receiver: this,
 | 
						|
        args
 | 
						|
      });
 | 
						|
      return ownKeys;
 | 
						|
    };
 | 
						|
  },
 | 
						|
 | 
						|
  get getOwnPropertyDescriptor() {
 | 
						|
    log.push({
 | 
						|
      name: "get handler.getOwnPropertyDescriptor",
 | 
						|
      receiver: this
 | 
						|
    });
 | 
						|
    return (...args) => {
 | 
						|
      log.push({
 | 
						|
        name: "call handler.getOwnPropertyDescriptor",
 | 
						|
        receiver: this,
 | 
						|
        args
 | 
						|
      });
 | 
						|
      const name = args[1];
 | 
						|
      return ownKeysDescriptors[name];
 | 
						|
    };
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
let proxy = new Proxy(target, handler);
 | 
						|
let keys = Object.keys(proxy);
 | 
						|
 | 
						|
assert.sameValue(log.length, 10);
 | 
						|
 | 
						|
assert.sameValue(log[0].name, "get handler.ownKeys");
 | 
						|
assert.sameValue(log[0].receiver, handler);
 | 
						|
 | 
						|
assert.sameValue(log[1].name, "call handler.ownKeys");
 | 
						|
assert.sameValue(log[1].receiver, handler);
 | 
						|
assert.sameValue(log[1].args.length, 1);
 | 
						|
assert.sameValue(log[1].args[0], target);
 | 
						|
 | 
						|
// CreateListFromArrayLike(trapResultArray, « String, Symbol »).
 | 
						|
assert.sameValue(log[2].name, "get ownKeys['length']");
 | 
						|
assert.sameValue(log[2].receiver, ownKeys);
 | 
						|
 | 
						|
assert.sameValue(log[3].name, "get ownKeys[0]");
 | 
						|
assert.sameValue(log[3].receiver, ownKeys);
 | 
						|
 | 
						|
assert.sameValue(log[4].name, "get ownKeys[1]");
 | 
						|
assert.sameValue(log[4].receiver, ownKeys);
 | 
						|
 | 
						|
assert.sameValue(log[5].name, "get ownKeys[2]");
 | 
						|
assert.sameValue(log[5].receiver, ownKeys);
 | 
						|
 | 
						|
// Let desc be ? O.[[GetOwnProperty]]("a").
 | 
						|
assert.sameValue(log[6].name, "get handler.getOwnPropertyDescriptor");
 | 
						|
assert.sameValue(log[6].receiver, handler);
 | 
						|
 | 
						|
assert.sameValue(log[7].name, "call handler.getOwnPropertyDescriptor");
 | 
						|
assert.sameValue(log[7].receiver, handler);
 | 
						|
assert.sameValue(log[7].args.length, 2);
 | 
						|
assert.sameValue(log[7].args[0], target);
 | 
						|
assert.sameValue(log[7].args[1], "a");
 | 
						|
 | 
						|
// Let desc be ? O.[[GetOwnProperty]]("b").
 | 
						|
assert.sameValue(log[8].name, "get handler.getOwnPropertyDescriptor");
 | 
						|
assert.sameValue(log[8].receiver, handler);
 | 
						|
 | 
						|
assert.sameValue(log[9].name, "call handler.getOwnPropertyDescriptor");
 | 
						|
assert.sameValue(log[9].receiver, handler);
 | 
						|
assert.sameValue(log[9].args.length, 2);
 | 
						|
assert.sameValue(log[9].args[0], target);
 | 
						|
assert.sameValue(log[9].args[1], "b");
 | 
						|
 | 
						|
// "a" is the only enumerable String-keyed property.
 | 
						|
assert.sameValue(keys.length, 1);
 | 
						|
assert.sameValue(keys[0], "a");
 |