package node

import (
	"testing"

	"github.com/stretchr/testify/require"
)

func TestInfo_Address(t *testing.T) {
	i := new(Info)

	addr := "address"
	i.SetAddress(addr)

	require.Equal(t, addr, i.Address())
}

func TestInfo_Status(t *testing.T) {
	i := new(Info)

	st := StatusFromUint64(1)
	i.SetStatus(st)

	require.Equal(t, st, i.Status())
}

func TestInfo_PublicKey(t *testing.T) {
	i := new(Info)

	key := []byte{1, 2, 3}
	i.SetPublicKey(key)

	require.Equal(t, key, i.PublicKey())
}

func TestCopyPublicKey(t *testing.T) {
	i := Info{}

	// set initial node key
	initKey := []byte{1, 2, 3}
	i.SetPublicKey(initKey)

	// get node key copy
	keyCopy := CopyPublicKey(i)

	// change the copy
	keyCopy[0]++

	// check that node key has not changed
	require.Equal(t, initKey, i.PublicKey())
}

func TestSetPublicKeyCopy(t *testing.T) {
	require.EqualError(t,
		SetPublicKeyCopy(nil, nil),
		ErrNilInfo.Error(),
	)

	i := new(Info)

	// create source key
	srcKey := []byte{1, 2, 3}

	// copy and set node key
	require.NoError(t, SetPublicKeyCopy(i, srcKey))

	// get node key
	nodeKey := i.PublicKey()

	// change the source key
	srcKey[0]++

	// check that node key has not changed
	require.Equal(t, nodeKey, i.PublicKey())
}

func TestInfo_Options(t *testing.T) {
	i := new(Info)

	opts := []string{
		"opt1",
		"opt2",
	}
	i.SetOptions(opts)

	require.Equal(t, opts, i.Options())
}

func TestCopyOptions(t *testing.T) {
	i := Info{}

	// set initial node options
	initOpts := []string{
		"opt1",
		"opt2",
	}
	i.SetOptions(initOpts)

	// get node options copy
	optsCopy := CopyOptions(i)

	// change the copy
	optsCopy[0] = "some other opt"

	// check that node options have not changed
	require.Equal(t, initOpts, i.Options())
}

func TestSetOptionsCopy(t *testing.T) {
	require.NotPanics(t, func() {
		SetOptionsCopy(nil, nil)
	})

	i := new(Info)

	// create source options
	srcOpts := []string{
		"opt1",
		"opt2",
	}

	// copy and set node options
	SetOptionsCopy(i, srcOpts)

	// get node options
	nodeOpts := i.Options()

	// change the source options
	srcOpts[0] = "some other opt"

	// check that node options have not changed
	require.Equal(t, nodeOpts, i.Options())
}