Checkpoint before integration and package validation. Assisted-by: SurmAgent:unknown [read] [edit] [bash]
88 lines
2.6 KiB
JavaScript
88 lines
2.6 KiB
JavaScript
// `set Iterator.prototype.constructor` must implement
|
|
// SetterThatIgnoresPrototypeProperties(%Iterator.prototype%, "constructor", v):
|
|
// it operates on `this` (the receiver), not on the value being assigned.
|
|
// https://tc39.es/ecma262/#sec-set-iterator.prototype.constructor
|
|
// https://tc39.es/ecma262/#sec-SetterThatIgnoresPrototypeProperties
|
|
import { assert, assertThrows } from "./assert.js";
|
|
|
|
const desc = Object.getOwnPropertyDescriptor(Iterator.prototype, "constructor");
|
|
const get = desc.get;
|
|
const set = desc.set;
|
|
|
|
assert(typeof get, "function");
|
|
assert(typeof set, "function");
|
|
assert(get !== set, true);
|
|
assert(get.length, 0);
|
|
assert(set.length, 1);
|
|
|
|
assert(get.call({}), Iterator);
|
|
assert(get.call(undefined), Iterator);
|
|
assert(Iterator.prototype.constructor, Iterator);
|
|
{
|
|
const o = {};
|
|
assert(get.call(o, 123), Iterator);
|
|
assert(Object.prototype.hasOwnProperty.call(o, "constructor"), false);
|
|
}
|
|
|
|
{
|
|
const o = {};
|
|
assert(set.call(o), undefined);
|
|
const d = Object.getOwnPropertyDescriptor(o, "constructor");
|
|
assert(d.value, undefined);
|
|
assert(d.writable, true);
|
|
assert(d.enumerable, true);
|
|
assert(d.configurable, true);
|
|
}
|
|
|
|
{
|
|
const o = {};
|
|
assert(set.call(o, 0), undefined);
|
|
// The value `v` need not be an object; a fresh data property is created.
|
|
const d = Object.getOwnPropertyDescriptor(o, "constructor");
|
|
assert(d.value, 0);
|
|
assert(d.writable, true);
|
|
assert(d.enumerable, true);
|
|
assert(d.configurable, true);
|
|
}
|
|
|
|
assertThrows(TypeError, () => set.call(undefined, 0));
|
|
assertThrows(TypeError, () => set.call(null, 0));
|
|
assertThrows(TypeError, () => set.call(1, 0));
|
|
assertThrows(TypeError, () => set.call("s", 0));
|
|
|
|
assertThrows(TypeError, () => set.call(Iterator.prototype, 0));
|
|
assert(Iterator.prototype.constructor, Iterator);
|
|
|
|
{
|
|
const o = {};
|
|
Object.defineProperty(o, "constructor", {
|
|
value: 1, writable: false, enumerable: true, configurable: true,
|
|
});
|
|
assertThrows(TypeError, () => set.call(o, 2));
|
|
assert(o.constructor, 1); // unchanged
|
|
}
|
|
|
|
{
|
|
const o = { constructor: 1 };
|
|
assert(set.call(o, 2), undefined);
|
|
assert(o.constructor, 2);
|
|
}
|
|
|
|
{
|
|
const o = Object.preventExtensions({});
|
|
assertThrows(TypeError, () => set.call(o, 0));
|
|
assert(Object.prototype.hasOwnProperty.call(o, "constructor"), false);
|
|
}
|
|
|
|
{
|
|
const it = Object.create(Iterator.prototype);
|
|
it.constructor = 42;
|
|
const d = Object.getOwnPropertyDescriptor(it, "constructor");
|
|
assert(d.value, 42);
|
|
assert(d.writable, true);
|
|
assert(d.enumerable, true);
|
|
assert(d.configurable, true);
|
|
assert(Iterator.prototype.constructor, Iterator);
|
|
}
|
|
|