diff --git a/pkg/formatters/ast/ast.go b/pkg/formatters/ast/ast.go index 58f7aee..d7293b9 100644 --- a/pkg/formatters/ast/ast.go +++ b/pkg/formatters/ast/ast.go @@ -62,9 +62,26 @@ func (a *ASTer) спарситьФайлиДобавитьФункцию(func_na } fun := a.создатьФункцию(func_name, ps) - a.node.Decls = append(a.node.Decls, fun) + a.добавитьФункциюЕслиНету(fun) return nil } + +func (a *ASTer) добавитьФункциюЕслиНету(fun *ast.FuncDecl) { + for _, d := range a.node.Decls { + f, ok := d.(*ast.FuncDecl) + if !ok { + continue + } + if f.Name == nil { + continue + } + if f.Name.Name == fun.Name.Name { + return + } + } + + a.node.Decls = append(a.node.Decls, fun) +} func (a *ASTer) спарситьФайл() error { fset := token.NewFileSet() node, err := parser.ParseFile(fset, a.fname, nil, parser.ParseComments) diff --git a/pkg/formatters/ast/ast_test.go b/pkg/formatters/ast/ast_test.go index 8a247fc..aca0ba5 100644 --- a/pkg/formatters/ast/ast_test.go +++ b/pkg/formatters/ast/ast_test.go @@ -24,7 +24,7 @@ func resetTestData() { t = &testData{} } func beforeSuite() { - CharactersAroundMismatchToInclude = 20 + CharactersAroundMismatchToInclude = 50 } func afterSuite() { } diff --git a/pkg/formatters/ast/features/app.feature b/pkg/formatters/ast/features/app.feature index 0a61b81..f9fbaad 100644 --- a/pkg/formatters/ast/features/app.feature +++ b/pkg/formatters/ast/features/app.feature @@ -2,12 +2,11 @@ Функционал: AST-редактир go-файлов Сгенерированные функции автоматически добавляются в тест-файл текущего пакета - Контекст: + Сценарий: Добавление функции Дано Файл "mypkg_test.go": ``` package mypkg ``` - Сценарий: Добавление функции Когда Добавляется функция "ПриветМир" То Файл "mypkg_test.go" должен содержать: ``` @@ -19,6 +18,10 @@ ``` Сценарий: Добавление функции с параметрами: int + Дано Файл "mypkg_test.go": + ``` + package mypkg + ``` Дано Параметр: "arg1", "int" Когда Добавляется функция "ПриветМир" То Файл "mypkg_test.go" должен содержать: @@ -31,6 +34,10 @@ ``` Сценарий: Добавление функции с параметрами: int, string + Дано Файл "mypkg_test.go": + ``` + package mypkg + ``` Дано Параметр: "arg1", "int" Дано Параметр: "arg2", "string" Когда Добавляется функция "ПриветМир" @@ -44,6 +51,10 @@ ``` Сценарий: Добавление функции с параметрами: string, int + Дано Файл "mypkg_test.go": + ``` + package mypkg + ``` Дано Параметр: "arg1", "string" Дано Параметр: "arg2", "int" Когда Добавляется функция "ПриветМир" @@ -55,3 +66,68 @@ } ``` + + Сценарий: Добавление функции к существующей + Дано Файл "mypkg_test.go": + ``` + package mypkg + + func СделатьЧтото(arg1 string, arg2 int) { + a := 1 + } + + ``` + Дано Параметр: "arg1", "int" + Когда Добавляется функция "ПриветМир" + То Файл "mypkg_test.go" должен содержать: + ``` + package mypkg + + func СделатьЧтото(arg1 string, arg2 int) { + a := 1 + } + func ПриветМир(arg1 int) { + } + + ``` + + Сценарий: Не добавляет если такая функция уже есть + Дано Файл "mypkg_test.go": + ``` + package mypkg + + func ПриветМир(arg1 string, arg2 int) { + a := 1 + } + + ``` + Дано Параметр: "arg1", "int" + Когда Добавляется функция "ПриветМир" + Когда Добавляется функция "ПриветМир" + То Файл "mypkg_test.go" должен содержать: + ``` + package mypkg + + func ПриветМир(arg1 string, arg2 int) { + a := 1 + } + + ``` + + Сценарий: Не добавляет второй раз + Дано Файл "mypkg_test.go": + ``` + package mypkg + + ``` + Дано Параметр: "arg1", "int" + Когда Добавляется функция "ПриветМир" + Когда Добавляется функция "ПриветМир" + То Файл "mypkg_test.go" должен содержать: + ``` + package mypkg + + func ПриветМир(arg1 int) { + } + + ``` diff --git a/pkg/lib/lib.go b/pkg/lib/lib.go new file mode 100644 index 0000000..647d7d8 --- /dev/null +++ b/pkg/lib/lib.go @@ -0,0 +1,46 @@ +package lib + +import ( + "io" + "os" +) + +func ReadFile(path string) (string, error) { + ret, err := os.ReadFile(path) + if err != nil { + return "", err + } + return string(ret), nil +} +func WriteFile(path, data string) error { + return os.WriteFile(path, []byte(data), 0644) +} + +func CopyFile(src, dst string) (err error) { + in, err := os.Open(src) + if err != nil { + return + } + + defer in.Close() + + out, err := os.Create(dst) + if err != nil { + return + } + + defer func() { + cerr := out.Close() + if err == nil { + err = cerr + } + }() + + if _, err = io.Copy(out, in); err != nil { + return + } + + err = out.Sync() + + return +}