package main

import (
	"bytes"
	"strings"
	"testing"
)

func TestSafeIdentifier(t *testing.T) {
	for _, name := range []string{"nexuscrm", "nexuscrm_l0_neutrality_ci", "A1"} {
		if !safeIdentifier(name) {
			t.Fatalf("safeIdentifier(%q) = false, want true", name)
		}
	}
	for _, name := range []string{"", "with-dash", "with space", "quoted`name", strings.Repeat("x", 65)} {
		if safeIdentifier(name) {
			t.Fatalf("safeIdentifier(%q) = true, want false", name)
		}
	}
}

func TestBatchValue(t *testing.T) {
	for _, test := range []struct {
		value any
		want  string
	}{
		{nil, "NULL"},
		{[]byte("a\tb\nc\\d\x00"), "a\\tb\\nc\\\\d\\0"},
		{42, "42"},
	} {
		if got := batchValue(test.value); got != test.want {
			t.Errorf("batchValue(%#v) = %q, want %q", test.value, got, test.want)
		}
	}
}

func TestRunRejectsAmbiguousActionsBeforeOpeningDatabase(t *testing.T) {
	for _, args := range [][]string{
		nil,
		{"query"},
		{"--sql", "SELECT 1", "unknown"},
		{"--database", "db", "--sql", "SELECT 1", "query", "exec"},
		{"--database", "db", "--sql", "SELECT 1", "reset-database"},
	} {
		var stdout, stderr bytes.Buffer
		if err := run(args, &stdout, &stderr); err == nil {
			t.Errorf("run(%q) unexpectedly succeeded", args)
		}
	}
}
