import Builder from '../Builder.js'; import * as assert from '../assert.js'; assert.throws(() => WebAssembly.Module.customSections(undefined, ""), TypeError, `WebAssembly.Module.customSections called with non WebAssembly.Module argument`); assert.eq(WebAssembly.Module.customSections.length, 2); { const empty = new WebAssembly.Module((new Builder()).WebAssembly().get()); assert.isArray(WebAssembly.Module.customSections(empty, "")); assert.eq(WebAssembly.Module.customSections(empty, "").length, 0); } { const single = new WebAssembly.Module((new Builder()) .Unknown("hello").Byte(0x00).Byte(0x42).Byte(0xFF).End() .WebAssembly().get()); assert.eq(WebAssembly.Module.customSections(single, "").length, 0); const hello = WebAssembly.Module.customSections(single, "hello"); assert.eq(hello.length, 1); assert.eq(hello[0].byteLength, 3); const helloI8 = new Int8Array(hello[0]); assert.eq(helloI8[0], 0x00); assert.eq(helloI8[1], 0x42); assert.eq(helloI8[2], -1); } { const unicode = new WebAssembly.Module((new Builder()) .Unknown("👨‍❤️‍💋‍👨").Byte(42).End() .WebAssembly().get()); const family = WebAssembly.Module.customSections(unicode, "👨‍❤️‍💋‍👨"); assert.eq(family.length, 1); assert.eq(family[0].byteLength, 1); const familyI8 = new Int8Array(family[0]); assert.eq(familyI8[0], 42); } { const many = new WebAssembly.Module((new Builder()) .Unknown("zero").Byte(0).End() .Unknown("one").Byte(1).Byte(1).End() .Unknown("one").Byte(2).Byte(2).Byte(2).End() .Unknown("two").Byte(3).Byte(3).Byte(3).Byte(3).End() .Unknown("one").Byte(4).Byte(4).Byte(4).Byte(4).Byte(4).End() .WebAssembly().get()); const zero = WebAssembly.Module.customSections(many, "zero"); assert.eq(zero.length, 1); assert.eq(zero[0].byteLength, 1); const zeroI8 = new Int8Array(zero[0]); assert.eq(zeroI8[0], 0); const two = WebAssembly.Module.customSections(many, "two"); assert.eq(two.length, 1); assert.eq(two[0].byteLength, 4); const twoI8 = new Int8Array(two[0]); assert.eq(twoI8[0], 3); assert.eq(twoI8[1], 3); assert.eq(twoI8[2], 3); assert.eq(twoI8[3], 3); const one = WebAssembly.Module.customSections(many, "one"); assert.eq(one.length, 3); let seen = 0; const expect = [ [1, 1], [2, 2, 2], [4, 4, 4, 4, 4], ]; for (const section of one) { assert.eq(section.byteLength, expect[seen].length); const I8 = new Int8Array(section); for (let i = 0; i < expect[seen].length; ++i) assert.eq(I8[i], expect[seen][i]); ++seen; } }