// Copyright (C) 2019 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: >
  Ordinary [[Set]] forwards call to Proxy "set" trap with correct arguments.
info: |
  OrdinarySet ( O, P, V, Receiver )

  ...
  3. Return OrdinarySetWithOwnDescriptor(O, P, V, Receiver, ownDesc).

  OrdinarySetWithOwnDescriptor ( O, P, V, Receiver, ownDesc )

  ...
  2. If ownDesc is undefined, then
    a. Let parent be ? O.[[GetPrototypeOf]]().
    b. If parent is not null, then
      i. Return ? parent.[[Set]](P, V, Receiver).

  [[Set]] ( P, V, Receiver )

  ...
  8. Let booleanTrapResult be ! ToBoolean(? Call(trap, handler, « target, P, V, Receiver »)).
  ...
  12. Return true.
includes: [proxyTrapsHelper.js]
features: [Proxy]
---*/

var _handler, _target, _prop, _value, _receiver;
var target = {};
var handler = allowProxyTraps({
  set: function(target, prop, value, receiver) {
    _handler = this;
    _target = target;
    _prop = prop;
    _value = value;
    _receiver = receiver;
    return true;
  },
});

var proxy = new Proxy(target, handler);
var receiver = Object.create(proxy);

receiver.prop = 'value';

assert.sameValue(_handler, handler, 'handler object is the trap context');
assert.sameValue(_target, target, 'first argument is the target object');
assert.sameValue(_prop, 'prop', 'second argument is the property name');
assert.sameValue(_value, 'value', 'third argument is the new value');
assert.sameValue(_receiver, receiver, 'fourth argument is the receiver object');
