text: // Copyright (C) 2020 Alexey Shvayka. All rights reserved.
  // This code is governed by the BSD license found in the LICENSE file.
  
  /*---
  esid: sec-proxy-object-internal-methods-and-internal-slots-set-p-v-receiver
  description: >
    If "set" trap is missing, the call is properly forwarded to ordinary
    [[Set]] that invokes [[GetOwnProperty]] and [[DefineOwnProperty]] methods
    on receiver (that is a Proxy itself) every time it is called.
    (integer index property name)
  info: |
    [[Set]] ( P, V, Receiver )
  
    [...]
    6. Let trap be ? GetMethod(handler, "set").
    7. If trap is undefined, then
      a. Return ? target.[[Set]](P, V, Receiver).
  
    OrdinarySetWithOwnDescriptor ( O, P, V, Receiver, ownDesc )
  
    [...]
    3. If IsDataDescriptor(ownDesc) is true, then
      [...]
      c. Let existingDescriptor be ? Receiver.[[GetOwnProperty]](P).
      d. If existingDescriptor is not undefined, then
        [...]
        iii. Let valueDesc be the PropertyDescriptor { [[Value]]: V }.
        iv. Return ? Receiver.[[DefineOwnProperty]](P, valueDesc).
      e. Else,
        i. Assert: Receiver does not currently have a property P.
        ii. Return ? CreateDataProperty(Receiver, P, V).
    [...]
  
    [[DefineOwnProperty]] ( P, Desc )
  
    [...]
    9. Let booleanTrapResult be ! ToBoolean(? Call(trap, handler, « target, P, descObj »)).
    [...]
    17. Return true.
  features: [Proxy, Reflect]
  includes: [compareArray.js]
  ---*/
  
  var getOwnPropertyKeys = [];
  var definePropertyKeys = [];
  
  var p = new Proxy({
    "0": null,
  }, {
    getOwnPropertyDescriptor: function(target, key) {
      getOwnPropertyKeys.push(key);
      return Reflect.getOwnPropertyDescriptor(target, key);
    },
    defineProperty: function(target, key, desc) {
      definePropertyKeys.push(key);
      return Reflect.defineProperty(target, key, desc);
    },
  });
  
  p[0] = true;
  p[0] = true;
  p["0"] = true;
  
  assert.compareArray(getOwnPropertyKeys, ["0", "0", "0"],
    "getOwnPropertyDescriptor: key present on [[ProxyTarget]]");
  assert.compareArray(definePropertyKeys, ["0", "0", "0"],
    "defineProperty: key present on [[ProxyTarget]]");
  
  getOwnPropertyKeys = [];
  definePropertyKeys = [];
  
  p[22] = false;
  p["22"] = false;
  p[22] = false;
  
  assert.compareArray(getOwnPropertyKeys, ["22", "22", "22"],
    "getOwnPropertyDescriptor: key absent on [[ProxyTarget]]");
  assert.compareArray(definePropertyKeys, ["22", "22", "22"],
    "defineProperty: key absent on [[ProxyTarget]]");
  