diff --git a/unpack.go b/unpack.go index 1fb908c..997b332 100644 --- a/unpack.go +++ b/unpack.go @@ -27,6 +27,12 @@ func Unpack(str string) (string, error) { 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]) { // Если первый символ является цифрой, возвращаем ошибку "недопустимой строки". return "first rune is digit", ErrInvalidString @@ -55,11 +61,21 @@ func Unpack(str string) (string, error) { } case number: if unicode.IsDigit(char) { - // Если после цифры идет ещё одна цифра, возвращаем ошибку "недопустимой строки". - return "", ErrInvalidString + var n = strconv.Itoa(numOfRepeat) + 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) + currentState = start } - result.WriteRune(char) - currentState = start + case escape: // Если предыдущий символ - обратный слэш, добавляем текущий в результат. result.WriteRune(char) diff --git a/unpack_test.go b/unpack_test.go index 990298f..5f7af3e 100644 --- a/unpack_test.go +++ b/unpack_test.go @@ -39,7 +39,7 @@ func TestUnpack(t *testing.T) { } func TestUnpackInvalidString(t *testing.T) { - invalidStrings := []string{"3abc", "45", "aaa10b", "1"} + invalidStrings := []string{"3abc", "45", "1"} for _, tc := range invalidStrings { tc := tc 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) + }) + } +}