001package org.eclipse.aether.util.version;
002
003/*
004 * Licensed to the Apache Software Foundation (ASF) under one
005 * or more contributor license agreements.  See the NOTICE file
006 * distributed with this work for additional information
007 * regarding copyright ownership.  The ASF licenses this file
008 * to you under the Apache License, Version 2.0 (the
009 * "License"); you may not use this file except in compliance
010 * with the License.  You may obtain a copy of the License at
011 * 
012 *  http://www.apache.org/licenses/LICENSE-2.0
013 * 
014 * Unless required by applicable law or agreed to in writing,
015 * software distributed under the License is distributed on an
016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 * KIND, either express or implied.  See the License for the
018 * specific language governing permissions and limitations
019 * under the License.
020 */
021
022import java.util.Locale;
023
024import org.eclipse.aether.util.version.GenericVersion;
025import org.eclipse.aether.version.Version;
026import org.junit.Test;
027
028/**
029 */
030public class GenericVersionTest
031    extends AbstractVersionTest
032{
033
034    protected Version newVersion( String version )
035    {
036        return new GenericVersion( version );
037    }
038
039    @Test
040    public void testEmptyVersion()
041    {
042        assertOrder( X_EQ_Y, "0", "" );
043    }
044
045    @Test
046    public void testNumericOrdering()
047    {
048        assertOrder( X_LT_Y, "2", "10" );
049        assertOrder( X_LT_Y, "1.2", "1.10" );
050        assertOrder( X_LT_Y, "1.0.2", "1.0.10" );
051        assertOrder( X_LT_Y, "1.0.0.2", "1.0.0.10" );
052        assertOrder( X_LT_Y, "1.0.20101206.111434.1", "1.0.20101206.111435.1" );
053        assertOrder( X_LT_Y, "1.0.20101206.111434.2", "1.0.20101206.111434.10" );
054    }
055
056    @Test
057    public void testDelimiters()
058    {
059        assertOrder( X_EQ_Y, "1.0", "1-0" );
060        assertOrder( X_EQ_Y, "1.0", "1_0" );
061        assertOrder( X_EQ_Y, "1.a", "1a" );
062    }
063
064    @Test
065    public void testLeadingZerosAreSemanticallyIrrelevant()
066    {
067        assertOrder( X_EQ_Y, "1", "01" );
068        assertOrder( X_EQ_Y, "1.2", "1.002" );
069        assertOrder( X_EQ_Y, "1.2.3", "1.2.0003" );
070        assertOrder( X_EQ_Y, "1.2.3.4", "1.2.3.00004" );
071    }
072
073    @Test
074    public void testTrailingZerosAreSemanticallyIrrelevant()
075    {
076        assertOrder( X_EQ_Y, "1", "1.0.0.0.0.0.0.0.0.0.0.0.0.0" );
077        assertOrder( X_EQ_Y, "1", "1-0-0-0-0-0-0-0-0-0-0-0-0-0" );
078        assertOrder( X_EQ_Y, "1", "1.0-0.0-0.0-0.0-0.0-0.0-0.0" );
079        assertOrder( X_EQ_Y, "1", "1.0000000000000" );
080        assertOrder( X_EQ_Y, "1.0", "1.0.0" );
081    }
082
083    @Test
084    public void testTrailingZerosBeforeQualifierAreSemanticallyIrrelevant()
085    {
086        assertOrder( X_EQ_Y, "1.0-ga", "1.0.0-ga" );
087        assertOrder( X_EQ_Y, "1.0.ga", "1.0.0.ga" );
088        assertOrder( X_EQ_Y, "1.0ga", "1.0.0ga" );
089
090        assertOrder( X_EQ_Y, "1.0-alpha", "1.0.0-alpha" );
091        assertOrder( X_EQ_Y, "1.0.alpha", "1.0.0.alpha" );
092        assertOrder( X_EQ_Y, "1.0alpha", "1.0.0alpha" );
093        assertOrder( X_EQ_Y, "1.0-alpha-snapshot", "1.0.0-alpha-snapshot" );
094        assertOrder( X_EQ_Y, "1.0.alpha.snapshot", "1.0.0.alpha.snapshot" );
095
096        assertOrder( X_EQ_Y, "1.x.0-alpha", "1.x.0.0-alpha" );
097        assertOrder( X_EQ_Y, "1.x.0.alpha", "1.x.0.0.alpha" );
098        assertOrder( X_EQ_Y, "1.x.0-alpha-snapshot", "1.x.0.0-alpha-snapshot" );
099        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}