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_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 }