package main import ( "errors" "strings" "testing" ) // Функция проверки, является ли строка палиндромом func IsPalindrome(s string) (bool, error) { // Ограничим размер строки для избежания чрезмерного использования памяти if len(s) > 1000 { return false, errors.New("input too long") } // Приведем строку к нижнему регистру и уберем пробелы processed := strings.ToLower(strings.ReplaceAll(s, " ", "")) // Проверяем, является ли строка палиндромом for i := 0; i < len(processed)/2; i++ { if processed[i] != processed[len(processed)-1-i] { return false, nil } } return true, nil } // Fuzz-тест для проверки функции IsPalindrome func FuzzIsPalindrome(f *testing.F) { // Добавляем базовые тестовые примеры f.Add("madam") // палиндром f.Add("racecar") // палиндром f.Add("hello") // не палиндром f.Add("A Santa at NASA") // палиндром с пробелами f.Add("😊😊😊😊😊") // палиндром с эмодзи f.Add("abc cba") // палиндром с пробелом f.Fuzz(func(t *testing.T, input string) { result, err := IsPalindrome(input) // Проверяем, что функция не завершилась с ошибкой для строк допустимой длины if len(input) <= 1000 && err != nil { t.Errorf("unexpected error for input %q: %v", input, err) } // Если строка перевернута и равна самой себе, это палиндром reversed := reverseString(input) expected := strings.ToLower(strings.ReplaceAll(input, " ", "")) if result && reversed != expected { t.Errorf("expected palindrome logic to pass, but got false for input %q", input) } }) } // Вспомогательная функция: переворачивает строку func reverseString(s string) string { runes := []rune(strings.ToLower(strings.ReplaceAll(s, " ", ""))) for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 { runes[i], runes[j] = runes[j], runes[i] } return string(runes) }