github.com/nspcc-dev/neo-go@v0.105.2-0.20240517133400-6be757af3eba/pkg/smartcontract/manifest/parameter_test.go (about)

     1  package manifest
     2  
     3  import (
     4  	"math/big"
     5  	"testing"
     6  
     7  	"github.com/nspcc-dev/neo-go/pkg/smartcontract"
     8  	"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
     9  	"github.com/stretchr/testify/require"
    10  )
    11  
    12  func TestParametersAreValid(t *testing.T) {
    13  	ps := Parameters{}
    14  	require.NoError(t, ps.AreValid()) // No parameters.
    15  
    16  	ps = append(ps, Parameter{})
    17  	require.Error(t, ps.AreValid())
    18  
    19  	ps[0].Name = "qwerty"
    20  	require.NoError(t, ps.AreValid())
    21  
    22  	ps[0].Type = 0x42 // Invalid type.
    23  	require.Error(t, ps.AreValid())
    24  
    25  	ps[0].Type = smartcontract.VoidType
    26  	require.Error(t, ps.AreValid())
    27  
    28  	ps[0].Type = smartcontract.BoolType
    29  	require.NoError(t, ps.AreValid())
    30  
    31  	ps = append(ps, Parameter{Name: "qwerty"})
    32  	require.Error(t, ps.AreValid())
    33  }
    34  
    35  func TestParameter_ToStackItemFromStackItem(t *testing.T) {
    36  	p := &Parameter{
    37  		Name: "param",
    38  		Type: smartcontract.StringType,
    39  	}
    40  	expected := stackitem.NewStruct([]stackitem.Item{
    41  		stackitem.NewByteArray([]byte(p.Name)),
    42  		stackitem.NewBigInteger(big.NewInt(int64(p.Type))),
    43  	})
    44  	CheckToFromStackItem(t, p, expected)
    45  }
    46  
    47  func TestParameter_FromStackItemErrors(t *testing.T) {
    48  	errCases := map[string]stackitem.Item{
    49  		"not a struct":       stackitem.NewArray([]stackitem.Item{}),
    50  		"invalid length":     stackitem.NewStruct([]stackitem.Item{}),
    51  		"invalid name type":  stackitem.NewStruct([]stackitem.Item{stackitem.NewInterop(nil), stackitem.Null{}}),
    52  		"invalid type type":  stackitem.NewStruct([]stackitem.Item{stackitem.NewByteArray([]byte{}), stackitem.Null{}}),
    53  		"invalid type value": stackitem.NewStruct([]stackitem.Item{stackitem.NewByteArray([]byte{}), stackitem.NewBigInteger(big.NewInt(-100500))}),
    54  	}
    55  	for name, errCase := range errCases {
    56  		t.Run(name, func(t *testing.T) {
    57  			p := new(Parameter)
    58  			require.Error(t, p.FromStackItem(errCase))
    59  		})
    60  	}
    61  }