View Javadoc
1   package org.eclipse.aether.util.version;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   * 
12   *  http://www.apache.org/licenses/LICENSE-2.0
13   * 
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
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 }