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;
28 using System.Windows.Markup;
30 using System.Xaml.Schema;
32 using NUnit.Framework;
34 namespace MonoTests.System.Xaml.Schema
37 public class XamlMemberInvokerTest
39 XamlSchemaContext sctx = new XamlSchemaContext (new XamlSchemaContextSettings ());
40 PropertyInfo str_len = typeof (string).GetProperty ("Length");
41 PropertyInfo sb_len = typeof (StringBuilder).GetProperty ("Length");
42 PropertyInfo xr_resolver = typeof (XmlResolver).GetProperty ("Credentials");
43 EventInfo ass_load = typeof (AppDomain).GetEvent ("AssemblyLoad");
46 [ExpectedException (typeof (ArgumentNullException))]
47 public void ConstructorNull ()
49 new XamlMemberInvoker (null);
55 public void FromProperty ()
58 var i = new XamlMemberInvoker (new XamlMember (pi, sctx));
59 Assert.AreEqual (pi.GetGetMethod (), i.UnderlyingGetter, "#1");
60 Assert.IsNull (i.UnderlyingSetter, "#2");
61 Assert.AreEqual (5, i.GetValue ("hello"), "#3");
65 [ExpectedException (typeof (ArgumentNullException))]
66 public void GetValueNullObject ()
69 var i = new XamlMemberInvoker (new XamlMember (pi, sctx));
74 [ExpectedException (typeof (ArgumentNullException))]
75 public void SetValueNullObject ()
78 var i = new XamlMemberInvoker (new XamlMember (pi, sctx));
83 [ExpectedException (typeof (NotSupportedException))]
84 public void GetValueOnWriteOnlyProperty ()
87 var i = new XamlMemberInvoker (new XamlMember (pi, sctx));
88 i.GetValue (new XmlUrlResolver ());
92 [ExpectedException (typeof (NotSupportedException))]
93 public void SetValueOnReadOnlyProperty ()
96 var i = new XamlMemberInvoker (new XamlMember (pi, sctx));
97 i.SetValue ("hello", 5);
101 public void SetValueOnReadWriteProperty ()
104 var i = new XamlMemberInvoker (new XamlMember (pi, sctx));
105 var sb = new StringBuilder ();
107 Assert.AreEqual (5, sb.Length, "#1");
111 [ExpectedException (typeof (TargetException))]
112 public void GetValueOnIrrelevantObject ()
115 var i = new XamlMemberInvoker (new XamlMember (pi, sctx));
116 i.GetValue (new StringBuilder ());
120 public void GetValueOnTypeValue ()
122 var xm = XamlLanguage.Type.GetMember ("Type");
123 var i = new XamlMemberInvoker (xm);
124 var o = i.GetValue (new TypeExtension (typeof (int)));
125 Assert.AreEqual (typeof (int), o, "#1");
129 public void GetValueArrayExtension ()
131 var xt = sctx.GetXamlType (typeof (TestClass));
132 var xm = xt.GetMember ("ArrayMember");
133 Assert.IsNotNull (xm, "#-1");
134 Assert.AreEqual (XamlLanguage.Array, xm.Type, "#0");
135 var o = xm.Invoker.GetValue (new TestClass ());
136 Assert.AreEqual (typeof (ArrayExtension), o.GetType (), "#1");
140 [ExpectedException (typeof (NotSupportedException))]
141 public void GetValueInitialization ()
143 var xm = XamlLanguage.Initialization;
149 [ExpectedException (typeof (NotSupportedException))]
150 public void GetValuePositionalParameter ()
152 var xm = XamlLanguage.PositionalParameters;
154 i.GetValue (new TypeExtension (typeof (int)));
158 [ExpectedException (typeof (TargetException))]
159 public void SetValueOnIrrelevantObject ()
162 var i = new XamlMemberInvoker (new XamlMember (pi, sctx));
163 i.SetValue ("hello", 5);
169 public void FromEvent ()
172 var i = new XamlMemberInvoker (new XamlMember (ei, sctx));
173 Assert.IsNull (i.UnderlyingGetter, "#1");
174 Assert.AreEqual (ei.GetAddMethod (), i.UnderlyingSetter, "#2");
178 [ExpectedException (typeof (NotSupportedException))]
179 public void GetValueOnEvent ()
182 var i = new XamlMemberInvoker (new XamlMember (ei, sctx));
183 i.GetValue (AppDomain.CurrentDomain);
187 public void SetValueOnEventNull ()
190 var i = new XamlMemberInvoker (new XamlMember (ei, sctx));
191 i.SetValue (AppDomain.CurrentDomain, null);
195 [ExpectedException (typeof (ArgumentException))]
196 public void SetValueOnEventValueMismatch ()
199 var i = new XamlMemberInvoker (new XamlMember (ei, sctx));
200 i.SetValue (AppDomain.CurrentDomain, 5);
203 void DummyAssemblyLoad (object o, AssemblyLoadEventArgs e)
208 public void SetValueOnEvent ()
211 var i = new XamlMemberInvoker (new XamlMember (ei, sctx));
212 i.SetValue (AppDomain.CurrentDomain, new AssemblyLoadEventHandler (DummyAssemblyLoad));
216 public void CustomTypeDefaultValues ()
218 var i = new MyXamlMemberInvoker ();
219 Assert.IsNull (i.UnderlyingGetter, "#1");
220 Assert.IsNull (i.UnderlyingSetter, "#2");
224 [ExpectedException (typeof (MyException))]
225 public void UnderlyingGetter ()
227 var i = new XamlMemberInvoker (new MyXamlMember (str_len, sctx));
228 // call XamlMember's UnderlyingGetter.
229 Assert.IsNotNull (i.UnderlyingGetter, "#1");
233 [ExpectedException (typeof (MyException))]
234 public void UnderlyingSetter ()
236 var i = new XamlMemberInvoker (new MyXamlMember (str_len, sctx));
237 // call XamlMember's UnderlyingSetter.
238 Assert.IsNull (i.UnderlyingSetter, "#1");
241 class MyXamlMember : XamlMember
243 public MyXamlMember (PropertyInfo pi, XamlSchemaContext context)
248 protected override MethodInfo LookupUnderlyingGetter ()
250 throw new MyException ();
253 protected override MethodInfo LookupUnderlyingSetter ()
255 throw new MyException ();
259 class MyException : Exception
263 class MyXamlMemberInvoker : XamlMemberInvoker
271 ArrayMember = new ArrayExtension (typeof (int));
272 ArrayMember.AddChild (5);
273 ArrayMember.AddChild (3);
274 ArrayMember.AddChild (-1);
277 public ArrayExtension ArrayMember { get; set; }