diff --git a/pkg/formatters/ast/ast.go b/pkg/formatters/ast/ast.go index 7f2b187..07243f8 100644 --- a/pkg/formatters/ast/ast.go +++ b/pkg/formatters/ast/ast.go @@ -6,6 +6,7 @@ import ( "go/parser" "go/token" "os" + "strings" "errors" ) @@ -40,7 +41,7 @@ func NewASTer() (*ASTer, error) { return a, nil } -func (a *ASTer) ДобавитьШаг(шаг, f string, ps Параметры) error { +func (a *ASTer) ДобавитьШаг(шаг, f, ps string) error { return a.добавитьШаг(шаг, f, ps) } @@ -58,8 +59,8 @@ func (a *ASTer) сгенеритьИмяФайла() { a.pkg_test_go_fname = a.pkg + "_test.go" } -func (a *ASTer) добавитьШаг(шаг, f string, ps Параметры) error { - err := a.добавитьШагвInitФайл(шаг, f, ps) +func (a *ASTer) добавитьШаг(шаг, f, ps string) error { + err := a.добавитьШагвInitФайл(шаг, f) if err != nil { return err } @@ -71,8 +72,8 @@ func (a *ASTer) добавитьШаг(шаг, f string, ps Параметры) return nil } -func (a *ASTer) добавитьШагвInitФайл(шаг, f string, ps Параметры) error { - err := a.спарситьInitФайлиДобавитьШаг(шаг, f, ps) +func (a *ASTer) добавитьШагвInitФайл(шаг, f string) error { + err := a.спарситьInitФайлиДобавитьШаг(шаг, f) if err != nil { return err } @@ -82,7 +83,7 @@ func (a *ASTer) добавитьШагвInitФайл(шаг, f string, ps Пар } return nil } -func (a *ASTer) добавитьФункциювТестовыйФайл(f string, ps Параметры) error { +func (a *ASTer) добавитьФункциювТестовыйФайл(f, ps string) error { err := a.спарситьФайлиДобавитьФункцию(f, ps) if err != nil { return err @@ -94,17 +95,17 @@ func (a *ASTer) добавитьФункциювТестовыйФайл(f strin return nil } -func (a *ASTer) спарситьInitФайлиДобавитьШаг(шаг, func_name string, ps Параметры) error { +func (a *ASTer) спарситьInitФайлиДобавитьШаг(шаг, func_name string) error { err := a.спарситьInitФайл() if err != nil { return err } - f := a.создатьШаг(шаг, func_name, ps) + f := a.создатьШаг(шаг, func_name) a.добавитьШагвИнициализаторЕслиНету(f) return nil } -func (a *ASTer) спарситьФайлиДобавитьФункцию(func_name string, ps Параметры) error { +func (a *ASTer) спарситьФайлиДобавитьФункцию(func_name, ps string) error { err := a.спарситьФайл() if err != nil { return err @@ -175,7 +176,7 @@ func (a *ASTer) спарситьФайл() error { return err } -func (a *ASTer) создатьШаг(шаг, func_name string, ps Параметры) *ast.ExprStmt { +func (a *ASTer) создатьШаг(шаг, func_name string) *ast.ExprStmt { st := &ast.ExprStmt{ X: &ast.CallExpr{ Fun: &ast.SelectorExpr{ @@ -194,7 +195,7 @@ func (a *ASTer) создатьШаг(шаг, func_name string, ps Парамет return st } -func (a *ASTer) создатьФункцию(func_name string, ps Параметры) *ast.FuncDecl { +func (a *ASTer) создатьФункцию(func_name, ps string) *ast.FuncDecl { f := &ast.FuncDecl{ Name: ast.NewIdent(func_name), Type: &ast.FuncType{ @@ -203,19 +204,52 @@ func (a *ASTer) создатьФункцию(func_name string, ps Парамет Body: &ast.BlockStmt{}, } - a.добавитьПараметрыФункции(ps, f) + a.добавитьПараметрыФункции(f, ps) return f } -func (a *ASTer) добавитьПараметрыФункции(ps Параметры, f *ast.FuncDecl) { - for _, p := range ps { - p := &ast.Field{ - Names: []*ast.Ident{ast.NewIdent(p[0])}, - Type: ast.NewIdent(p[1]), +func (a *ASTer) добавитьПараметрыФункции(f *ast.FuncDecl, ps string) { + params := a.сконвертитьСтрокувПараметры(ps) + + var names []*ast.Ident + + for _, p := range params { + switch len(p) { + case 0: + continue + case 1: + names = append(names, ast.NewIdent(p[0])) + case 2: + names = append(names, ast.NewIdent(p[0])) + field := &ast.Field{ + Names: names, + Type: ast.NewIdent(p[1]), + } + f.Type.Params.List = append(f.Type.Params.List, field) + names = nil } - f.Type.Params.List = append(f.Type.Params.List, p) } } +func (a *ASTer) сконвертитьСтрокувПараметры(in string) (ret Параметры) { + params := strings.Split(in, ",") + + for _, p := range params { + ps := strings.Fields(p) + параметр := Параметр{} + + switch len(ps) { + case 0: + continue + case 1: + параметр = append(параметр, ps[0]) + case 2: + параметр = append(параметр, ps[0], ps[1]) + } + ret = append(ret, параметр) + } + + return +} func (a *ASTer) перезаписатьInitФайл() error { err := переименоватьФайлСоВременем(INIT_TEST_GO_FNAME) diff --git a/pkg/formatters/ast/ast_test.go b/pkg/formatters/ast/ast_test.go index 6dd0d1f..a82fc94 100644 --- a/pkg/formatters/ast/ast_test.go +++ b/pkg/formatters/ast/ast_test.go @@ -13,7 +13,6 @@ import ( type testData struct { tempdir string - params Параметры } var ( @@ -58,12 +57,8 @@ func файл(fname string, content *godog.DocString) { Ok(err) } -func параметр(имя, тип string) { - t.params = append(t.params, Параметр{имя, тип}) -} - -func добавляетсяШагСФункцией(шаг, func_name string) { - err := ДобавитьШаг("`"+шаг+"`", func_name, t.params) +func добавляетсяШагСФункциейС(шаг, func_name, params string) { + err := ДобавитьШаг("`"+шаг+"`", func_name, params) Ok(err) } diff --git a/pkg/formatters/ast/features/app.feature b/pkg/formatters/ast/features/app.feature index d809d14..73a01cd 100644 --- a/pkg/formatters/ast/features/app.feature +++ b/pkg/formatters/ast/features/app.feature @@ -25,7 +25,7 @@ ``` package mypkg ``` - Когда Добавляется шаг: "^Привет Мир!$" с функцией "ПриветМир" + Когда Добавляется шаг: "^Привет Мир!$" с функцией "ПриветМир" с "" То Файл "init_test.go" должен содержать: ``` package mypkg @@ -77,8 +77,7 @@ ``` package mypkg ``` - Дано Параметр: "arg1", "int" - Когда Добавляется шаг: "^Привет Мир!$" с функцией "ПриветМир" + Когда Добавляется шаг: "^Привет Мир!$" с функцией "ПриветМир" с "arg1 int" То Файл "mypkg_test.go" должен содержать: ``` package mypkg @@ -111,9 +110,7 @@ ``` package mypkg ``` - Дано Параметр: "arg1", "int" - Дано Параметр: "arg2", "string" - Когда Добавляется шаг: "^Привет Мир!$" с функцией "ПриветМир" + Когда Добавляется шаг: "^Привет Мир!$" с функцией "ПриветМир" с "arg1 int, arg2 string" То Файл "mypkg_test.go" должен содержать: ``` package mypkg @@ -146,9 +143,7 @@ ``` package mypkg ``` - Дано Параметр: "arg1", "string" - Дано Параметр: "arg2", "int" - Когда Добавляется шаг: "^Привет Мир!$" с функцией "ПриветМир" + Когда Добавляется шаг: "^Привет Мир!$" с функцией "ПриветМир" с "arg1 string, arg2 int" То Файл "mypkg_test.go" должен содержать: ``` package mypkg @@ -187,8 +182,7 @@ } ``` - Дано Параметр: "arg1", "int" - Когда Добавляется шаг: "^Привет Мир!$" с функцией "ПриветМир" + Когда Добавляется шаг: "^Привет Мир!$" с функцией "ПриветМир" с "arg1 int" То Файл "init_test.go" должен содержать: ``` package mypkg @@ -250,9 +244,8 @@ } ``` - Дано Параметр: "arg1", "int" - Когда Добавляется шаг: "^Привет Мир!$" с функцией "ПриветМир" - Когда Добавляется шаг: "^Привет Мир!$" с функцией "ПриветМир" + Когда Добавляется шаг: "^Привет Мир!$" с функцией "ПриветМир" с "arg1 int" + Когда Добавляется шаг: "^Привет Мир!$" с функцией "ПриветМир" с "arg1 int" То Файл "init_test.go" должен содержать: ``` package mypkg @@ -306,9 +299,8 @@ package mypkg ``` - Дано Параметр: "arg1", "int" - Когда Добавляется шаг: "^Привет Мир!$" с функцией "ПриветМир" - Когда Добавляется шаг: "^Привет Мир!$" с функцией "ПриветМир" + Когда Добавляется шаг: "^Привет Мир!$" с функцией "ПриветМир" с "arg1 int" + Когда Добавляется шаг: "^Привет Мир!$" с функцией "ПриветМир" с "arg1 int" То Файл "init_test.go" должен содержать: ``` package mypkg @@ -336,3 +328,102 @@ } ``` + + Сценарий: Добавление шага с параметрами строкой + Дано Файл "init_test.go": + ``` + package mypkg + + func InitializeScenario(ctx *godog.ScenarioContext) { + + ctx.Before(func(ctx context.Context, sc *godog.Scenario) (context.Context, error) { + beforeScenario() + return ctx, nil + }) + ctx.After(func(ctx context.Context, sc *godog.Scenario, err error) (context.Context, error) { + afterScenario() + return ctx, nil + }) + InitializeGomegaForGodog(ctx) + } + + ``` + Дано Файл "mypkg_test.go": + ``` + package mypkg + ``` + Когда Добавляется шаг: "^Привет Мир!$" с функцией "ПриветМир" с "a int, s string, content *godog.DocString" + То Файл "mypkg_test.go" должен содержать: + ``` + package mypkg + + func ПриветМир(a int, s string, content *godog.DocString) { + } + + ``` + + Сценарий: Добавление шага с параметрами строкой с объединением по типу + Дано Файл "init_test.go": + ``` + package mypkg + + func InitializeScenario(ctx *godog.ScenarioContext) { + + ctx.Before(func(ctx context.Context, sc *godog.Scenario) (context.Context, error) { + beforeScenario() + return ctx, nil + }) + ctx.After(func(ctx context.Context, sc *godog.Scenario, err error) (context.Context, error) { + afterScenario() + return ctx, nil + }) + InitializeGomegaForGodog(ctx) + } + + ``` + Дано Файл "mypkg_test.go": + ``` + package mypkg + ``` + Когда Добавляется шаг: "^Привет Мир!$" с функцией "ПриветМир" с "a, b, c int" + То Файл "mypkg_test.go" должен содержать: + ``` + package mypkg + + func ПриветМир(a, b, c int) { + } + + ``` + + Сценарий: Добавление шага с параметрами строкой с объединением по типам + Дано Файл "init_test.go": + ``` + package mypkg + + func InitializeScenario(ctx *godog.ScenarioContext) { + + ctx.Before(func(ctx context.Context, sc *godog.Scenario) (context.Context, error) { + beforeScenario() + return ctx, nil + }) + ctx.After(func(ctx context.Context, sc *godog.Scenario, err error) (context.Context, error) { + afterScenario() + return ctx, nil + }) + InitializeGomegaForGodog(ctx) + } + + ``` + Дано Файл "mypkg_test.go": + ``` + package mypkg + ``` + Когда Добавляется шаг: "^Привет Мир!$" с функцией "ПриветМир" с "a, b int, s1, s2 string" + То Файл "mypkg_test.go" должен содержать: + ``` + package mypkg + + func ПриветМир(a, b int, s1, s2 string) { + } + + ``` diff --git a/pkg/formatters/ast/global.go b/pkg/formatters/ast/global.go index 0a10f16..282c242 100644 --- a/pkg/formatters/ast/global.go +++ b/pkg/formatters/ast/global.go @@ -4,7 +4,7 @@ package ast type Параметр []string type Параметры []Параметр -func ДобавитьШаг(шаг, f string, ps Параметры) error { +func ДобавитьШаг(шаг, f string, ps string) error { a, err := NewASTer() if err != nil { return err diff --git a/pkg/formatters/ast/init_test.go b/pkg/formatters/ast/init_test.go index 6546f05..a0cdc23 100644 --- a/pkg/formatters/ast/init_test.go +++ b/pkg/formatters/ast/init_test.go @@ -12,8 +12,7 @@ import ( func InitializeScenario(ctx *godog.ScenarioContext) { ctx.Step(`^Файл "([^"]*)":$`, файл) - ctx.Step(`^Параметр: "([^"]*)", "([^"]*)"$`, параметр) - ctx.Step(`^Добавляется шаг: "([^"]*)" с функцией "([^"]*)"$`, добавляетсяШагСФункцией) + ctx.Step(`^Добавляется шаг: "([^"]*)" с функцией "([^"]*)" с "([^"]*)"$`, добавляетсяШагСФункциейС) ctx.Step(`^Файл "([^"]*)" должен содержать:$`, файлДолженСодержать) // -----------------------