116 lines
2.9 KiB
Go
116 lines
2.9 KiB
Go
package wasm
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/tetratelabs/wazero/internal/testing/require"
|
|
)
|
|
|
|
func TestModule_SectionElementCount(t *testing.T) {
|
|
i32, f32 := ValueTypeI32, ValueTypeF32
|
|
zero := uint32(0)
|
|
empty := ConstantExpression{Opcode: OpcodeI32Const, Data: const0}
|
|
|
|
tests := []struct {
|
|
name string
|
|
input *Module
|
|
expected map[string]uint32
|
|
}{
|
|
{
|
|
name: "empty",
|
|
input: &Module{},
|
|
expected: map[string]uint32{},
|
|
},
|
|
{
|
|
name: "NameSection",
|
|
input: &Module{NameSection: &NameSection{ModuleName: "simple"}},
|
|
expected: map[string]uint32{"custom": 1},
|
|
},
|
|
{
|
|
name: "TypeSection",
|
|
input: &Module{
|
|
TypeSection: []FunctionType{
|
|
{},
|
|
{Params: []ValueType{i32, i32}, Results: []ValueType{i32}},
|
|
{Params: []ValueType{i32, i32, i32, i32}, Results: []ValueType{i32}},
|
|
},
|
|
},
|
|
expected: map[string]uint32{"type": 3},
|
|
},
|
|
{
|
|
name: "TypeSection and ImportSection",
|
|
input: &Module{
|
|
TypeSection: []FunctionType{
|
|
{Params: []ValueType{i32, i32}, Results: []ValueType{i32}},
|
|
{Params: []ValueType{f32, f32}, Results: []ValueType{f32}},
|
|
},
|
|
ImportSection: []Import{
|
|
{
|
|
Module: "Math", Name: "Mul",
|
|
Type: ExternTypeFunc,
|
|
DescFunc: 1,
|
|
}, {
|
|
Module: "Math", Name: "Add",
|
|
Type: ExternTypeFunc,
|
|
DescFunc: 0,
|
|
},
|
|
},
|
|
},
|
|
expected: map[string]uint32{"import": 2, "type": 2},
|
|
},
|
|
{
|
|
name: "TypeSection, FunctionSection, CodeSection, ExportSection and StartSection",
|
|
input: &Module{
|
|
TypeSection: []FunctionType{{}},
|
|
FunctionSection: []Index{0},
|
|
CodeSection: []Code{
|
|
{Body: []byte{OpcodeLocalGet, 0, OpcodeLocalGet, 1, OpcodeI32Add, OpcodeEnd}},
|
|
},
|
|
ExportSection: []Export{
|
|
{Name: "AddInt", Type: ExternTypeFunc, Index: Index(0)},
|
|
},
|
|
StartSection: &zero,
|
|
},
|
|
expected: map[string]uint32{"code": 1, "export": 1, "function": 1, "start": 1, "type": 1},
|
|
},
|
|
{
|
|
name: "MemorySection and DataSection",
|
|
input: &Module{
|
|
MemorySection: &Memory{Min: 1},
|
|
DataSection: []DataSegment{{OffsetExpression: empty}},
|
|
},
|
|
expected: map[string]uint32{"data": 1, "memory": 1},
|
|
},
|
|
{
|
|
name: "TableSection and ElementSection",
|
|
input: &Module{
|
|
TableSection: []Table{{Min: 1}},
|
|
ElementSection: []ElementSegment{{OffsetExpr: empty}},
|
|
},
|
|
expected: map[string]uint32{"element": 1, "table": 1},
|
|
},
|
|
{
|
|
name: "TableSection (multiple tables) and ElementSection",
|
|
input: &Module{
|
|
TableSection: []Table{{Min: 1}, {Min: 2}},
|
|
ElementSection: []ElementSegment{{OffsetExpr: empty}},
|
|
},
|
|
expected: map[string]uint32{"element": 1, "table": 2},
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
tc := tt
|
|
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
actual := map[string]uint32{}
|
|
for i := SectionID(0); i <= SectionIDData; i++ {
|
|
if size := tc.input.SectionElementCount(i); size > 0 {
|
|
actual[SectionIDName(i)] = size
|
|
}
|
|
}
|
|
require.Equal(t, tc.expected, actual)
|
|
})
|
|
}
|
|
}
|