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}