github.com/Lephar/snapd@v0.0.0-20210825215435-c7fba9cef4d2/strutil/version_test.go (about) 1 // -*- Mode: Go; indent-tabs-mode: t -*- 2 3 /* 4 * Copyright (C) 2014-2015 Canonical Ltd 5 * 6 * This program is free software: you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 3 as 8 * published by the Free Software Foundation. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program. If not, see <http://www.gnu.org/licenses/>. 17 * 18 */ 19 20 package strutil_test 21 22 import ( 23 "fmt" 24 25 . "gopkg.in/check.v1" 26 27 "github.com/snapcore/snapd/strutil" 28 ) 29 30 type VersionTestSuite struct{} 31 32 var _ = Suite(&VersionTestSuite{}) 33 34 func (s *VersionTestSuite) TestVersionCompare(c *C) { 35 for _, t := range []struct { 36 A, B string 37 res int 38 err error 39 }{ 40 {"20000000000000000000", "020000000000000000000", 0, nil}, 41 {"1.0", "2.0", -1, nil}, 42 {"1.3", "1.2.2.2", 1, nil}, 43 {"1.3", "1.3.1", -1, nil}, 44 {"1.0", "1.0~", 1, nil}, 45 {"7.2p2", "7.2", 1, nil}, 46 {"0.4a6", "0.4", 1, nil}, 47 {"0pre", "0pre", 0, nil}, 48 {"0pree", "0pre", 1, nil}, 49 {"1.18.36:5.4", "1.18.36:5.5", -1, nil}, 50 {"1.18.36:5.4", "1.18.37:1.1", -1, nil}, 51 {"2.0.7pre1", "2.0.7r", -1, nil}, 52 {"0.10.0", "0.8.7", 1, nil}, 53 // subrev 54 {"1.0-1", "1.0-2", -1, nil}, 55 {"1.0-1.1", "1.0-1", 1, nil}, 56 {"1.0-1.1", "1.0-1.1", 0, nil}, 57 // do we like strange versions? Yes we like strange versions… 58 {"0", "0", 0, nil}, 59 {"0", "00", 0, nil}, 60 {"", "", 0, nil}, 61 {"", "0", -1, nil}, 62 {"0", "", 1, nil}, 63 {"", "~", 1, nil}, 64 {"~", "", -1, nil}, 65 // from the apt suite 66 {"0-pre", "0-pre", 0, nil}, 67 {"0-pre", "0-pree", -1, nil}, 68 {"1.1.6r2-2", "1.1.6r-1", 1, nil}, 69 {"2.6b2-1", "2.6b-2", 1, nil}, 70 {"0.4a6-2", "0.4-1", 1, nil}, 71 {"3.0~rc1-1", "3.0-1", -1, nil}, 72 {"1.0", "1.0-0", 0, nil}, 73 {"0.2", "1.0-0", -1, nil}, 74 {"1.0", "1.0-0+b1", -1, nil}, 75 {"1.0", "1.0-0~", 1, nil}, 76 // from the old perl cupt 77 {"1.2.3", "1.2.3", 0, nil}, // identical 78 {"4.4.3-2", "4.4.3-2", 0, nil}, // identical 79 {"1.2.3", "1.2.3-0", 0, nil}, // zero revision 80 {"009", "9", 0, nil}, // zeroes… 81 {"009ab5", "9ab5", 0, nil}, // there as well 82 {"1.2.3", "1.2.3-1", -1, nil}, // added non-zero revision 83 {"1.2.3", "1.2.4", -1, nil}, // just bigger 84 {"1.2.4", "1.2.3", 1, nil}, // order doesn't matter 85 {"1.2.24", "1.2.3", 1, nil}, // bigger, eh? 86 {"0.10.0", "0.8.7", 1, nil}, // bigger, eh? 87 {"3.2", "2.3", 1, nil}, // major number rocks 88 {"1.3.2a", "1.3.2", 1, nil}, // letters rock 89 {"0.5.0~git", "0.5.0~git2", -1, nil}, // numbers rock 90 {"2a", "21", -1, nil}, // but not in all places 91 {"1.2a+~bCd3", "1.2a++", -1, nil}, // tilde doesn't rock 92 {"1.2a+~bCd3", "1.2a+~", 1, nil}, // but first is longer! 93 {"5.10.0", "5.005", 1, nil}, // preceding zeroes don't matters 94 {"3a9.8", "3.10.2", -1, nil}, // letters are before all letter symbols 95 {"3a9.8", "3~10", 1, nil}, // but after the tilde 96 {"1.4+OOo3.0.0~", "1.4+OOo3.0.0-4", -1, nil}, // another tilde check 97 {"2.4.7-1", "2.4.7-z", -1, nil}, // revision comparing 98 {"1.002-1+b2", "1.00", 1, nil}, // whatever... 99 100 // broken 101 {"0--0", "0", 0, fmt.Errorf(`invalid version "0--0"`)}, 102 } { 103 res, err := strutil.VersionCompare(t.A, t.B) 104 if t.err != nil { 105 c.Check(err, DeepEquals, t.err) 106 } else { 107 c.Check(err, IsNil) 108 c.Check(res, Equals, t.res, Commentf("%#v %#v: %v but got %v", t.A, t.B, res, t.res)) 109 } 110 } 111 } 112 113 func (s *VersionTestSuite) TestVersionInvalid(c *C) { 114 for _, t := range []struct { 115 ver string 116 valid bool 117 }{ 118 {"1:2", false}, 119 {"12:34", false}, 120 {"1234:", false}, 121 {"1--1", false}, 122 {"1.0", true}, 123 {"1234", true}, 124 } { 125 res := strutil.VersionIsValid(t.ver) 126 c.Check(res, Equals, t.valid, Commentf("%q: %v but expected %v", t.ver, res, t.valid)) 127 } 128 }