package main
import (
"errors"
"testing"
"unicode/utf8"
)
// ErrInvalidUTF8 представляет ошибку, указывающую на некорректные данные UTF-8.
var ErrInvalidUTF8 = errors.New("invalid utf8")
// GetUTFLength возвращает длину строки UTF8 и ошибку ErrInvalidUTF8 (в случае возникновения).
func GetUTFLength(input []byte) (int, error) {
if !utf8.Valid(input) {
return 0, ErrInvalidUTF8
}
return utf8.RuneCount(input), nil
}
// TestGetUTFLength проверяет возвращаемые значения функции GetUTFLength.
func TestGetUTFLength(t *testing.T) {
tests := []struct {
input []byte
expected int
err error
}{
// Тест с корректной строкой UTF-8.
{input: []byte("Hello, 世界"), expected: 9, err: nil},
// Тест с некорректной строкой UTF-8.
{input: []byte{0x80}), expected: 0, err: ErrInvalidUTF8},
// Тест с пустой строкой.
{input: []byte{}, expected: 0, err: nil},
// Тест с одной руной UTF-8.
{input: []byte("你"), expected: 1, err: nil},
}
for _, tt := range tests {
got, err := GetUTFLength(tt.input)
if got != tt.expected {
t.Errorf("GetUTFLength() got = %v, expected = %v", got, tt.expected)
}
if err != tt.err {
t.Errorf("GetUTFLength() error = %v, expected = %v", err, tt.err)
}
}
}
func main() {
// Тесты будут выполнены автоматически при запуске программы.
// Для выполнения тестов вручную можно использовать команду:
// go test -v
}
Функция GetUTFLength(input []byte) (int, error) возвращает длину строки UTF8 и ошибку ErrInvalidUTF8 (в случае возникновения). Напишите тест, который бы проверял возвращаемые функцией значения.
var ErrInvalidUTF8 = errors.New ("invalid utf8")
func GetUTFLength(input []byte) (int, error) {
if !utf8.Valid(input) {
return 0, ErrInvalidUTF8
}
return utf8.RuneCount(input), nil
}
Примечания
Функцию GetUTFLength реализовывать не нужно.