package event

import (
	"math/big"
	"testing"

	"github.com/nspcc-dev/neo-go/pkg/core/state"
	"github.com/nspcc-dev/neo-go/pkg/util"
	"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
	"github.com/stretchr/testify/require"
)

func TestParseStackArray(t *testing.T) {
	t.Run("success", func(t *testing.T) {
		arr := &stackitem.Array{}
		arr.Append(stackitem.NewBigInteger(big.NewInt(1)))
		arr.Append(stackitem.NewBigInteger(big.NewInt(2)))
		ev := &state.ContainedNotificationEvent{
			Container: util.Uint256{67},
			NotificationEvent: state.NotificationEvent{
				ScriptHash: util.Uint160{69},
				Name:       "name",
				Item:       arr,
			},
		}

		items, err := ParseStackArray(ev)
		require.NoError(t, err, "failed to parse event items")
		require.Equal(t, 2, len(items), "invalid length")
		require.Equal(t, stackitem.NewBigInteger(big.NewInt(1)), items[0], "invalid item 0")
		require.Equal(t, stackitem.NewBigInteger(big.NewInt(2)), items[1], "invalid item 0")
	})
	t.Run("empty stack error", func(t *testing.T) {
		arr := &stackitem.Array{}
		ev := &state.ContainedNotificationEvent{
			Container: util.Uint256{67},
			NotificationEvent: state.NotificationEvent{
				ScriptHash: util.Uint160{69},
				Name:       "name",
				Item:       arr,
			},
		}

		items, err := ParseStackArray(ev)
		require.ErrorIs(t, err, errEmptyStackArray, "invalid empty array error")
		require.Equal(t, 0, len(items), "items was returned")
	})
}