package keyspace

import (
	"strings"
	"testing"
)

func TestKeyspaceClassification(t *testing.T) {
	if !IsBuiltIn("system") {
		t.Fatal("expected system to be built-in")
	}
	if IsBuiltIn("systemx") {
		t.Fatal("expected systemx to be non-built-in")
	}
	if !IsSystem("SYSTEM") {
		t.Fatal("expected SYSTEM to be system keyspace")
	}
	if IsSystem("system_views") {
		t.Fatal("expected system_views to be virtual, not system")
	}
	if !IsVirtual("system_views") {
		t.Fatal("expected system_views to be virtual")
	}
	if IsVirtual("system") {
		t.Fatal("expected system to be non-virtual")
	}
}

func TestIsInternalSchema(t *testing.T) {
	if IsInternalSchema("information_schema") {
		t.Fatal("expected information_schema to be accessible")
	}
	if IsInternalSchema("app_schema") {
		t.Fatal("expected app_schema to be non-internal")
	}
}

func TestValidateIdentifier(t *testing.T) {
	if err := ValidateIdentifier("", "keyspace"); err == nil {
		t.Fatal("expected empty keyspace to error")
	}
	if err := ValidateIdentifier("valid_name", "keyspace"); err != nil {
		t.Fatalf("unexpected error for valid keyspace: %v", err)
	}
	longName := strings.Repeat("a", 65)
	if err := ValidateIdentifier(longName, "keyspace"); err == nil {
		t.Fatal("expected length error for long keyspace name")
	}
	if err := ValidateIdentifier("bad\x00name", "keyspace"); err == nil {
		t.Fatal("expected NUL error for keyspace name")
	}
	invalidUTF8 := string([]byte{0xff})
	if err := ValidateIdentifier(invalidUTF8, "keyspace"); err == nil {
		t.Fatal("expected UTF-8 error for keyspace name")
	}
}
