package util

import (
	"testing"

	"github.com/stretchr/testify/assert"
	"golang.org/x/text/cases"
	"golang.org/x/text/language"
)

type data struct {
	input    string
	expected string
}

func TestTitle(t *testing.T) {
	list := []*data{
		{input: "_", expected: "_"},
		{input: "abc", expected: "Abc"},
		{input: "ABC", expected: "ABC"},
		{input: "", expected: ""},
		{input: " abc", expected: " abc"},
	}
	for _, e := range list {
		assert.Equal(t, e.expected, Title(e.input))
	}
}

func TestUntitle(t *testing.T) {
	list := []*data{
		{input: "_", expected: "_"},
		{input: "Abc", expected: "abc"},
		{input: "ABC", expected: "aBC"},
		{input: "", expected: ""},
		{input: " abc", expected: " abc"},
	}

	for _, e := range list {
		assert.Equal(t, e.expected, Untitle(e.input))
	}
}

func TestIndex(t *testing.T) {
	list := []string{"a", "b", "c"}
	assert.Equal(t, 1, Index(list, "b"))
	assert.Equal(t, -1, Index(list, "d"))
}

func TestSafeString(t *testing.T) {
	list := []*data{
		{input: "_", expected: "_"},
		{input: "a-b-c", expected: "a_b_c"},
		{input: "123abc", expected: "_123abc"},
		{input: "汉abc", expected: "_abc"},
		{input: "汉a字", expected: "_a_"},
		{input: "キャラクターabc", expected: "______abc"},
		{input: "-a_B-C", expected: "_a_B_C"},
		{input: "a_B C", expected: "a_B_C"},
		{input: "A#B#C", expected: "A_B_C"},
		{input: "_123", expected: "_123"},
		{input: "", expected: ""},
		{input: "\t", expected: "_"},
		{input: "\n", expected: "_"},
	}
	for _, e := range list {
		assert.Equal(t, e.expected, SafeString(e.input))
	}
}

func TestEscapeGoKeyword(t *testing.T) {
	for k := range goKeyword {
		assert.Equal(t, goKeyword[k], EscapeGolangKeyword(k))
		assert.False(t, isGolangKeyword(cases.Title(language.English, cases.NoLower).String(k)))
	}
}
