blob: bd70f1901dc74fd3f7166c1f89a0bba272d8c98f [file] [log] [blame]
// Copyright 2017 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
(function TestThrowBeforeLengthToPrimitive() {
// From 22.2.4.5 TypedArray ( buffer [ , byteOffset [ , length ] ] ), check
// that step 7:
// If offset modulo elementSize ≠ 0, throw a RangeError exception.
// happens before step 11:
// Let newLength be ? ToIndex(length).
var expected = ["offset.toPrimitive"];
var actual = [];
var offset = {};
offset[Symbol.toPrimitive] = function() {
actual.push("offset.toPrimitive");
return 1;
};
var length = {};
length[Symbol.toPrimitive] = function() {
actual.push("length.toPrimitive");
return 1;
};
var buffer = new ArrayBuffer(16);
assertThrows(function() {
new Uint32Array(buffer, offset, length)
}, RangeError);
assertEquals(expected, actual);
})();
(function TestConstructByBufferToPrimitiveOrdering() {
var expected = ["offset.toPrimitive", "length.toPrimitive"];
var actual = [];
var offset = {};
offset[Symbol.toPrimitive] = function() {
actual.push("offset.toPrimitive");
return 1;
};
var length = {};
length[Symbol.toPrimitive] = function() {
actual.push("length.toPrimitive");
return 1;
};
var buffer = new ArrayBuffer(16);
var arr = new Uint8Array(buffer, offset, length);
assertEquals(expected, actual);
assertEquals(1, arr.length);
})();
(function TestByteOffsetToIndexThrowsForNegative() {
var buffer = new ArrayBuffer(16);
assertThrows(function() {
new Uint8Array(buffer, -1);
}, RangeError);
})();
(function TestByArrayLikeObservableOrdering() {
var expected = [
'proxy.Symbol(Symbol.iterator)', 'proxy.length', 'proxy.0', 'proxy.1',
'proxy.2'
];
var actual = [];
var a = [1, 2, 3];
var proxy = new Proxy(a, {
get: function(target, name) {
actual.push("proxy." + name.toString());
if (name === Symbol.iterator) return undefined;
return target[name];
}
});
var arr = new Uint8Array(proxy);
assertEquals(a.length, arr.length);
assertEquals(expected, actual);
})();