go_winter_work_2025/go/lesson6/testingF/fuzz_test.go
2025-02-25 20:56:21 +03:00

64 lines
2.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
}