Files
wazero/experimental/wazerotest/wazerotest_test.go
2023-05-06 08:19:27 -07:00

168 lines
4.0 KiB
Go

package wazerotest
import (
"bytes"
"context"
"reflect"
"testing"
"github.com/tetratelabs/wazero/api"
)
func TestNewFunction(t *testing.T) {
tests := []struct {
in any
out *Function
}{
{
in: func(ctx context.Context, mod api.Module) {},
out: &Function{
ParamTypes: []api.ValueType{},
ResultTypes: []api.ValueType{},
},
},
{
in: func(ctx context.Context, mod api.Module, v uint32) {},
out: &Function{
ParamTypes: []api.ValueType{api.ValueTypeI32},
ResultTypes: []api.ValueType{},
},
},
{
in: func(ctx context.Context, mod api.Module, v uint64) {},
out: &Function{
ParamTypes: []api.ValueType{api.ValueTypeI64},
ResultTypes: []api.ValueType{},
},
},
{
in: func(ctx context.Context, mod api.Module, v int32) {},
out: &Function{
ParamTypes: []api.ValueType{api.ValueTypeI32},
ResultTypes: []api.ValueType{},
},
},
{
in: func(ctx context.Context, mod api.Module, v int64) {},
out: &Function{
ParamTypes: []api.ValueType{api.ValueTypeI64},
ResultTypes: []api.ValueType{},
},
},
{
in: func(ctx context.Context, mod api.Module, v float32) {},
out: &Function{
ParamTypes: []api.ValueType{api.ValueTypeF32},
ResultTypes: []api.ValueType{},
},
},
{
in: func(ctx context.Context, mod api.Module, v float64) {},
out: &Function{
ParamTypes: []api.ValueType{api.ValueTypeF64},
ResultTypes: []api.ValueType{},
},
},
{
in: func(ctx context.Context, mod api.Module) uint32 { return 0 },
out: &Function{
ParamTypes: []api.ValueType{},
ResultTypes: []api.ValueType{api.ValueTypeI32},
},
},
{
in: func(ctx context.Context, mod api.Module) uint64 { return 0 },
out: &Function{
ParamTypes: []api.ValueType{},
ResultTypes: []api.ValueType{api.ValueTypeI64},
},
},
{
in: func(ctx context.Context, mod api.Module) int32 { return 0 },
out: &Function{
ParamTypes: []api.ValueType{},
ResultTypes: []api.ValueType{api.ValueTypeI32},
},
},
{
in: func(ctx context.Context, mod api.Module) int64 { return 0 },
out: &Function{
ParamTypes: []api.ValueType{},
ResultTypes: []api.ValueType{api.ValueTypeI64},
},
},
{
in: func(ctx context.Context, mod api.Module) float32 { return 0 },
out: &Function{
ParamTypes: []api.ValueType{},
ResultTypes: []api.ValueType{api.ValueTypeF32},
},
},
{
in: func(ctx context.Context, mod api.Module) float64 { return 0 },
out: &Function{
ParamTypes: []api.ValueType{},
ResultTypes: []api.ValueType{api.ValueTypeF64},
},
},
{
in: func(ctx context.Context, mod api.Module, _ uint32, _ uint64, _ int32, _ int64, _ float32, _ float64) (_ uint32, _ uint64, _ int32, _ int64, _ float32, _ float64) {
return
},
out: &Function{
ParamTypes: []api.ValueType{
api.ValueTypeI32, api.ValueTypeI64,
api.ValueTypeI32, api.ValueTypeI64,
api.ValueTypeF32, api.ValueTypeF64,
},
ResultTypes: []api.ValueType{
api.ValueTypeI32, api.ValueTypeI64,
api.ValueTypeI32, api.ValueTypeI64,
api.ValueTypeF32, api.ValueTypeF64,
},
},
},
}
for _, test := range tests {
t.Run(reflect.TypeOf(test.in).String(), func(t *testing.T) {
f := NewFunction(test.in)
if !bytes.Equal(test.out.ParamTypes, f.ParamTypes) {
t.Errorf("invalid parameter types: want=%v got=%v", test.out.ParamTypes, f.ParamTypes)
}
if !bytes.Equal(test.out.ResultTypes, f.ResultTypes) {
t.Errorf("invalid result types: want=%v got=%v", test.out.ResultTypes, f.ResultTypes)
}
})
}
}
func TestNewMemory(t *testing.T) {
if memory := NewMemory(1); len(memory.Bytes) != PageSize {
t.Error("memory buffer not aligned on page size")
}
}
func TestNewFixedMemory(t *testing.T) {
if memory := NewFixedMemory(1); len(memory.Bytes) != PageSize {
t.Error("memory buffer not aligned on page size")
} else if memory.Min != 1 {
t.Error("invalid min memory size:", memory.Min)
} else if memory.Max != 1 {
t.Error("invalid max memory size:", memory.Max)
}
}