diff --git a/contrib/gotests_templates/call.tmpl b/contrib/gotests_templates/call.tmpl new file mode 100644 index 0000000000..4164f489b1 --- /dev/null +++ b/contrib/gotests_templates/call.tmpl @@ -0,0 +1 @@ +{{define "call"}}{{with .Receiver}}{{if not .IsStruct}}tt.{{end}}{{Receiver .}}.{{end}}{{.Name}}({{range $i, $el := .Parameters}}{{if $i}}, {{end}}{{if not .IsWriter}}tt.args.{{end}}{{Param .}}{{if .Type.IsVariadic}}...{{end}}{{end}}){{end}} diff --git a/contrib/gotests_templates/function.tmpl b/contrib/gotests_templates/function.tmpl new file mode 100644 index 0000000000..e850666855 --- /dev/null +++ b/contrib/gotests_templates/function.tmpl @@ -0,0 +1,107 @@ +{{define "function"}} +{{- $f := .}} + +func {{.TestName}}(t *testing.T) { + {{- with .Receiver}} + {{- if .IsStruct}} + {{- if .Fields}} + type fields struct { + {{- range .Fields}} + {{Field .}} {{.Type}} + {{- end}} + } + {{- end}} + {{- end}} + {{- end}} + {{- if .TestParameters}} + type args struct { + {{- range .TestParameters}} + {{Param .}} {{.Type}} + {{- end}} + } + {{- end}} + tests := []struct { + name string + {{- with .Receiver}} + {{- if and .IsStruct .Fields}} + fields fields + {{- else}} + {{Receiver .}} {{.Type}} + {{- end}} + {{- end}} + {{- if .TestParameters}} + args args + {{- end}} + setup func() error // Optional, delete if unused + teardown func() error // Optional, delete if unused + {{- range .TestResults}} + {{Want .}} {{.Type}} + {{- end}} + {{- if .ReturnsError}} + wantErr bool + {{- end}} + }{ + // TODO: Add test cases. + // { + // name: "Example Test", + // args: args { + // }, + // {{- range .TestResults}} + // want: {{Want .}} {{.Type}} + // {{- end}} + // setup: func() error { return nil }, + // teardown: func() error { return nil }, + // }, + } + for {{if (or .Subtests (not .IsNaked))}} _, tt := {{end}} range tests { + {{- if .Subtests}} + {{- if .Parallel}}tt := tt{{end}} + t.Run(tt.name, func(t *testing.T) { + {{- if .Parallel}}t.Parallel(){{end}} + {{- end}} + {{- with .Receiver}} + {{- if .IsStruct}} + {{Receiver .}} := {{if .Type.IsStar}}&{{end}}{{.Type.Value}}{ + {{- range .Fields}} + {{.Name}}: tt.fields.{{Field .}}, + {{- end}} + } + {{- end}} + {{- end}} + {{- range .Parameters}} + {{- if .IsWriter}} + {{Param .}} := &bytes.Buffer{} + {{- end}} + {{- end}} + defer tt.teardown() + if err := tt.setup(); err != nil { + t.Errorf("Setup for {{template "message" $f}} failed = %v", err) + return + } + {{- if and (not .OnlyReturnsError) (not .OnlyReturnsOneValue) }} + {{template "results" $f}} {{template "call" $f}} + {{- end}} + {{- if .ReturnsError}} + if {{if .OnlyReturnsError}} err := {{template "call" $f}}; {{end}} (err != nil) != tt.wantErr { + t.Errorf("{{template "message" $f}} error = %v, wantErr %v", {{template "inputs" $f}} err, tt.wantErr) + {{- if .TestResults}} + {{if .Subtests }}return{{else}}continue{{end}} + {{- end}} + } + {{- end}} + {{- range .TestResults}} + {{- if .IsWriter}} + if {{Got .}} := {{Param .}}.String(); {{Got .}} != tt.{{Want .}} { + {{- else if .IsBasicType}} + if {{if $f.OnlyReturnsOneValue}}{{Got .}} := {{template "inline" $f}}; {{end}} {{Got .}} != tt.{{Want .}} { + {{- else}} + if {{if $f.OnlyReturnsOneValue}}{{Got .}} := {{template "inline" $f}}; {{end}} !reflect.DeepEqual({{Got .}}, tt.{{Want .}}) { + {{- end}} + t.Errorf("{{template "message" $f}} {{if $f.ReturnsMultiple}}{{Got .}} {{end}}= %+v\nWant = %+v", {{template "inputs" $f}} {{Got .}}, tt.{{Want .}}) + } + {{- end}} + {{- if .Subtests }} }) {{- end -}} + } +} + +{{end}} diff --git a/contrib/gotests_templates/header.tmpl b/contrib/gotests_templates/header.tmpl new file mode 100644 index 0000000000..245569df7e --- /dev/null +++ b/contrib/gotests_templates/header.tmpl @@ -0,0 +1,10 @@ +{{define "header"}} +{{range .Comments}}{{.}} +{{end -}} +package {{.Package}} + +import ( +{{range .Imports}}{{.Name}} {{.Path}} +{{end}} +) +{{end}} diff --git a/contrib/gotests_templates/inline.tmpl b/contrib/gotests_templates/inline.tmpl new file mode 100644 index 0000000000..5ffc2f5812 --- /dev/null +++ b/contrib/gotests_templates/inline.tmpl @@ -0,0 +1 @@ +{{define "inline"}} {{template "call" .}} {{end}} diff --git a/contrib/gotests_templates/inputs.tmpl b/contrib/gotests_templates/inputs.tmpl new file mode 100644 index 0000000000..fb655da595 --- /dev/null +++ b/contrib/gotests_templates/inputs.tmpl @@ -0,0 +1 @@ +{{define "inputs"}}{{$f := .}}{{if not .Subtests}}tt.name, {{end}}{{if $f.PrintInputs}}{{range $f.Parameters}}tt.args.{{Param .}}, {{end}}{{end}}{{end}} diff --git a/contrib/gotests_templates/message.tmpl b/contrib/gotests_templates/message.tmpl new file mode 100644 index 0000000000..06068dfda5 --- /dev/null +++ b/contrib/gotests_templates/message.tmpl @@ -0,0 +1,3 @@ +{{define "message" -}} +{{if not .Subtests}}%q. {{end}}{{with .Receiver}}{{.Type.Value}}.{{end}}{{.Name}}({{if .PrintInputs}}{{range $i, $el := .Parameters}}{{if $i}}, {{end}}%v{{end}}{{end}}) +{{- end}} diff --git a/contrib/gotests_templates/results.tmpl b/contrib/gotests_templates/results.tmpl new file mode 100644 index 0000000000..de313bee85 --- /dev/null +++ b/contrib/gotests_templates/results.tmpl @@ -0,0 +1 @@ +{{define "results"}} {{range $i, $el := .Results}}{{if $i}}, {{end}}{{Got .}}{{end}}{{if .ReturnsError}}, err{{end}} {{if or .Results .ReturnsError}} := {{end}} {{end}}