@@ -78,75 +78,157 @@ func TestStrictNewVersion(t *testing.T) {
78
78
}
79
79
80
80
func 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
+ }
121
142
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
+ })
124
152
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
+ }
136
213
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
+ }
143
221
}
144
- }
222
+ })
145
223
}
146
224
147
225
// TestNewVersionCheckError checks the returned error for compatibility
148
226
func TestNewVersionCheckError (t * testing.T ) {
149
227
t .Run ("With detailed errors" , func (t * testing.T ) {
228
+ CoerceNewVersion = false
229
+ defer func () {
230
+ CoerceNewVersion = true
231
+ }()
150
232
tests := []struct {
151
233
version string
152
234
wantErr error
@@ -211,8 +293,10 @@ func TestNewVersionCheckError(t *testing.T) {
211
293
212
294
t .Run ("Without detailed errors" , func (t * testing.T ) {
213
295
DetailedNewVersionErrors = false
296
+ CoerceNewVersion = false
214
297
defer func () {
215
298
DetailedNewVersionErrors = true
299
+ CoerceNewVersion = true
216
300
}()
217
301
218
302
tests := []struct {
0 commit comments