1 /******************************************************************************* 2 * Copyright (c) 2009, 2010 Cloudsmith Inc. and others. 3 * 4 * This program and the accompanying materials 5 * are made available under the terms of the Eclipse Public License 2.0 6 * which accompanies this distribution, and is available at 7 * https://www.eclipse.org/legal/epl-2.0/ 8 * 9 * SPDX-License-Identifier: EPL-2.0 10 * 11 * Contributors: 12 * Cloudsmith Inc. - initial API and implementation 13 *******************************************************************************/ 14 15 package org.eclipse.equinox.p2.tests.omniVersion; 16 17 import static org.junit.Assert.assertEquals; 18 19 import org.eclipse.equinox.p2.metadata.IVersionFormat; 20 import org.eclipse.equinox.p2.metadata.Version; 21 import org.junit.Test; 22 23 /** 24 * Test common patterns: 25 * - Triplet 26 * - Mozilla 27 * - RPM 28 * - JSR277 (proposed version handling as documented Dec 30, 2008). 29 * 30 */ 31 public class CommonPatternsTest extends VersionTesting { 32 public static String TRIPLET_FORMAT_STRING = "n=0;[.n=0;[.n=0;]][dS=m;]"; 33 public static String MOZ_PREFIX = "format((<N=0;?s=m;?N=0;?s=m;?>(.<N=0;?s=m;?N=0;?s=m;?>)*)=p<0.m.0.m>;):"; 34 public static String TRIPLE_PREFIX = "format(" + TRIPLET_FORMAT_STRING + "):"; 35 public static String RPM_PREFIX = "format(<[n=0;:]a(d=[^a-zA-Z0-9@_-];?a)*>[-n[dS=!;]]):"; 36 public static String JSR277_PREFIX = "format(n(.n=0;){0,3}[-S=m;]):"; 37 38 @Test testMozillaPattern()39 public void testMozillaPattern() { 40 41 // 1.-1 42 Version v1 = Version.parseVersion(MOZ_PREFIX + "1.-1"); 43 44 // < 1 == 1. == 1.0 == 1.0.0 45 Version v2 = Version.parseVersion(MOZ_PREFIX + "1"); 46 Version v2a = Version.parseVersion(MOZ_PREFIX + "1."); 47 Version v2b = Version.parseVersion(MOZ_PREFIX + "1.0"); 48 Version v2c = Version.parseVersion(MOZ_PREFIX + "1.0.0"); 49 50 assertOrder(v1, v2); 51 assertEquals(v2, v2a); 52 assertEquals(v2a, v2b); 53 assertEquals(v2b, v2c); 54 55 // < 1.1a < 1.1aa < 1.1ab < 1.1b < 1.1c 56 Version v3 = Version.parseVersion(MOZ_PREFIX + "1.1a"); 57 Version v4 = Version.parseVersion(MOZ_PREFIX + "1.1aa"); 58 Version v5 = Version.parseVersion(MOZ_PREFIX + "1.1ab"); 59 Version v6 = Version.parseVersion(MOZ_PREFIX + "1.1b"); 60 Version v7 = Version.parseVersion(MOZ_PREFIX + "1.1c"); 61 62 assertOrder(v2c, v3); 63 assertOrder(v3, v4); 64 assertOrder(v4, v5); 65 assertOrder(v5, v6); 66 assertOrder(v6, v7); 67 68 // < 1.1pre == 1.1pre0 == 1.0+ 69 Version v8 = Version.parseVersion(MOZ_PREFIX + "1.1pre"); 70 Version v8a = Version.parseVersion(MOZ_PREFIX + "1.1pre0"); 71 72 assertOrder(v7, v8); 73 assertEquals(v8, v8a); 74 75 /* NOT SUPPORTED BY OMNI VERSION: Version v8b = Version.parseVersion(MOZ_PREFIX +"1.0+"); */ 76 77 // < 1.1pre1a < 1.1pre1aa < 1.1pre1b < 1.1pre1 78 Version v9 = Version.parseVersion(MOZ_PREFIX + "1.1pre1a"); 79 Version v10 = Version.parseVersion(MOZ_PREFIX + "1.1pre1aa"); 80 Version v11 = Version.parseVersion(MOZ_PREFIX + "1.1pre1b"); 81 Version v12 = Version.parseVersion(MOZ_PREFIX + "1.1pre1"); 82 83 assertOrder(v8a, v9); 84 assertOrder(v9, v10); 85 assertOrder(v10, v11); 86 assertOrder(v11, v12); 87 88 // < 1.1pre2 89 Version v13 = Version.parseVersion(MOZ_PREFIX + "1.1pre2"); 90 assertOrder(v12, v13); 91 92 // < 1.1pre10 93 Version v14 = Version.parseVersion(MOZ_PREFIX + "1.1pre10"); 94 assertOrder(v13, v14); 95 96 //< 1.1.-1 97 Version v15 = Version.parseVersion(MOZ_PREFIX + "1.1.-1"); 98 assertOrder(v14, v15); 99 100 // < 1.1 == 1.1.0 == 1.1.00 101 Version v16 = Version.parseVersion(MOZ_PREFIX + "1.1"); 102 Version v16a = Version.parseVersion(MOZ_PREFIX + "1.1.0"); 103 Version v16b = Version.parseVersion(MOZ_PREFIX + "1.1.00"); 104 105 assertOrder(v15, v16); 106 assertEquals(v16, v16a); 107 assertEquals(v16a, v16b); 108 109 // < 1.10 110 Version v17 = Version.parseVersion(MOZ_PREFIX + "1.10"); 111 assertOrder(v16a, v17); 112 113 // < 1.* < 1.*.1 114 /* NOT SUPPORTED BY OMNIVERSION: Version v18 = Version.parseVersion(MOZ_PREFIX +"1.1a"); */ 115 116 // < 2.0 117 Version v18 = Version.parseVersion(MOZ_PREFIX + "2.0"); 118 assertOrder(v17, v18); 119 } 120 121 @Test testMozillaPatternToString()122 public void testMozillaPatternToString() { 123 String test = MOZ_PREFIX + "1.1pre1aa"; 124 assertEquals(MOZ_PREFIX, Version.parseVersion(test).getFormat().toString() + ':'); 125 } 126 127 @Test testTripletPattern()128 public void testTripletPattern() { 129 Version v1 = Version.parseVersion(TRIPLE_PREFIX + "1"); 130 Version v1a = Version.parseVersion(TRIPLE_PREFIX + "1.0"); 131 Version v1b = Version.parseVersion(TRIPLE_PREFIX + "1.0.0"); 132 assertEquals(v1, v1a); 133 assertEquals(v1a, v1b); 134 135 Version v2 = Version.parseVersion(TRIPLE_PREFIX + "1.0.0.a"); 136 assertOrder(v2, v1); // yes 1.0.0.a is OLDER 137 138 Version v3 = Version.parseVersion(TRIPLE_PREFIX + "1.1"); 139 assertOrder(v1b, v3); 140 141 Version v4 = Version.parseVersion(TRIPLE_PREFIX + "1.1.0.a"); 142 assertOrder(v4, v3); // yes 1.1.0.a is OLDER 143 144 Version v5 = Version.parseVersion(TRIPLE_PREFIX + "2"); 145 assertOrder(v3, v5); 146 147 Version v6 = Version.parseVersion(TRIPLE_PREFIX + "1.1-FC1"); 148 assertOrder(v6, v3); 149 } 150 151 @Test testTripletPatternToString()152 public void testTripletPatternToString() { 153 String test = TRIPLE_PREFIX + "1.0-FC1"; 154 assertEquals(TRIPLE_PREFIX, Version.parseVersion(test).getFormat().toString() + ':'); 155 } 156 157 @Test testTripletPatternToOSGi()158 public void testTripletPatternToOSGi() throws Exception { 159 IVersionFormat triplet = Version.compile(TRIPLET_FORMAT_STRING); 160 assertEquals(Version.createOSGi(1, 0, 0), triplet.parse("1.0.0." + IVersionFormat.DEFAULT_MIN_STRING_TRANSLATION)); 161 assertEquals(Version.create("1.0.0." + IVersionFormat.DEFAULT_MAX_STRING_TRANSLATION), triplet.parse("1.0.0")); 162 assertEquals(Version.createOSGi(1, 0, 0, IVersionFormat.DEFAULT_MAX_STRING_TRANSLATION), Version.create("raw:1.0.0.m")); 163 assertEquals(triplet.parse("1.0"), Version.create("raw:1.0.0.m")); 164 assertEquals(triplet.parse("1.0." + IVersionFormat.DEFAULT_MIN_STRING_TRANSLATION), Version.create("raw:1.0.0.''")); 165 assertEquals(Version.createOSGi(1, 0, 0), Version.create("raw:1.0.0.''")); 166 } 167 168 @Test testMinTranslation()169 public void testMinTranslation() throws Exception { 170 IVersionFormat format = Version.compile("n=0;[.n=0;[.n=0;]][dS=m{!};]"); 171 assertEquals(Version.create("raw:1.0.0.''"), format.parse("1.0.0.!")); 172 } 173 174 @Test testMaxTranslation()175 public void testMaxTranslation() throws Exception { 176 IVersionFormat format = Version.compile("n=0;[.n=0;[.n=0;]][dS=''{~,4};]"); 177 assertEquals(Version.create("raw:1.0.0.m"), format.parse("1.0.0.~~~~")); 178 } 179 180 // TODO: Not clear what a missing RPM EPOCH (i.e. first '.n:' should be interpreted as 181 @Test testRPMPattern()182 public void testRPMPattern() { 183 Version v1 = Version.parseVersion(RPM_PREFIX + "33:1.2.3a-23/i386"); 184 assertEquals(Version.parseVersion("raw:<33.1.2.3.'a'>.23"), v1); 185 Version v2 = Version.parseVersion(RPM_PREFIX + "34:1"); 186 assertOrder(v1, v2); 187 188 Version v3 = Version.parseVersion(RPM_PREFIX + "33:1.2.3b"); 189 assertOrder(v1, v3); 190 Version v11 = Version.parseVersion(RPM_PREFIX + "1-1"); 191 Version v12 = Version.parseVersion(RPM_PREFIX + "1-2"); 192 Version v13 = Version.parseVersion(RPM_PREFIX + "1.0"); 193 Version v14 = Version.parseVersion(RPM_PREFIX + "1.1"); 194 assertOrder(v11, v12); 195 assertOrder(v12, v13); 196 197 assertOrder(v11, v13); 198 assertOrder(v12, v13); 199 200 assertOrder(v11, v14); 201 assertOrder(v12, v14); 202 assertOrder(v13, v14); 203 } 204 205 @Test testRPMPatternToString()206 public void testRPMPatternToString() { 207 String test = RPM_PREFIX + "33:1.2.3a-23/i386"; 208 assertEquals(RPM_PREFIX, Version.parseVersion(test).getFormat().toString() + ':'); 209 } 210 211 /** 212 * JSR277 works like triplet, but has 4 elements. The last qualifier can be used without specifying the preceding 213 * three segments. 214 */ 215 @Test testJsr277Pattern()216 public void testJsr277Pattern() { 217 Version v1 = Version.parseVersion(JSR277_PREFIX + "1"); 218 Version v1a = Version.parseVersion(JSR277_PREFIX + "1.0"); 219 Version v1b = Version.parseVersion(JSR277_PREFIX + "1.0.0"); 220 Version v1c = Version.parseVersion(JSR277_PREFIX + "1.0.0.0"); 221 assertEquals(v1, v1a); 222 assertEquals(v1a, v1b); 223 assertEquals(v1b, v1c); 224 225 Version v2 = Version.parseVersion(JSR277_PREFIX + "1-a"); 226 Version v2a = Version.parseVersion(JSR277_PREFIX + "1.0-a"); 227 Version v2b = Version.parseVersion(JSR277_PREFIX + "1.0.0-a"); 228 Version v2c = Version.parseVersion(JSR277_PREFIX + "1.0.0.0-a"); 229 assertOrder(v2, v1); // yes 1.0.0.a is OLDER 230 assertEquals(v2, v2a); 231 assertEquals(v2a, v2b); 232 assertEquals(v2b, v2c); 233 234 Version v3 = Version.parseVersion(JSR277_PREFIX + "1.1"); 235 assertOrder(v1b, v3); 236 237 Version v4 = Version.parseVersion(JSR277_PREFIX + "1.1.0-a"); 238 assertOrder(v4, v3); // yes 1.1.0.a is OLDER 239 240 Version v5 = Version.parseVersion(JSR277_PREFIX + "2"); 241 assertOrder(v3, v5); 242 } 243 244 @Test testJsr277PatternToString()245 public void testJsr277PatternToString() { 246 String test = JSR277_PREFIX + "1.0.0.0-a"; 247 assertEquals(JSR277_PREFIX, Version.parseVersion(test).getFormat().toString() + ':'); 248 } 249 } 250