From 6aa7a319c2ae288600fda2dffe57b24508e54d1e Mon Sep 17 00:00:00 2001 From: kevin Date: Mon, 10 Aug 2020 14:53:01 +0800 Subject: [PATCH] refactor compare versions --- core/syncx/once_test.go | 5 +- core/utils/version.go | 123 ++++++++++++++++--------------------- core/utils/version_test.go | 3 +- 3 files changed, 58 insertions(+), 73 deletions(-) diff --git a/core/syncx/once_test.go b/core/syncx/once_test.go index 15f8f869..9e7fd71d 100644 --- a/core/syncx/once_test.go +++ b/core/syncx/once_test.go @@ -24,9 +24,10 @@ func BenchmarkOnce(b *testing.B) { add := Once(func() { v++ }) + b.ResetTimer() - for i:=0;i2,and 2 if v1": + return result == 1 + case "<=": + return result == -1 || result == 0 + case ">=": + return result == 0 || result == 1 } - verStr1 := strings.Split(v1, ".") - verStr2 := strings.Split(v2, ".") - ver1 := strSlice2IntSlice(verStr1) - ver2 := strSlice2IntSlice(verStr2) + return false +} - var shorter int - if len(ver1) > len(ver2) { - shorter = len(ver2) - } else { - shorter = len(ver1) - } +// return -1 if v1v2 +func compare(v1, v2 string) int { + v1 = replacer.Replace(v1) + v2 = replacer.Replace(v2) + fields1 := strings.Split(v1, ".") + fields2 := strings.Split(v2, ".") + ver1 := strsToInts(fields1) + ver2 := strsToInts(fields2) + shorter := mathx.MinInt(len(ver1), len(ver2)) for i := 0; i < shorter; i++ { if ver1[i] == ver2[i] { - if shorter-1 == i { - if len(ver1) == len(ver2) { - return 0 - } else { - if len(ver1) > len(ver2) { - return 1 - } else { - return 2 - } - } - } - } else if ver1[i] > ver2[i] { - return 1 + continue + } else if ver1[i] < ver2[i] { + return -1 } else { - return 2 + return 1 } } - return -1 + + if len(ver1) < len(ver2) { + return -1 + } else if len(ver1) == len(ver2) { + return 0 + } else { + return 1 + } } -func strSlice2IntSlice(strs []string) []int64 { +func strsToInts(strs []string) []int64 { if len(strs) == 0 { - return []int64{} + return nil } - retInt := make([]int64, 0, len(strs)) + + ret := make([]int64, 0, len(strs)) for _, str := range strs { - i, err := strconv.ParseInt(str, 10, 64) - if err == nil { - retInt = append(retInt, i) - } + i, _ := strconv.ParseInt(str, 10, 64) + ret = append(ret, i) } - return retInt -} -//operator compare returns true if the first field and the third field equation holds else false -func CompareVersions(v1, operator, v2 string) bool { - com := Compare(v1, v2) - switch operator { - case "==": - if com == 0 { - return true - } - case "<": - if com == 2 { - return true - } - case ">": - if com == 1 { - return true - } - case "<=": - if com == 0 || com == 2 { - return true - } - case ">=": - if com == 0 || com == 1 { - return true - } - } - return false + return ret } diff --git a/core/utils/version_test.go b/core/utils/version_test.go index 90e75213..815a69af 100644 --- a/core/utils/version_test.go +++ b/core/utils/version_test.go @@ -1,6 +1,7 @@ package utils import ( + "fmt" "testing" "github.com/stretchr/testify/assert" @@ -31,7 +32,7 @@ func TestCustomCompareVersions(t *testing.T) { for _, each := range cases { t.Run(each.ver1, func(t *testing.T) { actual := CompareVersions(each.ver1, each.operator, each.ver2) - assert.Equal(t, each.out, actual) + assert.Equal(t, each.out, actual, fmt.Sprintf("%s vs %s", each.ver1, each.ver2)) }) } }