neoneo-go/pkg/compiler/init_test.go
Evgenii Stratonikov 4488f61777 compiler: compile init even if there are no globals
`init` can be useful even if no globals are present,
e.g. we can use some syscall inside.
2020-08-05 12:59:53 +03:00

107 lines
2.3 KiB
Go

package compiler_test
import (
"math/big"
"testing"
"github.com/stretchr/testify/require"
)
func TestInit(t *testing.T) {
t.Run("Simple", func(t *testing.T) {
src := `package foo
var a int
func init() {
a = 42
}
func Main() int {
return a
}`
eval(t, src, big.NewInt(42))
})
t.Run("Multi", func(t *testing.T) {
src := `package foo
var m = map[int]int{}
var a = 2
func init() {
m[1] = 11
}
func init() {
a = 1
m[3] = 30
}
func Main() int {
return m[1] + m[3] + a
}`
eval(t, src, big.NewInt(42))
})
t.Run("WithCall", func(t *testing.T) {
src := `package foo
var m = map[int]int{}
func init() {
initMap(m)
}
func initMap(m map[int]int) {
m[11] = 42
}
func Main() int {
return m[11]
}`
eval(t, src, big.NewInt(42))
})
t.Run("InvalidSignature", func(t *testing.T) {
src := `package foo
type Foo int
var a int
func (f Foo) init() {
a = 2
}
func Main() int {
return a
}`
eval(t, src, big.NewInt(0))
})
}
func TestImportOrder(t *testing.T) {
t.Run("1,2", func(t *testing.T) {
src := `package foo
import _ "github.com/nspcc-dev/neo-go/pkg/compiler/testdata/pkg1"
import _ "github.com/nspcc-dev/neo-go/pkg/compiler/testdata/pkg2"
import "github.com/nspcc-dev/neo-go/pkg/compiler/testdata/pkg3"
func Main() int { return pkg3.A }`
v := vmAndCompile(t, src)
v.PrintOps()
eval(t, src, big.NewInt(2))
})
t.Run("2,1", func(t *testing.T) {
src := `package foo
import _ "github.com/nspcc-dev/neo-go/pkg/compiler/testdata/pkg2"
import _ "github.com/nspcc-dev/neo-go/pkg/compiler/testdata/pkg1"
import "github.com/nspcc-dev/neo-go/pkg/compiler/testdata/pkg3"
func Main() int { return pkg3.A }`
eval(t, src, big.NewInt(1))
})
t.Run("InitializeOnce", func(t *testing.T) {
src := `package foo
import "github.com/nspcc-dev/neo-go/pkg/compiler/testdata/pkg3"
var A = pkg3.A
func Main() int { return A }`
eval(t, src, big.NewInt(3))
})
}
func TestInitWithNoGlobals(t *testing.T) {
src := `package foo
import "github.com/nspcc-dev/neo-go/pkg/interop/runtime"
func init() {
runtime.Notify("called in '_initialize'")
}
func Main() int {
return 42
}`
v, s := vmAndCompileInterop(t, src)
require.NoError(t, v.Run())
assertResult(t, v, big.NewInt(42))
require.True(t, len(s.events) == 1)
}