1 //
2 // VersionTest.cs - NUnit Test Cases for the System.Version class
3 //
4 // Authors:
5 //	Duco Fijma (duco@lorentz.xs4all.nl)
6 //	Sebastien Pouliot  <sebastien@ximian.com>
7 //
8 //   (C) 2002 Duco Fijma
9 // Copyright (C) 2006 Novell, Inc (http://www.novell.com)
10 //
11 
12 using System;
13 
14 using NUnit.Framework;
15 
16 namespace MonoTests.System
17 {
18 	[TestFixture]
19 	public class VersionTest
20 	{
21 		[Test]
TestCtors()22 		public void TestCtors ()
23 		{
24 			Version v1 = new Version ();
25 			Assert.AreEqual (0, v1.Major, "#A1");
26 			Assert.AreEqual (0, v1.Minor, "#A2");
27 			Assert.AreEqual (-1, v1.Build, "#A3");
28 			Assert.AreEqual (-1, v1.Revision, "#A4");
29 
30 			v1 = new Version (23, 7);
31 			Assert.AreEqual (23, v1.Major, "#B1");
32 			Assert.AreEqual (7, v1.Minor, "#B2");
33 			Assert.AreEqual (-1, v1.Build, "#B3");
34 			Assert.AreEqual (-1, v1.Revision, "#B4");
35 
36 			v1 = new Version (23, 7, 99);
37 			Assert.AreEqual (23, v1.Major, "#C1");
38 			Assert.AreEqual (7, v1.Minor, "#C2");
39 			Assert.AreEqual (99, v1.Build, "#C3");
40 			Assert.AreEqual (-1, v1.Revision, "#C4");
41 
42 			v1 = new Version (23, 7, 99, 42);
43 			Assert.AreEqual (23, v1.Major, "#D1");
44 			Assert.AreEqual (7, v1.Minor, "#D2");
45 			Assert.AreEqual (99, v1.Build, "#D3");
46 			Assert.AreEqual (42, v1.Revision, "#D4");
47 
48 			try {
49 				v1 = new Version (23, -1);
50 				Assert.Fail ("#E");
51 			} catch (ArgumentOutOfRangeException) {
52 			}
53 
54 			try {
55 				v1 = new Version (23, 7, -1);
56 				Assert.Fail ("#F");
57 			} catch (ArgumentOutOfRangeException) {
58 			}
59 
60 			try {
61 				v1 = new Version (23, 7, 99, -1);
62 				Assert.Fail ("#G");
63 			} catch (ArgumentOutOfRangeException) {
64 			}
65 		}
66 
67 		[Test]
TestStringCtor()68 		public void TestStringCtor ()
69 		{
70 			Version v1 = new Version ("1.42");
71 			Assert.AreEqual (1, v1.Major, "#A1");
72 			Assert.AreEqual (42, v1.Minor, "#A2");
73 			Assert.AreEqual (-1, v1.Build, "#A3");
74 			Assert.AreEqual (-1, v1.Revision, "#A4");
75 
76 			v1 = new Version ("1.42.79");
77 			Assert.AreEqual (1, v1.Major, "#B1");
78 			Assert.AreEqual (42, v1.Minor, "#B2");
79 			Assert.AreEqual (79, v1.Build, "#B3");
80 			Assert.AreEqual (-1, v1.Revision, "#B4");
81 
82 			v1 = new Version ("1.42.79.66");
83 			Assert.AreEqual (1, v1.Major, "#C1");
84 			Assert.AreEqual (42, v1.Minor, "#C2");
85 			Assert.AreEqual (79, v1.Build, "#C3");
86 			Assert.AreEqual (66, v1.Revision, "#C4");
87 
88 			try {
89 				v1 = new Version ("1.42.-79");
90 				Assert.Fail ("#D");
91 			} catch (ArgumentOutOfRangeException) {
92 			}
93 
94 			try {
95 				v1 = new Version ("1");
96 				Assert.Fail ("#E");
97 			} catch (ArgumentException) {
98 			}
99 
100 			try {
101 				v1 = new Version ("1.2.3.4.5");
102 				Assert.Fail ("#F");
103 			} catch (ArgumentException) {
104 			}
105 
106 			try {
107 				v1 = new Version ((string) null);
108 				Assert.Fail ("#G");
109 			} catch (ArgumentNullException) {
110 			}
111 		}
112 
113 		[Test]
TestClone()114 		public void TestClone ()
115 		{
116 			Version v1 = new Version (1, 2, 3, 4);
117 			Version v2 = (Version) v1.Clone ();
118 
119 			Assert.IsTrue (v1.Equals (v2), "#A1");
120 			Assert.IsFalse (object.ReferenceEquals (v1, v2), "#A2");
121 
122 			Version v3 = new Version (); // 0.0
123 			v2 = (Version) v3.Clone ();
124 
125 			Assert.IsTrue (v3.Equals (v2), "#B1");
126 			Assert.IsFalse (object.ReferenceEquals (v3, v2), "#B2");
127 		}
128 
129 		[Test]
TestCompareTo()130 		public void TestCompareTo ()
131 		{
132 			Assert.AreEqual (1, new Version (1, 2).CompareTo (new Version (1, 1)), "#A1");
133 			Assert.AreEqual (-1, new Version (1, 2, 3).CompareTo (new Version (2, 2, 3)), "#A2");
134 			Assert.AreEqual (1, new Version (1, 2, 3, 4).CompareTo (new Version (1, 2, 2, 1)), "#A3");
135 			Assert.AreEqual (1, new Version (1, 3).CompareTo (new Version (1, 2, 2, 1)), "#A4");
136 			Assert.AreEqual (-1, new Version (1, 2, 2).CompareTo (new Version (1, 2, 2, 1)), "#A5");
137 			Assert.AreEqual (0, new Version (1, 2).CompareTo (new Version (1, 2)), "#A6");
138 			Assert.AreEqual (0, new Version (1, 2, 3).CompareTo (new Version (1, 2, 3)), "#A7");
139 			Assert.IsTrue (new Version (1, 1) < new Version (1, 2), "#A8");
140 			Assert.IsTrue (new Version (1, 2) <= new Version (1, 2), "#A9");
141 			Assert.IsTrue (new Version (1, 2) <= new Version (1, 3), "#A10");
142 			Assert.IsTrue (new Version (1, 2) >= new Version (1, 2), "#A11");
143 			Assert.IsTrue (new Version (1, 3) >= new Version (1, 2), "#A12");
144 			Assert.IsTrue (new Version (1, 3) > new Version (1, 2), "#A13");
145 
146 			Version v1 = new Version(1, 2);
147 			bool exception;
148 
149 			Assert.AreEqual (1, v1.CompareTo (null), "#B");
150 
151 			try {
152 				v1.CompareTo ("A string is not a version");
153 				Assert.Fail ("#C");
154 			} catch (ArgumentException) {
155 			}
156 		}
157 
158 		[Test]
TestEquals()159 		public void TestEquals ()
160 		{
161 			Version v1 = new Version (1, 2);
162 			Version v2 = new Version (1, 2, 3, 4);
163 			Version v3 = new Version (1, 2, 3, 4);
164 
165 			Assert.IsTrue (v2.Equals (v3), "#A1");
166 			Assert.IsTrue (v2.Equals (v2), "#A2");
167 			Assert.IsFalse (v1.Equals (v3), "#A3");
168 
169 			Assert.IsTrue (v2 == v3, "#B1");
170 #pragma warning disable 1718
171 			Assert.IsTrue (v2 == v2, "#B2");
172 #pragma warning restore 1718
173 			Assert.IsFalse (v1 == v3, "#B3");
174 
175 			Assert.IsFalse (v2.Equals ((Version) null), "#C1");
176 			Assert.IsFalse (v2.Equals ("A string"), "#C2");
177 		}
178 
179 		[Test]
TestToString()180 		public void TestToString ()
181 		{
182 			Version v1 = new Version (1,2);
183 			Version v2 = new Version (1,2,3);
184 			Version v3 = new Version (1,2,3,4);
185 
186 			Assert.AreEqual ("1.2", v1.ToString (), "#A1");
187 			Assert.AreEqual ("1.2.3", v2.ToString (), "#A2");
188 			Assert.AreEqual ("1.2.3.4", v3.ToString (), "#A3");
189 			Assert.AreEqual (string.Empty, v3.ToString (0), "#A4");
190 			Assert.AreEqual ("1", v3.ToString (1), "#A5");
191 			Assert.AreEqual ("1.2", v3.ToString (2), "#A6");
192 			Assert.AreEqual ("1.2.3", v3.ToString (3), "#A7");
193 			Assert.AreEqual ("1.2.3.4", v3.ToString (4), "#A8");
194 
195 			try {
196 				v2.ToString (4);
197 				Assert.Fail ("#B");
198 			} catch (ArgumentException) {
199 			}
200 
201 			try {
202 				v3.ToString (42);
203 				Assert.Fail ("#C");
204 			} catch (ArgumentException) {
205 			}
206 		}
207 
208 		[Test]
HashCode()209 		public void HashCode ()
210 		{
211 			Version v1 = new Version ("1.2.3.4");
212 			Version v2 = new Version (1, 2, 3, 4);
213 			Assert.AreEqual (v1.GetHashCode (), v2.GetHashCode (), "HashCode");
214 		}
215 		[Test]
MajorMinorRevisions()216 		public void MajorMinorRevisions ()
217 		{
218 			Version v = new Version ();
219 			Assert.AreEqual (-1, v.MajorRevision, "MajorRevision/Empty");
220 			Assert.AreEqual (-1, v.MinorRevision, "MinorRevision/Empty");
221 			v = new Version ("1.2.3.4");
222 			Assert.AreEqual (0, v.MajorRevision, "MajorRevision/string");
223 			Assert.AreEqual (4, v.MinorRevision, "MinorRevision/string");
224 			v = new Version (1, 2);
225 			Assert.AreEqual (-1, v.MajorRevision, "MajorRevision/int,int");
226 			Assert.AreEqual (-1, v.MinorRevision, "MinorRevision/int,int");
227 			v = new Version (10, 20, 30);
228 			Assert.AreEqual (-1, v.MajorRevision, "MajorRevision/int,int,int");
229 			Assert.AreEqual (-1, v.MinorRevision, "MinorRevision/int,int,int");
230 			v = new Version (100, 200, 300, 400);
231 			Assert.AreEqual (0, v.MajorRevision, "MajorRevision/int,int,int,int");
232 			Assert.AreEqual (400, v.MinorRevision, "MinorRevision/int,int,int,int");
233 			v = new Version (100, 200, 300, (256 << 16) | 384);
234 			Assert.AreEqual (256, v.MajorRevision, "MajorRevision/int,int,int,bint");
235 			Assert.AreEqual (384, v.MinorRevision, "MinorRevision/int,int,int,bint");
236 		}
237 
238 		[Test]
CompareTo()239 		public void CompareTo ()
240 		{
241 			Version v1234 = new Version (1, 2, 3, 4);
242 			Version vnull = null;
243 			Assert.AreEqual (1, v1234.CompareTo (vnull), "1234-null");
244 			Version v2234 = new Version (2, 2, 3, 4);
245 			Assert.AreEqual (1, v2234.CompareTo (v1234), "2234-1234");
246 			Version v1224 = new Version (1, 2, 2, 4);
247 			Assert.AreEqual (-1, v1224.CompareTo (v1234), "1224-1234");
248 			Version v1235 = new Version (1, 2, 3, 5);
249 			Assert.AreEqual (1, v1235.CompareTo (v1234), "1235-1234");
250 		}
251 
252 		[Test]
Parse()253 		public void Parse ()
254 		{
255 			Assert.AreEqual (new Version (1, 7), Version.Parse ("1.7"), "#A1");
256 			Assert.AreEqual (new Version (1, 7, 3), Version.Parse ("1.7.3"), "#A2");
257 			Assert.AreEqual (new Version (1, 7, 3, 4001), Version.Parse ("1.7.3.4001"), "#A3");
258 			Assert.AreEqual (new Version (2, 9), Version.Parse ("  2.9  "), "#A4");
259 			Assert.AreEqual (new Version (2, 9, 3), Version.Parse ("2. 9. 3"), "#A5");
260 
261 			try {
262 				Version.Parse (null);
263 				Assert.Fail ("#EXC1");
264 			} catch (ArgumentNullException) {
265 			}
266 
267 			try {
268 				Version.Parse ("1");
269 				Assert.Fail ("#EXC2");
270 			} catch (ArgumentException) {
271 			}
272 
273 			try {
274 				Version.Parse ("1.4.7.8.9");
275 				Assert.Fail ("#EXC3");
276 			} catch (ArgumentException) {
277 			}
278 
279 			try {
280 				Version.Parse ("1.2.a.7");
281 				Assert.Fail ("#EXC4");
282 			} catch (FormatException) {
283 			}
284 
285 			try {
286 				Version.Parse ("1.2.");
287 				Assert.Fail ("#EXC5");
288 			} catch (FormatException) {
289 			}
290 
291 			try {
292 				Version.Parse ("1.2.0." + ((long)Int32.MaxValue + 1).ToString ());
293 				Assert.Fail ("#EXC6");
294 			} catch (OverflowException) {
295 			}
296 
297 			try {
298 				Version.Parse ("1.3.-6.0");
299 				Assert.Fail ("#EXC7");
300 			} catch (ArgumentOutOfRangeException) {
301 			}
302 		}
303 
304 		[Test]
TryParse()305 		public void TryParse ()
306 		{
307 			Version result;
308 			bool success;
309 
310 			success = Version.TryParse ("1.7", out result);
311 			Assert.AreEqual (new Version (1, 7), result, "#A1");
312 			Assert.AreEqual (true, success, "#A2");
313 
314 			success = Version.TryParse ("1.7.3", out result);
315 			Assert.AreEqual (new Version (1, 7, 3), result, "#B1");
316 			Assert.AreEqual (true, success, "#B2");
317 
318 			success = Version.TryParse ("1.7.0.4001", out result);
319 			Assert.AreEqual (new Version (1, 7, 0, 4001), result, "#C1");
320 			Assert.AreEqual (true, success, "#C2");
321 
322 			success = Version.TryParse ("  2.9  ", out result);
323 			Assert.AreEqual (new Version (2, 9), result, "#D1");
324 			Assert.AreEqual (true, success, "#D2");
325 
326 			success = Version.TryParse ("2. 9. 3", out result);
327 			Assert.AreEqual (new Version (2, 9, 3), result, "#E1");
328 			Assert.AreEqual (true, success, "#E2");
329 
330 			//
331 			// Errors
332 			//
333 			success = Version.TryParse (null, out result);
334 			Assert.AreEqual (null, result, "#F1");
335 			Assert.AreEqual (false, success, "#F2");
336 
337 			success = Version.TryParse ("1", out result);
338 			Assert.AreEqual (null, result, "#G1");
339 			Assert.AreEqual (false, success, "#G2");
340 
341 			success = Version.TryParse ("1.4.7.8.9", out result);
342 			Assert.AreEqual (null, result, "#H1");
343 			Assert.AreEqual (false, success, "#H2");
344 
345 			success = Version.TryParse ("1.2.a.7", out result);
346 			Assert.AreEqual (null, result, "#I1");
347 			Assert.AreEqual (false, success, "#I2");
348 
349 			success = Version.TryParse ("1.2.", out result);
350 			Assert.AreEqual (null, result, "#J1");
351 			Assert.AreEqual (false, success, "#J2");
352 
353 			success = Version.TryParse ("1.2.0." + ((long)Int32.MaxValue + 1).ToString (), out result);
354 			Assert.AreEqual (null, result, "#K1");
355 			Assert.AreEqual (false, success, "#K2");
356 
357 			success = Version.TryParse ("1.-6", out result);
358 			Assert.AreEqual (null, result, "#L1");
359 			Assert.AreEqual (false, success, "#L2");
360 		}
361 	}
362 }
363