package core

import "testing"

func TestPrefixDelta(t *testing.T) {
	tests := []struct {
		name string
		prev string
		curr string
		want string
	}{
		{
			name: "monotono append normal",
			prev: "PON",
			curr: "PONG",
			want: "G",
		},
		{
			name: "prev vacio devuelve curr completo",
			prev: "",
			curr: "abc",
			want: "abc",
		},
		{
			name: "sin cambios devuelve vacio",
			prev: "abc",
			curr: "abc",
			want: "",
		},
		{
			name: "divergencia en medio devuelve desde divergencia",
			prev: "abc",
			curr: "abXY",
			want: "XY",
		},
		{
			name: "curr mas corto que prev devuelve vacio",
			prev: "abcdef",
			curr: "abc",
			want: "",
		},
		{
			name: "multibyte cafe streaming",
			prev: "café",
			curr: "café con leche",
			want: " con leche",
		},
		{
			name: "multibyte prefijo parcial antes de acento",
			prev: "ca",
			curr: "café",
			want: "fé",
		},
		{
			name: "ambos vacios devuelve vacio",
			prev: "",
			curr: "",
			want: "",
		},
		{
			name: "prev no vacio curr vacio devuelve vacio",
			prev: "hola",
			curr: "",
			want: "",
		},
		{
			name: "determinismo misma entrada misma salida",
			prev: "hello world",
			curr: "hello world!",
			want: "!",
		},
	}

	for _, tc := range tests {
		t.Run(tc.name, func(t *testing.T) {
			got := PrefixDelta(tc.prev, tc.curr)
			if got != tc.want {
				t.Errorf("PrefixDelta(%q, %q) = %q, want %q", tc.prev, tc.curr, got, tc.want)
			}
			// Verificar determinismo: segunda llamada produce el mismo resultado.
			got2 := PrefixDelta(tc.prev, tc.curr)
			if got != got2 {
				t.Errorf("no determinista: primera=%q segunda=%q", got, got2)
			}
		})
	}
}
