github.com/nspcc-dev/neo-go@v0.105.2-0.20240517133400-6be757af3eba/pkg/compiler/init_test.go (about)

     1  package compiler_test
     2  
     3  import (
     4  	"math/big"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/require"
     8  )
     9  
    10  func TestInit(t *testing.T) {
    11  	t.Run("Simple", func(t *testing.T) {
    12  		src := `package foo
    13  		var a int
    14  		func init() {
    15  			a = 42
    16  		}
    17  		func Main() int {
    18  			return a
    19  		}`
    20  		eval(t, src, big.NewInt(42))
    21  	})
    22  	t.Run("Multi", func(t *testing.T) {
    23  		src := `package foo
    24  		var m = map[int]int{}
    25  		var a = 2
    26  		func init() {
    27  			b := 11
    28  			m[1] = b
    29  		}
    30  		func init() {
    31  			a = 1
    32  			var b int
    33  			m[3] = 30 + b
    34  		}
    35  		func Main() int {
    36  			return m[1] + m[3] + a
    37  		}`
    38  		eval(t, src, big.NewInt(42))
    39  	})
    40  	t.Run("WithCall", func(t *testing.T) {
    41  		src := `package foo
    42  		var m = map[int]int{}
    43  		func init() {
    44  			initMap(m)
    45  		}
    46  		func initMap(m map[int]int) {
    47  			m[11] = 42
    48  		}
    49  		func Main() int {
    50  			return m[11]
    51  		}`
    52  		eval(t, src, big.NewInt(42))
    53  	})
    54  	t.Run("InvalidSignature", func(t *testing.T) {
    55  		src := `package foo
    56  		type Foo int
    57  		var a int
    58  		func (f Foo) init() {
    59  			a = 2
    60  		}
    61  		func Main() int {
    62  			return a
    63  		}`
    64  		eval(t, src, big.NewInt(0))
    65  	})
    66  }
    67  
    68  func TestImportOrder(t *testing.T) {
    69  	t.Run("1,2", func(t *testing.T) {
    70  		src := `package foo
    71  		import _ "github.com/nspcc-dev/neo-go/pkg/compiler/testdata/pkg1"
    72  		import _ "github.com/nspcc-dev/neo-go/pkg/compiler/testdata/pkg2"
    73  		import "github.com/nspcc-dev/neo-go/pkg/compiler/testdata/pkg3"
    74  		func Main() int { return pkg3.A }`
    75  		eval(t, src, big.NewInt(2))
    76  	})
    77  	t.Run("2,1", func(t *testing.T) {
    78  		src := `package foo
    79  		import _ "github.com/nspcc-dev/neo-go/pkg/compiler/testdata/pkg2"
    80  		import _ "github.com/nspcc-dev/neo-go/pkg/compiler/testdata/pkg1"
    81  		import "github.com/nspcc-dev/neo-go/pkg/compiler/testdata/pkg3"
    82  		func Main() int { return pkg3.A }`
    83  		eval(t, src, big.NewInt(1))
    84  	})
    85  	t.Run("InitializeOnce", func(t *testing.T) {
    86  		src := `package foo
    87  		import "github.com/nspcc-dev/neo-go/pkg/compiler/testdata/pkg3"
    88  		var A = pkg3.A
    89  		func Main() int { return A }`
    90  		eval(t, src, big.NewInt(3))
    91  	})
    92  }
    93  
    94  func TestInitWithNoGlobals(t *testing.T) {
    95  	src := `package foo
    96  	import "github.com/nspcc-dev/neo-go/pkg/interop/runtime"
    97  	func init() {
    98  		runtime.Notify("called in '_initialize'")
    99  	}
   100  	func Main() int {
   101  		return 42
   102  	}`
   103  	v, s, _ := vmAndCompileInterop(t, src)
   104  	require.NoError(t, v.Run())
   105  	assertResult(t, v, big.NewInt(42))
   106  	require.True(t, len(s.events) == 1)
   107  }