5 // Atsushi Enomoto <atsushi@ximian.com>
7 // Copyright (C) 2007 Novell, Inc. (http://www.novell.com)
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:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
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.
31 using NUnit
.Framework
;
34 using System
.Globalization
;
35 using System
.Threading
;
38 namespace MonoTests
.System
.Globalization
41 public class IdnMappingTest
43 void GetAscii (IdnMapping m
, string source
, string expected
, object label
)
45 Assert
.AreEqual (expected
, m
.GetAscii (source
), label
!= null ? label
.ToString () : expected
);
48 void GetAsciiInvalid (IdnMapping m
, string s
, object label
)
52 Assert
.Fail (label
!= null ? label
.ToString () + ":" + s
: s
);
53 } catch (ArgumentException
) {
57 void GetUnicode (IdnMapping m
, string source
, string expected
, object label
)
59 Assert
.AreEqual (expected
, m
.GetUnicode (source
), label
!= null ? label
.ToString () : expected
);
62 void GetUnicodeInvalid (IdnMapping m
, string s
, object label
)
66 Assert
.Fail (label
!= null ? label
.ToString () + ":" + s
: s
);
67 } catch (ArgumentException
) {
72 public void GetAsciiInvalid ()
74 // hmm... according to RFC 3490, there are couple of
75 // invalid characters in RFC 3491 [Nameprop] ...
76 // comment out them for now.
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);
96 public void GetAscii ()
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);
102 // umm... does it reject anything larger than U+FFFF ??
103 // GetAscii (m, "\uD800\uDC00", "", 3);
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
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);
122 public void UnassignedCharacter ()
124 IdnMapping m
= new IdnMapping ();
125 GetAsciiInvalid (m
, "\u0221.com", 1);
126 m
.AllowUnassigned
= true;
127 GetAscii (m
, "\u0221.com", "xn--6la.com", 2);
131 public void UseStd3AsciiRules ()
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.
144 public void AcePrefix ()
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);
159 public void GetAsciiRFC3492Examples ()
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)");
169 public void GetUnicode ()
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);
175 // umm... does it reject anything larger than U+FFFF ??
176 // GetAscii (m, "\uD800\uDC00", "", 3);
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
185 public void GetUnicodeRFC3492Examples ()
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)");