Merge pull request #5 from linbergil/dev

поддержка чисел
This commit is contained in:
Илья Смышляев 2023-11-05 15:15:51 +03:00 committed by GitHub
commit 2bc41aa412
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 38 additions and 5 deletions

View File

@ -27,6 +27,12 @@ func Unpack(str string) (string, error) {
var runeArray = []rune(str) var runeArray = []rune(str)
//re, _ := regexp.Compile(`^\d|\d{2,}`)
//
//if re.MatchString(str) == true {
// return "", ErrInvalidString
//}
if len(runeArray) > 0 && unicode.IsDigit(runeArray[0]) { if len(runeArray) > 0 && unicode.IsDigit(runeArray[0]) {
// Если первый символ является цифрой, возвращаем ошибку "недопустимой строки". // Если первый символ является цифрой, возвращаем ошибку "недопустимой строки".
return "first rune is digit", ErrInvalidString return "first rune is digit", ErrInvalidString
@ -55,11 +61,21 @@ func Unpack(str string) (string, error) {
} }
case number: case number:
if unicode.IsDigit(char) { if unicode.IsDigit(char) {
// Если после цифры идет ещё одна цифра, возвращаем ошибку "недопустимой строки". var n = strconv.Itoa(numOfRepeat)
return "", ErrInvalidString numOfRepeat, _ = strconv.Atoi(n + string(char))
repStr, err := repeatRune(runeArray[i-2], numOfRepeat)
if err != nil {
// Если функция repeatRune возвращает ошибку, удаляем последний символ из результата.
res := result.String()
result.Reset()
result.WriteString(res[0 : len(res)-1])
} }
result.WriteString(repStr)
} else {
result.WriteRune(char) result.WriteRune(char)
currentState = start currentState = start
}
case escape: case escape:
// Если предыдущий символ - обратный слэш, добавляем текущий в результат. // Если предыдущий символ - обратный слэш, добавляем текущий в результат.
result.WriteRune(char) result.WriteRune(char)

View File

@ -39,7 +39,7 @@ func TestUnpack(t *testing.T) {
} }
func TestUnpackInvalidString(t *testing.T) { func TestUnpackInvalidString(t *testing.T) {
invalidStrings := []string{"3abc", "45", "aaa10b", "1"} invalidStrings := []string{"3abc", "45", "1"}
for _, tc := range invalidStrings { for _, tc := range invalidStrings {
tc := tc tc := tc
t.Run(tc, func(t *testing.T) { t.Run(tc, func(t *testing.T) {
@ -48,3 +48,20 @@ func TestUnpackInvalidString(t *testing.T) {
}) })
} }
} }
func TestStringContainsNumber(t *testing.T) {
testStrings := []struct {
input string
expected string
}{
{input: "aaa10b", expected: "aaaaaaaaaaaab"},
{input: "a12b4", expected: "aaaaaaaaaaaabbbb"},
}
for _, tc := range testStrings {
t.Run(tc.input, func(t *testing.T) {
result, err := Unpack(tc.input)
require.NoError(t, err)
require.Equal(t, tc.expected, result)
})
}
}