From 51de0247431a5979a26e62cead0a5aced41135a0 Mon Sep 17 00:00:00 2001 From: linbergil Date: Sun, 5 Nov 2023 15:14:44 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA?= =?UTF-8?q?=D0=B0=20=D1=87=D0=B8=D1=81=D0=B5=D0=BB=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=82=D0=BE=D1=80=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=94?= =?UTF-8?q?=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=20=D1=82=D0=B5=D1=81?= =?UTF-8?q?=D1=82=20=D0=B4=D0=BB=D1=8F=20=D0=BD=D0=BE=D0=B2=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D0=BF=D0=BE=D0=B2=D0=B5=D0=B4=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- unpack.go | 24 ++++++++++++++++++++---- unpack_test.go | 19 ++++++++++++++++++- 2 files changed, 38 insertions(+), 5 deletions(-) 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) + }) + } +}