github.com/bananabytelabs/wazero@v0.0.0-20240105073314-54b22a776da8/internal/wasm/counts_test.go (about) 1 package wasm 2 3 import ( 4 "testing" 5 6 "github.com/bananabytelabs/wazero/internal/testing/require" 7 ) 8 9 func TestModule_SectionElementCount(t *testing.T) { 10 i32, f32 := ValueTypeI32, ValueTypeF32 11 zero := uint32(0) 12 empty := ConstantExpression{Opcode: OpcodeI32Const, Data: const0} 13 14 tests := []struct { 15 name string 16 input *Module 17 expected map[string]uint32 18 }{ 19 { 20 name: "empty", 21 input: &Module{}, 22 expected: map[string]uint32{}, 23 }, 24 { 25 name: "NameSection", 26 input: &Module{NameSection: &NameSection{ModuleName: "simple"}}, 27 expected: map[string]uint32{"custom": 1}, 28 }, 29 { 30 name: "TypeSection", 31 input: &Module{ 32 TypeSection: []FunctionType{ 33 {}, 34 {Params: []ValueType{i32, i32}, Results: []ValueType{i32}}, 35 {Params: []ValueType{i32, i32, i32, i32}, Results: []ValueType{i32}}, 36 }, 37 }, 38 expected: map[string]uint32{"type": 3}, 39 }, 40 { 41 name: "TypeSection and ImportSection", 42 input: &Module{ 43 TypeSection: []FunctionType{ 44 {Params: []ValueType{i32, i32}, Results: []ValueType{i32}}, 45 {Params: []ValueType{f32, f32}, Results: []ValueType{f32}}, 46 }, 47 ImportSection: []Import{ 48 { 49 Module: "Math", Name: "Mul", 50 Type: ExternTypeFunc, 51 DescFunc: 1, 52 }, { 53 Module: "Math", Name: "Add", 54 Type: ExternTypeFunc, 55 DescFunc: 0, 56 }, 57 }, 58 }, 59 expected: map[string]uint32{"import": 2, "type": 2}, 60 }, 61 { 62 name: "TypeSection, FunctionSection, CodeSection, ExportSection and StartSection", 63 input: &Module{ 64 TypeSection: []FunctionType{{}}, 65 FunctionSection: []Index{0}, 66 CodeSection: []Code{ 67 {Body: []byte{OpcodeLocalGet, 0, OpcodeLocalGet, 1, OpcodeI32Add, OpcodeEnd}}, 68 }, 69 ExportSection: []Export{ 70 {Name: "AddInt", Type: ExternTypeFunc, Index: Index(0)}, 71 }, 72 StartSection: &zero, 73 }, 74 expected: map[string]uint32{"code": 1, "export": 1, "function": 1, "start": 1, "type": 1}, 75 }, 76 { 77 name: "MemorySection and DataSection", 78 input: &Module{ 79 MemorySection: &Memory{Min: 1}, 80 DataSection: []DataSegment{{OffsetExpression: empty}}, 81 }, 82 expected: map[string]uint32{"data": 1, "memory": 1}, 83 }, 84 { 85 name: "TableSection and ElementSection", 86 input: &Module{ 87 TableSection: []Table{{Min: 1}}, 88 ElementSection: []ElementSegment{{OffsetExpr: empty}}, 89 }, 90 expected: map[string]uint32{"element": 1, "table": 1}, 91 }, 92 { 93 name: "TableSection (multiple tables) and ElementSection", 94 input: &Module{ 95 TableSection: []Table{{Min: 1}, {Min: 2}}, 96 ElementSection: []ElementSegment{{OffsetExpr: empty}}, 97 }, 98 expected: map[string]uint32{"element": 1, "table": 2}, 99 }, 100 } 101 102 for _, tt := range tests { 103 tc := tt 104 105 t.Run(tc.name, func(t *testing.T) { 106 actual := map[string]uint32{} 107 for i := SectionID(0); i <= SectionIDData; i++ { 108 if size := tc.input.SectionElementCount(i); size > 0 { 109 actual[SectionIDName(i)] = size 110 } 111 } 112 require.Equal(t, tc.expected, actual) 113 }) 114 } 115 }