1 // CompareInfoTest.cs - NUnit Test Cases for the
2 // System.Globalization.CompareInfo class
4 // Dick Porter <dick@ximian.com>
5 // Atsushi Enomoto <atsushi@ximian.com>
7 // (C) 2003-2005 Novell, Inc. http://www.novell.com
10 using NUnit.Framework;
12 using System.Globalization;
14 namespace MonoTests.System.Globalization
18 public class CompareInfoTest
20 static bool doTest = Environment.GetEnvironmentVariable ("MONO_DISABLE_MANAGED_COLLATION") != "yes";
22 public CompareInfoTest() {}
29 Assert.AreEqual (0, CultureInfo.InvariantCulture.CompareInfo.Compare ("", ""), "Compare two empty strings");
30 Assert.AreEqual (1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, ""), "Compare string with empty string");
31 Assert.AreEqual (-1, CultureInfo.InvariantCulture.CompareInfo.Compare ("", s1), "Compare empty string with string");
33 Assert.AreEqual (0, CultureInfo.InvariantCulture.CompareInfo.Compare ("", 0, "", 0), "Compare two empty strings, with 0 offsets");
34 Assert.AreEqual (1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, 0, "", 0), "Compare string with empty string, with 0 offsets");
35 Assert.AreEqual (-1, CultureInfo.InvariantCulture.CompareInfo.Compare ("", 0, s1, 0), "Compare empty string with string, with 0 offsets");
37 Assert.AreEqual (0, CultureInfo.InvariantCulture.CompareInfo.Compare ("", 0, "".Length, "", 0, "".Length), "Compare two empty strings, with 0 offsets and specified lengths");
38 Assert.AreEqual (1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, 0, s1.Length, "", 0, "".Length), "Compare string with empty string, with 0 offsets and specified lengths");
39 Assert.AreEqual (-1, CultureInfo.InvariantCulture.CompareInfo.Compare ("", 0, "".Length, s1, 0, s1.Length), "Compare empty string with string, with 0 offsets and specified lengths");
41 Assert.AreEqual (0, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, s1.Length, s1, s1.Length), "Compare two strings, with offsets == string lengths");
42 Assert.AreEqual (-1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, s1.Length, s1, 0), "Compare two strings, with first offset == string length");
43 Assert.AreEqual (1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, 0, s1, s1.Length), "Compare two strings, with second offset == string length");
45 Assert.AreEqual (0, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, 0, 0, s1, 0, 0), "Compare two strings, with zero lengths");
46 Assert.AreEqual (-1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, 0, 0, s1, 0, s1.Length), "Compare two strings, with first length zero");
47 Assert.AreEqual (1, CultureInfo.InvariantCulture.CompareInfo.Compare (s1, 0, s1.Length, s1, 0, 0), "Compare strings, with second length zero");
51 // Culture-sensitive collation tests
53 CompareInfo invariant = CultureInfo.InvariantCulture.CompareInfo;
54 CompareInfo french = new CultureInfo ("fr").CompareInfo;
55 CompareInfo japanese = new CultureInfo ("ja").CompareInfo;
56 CompareInfo czech = new CultureInfo ("cs").CompareInfo;
57 CompareInfo hungarian = new CultureInfo ("hu").CompareInfo;
59 CompareOptions ignoreCN =
60 CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase;
62 void AssertCompare (string message, int result, string s1, string s2)
64 AssertCompare (message, result, s1, s2, CompareOptions.None);
67 void AssertCompare (string message, int result, string s1, string s2,
70 AssertCompare (message, result, s1, s2, opt, invariant);
73 void AssertCompare (string message, int result, string s1, string s2,
74 CompareOptions opt, CompareInfo ci)
76 int ret = ci.Compare (s1, s2, opt);
78 AssertEquals (message, 0, ret);
80 Assert.IsTrue (message + String.Format ("(neg: {0})", ret), ret < 0);
82 Assert.IsTrue (message + String.Format ("(pos: {0})", ret), ret > 0);
85 void AssertCompare (string message, int result,
86 string s1, int idx1, int len1, string s2, int idx2, int len2)
88 int ret = invariant.Compare (s1, idx1, len1, s2, idx2, len2);
90 AssertEquals (message, 0, ret);
92 Assert.IsTrue (message, ret < 0);
94 Assert.IsTrue (message, ret > 0);
97 void AssertCompare (string message, int result,
98 string s1, int idx1, int len1, string s2, int idx2, int len2,
99 CompareOptions opt, CompareInfo ci)
101 int ret = ci.Compare (s1, idx1, len1, s2, idx2, len2, opt);
103 AssertEquals (message, 0, ret);
105 Assert.IsTrue (message, ret < 0);
107 Assert.IsTrue (message, ret > 0);
110 void AssertIndexOf (string message, int expected,
111 string source, char target)
113 AssertEquals (message, expected,
114 invariant.IndexOf (source, target));
117 void AssertIndexOf (string message, int expected, string source,
118 char target, CompareOptions opt)
120 AssertEquals (message, expected,
121 invariant.IndexOf (source, target, opt));
124 void AssertIndexOf (string message, int expected, string source,
125 char target, int idx, int len, CompareOptions opt, CompareInfo ci)
127 AssertEquals (message, expected,
128 ci.IndexOf (source, target, idx, len, opt));
131 void AssertIndexOf (string message, int expected,
132 string source, string target)
134 AssertEquals (message, expected,
135 invariant.IndexOf (source, target));
138 void AssertIndexOf (string message, int expected, string source,
139 string target, CompareOptions opt)
141 AssertEquals (message, expected,
142 invariant.IndexOf (source, target, opt));
145 void AssertIndexOf (string message, int expected, string source,
146 string target, int idx, int len, CompareOptions opt, CompareInfo ci)
148 AssertEquals (message, expected,
149 ci.IndexOf (source, target, idx, len, opt));
152 void AssertLastIndexOf (string message, int expected,
153 string source, char target)
155 AssertEquals (message, expected,
156 invariant.LastIndexOf (source, target));
159 void AssertLastIndexOf (string message, int expected, string source,
160 char target, CompareOptions opt)
162 AssertEquals (message, expected,
163 invariant.LastIndexOf (source, target, opt));
166 void AssertLastIndexOf (string message, int expected, string source,
167 char target, int idx, int len)
169 AssertEquals (message, expected,
170 invariant.LastIndexOf (source, target, idx, len));
173 void AssertLastIndexOf (string message, int expected, string source,
174 char target, int idx, int len, CompareOptions opt, CompareInfo ci)
176 AssertEquals (message, expected,
177 ci.LastIndexOf (source, target, idx, len, opt));
180 void AssertLastIndexOf (string message, int expected,
181 string source, string target)
183 AssertEquals (message, expected,
184 invariant.LastIndexOf (source, target));
187 void AssertLastIndexOf (string message, int expected, string source,
188 string target, CompareOptions opt)
190 AssertEquals (message, expected,
191 invariant.LastIndexOf (source, target, opt));
194 void AssertLastIndexOf (string message, int expected, string source,
195 string target, int idx, int len)
197 AssertEquals (message, expected,
198 invariant.LastIndexOf (source, target, idx, len));
201 void AssertLastIndexOf (string message, int expected, string source,
202 string target, int idx, int len, CompareOptions opt, CompareInfo ci)
204 AssertEquals (message, expected,
205 ci.LastIndexOf (source, target, idx, len, opt));
208 void AssertIsPrefix (string message, bool expected, string source,
211 Assert.IsTrue (message, expected == invariant.IsPrefix (
215 void AssertIsPrefix (string message, bool expected, string source,
216 string target, CompareOptions opt)
218 Assert.IsTrue (message, expected == invariant.IsPrefix (
219 source, target, opt));
222 void AssertIsSuffix (string message, bool expected, string source,
225 Assert.IsTrue (message, expected == invariant.IsSuffix (
229 void AssertIsSuffix (string message, bool expected, string source,
230 string target, CompareOptions opt)
232 Assert.IsTrue (message, expected == invariant.IsSuffix (
233 source, target, opt));
238 [Category ("NotDotNet")]
240 public void CultureSensitiveCompare ()
245 AssertCompare ("#1", -1, "1", "2");
246 AssertCompare ("#2", 1, "A", "a");
247 AssertCompare ("#3", 0, "A", "a", CompareOptions.IgnoreCase);
248 AssertCompare ("#6", 1, "12", "1");
249 // BUG in .NET 2.0: See GetSortKey() test that assures sortkeys for "AE" and
250 // "\u00C6" are equivalent.
251 AssertCompare ("#7", 0, "AE", "\u00C6");
252 AssertCompare ("#8", 0, "AB\u01c0C", "A\u01c0B\u01c0C", CompareOptions.IgnoreSymbols);
253 // BUG in .NET 2.0: ditto.
254 AssertCompare ("#9", 0, "A\u0304", "\u0100");
255 AssertCompare ("#10", 1, "ABCABC", 5, 1, "1", 0, 1, CompareOptions.IgnoreCase, invariant);
256 AssertCompare ("#11", 0, "-d:NET_2_0", 0, 1, "-", 0, 1);
258 // BUG in .NET 2.0: ditto.
259 AssertCompare ("#12", 0, "ae", "\u00E6");
260 AssertCompare ("#13", 0, "\u00E6", "ae");
261 AssertCompare ("#14", 0, "\u00E6s", 0, 1, "ae", 0, 2);
263 // target is "empty" (in culture-sensitive context).
264 // BUG in .NET 2.0: \u3007 is totally-ignored character as a GetSortKey()
265 // result, while it is not in Compare().
266 AssertCompare ("#17", 0, String.Empty, "\u3007");
267 AssertCompare ("#18", 1, "A", "\u3007");
268 AssertCompare ("#19", 1, "ABC", "\u3007");
270 // shift weight comparison
271 AssertCompare ("#20", 1, "--start", "--");
273 // BUG in .NET 2.0: the same 00C6/00E6 issue.
274 AssertCompare ("#21", -1, "\u00E6", "aes");
277 AssertCompare ("#22", -1, "++)", "+-+)");
278 AssertCompare ("#23", -1, "+-+)", "+-+-)");
279 AssertCompare ("#24", 1, "+-+-)", "++)");
280 // BUG in .NET: it returns 1
281 AssertCompare ("#25", -1, "+-+-)", "-+-+)");
282 AssertCompare ("#26", -1, "+-+)", "-+-+)");
283 AssertCompare ("#27", -1, "++)", "-+-+)");
288 [Category ("NotDotNet")]
290 public void CompareSpecialWeight ()
295 // Japanese (in invariant)
296 // BUG in .NET 2.0 : half-width kana should be bigger.
297 AssertCompare ("#1", 1, "\u30D1\u30FC\u30B9", "\uFF8A\uFF9F\uFF70\uFF7D");
298 AssertCompare ("#4", 1, "\u3042\u309D", "\u3042\u3042");
299 AssertCompare ("#5", 0, "\u3042\u309D", "\u3042\u3042", CompareOptions.IgnoreNonSpace);
301 // extender in target
302 // BUG in .NET 2.0 : an extender should result in bigger sortkey
303 AssertCompare ("#7", -1, "\u30D1\u30A2", "\u30D1\u30FC");
304 AssertCompare ("#8", 0, "\u30D1\u30A2", "\u30D1\u30FC", CompareOptions.IgnoreNonSpace);
305 // extender in source
306 // BUG in .NET 2.0 : vice versa
307 AssertCompare ("#9", 1, "\u30D1\u30FC", "\u30D1\u30A2");
308 AssertCompare ("#10", 0, "\u30D1\u30FC", "\u30D1\u30A2", CompareOptions.IgnoreNonSpace);
312 public void IndexOfChar ()
317 AssertIndexOf ("#1", -1, "ABC", '1');
318 AssertIndexOf ("#2", 2, "ABCABC", 'c', CompareOptions.IgnoreCase);
319 AssertIndexOf ("#4", 4, "ABCDE", '\u0117', ignoreCN);
320 AssertIndexOf ("#5", 1, "ABCABC", 'B', 1, 5, CompareOptions.IgnoreCase, invariant);
321 AssertIndexOf ("#6", 4, "ABCABC", 'B', 2, 4, CompareOptions.IgnoreCase, invariant);
325 [Category ("NotDotNet")]
326 public void IndexOfCharMSBug ()
331 AssertIndexOf ("#1", 0, "\u00E6", 'a');
335 public void LastIndexOfChar ()
340 AssertLastIndexOf ("#1", -1, "ABC", '1');
341 AssertLastIndexOf ("#2", 5, "ABCABC", 'c', CompareOptions.IgnoreCase);
342 AssertLastIndexOf ("#4", 4, "ABCDE", '\u0117', ignoreCN);
343 AssertLastIndexOf ("#5", 1, "ABCABC", 'B', 3, 3);
344 AssertLastIndexOf ("#6", 4, "ABCABC", 'B', 4, 4);
345 AssertLastIndexOf ("#7", -1, "ABCABC", 'B', 5, 1);
346 AssertLastIndexOf ("#11", 0, "\\", '\\');
347 Assert.AreEqual (0, new CultureInfo ("en").CompareInfo.LastIndexOf ("\\", '\\'), "#11en");
348 Assert.AreEqual (0, new CultureInfo ("ja").CompareInfo.LastIndexOf ("\\", '\\'), "#11ja");
349 AssertLastIndexOf ("#12", 8, "/system/web", 'w');
350 Assert.AreEqual (8, new CultureInfo ("sv").CompareInfo.LastIndexOf ("/system/web", 'w'), "#12sv");
354 [Category ("NotDotNet")]
355 public void LastIndexOfCharMSBug ()
360 AssertIndexOf ("#1", 0, "\u00E6", 'a');
365 [Category ("NotDotNet")]
367 public void IsPrefix ()
372 AssertIsPrefix ("#1", false, "ABC", "c", CompareOptions.IgnoreCase);
373 AssertIsPrefix ("#2", false, "BC", "c", CompareOptions.IgnoreCase);
374 AssertIsPrefix ("#3", true, "C", "c", CompareOptions.IgnoreCase);
375 AssertIsPrefix ("#4", true, "EDCBA", "\u0117", ignoreCN);
376 AssertIsPrefix ("#5", true, "ABC", "AB", CompareOptions.IgnoreCase);
377 // BUG in .NET 2.0 : see GetSortKey() test (mentioned above).
378 AssertIsPrefix ("#6", true, "ae", "\u00E6", CompareOptions.None);
379 AssertIsPrefix ("#7", true, "\u00E6", "ae", CompareOptions.None);
381 // BUG in .NET 2.0 : see GetSortKey() test (mentioned above).
382 AssertIsPrefix ("#8", true, "\u00E6", "a", CompareOptions.None);
383 AssertIsPrefix ("#9", true, "\u00E6s", "ae", CompareOptions.None);
384 AssertIsPrefix ("#10", false, "\u00E6", "aes", CompareOptions.None);
385 AssertIsPrefix ("#11", true, "--start", "--", CompareOptions.None);
386 AssertIsPrefix ("#12", true, "-d:NET_1_1", "-", CompareOptions.None);
387 AssertIsPrefix ("#13", false, "-d:NET_1_1", "@", CompareOptions.None);
388 // U+3007 is completely ignored character.
389 AssertIsPrefix ("#14", true, "\uff21\uff21", "\uff21", CompareOptions.None);
390 // BUG in .NET 2.0 : see \u3007 issue (mentioned above).
391 AssertIsPrefix ("#15", true, "\uff21\uff21", "\u3007\uff21", CompareOptions.None);
392 AssertIsPrefix ("#16", true, "\uff21\uff21", "\uff21\u3007", CompareOptions.None);
393 AssertIsPrefix ("#17", true, "\\b\\a a", "\\b\\a a");
394 Assert.IsTrue (new CultureInfo ("en").CompareInfo.IsPrefix ("\\b\\a a", "\\b\\a a"), "#17en");
395 Assert.IsTrue (new CultureInfo ("ja").CompareInfo.IsPrefix ("\\b\\a a", "\\b\\a a"), "#17ja");
399 public void IsPrefixSpecialWeight ()
404 // Japanese (in invariant)
405 AssertIsPrefix ("#1", false, "\u30D1\u30FC\u30B9", "\uFF8A\uFF9F\uFF70\uFF7D");
406 AssertIsPrefix ("#2-2", false, "\u30D1\u30FC\u30B9", "\uFF8A\uFF9F\uFF70\uFF7D");
407 AssertIsPrefix ("#3-2", false, "\uFF80\uFF9E\uFF72\uFF8C\uFF9E",
408 "\u30C0\u30A4\u30D6");
409 AssertIsPrefix ("#4", false, "\u3042\u309D", "\u3042\u3042");
411 // extender in target
412 AssertIsPrefix ("#7", false, "\u30D1\u30A2", "\u30D1\u30FC");
413 // extender in source
414 AssertIsPrefix ("#9", false, "\u30D1\u30FC", "\u30D1\u30A2");
416 // empty suffix always matches the source.
417 AssertIsPrefix ("#11", true, "", "");
418 AssertIsPrefix ("#12", true, "/test.css", "");
421 AssertIsPrefix ("#13", false, "\u00e4_", "a");
426 [Category ("NotDotNet")]
428 public void IsSuffix ()
433 AssertIsSuffix ("#1", true, "ABC", "c", CompareOptions.IgnoreCase);
434 AssertIsSuffix ("#2", true, "BC", "c", CompareOptions.IgnoreCase);
435 AssertIsSuffix ("#3", false, "CBA", "c", CompareOptions.IgnoreCase);
436 AssertIsSuffix ("#4", true, "ABCDE", "\u0117", CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase);
437 AssertIsSuffix ("#5", false, "\u00E6", "a", CompareOptions.None);
438 // BUG in .NET 2.0 : see GetSortKey() test (mentioned above).
439 AssertIsSuffix ("#6", true, "\u00E6", "ae", CompareOptions.None);
440 AssertIsSuffix ("#7", true, "ae", "\u00E6", CompareOptions.None);
441 AssertIsSuffix ("#8", false, "e", "\u00E6", CompareOptions.None);
442 // U+3007 is completely ignored character.
443 AssertIsSuffix ("#9", true, "\uff21\uff21", "\uff21", CompareOptions.None);
444 // BUG in .NET 2.0 : see \u3007 issue (mentioned above).
445 AssertIsSuffix ("#10", true, "\uff21\uff21", "\u3007\uff21", CompareOptions.None);
446 AssertIsSuffix ("#11", true, "\uff21\uff21", "\uff21\u3007", CompareOptions.None);
447 // extender in target
448 AssertIsSuffix ("#12", false, "\u30D1\u30A2", "\u30D1\u30FC");
449 AssertIsSuffix ("#13", true, "\u30D1\u30A2", "\u30D1\u30FC", CompareOptions.IgnoreNonSpace);
450 // extender in source
451 AssertIsSuffix ("#14", false, "\u30D1\u30FC", "\u30D1\u30A2");
452 AssertIsSuffix ("#15", true, "\u30D1\u30FC", "\u30D1\u30A2", CompareOptions.IgnoreNonSpace);
453 // optimization sanity check
454 AssertIsSuffix ("#16", true,
455 "/configuration/system.runtime.remoting",
456 "system.runtime.remoting");
458 // empty suffix always matches the source.
459 AssertIsSuffix ("#17", true, "", "");
460 AssertIsSuffix ("#18", true, "/test.css", "");
461 AssertIsSuffix ("#19", true, "/test.css", "/test.css");
462 AssertIsSuffix ("#20", true, "\\b\\a a", "\\b\\a a");
463 Assert.IsTrue (new CultureInfo ("en").CompareInfo.IsSuffix ("\\b\\a a", "\\b\\a a"), "#20en");
464 Assert.IsTrue (new CultureInfo ("ja").CompareInfo.IsSuffix ("\\b\\a a", "\\b\\a a"), "#20ja");
468 [Category ("NotDotNet")]
469 [Category ("NotWorking")]
470 public void IsSuffixMSBug ()
475 AssertIsSuffix ("#1", true, "\u00E6", "e", CompareOptions.None);
480 [Category ("NotDotNet")]
482 public void IndexOfString ()
487 AssertIndexOf ("#1", -1, "ABC", "1", CompareOptions.None);
488 AssertIndexOf ("#2", 2, "ABCABC", "c", CompareOptions.IgnoreCase);
489 AssertIndexOf ("#4", 4, "ABCDE", "\u0117", CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase);
490 AssertIndexOf ("#5", 1, "ABCABC", "BC", CompareOptions.IgnoreCase);
491 AssertIndexOf ("#6", 1, "BBCBBC", "BC", CompareOptions.IgnoreCase);
492 AssertIndexOf ("#7", -1, "ABCDEF", "BCD", 0, 3, CompareOptions.IgnoreCase, invariant);
493 AssertIndexOf ("#8", 0, "-ABC", "-", CompareOptions.None);
494 AssertIndexOf ("#9", 0, "--ABC", "--", CompareOptions.None);
495 AssertIndexOf ("#10", -1, "--ABC", "--", 1, 2, CompareOptions.None, invariant);
496 // BUG in .NET 2.0 : see GetSortKey() test (mentioned above).
497 AssertIndexOf ("#11", 0, "AE", "\u00C6", CompareOptions.None);
498 // U+3007 is completely ignored character.
499 AssertIndexOf ("#12", 0, "\uff21\uff21", "\uff21", CompareOptions.None);
500 // BUG in .NET 2.0 : see \u3007 issue (mentioned above).
501 AssertIndexOf ("#13", 0, "\uff21\uff21", "\u3007\uff21", CompareOptions.None);
502 AssertIndexOf ("#14", 0, "\uff21\uff21", "\uff21\u3007", CompareOptions.None);
503 AssertIndexOf ("#15", 0, "\uff21\uff21", "\u3007", CompareOptions.None);
504 AssertIndexOf ("#15-2", 1, "\u3007\uff21", "\uff21", CompareOptions.None);
505 // target is "empty" (in culture-sensitive context).
506 AssertIndexOf ("#16", -1, String.Empty, "\u3007");
507 // BUG in .NET 2.0 : see \u3007 issue (mentioned above).
508 AssertIndexOf ("#17", 0, "A", "\u3007");
509 AssertIndexOf ("#18", 0, "ABC", "\u3007");
511 AssertIndexOf ("#19", 0, "\\b\\a a", "\\b\\a a");
512 Assert.AreEqual (0, new CultureInfo ("en").CompareInfo.IndexOf ("\\b\\a a", "\\b\\a a"), "#19en");
513 Assert.AreEqual (0, new CultureInfo ("ja").CompareInfo.IndexOf ("\\b\\a a", "\\b\\a a"), "#19ja");
517 public void IndexOfSpecialWeight ()
522 // Japanese (in invariant)
523 AssertIndexOf ("#1", -1, "\u30D1\u30FC\u30B9", "\uFF8A\uFF9F\uFF70\uFF7D");
524 // extender in target
525 AssertIndexOf ("#1-2", -1, "\u30D1\u30A2", "\u30D1\u30FC");
526 // extender in source
527 AssertIndexOf ("#2-2", -1, "\u30D1\u30FC\u30B9", "\uFF8A\uFF9F\uFF70\uFF7D");
528 AssertIndexOf ("#4", -1, "\u3042\u309D", "\u3042\u3042");
533 [Category ("NotDotNet")]
535 public void LastIndexOfString ()
540 AssertLastIndexOf ("#1", -1, "ABC", "1", CompareOptions.None);
541 AssertLastIndexOf ("#2", 5, "ABCABC", "c", CompareOptions.IgnoreCase);
542 AssertLastIndexOf ("#4", 4, "ABCDE", "\u0117", CompareOptions.IgnoreNonSpace | CompareOptions.IgnoreCase);
543 AssertLastIndexOf ("#5", 4, "ABCABC", "BC", CompareOptions.IgnoreCase);
544 AssertLastIndexOf ("#6", 4, "BBCBBC", "BC", CompareOptions.IgnoreCase);
545 AssertLastIndexOf ("#7", 1, "original", "rig", CompareOptions.None);
546 // BUG in .NET 2.0 : see GetSortKey() test (mentioned above).
547 AssertLastIndexOf ("#8", 0, "\u00E6", "ae", CompareOptions.None);
548 AssertLastIndexOf ("#9", 0, "-ABC", "-", CompareOptions.None);
549 AssertLastIndexOf ("#10", 0, "--ABC", "--", CompareOptions.None);
550 AssertLastIndexOf ("#11", -1, "--ABC", "--", 2, 2, CompareOptions.None, invariant);
551 AssertLastIndexOf ("#12", -1, "--ABC", "--", 4, 2, CompareOptions.None, invariant);
552 // BUG in .NET 2.0 : see GetSortKey() test (mentioned above).
553 AssertLastIndexOf ("#13", 0, "AE", "\u00C6", CompareOptions.None);
554 // U+3007 is completely ignored character.
555 AssertLastIndexOf ("#14", 1, "\uff21\uff21", "\uff21", CompareOptions.None);
556 // BUG in .NET 2.0 : see \u3007 issue (mentioned above).
557 AssertLastIndexOf ("#15", 1, "\uff21\uff21", "\u3007\uff21", CompareOptions.None);
558 AssertLastIndexOf ("#16", 1, "\uff21\uff21", "\uff21\u3007", CompareOptions.None);
559 AssertLastIndexOf ("#17", 1, "\uff21\uff21", "\u3007", CompareOptions.None);
560 AssertLastIndexOf ("#18", 1, "\u3007\uff21", "\uff21", CompareOptions.None);
561 AssertLastIndexOf ("#19", 0, "\\b\\a a", "\\b\\a a");
562 Assert.AreEqual (0, new CultureInfo ("en").CompareInfo.LastIndexOf ("\\b\\a a", "\\b\\a a"), "#19en");
563 Assert.AreEqual (0, new CultureInfo ("ja").CompareInfo.LastIndexOf ("\\b\\a a", "\\b\\a a"), "#19ja");
565 AssertLastIndexOf ("#20", 8, "/system/web", "w");
566 Assert.AreEqual (8, new CultureInfo ("sv").CompareInfo.LastIndexOf ("/system/web", "w"), "#20sv");
570 public void LastIndexOfSpecialWeight ()
575 // Japanese (in invariant)
576 AssertLastIndexOf ("#1", -1, "\u30D1\u30FC\u30B9", "\uFF8A\uFF9F\uFF70\uFF7D");
577 // extender in target
578 AssertLastIndexOf ("#1-2", -1, "\u30D1\u30A2", "\u30D1\u30FC");
579 // extender in source
580 AssertLastIndexOf ("#4", -1, "\u3042\u309D", "\u3042\u3042");
584 public void LastIndexOfOrdinalString ()
589 AssertLastIndexOf ("#1", -1, "ABC", "1", CompareOptions.Ordinal);
590 AssertLastIndexOf ("#2", 5, "ABCABC", "C", CompareOptions.Ordinal);
591 AssertLastIndexOf ("#3", -1, "ABCABC", "\uFF22", CompareOptions.Ordinal);
592 AssertLastIndexOf ("#4", 4, "ABCABC", "BC", CompareOptions.Ordinal);
593 AssertLastIndexOf ("#5", 4, "BBCBBC", "BC", CompareOptions.Ordinal);
594 AssertLastIndexOf ("#6", 1, "original", "rig", CompareOptions.Ordinal);
595 AssertLastIndexOf ("#7", 0, "\\b\\a a", "\\b\\a a", CompareOptions.Ordinal);
599 [Category ("TargetJvmNotWorking")]
601 public void NullCharacter ()
603 Assert.AreEqual (-1, "MONO".IndexOf ("\0\0\0"), "#1");
604 Assert.AreEqual (-1, "MONO".LastIndexOf ("\0\0\0"), "#2");
605 Assert.AreEqual (1, "MONO".CompareTo ("\0\0\0"), "#3");
609 [Category ("NotDotNet")]
610 // MS.NET treats it as equivalent, while in IndexOf() it does not match.
611 public void NullCharacterWeird ()
613 Assert.AreEqual (-1, "MONO".CompareTo ("MONO\0\0\0"), "#4");
618 [Category ("NotDotNet")]
619 public void OrdinalIgnoreCaseCompare ()
625 // BUG in .NET 2.0 : see GetSortKey() test (mentioned above).
626 AssertCompare ("#1", 0, "AE", "\u00C6", CompareOptions.None);
627 // BUG in .NET 2.0 : It raises inappropriate ArgumentException.
628 // should not match since it is Ordinal
629 AssertCompare ("#2", -133, "AE", "\u00C6", CompareOptions.OrdinalIgnoreCase);
631 AssertCompare ("#3", 1, "AE", "\u00E6", CompareOptions.None);
633 AssertCompare ("#4", 0, "AE", "\u00E6", CompareOptions.IgnoreCase);
634 // should not match since it is Ordinal
635 AssertCompare ("#5", -133, "AE", "\u00E6", CompareOptions.OrdinalIgnoreCase);
637 AssertCompare ("#6", 0, "AE", "ae", CompareOptions.OrdinalIgnoreCase);
638 AssertCompare ("#7", 0, "aE", "ae", CompareOptions.OrdinalIgnoreCase);
639 AssertCompare ("#8", 0, "aE", "ae", CompareOptions.OrdinalIgnoreCase);
640 AssertCompare ("#9", 0, "ae", "ae", CompareOptions.OrdinalIgnoreCase);
641 AssertCompare ("#10", 0, "AE", "AE", CompareOptions.OrdinalIgnoreCase);
642 AssertCompare ("#11", 0, "aE", "AE", CompareOptions.OrdinalIgnoreCase);
643 AssertCompare ("#12", 0, "aE", "AE", CompareOptions.OrdinalIgnoreCase);
644 AssertCompare ("#13", 0, "ae", "AE", CompareOptions.OrdinalIgnoreCase);
645 AssertCompare ("#14", 0, "ola", "OLA", CompareOptions.OrdinalIgnoreCase);
649 public void OrdinalIgnoreCaseIndexOf ()
651 AssertIndexOf ("#1-1", 0, "ABC", "abc", CompareOptions.OrdinalIgnoreCase);
652 AssertIndexOf ("#1-2", -1, "AEBECE", "\u00E6", CompareOptions.OrdinalIgnoreCase);
653 AssertIndexOf ("#1-3", -1, "@_@", "`_`", CompareOptions.OrdinalIgnoreCase);
657 public void OrdinalIgnoreCaseIndexOfChar ()
659 AssertIndexOf ("#2-1", 0, "ABC", 'a', CompareOptions.OrdinalIgnoreCase);
660 AssertIndexOf ("#2-2", -1, "AEBECE", '\u00C0', CompareOptions.OrdinalIgnoreCase);
661 AssertIndexOf ("#2-3", -1, "@_@", '`', CompareOptions.OrdinalIgnoreCase);
665 public void OrdinalIgnoreCaseLastIndexOf ()
667 AssertLastIndexOf ("#1-1", 0, "ABC", "abc", CompareOptions.OrdinalIgnoreCase);
668 AssertLastIndexOf ("#1-2", -1, "AEBECE", "\u00E6", CompareOptions.OrdinalIgnoreCase);
669 AssertLastIndexOf ("#1-3", -1, "@_@", "`_`", CompareOptions.OrdinalIgnoreCase);
670 AssertLastIndexOf ("#1-4", 1, "ABCDE", "bc", CompareOptions.OrdinalIgnoreCase);
671 AssertLastIndexOf ("#1-5", -1, "BBBBB", "ab", CompareOptions.OrdinalIgnoreCase);
675 public void OrdinalIgnoreCaseLastIndexOfChar ()
677 AssertLastIndexOf ("#2-1", 0, "ABC", 'a', CompareOptions.OrdinalIgnoreCase);
678 AssertLastIndexOf ("#2-2", -1, "AEBECE", '\u00C0', CompareOptions.OrdinalIgnoreCase);
679 AssertLastIndexOf ("#2-3", -1, "@_@", '`', CompareOptions.OrdinalIgnoreCase);
683 public void IsPrefixOrdinalIgnoreCase ()
685 Assert ("aaaa".StartsWith ("A", StringComparison.OrdinalIgnoreCase));