// Step 1.
test(function() {
    assert_throws_dom("TypeMismatchError", function() {
        self.crypto.getRandomValues(new Float16Array(6))
    }, "Float16Array")

    assert_throws_dom("TypeMismatchError", function() {
        const len = 65536 / Float16Array.BYTES_PER_ELEMENT + 1;
        self.crypto.getRandomValues(new Float16Array(len));
    }, "Float16Array (too long)")
}, "Float16 arrays");

test(function() {
    assert_throws_dom("TypeMismatchError", function() {
        self.crypto.getRandomValues(new Float32Array(6))
    }, "Float32Array")
    assert_throws_dom("TypeMismatchError", function() {
        self.crypto.getRandomValues(new Float64Array(6))
    }, "Float64Array")

    assert_throws_dom("TypeMismatchError", function() {
        const len = 65536 / Float32Array.BYTES_PER_ELEMENT + 1;
        self.crypto.getRandomValues(new Float32Array(len));
    }, "Float32Array (too long)")
    assert_throws_dom("TypeMismatchError", function() {
        const len = 65536 / Float64Array.BYTES_PER_ELEMENT + 1;
        self.crypto.getRandomValues(new Float64Array(len))
    }, "Float64Array (too long)")
}, "Float arrays");

test(function() {
    assert_throws_dom("TypeMismatchError", function() {
        self.crypto.getRandomValues(new DataView(new ArrayBuffer(6)))
    }, "DataView")

    assert_throws_dom("TypeMismatchError", function() {
        self.crypto.getRandomValues(new DataView(new ArrayBuffer(65536 + 1)))
    }, "DataView (too long)")
}, "DataView");

const arrays = [
    'Int8Array',
    'Int16Array',
    'Int32Array',
    'BigInt64Array',
    'Uint8Array',
    'Uint8ClampedArray',
    'Uint16Array',
    'Uint32Array',
    'BigUint64Array',
];

for (const array of arrays) {
    const ctor = globalThis[array];

    test(function() {
        assert_equals(self.crypto.getRandomValues(new ctor(8)).constructor,
                      ctor, "crypto.getRandomValues(new " + array + "(8))")
    }, "Integer array: " + array);

    test(function() {
        const maxlength = 65536 / ctor.BYTES_PER_ELEMENT;
        assert_throws_quotaexceedederror(() => {
            self.crypto.getRandomValues(new ctor(maxlength + 1));
        }, null, null, "crypto.getRandomValues length over 65536");
    }, "Large length: " + array);

    test(function() {
        assert_true(self.crypto.getRandomValues(new ctor(0)).length == 0)
    }, "Null arrays: " + array);

    test(function() {
        class Buffer extends ctor {}
        // Must not throw for the test to pass
        self.crypto.getRandomValues(new Buffer(256));
    }, "Subclass of " + array);
}
