package native

import (
	"encoding/json"
	"testing"

	"github.com/nspcc-dev/neo-go/pkg/internal/testserdes"
	"github.com/nspcc-dev/neo-go/pkg/smartcontract"
	"github.com/nspcc-dev/neo-go/pkg/util"
	"github.com/nspcc-dev/neo-go/pkg/vm/stackitem"
	"github.com/stretchr/testify/require"
)

func TestEncodeDecodeBinary(t *testing.T) {
	expected := &BlockedAccounts{
		util.Uint160{1, 2, 3},
		util.Uint160{4, 5, 6},
	}
	actual := new(BlockedAccounts)
	testserdes.EncodeDecodeBinary(t, expected, actual)

	expected = &BlockedAccounts{}
	actual = new(BlockedAccounts)
	testserdes.EncodeDecodeBinary(t, expected, actual)
}

func TestBytesFromBytes(t *testing.T) {
	expected := BlockedAccounts{
		util.Uint160{1, 2, 3},
		util.Uint160{4, 5, 6},
	}
	actual, err := BlockedAccountsFromBytes(expected.Bytes())
	require.NoError(t, err)
	require.Equal(t, expected, actual)

	expected = BlockedAccounts{}
	actual, err = BlockedAccountsFromBytes(expected.Bytes())
	require.NoError(t, err)
	require.Equal(t, expected, actual)
}

func TestToStackItem(t *testing.T) {
	u1 := util.Uint160{1, 2, 3}
	u2 := util.Uint160{4, 5, 6}
	expected := BlockedAccounts{u1, u2}
	actual := stackitem.NewArray([]stackitem.Item{
		stackitem.NewByteArray(u1.BytesLE()),
		stackitem.NewByteArray(u2.BytesLE()),
	})
	require.Equal(t, expected.ToStackItem(), actual)

	expected = BlockedAccounts{}
	actual = stackitem.NewArray([]stackitem.Item{})
	require.Equal(t, expected.ToStackItem(), actual)
}

func TestMarshallJSON(t *testing.T) {
	ba := &BlockedAccounts{}
	p := smartcontract.ParameterFromStackItem(ba.ToStackItem(), make(map[stackitem.Item]bool))
	actual, err := json.Marshal(p)
	require.NoError(t, err)
	expected := `{"type":"Array","value":[]}`
	require.Equal(t, expected, string(actual))
}