[bcl]Add test for CultureInfo.DefaultThreadCurrentCulture
[mono.git] / mcs / class / corlib / Test / System.Globalization / IdnMappingTest.cs
1 //
2 // IdnMappingTest.cs
3 //
4 // Author:
5 //      Atsushi Enomoto  <atsushi@ximian.com>
6 //
7 // Copyright (C) 2007 Novell, Inc. (http://www.novell.com)
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 // 
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 // 
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28
29 #if NET_2_0
30
31 using NUnit.Framework;
32 using System.IO;
33 using System;
34 using System.Globalization;
35 using System.Threading;
36 using System.Text;
37
38 namespace MonoTests.System.Globalization
39 {
40         [TestFixture]
41         public class IdnMappingTest
42         {
43                 void GetAscii (IdnMapping m, string source, string expected, object label)
44                 {
45                         Assert.AreEqual (expected, m.GetAscii (source), label != null ? label.ToString () : expected);
46                 }
47
48                 void GetAsciiInvalid (IdnMapping m, string s, object label)
49                 {
50                         try {
51                                 m.GetAscii (s);
52                                 Assert.Fail (label != null ? label.ToString () + ":" + s : s);
53                         } catch (ArgumentException) {
54                         }
55                 }
56
57                 void GetUnicode (IdnMapping m, string source, string expected, object label)
58                 {
59                         Assert.AreEqual (expected, m.GetUnicode (source), label != null ? label.ToString () : expected);
60                 }
61
62                 void GetUnicodeInvalid (IdnMapping m, string s, object label)
63                 {
64                         try {
65                                 m.GetUnicode (s);
66                                 Assert.Fail (label != null ? label.ToString () + ":" + s : s);
67                         } catch (ArgumentException) {
68                         }
69                 }
70
71                 [Test]
72                 public void GetAsciiInvalid ()
73                 {
74                         // hmm... according to RFC 3490, there are couple of
75                         // invalid characters in RFC 3491 [Nameprop] ...
76                         // comment out them for now.
77
78                         IdnMapping m = new IdnMapping ();
79                         GetAsciiInvalid (m, "\x0", 1);
80                         GetAsciiInvalid (m, "\xD\xA", 2);
81                         GetAsciiInvalid (m, "\x1F", 3);
82                         GetAsciiInvalid (m, "\x7F", 4);
83                         GetAsciiInvalid (m, "\x80", 5);
84                         // GetAsciiInvalid (m, "\xA0", 6);
85                         // GetAsciiInvalid (m, "\u1680", 7);
86                         GetAsciiInvalid (m, "\u200E", 8);
87                         // GetAsciiInvalid (m, "\u0341", 9);
88                         GetAsciiInvalid (m, "\uE000", 10);
89                         GetAsciiInvalid (m, "\uFFFF", 11);
90                         GetAsciiInvalid (m, "\u2028", 12);
91                         GetAsciiInvalid (m, "\uD800", 13);
92                         // GetAsciiInvalid (m, "\u3000", 14);
93                 }
94
95                 [Test]
96                 public void GetAscii ()
97                 {
98                         IdnMapping m = new IdnMapping ();
99                         GetAscii (m, "www.mono-project.com", "www.mono-project.com", 1);
100                         GetAscii (m, "a\uFF61b", "a.b", 2);
101
102                         // umm... does it reject anything larger than U+FFFF ??
103                         // GetAscii (m, "\uD800\uDC00", "", 3);
104
105                         // hmm, according to RFC 3490, ToASCII never changes
106                         // the input whose codepoints are all within ASCII.
107                         GetAscii (m, "A\uFF61B", "a.b", 4);
108                         GetAscii (m, "A.B", "A.B", 5); // no lowercasing
109                 }
110
111                 [Test]
112                 public void Dots ()
113                 {
114                         IdnMapping m = new IdnMapping ();
115                         GetAsciiInvalid (m, ".", 1);
116                         GetAsciiInvalid (m, "\uFF61", 2);
117                         GetAscii (m, "Am running now.", "Am running now.", 3);
118                         GetAsciiInvalid (m, ".bashrc", 4);
119                 }
120
121                 [Test]
122                 public void UnassignedCharacter ()
123                 {
124                         IdnMapping m = new IdnMapping ();
125                         GetAsciiInvalid (m, "\u18b0.com", 1);
126                         m.AllowUnassigned = true;
127                         GetAscii (m, "\u18b0.com", "xn--6bf.com", 2);
128                 }
129
130                 [Test]
131                 public void UseStd3AsciiRules ()
132                 {
133                         IdnMapping m = new IdnMapping ();
134                         GetAscii (m, "-_-.com", "-_-.com", 1);
135                         m.UseStd3AsciiRules = true;
136                         GetAsciiInvalid (m, "a b.com", 1.5);
137                         GetAsciiInvalid (m, "_.com", 2);
138                         GetAsciiInvalid (m, "-abc.com", 3);
139                         GetAscii (m, "abc-def.com", "abc-def.com", 4); // hyphen in the middle is okay
140                         GetAsciiInvalid (m, "abc-.def.com", 5); // hyphen is *not* in the middle.
141                 }
142
143                 [Test]
144                 public void AcePrefix ()
145                 {
146                         IdnMapping m = new IdnMapping ();
147                         GetAscii (m, "bl--.com", "bl--.com", 1); // only ascii
148                         GetAscii (m, "bl--\xC0.com", "xn--bl---3na.com", 2);
149                         GetAscii (m, "xn--.com", "xn--.com", 3); // only ascii
150                         GetAsciiInvalid (m, "xn--\xC0.com", 4);
151                         GetAsciiInvalid (m, "xN--\xC0.com", 5);
152                         GetAsciiInvalid (m, "Xn--\xC0.com", 6);
153                         GetAsciiInvalid (m, "XN--\xC0.com", 7);
154                         GetAscii (m, "xN\xC0.com", "xn--xn-kia.com", 8);
155                         GetAscii (m, "bl--\xC0.wl--\xC0.com", "xn--bl---3na.xn--wl---3na.com", 9);
156                 }
157
158                 [Test]
159                 public void GetAsciiRFC3492Examples ()
160                 {
161                         IdnMapping m = new IdnMapping ();
162                         // 3<nen>B<gumi><kin><pachi><sen><sei>
163                         GetAscii (m, "3\u5E74B\u7D44\u91D1\u516B\u5148\u751F", "xn--3b-ww4c5e180e575a65lsy2b", "(L)");
164                         // Maji<de>Koi<suru>5<byoumae>
165                         GetAscii (m, "Maji\u3067Koi\u3059\u308B5\u79D2\u524D", "xn--majikoi5-783gue6qz075azm5e", "(P)");
166                 }
167
168                 [Test]
169                 public void GetUnicode ()
170                 {
171                         IdnMapping m = new IdnMapping ();
172                         GetAscii (m, "www.mono-project.com", "www.mono-project.com", 1);
173                         GetAscii (m, "a\uFF61b", "a.b", 2);
174
175                         // umm... does it reject anything larger than U+FFFF ??
176                         // GetAscii (m, "\uD800\uDC00", "", 3);
177
178                         // hmm, according to RFC 3490, ToASCII never changes
179                         // the input whose codepoints are all within ASCII.
180                         GetAscii (m, "A\uFF61B", "a.b", 4);
181                         GetAscii (m, "A.B", "A.B", 5); // no lowercasing
182                 }
183
184                 [Test]
185                 public void GetUnicodeRFC3492Examples ()
186                 {
187                         // uppercases in the ASCII strings are ignored.
188                         IdnMapping m = new IdnMapping ();
189                         // 3<nen>B<gumi><kin><pachi><sen><sei>
190                         GetUnicode (m, "xn--3B-ww4c5e180e575a65lsy2b", "3\u5E74b\u7D44\u91D1\u516B\u5148\u751F", "(L)");
191                         // Maji<de>Koi<suru>5<byoumae>
192                         GetUnicode (m, "xn--MajiKoi5-783gue6qz075azm5e", "maji\u3067koi\u3059\u308B5\u79D2\u524D", "(P)");
193                 }
194         }
195 }
196
197 #endif