package subnetid_test

import (
	"testing"

	"github.com/nspcc-dev/neofs-api-go/v2/refs"
	subnetid "github.com/nspcc-dev/neofs-sdk-go/subnet/id"
	subnetidtest "github.com/nspcc-dev/neofs-sdk-go/subnet/id/test"
	"github.com/stretchr/testify/require"
)

func TestIsZero(t *testing.T) {
	var id subnetid.ID

	require.True(t, subnetid.IsZero(id))

	id.SetNumber(13)
	require.False(t, subnetid.IsZero(id))

	id.SetNumber(0)
	require.True(t, subnetid.IsZero(id))
}

func TestID_FromV2(t *testing.T) {
	const num = 13

	var id1 subnetid.ID
	id1.SetNumber(num)

	var idv2 refs.SubnetID
	idv2.SetValue(num)

	var id2 subnetid.ID
	id2.FromV2(idv2)

	require.True(t, id1.Equals(&id2))
}

func TestID_WriteToV2(t *testing.T) {
	const num = 13

	var (
		id   subnetid.ID
		idv2 refs.SubnetID
	)

	id.WriteToV2(&idv2)
	require.Zero(t, idv2.GetValue())

	id.SetNumber(num)

	id.WriteToV2(&idv2)
	require.EqualValues(t, num, idv2.GetValue())
}

func TestID_Equals(t *testing.T) {
	const num = 13

	var id1, id2, idOther, id0 subnetid.ID

	id0.Equals(nil)

	id1.SetNumber(num)
	id2.SetNumber(num)
	idOther.SetNumber(num + 1)

	require.True(t, id1.Equals(&id2))
	require.False(t, id1.Equals(&idOther))
	require.False(t, id2.Equals(&idOther))
}

func TestSubnetIDEncoding(t *testing.T) {
	id := subnetidtest.ID()

	t.Run("binary", func(t *testing.T) {
		data, err := id.Marshal()
		require.NoError(t, err)

		var id2 subnetid.ID
		require.NoError(t, id2.Unmarshal(data))

		require.True(t, id2.Equals(id))
	})

	t.Run("text", func(t *testing.T) {
		data, err := id.MarshalText()
		require.NoError(t, err)

		var id2 subnetid.ID
		require.NoError(t, id2.UnmarshalText(data))

		require.True(t, id2.Equals(id))
	})
}

func TestMakeZero(t *testing.T) {
	var id subnetid.ID

	id.SetNumber(13)

	require.False(t, subnetid.IsZero(id))

	subnetid.MakeZero(&id)

	require.True(t, subnetid.IsZero(id))
}