@@ -78,75 +78,157 @@ func TestStrictNewVersion(t *testing.T) {
7878}
7979
8080func TestNewVersion (t * testing.T ) {
81- tests := []struct {
82- version string
83- err bool
84- }{
85- {"1.2.3" , false },
86- {"1.2.3-alpha.01" , true },
87- {"1.2.3+test.01" , false },
88- {"1.2.3-alpha.-1" , false },
89- {"v1.2.3" , false },
90- {"1.0" , false },
91- {"v1.0" , false },
92- {"1" , false },
93- {"v1" , false },
94- {"1.2.beta" , true },
95- {"v1.2.beta" , true },
96- {"foo" , true },
97- {"1.2-5" , false },
98- {"v1.2-5" , false },
99- {"1.2-beta.5" , false },
100- {"v1.2-beta.5" , false },
101- {"\n 1.2" , true },
102- {"\n v1.2" , true },
103- {"1.2.0-x.Y.0+metadata" , false },
104- {"v1.2.0-x.Y.0+metadata" , false },
105- {"1.2.0-x.Y.0+metadata-width-hypen" , false },
106- {"v1.2.0-x.Y.0+metadata-width-hypen" , false },
107- {"1.2.3-rc1-with-hypen" , false },
108- {"v1.2.3-rc1-with-hypen" , false },
109- {"1.2.3.4" , true },
110- {"v1.2.3.4" , true },
111- {"1.2.2147483648" , false },
112- {"1.2147483648.3" , false },
113- {"2147483648.3.0" , false },
114-
115- // Due to having 4 parts these should produce an error. See
116- // https://github.com/Masterminds/semver/issues/185 for the reason for
117- // these tests.
118- {"12.3.4.1234" , true },
119- {"12.23.4.1234" , true },
120- {"12.3.34.1234" , true },
81+ t .Run ("With loose NewVersion" , func (t * testing.T ) {
82+ tests := []struct {
83+ version string
84+ err bool
85+ }{
86+ {"1.2.3" , false },
87+ {"1.2.3-alpha.01" , true },
88+ {"1.2.3+test.01" , false },
89+ {"1.2.3-alpha.-1" , false },
90+ {"v1.2.3" , false },
91+ {"1.0" , false },
92+ {"v1.0" , false },
93+ {"1" , false },
94+ {"v1" , false },
95+ {"1.2.beta" , true },
96+ {"v1.2.beta" , true },
97+ {"foo" , true },
98+ {"1.2-5" , false },
99+ {"v1.2-5" , false },
100+ {"1.2-beta.5" , false },
101+ {"v1.2-beta.5" , false },
102+ {"\n 1.2" , true },
103+ {"\n v1.2" , true },
104+ {"1.2.0-x.Y.0+metadata" , false },
105+ {"v1.2.0-x.Y.0+metadata" , false },
106+ {"1.2.0-x.Y.0+metadata-width-hypen" , false },
107+ {"v1.2.0-x.Y.0+metadata-width-hypen" , false },
108+ {"1.2.3-rc1-with-hypen" , false },
109+ {"v1.2.3-rc1-with-hypen" , false },
110+ {"1.2.3.4" , true },
111+ {"v1.2.3.4" , true },
112+ {"1.2.2147483648" , false },
113+ {"1.2147483648.3" , false },
114+ {"2147483648.3.0" , false },
115+
116+ // Due to having 4 parts these should produce an error. See
117+ // https://github.com/Masterminds/semver/issues/185 for the reason for
118+ // these tests.
119+ {"12.3.4.1234" , true },
120+ {"12.23.4.1234" , true },
121+ {"12.3.34.1234" , true },
122+
123+ // The SemVer spec in a pre-release expects to allow [0-9A-Za-z-].
124+ {"20221209-update-renovatejson-v4" , false },
125+
126+ // Various cases that are invalid semver
127+ {"1.1.2+.123" , true }, // A leading . in build metadata. This would signify that the first segment is empty
128+ {"1.0.0-alpha_beta" , true }, // An underscore in the pre-release is an invalid character
129+ {"1.0.0-alpha.." , true }, // Multiple empty segments
130+ {"1.0.0-alpha..1" , true }, // Multiple empty segments but one with a value
131+ {"9.8.7+meta+meta" , true }, // Multiple metadata parts
132+ {"1.2.31----RC-SNAPSHOT.12.09.1--.12+788" , true }, // Leading 0 in a number part of a pre-release segment
133+
134+ // Versions that are invalid but in loose mode are handled.
135+ // This enables a calver-ish style. This pattern has long
136+ // been supported by this package even though it technically
137+ // breaks from semver. Tools built on this allow it.
138+ {"01.1.1" , false }, // A leading 0 on a number segment
139+ {"1.01.1" , false }, // A leading 0 on a number segment
140+ {"1.1.01" , false }, // A leading 0 on a number segment
141+ }
121142
122- // The SemVer spec in a pre-release expects to allow [0-9A-Za-z-].
123- {"20221209-update-renovatejson-v4" , false },
143+ for _ , tc := range tests {
144+ _ , err := NewVersion (tc .version )
145+ if tc .err && err == nil {
146+ t .Fatalf ("expected error for version: %s" , tc .version )
147+ } else if ! tc .err && err != nil {
148+ t .Fatalf ("error for version %s: %s" , tc .version , err )
149+ }
150+ }
151+ })
124152
125- // Various cases that are invalid semver
126- {"1.1.2+.123" , true }, // A leading . in build metadata. This would signify that the first segment is empty
127- {"1.0.0-alpha_beta" , true }, // An underscore in the pre-release is an invalid character
128- {"1.0.0-alpha.." , true }, // Multiple empty segments
129- {"1.0.0-alpha..1" , true }, // Multiple empty segments but one with a value
130- {"01.1.1" , true }, // A leading 0 on a number segment
131- {"1.01.1" , true }, // A leading 0 on a number segment
132- {"1.1.01" , true }, // A leading 0 on a number segment
133- {"9.8.7+meta+meta" , true }, // Multiple metadata parts
134- {"1.2.31----RC-SNAPSHOT.12.09.1--.12+788" , true }, // Leading 0 in a number part of a pre-release segment
135- }
153+ t .Run ("Without loose NewVersion" , func (t * testing.T ) {
154+ CoerceNewVersion = false
155+ defer func () {
156+ CoerceNewVersion = true
157+ }()
158+ tests := []struct {
159+ version string
160+ err bool
161+ }{
162+ {"1.2.3" , false },
163+ {"1.2.3-alpha.01" , true },
164+ {"1.2.3+test.01" , false },
165+ {"1.2.3-alpha.-1" , false },
166+ {"v1.2.3" , false },
167+ {"1.0" , false },
168+ {"v1.0" , false },
169+ {"1" , false },
170+ {"v1" , false },
171+ {"1.2.beta" , true },
172+ {"v1.2.beta" , true },
173+ {"foo" , true },
174+ {"1.2-5" , false },
175+ {"v1.2-5" , false },
176+ {"1.2-beta.5" , false },
177+ {"v1.2-beta.5" , false },
178+ {"\n 1.2" , true },
179+ {"\n v1.2" , true },
180+ {"1.2.0-x.Y.0+metadata" , false },
181+ {"v1.2.0-x.Y.0+metadata" , false },
182+ {"1.2.0-x.Y.0+metadata-width-hypen" , false },
183+ {"v1.2.0-x.Y.0+metadata-width-hypen" , false },
184+ {"1.2.3-rc1-with-hypen" , false },
185+ {"v1.2.3-rc1-with-hypen" , false },
186+ {"1.2.3.4" , true },
187+ {"v1.2.3.4" , true },
188+ {"1.2.2147483648" , false },
189+ {"1.2147483648.3" , false },
190+ {"2147483648.3.0" , false },
191+
192+ // Due to having 4 parts these should produce an error. See
193+ // https://github.com/Masterminds/semver/issues/185 for the reason for
194+ // these tests.
195+ {"12.3.4.1234" , true },
196+ {"12.23.4.1234" , true },
197+ {"12.3.34.1234" , true },
198+
199+ // The SemVer spec in a pre-release expects to allow [0-9A-Za-z-].
200+ {"20221209-update-renovatejson-v4" , false },
201+
202+ // Various cases that are invalid semver
203+ {"1.1.2+.123" , true }, // A leading . in build metadata. This would signify that the first segment is empty
204+ {"1.0.0-alpha_beta" , true }, // An underscore in the pre-release is an invalid character
205+ {"1.0.0-alpha.." , true }, // Multiple empty segments
206+ {"1.0.0-alpha..1" , true }, // Multiple empty segments but one with a value
207+ {"01.1.1" , true }, // A leading 0 on a number segment
208+ {"1.01.1" , true }, // A leading 0 on a number segment
209+ {"1.1.01" , true }, // A leading 0 on a number segment
210+ {"9.8.7+meta+meta" , true }, // Multiple metadata parts
211+ {"1.2.31----RC-SNAPSHOT.12.09.1--.12+788" , true }, // Leading 0 in a number part of a pre-release segment
212+ }
136213
137- for _ , tc := range tests {
138- _ , err := NewVersion (tc .version )
139- if tc .err && err == nil {
140- t .Fatalf ("expected error for version: %s" , tc .version )
141- } else if ! tc .err && err != nil {
142- t .Fatalf ("error for version %s: %s" , tc .version , err )
214+ for _ , tc := range tests {
215+ _ , err := NewVersion (tc .version )
216+ if tc .err && err == nil {
217+ t .Fatalf ("expected error for version: %s" , tc .version )
218+ } else if ! tc .err && err != nil {
219+ t .Fatalf ("error for version %s: %s" , tc .version , err )
220+ }
143221 }
144- }
222+ })
145223}
146224
147225// TestNewVersionCheckError checks the returned error for compatibility
148226func TestNewVersionCheckError (t * testing.T ) {
149227 t .Run ("With detailed errors" , func (t * testing.T ) {
228+ CoerceNewVersion = false
229+ defer func () {
230+ CoerceNewVersion = true
231+ }()
150232 tests := []struct {
151233 version string
152234 wantErr error
@@ -211,8 +293,10 @@ func TestNewVersionCheckError(t *testing.T) {
211293
212294 t .Run ("Without detailed errors" , func (t * testing.T ) {
213295 DetailedNewVersionErrors = false
296+ CoerceNewVersion = false
214297 defer func () {
215298 DetailedNewVersionErrors = true
299+ CoerceNewVersion = true
216300 }()
217301
218302 tests := []struct {
0 commit comments