package fieldnormalize

import "testing"

func TestNormalizeDDLDefault_StringStripsQuotes(t *testing.T) {
	got := NormalizeDDLDefault("'Draft'", "string")
	if got != "Draft" {
		t.Fatalf("got %#v, want %q", got, "Draft")
	}
}

func TestNormalizeDDLDefault_StringUnescapesDoubledQuotes(t *testing.T) {
	got := NormalizeDDLDefault("'It''s'", "string")
	if got != "It's" {
		t.Fatalf("got %#v, want %q", got, "It's")
	}
}

func TestNormalizeDDLDefault_BooleanTrueForms(t *testing.T) {
	for _, raw := range []string{"'1'", "'true'", "'True'", "'YES'", "1", "true"} {
		got := NormalizeDDLDefault(raw, "boolean")
		if got != true {
			t.Fatalf("raw=%q got %#v, want true", raw, got)
		}
	}
}

func TestNormalizeDDLDefault_BooleanFalseForms(t *testing.T) {
	for _, raw := range []string{"'0'", "'false'", "0", "'no'"} {
		got := NormalizeDDLDefault(raw, "boolean")
		if got != false {
			t.Fatalf("raw=%q got %#v, want false", raw, got)
		}
	}
}

func TestNormalizeDDLDefault_BooleanUnknownFallsBackToString(t *testing.T) {
	// Unknown boolean spelling must NOT silently coerce to false — that
	// would lose the original value. Per the function contract it falls
	// back to the trimmed string.
	got := NormalizeDDLDefault("'maybe'", "boolean")
	if got != "maybe" {
		t.Fatalf("got %#v, want trimmed string \"maybe\"", got)
	}
	// Quoted empty string is neither truthy nor falsy — fall back to
	// the empty string rather than silently becoming false.
	got = NormalizeDDLDefault("''", "boolean")
	if got != "" {
		t.Fatalf("got %#v, want empty string", got)
	}
}

func TestNormalizeDDLDefault_NumberCoerces(t *testing.T) {
	got := NormalizeDDLDefault("42", "number")
	if got != 42.0 {
		t.Fatalf("got %#v, want 42.0", got)
	}
	got = NormalizeDDLDefault("'3.14'", "currency")
	if got != 3.14 {
		t.Fatalf("got %#v, want 3.14", got)
	}
}

func TestNormalizeDDLDefault_EmptyIsNil(t *testing.T) {
	if got := NormalizeDDLDefault("", "string"); got != nil {
		t.Fatalf("got %#v, want nil", got)
	}
}

func TestNormalizeDDLDefault_UnknownTypeReturnsString(t *testing.T) {
	got := NormalizeDDLDefault("'mystery'", "uncharted")
	if got != "mystery" {
		t.Fatalf("got %#v, want 'mystery'", got)
	}
}

func TestNormalizeDDLDefaultString_PreservesRawSpelling(t *testing.T) {
	if got := NormalizeDDLDefaultString("'0'"); got != "0" {
		t.Fatalf("got %q, want 0", got)
	}
	if got := NormalizeDDLDefaultString("'Draft'"); got != "Draft" {
		t.Fatalf("got %q, want Draft", got)
	}
}
