package idgenerator

import (
	"testing"

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

func TestResolveMachineID(t *testing.T) {
	t.Run("use explicit node id", func(t *testing.T) {
		machineID, err := resolveMachineID(123, "")
		require.NoError(t, err)
		require.Equal(t, uint16(123), machineID)
	})

	t.Run("use ip when node id auto", func(t *testing.T) {
		machineID, err := resolveMachineID(AutoNodeID, "10.20.30.40")
		require.NoError(t, err)
		require.Equal(t, uint16(30)<<8+uint16(40), machineID)
	})

	t.Run("use env ip when input ip empty", func(t *testing.T) {
		t.Setenv(DefaultPodIPEnvKey, "172.16.1.2")

		machineID, err := resolveMachineID(AutoNodeID, "")
		require.NoError(t, err)
		require.Equal(t, uint16(1)<<8+uint16(2), machineID)
	})

	t.Run("reject out of range node id", func(t *testing.T) {
		_, err := resolveMachineID(NodeID(65536), "")
		require.Error(t, err)
	})

	t.Run("reject invalid ip", func(t *testing.T) {
		_, err := resolveMachineID(AutoNodeID, "invalid-ip")
		require.Error(t, err)
	})
}

func TestNewSonyflakeID(t *testing.T) {
	t.Run("generate id with explicit node id", func(t *testing.T) {
		generator := NewSonyflakeID(1, "")
		require.NotZero(t, generator.MustNew())
	})

	t.Run("generate id with auto node id and ip", func(t *testing.T) {
		generator := NewSonyflakeID(AutoNodeID, "10.1.2.3")
		require.NotZero(t, generator.MustNew())
	})
}
