diff --git a/go.mod b/go.mod index 0a9d982..c308bfc 100644 --- a/go.mod +++ b/go.mod @@ -3,20 +3,26 @@ module git.zhangdeman.cn/gateway/validator go 1.22.2 require ( - git.zhangdeman.cn/zhangdeman/consts v0.0.0-20240501142503-e31a270e50cc // indirect + git.zhangdeman.cn/zhangdeman/consts v0.0.0-20240501142503-e31a270e50cc + git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20240325080031-1f58204e8687 + git.zhangdeman.cn/zhangdeman/util v0.0.0-20231227095334-7eb5cdbf9253 + git.zhangdeman.cn/zhangdeman/wrapper v0.0.0-20240422034417-8c922be06d95 + github.com/stretchr/testify v1.9.0 + github.com/tidwall/gjson v1.17.1 + github.com/tidwall/sjson v1.2.5 +) + +require ( git.zhangdeman.cn/zhangdeman/easymap v0.0.0-20240311030808-e2a2e6a3c211 // indirect - git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20240325080031-1f58204e8687 // indirect - git.zhangdeman.cn/zhangdeman/util v0.0.0-20231227095334-7eb5cdbf9253 // indirect - git.zhangdeman.cn/zhangdeman/wrapper v0.0.0-20240422034417-8c922be06d95 // indirect github.com/BurntSushi/toml v1.3.2 // indirect github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect github.com/go-ini/ini v1.67.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mozillazg/go-pinyin v0.20.0 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect - github.com/tidwall/gjson v1.17.1 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.1 // indirect - github.com/tidwall/sjson v1.2.5 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 04d163d..35d308b 100644 --- a/go.sum +++ b/go.sum @@ -1,13 +1,3 @@ -git.zhangdeman.cn/zhangdeman/consts v0.0.0-20240429055735-7d7191726f0c h1:n+n49onVpIgemvRdX4XnUB5psWh/NZ/qYkapCbJ4AYA= -git.zhangdeman.cn/zhangdeman/consts v0.0.0-20240429055735-7d7191726f0c/go.mod h1:IXXaZkb7vGzGnGM5RRWrASAuwrVSNxuoe0DmeXx5g6k= -git.zhangdeman.cn/zhangdeman/consts v0.0.0-20240429080251-9cd57471a8f5 h1:6JsrADIXKWb7ZzaqAFlNpfL5ynu8m1X8Tju8h63mN0Y= -git.zhangdeman.cn/zhangdeman/consts v0.0.0-20240429080251-9cd57471a8f5/go.mod h1:IXXaZkb7vGzGnGM5RRWrASAuwrVSNxuoe0DmeXx5g6k= -git.zhangdeman.cn/zhangdeman/consts v0.0.0-20240429082641-eeef7e967d00 h1:bOPZXYX9CfnZBPqkQnzgwnuC1uyXBivSY0nmV4HabXg= -git.zhangdeman.cn/zhangdeman/consts v0.0.0-20240429082641-eeef7e967d00/go.mod h1:IXXaZkb7vGzGnGM5RRWrASAuwrVSNxuoe0DmeXx5g6k= -git.zhangdeman.cn/zhangdeman/consts v0.0.0-20240430135109-0be82b4a6434 h1:BgpbeE3Vuy1iS4xrMzJP6bDGbrrhlv8uSDh8n/Sj+fg= -git.zhangdeman.cn/zhangdeman/consts v0.0.0-20240430135109-0be82b4a6434/go.mod h1:IXXaZkb7vGzGnGM5RRWrASAuwrVSNxuoe0DmeXx5g6k= -git.zhangdeman.cn/zhangdeman/consts v0.0.0-20240501132050-6c507d6b9c99 h1:rskqw1MOJ7b2qvGZLJ8S9POZFqvcaeaCnBp4FStIiyI= -git.zhangdeman.cn/zhangdeman/consts v0.0.0-20240501132050-6c507d6b9c99/go.mod h1:IXXaZkb7vGzGnGM5RRWrASAuwrVSNxuoe0DmeXx5g6k= git.zhangdeman.cn/zhangdeman/consts v0.0.0-20240501142503-e31a270e50cc h1:kPz9xiUVruM8kwbUUVpxyCTX8pGgyKt60K5zX77oyC4= git.zhangdeman.cn/zhangdeman/consts v0.0.0-20240501142503-e31a270e50cc/go.mod h1:IXXaZkb7vGzGnGM5RRWrASAuwrVSNxuoe0DmeXx5g6k= git.zhangdeman.cn/zhangdeman/easymap v0.0.0-20240311030808-e2a2e6a3c211 h1:I/wOsRpCSRkU9vo1u703slQsmK0wnNeZzsWQOGtIAG0= @@ -22,25 +12,31 @@ github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8 github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 h1:OYA+5W64v3OgClL+IrOD63t4i/RW7RqrAVl9LTZ9UqQ= github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394/go.mod h1:Q8n74mJTIgjX4RBBcHnJ05h//6/k6foqmgE45jTQtxg= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mozillazg/go-pinyin v0.20.0 h1:BtR3DsxpApHfKReaPO1fCqF4pThRwH9uwvXzm+GnMFQ= github.com/mozillazg/go-pinyin v0.20.0/go.mod h1:iR4EnMMRXkfpFVV5FMi4FNB6wGq9NV6uDWbUuPhP4Yc= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.17.1 h1:wlYEnwqAHgzmhNUFfw7Xalt2JzQvsMx2Se4PcoFCT/U= github.com/tidwall/gjson v1.17.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= -github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/handle_base.go b/handle_base.go index e949429..21ace36 100644 --- a/handle_base.go +++ b/handle_base.go @@ -12,6 +12,7 @@ import ( "git.zhangdeman.cn/gateway/validator/define" "git.zhangdeman.cn/zhangdeman/util" "git.zhangdeman.cn/zhangdeman/wrapper" + "strconv" ) // handleFloat 处理float数据 @@ -27,20 +28,20 @@ func handleFloat(inputVal any, rule *define.FieldRule) (float64, error) { if err = util.ConvertAssign(&formatData, inputVal); nil != err { return 0, err } - if !rule.AllowZero { + if !rule.AllowZero && formatData == 0 { return 0, fmt.Errorf("%v : field type is float, but zero val is not allowed", rule.Path) } if nil == rule.ValueLimit { return formatData, nil } if nil != rule.ValueLimit.Min && formatData < *rule.ValueLimit.Min { - return 0, fmt.Errorf("%v : field type is float, min val is %v, real val is %v", rule.Path, *rule.ValueLimit.Min, formatData) + return 0, fmt.Errorf("%v : field type is float, min val is [%v], real val is [%v]", rule.Path, *rule.ValueLimit.Min, formatData) } if nil != rule.ValueLimit.Max && formatData > *rule.ValueLimit.Max { return 0, fmt.Errorf("%v : field type is float, max val is %v, real val is %v", rule.Path, *rule.ValueLimit.Max, formatData) } if len(rule.ValueLimit.EnumList) > 0 { - if wrapper.ArrayType(rule.ValueLimit.EnumList).Has(formatData) < 0 { + if wrapper.ArrayType(rule.ValueLimit.EnumList).Has(strconv.FormatFloat(formatData, 'f', -1, 64)) < 0 { return 0, fmt.Errorf("%v : field type is float, real val is %v, is not in enum list", rule.Path, formatData) } } diff --git a/handle_base_test.go b/handle_base_test.go new file mode 100644 index 0000000..c4956e0 --- /dev/null +++ b/handle_base_test.go @@ -0,0 +1,82 @@ +// Package validator ... +// +// Description : validator ... +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 2024-05-01 22:57 +package validator + +import ( + "git.zhangdeman.cn/gateway/validator/define" + "git.zhangdeman.cn/zhangdeman/consts" + "github.com/stretchr/testify/assert" + "testing" +) + +// Test_handleFloat float转换单元测试 +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 23:00 2024/5/1 +func Test_handleFloat(t *testing.T) { + minVal0 := float64(0) + minVal1 := float64(1) + maxVal := float64(100) + as := assert.New(t) + checkRule := &define.FieldRule{ + Path: "test_float", + Type: consts.DataTypeFloat, + DisableRewrite: false, + DefaultValue: "", + IsRequired: false, + AllowEmpty: false, + AllowZero: false, + AllowNil: false, + DisableAutoConvert: false, + RequiredConditionGroup: nil, + ValueLimit: &define.ValueLimit{ + EnumList: nil, + Min: nil, + Max: nil, + String: nil, + Map: nil, + }, + SliceConfig: nil, + } + int1 := int64(1) + f1, err := handleFloat(int1, checkRule) + as.Equal(nil, err) + as.Equal(float64(1), f1) + // 不允许零值 + int0 := int64(0) + f0, err := handleFloat(int0, checkRule) + as.Equal(float64(0), f0) + as.NotEqual(nil, err) + // 允许零值 + checkRule.AllowZero = true + f0, err = handleFloat(int0, checkRule) + as.Equal(float64(0), f0) + as.Equal(nil, err) + // 取值范围符合 + checkRule.ValueLimit.Min = &minVal0 + checkRule.ValueLimit.Max = &maxVal + f0, err = handleFloat(int0, checkRule) + as.Equal(float64(0), f0) + as.Equal(nil, err) + // 取值范围不符合 + checkRule.ValueLimit.Min = &minVal1 + f0, err = handleFloat(int0, checkRule) + as.Equal(float64(0), f0) + as.NotEqual(nil, err) + // 验证枚举值(不包含) + checkRule.ValueLimit.EnumList = []string{"0", "2"} + f1, err = handleFloat(int1, checkRule) + as.Equal(float64(0), f1) + as.NotEqual(nil, err) + // 验证枚举值(包含) + checkRule.ValueLimit.EnumList = []string{"0", "1", "2"} + f1, err = handleFloat(int1, checkRule) + as.Equal(float64(1), f1) + as.Equal(nil, err) +}