64 lines
2.3 KiB
Go
64 lines
2.3 KiB
Go
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)
|
||
}
|