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