package runlimit

import (
	"strings"
	"testing"

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

func TestRunLimitsAreStable(t *testing.T) {
	require.Equal(t, 10_000, MaxRunActivations)
	require.Equal(t, 4<<20, MaxRunPayloadBytes)
	require.Equal(t, 32, MaxRunPayloadJSONNesting)
	require.Equal(t, 8192, MaxRunPayloadJSONValues)
	require.Equal(t, 32<<20, MaxRunStateBytes)
	require.Equal(t, 64, MaxRunStateJSONNesting)
	require.Equal(t, MaxRunActivations*64, MaxRunStateJSONValues)
}

func TestNormalizedNumberStringMatchesRunPersistence(t *testing.T) {
	tests := []struct {
		name   string
		source string
		want   string
	}{
		{name: "positive exponent expands", source: "1e100", want: "1" + strings.Repeat("0", 100)},
		{name: "negative exponent expands", source: "1e-100", want: "0." + strings.Repeat("0", 99) + "1"},
		{name: "float64 underflow", source: "1e-4095", want: "0"},
		{name: "negative zero", source: "-0", want: "0"},
		{name: "insignificant zeroes", source: "1.2300", want: "1.23"},
		{name: "finite float64 rounding", source: "9007199254740993", want: "9007199254740992"},
	}
	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			got, err := NormalizedNumberString(test.source)
			require.NoError(t, err)
			require.Equal(t, test.want, got)
		})
	}
}

func TestNormalizedNumberStringRejectsUnsafeNumbers(t *testing.T) {
	for _, source := range []string{"NaN", "Inf", "-Inf", "1e4095", "01", "1 2"} {
		t.Run(source, func(t *testing.T) {
			_, err := NormalizedNumberString(source)
			require.Error(t, err)
		})
	}
}
