1 package org.eclipse.aether.util.version;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.util.Locale;
23
24 import org.eclipse.aether.util.version.GenericVersion;
25 import org.eclipse.aether.version.Version;
26 import org.junit.Test;
27
28
29
30 public class GenericVersionTest
31 extends AbstractVersionTest
32 {
33
34 protected Version newVersion( String version )
35 {
36 return new GenericVersion( version );
37 }
38
39 @Test
40 public void testEmptyVersion()
41 {
42 assertOrder( X_EQ_Y, "0", "" );
43 }
44
45 @Test
46 public void testNumericOrdering()
47 {
48 assertOrder( X_LT_Y, "2", "10" );
49 assertOrder( X_LT_Y, "1.2", "1.10" );
50 assertOrder( X_LT_Y, "1.0.2", "1.0.10" );
51 assertOrder( X_LT_Y, "1.0.0.2", "1.0.0.10" );
52 assertOrder( X_LT_Y, "1.0.20101206.111434.1", "1.0.20101206.111435.1" );
53 assertOrder( X_LT_Y, "1.0.20101206.111434.2", "1.0.20101206.111434.10" );
54 }
55
56 @Test
57 public void testDelimiters()
58 {
59 assertOrder( X_EQ_Y, "1.0", "1-0" );
60 assertOrder( X_EQ_Y, "1.0", "1_0" );
61 assertOrder( X_EQ_Y, "1.a", "1a" );
62 }
63
64 @Test
65 public void testLeadingZerosAreSemanticallyIrrelevant()
66 {
67 assertOrder( X_EQ_Y, "1", "01" );
68 assertOrder( X_EQ_Y, "1.2", "1.002" );
69 assertOrder( X_EQ_Y, "1.2.3", "1.2.0003" );
70 assertOrder( X_EQ_Y, "1.2.3.4", "1.2.3.00004" );
71 }
72
73 @Test
74 public void testTrailingZerosAreSemanticallyIrrelevant()
75 {
76 assertOrder( X_EQ_Y, "1", "1.0.0.0.0.0.0.0.0.0.0.0.0.0" );
77 assertOrder( X_EQ_Y, "1", "1-0-0-0-0-0-0-0-0-0-0-0-0-0" );
78 assertOrder( X_EQ_Y, "1", "1.0-0.0-0.0-0.0-0.0-0.0-0.0" );
79 assertOrder( X_EQ_Y, "1", "1.0000000000000" );
80 assertOrder( X_EQ_Y, "1.0", "1.0.0" );
81 }
82
83 @Test
84 public void testTrailingZerosBeforeQualifierAreSemanticallyIrrelevant()
85 {
86 assertOrder( X_EQ_Y, "1.0-ga", "1.0.0-ga" );
87 assertOrder( X_EQ_Y, "1.0.ga", "1.0.0.ga" );
88 assertOrder( X_EQ_Y, "1.0ga", "1.0.0ga" );
89
90 assertOrder( X_EQ_Y, "1.0-alpha", "1.0.0-alpha" );
91 assertOrder( X_EQ_Y, "1.0.alpha", "1.0.0.alpha" );
92 assertOrder( X_EQ_Y, "1.0alpha", "1.0.0alpha" );
93 assertOrder( X_EQ_Y, "1.0-alpha-snapshot", "1.0.0-alpha-snapshot" );
94 assertOrder( X_EQ_Y, "1.0.alpha.snapshot", "1.0.0.alpha.snapshot" );
95
96 assertOrder( X_EQ_Y, "1.x.0-alpha", "1.x.0.0-alpha" );
97 assertOrder( X_EQ_Y, "1.x.0.alpha", "1.x.0.0.alpha" );
98 assertOrder( X_EQ_Y, "1.x.0-alpha-snapshot", "1.x.0.0-alpha-snapshot" );
99 assertOrder( X_EQ_Y, "1.x.0.alpha.snapshot", "1.x.0.0.alpha.snapshot" );
100 }
101
102 @Test
103 public void testTrailingDelimitersAreSemanticallyIrrelevant()
104 {
105 assertOrder( X_EQ_Y, "1", "1............." );
106 assertOrder( X_EQ_Y, "1", "1-------------" );
107 assertOrder( X_EQ_Y, "1.0", "1............." );
108 assertOrder( X_EQ_Y, "1.0", "1-------------" );
109 }
110
111 @Test
112 public void testInitialDelimiters()
113 {
114 assertOrder( X_EQ_Y, "0.1", ".1" );
115 assertOrder( X_EQ_Y, "0.0.1", "..1" );
116 assertOrder( X_EQ_Y, "0.1", "-1" );
117 assertOrder( X_EQ_Y, "0.0.1", "--1" );
118 }
119
120 @Test
121 public void testConsecutiveDelimiters()
122 {
123 assertOrder( X_EQ_Y, "1.0.1", "1..1" );
124 assertOrder( X_EQ_Y, "1.0.0.1", "1...1" );
125 assertOrder( X_EQ_Y, "1.0.1", "1--1" );
126 assertOrder( X_EQ_Y, "1.0.0.1", "1---1" );
127 }
128
129 @Test
130 public void testUnlimitedNumberOfVersionComponents()
131 {
132 assertOrder( X_GT_Y, "1.0.1.2.3.4.5.6.7.8.9.0.1.2.10", "1.0.1.2.3.4.5.6.7.8.9.0.1.2.3" );
133 }
134
135 @Test
136 public void testUnlimitedNumberOfDigitsInNumericComponent()
137 {
138 assertOrder( X_GT_Y, "1.1234567890123456789012345678901", "1.123456789012345678901234567891" );
139 }
140
141 @Test
142 public void testTransitionFromDigitToLetterAndViceVersaIsEqualivantToDelimiter()
143 {
144 assertOrder( X_EQ_Y, "1alpha10", "1.alpha.10" );
145 assertOrder( X_EQ_Y, "1alpha10", "1-alpha-10" );
146
147 assertOrder( X_GT_Y, "1.alpha10", "1.alpha2" );
148 assertOrder( X_GT_Y, "10alpha", "1alpha" );
149 }
150
151 @Test
152 public void testWellKnownQualifierOrdering()
153 {
154 assertOrder( X_EQ_Y, "1-alpha1", "1-a1" );
155 assertOrder( X_LT_Y, "1-alpha", "1-beta" );
156 assertOrder( X_EQ_Y, "1-beta1", "1-b1" );
157 assertOrder( X_LT_Y, "1-beta", "1-milestone" );
158 assertOrder( X_EQ_Y, "1-milestone1", "1-m1" );
159 assertOrder( X_LT_Y, "1-milestone", "1-rc" );
160 assertOrder( X_EQ_Y, "1-rc", "1-cr" );
161 assertOrder( X_LT_Y, "1-rc", "1-snapshot" );
162 assertOrder( X_LT_Y, "1-snapshot", "1" );
163 assertOrder( X_EQ_Y, "1", "1-ga" );
164 assertOrder( X_EQ_Y, "1", "1.ga.0.ga" );
165 assertOrder( X_EQ_Y, "1.0", "1-ga" );
166 assertOrder( X_EQ_Y, "1", "1-ga.ga" );
167 assertOrder( X_EQ_Y, "1", "1-ga-ga" );
168 assertOrder( X_EQ_Y, "A", "A.ga.ga" );
169 assertOrder( X_EQ_Y, "A", "A-ga-ga" );
170 assertOrder( X_EQ_Y, "1", "1-final" );
171 assertOrder( X_EQ_Y, "1", "1-release" );
172 assertOrder( X_LT_Y, "1", "1-sp" );
173
174 assertOrder( X_LT_Y, "A.rc.1", "A.ga.1" );
175 assertOrder( X_GT_Y, "A.sp.1", "A.ga.1" );
176 assertOrder( X_LT_Y, "A.rc.x", "A.ga.x" );
177 assertOrder( X_GT_Y, "A.sp.x", "A.ga.x" );
178 }
179
180 @Test
181 public void testWellKnownQualifierVersusUnknownQualifierOrdering()
182 {
183 assertOrder( X_GT_Y, "1-abc", "1-alpha" );
184 assertOrder( X_GT_Y, "1-abc", "1-beta" );
185 assertOrder( X_GT_Y, "1-abc", "1-milestone" );
186 assertOrder( X_GT_Y, "1-abc", "1-rc" );
187 assertOrder( X_GT_Y, "1-abc", "1-snapshot" );
188 assertOrder( X_GT_Y, "1-abc", "1" );
189 assertOrder( X_GT_Y, "1-abc", "1-sp" );
190 }
191
192 @Test
193 public void testWellKnownSingleCharQualifiersOnlyRecognizedIfImmediatelyFollowedByNumber()
194 {
195 assertOrder( X_GT_Y, "1.0a", "1.0" );
196 assertOrder( X_GT_Y, "1.0-a", "1.0" );
197 assertOrder( X_GT_Y, "1.0.a", "1.0" );
198 assertOrder( X_GT_Y, "1.0b", "1.0" );
199 assertOrder( X_GT_Y, "1.0-b", "1.0" );
200 assertOrder( X_GT_Y, "1.0.b", "1.0" );
201 assertOrder( X_GT_Y, "1.0m", "1.0" );
202 assertOrder( X_GT_Y, "1.0-m", "1.0" );
203 assertOrder( X_GT_Y, "1.0.m", "1.0" );
204
205 assertOrder( X_LT_Y, "1.0a1", "1.0" );
206 assertOrder( X_LT_Y, "1.0-a1", "1.0" );
207 assertOrder( X_LT_Y, "1.0.a1", "1.0" );
208 assertOrder( X_LT_Y, "1.0b1", "1.0" );
209 assertOrder( X_LT_Y, "1.0-b1", "1.0" );
210 assertOrder( X_LT_Y, "1.0.b1", "1.0" );
211 assertOrder( X_LT_Y, "1.0m1", "1.0" );
212 assertOrder( X_LT_Y, "1.0-m1", "1.0" );
213 assertOrder( X_LT_Y, "1.0.m1", "1.0" );
214
215 assertOrder( X_GT_Y, "1.0a.1", "1.0" );
216 assertOrder( X_GT_Y, "1.0a-1", "1.0" );
217 assertOrder( X_GT_Y, "1.0b.1", "1.0" );
218 assertOrder( X_GT_Y, "1.0b-1", "1.0" );
219 assertOrder( X_GT_Y, "1.0m.1", "1.0" );
220 assertOrder( X_GT_Y, "1.0m-1", "1.0" );
221 }
222
223 @Test
224 public void testUnknownQualifierOrdering()
225 {
226 assertOrder( X_LT_Y, "1-abc", "1-abcd" );
227 assertOrder( X_LT_Y, "1-abc", "1-bcd" );
228 assertOrder( X_GT_Y, "1-abc", "1-aac" );
229 }
230
231 @Test
232 public void testCaseInsensitiveOrderingOfQualifiers()
233 {
234 assertOrder( X_EQ_Y, "1.alpha", "1.ALPHA" );
235 assertOrder( X_EQ_Y, "1.alpha", "1.Alpha" );
236
237 assertOrder( X_EQ_Y, "1.beta", "1.BETA" );
238 assertOrder( X_EQ_Y, "1.beta", "1.Beta" );
239
240 assertOrder( X_EQ_Y, "1.milestone", "1.MILESTONE" );
241 assertOrder( X_EQ_Y, "1.milestone", "1.Milestone" );
242
243 assertOrder( X_EQ_Y, "1.rc", "1.RC" );
244 assertOrder( X_EQ_Y, "1.rc", "1.Rc" );
245 assertOrder( X_EQ_Y, "1.cr", "1.CR" );
246 assertOrder( X_EQ_Y, "1.cr", "1.Cr" );
247
248 assertOrder( X_EQ_Y, "1.snapshot", "1.SNAPSHOT" );
249 assertOrder( X_EQ_Y, "1.snapshot", "1.Snapshot" );
250
251 assertOrder( X_EQ_Y, "1.ga", "1.GA" );
252 assertOrder( X_EQ_Y, "1.ga", "1.Ga" );
253 assertOrder( X_EQ_Y, "1.final", "1.FINAL" );
254 assertOrder( X_EQ_Y, "1.final", "1.Final" );
255 assertOrder( X_EQ_Y, "1.release", "1.RELEASE" );
256 assertOrder( X_EQ_Y, "1.release", "1.Release" );
257
258 assertOrder( X_EQ_Y, "1.sp", "1.SP" );
259 assertOrder( X_EQ_Y, "1.sp", "1.Sp" );
260
261 assertOrder( X_EQ_Y, "1.unknown", "1.UNKNOWN" );
262 assertOrder( X_EQ_Y, "1.unknown", "1.Unknown" );
263 }
264
265 @Test
266 public void testCaseInsensitiveOrderingOfQualifiersIsLocaleIndependent()
267 {
268 Locale orig = Locale.getDefault();
269 try
270 {
271 Locale[] locales = { Locale.ENGLISH, new Locale( "tr" ) };
272 for ( Locale locale : locales )
273 {
274 Locale.setDefault( locale );
275 assertOrder( X_EQ_Y, "1-abcdefghijklmnopqrstuvwxyz", "1-ABCDEFGHIJKLMNOPQRSTUVWXYZ" );
276 }
277 }
278 finally
279 {
280 Locale.setDefault( orig );
281 }
282 }
283
284 @Test
285 public void testQualifierVersusNumberOrdering()
286 {
287 assertOrder( X_LT_Y, "1-ga", "1-1" );
288 assertOrder( X_LT_Y, "1.ga", "1.1" );
289 assertOrder( X_EQ_Y, "1-ga", "1.0" );
290 assertOrder( X_EQ_Y, "1.ga", "1.0" );
291
292 assertOrder( X_LT_Y, "1-ga-1", "1-0-1" );
293 assertOrder( X_LT_Y, "1.ga.1", "1.0.1" );
294
295 assertOrder( X_GT_Y, "1.sp", "1.0" );
296 assertOrder( X_LT_Y, "1.sp", "1.1" );
297
298 assertOrder( X_LT_Y, "1-abc", "1-1" );
299 assertOrder( X_LT_Y, "1.abc", "1.1" );
300
301 assertOrder( X_LT_Y, "1-xyz", "1-1" );
302 assertOrder( X_LT_Y, "1.xyz", "1.1" );
303 }
304
305 @Test
306 public void testVersionEvolution()
307 {
308 assertSequence( "0.9.9-SNAPSHOT", "0.9.9", "0.9.10-SNAPSHOT", "0.9.10", "1.0-alpha-2-SNAPSHOT", "1.0-alpha-2",
309 "1.0-alpha-10-SNAPSHOT", "1.0-alpha-10", "1.0-beta-1-SNAPSHOT", "1.0-beta-1",
310 "1.0-rc-1-SNAPSHOT", "1.0-rc-1", "1.0-SNAPSHOT", "1.0", "1.0-sp-1-SNAPSHOT", "1.0-sp-1",
311 "1.0.1-alpha-1-SNAPSHOT", "1.0.1-alpha-1", "1.0.1-beta-1-SNAPSHOT", "1.0.1-beta-1",
312 "1.0.1-rc-1-SNAPSHOT", "1.0.1-rc-1", "1.0.1-SNAPSHOT", "1.0.1", "1.1-SNAPSHOT", "1.1" );
313
314 assertSequence( "1.0-alpha", "1.0", "1.0-1" );
315 assertSequence( "1.0.alpha", "1.0", "1.0-1" );
316 assertSequence( "1.0-alpha", "1.0", "1.0.1" );
317 assertSequence( "1.0.alpha", "1.0", "1.0.1" );
318 }
319
320 @Test
321 public void testMinimumSegment()
322 {
323 assertOrder( X_LT_Y, "1.min", "1.0-alpha-1" );
324 assertOrder( X_LT_Y, "1.min", "1.0-SNAPSHOT" );
325 assertOrder( X_LT_Y, "1.min", "1.0" );
326 assertOrder( X_LT_Y, "1.min", "1.9999999999" );
327
328 assertOrder( X_EQ_Y, "1.min", "1.MIN" );
329
330 assertOrder( X_GT_Y, "1.min", "0.99999" );
331 assertOrder( X_GT_Y, "1.min", "0.max" );
332 }
333
334 @Test
335 public void testMaximumSegment()
336 {
337 assertOrder( X_GT_Y, "1.max", "1.0-alpha-1" );
338 assertOrder( X_GT_Y, "1.max", "1.0-SNAPSHOT" );
339 assertOrder( X_GT_Y, "1.max", "1.0" );
340 assertOrder( X_GT_Y, "1.max", "1.9999999999" );
341
342 assertOrder( X_EQ_Y, "1.max", "1.MAX" );
343
344 assertOrder( X_LT_Y, "1.max", "2.0-alpha-1" );
345 assertOrder( X_LT_Y, "1.max", "2.min" );
346 }
347
348 }