Skip to content

Commit c260668

Browse files
ivanmatmatioktalz
authored andcommitted
MINOR: automatic unit tests generation
temp temp2
1 parent 2d5fce9 commit c260668

299 files changed

Lines changed: 39501 additions & 3247 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitlab-ci.yml

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,17 @@ generate:
7878
tags:
7979
- go
8080
before_script:
81-
- find -maxdepth 1 -type f -name "*.go" -exec rm {} \;
81+
- find models -maxdepth 1 -type f -name "*.go" -exec rm {} \;
8282
- make models
8383
script:
84-
- test -z "$(git diff 2> /dev/null)" || exit "Models are not generated, issue \`make models\` and commit the result"
84+
- |
85+
# Check for unstaged changes
86+
if ! git diff --quiet 2>/dev/null; then
87+
echo "Diff output:"
88+
git diff
89+
echo "Models are not generated. Please run \`make models\` and commit the result."
90+
exit 1
91+
fi
8592
- test -z "$(git ls-files --others --exclude-standard 2> /dev/null)" || exit "Models generation created untracked files, cannot proceed"
8693
rules:
8794
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'

.golangci.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ linters:
3838
- gci
3939
- goconst
4040
- recvcheck
41-
- tenv # deprecated
41+
- tenv # deprecated
42+
- gocritic
4243

4344
issues:
4445
exclude-files:

Makefile

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,22 +33,13 @@ spec:
3333
go run cmd/specification/*.go -file specification/haproxy-spec.yaml > specification/build/haproxy_spec.yaml
3434

3535
.PHONY: models
36-
models: gentypes spec swagger-check
37-
./bin/swagger generate model --additional-initialism=FCGI -f ${PROJECT_PATH}/specification/build/haproxy_spec.yaml -r ${PROJECT_PATH}/specification/copyright.txt -m models -t ${PROJECT_PATH}
38-
rm -rf models/server_params_prepare_for_runtime.go
39-
rm -rf models/*_compare.go
40-
rm -rf models/*_compare_test.go
41-
go run cmd/struct_equal_generator/*.go -l ${PROJECT_PATH}/specification/copyright.txt ${PROJECT_PATH}/models
42-
go run cmd/struct_tags_checker/*.go ${PROJECT_PATH}/models
43-
go run cmd/kubebuilder_marker_generator/*.go ${PROJECT_PATH}/models
44-
go run cmd/server_params_runtime/*.go ${PROJECT_PATH}/models
45-
46-
.PHONY: models-with-go-method-gen
47-
models-with-go-method-gen: gentypes spec go-method-gen-check
36+
models: gentypes spec swagger-check go-method-gen-check
4837
./bin/swagger generate model --additional-initialism=FCGI -f ${PROJECT_PATH}/specification/build/haproxy_spec.yaml -r ${PROJECT_PATH}/specification/copyright.txt -m models -t ${PROJECT_PATH}
4938
rm -rf models/server_params_prepare_for_runtime.go
5039
rm -rf models/*_generated*.go
40+
rm -rf models/*_compare_test.go
5141
./bin/go-method-gen --header-file=specification/copyright.txt --scan=models --debug --overrides=models/funcs/overrides.yaml && find ./generated -name "*.go" -exec cp {} ./models \; && rm -rf generated
42+
go run cmd/struct_equal_generator/*.go -l ${PROJECT_PATH}/specification/copyright.txt ${PROJECT_PATH}/models
5243
go run cmd/struct_tags_checker/*.go ${PROJECT_PATH}/models
5344
go run cmd/kubebuilder_marker_generator/*.go ${PROJECT_PATH}/models
5445
go run cmd/server_params_runtime/*.go ${PROJECT_PATH}/models

cmd/struct_equal_generator/embed.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,5 @@ import (
77
//go:embed header.tmpl
88
var tmplHeader string
99

10-
//go:embed generate.tmpl
11-
var tmplEqualAndDiff string
12-
1310
//go:embed test.tmpl
1411
var tmplCompareTest string

cmd/struct_equal_generator/generate.go

Lines changed: 0 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -6,49 +6,6 @@ import (
66
)
77

88
func generateEqualAndDiff(opt generateEqualAndDiffOptions) error {
9-
funcMaps := template.FuncMap{
10-
"HasPrefix": strings.HasPrefix,
11-
"TrimPrefix": strings.TrimPrefix,
12-
"Title": toTitle,
13-
"CamelCase": toCamelCase,
14-
"LowerCase": toLowerCase,
15-
"JSON": toJSON,
16-
}
17-
tmpl, err := template.New("generate.tmpl").Funcs(funcMaps).Parse(tmplEqualAndDiff)
18-
if err != nil {
19-
return err
20-
}
21-
22-
data := map[string]interface{}{
23-
"Mode": opt.Mode,
24-
"Name": opt.Name,
25-
"Type": opt.Type,
26-
"Fields": opt.Fields,
27-
"NeedsOptions": opt.NeedsOptions,
28-
"NeedsOptionsIndex": opt.NeedsOptionsIndex,
29-
"IsBasicType": opt.IsBasicType,
30-
"IsComplex": opt.IsComplex,
31-
"IsComparable": opt.IsComparable,
32-
"IsPointer": opt.IsPointer,
33-
}
34-
35-
functions := map[string]interface{}{
36-
"Functions": []interface{}{
37-
map[string]interface{}{
38-
"Name": "Equal",
39-
"Data": data,
40-
},
41-
map[string]interface{}{
42-
"Name": "Diff",
43-
"Data": data,
44-
},
45-
},
46-
}
47-
48-
err = tmpl.Execute(opt.File, functions)
49-
if err != nil {
50-
return err
51-
}
529
return generateCompareTests(opt)
5310
}
5411

cmd/struct_equal_generator/main.go

Lines changed: 1 addition & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ func scanAllTypes(fileName string) []string {
7171
return typesInFile
7272
}
7373

74-
func generate(fileName string, args Args) (string, error) { //nolint:gocognit,maintidx
74+
func generate(fileName string, args Args) (string, error) { //nolint:gocognit
7575
fset := token.NewFileSet()
7676
var packageName string
7777

@@ -81,43 +81,19 @@ func generate(fileName string, args Args) (string, error) { //nolint:gocognit,ma
8181
}
8282
sourceOfFile = string(src)
8383

84-
// node, err := parser.ParseFile(fset, fileName, nil, parser.ParseComments)
8584
node, err := parser.ParseFile(fset, "", src, 0)
8685
if err != nil {
8786
return packageName, err
8887
}
89-
generatedFileName := strings.TrimSuffix(fileName, ".go") + "_compare.go"
9088
generatedFileNameTest := strings.TrimSuffix(fileName, ".go") + "_compare_test.go"
9189

92-
_ = os.Truncate(generatedFileName, 0)
93-
file, err := os.OpenFile(generatedFileName, os.O_CREATE|os.O_WRONLY, 0o600)
94-
if err != nil {
95-
return packageName, err
96-
}
97-
defer file.Close()
98-
9990
_ = os.Truncate(generatedFileNameTest, 0)
10091
fileTest, err := os.OpenFile(generatedFileNameTest, os.O_CREATE|os.O_WRONLY, 0o600)
10192
if err != nil {
10293
return packageName, err
10394
}
10495
defer fileTest.Close()
10596

106-
// Adding the header to the generated file
107-
tmpl, err := template.New("generate.tmpl").Parse(tmplHeader)
108-
// ParseFiles(path.Join(templatePath))
109-
if err != nil {
110-
return packageName, err
111-
}
112-
113-
err = tmpl.Execute(file, map[string]interface{}{
114-
"Package": node.Name.String(),
115-
"License": args.License,
116-
})
117-
if err != nil {
118-
return packageName, err
119-
}
120-
12197
// Adding the header to the generated file
12298
tmpl2, err := template.New("generate.tmpl").Parse(tmplHeader)
12399
// ParseFiles(path.Join(templatePath))
@@ -176,7 +152,6 @@ func generate(fileName string, args Args) (string, error) { //nolint:gocognit,ma
176152
hasTests = true
177153
err = generateEqualAndDiff(generateEqualAndDiffOptions{
178154
PackageName: packageName,
179-
File: file,
180155
FileTest: fileTest,
181156
Name: currSpecType.Name.Name,
182157
CurrType: currSpecType,
@@ -192,7 +167,6 @@ func generate(fileName string, args Args) (string, error) { //nolint:gocognit,ma
192167
hasTests = true
193168
err = generateEqualAndDiff(generateEqualAndDiffOptions{
194169
PackageName: packageName,
195-
File: file,
196170
FileTest: fileTest,
197171
Name: currSpecType.Name.Name,
198172
NeedsOptions: false,
@@ -211,7 +185,6 @@ func generate(fileName string, args Args) (string, error) { //nolint:gocognit,ma
211185
}
212186
err = generateEqualAndDiff(generateEqualAndDiffOptions{
213187
PackageName: packageName,
214-
File: file,
215188
FileTest: fileTest,
216189
Name: currSpecType.Name.Name,
217190
Type: res.Name,
@@ -237,7 +210,6 @@ func generate(fileName string, args Args) (string, error) { //nolint:gocognit,ma
237210
}
238211
err = generateEqualAndDiff(generateEqualAndDiffOptions{
239212
PackageName: packageName,
240-
File: file,
241213
FileTest: fileTest,
242214
Name: currSpecType.Name.Name,
243215
Type: res.Name,
@@ -265,11 +237,6 @@ func generate(fileName string, args Args) (string, error) { //nolint:gocognit,ma
265237
} else {
266238
os.Remove(generatedFileNameTest)
267239
}
268-
// Format the file
269-
err = fmtFile(generatedFileName)
270-
if err != nil {
271-
return packageName, err
272-
}
273240
return packageName, nil
274241
}
275242

cmd/struct_equal_generator/misc.go

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"os"
66
"strings"
77

8-
jsoniter "github.com/json-iterator/go"
98
"golang.org/x/text/cases"
109
"golang.org/x/text/language"
1110
)
@@ -28,7 +27,6 @@ type Field struct {
2827
}
2928

3029
type generateEqualAndDiffOptions struct {
31-
File *os.File
3230
FileTest *os.File
3331
CurrType *ast.TypeSpec
3432
PackageName string
@@ -49,15 +47,6 @@ func toTitle(s string) string {
4947
return caser.String(strings.TrimPrefix(s, "*"))
5048
}
5149

52-
func toJSON(x any) string {
53-
json := jsoniter.ConfigCompatibleWithStandardLibrary
54-
b, err := json.Marshal(x)
55-
if err != nil {
56-
panic(err)
57-
}
58-
return string(b)
59-
}
60-
6150
func toCamelCase(s string) string {
6251
caser := cases.Title(language.Und)
6352
var result string
@@ -72,20 +61,6 @@ func toCamelCase(s string) string {
7261
return result
7362
}
7463

75-
func toLowerCase(s string) string {
76-
caser := cases.Lower(language.Und)
77-
var result string
78-
words := strings.Split(s, "_")
79-
80-
for _, word := range words {
81-
result += caser.String(word)
82-
}
83-
84-
result = strings.ToLower(result[:1]) + result[1:]
85-
86-
return result
87-
}
88-
8964
// isComparable checks if a given type is comparable.
9065
// It takes in the name of the type as a string and returns a boolean value.
9166
func isComparable(typeName string) bool {

cmd/struct_equal_generator/test.tmpl

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,13 +112,14 @@ func Test{{$.Name}}{{.}}False(t *testing.T) {
112112
{{- if eq $.FieldCount 0 }}
113113
if len(result) == 0 {
114114
{{- else }}
115+
listDiffFields := GetListOfDiffFields(result)
115116
{{- if $.HasIndex }}
116-
if len(result) != {{$.FieldCount}} -1 {
117+
if len(result) != {{$.FieldCount}} -1 {
117118
{{- else }}
118-
if len(result) != {{$.FieldCount}} {
119+
if len(listDiffFields) != {{$.FieldCount}} {
119120
{{end -}}
120121
{{end -}}
121-
{{end -}}
122+
{{end -}}
122123
json := jsoniter.ConfigCompatibleWithStandardLibrary
123124
a, err := json.Marshal(&sample.a)
124125
if err != nil {

cmd/struct_equal_generator/utils.tmpl

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
2+
3+
import (
4+
"fmt"
5+
"reflect"
6+
"strings"
7+
"unicode"
8+
)
9+
10+
111
var NilSameAsEmpty = true
212
var SkipIndex = true
313

@@ -136,3 +146,68 @@ func equalMapStringMapSting(m1, m2 map[string]map[string]string, opt Options) bo
136146
}
137147
return true
138148
}
149+
150+
151+
func GetListOfFields(typ reflect.Type) []string {
152+
if typ.Kind() != reflect.Struct {
153+
return nil
154+
}
155+
var fields []string
156+
for i := 0; i < typ.NumField(); i++ {
157+
fieldName := typ.Field(i).Name
158+
if fieldName == "Metadata" {
159+
continue
160+
}
161+
fields = append(fields, typ.Field(i).Name)
162+
}
163+
return fields
164+
}
165+
166+
func GetListOfDiffFields(diffs map[string][]interface{}) []string {
167+
fields := make(map[string]struct{}, len(diffs))
168+
for diff := range diffs {
169+
var sb strings.Builder
170+
for _, r := range diff {
171+
if !(unicode.IsLetter(r) || unicode.IsNumber(r)) {
172+
break
173+
}
174+
sb.WriteRune(r)
175+
}
176+
key := sb.String()
177+
if key == "Metadata" {
178+
continue
179+
}
180+
fields[key] = struct{}{}
181+
}
182+
result := make([]string, 0, len(fields))
183+
for k := range fields {
184+
result = append(result, k)
185+
}
186+
return result
187+
}
188+
189+
func DiffFields(fields1, fields2 []string) ([]string, []string) {
190+
var result1 []string
191+
var result2 []string
192+
for _, f1 := range fields1 {
193+
if !contains(fields2, f1) {
194+
result1 = append(result1, f1)
195+
}
196+
}
197+
for _, f2 := range fields2 {
198+
if !contains(fields1, f2) {
199+
result2 = append(result2, f2)
200+
}
201+
}
202+
return result1, result2
203+
204+
}
205+
206+
func contains(slice []string, item string) bool {
207+
for _, s := range slice {
208+
if s == item {
209+
return true
210+
}
211+
}
212+
return false
213+
}

0 commit comments

Comments
 (0)