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  }