package stringutils

import "testing"

func testLengthHelper(generator func(int) string, t *testing.T) {
	expectedLength := 20
	s := generator(expectedLength)
	if len(s) != expectedLength {
		t.Fatalf("Length of %s was %d but expected length %d", s, len(s), expectedLength)
	}
}

func testUniquenessHelper(generator func(int) string, t *testing.T) {
	repeats := 25
	set := make(map[string]struct{}, repeats)
	for i := 0; i < repeats; i = i + 1 {
		str := generator(64)
		if len(str) != 64 {
			t.Fatalf("Id returned is incorrect: %s", str)
		}
		if _, ok := set[str]; ok {
			t.Fatalf("Random number is repeated")
		}
		set[str] = struct{}{}
	}
}

func isASCII(s string) bool {
	for _, c := range s {
		if c > 127 {
			return false
		}
	}
	return true
}

func TestGenerateRandomAsciiStringLength(t *testing.T) {
	testLengthHelper(GenerateRandomASCIIString, t)
}

func TestGenerateRandomAsciiStringUniqueness(t *testing.T) {
	testUniquenessHelper(GenerateRandomASCIIString, t)
}

func TestGenerateRandomAsciiStringIsAscii(t *testing.T) {
	str := GenerateRandomASCIIString(64)
	if !isASCII(str) {
		t.Fatalf("%s contained non-ascii characters", str)
	}
}

func TestEllipsis(t *testing.T) {
	str := "t🐳ststring"
	newstr := Ellipsis(str, 3)
	if newstr != "t🐳s" {
		t.Fatalf("Expected t🐳s, got %s", newstr)
	}
	newstr = Ellipsis(str, 8)
	if newstr != "t🐳sts..." {
		t.Fatalf("Expected tests..., got %s", newstr)
	}
	newstr = Ellipsis(str, 20)
	if newstr != "t🐳ststring" {
		t.Fatalf("Expected t🐳ststring, got %s", newstr)
	}
}

func TestTruncate(t *testing.T) {
	str := "t🐳ststring"
	newstr := Truncate(str, 4)
	if newstr != "t🐳st" {
		t.Fatalf("Expected t🐳st, got %s", newstr)
	}
	newstr = Truncate(str, 20)
	if newstr != "t🐳ststring" {
		t.Fatalf("Expected t🐳ststring, got %s", newstr)
	}
}

func TestInSlice(t *testing.T) {
	slice := []string{"t🐳st", "in", "slice"}

	test := InSlice(slice, "t🐳st")
	if !test {
		t.Fatalf("Expected string t🐳st to be in slice")
	}
	test = InSlice(slice, "SLICE")
	if !test {
		t.Fatalf("Expected string SLICE to be in slice")
	}
	test = InSlice(slice, "notinslice")
	if test {
		t.Fatalf("Expected string notinslice not to be in slice")
	}
}

func TestShellQuoteArgumentsEmpty(t *testing.T) {
	actual := ShellQuoteArguments([]string{})
	expected := ""
	if actual != expected {
		t.Fatalf("Expected an empty string")
	}
}

func TestShellQuoteArguments(t *testing.T) {
	simpleString := "simpleString"
	complexString := "This is a 'more' complex $tring with some special char *"
	actual := ShellQuoteArguments([]string{simpleString, complexString})
	expected := "simpleString 'This is a '\\''more'\\'' complex $tring with some special char *'"
	if actual != expected {
		t.Fatalf("Expected \"%v\", got \"%v\"", expected, actual)
	}
}
