github.com/nspcc-dev/neo-go@v0.105.2-0.20240517133400-6be757af3eba/pkg/compiler/assign_test.go (about) 1 package compiler_test 2 3 import ( 4 "bytes" 5 "fmt" 6 "math/big" 7 "strings" 8 "testing" 9 10 "github.com/nspcc-dev/neo-go/pkg/compiler" 11 "github.com/nspcc-dev/neo-go/pkg/smartcontract/trigger" 12 "github.com/nspcc-dev/neo-go/pkg/vm" 13 "github.com/stretchr/testify/require" 14 ) 15 16 var assignTestCases = []testCase{ 17 { 18 "chain define", 19 `func F%d() int { 20 x := 4 21 y := x 22 z := y 23 foo := z 24 bar := foo 25 return bar 26 } 27 `, 28 big.NewInt(4), 29 }, 30 { 31 "simple assign", 32 `func F%d() int { 33 x := 4 34 x = 8 35 return x 36 } 37 `, 38 big.NewInt(8), 39 }, 40 { 41 "add assign", 42 `func F%d() int { 43 x := 4 44 x += 8 45 return x 46 } 47 `, 48 big.NewInt(12), 49 }, 50 { 51 "sub assign", 52 `func F%d() int { 53 x := 4 54 x -= 2 55 return x 56 } 57 `, 58 big.NewInt(2), 59 }, 60 { 61 "mul assign", 62 `func F%d() int { 63 x := 4 64 x *= 2 65 return x 66 } 67 `, 68 big.NewInt(8), 69 }, 70 { 71 "div assign", 72 `func F%d() int { 73 x := 4 74 x /= 2 75 return x 76 } 77 `, 78 big.NewInt(2), 79 }, 80 { 81 "add assign binary expr", 82 `func F%d() int { 83 x := 4 84 x += 6 + 2 85 return x 86 } 87 `, 88 big.NewInt(12), 89 }, 90 { 91 "add assign binary expr ident", 92 `func F%d() int { 93 x := 4 94 y := 5 95 x += 6 + y 96 return x 97 } 98 `, 99 big.NewInt(15), 100 }, 101 { 102 "add assign for string", 103 `func F%d() string { 104 s := "Hello, " 105 s += "world!" 106 return s 107 } 108 `, 109 []byte("Hello, world!"), 110 }, 111 { 112 "decl assign", 113 `func F%d() int { 114 var x int = 4 115 return x 116 } 117 `, 118 big.NewInt(4), 119 }, 120 { 121 "multi assign", 122 `func F%d() int { 123 x, y := 1, 2 124 return x + y 125 } 126 `, 127 big.NewInt(3), 128 }, 129 { 130 "many assignments", 131 `func F%d() int { 132 a := 0 133 ` + strings.Repeat("a += 1\n", 1024) + ` 134 return a 135 } 136 `, 137 big.NewInt(1024), 138 }, 139 } 140 141 func TestAssignments(t *testing.T) { 142 srcBuilder := bytes.NewBuffer([]byte("package testcase\n")) 143 for i, tc := range assignTestCases { 144 srcBuilder.WriteString(fmt.Sprintf(tc.src, i)) 145 } 146 147 ne, di, err := compiler.CompileWithOptions("file.go", strings.NewReader(srcBuilder.String()), nil) 148 require.NoError(t, err) 149 150 for i, tc := range assignTestCases { 151 v := vm.New() 152 t.Run(tc.name, func(t *testing.T) { 153 v.Reset(trigger.Application) 154 invokeMethod(t, fmt.Sprintf("F%d", i), ne.Script, v, di) 155 runAndCheck(t, v, tc.result) 156 }) 157 } 158 }