package namegen

import (
	"strings"
	"testing"
)

func TestGenerate(t *testing.T) {
	adjSet := make(map[string]struct{}, len(adjectives))
	for _, a := range adjectives {
		adjSet[a] = struct{}{}
	}
	subSet := make(map[string]struct{}, len(substantives))
	for _, s := range substantives {
		subSet[s] = struct{}{}
	}

	seen := make(map[string]int)
	for i := 0; i < 200; i++ {
		name := Generate()
		parts := strings.Split(name, "-")
		if len(parts) != 2 {
			t.Fatalf("expected adj-noun form, got %q", name)
		}
		if _, ok := adjSet[parts[0]]; !ok {
			t.Fatalf("unknown adjective %q in %q", parts[0], name)
		}
		if _, ok := subSet[parts[1]]; !ok {
			t.Fatalf("unknown substantive %q in %q", parts[1], name)
		}
		seen[name]++
	}

	// Minimal variety check: adj-noun cartesian product is thousands of
	// combinations; 200 draws should hit more than a couple.
	if len(seen) < 10 {
		t.Fatalf("expected varied output, only saw %d distinct names", len(seen))
	}
}

func TestRandomIndex(t *testing.T) {
	if got := randomIndex(0); got != 0 {
		t.Fatalf("randomIndex(0) = %d, want 0", got)
	}
	if got := randomIndex(1); got != 0 {
		t.Fatalf("randomIndex(1) = %d, want 0", got)
	}
	for i := 0; i < 100; i++ {
		n := randomIndex(7)
		if n < 0 || n >= 7 {
			t.Fatalf("randomIndex(7) = %d, out of range", n)
		}
	}
}
