package event

import (
	"testing"

	"github.com/nspcc-dev/neo-go/pkg/io"
	"github.com/nspcc-dev/neo-go/pkg/vm"
	"github.com/nspcc-dev/neo-go/pkg/vm/emit"
	"github.com/stretchr/testify/require"
)

func TestBytesFromOpcode(t *testing.T) {
	tests := [...][]byte{
		[]byte("test"),
		[]byte("test test"),
		[]byte(""),
		[]byte("1"),
	}

	bw := io.NewBufBinWriter()

	for _, test := range tests {
		emit.Bytes(bw.BinWriter, test)
	}

	var (
		ctx = vm.NewContext(bw.Bytes())

		op Op

		gotBytes []byte
		err      error
	)

	for _, test := range tests {
		op = getNextOp(ctx)

		gotBytes, err = BytesFromOpcode(op)

		require.NoError(t, err)
		require.Equal(t, test, gotBytes)
	}
}

func TestIntFromOpcode(t *testing.T) {
	tests := [...]int64{
		-1,
		-5,
		15,
		16,
		1_000_000,
	}

	bw := io.NewBufBinWriter()

	for _, test := range tests {
		emit.Int(bw.BinWriter, test)
	}

	var (
		ctx = vm.NewContext(bw.Bytes())

		op Op

		gotInt int64
		err    error
	)

	for _, test := range tests {
		op = getNextOp(ctx)

		gotInt, err = IntFromOpcode(op)

		require.NoError(t, err)
		require.Equal(t, test, gotInt)
	}
}

func getNextOp(ctx *vm.Context) (op Op) {
	op.code, op.param, _ = ctx.Next()
	return
}