test262/test/built-ins/Array/length/define-own-prop-length-coercion-order-set.js
Rick Waldron 452c0e5c61
Automated assertion message update: Array * (#3140)
* Automated assertion message update: Array.from

* Automated assertion message update: Array.isArray

* Automated assertion message update: Array length property

* Automated assertion message update: Array.of

* Automated assertion message update: Array

* Automated assertion message update: Array.prototype.at

* Automated assertion message update: Array.prototype.concat

* Automated assertion message update: compareArray -> assert.compareArray
2021-08-10 14:51:54 -07:00

47 lines
1.4 KiB
JavaScript

// Copyright (C) 2020 Alexey Shvayka. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
author: André Bargull
esid: sec-arraysetlength
description: >
[[Value]] is coerced to number before current descriptor's [[Writable]] check.
info: |
ArraySetLength ( A, Desc )
[...]
3. Let newLen be ? ToUint32(Desc.[[Value]]).
4. Let numberLen be ? ToNumber(Desc.[[Value]]).
[...]
7. Let oldLenDesc be OrdinaryGetOwnProperty(A, "length").
[...]
12. If oldLenDesc.[[Writable]] is false, return false.
features: [Symbol, Symbol.toPrimitive, Reflect, Reflect.set]
includes: [compareArray.js]
---*/
var array = [1, 2, 3];
var hints = [];
var length = {};
length[Symbol.toPrimitive] = function(hint) {
hints.push(hint);
Object.defineProperty(array, "length", {writable: false});
return 0;
};
assert.throws(TypeError, function() {
"use strict";
array.length = length;
}, '`"use strict"; array.length = length` throws a TypeError exception');
assert.compareArray(hints, ["number", "number"], 'The value of hints is expected to be ["number", "number"]');
array = [1, 2, 3];
hints = [];
assert(
!Reflect.set(array, "length", length),
'The value of !Reflect.set(array, "length", length) is expected to be true'
);
assert.compareArray(hints, ["number", "number"], 'The value of hints is expected to be ["number", "number"]');