github.com/mdomke/git-semver@v1.0.1-0.20200406193518-c0566816580f/version/version_test.go (about) 1 package version 2 3 import ( 4 "testing" 5 6 "github.com/stretchr/testify/assert" 7 ) 8 9 func TestParseVersion(t *testing.T) { 10 assert := assert.New(t) 11 v := Version{} 12 err := parseVersion("1.2.3", &v) 13 assert.NoError(err) 14 assert.Equal(Version{Major: 1, Minor: 2, Patch: 3}, v) 15 } 16 17 func TestParseVersionInvalid(t *testing.T) { 18 assert := assert.New(t) 19 for _, s := range []string{ 20 "1.2", 21 "1.2.a", 22 "1.a.3", 23 "a.2.3", 24 } { 25 v := Version{} 26 err := parseVersion(s, &v) 27 assert.Error(err) 28 } 29 } 30 31 func TestParse(t *testing.T) { 32 assert := assert.New(t) 33 34 for _, test := range []struct { 35 s string 36 v Version 37 strip string 38 }{ 39 { 40 "1.2.3-4-fcf2c8f", 41 Version{Major: 1, Minor: 2, Patch: 3, Commits: 4, Hash: "fcf2c8f"}, 42 "", 43 }, 44 { 45 "0.0.0-0-", 46 Version{}, 47 "", 48 }, 49 { 50 "1.2.3-rc1", 51 Version{Major: 1, Minor: 2, Patch: 3, preRelease: "rc1"}, 52 "", 53 }, 54 { 55 "1.2.3-rc1-2-gd92f0b2", 56 Version{Major: 1, Minor: 2, Patch: 3, preRelease: "rc1", Commits: 2, Hash: "gd92f0b2"}, 57 "", 58 }, 59 { 60 "3.2.1", 61 Version{Major: 3, Minor: 2, Patch: 1}, 62 "", 63 }, 64 { 65 "v3.2.1", 66 Version{Major: 3, Minor: 2, Patch: 1}, 67 "v", 68 }, 69 } { 70 v := Version{} 71 err := parse(test.s, &v, test.strip) 72 assert.NoError(err) 73 assert.Equal(test.v, v) 74 } 75 } 76 77 func TestParseInvalid(t *testing.T) { 78 for _, s := range []string{ 79 "1.2.3-rc1-14-gd92f0b2-foo", // too many parts 80 "1.2.3-rc1-foo-gd92f0b2", // invalid commit count 81 } { 82 v := Version{} 83 err := parse(s, &v) 84 assert.Error(t, err) 85 } 86 } 87 88 func TestString(t *testing.T) { 89 assert := assert.New(t) 90 for _, test := range []struct { 91 v Version 92 s string 93 }{ 94 { 95 Version{Major: 1, Minor: 2, Patch: 3, Commits: 10, Hash: "fcf2c8f"}, 96 "1.2.4-dev10+fcf2c8f", 97 }, 98 { 99 Version{Major: 0, Minor: 3, Patch: 1}, 100 "0.3.1", 101 }, 102 { 103 Version{Major: 1, Minor: 3, Patch: 0, preRelease: "rc3"}, 104 "1.3.0-rc3", 105 }, 106 { 107 Version{Major: 2, Minor: 5, Patch: 0, preRelease: "rc3", Commits: 3}, 108 "2.5.0-rc4.dev3", 109 }, 110 } { 111 assert.Equal(test.s, test.v.String()) 112 } 113 114 } 115 116 func TestFormat(t *testing.T) { 117 assert := assert.New(t) 118 v := Version{Major: 1, Minor: 2, Patch: 3, Commits: 10, Hash: "fcf2c8f"} 119 for _, test := range []struct { 120 f string 121 p string 122 s string 123 }{ 124 { 125 FullFormat, 126 "", 127 "1.2.4-dev10+fcf2c8f", 128 }, 129 { 130 NoMetaFormat, 131 "", 132 "1.2.4-dev10", 133 }, 134 { 135 NoPreFormat, 136 "", 137 "1.2.4", 138 }, 139 { 140 NoPatchFormat, 141 "", 142 "1.2", 143 }, 144 { 145 NoMinorFormat, 146 "v", 147 "v1", 148 }, 149 { 150 "x.y-p", 151 "v", 152 "v1.2-dev10", 153 }, 154 } { 155 s, err := v.Format(test.f, test.p) 156 assert.NoError(err) 157 assert.Equal(test.s, s) 158 } 159 } 160 161 func TestInvalidFormat(t *testing.T) { 162 v := Version{Major: 1, Minor: 2, Patch: 3} 163 s, err := v.Format("q", "") 164 assert.EqualError(t, err, "invalid format: q") 165 assert.Equal(t, "", s) 166 } 167 168 func TestNextPreRelease(t *testing.T) { 169 assert := assert.New(t) 170 assert.Equal("rc2", nextPreRelease("rc1")) 171 assert.Equal("alpha1", nextPreRelease("alpha0")) 172 assert.Equal("beta10", nextPreRelease("beta9")) 173 assert.Equal("foo", nextPreRelease("foo")) 174 } 175 176 type gitFaker struct { 177 s string 178 } 179 180 func (g gitFaker) Describe() string { return g.s } 181 func (g gitFaker) CommitCount() string { return "" } 182 183 func TestDerive(t *testing.T) { 184 for _, test := range []struct { 185 s string 186 v Version 187 }{ 188 { 189 "3.2.1-rc3-10-ge6c3c44", 190 Version{Major: 3, Minor: 2, Patch: 1, preRelease: "rc3", Commits: 10, Hash: "ge6c3c44"}, 191 }, 192 } { 193 git = gitFaker{test.s} 194 Derive() 195 } 196 }