From 24c6a553745290476658d28b28fe13cafff0f697 Mon Sep 17 00:00:00 2001 From: gamife Date: Sat, 28 Nov 2020 15:18:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E6=8E=89=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gin/binding/form_mapping_benchmark_test.go | 67 -- gin/binding/form_mapping_test.go | 281 ----- gin/binding/json_test.go | 30 - gin/binding/msgpack_test.go | 34 - gin/binding/multipart_form_mapping_test.go | 138 --- gin/binding/validate_test.go | 228 ---- gin/binding/xml_test.go | 25 - gin/binding/yaml_test.go | 21 - gin/internal/bytesconv/bytesconv_test.go | 99 -- go-playground/universal-translator/go.sum | 49 - go-playground/validator/v10/benchmarks_test.go | 1099 -------------------- go-playground/validator/v10/errors.go | 2 +- .../v10/non-standard/validators/notblank_test.go | 65 -- go-playground/validator/v10/testdata/a.go | 1 - .../validator/v10/translations/zh/zh_test.go | 661 ------------ go.mod | 3 - 16 files changed, 1 insertion(+), 2802 deletions(-) delete mode 100644 gin/binding/form_mapping_benchmark_test.go delete mode 100644 gin/binding/form_mapping_test.go delete mode 100644 gin/binding/json_test.go delete mode 100644 gin/binding/msgpack_test.go delete mode 100644 gin/binding/multipart_form_mapping_test.go delete mode 100644 gin/binding/validate_test.go delete mode 100644 gin/binding/xml_test.go delete mode 100644 gin/binding/yaml_test.go delete mode 100644 gin/internal/bytesconv/bytesconv_test.go delete mode 100644 go-playground/universal-translator/go.sum delete mode 100644 go-playground/validator/v10/benchmarks_test.go delete mode 100644 go-playground/validator/v10/non-standard/validators/notblank_test.go delete mode 100644 go-playground/validator/v10/testdata/a.go delete mode 100644 go-playground/validator/v10/translations/zh/zh_test.go diff --git a/gin/binding/form_mapping_benchmark_test.go b/gin/binding/form_mapping_benchmark_test.go deleted file mode 100644 index 9572ea0..0000000 --- a/gin/binding/form_mapping_benchmark_test.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2019 Gin Core Team. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import ( - "testing" - "time" - - "github.com/stretchr/testify/assert" -) - -var form = map[string][]string{ - "name": {"mike"}, - "friends": {"anna", "nicole"}, - "id_number": {"12345678"}, - "id_date": {"2018-01-20"}, -} - -type structFull struct { - Name string `form:"name"` - Age int `form:"age,default=25"` - Friends []string `form:"friends"` - ID *struct { - Number string `form:"id_number"` - DateOfIssue time.Time `form:"id_date" time_format:"2006-01-02" time_utc:"true"` - } - Nationality *string `form:"nationality"` -} - -func BenchmarkMapFormFull(b *testing.B) { - var s structFull - for i := 0; i < b.N; i++ { - err := mapForm(&s, form) - if err != nil { - b.Fatalf("Error on a form mapping") - } - } - b.StopTimer() - - t := b - assert.Equal(t, "mike", s.Name) - assert.Equal(t, 25, s.Age) - assert.Equal(t, []string{"anna", "nicole"}, s.Friends) - assert.Equal(t, "12345678", s.ID.Number) - assert.Equal(t, time.Date(2018, 1, 20, 0, 0, 0, 0, time.UTC), s.ID.DateOfIssue) - assert.Nil(t, s.Nationality) -} - -type structName struct { - Name string `form:"name"` -} - -func BenchmarkMapFormName(b *testing.B) { - var s structName - for i := 0; i < b.N; i++ { - err := mapForm(&s, form) - if err != nil { - b.Fatalf("Error on a form mapping") - } - } - b.StopTimer() - - t := b - assert.Equal(t, "mike", s.Name) -} diff --git a/gin/binding/form_mapping_test.go b/gin/binding/form_mapping_test.go deleted file mode 100644 index 2675d46..0000000 --- a/gin/binding/form_mapping_test.go +++ /dev/null @@ -1,281 +0,0 @@ -// Copyright 2019 Gin Core Team. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import ( - "reflect" - "testing" - "time" - - "github.com/stretchr/testify/assert" -) - -func TestMappingBaseTypes(t *testing.T) { - intPtr := func(i int) *int { - return &i - } - for _, tt := range []struct { - name string - value interface{} - form string - expect interface{} - }{ - {"base type", struct{ F int }{}, "9", int(9)}, - {"base type", struct{ F int8 }{}, "9", int8(9)}, - {"base type", struct{ F int16 }{}, "9", int16(9)}, - {"base type", struct{ F int32 }{}, "9", int32(9)}, - {"base type", struct{ F int64 }{}, "9", int64(9)}, - {"base type", struct{ F uint }{}, "9", uint(9)}, - {"base type", struct{ F uint8 }{}, "9", uint8(9)}, - {"base type", struct{ F uint16 }{}, "9", uint16(9)}, - {"base type", struct{ F uint32 }{}, "9", uint32(9)}, - {"base type", struct{ F uint64 }{}, "9", uint64(9)}, - {"base type", struct{ F bool }{}, "True", true}, - {"base type", struct{ F float32 }{}, "9.1", float32(9.1)}, - {"base type", struct{ F float64 }{}, "9.1", float64(9.1)}, - {"base type", struct{ F string }{}, "test", string("test")}, - {"base type", struct{ F *int }{}, "9", intPtr(9)}, - - // zero values - {"zero value", struct{ F int }{}, "", int(0)}, - {"zero value", struct{ F uint }{}, "", uint(0)}, - {"zero value", struct{ F bool }{}, "", false}, - {"zero value", struct{ F float32 }{}, "", float32(0)}, - } { - tp := reflect.TypeOf(tt.value) - testName := tt.name + ":" + tp.Field(0).Type.String() - - val := reflect.New(reflect.TypeOf(tt.value)) - val.Elem().Set(reflect.ValueOf(tt.value)) - - field := val.Elem().Type().Field(0) - - _, err := mapping(val, emptyField, formSource{field.Name: {tt.form}}, "form") - assert.NoError(t, err, testName) - - actual := val.Elem().Field(0).Interface() - assert.Equal(t, tt.expect, actual, testName) - } -} - -func TestMappingDefault(t *testing.T) { - var s struct { - Int int `form:",default=9"` - Slice []int `form:",default=9"` - Array [1]int `form:",default=9"` - } - err := mappingByPtr(&s, formSource{}, "form") - assert.NoError(t, err) - - assert.Equal(t, 9, s.Int) - assert.Equal(t, []int{9}, s.Slice) - assert.Equal(t, [1]int{9}, s.Array) -} - -func TestMappingSkipField(t *testing.T) { - var s struct { - A int - } - err := mappingByPtr(&s, formSource{}, "form") - assert.NoError(t, err) - - assert.Equal(t, 0, s.A) -} - -func TestMappingIgnoreField(t *testing.T) { - var s struct { - A int `form:"A"` - B int `form:"-"` - } - err := mappingByPtr(&s, formSource{"A": {"9"}, "B": {"9"}}, "form") - assert.NoError(t, err) - - assert.Equal(t, 9, s.A) - assert.Equal(t, 0, s.B) -} - -func TestMappingUnexportedField(t *testing.T) { - var s struct { - A int `form:"a"` - b int `form:"b"` - } - err := mappingByPtr(&s, formSource{"a": {"9"}, "b": {"9"}}, "form") - assert.NoError(t, err) - - assert.Equal(t, 9, s.A) - assert.Equal(t, 0, s.b) -} - -func TestMappingPrivateField(t *testing.T) { - var s struct { - f int `form:"field"` - } - err := mappingByPtr(&s, formSource{"field": {"6"}}, "form") - assert.NoError(t, err) - assert.Equal(t, int(0), s.f) -} - -func TestMappingUnknownFieldType(t *testing.T) { - var s struct { - U uintptr - } - - err := mappingByPtr(&s, formSource{"U": {"unknown"}}, "form") - assert.Error(t, err) - assert.Equal(t, errUnknownType, err) -} - -func TestMappingURI(t *testing.T) { - var s struct { - F int `uri:"field"` - } - err := mapUri(&s, map[string][]string{"field": {"6"}}) - assert.NoError(t, err) - assert.Equal(t, int(6), s.F) -} - -func TestMappingForm(t *testing.T) { - var s struct { - F int `form:"field"` - } - err := mapForm(&s, map[string][]string{"field": {"6"}}) - assert.NoError(t, err) - assert.Equal(t, int(6), s.F) -} - -func TestMappingTime(t *testing.T) { - var s struct { - Time time.Time - LocalTime time.Time `time_format:"2006-01-02"` - ZeroValue time.Time - CSTTime time.Time `time_format:"2006-01-02" time_location:"Asia/Shanghai"` - UTCTime time.Time `time_format:"2006-01-02" time_utc:"1"` - } - - var err error - time.Local, err = time.LoadLocation("Europe/Berlin") - assert.NoError(t, err) - - err = mapForm(&s, map[string][]string{ - "Time": {"2019-01-20T16:02:58Z"}, - "LocalTime": {"2019-01-20"}, - "ZeroValue": {}, - "CSTTime": {"2019-01-20"}, - "UTCTime": {"2019-01-20"}, - }) - assert.NoError(t, err) - - assert.Equal(t, "2019-01-20 16:02:58 +0000 UTC", s.Time.String()) - assert.Equal(t, "2019-01-20 00:00:00 +0100 CET", s.LocalTime.String()) - assert.Equal(t, "2019-01-19 23:00:00 +0000 UTC", s.LocalTime.UTC().String()) - assert.Equal(t, "0001-01-01 00:00:00 +0000 UTC", s.ZeroValue.String()) - assert.Equal(t, "2019-01-20 00:00:00 +0800 CST", s.CSTTime.String()) - assert.Equal(t, "2019-01-19 16:00:00 +0000 UTC", s.CSTTime.UTC().String()) - assert.Equal(t, "2019-01-20 00:00:00 +0000 UTC", s.UTCTime.String()) - - // wrong location - var wrongLoc struct { - Time time.Time `time_location:"wrong"` - } - err = mapForm(&wrongLoc, map[string][]string{"Time": {"2019-01-20T16:02:58Z"}}) - assert.Error(t, err) - - // wrong time value - var wrongTime struct { - Time time.Time - } - err = mapForm(&wrongTime, map[string][]string{"Time": {"wrong"}}) - assert.Error(t, err) -} - -func TestMappingTimeDuration(t *testing.T) { - var s struct { - D time.Duration - } - - // ok - err := mappingByPtr(&s, formSource{"D": {"5s"}}, "form") - assert.NoError(t, err) - assert.Equal(t, 5*time.Second, s.D) - - // error - err = mappingByPtr(&s, formSource{"D": {"wrong"}}, "form") - assert.Error(t, err) -} - -func TestMappingSlice(t *testing.T) { - var s struct { - Slice []int `form:"slice,default=9"` - } - - // default value - err := mappingByPtr(&s, formSource{}, "form") - assert.NoError(t, err) - assert.Equal(t, []int{9}, s.Slice) - - // ok - err = mappingByPtr(&s, formSource{"slice": {"3", "4"}}, "form") - assert.NoError(t, err) - assert.Equal(t, []int{3, 4}, s.Slice) - - // error - err = mappingByPtr(&s, formSource{"slice": {"wrong"}}, "form") - assert.Error(t, err) -} - -func TestMappingArray(t *testing.T) { - var s struct { - Array [2]int `form:"array,default=9"` - } - - // wrong default - err := mappingByPtr(&s, formSource{}, "form") - assert.Error(t, err) - - // ok - err = mappingByPtr(&s, formSource{"array": {"3", "4"}}, "form") - assert.NoError(t, err) - assert.Equal(t, [2]int{3, 4}, s.Array) - - // error - not enough vals - err = mappingByPtr(&s, formSource{"array": {"3"}}, "form") - assert.Error(t, err) - - // error - wrong value - err = mappingByPtr(&s, formSource{"array": {"wrong"}}, "form") - assert.Error(t, err) -} - -func TestMappingStructField(t *testing.T) { - var s struct { - J struct { - I int - } - } - - err := mappingByPtr(&s, formSource{"J": {`{"I": 9}`}}, "form") - assert.NoError(t, err) - assert.Equal(t, 9, s.J.I) -} - -func TestMappingMapField(t *testing.T) { - var s struct { - M map[string]int - } - - err := mappingByPtr(&s, formSource{"M": {`{"one": 1}`}}, "form") - assert.NoError(t, err) - assert.Equal(t, map[string]int{"one": 1}, s.M) -} - -func TestMappingIgnoredCircularRef(t *testing.T) { - type S struct { - S *S `form:"-"` - } - var s S - - err := mappingByPtr(&s, formSource{}, "form") - assert.NoError(t, err) -} diff --git a/gin/binding/json_test.go b/gin/binding/json_test.go deleted file mode 100644 index fbd5c52..0000000 --- a/gin/binding/json_test.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2019 Gin Core Team. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestJSONBindingBindBody(t *testing.T) { - var s struct { - Foo string `json:"foo"` - } - err := jsonBinding{}.BindBody([]byte(`{"foo": "FOO"}`), &s) - require.NoError(t, err) - assert.Equal(t, "FOO", s.Foo) -} - -func TestJSONBindingBindBodyMap(t *testing.T) { - s := make(map[string]string) - err := jsonBinding{}.BindBody([]byte(`{"foo": "FOO","hello":"world"}`), &s) - require.NoError(t, err) - assert.Len(t, s, 2) - assert.Equal(t, "FOO", s["foo"]) - assert.Equal(t, "world", s["hello"]) -} diff --git a/gin/binding/msgpack_test.go b/gin/binding/msgpack_test.go deleted file mode 100644 index 296d3eb..0000000 --- a/gin/binding/msgpack_test.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2019 Gin Core Team. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -// +build !nomsgpack - -package binding - -import ( - "bytes" - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - "github.com/ugorji/go/codec" -) - -func TestMsgpackBindingBindBody(t *testing.T) { - type teststruct struct { - Foo string `msgpack:"foo"` - } - var s teststruct - err := msgpackBinding{}.BindBody(msgpackBody(t, teststruct{"FOO"}), &s) - require.NoError(t, err) - assert.Equal(t, "FOO", s.Foo) -} - -func msgpackBody(t *testing.T, obj interface{}) []byte { - var bs bytes.Buffer - h := &codec.MsgpackHandle{} - err := codec.NewEncoder(&bs, h).Encode(obj) - require.NoError(t, err) - return bs.Bytes() -} diff --git a/gin/binding/multipart_form_mapping_test.go b/gin/binding/multipart_form_mapping_test.go deleted file mode 100644 index 4c75d1f..0000000 --- a/gin/binding/multipart_form_mapping_test.go +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright 2019 Gin Core Team. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import ( - "bytes" - "io/ioutil" - "mime/multipart" - "net/http" - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestFormMultipartBindingBindOneFile(t *testing.T) { - var s struct { - FileValue multipart.FileHeader `form:"file"` - FilePtr *multipart.FileHeader `form:"file"` - SliceValues []multipart.FileHeader `form:"file"` - SlicePtrs []*multipart.FileHeader `form:"file"` - ArrayValues [1]multipart.FileHeader `form:"file"` - ArrayPtrs [1]*multipart.FileHeader `form:"file"` - } - file := testFile{"file", "file1", []byte("hello")} - - req := createRequestMultipartFiles(t, file) - err := FormMultipart.Bind(req, &s) - assert.NoError(t, err) - - assertMultipartFileHeader(t, &s.FileValue, file) - assertMultipartFileHeader(t, s.FilePtr, file) - assert.Len(t, s.SliceValues, 1) - assertMultipartFileHeader(t, &s.SliceValues[0], file) - assert.Len(t, s.SlicePtrs, 1) - assertMultipartFileHeader(t, s.SlicePtrs[0], file) - assertMultipartFileHeader(t, &s.ArrayValues[0], file) - assertMultipartFileHeader(t, s.ArrayPtrs[0], file) -} - -func TestFormMultipartBindingBindTwoFiles(t *testing.T) { - var s struct { - SliceValues []multipart.FileHeader `form:"file"` - SlicePtrs []*multipart.FileHeader `form:"file"` - ArrayValues [2]multipart.FileHeader `form:"file"` - ArrayPtrs [2]*multipart.FileHeader `form:"file"` - } - files := []testFile{ - {"file", "file1", []byte("hello")}, - {"file", "file2", []byte("world")}, - } - - req := createRequestMultipartFiles(t, files...) - err := FormMultipart.Bind(req, &s) - assert.NoError(t, err) - - assert.Len(t, s.SliceValues, len(files)) - assert.Len(t, s.SlicePtrs, len(files)) - assert.Len(t, s.ArrayValues, len(files)) - assert.Len(t, s.ArrayPtrs, len(files)) - - for i, file := range files { - assertMultipartFileHeader(t, &s.SliceValues[i], file) - assertMultipartFileHeader(t, s.SlicePtrs[i], file) - assertMultipartFileHeader(t, &s.ArrayValues[i], file) - assertMultipartFileHeader(t, s.ArrayPtrs[i], file) - } -} - -func TestFormMultipartBindingBindError(t *testing.T) { - files := []testFile{ - {"file", "file1", []byte("hello")}, - {"file", "file2", []byte("world")}, - } - - for _, tt := range []struct { - name string - s interface{} - }{ - {"wrong type", &struct { - Files int `form:"file"` - }{}}, - {"wrong array size", &struct { - Files [1]*multipart.FileHeader `form:"file"` - }{}}, - {"wrong slice type", &struct { - Files []int `form:"file"` - }{}}, - } { - req := createRequestMultipartFiles(t, files...) - err := FormMultipart.Bind(req, tt.s) - assert.Error(t, err) - } -} - -type testFile struct { - Fieldname string - Filename string - Content []byte -} - -func createRequestMultipartFiles(t *testing.T, files ...testFile) *http.Request { - var body bytes.Buffer - - mw := multipart.NewWriter(&body) - for _, file := range files { - fw, err := mw.CreateFormFile(file.Fieldname, file.Filename) - assert.NoError(t, err) - - n, err := fw.Write(file.Content) - assert.NoError(t, err) - assert.Equal(t, len(file.Content), n) - } - err := mw.Close() - assert.NoError(t, err) - - req, err := http.NewRequest("POST", "/", &body) - assert.NoError(t, err) - - req.Header.Set("Content-Type", MIMEMultipartPOSTForm+"; boundary="+mw.Boundary()) - return req -} - -func assertMultipartFileHeader(t *testing.T, fh *multipart.FileHeader, file testFile) { - assert.Equal(t, file.Filename, fh.Filename) - // assert.Equal(t, int64(len(file.Content)), fh.Size) // fh.Size does not exist on go1.8 - - fl, err := fh.Open() - assert.NoError(t, err) - - body, err := ioutil.ReadAll(fl) - assert.NoError(t, err) - assert.Equal(t, string(file.Content), string(body)) - - err = fl.Close() - assert.NoError(t, err) -} diff --git a/gin/binding/validate_test.go b/gin/binding/validate_test.go deleted file mode 100644 index 3529100..0000000 --- a/gin/binding/validate_test.go +++ /dev/null @@ -1,228 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import ( - "bytes" - "testing" - "time" - - "git.ningdatech.com/ningda/gin_valid/go-playground/validator/v10" - "github.com/stretchr/testify/assert" -) - -type testInterface interface { - String() string -} - -type substructNoValidation struct { - IString string - IInt int -} - -type mapNoValidationSub map[string]substructNoValidation - -type structNoValidationValues struct { - substructNoValidation - - Boolean bool - - Uinteger uint - Integer int - Integer8 int8 - Integer16 int16 - Integer32 int32 - Integer64 int64 - Uinteger8 uint8 - Uinteger16 uint16 - Uinteger32 uint32 - Uinteger64 uint64 - - Float32 float32 - Float64 float64 - - String string - - Date time.Time - - Struct substructNoValidation - InlinedStruct struct { - String []string - Integer int - } - - IntSlice []int - IntPointerSlice []*int - StructPointerSlice []*substructNoValidation - StructSlice []substructNoValidation - InterfaceSlice []testInterface - - UniversalInterface interface{} - CustomInterface testInterface - - FloatMap map[string]float32 - StructMap mapNoValidationSub -} - -func createNoValidationValues() structNoValidationValues { - integer := 1 - s := structNoValidationValues{ - Boolean: true, - Uinteger: 1 << 29, - Integer: -10000, - Integer8: 120, - Integer16: -20000, - Integer32: 1 << 29, - Integer64: 1 << 61, - Uinteger8: 250, - Uinteger16: 50000, - Uinteger32: 1 << 31, - Uinteger64: 1 << 62, - Float32: 123.456, - Float64: 123.456789, - String: "text", - Date: time.Time{}, - CustomInterface: &bytes.Buffer{}, - Struct: substructNoValidation{}, - IntSlice: []int{-3, -2, 1, 0, 1, 2, 3}, - IntPointerSlice: []*int{&integer}, - StructSlice: []substructNoValidation{}, - UniversalInterface: 1.2, - FloatMap: map[string]float32{ - "foo": 1.23, - "bar": 232.323, - }, - StructMap: mapNoValidationSub{ - "foo": substructNoValidation{}, - "bar": substructNoValidation{}, - }, - // StructPointerSlice []noValidationSub - // InterfaceSlice []testInterface - } - s.InlinedStruct.Integer = 1000 - s.InlinedStruct.String = []string{"first", "second"} - s.IString = "substring" - s.IInt = 987654 - return s -} - -func TestValidateNoValidationValues(t *testing.T) { - origin := createNoValidationValues() - test := createNoValidationValues() - empty := structNoValidationValues{} - - assert.Nil(t, validate(test)) - assert.Nil(t, validate(&test)) - assert.Nil(t, validate(empty)) - assert.Nil(t, validate(&empty)) - - assert.Equal(t, origin, test) -} - -type structNoValidationPointer struct { - substructNoValidation - - Boolean bool - - Uinteger *uint - Integer *int - Integer8 *int8 - Integer16 *int16 - Integer32 *int32 - Integer64 *int64 - Uinteger8 *uint8 - Uinteger16 *uint16 - Uinteger32 *uint32 - Uinteger64 *uint64 - - Float32 *float32 - Float64 *float64 - - String *string - - Date *time.Time - - Struct *substructNoValidation - - IntSlice *[]int - IntPointerSlice *[]*int - StructPointerSlice *[]*substructNoValidation - StructSlice *[]substructNoValidation - InterfaceSlice *[]testInterface - - FloatMap *map[string]float32 - StructMap *mapNoValidationSub -} - -func TestValidateNoValidationPointers(t *testing.T) { - //origin := createNoValidation_values() - //test := createNoValidation_values() - empty := structNoValidationPointer{} - - //assert.Nil(t, validate(test)) - //assert.Nil(t, validate(&test)) - assert.Nil(t, validate(empty)) - assert.Nil(t, validate(&empty)) - - //assert.Equal(t, origin, test) -} - -type Object map[string]interface{} - -func TestValidatePrimitives(t *testing.T) { - obj := Object{"foo": "bar", "bar": 1} - assert.NoError(t, validate(obj)) - assert.NoError(t, validate(&obj)) - assert.Equal(t, Object{"foo": "bar", "bar": 1}, obj) - - obj2 := []Object{{"foo": "bar", "bar": 1}, {"foo": "bar", "bar": 1}} - assert.NoError(t, validate(obj2)) - assert.NoError(t, validate(&obj2)) - - nu := 10 - assert.NoError(t, validate(nu)) - assert.NoError(t, validate(&nu)) - assert.Equal(t, 10, nu) - - str := "value" - assert.NoError(t, validate(str)) - assert.NoError(t, validate(&str)) - assert.Equal(t, "value", str) -} - -// structCustomValidation is a helper struct we use to check that -// custom validation can be registered on it. -// The `notone` binding directive is for custom validation and registered later. -type structCustomValidation struct { - Integer int `binding:"notone"` -} - -func notOne(f1 validator.FieldLevel) bool { - if val, ok := f1.Field().Interface().(int); ok { - return val != 1 - } - return false -} - -func TestValidatorEngine(t *testing.T) { - // This validates that the function `notOne` matches - // the expected function signature by `defaultValidator` - // and by extension the validator library. - engine, ok := Validator.Engine().(*validator.Validate) - assert.True(t, ok) - - err := engine.RegisterValidation("notone", notOne) - // Check that we can register custom validation without error - assert.Nil(t, err) - - // Create an instance which will fail validation - withOne := structCustomValidation{Integer: 1} - errs := validate(withOne) - - // Check that we got back non-nil errs - assert.NotNil(t, errs) - // Check that the error matches expectation - assert.Error(t, errs, "", "", "notone") -} diff --git a/gin/binding/xml_test.go b/gin/binding/xml_test.go deleted file mode 100644 index f9546c1..0000000 --- a/gin/binding/xml_test.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2019 Gin Core Team. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestXMLBindingBindBody(t *testing.T) { - var s struct { - Foo string `xml:"foo"` - } - xmlBody := ` - - FOO -` - err := xmlBinding{}.BindBody([]byte(xmlBody), &s) - require.NoError(t, err) - assert.Equal(t, "FOO", s.Foo) -} diff --git a/gin/binding/yaml_test.go b/gin/binding/yaml_test.go deleted file mode 100644 index e66338b..0000000 --- a/gin/binding/yaml_test.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2019 Gin Core Team. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import ( - "testing" - - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestYAMLBindingBindBody(t *testing.T) { - var s struct { - Foo string `yaml:"foo"` - } - err := yamlBinding{}.BindBody([]byte("foo: FOO"), &s) - require.NoError(t, err) - assert.Equal(t, "FOO", s.Foo) -} diff --git a/gin/internal/bytesconv/bytesconv_test.go b/gin/internal/bytesconv/bytesconv_test.go deleted file mode 100644 index eeaad5e..0000000 --- a/gin/internal/bytesconv/bytesconv_test.go +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright 2020 Gin Core Team. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package bytesconv - -import ( - "bytes" - "math/rand" - "strings" - "testing" - "time" -) - -var testString = "Albert Einstein: Logic will get you from A to B. Imagination will take you everywhere." -var testBytes = []byte(testString) - -func rawBytesToStr(b []byte) string { - return string(b) -} - -func rawStrToBytes(s string) []byte { - return []byte(s) -} - -// go test -v - -func TestBytesToString(t *testing.T) { - data := make([]byte, 1024) - for i := 0; i < 100; i++ { - rand.Read(data) - if rawBytesToStr(data) != BytesToString(data) { - t.Fatal("don't match") - } - } -} - -const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" -const ( - letterIdxBits = 6 // 6 bits to represent a letter index - letterIdxMask = 1<= 0; { - if remain == 0 { - cache, remain = src.Int63(), letterIdxMax - } - if idx := int(cache & letterIdxMask); idx < len(letterBytes) { - sb.WriteByte(letterBytes[idx]) - i-- - } - cache >>= letterIdxBits - remain-- - } - - return sb.String() -} - -func TestStringToBytes(t *testing.T) { - for i := 0; i < 100; i++ { - s := RandStringBytesMaskImprSrcSB(64) - if !bytes.Equal(rawStrToBytes(s), StringToBytes(s)) { - t.Fatal("don't match") - } - } -} - -// go test -v -run=none -bench=^BenchmarkBytesConv -benchmem=true - -func BenchmarkBytesConvBytesToStrRaw(b *testing.B) { - for i := 0; i < b.N; i++ { - rawBytesToStr(testBytes) - } -} - -func BenchmarkBytesConvBytesToStr(b *testing.B) { - for i := 0; i < b.N; i++ { - BytesToString(testBytes) - } -} - -func BenchmarkBytesConvStrToBytesRaw(b *testing.B) { - for i := 0; i < b.N; i++ { - rawStrToBytes(testString) - } -} - -func BenchmarkBytesConvStrToBytes(b *testing.B) { - for i := 0; i < b.N; i++ { - StringToBytes(testString) - } -} diff --git a/go-playground/universal-translator/go.sum b/go-playground/universal-translator/go.sum deleted file mode 100644 index 3cb4bd7..0000000 --- a/go-playground/universal-translator/go.sum +++ /dev/null @@ -1,49 +0,0 @@ -git.ningdatech.com/ningda/gin_valid v0.0.0-20201127152634-63bddbcc4667 h1:Twp9fEdYNlRYDmPqwGM5FcY4r7hZpMzI6/SFoYdkAjs= -git.ningdatech.com/ningda/gin_valid v0.0.0-20201127152634-63bddbcc4667/go.mod h1:QwiarqFkyNmqYlSsUP2RrqsDtSuDncK1KGCvjgh+blQ= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/ugorji/go v1.2.0/go.mod h1:1ny++pKMXhLWrwWV5Nf+CbOuZJhMoaFD+0GMFfd8fEc= -github.com/ugorji/go/codec v1.2.0/go.mod h1:dXvG35r7zTX6QImXOSFhGMmKtX+wJ7VTWzGvYQGIjBs= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/go-playground/validator/v10/benchmarks_test.go b/go-playground/validator/v10/benchmarks_test.go deleted file mode 100644 index ee70f95..0000000 --- a/go-playground/validator/v10/benchmarks_test.go +++ /dev/null @@ -1,1099 +0,0 @@ -package validator - -import ( - "bytes" - sql "database/sql/driver" - "testing" - "time" -) - -func BenchmarkFieldSuccess(b *testing.B) { - validate := New() - s := "1" - - b.ResetTimer() - for n := 0; n < b.N; n++ { - _ = validate.Var(&s, "len=1") - } -} - -func BenchmarkFieldSuccessParallel(b *testing.B) { - validate := New() - s := "1" - - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - _ = validate.Var(&s, "len=1") - } - }) -} - -func BenchmarkFieldFailure(b *testing.B) { - validate := New() - s := "12" - - b.ResetTimer() - for n := 0; n < b.N; n++ { - _ = validate.Var(&s, "len=1") - } -} - -func BenchmarkFieldFailureParallel(b *testing.B) { - validate := New() - s := "12" - - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - _ = validate.Var(&s, "len=1") - } - }) -} - -func BenchmarkFieldArrayDiveSuccess(b *testing.B) { - validate := New() - m := []string{"val1", "val2", "val3"} - - b.ResetTimer() - - for n := 0; n < b.N; n++ { - _ = validate.Var(m, "required,dive,required") - } -} - -func BenchmarkFieldArrayDiveSuccessParallel(b *testing.B) { - validate := New() - m := []string{"val1", "val2", "val3"} - - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - _ = validate.Var(m, "required,dive,required") - } - }) -} - -func BenchmarkFieldArrayDiveFailure(b *testing.B) { - validate := New() - m := []string{"val1", "", "val3"} - - b.ResetTimer() - for n := 0; n < b.N; n++ { - _ = validate.Var(m, "required,dive,required") - } -} - -func BenchmarkFieldArrayDiveFailureParallel(b *testing.B) { - validate := New() - m := []string{"val1", "", "val3"} - - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - _ = validate.Var(m, "required,dive,required") - } - }) -} - -func BenchmarkFieldMapDiveSuccess(b *testing.B) { - validate := New() - m := map[string]string{"val1": "val1", "val2": "val2", "val3": "val3"} - - b.ResetTimer() - - for n := 0; n < b.N; n++ { - _ = validate.Var(m, "required,dive,required") - } -} - -func BenchmarkFieldMapDiveSuccessParallel(b *testing.B) { - validate := New() - m := map[string]string{"val1": "val1", "val2": "val2", "val3": "val3"} - - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - _ = validate.Var(m, "required,dive,required") - } - }) -} - -func BenchmarkFieldMapDiveFailure(b *testing.B) { - validate := New() - m := map[string]string{"": "", "val3": "val3"} - - b.ResetTimer() - for n := 0; n < b.N; n++ { - _ = validate.Var(m, "required,dive,required") - } -} - -func BenchmarkFieldMapDiveFailureParallel(b *testing.B) { - validate := New() - m := map[string]string{"": "", "val3": "val3"} - - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - _ = validate.Var(m, "required,dive,required") - } - }) -} - -func BenchmarkFieldMapDiveWithKeysSuccess(b *testing.B) { - validate := New() - m := map[string]string{"val1": "val1", "val2": "val2", "val3": "val3"} - - b.ResetTimer() - - for n := 0; n < b.N; n++ { - _ = validate.Var(m, "required,dive,keys,required,endkeys,required") - } -} - -func BenchmarkFieldMapDiveWithKeysSuccessParallel(b *testing.B) { - validate := New() - m := map[string]string{"val1": "val1", "val2": "val2", "val3": "val3"} - - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - _ = validate.Var(m, "required,dive,keys,required,endkeys,required") - } - }) -} - -func BenchmarkFieldMapDiveWithKeysFailure(b *testing.B) { - validate := New() - m := map[string]string{"": "", "val3": "val3"} - - b.ResetTimer() - for n := 0; n < b.N; n++ { - _ = validate.Var(m, "required,dive,keys,required,endkeys,required") - } -} - -func BenchmarkFieldMapDiveWithKeysFailureParallel(b *testing.B) { - validate := New() - m := map[string]string{"": "", "val3": "val3"} - - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - _ = validate.Var(m, "required,dive,keys,required,endkeys,required") - } - }) -} - -func BenchmarkFieldCustomTypeSuccess(b *testing.B) { - validate := New() - validate.RegisterCustomTypeFunc(ValidateValuerType, (*sql.Valuer)(nil), valuer{}) - val := valuer{ - Name: "1", - } - - b.ResetTimer() - for n := 0; n < b.N; n++ { - _ = validate.Var(val, "len=1") - } -} - -func BenchmarkFieldCustomTypeSuccessParallel(b *testing.B) { - validate := New() - validate.RegisterCustomTypeFunc(ValidateValuerType, (*sql.Valuer)(nil), valuer{}) - val := valuer{ - Name: "1", - } - - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - _ = validate.Var(val, "len=1") - } - }) -} - -func BenchmarkFieldCustomTypeFailure(b *testing.B) { - validate := New() - validate.RegisterCustomTypeFunc(ValidateValuerType, (*sql.Valuer)(nil), valuer{}) - val := valuer{} - - b.ResetTimer() - for n := 0; n < b.N; n++ { - _ = validate.Var(val, "len=1") - } -} - -func BenchmarkFieldCustomTypeFailureParallel(b *testing.B) { - validate := New() - validate.RegisterCustomTypeFunc(ValidateValuerType, (*sql.Valuer)(nil), valuer{}) - val := valuer{} - - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - _ = validate.Var(val, "len=1") - } - }) -} - -func BenchmarkFieldOrTagSuccess(b *testing.B) { - validate := New() - s := "rgba(0,0,0,1)" - - b.ResetTimer() - for n := 0; n < b.N; n++ { - _ = validate.Var(s, "rgb|rgba") - } -} - -func BenchmarkFieldOrTagSuccessParallel(b *testing.B) { - validate := New() - s := "rgba(0,0,0,1)" - - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - _ = validate.Var(s, "rgb|rgba") - } - }) -} - -func BenchmarkFieldOrTagFailure(b *testing.B) { - validate := New() - s := "#000" - - b.ResetTimer() - for n := 0; n < b.N; n++ { - _ = validate.Var(s, "rgb|rgba") - } -} - -func BenchmarkFieldOrTagFailureParallel(b *testing.B) { - validate := New() - s := "#000" - - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - _ = validate.Var(s, "rgb|rgba") - } - }) -} - -func BenchmarkStructLevelValidationSuccess(b *testing.B) { - validate := New() - validate.RegisterStructValidation(StructValidationTestStructSuccess, TestStruct{}) - - tst := TestStruct{ - String: "good value", - } - - b.ResetTimer() - for n := 0; n < b.N; n++ { - _ = validate.Struct(tst) - } -} - -func BenchmarkStructLevelValidationSuccessParallel(b *testing.B) { - validate := New() - validate.RegisterStructValidation(StructValidationTestStructSuccess, TestStruct{}) - - tst := TestStruct{ - String: "good value", - } - - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - _ = validate.Struct(tst) - } - }) -} - -func BenchmarkStructLevelValidationFailure(b *testing.B) { - validate := New() - validate.RegisterStructValidation(StructValidationTestStruct, TestStruct{}) - - tst := TestStruct{ - String: "good value", - } - - b.ResetTimer() - for n := 0; n < b.N; n++ { - _ = validate.Struct(tst) - } -} - -func BenchmarkStructLevelValidationFailureParallel(b *testing.B) { - validate := New() - validate.RegisterStructValidation(StructValidationTestStruct, TestStruct{}) - - tst := TestStruct{ - String: "good value", - } - - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - _ = validate.Struct(tst) - } - }) -} - -func BenchmarkStructSimpleCustomTypeSuccess(b *testing.B) { - validate := New() - validate.RegisterCustomTypeFunc(ValidateValuerType, (*sql.Valuer)(nil), valuer{}) - - val := valuer{ - Name: "1", - } - - type Foo struct { - Valuer valuer `validate:"len=1"` - IntValue int `validate:"min=5,max=10"` - } - - validFoo := &Foo{Valuer: val, IntValue: 7} - - b.ResetTimer() - for n := 0; n < b.N; n++ { - _ = validate.Struct(validFoo) - } -} - -func BenchmarkStructSimpleCustomTypeSuccessParallel(b *testing.B) { - validate := New() - validate.RegisterCustomTypeFunc(ValidateValuerType, (*sql.Valuer)(nil), valuer{}) - val := valuer{ - Name: "1", - } - - type Foo struct { - Valuer valuer `validate:"len=1"` - IntValue int `validate:"min=5,max=10"` - } - validFoo := &Foo{Valuer: val, IntValue: 7} - - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - _ = validate.Struct(validFoo) - } - }) -} - -func BenchmarkStructSimpleCustomTypeFailure(b *testing.B) { - validate := New() - validate.RegisterCustomTypeFunc(ValidateValuerType, (*sql.Valuer)(nil), valuer{}) - - val := valuer{} - - type Foo struct { - Valuer valuer `validate:"len=1"` - IntValue int `validate:"min=5,max=10"` - } - validFoo := &Foo{Valuer: val, IntValue: 3} - - b.ResetTimer() - for n := 0; n < b.N; n++ { - _ = validate.Struct(validFoo) - } -} - -func BenchmarkStructSimpleCustomTypeFailureParallel(b *testing.B) { - validate := New() - validate.RegisterCustomTypeFunc(ValidateValuerType, (*sql.Valuer)(nil), valuer{}) - - val := valuer{} - - type Foo struct { - Valuer valuer `validate:"len=1"` - IntValue int `validate:"min=5,max=10"` - } - validFoo := &Foo{Valuer: val, IntValue: 3} - - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - _ = validate.Struct(validate.Struct(validFoo)) - } - }) -} - -func BenchmarkStructFilteredSuccess(b *testing.B) { - validate := New() - - type Test struct { - Name string `validate:"required"` - NickName string `validate:"required"` - } - - test := &Test{ - Name: "Joey Bloggs", - } - byts := []byte("Name") - fn := func(ns []byte) bool { - return !bytes.HasSuffix(ns, byts) - } - - b.ResetTimer() - for n := 0; n < b.N; n++ { - _ = validate.StructFiltered(test, fn) - } -} - -func BenchmarkStructFilteredSuccessParallel(b *testing.B) { - validate := New() - - type Test struct { - Name string `validate:"required"` - NickName string `validate:"required"` - } - - test := &Test{ - Name: "Joey Bloggs", - } - byts := []byte("Name") - fn := func(ns []byte) bool { - return !bytes.HasSuffix(ns, byts) - } - - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - _ = validate.StructFiltered(test, fn) - } - }) -} - -func BenchmarkStructFilteredFailure(b *testing.B) { - validate := New() - - type Test struct { - Name string `validate:"required"` - NickName string `validate:"required"` - } - - test := &Test{ - Name: "Joey Bloggs", - } - - byts := []byte("NickName") - - fn := func(ns []byte) bool { - return !bytes.HasSuffix(ns, byts) - } - - b.ResetTimer() - for n := 0; n < b.N; n++ { - _ = validate.StructFiltered(test, fn) - } -} - -func BenchmarkStructFilteredFailureParallel(b *testing.B) { - validate := New() - - type Test struct { - Name string `validate:"required"` - NickName string `validate:"required"` - } - - test := &Test{ - Name: "Joey Bloggs", - } - byts := []byte("NickName") - fn := func(ns []byte) bool { - return !bytes.HasSuffix(ns, byts) - } - - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - _ = validate.StructFiltered(test, fn) - } - }) -} - -func BenchmarkStructPartialSuccess(b *testing.B) { - validate := New() - - type Test struct { - Name string `validate:"required"` - NickName string `validate:"required"` - } - - test := &Test{ - Name: "Joey Bloggs", - } - - b.ResetTimer() - for n := 0; n < b.N; n++ { - _ = validate.StructPartial(test, "Name") - } -} - -func BenchmarkStructPartialSuccessParallel(b *testing.B) { - validate := New() - - type Test struct { - Name string `validate:"required"` - NickName string `validate:"required"` - } - - test := &Test{ - Name: "Joey Bloggs", - } - - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - _ = validate.StructPartial(test, "Name") - } - }) -} - -func BenchmarkStructPartialFailure(b *testing.B) { - validate := New() - - type Test struct { - Name string `validate:"required"` - NickName string `validate:"required"` - } - - test := &Test{ - Name: "Joey Bloggs", - } - - b.ResetTimer() - for n := 0; n < b.N; n++ { - _ = validate.StructPartial(test, "NickName") - } -} - -func BenchmarkStructPartialFailureParallel(b *testing.B) { - validate := New() - - type Test struct { - Name string `validate:"required"` - NickName string `validate:"required"` - } - - test := &Test{ - Name: "Joey Bloggs", - } - - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - _ = validate.StructPartial(test, "NickName") - } - }) -} - -func BenchmarkStructExceptSuccess(b *testing.B) { - validate := New() - - type Test struct { - Name string `validate:"required"` - NickName string `validate:"required"` - } - - test := &Test{ - Name: "Joey Bloggs", - } - - b.ResetTimer() - for n := 0; n < b.N; n++ { - _ = validate.StructExcept(test, "Nickname") - } -} - -func BenchmarkStructExceptSuccessParallel(b *testing.B) { - validate := New() - - type Test struct { - Name string `validate:"required"` - NickName string `validate:"required"` - } - - test := &Test{ - Name: "Joey Bloggs", - } - - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - _ = validate.StructExcept(test, "NickName") - } - }) -} - -func BenchmarkStructExceptFailure(b *testing.B) { - validate := New() - - type Test struct { - Name string `validate:"required"` - NickName string `validate:"required"` - } - - test := &Test{ - Name: "Joey Bloggs", - } - - b.ResetTimer() - for n := 0; n < b.N; n++ { - _ = validate.StructExcept(test, "Name") - } -} - -func BenchmarkStructExceptFailureParallel(b *testing.B) { - validate := New() - - type Test struct { - Name string `validate:"required"` - NickName string `validate:"required"` - } - - test := &Test{ - Name: "Joey Bloggs", - } - - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - _ = validate.StructExcept(test, "Name") - } - }) -} - -func BenchmarkStructSimpleCrossFieldSuccess(b *testing.B) { - validate := New() - - type Test struct { - Start time.Time - End time.Time `validate:"gtfield=Start"` - } - - now := time.Now().UTC() - then := now.Add(time.Hour * 5) - test := &Test{ - Start: now, - End: then, - } - - b.ResetTimer() - for n := 0; n < b.N; n++ { - _ = validate.Struct(test) - } -} - -func BenchmarkStructSimpleCrossFieldSuccessParallel(b *testing.B) { - validate := New() - - type Test struct { - Start time.Time - End time.Time `validate:"gtfield=Start"` - } - - now := time.Now().UTC() - then := now.Add(time.Hour * 5) - test := &Test{ - Start: now, - End: then, - } - - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - _ = validate.Struct(test) - } - }) -} - -func BenchmarkStructSimpleCrossFieldFailure(b *testing.B) { - validate := New() - - type Test struct { - Start time.Time - End time.Time `validate:"gtfield=Start"` - } - - now := time.Now().UTC() - then := now.Add(time.Hour * -5) - - test := &Test{ - Start: now, - End: then, - } - - b.ResetTimer() - for n := 0; n < b.N; n++ { - _ = validate.Struct(test) - } -} - -func BenchmarkStructSimpleCrossFieldFailureParallel(b *testing.B) { - validate := New() - - type Test struct { - Start time.Time - End time.Time `validate:"gtfield=Start"` - } - - now := time.Now().UTC() - then := now.Add(time.Hour * -5) - test := &Test{ - Start: now, - End: then, - } - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - _ = validate.Struct(test) - } - }) -} - -func BenchmarkStructSimpleCrossStructCrossFieldSuccess(b *testing.B) { - validate := New() - - type Inner struct { - Start time.Time - } - - type Outer struct { - Inner *Inner - CreatedAt time.Time `validate:"eqcsfield=Inner.Start"` - } - - now := time.Now().UTC() - inner := &Inner{ - Start: now, - } - outer := &Outer{ - Inner: inner, - CreatedAt: now, - } - - b.ResetTimer() - for n := 0; n < b.N; n++ { - _ = validate.Struct(outer) - } -} - -func BenchmarkStructSimpleCrossStructCrossFieldSuccessParallel(b *testing.B) { - validate := New() - - type Inner struct { - Start time.Time - } - - type Outer struct { - Inner *Inner - CreatedAt time.Time `validate:"eqcsfield=Inner.Start"` - } - - now := time.Now().UTC() - inner := &Inner{ - Start: now, - } - outer := &Outer{ - Inner: inner, - CreatedAt: now, - } - - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - _ = validate.Struct(outer) - } - }) -} - -func BenchmarkStructSimpleCrossStructCrossFieldFailure(b *testing.B) { - validate := New() - type Inner struct { - Start time.Time - } - - type Outer struct { - Inner *Inner - CreatedAt time.Time `validate:"eqcsfield=Inner.Start"` - } - - now := time.Now().UTC() - then := now.Add(time.Hour * 5) - - inner := &Inner{ - Start: then, - } - - outer := &Outer{ - Inner: inner, - CreatedAt: now, - } - - b.ResetTimer() - for n := 0; n < b.N; n++ { - _ = validate.Struct(outer) - } -} - -func BenchmarkStructSimpleCrossStructCrossFieldFailureParallel(b *testing.B) { - validate := New() - - type Inner struct { - Start time.Time - } - - type Outer struct { - Inner *Inner - CreatedAt time.Time `validate:"eqcsfield=Inner.Start"` - } - - now := time.Now().UTC() - then := now.Add(time.Hour * 5) - - inner := &Inner{ - Start: then, - } - - outer := &Outer{ - Inner: inner, - CreatedAt: now, - } - - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - _ = validate.Struct(outer) - } - }) -} - -func BenchmarkStructSimpleSuccess(b *testing.B) { - validate := New() - type Foo struct { - StringValue string `validate:"min=5,max=10"` - IntValue int `validate:"min=5,max=10"` - } - - validFoo := &Foo{StringValue: "Foobar", IntValue: 7} - - b.ResetTimer() - for n := 0; n < b.N; n++ { - _ = validate.Struct(validFoo) - } -} - -func BenchmarkStructSimpleSuccessParallel(b *testing.B) { - validate := New() - type Foo struct { - StringValue string `validate:"min=5,max=10"` - IntValue int `validate:"min=5,max=10"` - } - validFoo := &Foo{StringValue: "Foobar", IntValue: 7} - - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - _ = validate.Struct(validFoo) - } - }) -} - -func BenchmarkStructSimpleFailure(b *testing.B) { - validate := New() - type Foo struct { - StringValue string `validate:"min=5,max=10"` - IntValue int `validate:"min=5,max=10"` - } - - invalidFoo := &Foo{StringValue: "Fo", IntValue: 3} - - b.ResetTimer() - for n := 0; n < b.N; n++ { - _ = validate.Struct(invalidFoo) - } -} - -func BenchmarkStructSimpleFailureParallel(b *testing.B) { - validate := New() - type Foo struct { - StringValue string `validate:"min=5,max=10"` - IntValue int `validate:"min=5,max=10"` - } - - invalidFoo := &Foo{StringValue: "Fo", IntValue: 3} - - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - _ = validate.Struct(invalidFoo) - } - }) -} - -func BenchmarkStructComplexSuccess(b *testing.B) { - validate := New() - tSuccess := &TestString{ - Required: "Required", - Len: "length==10", - Min: "min=1", - Max: "1234567890", - MinMax: "12345", - Lt: "012345678", - Lte: "0123456789", - Gt: "01234567890", - Gte: "0123456789", - OmitEmpty: "", - Sub: &SubTest{ - Test: "1", - }, - SubIgnore: &SubTest{ - Test: "", - }, - Anonymous: struct { - A string `validate:"required"` - }{ - A: "1", - }, - Iface: &Impl{ - F: "123", - }, - } - - b.ResetTimer() - for n := 0; n < b.N; n++ { - _ = validate.Struct(tSuccess) - } -} - -func BenchmarkStructComplexSuccessParallel(b *testing.B) { - validate := New() - tSuccess := &TestString{ - Required: "Required", - Len: "length==10", - Min: "min=1", - Max: "1234567890", - MinMax: "12345", - Lt: "012345678", - Lte: "0123456789", - Gt: "01234567890", - Gte: "0123456789", - OmitEmpty: "", - Sub: &SubTest{ - Test: "1", - }, - SubIgnore: &SubTest{ - Test: "", - }, - Anonymous: struct { - A string `validate:"required"` - }{ - A: "1", - }, - Iface: &Impl{ - F: "123", - }, - } - - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - _ = validate.Struct(tSuccess) - } - }) -} - -func BenchmarkStructComplexFailure(b *testing.B) { - validate := New() - tFail := &TestString{ - Required: "", - Len: "", - Min: "", - Max: "12345678901", - MinMax: "", - Lt: "0123456789", - Lte: "01234567890", - Gt: "1", - Gte: "1", - OmitEmpty: "12345678901", - Sub: &SubTest{ - Test: "", - }, - Anonymous: struct { - A string `validate:"required"` - }{ - A: "", - }, - Iface: &Impl{ - F: "12", - }, - } - - b.ResetTimer() - for n := 0; n < b.N; n++ { - _ = validate.Struct(tFail) - } -} - -func BenchmarkStructComplexFailureParallel(b *testing.B) { - validate := New() - tFail := &TestString{ - Required: "", - Len: "", - Min: "", - Max: "12345678901", - MinMax: "", - Lt: "0123456789", - Lte: "01234567890", - Gt: "1", - Gte: "1", - OmitEmpty: "12345678901", - Sub: &SubTest{ - Test: "", - }, - Anonymous: struct { - A string `validate:"required"` - }{ - A: "", - }, - Iface: &Impl{ - F: "12", - }, - } - - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - _ = validate.Struct(tFail) - } - }) -} - -type TestOneof struct { - Color string `validate:"oneof=red green"` -} - -func BenchmarkOneof(b *testing.B) { - w := &TestOneof{Color: "green"} - val := New() - for i := 0; i < b.N; i++ { - _ = val.Struct(w) - } -} - -func BenchmarkOneofParallel(b *testing.B) { - w := &TestOneof{Color: "green"} - val := New() - - b.ResetTimer() - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - _ = val.Struct(w) - } - }) -} diff --git a/go-playground/validator/v10/errors.go b/go-playground/validator/v10/errors.go index 7444849..3c57b9c 100644 --- a/go-playground/validator/v10/errors.go +++ b/go-playground/validator/v10/errors.go @@ -97,7 +97,7 @@ func (ve ValidationErrors) Translate(ut ut.Translator) TransValidError { return result } -// yang 修改结束 +// yang修改结束 // FieldError contains all functions to get error details type FieldError interface { diff --git a/go-playground/validator/v10/non-standard/validators/notblank_test.go b/go-playground/validator/v10/non-standard/validators/notblank_test.go deleted file mode 100644 index 1d8bd21..0000000 --- a/go-playground/validator/v10/non-standard/validators/notblank_test.go +++ /dev/null @@ -1,65 +0,0 @@ -package validators - -import ( - "testing" - - "git.ningdatech.com/ningda/gin_valid/go-playground/assert/v2" - "git.ningdatech.com/ningda/gin_valid/go-playground/validator/v10" -) - -type test struct { - String string `validate:"notblank"` - Array []int `validate:"notblank"` - Pointer *int `validate:"notblank"` - Number int `validate:"notblank"` - Interface interface{} `validate:"notblank"` - Func func() `validate:"notblank"` -} - -func TestNotBlank(t *testing.T) { - v := validator.New() - err := v.RegisterValidation("notblank", NotBlank) - assert.Equal(t, nil, err) - - // Errors - var x *int - invalid := test{ - String: " ", - Array: []int{}, - Pointer: x, - Number: 0, - Interface: nil, - Func: nil, - } - fieldsWithError := []string{ - "String", - "Array", - "Pointer", - "Number", - "Interface", - "Func", - } - - errors := v.Struct(invalid).(validator.ValidationErrors) - var fields []string - for _, err := range errors { - fields = append(fields, err.Field()) - } - - assert.Equal(t, fieldsWithError, fields) - - // No errors - y := 1 - x = &y - valid := test{ - String: "str", - Array: []int{1}, - Pointer: x, - Number: 1, - Interface: "value", - Func: func() {}, - } - - err = v.Struct(valid) - assert.Equal(t, nil, err) -} diff --git a/go-playground/validator/v10/testdata/a.go b/go-playground/validator/v10/testdata/a.go deleted file mode 100644 index 69d29d3..0000000 --- a/go-playground/validator/v10/testdata/a.go +++ /dev/null @@ -1 +0,0 @@ -package testdata diff --git a/go-playground/validator/v10/translations/zh/zh_test.go b/go-playground/validator/v10/translations/zh/zh_test.go deleted file mode 100644 index 3fe1b63..0000000 --- a/go-playground/validator/v10/translations/zh/zh_test.go +++ /dev/null @@ -1,661 +0,0 @@ -package zh - -import ( - "testing" - "time" - - zhongwen "git.ningdatech.com/ningda/gin_valid/go-playground/locales/zh" - ut "git.ningdatech.com/ningda/gin_valid/go-playground/universal-translator" - "git.ningdatech.com/ningda/gin_valid/go-playground/validator/v10" - . "github.com/go-playground/assert/v2" -) - -func TestTranslations(t *testing.T) { - - zh := zhongwen.New() - uni := ut.New(zh, zh) - trans, _ := uni.GetTranslator("zh") - - validate := validator.New() - - err := RegisterDefaultTranslations(validate, trans) - Equal(t, err, nil) - - type Inner struct { - EqCSFieldString string - NeCSFieldString string - GtCSFieldString string - GteCSFieldString string - LtCSFieldString string - LteCSFieldString string - } - - type Test struct { - Inner Inner - RequiredString string `validate:"required"` - RequiredNumber int `validate:"required"` - RequiredMultiple []string `validate:"required"` - LenString string `validate:"len=1"` - LenNumber float64 `validate:"len=1113.00"` - LenMultiple []string `validate:"len=7"` - MinString string `validate:"min=1"` - MinNumber float64 `validate:"min=1113.00"` - MinMultiple []string `validate:"min=7"` - MaxString string `validate:"max=3"` - MaxNumber float64 `validate:"max=1113.00"` - MaxMultiple []string `validate:"max=7"` - EqString string `validate:"eq=3"` - EqNumber float64 `validate:"eq=2.33"` - EqMultiple []string `validate:"eq=7"` - NeString string `validate:"ne="` - NeNumber float64 `validate:"ne=0.00"` - NeMultiple []string `validate:"ne=0"` - LtString string `validate:"lt=3"` - LtNumber float64 `validate:"lt=5.56"` - LtMultiple []string `validate:"lt=2"` - LtTime time.Time `validate:"lt"` - LteString string `validate:"lte=3"` - LteNumber float64 `validate:"lte=5.56"` - LteMultiple []string `validate:"lte=2"` - LteTime time.Time `validate:"lte"` - GtString string `validate:"gt=3"` - GtNumber float64 `validate:"gt=5.56"` - GtMultiple []string `validate:"gt=2"` - GtTime time.Time `validate:"gt"` - GteString string `validate:"gte=3"` - GteNumber float64 `validate:"gte=5.56"` - GteMultiple []string `validate:"gte=2"` - GteTime time.Time `validate:"gte"` - EqFieldString string `validate:"eqfield=MaxString"` - EqCSFieldString string `validate:"eqcsfield=Inner.EqCSFieldString"` - NeCSFieldString string `validate:"necsfield=Inner.NeCSFieldString"` - GtCSFieldString string `validate:"gtcsfield=Inner.GtCSFieldString"` - GteCSFieldString string `validate:"gtecsfield=Inner.GteCSFieldString"` - LtCSFieldString string `validate:"ltcsfield=Inner.LtCSFieldString"` - LteCSFieldString string `validate:"ltecsfield=Inner.LteCSFieldString"` - NeFieldString string `validate:"nefield=EqFieldString"` - GtFieldString string `validate:"gtfield=MaxString"` - GteFieldString string `validate:"gtefield=MaxString"` - LtFieldString string `validate:"ltfield=MaxString"` - LteFieldString string `validate:"ltefield=MaxString"` - AlphaString string `validate:"alpha"` - AlphanumString string `validate:"alphanum"` - NumericString string `validate:"numeric"` - NumberString string `validate:"number"` - HexadecimalString string `validate:"hexadecimal"` - HexColorString string `validate:"hexcolor"` - RGBColorString string `validate:"rgb"` - RGBAColorString string `validate:"rgba"` - HSLColorString string `validate:"hsl"` - HSLAColorString string `validate:"hsla"` - Email string `validate:"email"` - URL string `validate:"url"` - URI string `validate:"uri"` - Base64 string `validate:"base64"` - Contains string `validate:"contains=purpose"` - ContainsAny string `validate:"containsany=!@#$"` - Excludes string `validate:"excludes=text"` - ExcludesAll string `validate:"excludesall=!@#$"` - ExcludesRune string `validate:"excludesrune=☻"` - ISBN string `validate:"isbn"` - ISBN10 string `validate:"isbn10"` - ISBN13 string `validate:"isbn13"` - UUID string `validate:"uuid"` - UUID3 string `validate:"uuid3"` - UUID4 string `validate:"uuid4"` - UUID5 string `validate:"uuid5"` - ASCII string `validate:"ascii"` - PrintableASCII string `validate:"printascii"` - MultiByte string `validate:"multibyte"` - DataURI string `validate:"datauri"` - Latitude string `validate:"latitude"` - Longitude string `validate:"longitude"` - SSN string `validate:"ssn"` - IP string `validate:"ip"` - IPv4 string `validate:"ipv4"` - IPv6 string `validate:"ipv6"` - CIDR string `validate:"cidr"` - CIDRv4 string `validate:"cidrv4"` - CIDRv6 string `validate:"cidrv6"` - TCPAddr string `validate:"tcp_addr"` - TCPAddrv4 string `validate:"tcp4_addr"` - TCPAddrv6 string `validate:"tcp6_addr"` - UDPAddr string `validate:"udp_addr"` - UDPAddrv4 string `validate:"udp4_addr"` - UDPAddrv6 string `validate:"udp6_addr"` - IPAddr string `validate:"ip_addr"` - IPAddrv4 string `validate:"ip4_addr"` - IPAddrv6 string `validate:"ip6_addr"` - UinxAddr string `validate:"unix_addr"` // can't fail from within Go's net package currently, but maybe in the future - MAC string `validate:"mac"` - IsColor string `validate:"iscolor"` - StrPtrMinLen *string `validate:"min=10"` - StrPtrMaxLen *string `validate:"max=1"` - StrPtrLen *string `validate:"len=2"` - StrPtrLt *string `validate:"lt=1"` - StrPtrLte *string `validate:"lte=1"` - StrPtrGt *string `validate:"gt=10"` - StrPtrGte *string `validate:"gte=10"` - OneOfString string `validate:"oneof=red green"` - OneOfInt int `validate:"oneof=5 63"` - JsonString string `validate:"json"` - LowercaseString string `validate:"lowercase"` - UppercaseString string `validate:"uppercase"` - Datetime string `validate:"datetime=2006-01-02"` - } - - var test Test - - test.Inner.EqCSFieldString = "1234" - test.Inner.GtCSFieldString = "1234" - test.Inner.GteCSFieldString = "1234" - - test.MaxString = "1234" - test.MaxNumber = 2000 - test.MaxMultiple = make([]string, 9) - - test.LtString = "1234" - test.LtNumber = 6 - test.LtMultiple = make([]string, 3) - test.LtTime = time.Now().Add(time.Hour * 24) - - test.LteString = "1234" - test.LteNumber = 6 - test.LteMultiple = make([]string, 3) - test.LteTime = time.Now().Add(time.Hour * 24) - - test.LtFieldString = "12345" - test.LteFieldString = "12345" - - test.LtCSFieldString = "1234" - test.LteCSFieldString = "1234" - - test.AlphaString = "abc3" - test.AlphanumString = "abc3!" - test.NumericString = "12E.00" - test.NumberString = "12E" - - test.Excludes = "this is some test text" - test.ExcludesAll = "This is Great!" - test.ExcludesRune = "Love it ☻" - - test.ASCII = "カタカナ" - test.PrintableASCII = "カタカナ" - - test.MultiByte = "1234feerf" - - s := "toolong" - test.StrPtrMaxLen = &s - test.StrPtrLen = &s - - test.JsonString = "{\"foo\":\"bar\",}" - - test.LowercaseString = "ABCDEFG" - test.UppercaseString = "abcdefg" - - test.Datetime = "20060102" - - err = validate.Struct(test) - NotEqual(t, err, nil) - - errs, ok := err.(validator.ValidationErrors) - Equal(t, ok, true) - - tests := []struct { - ns string - expected string - }{ - { - ns: "Test.IsColor", - expected: "IsColor必须是一个有效的颜色", - }, - { - ns: "Test.MAC", - expected: "MAC必须是一个有效的MAC地址", - }, - { - ns: "Test.IPAddr", - expected: "IPAddr必须是一个有效的IP地址", - }, - { - ns: "Test.IPAddrv4", - expected: "IPAddrv4必须是一个有效的IPv4地址", - }, - { - ns: "Test.IPAddrv6", - expected: "IPAddrv6必须是一个有效的IPv6地址", - }, - { - ns: "Test.UDPAddr", - expected: "UDPAddr必须是一个有效的UDP地址", - }, - { - ns: "Test.UDPAddrv4", - expected: "UDPAddrv4必须是一个有效的IPv4 UDP地址", - }, - { - ns: "Test.UDPAddrv6", - expected: "UDPAddrv6必须是一个有效的IPv6 UDP地址", - }, - { - ns: "Test.TCPAddr", - expected: "TCPAddr必须是一个有效的TCP地址", - }, - { - ns: "Test.TCPAddrv4", - expected: "TCPAddrv4必须是一个有效的IPv4 TCP地址", - }, - { - ns: "Test.TCPAddrv6", - expected: "TCPAddrv6必须是一个有效的IPv6 TCP地址", - }, - { - ns: "Test.CIDR", - expected: "CIDR必须是一个有效的无类别域间路由(CIDR)", - }, - { - ns: "Test.CIDRv4", - expected: "CIDRv4必须是一个包含IPv4地址的有效无类别域间路由(CIDR)", - }, - { - ns: "Test.CIDRv6", - expected: "CIDRv6必须是一个包含IPv6地址的有效无类别域间路由(CIDR)", - }, - { - ns: "Test.SSN", - expected: "SSN必须是一个有效的社会安全号码(SSN)", - }, - { - ns: "Test.IP", - expected: "IP必须是一个有效的IP地址", - }, - { - ns: "Test.IPv4", - expected: "IPv4必须是一个有效的IPv4地址", - }, - { - ns: "Test.IPv6", - expected: "IPv6必须是一个有效的IPv6地址", - }, - { - ns: "Test.DataURI", - expected: "DataURI必须包含有效的数据URI", - }, - { - ns: "Test.Latitude", - expected: "Latitude必须包含有效的纬度坐标", - }, - { - ns: "Test.Longitude", - expected: "Longitude必须包含有效的经度坐标", - }, - { - ns: "Test.MultiByte", - expected: "MultiByte必须包含多字节字符", - }, - { - ns: "Test.ASCII", - expected: "ASCII必须只包含ascii字符", - }, - { - ns: "Test.PrintableASCII", - expected: "PrintableASCII必须只包含可打印的ascii字符", - }, - { - ns: "Test.UUID", - expected: "UUID必须是一个有效的UUID", - }, - { - ns: "Test.UUID3", - expected: "UUID3必须是一个有效的V3 UUID", - }, - { - ns: "Test.UUID4", - expected: "UUID4必须是一个有效的V4 UUID", - }, - { - ns: "Test.UUID5", - expected: "UUID5必须是一个有效的V5 UUID", - }, - { - ns: "Test.ISBN", - expected: "ISBN必须是一个有效的ISBN编号", - }, - { - ns: "Test.ISBN10", - expected: "ISBN10必须是一个有效的ISBN-10编号", - }, - { - ns: "Test.ISBN13", - expected: "ISBN13必须是一个有效的ISBN-13编号", - }, - { - ns: "Test.Excludes", - expected: "Excludes不能包含文本'text'", - }, - { - ns: "Test.ExcludesAll", - expected: "ExcludesAll不能包含以下任何字符'!@#$'", - }, - { - ns: "Test.ExcludesRune", - expected: "ExcludesRune不能包含'☻'", - }, - { - ns: "Test.ContainsAny", - expected: "ContainsAny必须包含至少一个以下字符'!@#$'", - }, - { - ns: "Test.Contains", - expected: "Contains必须包含文本'purpose'", - }, - { - ns: "Test.Base64", - expected: "Base64必须是一个有效的Base64字符串", - }, - { - ns: "Test.Email", - expected: "Email必须是一个有效的邮箱", - }, - { - ns: "Test.URL", - expected: "URL必须是一个有效的URL", - }, - { - ns: "Test.URI", - expected: "URI必须是一个有效的URI", - }, - { - ns: "Test.RGBColorString", - expected: "RGBColorString必须是一个有效的RGB颜色", - }, - { - ns: "Test.RGBAColorString", - expected: "RGBAColorString必须是一个有效的RGBA颜色", - }, - { - ns: "Test.HSLColorString", - expected: "HSLColorString必须是一个有效的HSL颜色", - }, - { - ns: "Test.HSLAColorString", - expected: "HSLAColorString必须是一个有效的HSLA颜色", - }, - { - ns: "Test.HexadecimalString", - expected: "HexadecimalString必须是一个有效的十六进制", - }, - { - ns: "Test.HexColorString", - expected: "HexColorString必须是一个有效的十六进制颜色", - }, - { - ns: "Test.NumberString", - expected: "NumberString必须是一个有效的数字", - }, - { - ns: "Test.NumericString", - expected: "NumericString必须是一个有效的数值", - }, - { - ns: "Test.AlphanumString", - expected: "AlphanumString只能包含字母和数字", - }, - { - ns: "Test.AlphaString", - expected: "AlphaString只能包含字母", - }, - { - ns: "Test.LtFieldString", - expected: "LtFieldString必须小于MaxString", - }, - { - ns: "Test.LteFieldString", - expected: "LteFieldString必须小于或等于MaxString", - }, - { - ns: "Test.GtFieldString", - expected: "GtFieldString必须大于MaxString", - }, - { - ns: "Test.GteFieldString", - expected: "GteFieldString必须大于或等于MaxString", - }, - { - ns: "Test.NeFieldString", - expected: "NeFieldString不能等于EqFieldString", - }, - { - ns: "Test.LtCSFieldString", - expected: "LtCSFieldString必须小于Inner.LtCSFieldString", - }, - { - ns: "Test.LteCSFieldString", - expected: "LteCSFieldString必须小于或等于Inner.LteCSFieldString", - }, - { - ns: "Test.GtCSFieldString", - expected: "GtCSFieldString必须大于Inner.GtCSFieldString", - }, - { - ns: "Test.GteCSFieldString", - expected: "GteCSFieldString必须大于或等于Inner.GteCSFieldString", - }, - { - ns: "Test.NeCSFieldString", - expected: "NeCSFieldString不能等于Inner.NeCSFieldString", - }, - { - ns: "Test.EqCSFieldString", - expected: "EqCSFieldString必须等于Inner.EqCSFieldString", - }, - { - ns: "Test.EqFieldString", - expected: "EqFieldString必须等于MaxString", - }, - { - ns: "Test.GteString", - expected: "GteString长度必须至少为3个字符", - }, - { - ns: "Test.GteNumber", - expected: "GteNumber必须大于或等于5.56", - }, - { - ns: "Test.GteMultiple", - expected: "GteMultiple必须至少包含2项", - }, - { - ns: "Test.GteTime", - expected: "GteTime必须大于或等于当前日期和时间", - }, - { - ns: "Test.GtString", - expected: "GtString长度必须大于3个字符", - }, - { - ns: "Test.GtNumber", - expected: "GtNumber必须大于5.56", - }, - { - ns: "Test.GtMultiple", - expected: "GtMultiple必须大于2项", - }, - { - ns: "Test.GtTime", - expected: "GtTime必须大于当前日期和时间", - }, - { - ns: "Test.LteString", - expected: "LteString长度不能超过3个字符", - }, - { - ns: "Test.LteNumber", - expected: "LteNumber必须小于或等于5.56", - }, - { - ns: "Test.LteMultiple", - expected: "LteMultiple最多只能包含2项", - }, - { - ns: "Test.LteTime", - expected: "LteTime必须小于或等于当前日期和时间", - }, - { - ns: "Test.LtString", - expected: "LtString长度必须小于3个字符", - }, - { - ns: "Test.LtNumber", - expected: "LtNumber必须小于5.56", - }, - { - ns: "Test.LtMultiple", - expected: "LtMultiple必须包含少于2项", - }, - { - ns: "Test.LtTime", - expected: "LtTime必须小于当前日期和时间", - }, - { - ns: "Test.NeString", - expected: "NeString不能等于", - }, - { - ns: "Test.NeNumber", - expected: "NeNumber不能等于0.00", - }, - { - ns: "Test.NeMultiple", - expected: "NeMultiple不能等于0", - }, - { - ns: "Test.EqString", - expected: "EqString不等于3", - }, - { - ns: "Test.EqNumber", - expected: "EqNumber不等于2.33", - }, - { - ns: "Test.EqMultiple", - expected: "EqMultiple不等于7", - }, - { - ns: "Test.MaxString", - expected: "MaxString长度不能超过3个字符", - }, - { - ns: "Test.MaxNumber", - expected: "MaxNumber必须小于或等于1,113.00", - }, - { - ns: "Test.MaxMultiple", - expected: "MaxMultiple最多只能包含7项", - }, - { - ns: "Test.MinString", - expected: "MinString长度必须至少为1个字符", - }, - { - ns: "Test.MinNumber", - expected: "MinNumber最小只能为1,113.00", - }, - { - ns: "Test.MinMultiple", - expected: "MinMultiple必须至少包含7项", - }, - { - ns: "Test.LenString", - expected: "LenString长度必须是1个字符", - }, - { - ns: "Test.LenNumber", - expected: "LenNumber必须等于1,113.00", - }, - { - ns: "Test.LenMultiple", - expected: "LenMultiple必须包含7项", - }, - { - ns: "Test.RequiredString", - expected: "RequiredString为必填字段", - }, - { - ns: "Test.RequiredNumber", - expected: "RequiredNumber为必填字段", - }, - { - ns: "Test.RequiredMultiple", - expected: "RequiredMultiple为必填字段", - }, - { - ns: "Test.StrPtrMinLen", - expected: "StrPtrMinLen长度必须至少为10个字符", - }, - { - ns: "Test.StrPtrMaxLen", - expected: "StrPtrMaxLen长度不能超过1个字符", - }, - { - ns: "Test.StrPtrLen", - expected: "StrPtrLen长度必须是2个字符", - }, - { - ns: "Test.StrPtrLt", - expected: "StrPtrLt长度必须小于1个字符", - }, - { - ns: "Test.StrPtrLte", - expected: "StrPtrLte长度不能超过1个字符", - }, - { - ns: "Test.StrPtrGt", - expected: "StrPtrGt长度必须大于10个字符", - }, - { - ns: "Test.StrPtrGte", - expected: "StrPtrGte长度必须至少为10个字符", - }, - { - ns: "Test.OneOfString", - expected: "OneOfString必须是[red green]中的一个", - }, - { - ns: "Test.OneOfInt", - expected: "OneOfInt必须是[5 63]中的一个", - }, - { - ns: "Test.JsonString", - expected: "JsonString必须是一个JSON字符串", - }, - { - ns: "Test.LowercaseString", - expected: "LowercaseString必须是小写字母", - }, - { - ns: "Test.UppercaseString", - expected: "UppercaseString必须是大写字母", - }, - { - ns: "Test.Datetime", - expected: "Datetime的格式必须是2006-01-02", - }, - } - - for _, tt := range tests { - - var fe validator.FieldError - - for _, e := range errs { - if tt.ns == e.Namespace() { - fe = e - break - } - } - - NotEqual(t, fe, nil) - Equal(t, tt.expected, fe.Translate(trans)) - } - -} diff --git a/go.mod b/go.mod index d415236..b51d074 100644 --- a/go.mod +++ b/go.mod @@ -3,9 +3,6 @@ module git.ningdatech.com/ningda/gin_valid go 1.13 require ( - github.com/gin-gonic/gin v1.6.3 // indirect - github.com/go-playground/universal-translator v0.17.0 - github.com/go-playground/validator/v10 v10.4.1 // indirect github.com/golang/protobuf v1.4.3 github.com/json-iterator/go v1.1.10 // indirect github.com/leodido/go-urn v1.2.0