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_LT_Y, "1", "1-sp" );
172
173 assertOrder( X_LT_Y, "A.rc.1", "A.ga.1" );
174 assertOrder( X_GT_Y, "A.sp.1", "A.ga.1" );
175 assertOrder( X_LT_Y, "A.rc.x", "A.ga.x" );
176 assertOrder( X_GT_Y, "A.sp.x", "A.ga.x" );
177 }
178
179 @Test
180 public void testWellKnownQualifierVersusUnknownQualifierOrdering()
181 {
182 assertOrder( X_GT_Y, "1-abc", "1-alpha" );
183 assertOrder( X_GT_Y, "1-abc", "1-beta" );
184 assertOrder( X_GT_Y, "1-abc", "1-milestone" );
185 assertOrder( X_GT_Y, "1-abc", "1-rc" );
186 assertOrder( X_GT_Y, "1-abc", "1-snapshot" );
187 assertOrder( X_GT_Y, "1-abc", "1" );
188 assertOrder( X_GT_Y, "1-abc", "1-sp" );
189 }
190
191 @Test
192 public void testWellKnownSingleCharQualifiersOnlyRecognizedIfImmediatelyFollowedByNumber()
193 {
194 assertOrder( X_GT_Y, "1.0a", "1.0" );
195 assertOrder( X_GT_Y, "1.0-a", "1.0" );
196 assertOrder( X_GT_Y, "1.0.a", "1.0" );
197 assertOrder( X_GT_Y, "1.0b", "1.0" );
198 assertOrder( X_GT_Y, "1.0-b", "1.0" );
199 assertOrder( X_GT_Y, "1.0.b", "1.0" );
200 assertOrder( X_GT_Y, "1.0m", "1.0" );
201 assertOrder( X_GT_Y, "1.0-m", "1.0" );
202 assertOrder( X_GT_Y, "1.0.m", "1.0" );
203
204 assertOrder( X_LT_Y, "1.0a1", "1.0" );
205 assertOrder( X_LT_Y, "1.0-a1", "1.0" );
206 assertOrder( X_LT_Y, "1.0.a1", "1.0" );
207 assertOrder( X_LT_Y, "1.0b1", "1.0" );
208 assertOrder( X_LT_Y, "1.0-b1", "1.0" );
209 assertOrder( X_LT_Y, "1.0.b1", "1.0" );
210 assertOrder( X_LT_Y, "1.0m1", "1.0" );
211 assertOrder( X_LT_Y, "1.0-m1", "1.0" );
212 assertOrder( X_LT_Y, "1.0.m1", "1.0" );
213
214 assertOrder( X_GT_Y, "1.0a.1", "1.0" );
215 assertOrder( X_GT_Y, "1.0a-1", "1.0" );
216 assertOrder( X_GT_Y, "1.0b.1", "1.0" );
217 assertOrder( X_GT_Y, "1.0b-1", "1.0" );
218 assertOrder( X_GT_Y, "1.0m.1", "1.0" );
219 assertOrder( X_GT_Y, "1.0m-1", "1.0" );
220 }
221
222 @Test
223 public void testUnknownQualifierOrdering()
224 {
225 assertOrder( X_LT_Y, "1-abc", "1-abcd" );
226 assertOrder( X_LT_Y, "1-abc", "1-bcd" );
227 assertOrder( X_GT_Y, "1-abc", "1-aac" );
228 }
229
230 @Test
231 public void testCaseInsensitiveOrderingOfQualifiers()
232 {
233 assertOrder( X_EQ_Y, "1.alpha", "1.ALPHA" );
234 assertOrder( X_EQ_Y, "1.alpha", "1.Alpha" );
235
236 assertOrder( X_EQ_Y, "1.beta", "1.BETA" );
237 assertOrder( X_EQ_Y, "1.beta", "1.Beta" );
238
239 assertOrder( X_EQ_Y, "1.milestone", "1.MILESTONE" );
240 assertOrder( X_EQ_Y, "1.milestone", "1.Milestone" );
241
242 assertOrder( X_EQ_Y, "1.rc", "1.RC" );
243 assertOrder( X_EQ_Y, "1.rc", "1.Rc" );
244 assertOrder( X_EQ_Y, "1.cr", "1.CR" );
245 assertOrder( X_EQ_Y, "1.cr", "1.Cr" );
246
247 assertOrder( X_EQ_Y, "1.snapshot", "1.SNAPSHOT" );
248 assertOrder( X_EQ_Y, "1.snapshot", "1.Snapshot" );
249
250 assertOrder( X_EQ_Y, "1.ga", "1.GA" );
251 assertOrder( X_EQ_Y, "1.ga", "1.Ga" );
252 assertOrder( X_EQ_Y, "1.final", "1.FINAL" );
253 assertOrder( X_EQ_Y, "1.final", "1.Final" );
254
255 assertOrder( X_EQ_Y, "1.sp", "1.SP" );
256 assertOrder( X_EQ_Y, "1.sp", "1.Sp" );
257
258 assertOrder( X_EQ_Y, "1.unknown", "1.UNKNOWN" );
259 assertOrder( X_EQ_Y, "1.unknown", "1.Unknown" );
260 }
261
262 @Test
263 public void testCaseInsensitiveOrderingOfQualifiersIsLocaleIndependent()
264 {
265 Locale orig = Locale.getDefault();
266 try
267 {
268 Locale[] locales = { Locale.ENGLISH, new Locale( "tr" ) };
269 for ( Locale locale : locales )
270 {
271 Locale.setDefault( locale );
272 assertOrder( X_EQ_Y, "1-abcdefghijklmnopqrstuvwxyz", "1-ABCDEFGHIJKLMNOPQRSTUVWXYZ" );
273 }
274 }
275 finally
276 {
277 Locale.setDefault( orig );
278 }
279 }
280
281 @Test
282 public void testQualifierVersusNumberOrdering()
283 {
284 assertOrder( X_LT_Y, "1-ga", "1-1" );
285 assertOrder( X_LT_Y, "1.ga", "1.1" );
286 assertOrder( X_EQ_Y, "1-ga", "1.0" );
287 assertOrder( X_EQ_Y, "1.ga", "1.0" );
288
289 assertOrder( X_LT_Y, "1-ga-1", "1-0-1" );
290 assertOrder( X_LT_Y, "1.ga.1", "1.0.1" );
291
292 assertOrder( X_GT_Y, "1.sp", "1.0" );
293 assertOrder( X_LT_Y, "1.sp", "1.1" );
294
295 assertOrder( X_LT_Y, "1-abc", "1-1" );
296 assertOrder( X_LT_Y, "1.abc", "1.1" );
297
298 assertOrder( X_LT_Y, "1-xyz", "1-1" );
299 assertOrder( X_LT_Y, "1.xyz", "1.1" );
300 }
301
302 @Test
303 public void testVersionEvolution()
304 {
305 assertSequence( "0.9.9-SNAPSHOT", "0.9.9", "0.9.10-SNAPSHOT", "0.9.10", "1.0-alpha-2-SNAPSHOT", "1.0-alpha-2",
306 "1.0-alpha-10-SNAPSHOT", "1.0-alpha-10", "1.0-beta-1-SNAPSHOT", "1.0-beta-1",
307 "1.0-rc-1-SNAPSHOT", "1.0-rc-1", "1.0-SNAPSHOT", "1.0", "1.0-sp-1-SNAPSHOT", "1.0-sp-1",
308 "1.0.1-alpha-1-SNAPSHOT", "1.0.1-alpha-1", "1.0.1-beta-1-SNAPSHOT", "1.0.1-beta-1",
309 "1.0.1-rc-1-SNAPSHOT", "1.0.1-rc-1", "1.0.1-SNAPSHOT", "1.0.1", "1.1-SNAPSHOT", "1.1" );
310
311 assertSequence( "1.0-alpha", "1.0", "1.0-1" );
312 assertSequence( "1.0.alpha", "1.0", "1.0-1" );
313 assertSequence( "1.0-alpha", "1.0", "1.0.1" );
314 assertSequence( "1.0.alpha", "1.0", "1.0.1" );
315 }
316
317 @Test
318 public void testMinimumSegment()
319 {
320 assertOrder( X_LT_Y, "1.min", "1.0-alpha-1" );
321 assertOrder( X_LT_Y, "1.min", "1.0-SNAPSHOT" );
322 assertOrder( X_LT_Y, "1.min", "1.0" );
323 assertOrder( X_LT_Y, "1.min", "1.9999999999" );
324
325 assertOrder( X_EQ_Y, "1.min", "1.MIN" );
326
327 assertOrder( X_GT_Y, "1.min", "0.99999" );
328 assertOrder( X_GT_Y, "1.min", "0.max" );
329 }
330
331 @Test
332 public void testMaximumSegment()
333 {
334 assertOrder( X_GT_Y, "1.max", "1.0-alpha-1" );
335 assertOrder( X_GT_Y, "1.max", "1.0-SNAPSHOT" );
336 assertOrder( X_GT_Y, "1.max", "1.0" );
337 assertOrder( X_GT_Y, "1.max", "1.9999999999" );
338
339 assertOrder( X_EQ_Y, "1.max", "1.MAX" );
340
341 assertOrder( X_LT_Y, "1.max", "2.0-alpha-1" );
342 assertOrder( X_LT_Y, "1.max", "2.min" );
343 }
344
345 }