import { eq as assertEq, throws as assertThrows } from "../assert.js";
const pageSize = 64*1024;

let buffers = [];
for (let i = 0; i < 100; i++) {
    const max = 5;
    let pageCount = 1;
    let x = new WebAssembly.Memory({initial: 1, maximum: max});
    for (let i = 0; i < (max - 1); i++) {
        let int8Array = new Uint8Array(x.buffer);

        for (let i = 0; i < pageSize; i++) {
            assertEq(int8Array[pageSize*(pageCount - 1) + i], 0);
            int8Array[pageSize*(pageCount - 1) + i] = pageCount;
        }

        for (let i = 0; i < pageCount; i++) {
            for (let j = 0; j < pageSize; j++) {
                assertEq(int8Array[i * pageSize + j], i + 1);
            }
        }

        let buffer = x.buffer;
        assertEq(buffer.byteLength, pageCount * pageSize);
        buffers.push(buffer);
        let previousPageSize = x.grow(1);
        assertEq(buffer.byteLength, 0);
        assertEq(previousPageSize, pageCount);
        ++pageCount;
    }
}

for (let buffer of buffers) {
    assertEq(buffer.byteLength, 0);
}

{
    const memory = new WebAssembly.Memory({initial: 1, maximum: 5});
    let buffer = memory.buffer;
    assertEq(buffer.byteLength, 1*64*1024);
    memory.grow(1);
    assertEq(buffer.byteLength, 0);

    buffer = memory.buffer;
    assertEq(buffer.byteLength, 2*64*1024);

    // This shouldn't neuter the buffer since it fails.
    assertThrows(() => memory.grow(1000), RangeError, "WebAssembly.Memory.grow would exceed the memory's declared maximum size");
    assertEq(buffer.byteLength, 2*64*1024);
    assertEq(memory.buffer, buffer);
}
