1 // CharTest.cs - NUnit Test Cases for the System.Char struct
3 // David Brandt (bucky@keystreams.com)
5 // (C) Ximian, Inc. http://www.ximian.com
6 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
11 using System.Globalization;
13 namespace MonoTests.System
19 public void TestCompareTo()
24 Assert.IsTrue(c1.CompareTo(c2) == -1, "Less than");
25 Assert.IsTrue(c2.CompareTo(c1) == 1, "Greater than");
26 Assert.IsTrue(c2.CompareTo(c3) == 0, "Equal 1");
27 Assert.IsTrue(c1.CompareTo(c1) == 0, "Equal 2");
31 public void TestEquals()
36 Assert.IsTrue(c1.Equals(c1), "Same");
37 Assert.IsTrue(c2.Equals(c3), "Same value");
38 Assert.IsTrue(!c1.Equals(c2), "Not same");
42 public void TestGetHashValue()
45 Assert.AreEqual(c1.GetHashCode(), c1.GetHashCode(), "deterministic hash code ");
46 // TODO - the spec doesn't say what algorithm is used to get hash codes. So far, just a weak test for determinism and mostly-uniqueness.
50 public void TestGetNumericValue()
54 Assert.AreEqual(-1.0, Char.GetNumericValue(c1), 0.1, "code 1");
55 Assert.AreEqual(3.0, Char.GetNumericValue(c2), 0.1, "code 2");
58 Assert.AreEqual(-1.0, Char.GetNumericValue(s1, 0), 0.1, "space not number");
59 Assert.AreEqual(3.0, Char.GetNumericValue(s1, 1), 0.1, "space not number");
60 Assert.AreEqual(-1.0, Char.GetNumericValue(s1, 2), 0.1, "space not number");
64 public void TestGetUnicodeCategory()
70 Assert.AreEqual(UnicodeCategory.ClosePunctuation,
71 Char.GetUnicodeCategory(Pe1),
73 Assert.AreEqual(UnicodeCategory.ClosePunctuation,
74 Char.GetUnicodeCategory(Pe2),
76 Assert.AreEqual(UnicodeCategory.ClosePunctuation,
77 Char.GetUnicodeCategory(Pe3),
80 // TODO - ConnectorPunctuation
82 char c1 = (char)0; // 0000-001F, 007F-009F
83 char c2 = (char)0x001F;
84 char c3 = (char)0x007F;
85 char c4 = (char)0x00F;
86 Assert.AreEqual(UnicodeCategory.Control,
87 Char.GetUnicodeCategory(c1),
89 Assert.AreEqual(UnicodeCategory.Control,
90 Char.GetUnicodeCategory(c2),
92 Assert.AreEqual(UnicodeCategory.Control,
93 Char.GetUnicodeCategory(c3),
95 Assert.AreEqual(UnicodeCategory.Control,
96 Char.GetUnicodeCategory(c4),
100 // TODO - more currencies?
103 UnicodeCategory.CurrencySymbol,
104 Char.GetUnicodeCategory(c1),
109 Assert.AreEqual(UnicodeCategory.DashPunctuation,
110 Char.GetUnicodeCategory(c1),
116 Assert.AreEqual(UnicodeCategory.DecimalDigitNumber,
117 Char.GetUnicodeCategory(c1),
119 Assert.AreEqual(UnicodeCategory.DecimalDigitNumber,
120 Char.GetUnicodeCategory(c2),
123 // TODO - EnclosingMark
124 // TODO - FinalQuotePunctuation
126 // TODO - InitialQuotePunctuation
127 // TODO - LetterNumber
128 // TODO - LineSeparator (not '\n', that's a control char)
132 Assert.AreEqual(UnicodeCategory.LowercaseLetter,
133 Char.GetUnicodeCategory(c1),
135 Assert.AreEqual(UnicodeCategory.LowercaseLetter,
136 Char.GetUnicodeCategory(c2),
142 Assert.AreEqual(UnicodeCategory.MathSymbol,
143 Char.GetUnicodeCategory(c1),
145 Assert.AreEqual(UnicodeCategory.MathSymbol,
146 Char.GetUnicodeCategory(c2),
149 // TODO - ModifierSymbol
150 // TODO - NonSpacingMark
151 // TODO - OpenPunctuation
156 Assert.AreEqual(UnicodeCategory.OpenPunctuation,
157 Char.GetUnicodeCategory(c1),
159 Assert.AreEqual(UnicodeCategory.OpenPunctuation,
160 Char.GetUnicodeCategory(c2),
162 Assert.AreEqual(UnicodeCategory.OpenPunctuation,
163 Char.GetUnicodeCategory(c3),
166 // TODO - OtherLetter
167 // TODO - OtherNotAssigned
168 // TODO - OtherNumber
171 Assert.AreEqual(UnicodeCategory.OtherPunctuation,
172 Char.GetUnicodeCategory(c1),
175 // TODO - OtherSymbol
176 // TODO - ParagraphSeparator
180 Assert.AreEqual(UnicodeCategory.SpaceSeparator,
181 Char.GetUnicodeCategory(c1),
184 // TODO - SpacingCombiningMark
186 char c1 = (char)0xD800; // D800-DBFF
187 char c2 = (char)0xDBFF; // D800-DBFF
188 char c3 = (char)0xDC01; // DC00-DEFF
189 char c4 = (char)0xDEFF; // DC00-DEFF
190 Assert.AreEqual(UnicodeCategory.Surrogate,
191 Char.GetUnicodeCategory(c1),
193 Assert.AreEqual(UnicodeCategory.Surrogate,
194 Char.GetUnicodeCategory(c2),
196 Assert.AreEqual(UnicodeCategory.Surrogate,
197 Char.GetUnicodeCategory(c3),
199 Assert.AreEqual(UnicodeCategory.Surrogate,
200 Char.GetUnicodeCategory(c4),
203 // TODO - TitlecaseLetter
204 // TODO - UppercaseLetter
208 Assert.AreEqual(UnicodeCategory.UppercaseLetter,
209 Char.GetUnicodeCategory(c1),
211 Assert.AreEqual(UnicodeCategory.UppercaseLetter,
212 Char.GetUnicodeCategory(c2),
218 public void TestIsControl()
220 // control is 0000-001F, 007F-009F
222 char c2 = (char)0x001F;
223 char c3 = (char)0x007F;
224 char c4 = (char)0x009F;
225 Assert.IsTrue(!Char.IsControl(' '), "Not control");
226 Assert.IsTrue(Char.IsControl(c1), "control");
227 Assert.IsTrue(Char.IsControl(c2), "control");
228 Assert.IsTrue(Char.IsControl(c3), "control");
229 Assert.IsTrue(Char.IsControl(c4), "control");
231 string s1 = " " + c1 + c2 + c3 + c4;
232 Assert.IsTrue(!Char.IsControl(s1, 0), "Not control");
233 Assert.IsTrue(Char.IsControl(s1, 1), "control");
234 Assert.IsTrue(Char.IsControl(s1, 2), "control");
235 Assert.IsTrue(Char.IsControl(s1, 3), "control");
236 Assert.IsTrue(Char.IsControl(s1, 4), "control");
240 public void TestIsDigit()
244 Assert.IsTrue(!Char.IsDigit(' '), "Not digit");
245 Assert.IsTrue(Char.IsDigit(c1), "digit");
246 Assert.IsTrue(Char.IsDigit(c2), "digit");
248 string s1 = " " + c1 + c2;
249 Assert.IsTrue(!Char.IsDigit(s1, 0), "Not digit");
250 Assert.IsTrue(Char.IsDigit(s1, 1), "digit");
251 Assert.IsTrue(Char.IsDigit(s1, 2), "digit");
255 public void TestIsLetter()
261 Assert.IsTrue(!Char.IsLetter(' '), "Not letter");
262 Assert.IsTrue(Char.IsLetter(c1), "letter");
263 Assert.IsTrue(Char.IsLetter(c2), "letter");
264 Assert.IsTrue(Char.IsLetter(c3), "letter");
265 Assert.IsTrue(Char.IsLetter(c4), "letter");
267 string s1 = " " + c1 + c2 + c3 + c4;
268 Assert.IsTrue(!Char.IsLetter(s1, 0), "Not letter");
269 Assert.IsTrue(Char.IsLetter(s1, 1), "letter");
270 Assert.IsTrue(Char.IsLetter(s1, 2), "letter");
271 Assert.IsTrue(Char.IsLetter(s1, 3), "letter");
272 Assert.IsTrue(Char.IsLetter(s1, 4), "letter");
276 public void TestIsLetterOrDigit()
284 Assert.IsTrue(!Char.IsLetterOrDigit(' '), "Not letterordigit");
285 Assert.IsTrue(Char.IsLetterOrDigit(c1), "letterordigit");
286 Assert.IsTrue(Char.IsLetterOrDigit(c2), "letterordigit");
287 Assert.IsTrue(Char.IsLetterOrDigit(c3), "letterordigit");
288 Assert.IsTrue(Char.IsLetterOrDigit(c4), "letterordigit");
289 Assert.IsTrue(Char.IsLetterOrDigit(c5), "letterordigit");
290 Assert.IsTrue(Char.IsLetterOrDigit(c6), "letterordigit");
292 string s1 = " " + c1 + c2 + c3 + c4 + c5 + c6;
293 Assert.IsTrue(!Char.IsLetterOrDigit(s1, 0), "Not letterordigit");
294 Assert.IsTrue(Char.IsLetterOrDigit(s1, 1), "letterordigit");
295 Assert.IsTrue(Char.IsLetterOrDigit(s1, 2), "letterordigit");
296 Assert.IsTrue(Char.IsLetterOrDigit(s1, 3), "letterordigit");
297 Assert.IsTrue(Char.IsLetterOrDigit(s1, 4), "letterordigit");
298 Assert.IsTrue(Char.IsLetterOrDigit(s1, 5), "letterordigit");
299 Assert.IsTrue(Char.IsLetterOrDigit(s1, 6), "letterordigit");
303 public void TestIsLower()
307 Assert.IsTrue(!Char.IsLower(' '), "Not lower");
308 Assert.IsTrue(Char.IsLower(c1), "lower");
309 Assert.IsTrue(Char.IsLower(c2), "lower");
311 string s1 = " " + c1 + c2;
312 Assert.IsTrue(!Char.IsLower(s1, 0), "Not lower");
313 Assert.IsTrue(Char.IsLower(s1, 1), "lower");
314 Assert.IsTrue(Char.IsLower(s1, 2), "lower");
318 public void TestIsNumber()
322 // TODO - IsNumber of less obvious characters
324 Assert.IsTrue(!Char.IsNumber(' '), "Not number");
325 Assert.IsTrue(Char.IsNumber(c1), "number");
326 Assert.IsTrue(Char.IsNumber(c2), "number");
328 string s1 = " " + c1 + c2;
329 Assert.IsTrue(!Char.IsNumber(s1, 0), "Not number");
330 Assert.IsTrue(Char.IsNumber(s1, 1), "number");
331 Assert.IsTrue(Char.IsNumber(s1, 2), "number");
335 public void TestIsPunctuation()
339 Assert.IsTrue(!Char.IsPunctuation(' '), "Not punctuation");
340 Assert.IsTrue(Char.IsPunctuation(c1), "punctuation");
341 Assert.IsTrue(Char.IsPunctuation(c2), "punctuation");
343 string s1 = " " + c1 + c2;
344 Assert.IsTrue(!Char.IsPunctuation(s1, 0), "Not punctuation");
345 Assert.IsTrue(Char.IsPunctuation(s1, 1), "punctuation");
346 Assert.IsTrue(Char.IsPunctuation(s1, 2), "punctuation");
350 public void TestIsSeparator()
354 Assert.IsTrue(!Char.IsSeparator('.'), "Not separator");
355 Assert.IsTrue(Char.IsSeparator(c1), "separator1");
357 string s1 = "." + c1;
358 Assert.IsTrue(!Char.IsSeparator(s1, 0), "Not separator");
359 Assert.IsTrue(Char.IsSeparator(s1, 1), "separator1-2");
363 public void TestIsSurrogate()
365 // high surrogate - D800-DBFF
366 // low surrogate - DC00-DEFF
367 char c1 = (char)0xD800;
368 char c2 = (char)0xDBFF;
369 char c3 = (char)0xDC00;
370 char c4 = (char)0xDEFF;
371 Assert.IsTrue(!Char.IsSurrogate(' '), "Not surrogate");
372 Assert.IsTrue(Char.IsSurrogate(c1), "surrogate1");
373 Assert.IsTrue(Char.IsSurrogate(c2), "surrogate2");
374 Assert.IsTrue(Char.IsSurrogate(c3), "surrogate3");
375 Assert.IsTrue(Char.IsSurrogate(c4), "surrogate4");
377 string s1 = " " + c1 + c2 + c3 + c4;
378 Assert.IsTrue(!Char.IsSurrogate(s1, 0), "Not surrogate");
379 Assert.IsTrue(Char.IsSurrogate(s1, 1), "surrogate1-2");
380 Assert.IsTrue(Char.IsSurrogate(s1, 2), "surrogate2-2");
381 Assert.IsTrue(Char.IsSurrogate(s1, 3), "surrogate3-2");
382 Assert.IsTrue(Char.IsSurrogate(s1, 4), "surrogate4-2");
386 public void TestIsSymbol()
390 Assert.IsTrue(!Char.IsSymbol(' '), "Not symbol");
391 Assert.IsTrue(Char.IsSymbol(c1), "symbol");
392 Assert.IsTrue(Char.IsSymbol(c2), "symbol");
394 string s1 = " " + c1 + c2;
395 Assert.IsTrue(!Char.IsSymbol(s1, 0), "Not symbol");
396 Assert.IsTrue(Char.IsSymbol(s1, 1), "symbol");
397 Assert.IsTrue(Char.IsSymbol(s1, 2), "symbol");
401 public void TestIsUpper()
405 Assert.IsTrue(!Char.IsUpper('a'), "Not upper");
406 Assert.IsTrue(Char.IsUpper(c1), "upper");
407 Assert.IsTrue(Char.IsUpper(c2), "upper");
409 string s1 = "a" + c1 + c2;
410 Assert.IsTrue(!Char.IsUpper(s1, 0), "Not upper");
411 Assert.IsTrue(Char.IsUpper(s1, 1), "upper");
412 Assert.IsTrue(Char.IsUpper(s1, 2), "upper");
416 public void TestIsWhiteSpace()
422 Assert.IsTrue(!Char.IsWhiteSpace('.'), "Not whitespace");
423 Assert.IsTrue(Char.IsWhiteSpace(c1), "whitespace1");
424 Assert.IsTrue(Char.IsWhiteSpace(c2), "whitespace2");
425 Assert.IsTrue(Char.IsWhiteSpace(c3), "whitespace3");
427 string s1 = "." + c1 + c2 + c3;
428 Assert.IsTrue(!Char.IsWhiteSpace(s1, 0), "Not whitespace");
429 Assert.IsTrue(Char.IsWhiteSpace(s1, 1), "whitespace1-2");
430 Assert.IsTrue(Char.IsWhiteSpace(s1, 2), "whitespace2-2");
431 Assert.IsTrue(Char.IsWhiteSpace(s1, 3), "whitespace3-2");
435 public void IsWhiteSpace_Complete ()
437 for (int i=0; i < UInt16.MaxValue; i++) {
438 Char c = Convert.ToChar (i);
468 Assert.IsTrue (Char.IsWhiteSpace (c), i.ToString ());
471 Assert.IsTrue (!Char.IsWhiteSpace (c), i.ToString ());
478 public void TestParse()
482 Assert.IsTrue(c1.Equals(Char.Parse(s1)));
487 public void TestTryParseValid ()
493 Assert.AreEqual (true, Char.TryParse (s1, out c2), "TryParse1");
494 Assert.AreEqual (c2, c1, "TryParse2");
498 public void TestTryParseInvalid ()
502 Assert.AreEqual (false, Char.TryParse (s, out c), "TryParse3");
503 Assert.AreEqual ('\0', c, "TryParse4");
508 public void TestToLower()
522 Assert.AreEqual(b1, Char.ToLower(a1), "char lowered");
523 Assert.AreEqual(b2, Char.ToLower(a2), "char lowered");
524 Assert.AreEqual(b3, Char.ToLower(a3), "char lowered");
525 Assert.AreEqual(b4, Char.ToLower(a4), "char lowered");
526 Assert.AreEqual(b5, Char.ToLower(a5), "char lowered");
527 Assert.AreEqual(b6, Char.ToLower(a6), "char lowered");
531 public void TestToUpper()
545 Assert.AreEqual(b1, Char.ToUpper(a1), "char uppered");
546 Assert.AreEqual(b2, Char.ToUpper(a2), "char uppered");
547 Assert.AreEqual(b3, Char.ToUpper(a3), "char uppered");
548 Assert.AreEqual(b4, Char.ToUpper(a4), "char uppered");
549 Assert.AreEqual(b5, Char.ToUpper(a5), "char uppered");
550 Assert.AreEqual(b6, Char.ToUpper(a6), "char uppered");
554 public void TestToString()
558 Assert.IsTrue(s1.Equals(c1.ToString()));
562 public void TestGetTypeCode()
565 Assert.IsTrue(c1.GetTypeCode().Equals(TypeCode.Char));
570 public void TestConvertFromUtf32 ()
572 Assert.AreEqual ("A", Char.ConvertFromUtf32 (0x41), "#1");
573 Assert.AreEqual ("\uD800\uDC00", Char.ConvertFromUtf32 (0x10000), "#2");
577 [ExpectedException (typeof (ArgumentOutOfRangeException))]
578 public void TestConvertFromUtf32Fail1 ()
580 Char.ConvertFromUtf32 (-1);
584 [ExpectedException (typeof (ArgumentOutOfRangeException))]
585 public void TestConvertFromUtf32Fail2 ()
587 Char.ConvertFromUtf32 (0x110001);
591 [ExpectedException (typeof (ArgumentOutOfRangeException))]
592 public void TestConvertFromUtf32Fail3 ()
594 Char.ConvertFromUtf32 (0xD800);
598 public void TestConvertToUtf32 ()
600 Assert.AreEqual (0x10000, Char.ConvertToUtf32 ('\uD800', '\uDC00'), "#1");
601 Assert.AreEqual (0x10FFFF, Char.ConvertToUtf32 ('\uDBFF', '\uDFFF'), "#2");
605 [ExpectedException (typeof (ArgumentOutOfRangeException))]
606 public void TestConvertToUtf32Fail1 ()
608 Char.ConvertToUtf32 ('A', '\uDC00');
612 [ExpectedException (typeof (ArgumentOutOfRangeException))]
613 public void TestConvertUtf32Fail2 ()
615 Char.ConvertToUtf32 ('\uD800', '\uD800');