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

(function StartNamedFunction() {
    const b = (new Builder())
        .Type().End()
        .Import()
            .Function("imp", "func", { params: ["i32"] })
        .End()
        .Function().End()
        .Start("foo").End()
        .Code()
            .Function("foo", { params: [] })
                .I32Const(42)
                .Call(0) // Calls func(42).
            .End()
        .End();
    const bin = b.WebAssembly().get();
    const module = new WebAssembly.Module(bin);
    let value = 0;
    const setter = v => value = v;
    const instance = new WebAssembly.Instance(module, { imp: { func: setter } });
    assert.eq(value, 42);
})();

(function InvalidStartFunctionIndex() {
    const b = (new Builder())
        .setChecked(false)
        .Type().End()
        .Function().End()
        .Start(0).End() // Invalid index.
        .Code().End();
    const bin = b.WebAssembly().get();
    assert.throws(() => new WebAssembly.Module(bin), Error, `WebAssembly.Module doesn't parse at byte 17: Start index 0 exceeds function index space 0 (evaluating 'new WebAssembly.Module(bin)')`);
})();
