description("Test ensures Reflect.set functionality with DOM objects.");

debug("CustomAccessor setters for DOM objects. These setters are treated as setters in ECMA262. Reflect.set returns true because a setter is found.");
shouldBe(`Reflect.set(document.body, "scrollTop", "#Hello")`, `true`);
shouldNotBe(`Reflect.get(document.body, "scrollTop")`, `"#Hello"`);
shouldBe(`Reflect.set(document.body, "scrollTop", 0)`, `true`);
shouldBe(`Reflect.get(document.body, "scrollTop")`, `0`);
var receiver = {};
shouldThrow(`Reflect.set(document.body, "scrollTop", "Cocoa", receiver)`);
shouldBe(`Reflect.get(document.body, "scrollTop")`, `0`);
shouldBe(`Reflect.get(receiver, "scrollTop")`, `undefined`);

debug("CustomAccessor with ReadOnly");
shouldBe(`Reflect.set(document, "compatMode", false)`, `false`);
shouldBe(`Reflect.get(document, "compatMode")`, `"BackCompat"`);
var receiver = {};
shouldBe(`Reflect.set(document, "compatMode", false, receiver)`, `false`);
shouldBe(`Reflect.get(document, "compatMode")`, `"BackCompat"`);
shouldBe(`Reflect.get(receiver, "compatMode")`, `undefined`);

debug("CustomAccessor without setter for DOM objects");
shouldBe(`Reflect.set(window.history, "length", "http://www.example.com")`, `false`);
shouldNotBe(`Reflect.get(window.history, "length")`, `"http://www.example.com"`);
var receiver = {};
shouldBe(`Reflect.set(window.history, "length", "http://www.example.com", receiver)`, `false`);
shouldNotBe(`Reflect.get(window.history, "length")`, `"http://www.example.com"`);
shouldBe(`Reflect.get(receiver, "length")`, `undefined`);

debug("CustomValue setters.");
shouldBe(`Reflect.set(window, "Event", "http://www.example.com")`, `true`);
shouldBe(`Reflect.get(window, "Event")`,  `"http://www.example.com"`);
var receiver = {};
shouldBe(`Reflect.set(window, "MessageEvent", "http://www.example.com", receiver)`, `true`);
shouldNotBe(`Reflect.get(window, "MessageEvent")`, `"http://www.example.com"`);
shouldBe(`Reflect.get(receiver, "MessageEvent")`, `"http://www.example.com"`);

debug("CustomValue setters with writable=false.");
var originalMouseEvent = MouseEvent;
shouldBe(`Reflect.defineProperty(window, "MouseEvent", {
    writable: false
})`, `true`);
shouldBe(`Reflect.set(window, "MouseEvent", "http://www.example.com")`, `false`);
shouldBe(`Reflect.get(window, "MouseEvent")`, `originalMouseEvent`);
var receiver = {};
shouldBe(`Reflect.set(window, "MouseEvent", "http://www.example.com", receiver)`, `false`);
shouldBe(`Reflect.get(window, "MouseEvent")`, `originalMouseEvent`);
shouldBe(`Reflect.get(receiver, "MouseEvent")`, `undefined`);

debug("putDelegate CustomAccessor setters for DOM objects.");
shouldBe(`Reflect.set(document.location, "hash", "#Hello")`, `true`);
shouldBe(`Reflect.get(document.location, "hash")`, `"#Hello"`);
shouldBe(`Reflect.set(document.location, "hash", "#OUT")`, `true`);
shouldBe(`Reflect.get(document.location, "hash")`, `"#OUT"`);
shouldBe(`Reflect.set(document.location, 0, "#Hello")`, `true`);
shouldBe(`Reflect.get(document.location, 0)`, `"#Hello"`);
shouldBe(`Reflect.set(document.location, 0, "#OUT")`, `true`);
shouldBe(`Reflect.get(document.location, 0)`, `"#OUT"`);
var receiver = {};
shouldThrow(`Reflect.set(document.location, "hash", "#Hello", receiver)`);
shouldBe(`Reflect.get(document.location, "hash")`, `"#OUT"`);
shouldBe(`Reflect.get(receiver, "hash")`, `undefined`);
shouldBe(`Reflect.set(document.location, 0, "#Hello", receiver)`, `true`);
shouldBe(`Reflect.get(document.location, 0)`, `"#OUT"`);
shouldBe(`Reflect.get(receiver, 0)`, `"#Hello"`);

debug("putDelegate CustomAccessor without setter for DOM objects");
shouldBe(`Reflect.set(document.location, "origin", "http://www.example.com")`, `false`);
shouldNotBe(`Reflect.get(document.location, "origin")`, `"http://www.example.com"`);
var receiver = {};
shouldBe(`Reflect.set(document.location, "origin", "http://www.example.com", receiver)`, `false`);
shouldNotBe(`Reflect.get(document.location, "origin")`, `"http://www.example.com"`);
shouldBe(`Reflect.get(receiver, "origin")`, `undefined`);

debug("NPAPI object with Reflect.set");
var npobject = document.getElementById("testPlugin");
shouldBe(`Reflect.set(npobject, "Cocoa", "Sweet")`, `true`);
shouldBe(`Reflect.get(npobject, "Cocoa")`, `"Sweet"`);
var receiver = {};
shouldBe(`Reflect.set(npobject, "Cocoa", "OK", receiver)`, `true`);
shouldBe(`Reflect.get(npobject, "Cocoa")`, `"Sweet"`);
shouldBe(`Reflect.get(receiver, "Cocoa")`, `"OK"`);

shouldBe(`Reflect.defineProperty(npobject, "Cocoa", {
    writable: false
})`, `true`);
shouldBe(`Reflect.set(npobject, "Cocoa", "Hello")`, `false`);
shouldBe(`Reflect.get(npobject, "Cocoa")`, `"Sweet"`);
var receiver = {};
shouldBe(`Reflect.set(npobject, "Cocoa", "OK", receiver)`, `false`);
shouldBe(`Reflect.get(npobject, "Cocoa")`, `"Sweet"`);
shouldBe(`Reflect.get(receiver, "Cocoa")`, `undefined`);

shouldBe(`Reflect.set(npobject, 0, "Sweet")`, `true`);
shouldBe(`Reflect.get(npobject, 0)`, `"Sweet"`);
var receiver = {};
shouldBe(`Reflect.set(npobject, 0, "OK", receiver)`, `true`);
shouldBe(`Reflect.get(npobject, 0)`, `"Sweet"`);
shouldBe(`Reflect.get(receiver, 0)`, `"OK"`);

shouldBe(`Reflect.defineProperty(npobject, 0, {
    writable: false
})`, `true`);
shouldBe(`Reflect.set(npobject, 0, "Hello")`, `false`);
shouldBe(`Reflect.get(npobject, 0)`, `"Sweet"`);
var receiver = {};
shouldBe(`Reflect.set(npobject, 0, "OK", receiver)`, `false`);
shouldBe(`Reflect.get(npobject, 0)`, `"Sweet"`);
shouldBe(`Reflect.get(receiver, 0)`, `undefined`);

debug("DOMStringMap");
document.body.setAttribute("data-cocoa", "cappuccino");
shouldBe(`Reflect.get(document.body.dataset, "cocoa")`, `"cappuccino"`);
shouldBe(`Reflect.set(document.body.dataset, "cocoa", "sweet")`, `true`);
shouldBe(`Reflect.get(document.body.dataset, "cocoa")`, `"sweet"`);
shouldThrow(`Reflect.set(document.body.dataset, "cocoa-cappuccino", "sweet")`);
shouldBe(`Reflect.set(document.body.dataset, 0, "sweet")`, `true`);
shouldBe(`Reflect.get(document.body.dataset, 0)`, `"sweet"`);

debug("DOMStringMap falls back to OrdinarySet if receiver is altered.");
var receiver = {};
shouldBe(`Reflect.set(document.body.dataset, "cocoa", "ok", receiver)`, `true`);
shouldBe(`Reflect.get(document.body.dataset, "cocoa")`, `"sweet"`);
shouldBe(`Reflect.get(receiver, "cocoa")`, `"ok"`);
var receiver = {};
shouldBe(`Reflect.set(document.body.dataset, 0, "ok", receiver)`, `true`);
shouldBe(`Reflect.get(document.body.dataset, 0)`, `"sweet"`);
shouldBe(`Reflect.get(receiver, 0)`, `"ok"`);

debug("CustomIndexedSetter");
var select = document.getElementById("testSelect");
shouldBe(`Reflect.get(select, 0).value`, `"cocoa"`);
shouldBe(`Reflect.get(select, "length")`, `3`);
var option = document.createElement("option");
option.value = "mocha";
option.textContent = "Mocha";
shouldBe(`Reflect.set(select, 0, option)`, `true`);
shouldBe(`Reflect.get(select, 0).value`, `"mocha"`);
shouldBe(`Reflect.get(select, "length")`, `3`);
shouldBe(`Reflect.set(select, 42, option)`, `true`);
shouldBe(`Reflect.get(select, "length")`, `42`);  // Update validity prevent us to insert duplicate options.

var option2 = document.createElement("option");
option2.value = "kilimanjaro";
option2.textContent = "Kilimanjaro";
shouldBe(`Reflect.set(select, 44, option2)`, `true`);
shouldBe(`Reflect.get(select, 44).value`, `"kilimanjaro"`);
shouldThrow(`Reflect.set(select, 20, "Kilimanjaro")`);

debug("CustomIndexedSetter falls back to OrdinarySet if receiver is altered.");
var option3 = document.createElement("option");
option3.value = "rabbit";
option3.textContent = "Rabbit";
var receiver = {};
shouldBe(`Reflect.set(select, 0, option3, receiver)`, `true`);
shouldBe(`Reflect.get(receiver, 0)`, `option3`);
shouldBe(`Reflect.get(select, 0)`, `select.children[0]`);
