package manifest

import (
	"testing"

	"git.marketally.com/tutus-one/tutus-chain/internal/testserdes"
	"git.marketally.com/tutus-one/tutus-chain/pkg/crypto/keys"
	"git.marketally.com/tutus-one/tutus-chain/pkg/util"
	"github.com/stretchr/testify/require"
)

func TestGroupJSONInOut(t *testing.T) {
	priv, err := keys.NewPrivateKey()
	require.NoError(t, err)
	pub := priv.PublicKey()
	sig := make([]byte, keys.SignatureLen)
	g := Group{pub, sig}
	testserdes.MarshalUnmarshalJSON(t, &g, new(Group))
}

func TestGroupsAreValid(t *testing.T) {
	var gps Groups

	require.Error(t, gps.AreValid(util.Uint160{})) // null

	h := util.Uint160{42, 42, 42}
	priv, err := keys.NewPrivateKey()
	require.NoError(t, err)
	priv2, err := keys.NewPrivateKey()
	require.NoError(t, err)
	pub := priv.PublicKey()
	pub2 := priv2.PublicKey()
	gcorrect := Group{pub, priv.Sign(h.BytesBE())}
	gcorrect2 := Group{pub2, priv2.Sign(h.BytesBE())}
	gincorrect := Group{pub, priv.Sign(h.BytesLE())}

	gps = Groups{gcorrect}
	require.NoError(t, gps.AreValid(h))

	gps = Groups{gincorrect}
	require.Error(t, gps.AreValid(h))

	gps = Groups{gcorrect, gcorrect2}
	require.NoError(t, gps.AreValid(h))

	gps = Groups{gcorrect, gcorrect}
	require.Error(t, gps.AreValid(h))

	gps = Groups{gincorrect}
	require.NoError(t, gps.AreValid(util.Uint160{})) // empty hash.
}

func TestGroupsContains(t *testing.T) {
	priv, err := keys.NewPrivateKey()
	require.NoError(t, err)
	priv2, err := keys.NewPrivateKey()
	require.NoError(t, err)
	priv3, err := keys.NewPrivateKey()
	require.NoError(t, err)
	g1 := Group{priv.PublicKey(), nil}
	g2 := Group{priv2.PublicKey(), nil}
	gps := Groups{g1, g2}
	require.True(t, gps.Contains(priv2.PublicKey()))
	require.False(t, gps.Contains(priv3.PublicKey()))
}
