2 // Copyright (C) 2010 Novell Inc. http://novell.com
4 // Permission is hereby granted, free of charge, to any person obtaining
5 // a copy of this software and associated documentation files (the
6 // "Software"), to deal in the Software without restriction, including
7 // without limitation the rights to use, copy, modify, merge, publish,
8 // distribute, sublicense, and/or sell copies of the Software, and to
9 // permit persons to whom the Software is furnished to do so, subject to
10 // the following conditions:
12 // The above copyright notice and this permission notice shall be
13 // included in all copies or substantial portions of the Software.
15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 using System.Collections;
25 using System.Collections.Generic;
26 using System.Reflection;
29 using System.Xaml.Schema;
31 using NUnit.Framework;
33 namespace MonoTests.System.Xaml.Schema
36 public class XamlTypeNameTest
39 public void ConstructorDefault ()
45 [ExpectedException (typeof (ArgumentNullException))]
46 public void ConstructorXamlTypeNull ()
48 new XamlTypeName (null);
52 public void ConstructorNameNull ()
55 new XamlTypeName ("urn:foo", null);
59 public void ConstructorNamespaceNull ()
62 new XamlTypeName (null, "FooBar");
66 public void ConstructorName ()
68 var n = new XamlTypeName ("urn:foo", "FooBar");
69 Assert.IsNotNull (n.TypeArguments, "#1");
70 Assert.AreEqual (0, n.TypeArguments.Count, "#2");
74 public void ConstructorTypeArgumentsNull ()
76 var n = new XamlTypeName ("urn:foo", "FooBar", (XamlTypeName []) null);
77 Assert.IsNotNull (n.TypeArguments, "#1");
78 Assert.AreEqual (0, n.TypeArguments.Count, "#2");
82 [Ignore (".NET causes NRE on ToString(). It is not really intended and should raise an error")]
83 public void ConstructorTypeArgumentsNullEntry ()
85 new XamlTypeName ("urn:foo", "FooBar", new XamlTypeName [] {null});
89 public void ConstructorTypeArguments ()
91 new XamlTypeName ("urn:foo", "FooBar", new XamlTypeName [] {new XamlTypeName ("urn:bar", "FooBarBaz")});
95 public void ConstructorTypeArgumentsEmpty ()
97 var n = new XamlTypeName ("urn:foo", "FooBar", new XamlTypeName [0]);
98 Assert.IsNotNull (n.TypeArguments, "#1");
99 Assert.AreEqual (0, n.TypeArguments.Count, "#2");
103 [ExpectedException (typeof (InvalidOperationException))]
104 public void ToStringDefault ()
106 var n = new XamlTypeName ();
111 [ExpectedException (typeof (InvalidOperationException))]
112 public void ToStringNameNull ()
114 var n = new XamlTypeName ("urn:foo", null);
119 [ExpectedException (typeof (InvalidOperationException))]
120 public void ToStringNamespaceNull ()
123 var n = new XamlTypeName (null, "FooBar");
128 public void ToStringTypeArgumentsNull ()
130 var n = new XamlTypeName ("urn:foo", "FooBar", (XamlTypeName []) null);
131 Assert.AreEqual ("{urn:foo}FooBar", n.ToString (), "#1");
135 [Ignore (".NET raises NRE")]
136 public void ToStringTypeArgumentsNullEntry ()
138 var n = new XamlTypeName ("urn:foo", "FooBar", new XamlTypeName [] {null, new XamlTypeName ("urn:bar", "FooBarBaz")});
139 Assert.AreEqual ("{urn:foo}FooBar()", n.ToString (), "#1");
143 public void ToStringTypeArguments ()
145 var n = new XamlTypeName ("urn:foo", "FooBar", new XamlTypeName [] {new XamlTypeName ("urn:bar", "FooBarBaz")});
146 Assert.AreEqual ("{urn:foo}FooBar({urn:bar}FooBarBaz)", n.ToString (), "#1");
150 public void ToStringTypeArguments2 ()
152 var n = new XamlTypeName ("urn:foo", "Foo", new XamlTypeName [] {new XamlTypeName ("urn:bar", "Bar"), new XamlTypeName ("urn:baz", "Baz")});
153 Assert.AreEqual ("{urn:foo}Foo({urn:bar}Bar, {urn:baz}Baz)", n.ToString (), "#1");
157 public void ToStringEmptyNamespace ()
159 var n = new XamlTypeName (string.Empty, "Foo");
160 Assert.AreEqual ("{}Foo", n.ToString (), "#1");
164 public void ToStringXamlTypePredefined ()
166 var n = new XamlTypeName (XamlLanguage.Int32);
167 Assert.AreEqual ("{http://schemas.microsoft.com/winfx/2006/xaml}Int32", n.ToString (), "#1");
171 [ExpectedException (typeof (InvalidOperationException))]
172 public void ToStringNamespaceLookupInsufficient ()
174 var n = new XamlTypeName ("urn:foo", "Foo", new XamlTypeName [] {new XamlTypeName ("urn:bar", "Bar"), new XamlTypeName ("urn:baz", "Baz")});
175 var lookup = new MyNamespaceLookup ();
176 lookup.Add ("a", "urn:foo");
177 lookup.Add ("c", "urn:baz");
178 // it fails because there is missing mapping for urn:bar.
179 Assert.AreEqual ("a:Foo({urn:bar}Bar, c:Baz)", n.ToString (lookup), "#1");
183 public void ToStringNullLookup ()
185 var n = new XamlTypeName ("urn:foo", "Foo", new XamlTypeName [] {new XamlTypeName ("urn:bar", "Bar"), new XamlTypeName ("urn:baz", "Baz")});
186 Assert.AreEqual ("{urn:foo}Foo({urn:bar}Bar, {urn:baz}Baz)", n.ToString (null), "#1");
190 public void ToStringNamespaceLookup ()
192 var n = new XamlTypeName ("urn:foo", "Foo", new XamlTypeName [] {new XamlTypeName ("urn:bar", "Bar"), new XamlTypeName ("urn:baz", "Baz")});
193 var lookup = new MyNamespaceLookup ();
194 lookup.Add ("a", "urn:foo");
195 lookup.Add ("b", "urn:bar");
196 lookup.Add ("c", "urn:baz");
197 Assert.AreEqual ("a:Foo(b:Bar, c:Baz)", n.ToString (lookup), "#1");
198 Assert.AreEqual ("b:Bar, c:Baz", XamlTypeName.ToString (n.TypeArguments, lookup), "#2");
202 [ExpectedException (typeof (ArgumentNullException))]
203 public void StaticToStringNullLookup ()
205 XamlTypeName.ToString (new XamlTypeName [] {new XamlTypeName ("urn:foo", "bar")}, null);
209 [ExpectedException (typeof (ArgumentNullException))]
210 public void StaticToStringNullTypeNameList ()
212 XamlTypeName.ToString (null, new MyNamespaceLookup ());
216 public void StaticToStringEmptyArray ()
218 Assert.AreEqual ("", XamlTypeName.ToString (new XamlTypeName [0], new MyNamespaceLookup ()), "#1");
221 class MyNamespaceLookup : INamespacePrefixLookup
223 Dictionary<string,string> dic = new Dictionary<string,string> ();
225 public void Add (string prefix, string ns)
230 public string LookupPrefix (string ns)
233 return dic.TryGetValue (ns, out p) ? p : null;
240 [ExpectedException (typeof (ArgumentNullException))]
241 public void TryParseNullName ()
243 XamlTypeName.TryParse (null, new MyNSResolver (), out dummy);
247 [ExpectedException (typeof (ArgumentNullException))]
248 public void TryParseNullResolver ()
250 XamlTypeName.TryParse ("Foo", null, out dummy);
254 public void TryParseEmptyName ()
256 Assert.IsFalse (XamlTypeName.TryParse (String.Empty, new MyNSResolver (), out dummy), "#1");
260 public void TryParseColon ()
262 var r = new MyNSResolver ();
263 r.Add ("a", "urn:foo");
264 Assert.IsFalse (XamlTypeName.TryParse (":", r, out dummy), "#1");
265 Assert.IsFalse (XamlTypeName.TryParse ("a:", r, out dummy), "#2");
266 Assert.IsFalse (XamlTypeName.TryParse (":b", r, out dummy), "#3");
270 public void TryParseInvalidName ()
272 var r = new MyNSResolver ();
273 r.Add ("a", "urn:foo");
274 r.Add ("#", "urn:bar");
275 Assert.IsFalse (XamlTypeName.TryParse ("$%#___!", r, out dummy), "#1");
276 Assert.IsFalse (XamlTypeName.TryParse ("a:#$#", r, out dummy), "#2");
277 Assert.IsFalse (XamlTypeName.TryParse ("#:foo", r, out dummy), "#3");
281 public void TryParseNoFillEmpty ()
283 Assert.IsFalse (XamlTypeName.TryParse ("Foo", new MyNSResolver (true), out dummy), "#1");
287 public void TryParseFillEmpty ()
289 var r = new MyNSResolver ();
290 Assert.IsTrue (XamlTypeName.TryParse ("Foo", r, out dummy), "#1");
291 Assert.IsNotNull (dummy, "#2");
292 Assert.AreEqual (String.Empty, dummy.Namespace, "#2-2");
293 Assert.AreEqual ("Foo", dummy.Name, "#2-3");
297 public void TryParseAlreadyQualified ()
299 Assert.IsFalse (XamlTypeName.TryParse ("{urn:foo}Foo", new MyNSResolver (), out dummy), "#1");
303 public void TryParseResolveFailure ()
305 Assert.IsFalse (XamlTypeName.TryParse ("x:Foo", new MyNSResolver (), out dummy), "#1");
309 public void TryParseResolveSuccess ()
311 var r = new MyNSResolver ();
312 r.Add ("x", "urn:foo");
313 Assert.IsTrue (XamlTypeName.TryParse ("x:Foo", r, out dummy), "#1");
314 Assert.IsNotNull (dummy, "#2");
315 Assert.AreEqual ("urn:foo", dummy.Namespace, "#2-2");
316 Assert.AreEqual ("Foo", dummy.Name, "#2-3");
320 public void TryParseInvalidGenericName ()
322 var r = new MyNSResolver ();
323 r.Add ("x", "urn:foo");
324 Assert.IsFalse (XamlTypeName.TryParse ("x:Foo()", r, out dummy), "#1");
328 public void TryParseGenericName ()
330 var r = new MyNSResolver ();
331 r.Add ("x", "urn:foo");
332 Assert.IsTrue (XamlTypeName.TryParse ("x:Foo(x:Foo,x:Bar)", r, out dummy), "#1");
333 Assert.AreEqual (2, dummy.TypeArguments.Count, "#2");
337 [ExpectedException (typeof (ArgumentNullException))]
338 public void ParseListNullNames ()
340 XamlTypeName.ParseList (null, new MyNSResolver ());
344 [ExpectedException (typeof (ArgumentNullException))]
345 public void ParseListNullResolver ()
347 XamlTypeName.ParseList ("foo", null);
351 [ExpectedException (typeof (FormatException))]
352 public void ParseListInvalid ()
354 XamlTypeName.ParseList ("foo bar", new MyNSResolver ());
358 [ExpectedException (typeof (FormatException))]
359 public void ParseListInvalid2 ()
361 XamlTypeName.ParseList ("foo,", new MyNSResolver ());
365 [ExpectedException (typeof (FormatException))]
366 public void ParseListInvalid3 ()
368 XamlTypeName.ParseList ("", new MyNSResolver ());
372 public void ParseListValid ()
374 var l = XamlTypeName.ParseList ("foo, bar", new MyNSResolver ());
375 Assert.AreEqual (2, l.Count, "#1");
376 Assert.AreEqual ("{}foo", l [0].ToString (), "#2");
377 Assert.AreEqual ("{}bar", l [1].ToString (), "#3");
378 l = XamlTypeName.ParseList ("foo,bar", new MyNSResolver ());
379 Assert.AreEqual ("{}foo", l [0].ToString (), "#4");
380 Assert.AreEqual ("{}bar", l [1].ToString (), "#5");
383 class MyNSResolver : IXamlNamespaceResolver
385 public MyNSResolver ()
390 public MyNSResolver (bool returnNullForEmpty)
392 if (!returnNullForEmpty)
393 dic.Add (String.Empty, String.Empty);
396 Dictionary<string,string> dic = new Dictionary<string,string> ();
398 public void Add (string prefix, string ns)
403 public string GetNamespace (string prefix)
406 return dic.TryGetValue (prefix, out ns) ? ns : null;
409 public IEnumerable<NamespaceDeclaration> GetNamespacePrefixes ()
411 foreach (var p in dic)
412 yield return new NamespaceDeclaration (p.Value, p.Key);