package id

import (
	"strings"
	"testing"
)

func TestValidate(t *testing.T) {
	tests := []struct {
		name string
		id   string
		ok   bool
	}{
		{name: "minimum length", id: "a1", ok: true},
		{name: "maximum length", id: strings.Repeat("a", MaxLength), ok: true},
		{name: "separators", id: "sandbox.V1_test-01", ok: true},
		{name: "too short", id: "a"},
		{name: "too long", id: strings.Repeat("a", MaxLength+1)},
		{name: "invalid first character", id: "-sandbox"},
		{name: "command substitution", id: "x$(id)"},
		{name: "path separator", id: "x/y"},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if got := Validate(tt.id) == nil; got != tt.ok {
				t.Fatalf("Validate(%q) success = %t, want %t", tt.id, got, tt.ok)
			}
		})
	}
}

func TestNew(t *testing.T) {
	value, err := New()
	if err != nil {
		t.Fatalf("New() error = %v", err)
	}
	if len(value) != 32 {
		t.Fatalf("New() length = %d, want 32", len(value))
	}
	if err := Validate(value); err != nil {
		t.Fatalf("New() generated invalid ID %q: %v", value, err)
	}
}

func TestNewWithPrefix(t *testing.T) {
	value, err := NewWithPrefix("wh_")
	if err != nil {
		t.Fatalf("NewWithPrefix() error = %v", err)
	}
	if len(value) != len("wh_")+32 || !strings.HasPrefix(value, "wh_") {
		t.Fatalf("NewWithPrefix() = %q, want wh_ prefix and 32 hex characters", value)
	}
}