import * as assert from '../assert.js';
import Builder from '../Builder.js';

const $1 = new WebAssembly.Instance(new WebAssembly.Module((new Builder())
      .Type().End()
      .Function().End()
      .Table()
            .Table({initial: 20, maximum: 30, element: "anyref"})
      .End()
      .Export()
          .Function("set_tbl")
          .Function("get_tbl")
          .Function("tbl_is_null")
          .Function("set_tbl_null")
          .Table("tbl", 0)
      .End()
      .Code()
        .Function("set_tbl", { params: ["anyref"], ret: "void" })
          .I32Const(0)
          .GetLocal(0)
          .TableSet(0)
        .End()

        .Function("get_tbl", { params: [], ret: "anyref" })
          .I32Const(0)
          .TableGet(0)
        .End()

        .Function("tbl_is_null", { params: [], ret: "i32" })
            .Call(1)
            .RefIsNull()
        .End()

        .Function("set_tbl_null", { params: [], ret: "void" })
            .RefNull()
            .Call(0)
        .End()
      .End().WebAssembly().get()));

fullGC()

assert.eq($1.exports.get_tbl(), null)
assert.eq($1.exports.tbl_is_null(), 1)

$1.exports.set_tbl("hi")
fullGC()
assert.eq($1.exports.get_tbl(), "hi")
assert.eq($1.exports.tbl_is_null(), 0)

assert.eq($1.exports.tbl.get(0), "hi")
assert.eq($1.exports.tbl.get(1), null)

$1.exports.tbl.set(0, { test: "test" });
fullGC()
assert.eq($1.exports.get_tbl().test, "test")

assert.eq($1.exports.tbl.grow(10), 20)
assert.eq($1.exports.tbl.grow(0), 30)
assert.eq($1.exports.get_tbl().test, "test")
fullGC()
assert.eq($1.exports.get_tbl().test, "test")

assert.throws(() => new WebAssembly.Instance(new WebAssembly.Module((new Builder())
    .Type().End()
    .Function().End()
    .Table()
        .Table({initial: 3, maximum: 3, element: "anyref"})
    .End()
    .Element()
        .Element({tableIndex: 0, offset: 0, functionIndices: [0]})
    .End()
    .Code()
    .Function("ret42", { params: [], ret: "i32" })
      .I32Const(42)
    .End()
    .End().WebAssembly().get())), Error, "WebAssembly.Module doesn't parse at byte 30: Table 0 must have type 'funcref' to have an element section (evaluating 'new WebAssembly.Module')")

function doGCSet() {
    fullGC()
    $1.exports.set_tbl({ test: -1 })
    fullGC()
}

function doGCTest() {
    for (let i=0; i<1000; ++i) {
        assert.eq($1.exports.get_tbl().test, -1)
        fullGC()
    }
}

doGCSet()
doGCTest()

let count = 0

function doBarrierSet() {
    ++count
    $1.exports.set_tbl({ test: -count })
}

function doBarrierTest() {
    let garbage = { val: "hi", val2: 5, arr: [] }
    for (let i=0; i<100; ++i) garbage.arr += ({ field: i })

    for (let j=0; j<1000; ++j) {
        assert.eq($1.exports.get_tbl().test, -count)
        edenGC()
    }
}

for (let i=0; i<5; ++i) {
    doBarrierSet()
    doBarrierTest()
    doBarrierTest()
}
