neo-go/pkg/compiler/generics_test.go

92 lines
2 KiB
Go
Raw Normal View History

package compiler_test
import (
"strings"
"testing"
"github.com/nspcc-dev/neo-go/pkg/compiler"
"github.com/stretchr/testify/require"
)
func TestGenericMethodReceiver(t *testing.T) {
t.Run("star expression", func(t *testing.T) {
src := `
package receiver
type Pointer[T any] struct {
value T
}
func (x *Pointer[T]) Load() *T {
return &x.value
}
`
_, _, err := compiler.CompileWithOptions("foo.go", strings.NewReader(src), nil)
require.ErrorIs(t, err, compiler.ErrGenericsUnsuppored)
})
t.Run("ident expression", func(t *testing.T) {
src := `
package receiver
type Pointer[T any] struct {
value T
}
func (x Pointer[T]) Load() *T {
return &x.value
}
`
_, _, err := compiler.CompileWithOptions("foo.go", strings.NewReader(src), nil)
require.ErrorIs(t, err, compiler.ErrGenericsUnsuppored)
})
}
func TestGenericFuncArgument(t *testing.T) {
src := `
package sum
func SumInts[V int64 | int32 | int16](vals []V) V { // doesn't make sense with NeoVM, but still it's a valid go code.
var s V
for i := range vals {
s += vals[i]
}
return s
}
`
_, _, err := compiler.CompileWithOptions("foo.go", strings.NewReader(src), nil)
require.ErrorIs(t, err, compiler.ErrGenericsUnsuppored)
}
func TestGenericTypeDecl(t *testing.T) {
t.Run("global scope", func(t *testing.T) {
src := `
package sum
type List[T any] struct {
next *List[T]
val T
}
func Main() any {
l := List[int]{}
return l
}
`
_, _, err := compiler.CompileWithOptions("foo.go", strings.NewReader(src), nil)
require.ErrorIs(t, err, compiler.ErrGenericsUnsuppored)
})
t.Run("local scope", func(t *testing.T) {
src := `
package sum
func Main() any {
type (
SomeGoodType int
List[T any] struct {
next *List[T]
val T
}
)
l := List[int]{}
return l
}
`
_, _, err := compiler.CompileWithOptions("foo.go", strings.NewReader(src), nil)
require.ErrorIs(t, err, compiler.ErrGenericsUnsuppored)
})
}