优化策略的使用
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
package priority
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"math"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var (
|
||||
ErrVersionFormat = errors.New("version format error")
|
||||
)
|
||||
|
||||
// 版本号转策略等级
|
||||
func PriorityByVersion(version string) (priority int64, err error) {
|
||||
// 版本不能为空
|
||||
if version == "" {
|
||||
return 0, ErrVersionFormat
|
||||
}
|
||||
|
||||
// 除掉版本号中的v或V
|
||||
if version[0] == 'v' || version[0] == 'V' {
|
||||
version = version[1:]
|
||||
}
|
||||
// 用点号切割
|
||||
vs := strings.Split(version, ".")
|
||||
// 最多只支持5位
|
||||
if len(vs) > 5 {
|
||||
return 0, ErrVersionFormat
|
||||
}
|
||||
|
||||
// base 16位
|
||||
var baseNum float64 = 0
|
||||
|
||||
// 每一位转成数字&每一位不能大于999
|
||||
for key, val := range vs {
|
||||
if val == "" {
|
||||
return 0, ErrVersionFormat
|
||||
}
|
||||
i, err := strconv.ParseInt(val, 10, 32)
|
||||
if err != nil {
|
||||
return 0, ErrVersionFormat
|
||||
}
|
||||
if i <= 0 || i > 999 {
|
||||
return 0, ErrVersionFormat
|
||||
}
|
||||
p := (4 - key) * 3
|
||||
num := math.Pow10(p) * float64(i)
|
||||
|
||||
baseNum += num
|
||||
|
||||
}
|
||||
|
||||
return int64(baseNum), nil
|
||||
}
|
||||
@@ -0,0 +1,109 @@
|
||||
package priority_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/yuninks/timerx/priority"
|
||||
)
|
||||
|
||||
|
||||
func TestVersionToPriority(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
version string
|
||||
want int64
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "standard version",
|
||||
version: "1.2.3",
|
||||
want: 1002003000000,
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "version with v prefix",
|
||||
version: "v1.2.3",
|
||||
want: 1002003000000,
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "version with V prefix",
|
||||
version: "V1.2.3",
|
||||
want: 1002003000000,
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "single digit version",
|
||||
version: "5",
|
||||
want: 5000000000000,
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "max digits version",
|
||||
version: "999.999.999.999.999",
|
||||
want: 999999999999999,
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "empty version",
|
||||
version: "",
|
||||
want: 0,
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "invalid character",
|
||||
version: "1.a.3",
|
||||
want: 0,
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "zero version part",
|
||||
version: "1.0.3",
|
||||
want: 0,
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "zero version part 2",
|
||||
version: "1.0.3.",
|
||||
want: 0,
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "negative version part",
|
||||
version: "1.-2.3",
|
||||
want: 0,
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "version part too large",
|
||||
version: "1.1000.3",
|
||||
want: 0,
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "too many parts",
|
||||
version: "1.2.3.4.5.6",
|
||||
want: 0,
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "empty part",
|
||||
version: "1..3",
|
||||
want: 0,
|
||||
wantErr: true,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got, err := priority.PriorityByVersion(tt.version)
|
||||
if (err != nil) != tt.wantErr {
|
||||
t.Errorf("VersionToPriority() error = %v, wantErr %v", err, tt.wantErr)
|
||||
return
|
||||
}
|
||||
if got != tt.want {
|
||||
t.Errorf("VersionToPriority() = %v, want %v", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user