github.com/nspcc-dev/neo-go@v0.105.2-0.20240517133400-6be757af3eba/pkg/smartcontract/manifest/event_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 TestEventIsValid(t *testing.T) {
    13  	e := Event{}
    14  	require.Error(t, e.IsValid())
    15  
    16  	e.Name = "some"
    17  	require.NoError(t, e.IsValid())
    18  
    19  	e.Parameters = make([]Parameter, 0)
    20  	require.NoError(t, e.IsValid())
    21  
    22  	e.Parameters = append(e.Parameters, NewParameter("p1", smartcontract.BoolType))
    23  	require.NoError(t, e.IsValid())
    24  
    25  	e.Parameters = append(e.Parameters, NewParameter("p2", smartcontract.IntegerType))
    26  	require.NoError(t, e.IsValid())
    27  
    28  	e.Parameters = append(e.Parameters, NewParameter("p3", smartcontract.IntegerType))
    29  	require.NoError(t, e.IsValid())
    30  
    31  	e.Parameters = append(e.Parameters, NewParameter("p1", smartcontract.IntegerType))
    32  	require.Error(t, e.IsValid())
    33  }
    34  
    35  func TestEvent_ToStackItemFromStackItem(t *testing.T) {
    36  	m := &Event{
    37  		Name:       "mur",
    38  		Parameters: []Parameter{{Name: "p1", Type: smartcontract.BoolType}},
    39  	}
    40  	expected := stackitem.NewStruct([]stackitem.Item{
    41  		stackitem.NewByteArray([]byte(m.Name)),
    42  		stackitem.NewArray([]stackitem.Item{
    43  			stackitem.NewStruct([]stackitem.Item{
    44  				stackitem.NewByteArray([]byte(m.Parameters[0].Name)),
    45  				stackitem.NewBigInteger(big.NewInt(int64(m.Parameters[0].Type))),
    46  			}),
    47  		}),
    48  	})
    49  	CheckToFromStackItem(t, m, expected)
    50  }
    51  
    52  func TestEvent_FromStackItemErrors(t *testing.T) {
    53  	errCases := map[string]stackitem.Item{
    54  		"not a struct":            stackitem.NewArray([]stackitem.Item{}),
    55  		"invalid length":          stackitem.NewStruct([]stackitem.Item{}),
    56  		"invalid name type":       stackitem.NewStruct([]stackitem.Item{stackitem.NewInterop(nil), stackitem.Null{}}),
    57  		"invalid parameters type": stackitem.NewStruct([]stackitem.Item{stackitem.NewByteArray([]byte{}), stackitem.Null{}}),
    58  		"invalid parameter":       stackitem.NewStruct([]stackitem.Item{stackitem.NewByteArray([]byte{}), stackitem.NewArray([]stackitem.Item{stackitem.NewStruct([]stackitem.Item{})})}),
    59  	}
    60  	for name, errCase := range errCases {
    61  		t.Run(name, func(t *testing.T) {
    62  			p := new(Event)
    63  			require.Error(t, p.FromStackItem(errCase))
    64  		})
    65  	}
    66  }
    67  
    68  func TestEventCheckCompliance(t *testing.T) {
    69  	m := &Event{
    70  		Name:       "mur",
    71  		Parameters: []Parameter{{Name: "p1", Type: smartcontract.BoolType}},
    72  	}
    73  	require.Error(t, m.CheckCompliance([]stackitem.Item{}))
    74  	require.Error(t, m.CheckCompliance([]stackitem.Item{stackitem.Make("something")}))
    75  	require.NoError(t, m.CheckCompliance([]stackitem.Item{stackitem.Make(true)}))
    76  }