package netmap_test

import (
	"bytes"
	"testing"

	v2netmap "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/api/netmap"
	"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/netmap"
	netmaptest "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/netmap/test"
	"github.com/stretchr/testify/require"
)

func TestNetMapNodes(t *testing.T) {
	var nm netmap.NetMap

	require.Empty(t, nm.Nodes())

	nodes := []netmap.NodeInfo{netmaptest.NodeInfo(), netmaptest.NodeInfo()}

	nm.SetNodes(nodes)
	require.ElementsMatch(t, nodes, nm.Nodes())

	nodesV2 := make([]v2netmap.NodeInfo, len(nodes))
	for i := range nodes {
		nodes[i].WriteToV2(&nodesV2[i])
	}

	var m v2netmap.NetMap
	nm.WriteToV2(&m)

	require.ElementsMatch(t, nodesV2, m.Nodes())
}

func TestNetMap_SetEpoch(t *testing.T) {
	var nm netmap.NetMap

	require.Zero(t, nm.Epoch())

	const e = 158

	nm.SetEpoch(e)
	require.EqualValues(t, e, nm.Epoch())

	var m v2netmap.NetMap
	nm.WriteToV2(&m)

	require.EqualValues(t, e, m.Epoch())
}

func TestNetMap_Clone(t *testing.T) {
	nm := new(netmap.NetMap)
	nm.SetEpoch(1)
	var ni netmap.NodeInfo
	ni.SetPublicKey([]byte{1, 2, 3})
	nm.SetNodes([]netmap.NodeInfo{ni})

	clone := nm.Clone()

	require.True(t, clone != nm)
	require.True(t, &(clone.Nodes()[0]) != &(nm.Nodes()[0]))

	var clonev2 v2netmap.NetMap
	clone.WriteToV2(&clonev2)
	var bufClone []byte
	bufClone = clonev2.StableMarshal(bufClone)

	var nmv2 v2netmap.NetMap
	nm.WriteToV2(&nmv2)
	var bufNM []byte
	bufNM = nmv2.StableMarshal(bufNM)

	require.True(t, bytes.Equal(bufClone, bufNM))
}