Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mcs/class/System/System.ComponentModel.Design.Serialization/ChangeLog7
-rw-r--r--mcs/class/System/System.ComponentModel.Design.Serialization/InstanceDescriptor.cs76
-rw-r--r--mcs/class/System/Test/System.ComponentModel.Design.Serialization/ChangeLog5
-rw-r--r--mcs/class/System/Test/System.ComponentModel.Design.Serialization/InstanceDescriptorTest.cs193
4 files changed, 219 insertions, 62 deletions
diff --git a/mcs/class/System/System.ComponentModel.Design.Serialization/ChangeLog b/mcs/class/System/System.ComponentModel.Design.Serialization/ChangeLog
index 3fd1edffa81..6ffcb96cf92 100644
--- a/mcs/class/System/System.ComponentModel.Design.Serialization/ChangeLog
+++ b/mcs/class/System/System.ComponentModel.Design.Serialization/ChangeLog
@@ -1,3 +1,10 @@
+2007-07-21 Gert Driesen <drieseng@users.sourceforge.net>
+
+ * InstanceDescriptor.cs: Allow null members. Fixed exception messages.
+ For properties, do not perform argument check. Fixed Invoke to return
+ null when member is null or when member is not ctor, method, field or
+ property (eg. a type). Removed obsolete HasThis method.
+
2007-07-18 Ivan N. Zlatev <contact@i-nz.net>
* InstanceDescriptor.cs: Fix a NRE.
diff --git a/mcs/class/System/System.ComponentModel.Design.Serialization/InstanceDescriptor.cs b/mcs/class/System/System.ComponentModel.Design.Serialization/InstanceDescriptor.cs
index ade245b313a..392ba758921 100644
--- a/mcs/class/System/System.ComponentModel.Design.Serialization/InstanceDescriptor.cs
+++ b/mcs/class/System/System.ComponentModel.Design.Serialization/InstanceDescriptor.cs
@@ -33,8 +33,8 @@ using System.Collections;
using System.Reflection;
using System.Security.Permissions;
-namespace System.ComponentModel.Design.Serialization {
-
+namespace System.ComponentModel.Design.Serialization
+{
[PermissionSet (SecurityAction.LinkDemand, Unrestricted = true)]
public sealed class InstanceDescriptor {
@@ -50,24 +50,27 @@ namespace System.ComponentModel.Design.Serialization {
public InstanceDescriptor(MemberInfo member, ICollection arguments, bool isComplete)
{
this.isComplete = isComplete;
- if ((member != null) && !IsMemberValid (member, arguments))
- throw new ArgumentException ("Only Constructor, Method, Field or Property members allowed", "member");
+ ValidateMember (member, arguments);
this.member = member;
this.arguments = arguments;
}
- private bool IsMemberValid (MemberInfo member, ICollection arguments)
+ private void ValidateMember (MemberInfo member, ICollection arguments)
{
+ if (member == null)
+ return;
+
switch (member.MemberType) {
- // According to docs only these types are allowed
+ // According to docs only these types are allowed, but the docs do
+ // state what happens for other types
case MemberTypes.Constructor:
ConstructorInfo CI = (ConstructorInfo) member;
if (arguments == null) // null counts as no arguments
if (CI.GetParameters().Length != 0)
- throw new ArgumentException ("Invalid number of arguments for this constructor", "arguments");
+ throw new ArgumentException ("Invalid number of arguments for this constructor");
if (arguments.Count != CI.GetParameters().Length)
- throw new ArgumentException ("Invalid number of arguments for this constructor", "arguments");
- return true;
+ throw new ArgumentException ("Invalid number of arguments for this constructor");
+ break;
case MemberTypes.Method:
MethodInfo MI = (MethodInfo) member;
if (!MI.IsStatic)
@@ -76,32 +79,24 @@ namespace System.ComponentModel.Design.Serialization {
if (MI.GetParameters().Length != 0)
throw new ArgumentException ("Invalid number of arguments for this method", "arguments");
if (arguments.Count != MI.GetParameters().Length)
- throw new ArgumentException ("Invalid number of arguments for this method", "arguments");
- return true;
+ throw new ArgumentException ("Invalid number of arguments for this method");
+ break;
case MemberTypes.Field:
FieldInfo FI = (FieldInfo) member;
if (!FI.IsStatic)
- throw new ArgumentException ("InstanceDescriptor only describes static (VB.Net: shared) members", "member");
- if (arguments == null) // null counts as no arguments
- return true;
- if (arguments.Count == 0)
- throw new ArgumentException ("Field members do not take any arguments", "arguments");
- return true;
+ throw new ArgumentException ("Parameter must be static");
+ if (arguments != null && arguments.Count != 0) // null counts as no arguments
+ throw new ArgumentException ("Field members do not take any arguments");
+ break;
case MemberTypes.Property:
PropertyInfo PI = (PropertyInfo) member;
if (!(PI.CanRead))
- throw new ArgumentException ("That property cannot be read", "member");
+ throw new ArgumentException ("Parameter must be readable");
MethodInfo PIM = PI.GetGetMethod();
if (!PIM.IsStatic)
- throw new ArgumentException ("InstanceDescriptor only describes static (VB.Net: shared) members", "member");
- if (arguments == null) // null counts as no arguments
- if (PIM.GetParameters().Length != 0)
- throw new ArgumentException ("Invalid number of arguments for this property", "arguments");
- if (arguments != null && arguments.Count != PIM.GetParameters().Length)
- throw new ArgumentException ("Invalid number of arguments for this property", "arguments");
- return true;
+ throw new ArgumentException ("Parameter must be static");
+ break;
}
- return false;
}
public ICollection Arguments {
@@ -121,36 +116,17 @@ namespace System.ComponentModel.Design.Serialization {
get { return member; }
}
- private bool HasThis ()
- {
- if (member is ConstructorInfo)
- return false;
- MethodInfo mi = (member as MethodInfo);
- if (mi != null)
- return !mi.IsStatic;
- FieldInfo fi = (member as FieldInfo);
- if (fi != null)
- return !fi.IsStatic;
- PropertyInfo pi = (member as PropertyInfo);
- if (pi != null)
- return !pi.GetGetMethod ().IsStatic;
- return true;
- }
-
public object Invoke()
{
+ if (member == null)
+ return null;
+
object[] parsearguments;
if (arguments == null)
parsearguments = new object[0];
- else if (HasThis ()) {
- parsearguments = new object[arguments.Count - 1];
+ else {
+ parsearguments = new object[arguments.Count];
arguments.CopyTo (parsearguments, 0);
- } else {
- parsearguments = (arguments as object[]);
- if (parsearguments == null) {
- parsearguments = new object[arguments.Count];
- arguments.CopyTo (parsearguments, 0);
- }
}
//MemberInfo member;
diff --git a/mcs/class/System/Test/System.ComponentModel.Design.Serialization/ChangeLog b/mcs/class/System/Test/System.ComponentModel.Design.Serialization/ChangeLog
index 7255bbf1a37..b90ad03a6b5 100644
--- a/mcs/class/System/Test/System.ComponentModel.Design.Serialization/ChangeLog
+++ b/mcs/class/System/Test/System.ComponentModel.Design.Serialization/ChangeLog
@@ -1,3 +1,8 @@
+2007-07-21 Gert Driesen <drieseng@users.sourceforge.net>
+
+ * InstanceDescriptorTest.cs: Improved ctor tests. Added tests for
+ properties and fields.
+
2005-10-18 Sebastien Pouliot <sebastien@ximian.com>
* InstanceDescriptorCas.cs: Added more tests for LinkDemand as it just
diff --git a/mcs/class/System/Test/System.ComponentModel.Design.Serialization/InstanceDescriptorTest.cs b/mcs/class/System/Test/System.ComponentModel.Design.Serialization/InstanceDescriptorTest.cs
index 9792ab64165..7fe4c29dbf3 100644
--- a/mcs/class/System/Test/System.ComponentModel.Design.Serialization/InstanceDescriptorTest.cs
+++ b/mcs/class/System/Test/System.ComponentModel.Design.Serialization/InstanceDescriptorTest.cs
@@ -34,6 +34,7 @@ using System.ComponentModel;
using System.ComponentModel.Design.Serialization;
using System.Globalization;
using System.Reflection;
+using System.Threading;
namespace MonoTests.System.ComponentModel.Design.Serialization {
@@ -50,20 +51,40 @@ namespace MonoTests.System.ComponentModel.Design.Serialization {
}
[Test]
- public void Constructor_Null_ICollection ()
+ public void Constructor0_Arguments_Mismatch ()
{
- InstanceDescriptor id = new InstanceDescriptor (null, new object[] { });
- Assert.AreEqual (0, id.Arguments.Count, "Arguments");
- Assert.IsTrue (id.IsComplete, "IsComplete");
- Assert.IsNull (id.MemberInfo, "MemberInfo");
+ try {
+ new InstanceDescriptor (ci, null);
+ Assert.Fail ("#1");
+ } catch (ArgumentException ex) {
+ // Length mismatch
+ Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#B2");
+ Assert.IsNull (ex.InnerException, "#B3");
+ Assert.IsNotNull (ex.Message, "#B4");
+ Assert.IsNull (ex.ParamName, "#B5");
+ }
}
[Test]
- [ExpectedException (typeof (ArgumentException))]
- public void Constructor_MemberInfo_Null ()
+ public void Constructor0_MemberInfo_Type ()
{
- new InstanceDescriptor (ci, null);
- // mismatch for required parameters
+ Type type = typeof (Uri);
+ InstanceDescriptor id = new InstanceDescriptor (type,
+ new object [] { url });
+ Assert.AreEqual (1, id.Arguments.Count, "#1");
+ Assert.IsTrue (id.IsComplete, "#2");
+ Assert.AreSame (type, id.MemberInfo, "#3");
+ Assert.IsNull (id.Invoke (), "#4");
+ }
+
+ [Test]
+ public void Constructor_Null_ICollection ()
+ {
+ InstanceDescriptor id = new InstanceDescriptor (null, new object[] { });
+ Assert.AreEqual (0, id.Arguments.Count, "#1");
+ Assert.IsTrue (id.IsComplete, "#2");
+ Assert.IsNull (id.MemberInfo, "#3");
+ Assert.IsNull (id.Invoke (), "#4");
}
[Test]
@@ -81,9 +102,10 @@ namespace MonoTests.System.ComponentModel.Design.Serialization {
public void Constructor_Null_ICollection_Boolean ()
{
InstanceDescriptor id = new InstanceDescriptor (null, new object[] { }, true);
- Assert.AreEqual (0, id.Arguments.Count, "Arguments");
- Assert.IsTrue (id.IsComplete, "IsComplete");
- Assert.IsNull (id.MemberInfo, "MemberInfo");
+ Assert.AreEqual (0, id.Arguments.Count, "#1");
+ Assert.IsTrue (id.IsComplete, "#2");
+ Assert.IsNull (id.MemberInfo, "#3");
+ Assert.IsNull (id.Invoke (), "#4");
}
[Test]
@@ -104,5 +126,152 @@ namespace MonoTests.System.ComponentModel.Design.Serialization {
Uri uri = (Uri) id.Invoke ();
Assert.AreEqual (url, uri.AbsoluteUri, "Invoke");
}
+
+ [Test]
+ public void Field_Arguments_Empty ()
+ {
+ FieldInfo fi = typeof (Uri).GetField ("SchemeDelimiter");
+
+ InstanceDescriptor id = new InstanceDescriptor (fi, new object [0]);
+ Assert.AreEqual (0, id.Arguments.Count, "#1");
+ Assert.IsTrue (id.IsComplete, "#2");
+ Assert.AreSame (fi, id.MemberInfo, "#3");
+ Assert.IsNotNull (id.Invoke (), "#4");
+ }
+
+ [Test]
+ public void Field_Arguments_Mismatch ()
+ {
+ FieldInfo fi = typeof (Uri).GetField ("SchemeDelimiter");
+
+ try {
+ new InstanceDescriptor (fi, new object [] { url });
+ Assert.Fail ("#1");
+ } catch (ArgumentException ex) {
+ // Parameter must be static
+ Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
+ Assert.IsNull (ex.InnerException, "#3");
+ Assert.IsNotNull (ex.Message, "#4");
+ Assert.IsNull (ex.ParamName, "#5");
+ }
+ }
+
+ [Test]
+ public void Field_Arguments_Null ()
+ {
+ FieldInfo fi = typeof (Uri).GetField ("SchemeDelimiter");
+
+ InstanceDescriptor id = new InstanceDescriptor (fi, null);
+ Assert.AreEqual (0, id.Arguments.Count, "#1");
+ Assert.IsTrue (id.IsComplete, "#2");
+ Assert.AreSame (fi, id.MemberInfo, "#3");
+ Assert.IsNotNull (id.Invoke (), "#4");
+ }
+
+ [Test]
+ public void Field_MemberInfo_NonStatic ()
+ {
+ FieldInfo fi = typeof (InstanceField).GetField ("Name");
+
+ try {
+ new InstanceDescriptor (fi, null);
+ Assert.Fail ("#1");
+ } catch (ArgumentException ex) {
+ // Parameter must be static
+ Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
+ Assert.IsNull (ex.InnerException, "#3");
+ Assert.IsNotNull (ex.Message, "#4");
+ Assert.IsNull (ex.ParamName, "#5");
+ }
+ }
+
+ [Test]
+ public void Property_Arguments_Mismatch ()
+ {
+ PropertyInfo pi = typeof (Thread).GetProperty ("CurrentPrincipal");
+
+ InstanceDescriptor id = new InstanceDescriptor (pi, new object [] { url });
+ Assert.AreEqual (1, id.Arguments.Count, "#1");
+ object [] arguments = new object [id.Arguments.Count];
+ id.Arguments.CopyTo (arguments, 0);
+ Assert.AreSame (url, arguments [0], "#2");
+ Assert.IsTrue (id.IsComplete, "#3");
+ Assert.AreSame (pi, id.MemberInfo, "#4");
+ try {
+ id.Invoke ();
+ Assert.Fail ("#5");
+ } catch (TargetParameterCountException) {
+ }
+ }
+
+ [Test]
+ public void Property_Arguments_Null ()
+ {
+ PropertyInfo pi = typeof (Thread).GetProperty ("CurrentPrincipal");
+
+ InstanceDescriptor id = new InstanceDescriptor (pi, null);
+ Assert.AreEqual (0, id.Arguments.Count, "#1");
+ Assert.IsTrue (id.IsComplete, "#2");
+ Assert.AreSame (pi, id.MemberInfo, "#3");
+ Assert.IsNotNull (id.Invoke (), "#4");
+ }
+
+ [Test]
+ public void Property_MemberInfo_NonStatic ()
+ {
+ PropertyInfo pi = typeof (Uri).GetProperty ("Host");
+
+ try {
+ new InstanceDescriptor (pi, null);
+ Assert.Fail ("#A1");
+ } catch (ArgumentException ex) {
+ // Parameter must be static
+ Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#A2");
+ Assert.IsNull (ex.InnerException, "#A3");
+ Assert.IsNotNull (ex.Message, "#A4");
+ Assert.IsNull (ex.ParamName, "#A5");
+ }
+
+ try {
+ new InstanceDescriptor (pi, null, false);
+ Assert.Fail ("#B1");
+ } catch (ArgumentException ex) {
+ // Parameter must be static
+ Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#B2");
+ Assert.IsNull (ex.InnerException, "#B3");
+ Assert.IsNotNull (ex.Message, "#B4");
+ Assert.IsNull (ex.ParamName, "#B5");
+ }
+ }
+
+ [Test]
+ public void Property_MemberInfo_WriteOnly ()
+ {
+ PropertyInfo pi = typeof (WriteOnlyProperty).GetProperty ("Name");
+
+ try {
+ new InstanceDescriptor (pi, null);
+ Assert.Fail ("#1");
+ } catch (ArgumentException ex) {
+ // Parameter must be readable
+ Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
+ Assert.IsNull (ex.InnerException, "#3");
+ Assert.IsNotNull (ex.Message, "#4");
+ Assert.IsNull (ex.ParamName, "#5");
+ }
+ }
+
+ class WriteOnlyProperty
+ {
+ public static string Name {
+ set {
+ }
+ }
+ }
+
+ class InstanceField
+ {
+ public string Name;
+ }
}
}