1227 lines
34 KiB
C#
Raw Normal View History

//
// System.ComponentModel.PropertyDescriptor test cases
//
// Authors:
// Chris Toshok (toshok@ximian.com)
// Gert Driesen (drieseng@users.sourceforge.net)
//
// (c) 2006 Novell, Inc. (http://www.novell.com/)
//
using System;
using System.Collections;
using System.ComponentModel;
using DescriptionAttribute = System.ComponentModel.DescriptionAttribute;
using System.ComponentModel.Design;
using System.Globalization;
using System.Reflection;
using System.Runtime.InteropServices;
#if !MOBILE
using System.Drawing.Design;
#endif
using NUnit.Framework;
namespace MonoTests.System.ComponentModel
{
internal class MyVersionTypeConverter : TypeConverter
{
}
class VirtPropParent
{
string _someProperty;
public virtual string SomeProperty {
get { return _someProperty; }
set { _someProperty = value; }
}
}
class VirtPropChildNoSetter : VirtPropParent
{
public override string SomeProperty {
get { return base.SomeProperty + ": modified"; }
}
}
class VirtPropChildNoGetter : VirtPropParent
{
public override string SomeProperty {
get { return base.SomeProperty + ": modified"; }
}
}
[TestFixture]
public class PropertyDescriptorTests
{
class MissingConverterType_test
{
public class NestedClass { }
[TypeConverter ("missing-type-name")]
public NestedClass Prop {
get { return null; }
}
[TypeConverter ("missing-type-name")]
public int IntProp {
get { return 5; }
}
[TypeConverter ("missing-type-name")]
public string StringProp {
get { return ""; }
}
}
class ReadOnlyProperty_test
{
public int Prop {
get { return 5; }
}
}
class ReadOnlyAttribute_test
{
[ReadOnly (true)]
public int Prop {
get { return 5; }
set { }
}
}
class ConflictingReadOnly_test
{
[ReadOnly (false)]
public int Prop {
get { return 5; }
}
}
class ShouldSerialize_public_test
{
public int Prop {
get { return 5; }
}
public bool ShouldSerializeProp()
{
return false;
}
}
class ShouldSerialize_protected_test
{
public int Prop {
get { return 5; }
}
protected bool ShouldSerializeProp()
{
return false;
}
}
class ShouldSerialize_private_test
{
public int Prop {
get { return 5; }
}
private bool ShouldSerializeProp()
{
return false;
}
}
class ShouldSerializeFalseEffectOnCanReset_test
{
public int Prop {
get { return 5; }
set { }
}
public bool ShouldSerializeProp()
{
return false;
}
public void ResetProp()
{
}
}
class ShouldSerialize_Null_Default
{
[DefaultValue (null)]
public string Prop {
get { return _prop; }
set { _prop = value; }
}
public bool SerializeProp {
get { return _serializeProp; }
set { _serializeProp = value; }
}
public bool ShouldSerializeProp ()
{
return _serializeProp;
}
private string _prop;
private bool _serializeProp;
}
class ShouldSerialize_No_Default
{
public string Prop {
get { return _prop; }
set { _prop = value; }
}
private string _prop;
}
class ShouldSerialize_ReadOnly
{
[ReadOnly (true)]
[DefaultValue ("ok")]
public string Prop1 {
get { return _prop1; }
set { _prop1 = value; }
}
[ReadOnly (false)]
public string Prop2 {
get { return _prop2; }
set { _prop2 = value; }
}
[ReadOnly (true)]
public string Prop3 {
get { return _prop3; }
set { _prop3 = value; }
}
[ReadOnly (false)]
public string Prop4 {
get { return _prop4; }
set { _prop4 = value; }
}
public string Prop5 {
get { return _prop5; }
}
[DefaultValue ("bad")]
public string Prop6 {
get { return _prop6; }
}
[ReadOnly (true)]
[DefaultValue ("good")]
public string Prop7 {
get { return _prop7; }
set { _prop7 = value; }
}
[ReadOnly (true)]
[DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
public string Prop8 {
get { return null; }
}
[ReadOnly (true)]
[DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
public string Prop9 {
get { return null; }
}
public bool SerializeProp3 {
get { return _serializeProp3; }
set { _serializeProp3 = value; }
}
public bool SerializeProp4 {
get { return _serializeProp4; }
set { _serializeProp4 = value; }
}
public bool SerializeProp5 {
get { return _serializeProp5; }
set { _serializeProp5 = value; }
}
public bool SerializeProp6 {
get { return _serializeProp6; }
set { _serializeProp6 = value; }
}
public bool SerializeProp7 {
get { return _serializeProp7; }
set { _serializeProp7 = value; }
}
public bool ShouldSerializeProp3 ()
{
return _serializeProp3;
}
public bool ShouldSerializeProp4 ()
{
return _serializeProp4;
}
public bool ShouldSerializeProp5 ()
{
return _serializeProp5;
}
public bool ShouldSerializeProp6 ()
{
return _serializeProp6;
}
public bool ShouldSerializeProp7 ()
{
return _serializeProp7;
}
public bool ShouldSerializeProp8 ()
{
return false;
}
private string _prop1;
private string _prop2;
private string _prop3;
private string _prop4;
private string _prop5 = "good";
private string _prop6 = "bad";
private string _prop7;
private bool _serializeProp3;
private bool _serializeProp4;
private bool _serializeProp5;
private bool _serializeProp6;
private bool _serializeProp7;
}
class NoSerializeOrResetProp_test
{
public int Prop {
get { return 5; }
}
}
class CanReset_public_test
{
int prop = 5;
public int Prop {
get { return prop; }
set { prop = value; }
}
public void ResetProp()
{
prop = 10;
}
}
class CanReset_protected_test
{
int prop = 5;
public int Prop {
get { return prop; }
set { prop = value; }
}
protected void ResetProp()
{
prop = 10;
}
}
class CanReset_private_test
{
int prop = 5;
public int Prop {
get { return prop; }
set { prop = value; }
}
private void ResetProp()
{
prop = 10;
}
}
class CanResetNoSetter_test
{
int prop = 5;
public int Prop {
get { return prop; }
}
private void ResetProp()
{
prop = 10;
}
}
class DisplayName_test
{
#if NET_2_0
[DisplayName ("An explicit displayname")]
#endif
public bool Explicit {
get { return false; }
}
public bool Implicit {
get { return false; }
}
}
class Converter_test
{
public virtual Version NoConverter {
get { return null; }
}
[TypeConverter (typeof(MyVersionTypeConverter))]
public virtual Version WithConverter {
get { return null; }
}
[TypeConverter ("MonoTests.System.ComponentModel.MyVersionTypeConverter")]
public virtual Version WithConverterNamed {
get { return null; }
}
#if MOBILE
[TypeConverter("System.ComponentModel.CharConverter, System, Version=2.0.5.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
#elif NET_4_0
[TypeConverter("System.ComponentModel.CharConverter, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
#else
[TypeConverter("System.ComponentModel.CharConverter, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
#endif
public virtual Version WithConverterNamedAssmQuald {
get { return null; }
}
public int WithDefaultConverter {
get { return 0; }
}
}
class ConverterSubclassNotOverridenProperties_test : Converter_test
{
}
class ConverterSubclassOverridenProperties_test : Converter_test
{
public override Version WithConverter {
get { return null; }
}
public override Version WithConverterNamed {
get { return null; }
}
}
class ConverterEmptyConvertersOnOveriddenProperties : Converter_test
{
[TypeConverter]
public override Version WithConverter {
get { return null; }
}
[TypeConverter]
public override Version WithConverterNamed {
get { return null; }
}
}
private ArrayList _invokedHandlers;
[SetUp]
public void SetUp ()
{
_invokedHandlers = new ArrayList ();
}
void Reset ()
{
_invokedHandlers.Clear ();
}
[Test]
public void Attributes ()
{
PropertyDescriptorCollection properties;
PropertyDescriptor pd;
properties = TypeDescriptor.GetProperties (typeof (TestBase));
pd = properties ["PropBase3"];
Assert.IsNull (FindAttribute (pd, typeof (DescriptionAttribute)), "#A1");
Assert.IsNotNull (FindAttribute (pd, typeof (PropTestAttribute)), "#A2");
pd = properties ["PropBase2"];
Assert.IsNotNull (FindAttribute (pd, typeof (DescriptionAttribute)), "#B1");
Assert.IsNotNull (FindAttribute (pd, typeof (PropTestAttribute)), "#B2");
pd = properties ["PropBase1"];
Assert.IsNull (FindAttribute (pd, typeof (DescriptionAttribute)), "#C1");
Assert.IsNotNull (FindAttribute (pd, typeof (PropTestAttribute)), "#C2");
properties = TypeDescriptor.GetProperties (typeof (TestSub));
pd = properties ["PropBase3"];
Assert.IsNull (FindAttribute (pd, typeof (DescriptionAttribute)), "#D1");
Assert.IsNotNull (FindAttribute (pd, typeof (PropTestAttribute)), "#D2");
pd = properties ["PropBase2"];
Assert.IsNotNull (FindAttribute (pd, typeof (DescriptionAttribute)), "#E1");
Assert.IsNotNull (FindAttribute (pd, typeof (PropTestAttribute)), "#E2");
pd = properties ["PropBase1"];
Assert.IsNull (FindAttribute (pd, typeof (DescriptionAttribute)), "#F1");
Assert.IsNotNull (FindAttribute (pd, typeof (PropTestAttribute)), "#F2");
}
[Test]
public void VirtualPropertyDontOverrideSetter ()
{
VirtPropChildNoSetter c = new VirtPropChildNoSetter ();
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties (c);
foreach (PropertyDescriptor pd in pdc) {
if (pd.Name != "SomeProperty")
continue;
pd.SetValue (c, "testing2");
pd.GetValue (c);
}
}
[Test]
public void VirtualPropertyDontOverrideGetter ()
{
VirtPropChildNoGetter c = new VirtPropChildNoGetter ();
PropertyDescriptorCollection pdc = TypeDescriptor.GetProperties (c);
foreach (PropertyDescriptor pd in pdc) {
if (pd.Name != "SomeProperty")
continue;
pd.SetValue (c, "testing2");
pd.GetValue (c);
}
}
[Test]
public void MissingTypeConverter ()
{
PropertyDescriptor p1 = TypeDescriptor.GetProperties (typeof (MissingConverterType_test))["Prop"];
PropertyDescriptor p2 = TypeDescriptor.GetProperties (typeof (MissingConverterType_test))["IntProp"];
PropertyDescriptor p3 = TypeDescriptor.GetProperties (typeof (MissingConverterType_test))["StringProp"];
Assert.AreEqual (typeof (TypeConverter), p1.Converter.GetType (), "1");
Assert.AreEqual (typeof (Int32Converter), p2.Converter.GetType (), "2");
Assert.AreEqual (typeof (StringConverter), p3.Converter.GetType (), "3");
}
[Test]
public void ConverterTest ()
{
Assert.AreEqual (typeof (TypeConverter),
TypeDescriptor.GetProperties (typeof (Converter_test))["NoConverter"].Converter.GetType (), "#1");
Assert.AreEqual (typeof (MyVersionTypeConverter),
TypeDescriptor.GetProperties (typeof (Converter_test))["WithConverter"].Converter.GetType (), "#2");
Assert.AreEqual (typeof (MyVersionTypeConverter),
TypeDescriptor.GetProperties (typeof (Converter_test))["WithConverterNamed"].Converter.GetType (), "#3");
Assert.AreEqual (typeof (CharConverter),
TypeDescriptor.GetProperties (typeof (Converter_test))["WithConverterNamedAssmQuald"].Converter.GetType (), "#4");
Assert.AreEqual (typeof (Int32Converter),
TypeDescriptor.GetProperties (typeof (Converter_test))["WithDefaultConverter"].Converter.GetType (), "#5");
Assert.AreEqual (typeof (TypeConverter),
TypeDescriptor.GetProperties (typeof (ConverterSubclassNotOverridenProperties_test))["NoConverter"].Converter.GetType (), "#6");
Assert.AreEqual (typeof (MyVersionTypeConverter),
TypeDescriptor.GetProperties (typeof (ConverterSubclassNotOverridenProperties_test))["WithConverter"].Converter.GetType (), "#7");
Assert.AreEqual (typeof (MyVersionTypeConverter),
TypeDescriptor.GetProperties (typeof (ConverterSubclassNotOverridenProperties_test))["WithConverterNamed"].Converter.GetType (), "#8");
Assert.AreEqual (typeof (CharConverter),
TypeDescriptor.GetProperties (typeof (ConverterSubclassNotOverridenProperties_test))["WithConverterNamedAssmQuald"].Converter.GetType (), "#9");
Assert.AreEqual (typeof (Int32Converter),
TypeDescriptor.GetProperties (typeof (ConverterSubclassNotOverridenProperties_test))["WithDefaultConverter"].Converter.GetType (), "#10");
Assert.AreEqual (typeof (TypeConverter),
TypeDescriptor.GetProperties (typeof (ConverterSubclassOverridenProperties_test))["NoConverter"].Converter.GetType (), "#11");
Assert.AreEqual (typeof (MyVersionTypeConverter),
TypeDescriptor.GetProperties (typeof (ConverterSubclassOverridenProperties_test))["WithConverter"].Converter.GetType (), "#12");
Assert.AreEqual (typeof (MyVersionTypeConverter),
TypeDescriptor.GetProperties (typeof (ConverterSubclassOverridenProperties_test))["WithConverterNamed"].Converter.GetType (), "#13");
Assert.AreEqual (typeof (CharConverter),
TypeDescriptor.GetProperties (typeof (ConverterSubclassOverridenProperties_test))["WithConverterNamedAssmQuald"].Converter.GetType (), "#14");
Assert.AreEqual (typeof (Int32Converter),
TypeDescriptor.GetProperties (typeof (ConverterSubclassOverridenProperties_test))["WithDefaultConverter"].Converter.GetType (), "#15");
Assert.AreEqual (typeof (TypeConverter),
TypeDescriptor.GetProperties (typeof (ConverterEmptyConvertersOnOveriddenProperties))["NoConverter"].Converter.GetType (), "#116");
Assert.AreEqual (typeof (TypeConverter),
TypeDescriptor.GetProperties (typeof (ConverterEmptyConvertersOnOveriddenProperties))["WithConverter"].Converter.GetType (), "#17");
Assert.AreEqual (typeof (TypeConverter),
TypeDescriptor.GetProperties (typeof (ConverterEmptyConvertersOnOveriddenProperties))["WithConverterNamed"].Converter.GetType (), "#18");
Assert.AreEqual (typeof (CharConverter),
TypeDescriptor.GetProperties (typeof (ConverterEmptyConvertersOnOveriddenProperties))["WithConverterNamedAssmQuald"].Converter.GetType (), "#19");
Assert.AreEqual (typeof (Int32Converter),
TypeDescriptor.GetProperties (typeof (ConverterEmptyConvertersOnOveriddenProperties))["WithDefaultConverter"].Converter.GetType (), "#20");
}
[Test]
public void ShouldSerializeTest_public ()
{
PropertyDescriptor p = TypeDescriptor.GetProperties (typeof (ShouldSerialize_public_test))["Prop"];
ShouldSerialize_public_test test = new ShouldSerialize_public_test ();
Assert.IsFalse (p.ShouldSerializeValue (test), "1");
}
[Test]
public void ShouldSerializeTest_protected ()
{
PropertyDescriptor p = TypeDescriptor.GetProperties (typeof (ShouldSerialize_protected_test))["Prop"];
ShouldSerialize_protected_test test = new ShouldSerialize_protected_test ();
Assert.IsFalse (p.ShouldSerializeValue (test), "1");
}
[Test]
public void ShouldSerializeTest_private ()
{
PropertyDescriptor p = TypeDescriptor.GetProperties (typeof (ShouldSerialize_protected_test))["Prop"];
ShouldSerialize_protected_test test = new ShouldSerialize_protected_test ();
Assert.IsFalse (p.ShouldSerializeValue (test), "1");
}
[Test]
public void ShouldSerializeTest_No_Default ()
{
PropertyDescriptor p = TypeDescriptor.GetProperties (typeof (ShouldSerialize_No_Default)) ["Prop"];
ShouldSerialize_No_Default test = new ShouldSerialize_No_Default ();
Assert.IsTrue (p.ShouldSerializeValue (test), "#1");
test.Prop = "whatever";
Assert.IsTrue (p.ShouldSerializeValue (test), "#2");
}
[Test]
public void ShouldSerializeTest_Null_Default ()
{
PropertyDescriptor p = TypeDescriptor.GetProperties (typeof (ShouldSerialize_Null_Default)) ["Prop"];
ShouldSerialize_Null_Default test = new ShouldSerialize_Null_Default ();
Assert.IsFalse (p.ShouldSerializeValue (test), "#1");
test.SerializeProp = true;
Assert.IsFalse (p.ShouldSerializeValue (test), "#2");
test.Prop = "whatever";
Assert.IsTrue (p.ShouldSerializeValue (test), "#3");
test.SerializeProp = false;
Assert.IsTrue (p.ShouldSerializeValue (test), "#4");
}
[Test]
public void ShouldSerializeTest_ReadOnly ()
{
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties (
typeof (ShouldSerialize_ReadOnly));
ShouldSerialize_ReadOnly test = new ShouldSerialize_ReadOnly ();
PropertyDescriptor prop1PD = properties ["Prop1"];
PropertyDescriptor prop2PD = properties ["Prop2"];
PropertyDescriptor prop3PD = properties ["Prop3"];
PropertyDescriptor prop4PD = properties ["Prop4"];
PropertyDescriptor prop5PD = properties ["Prop5"];
PropertyDescriptor prop6PD = properties ["Prop6"];
PropertyDescriptor prop7PD = properties ["Prop7"];
PropertyDescriptor prop8PD = properties ["Prop8"];
PropertyDescriptor prop9PD = properties ["Prop9"];
Assert.IsFalse (prop1PD.ShouldSerializeValue (test), "#A1");
Assert.IsTrue (prop2PD.ShouldSerializeValue (test), "#A2");
Assert.IsFalse (prop3PD.ShouldSerializeValue (test), "#A3");
Assert.IsFalse (prop4PD.ShouldSerializeValue (test), "#A4");
Assert.IsFalse (prop5PD.ShouldSerializeValue (test), "#A5");
Assert.IsFalse (prop6PD.ShouldSerializeValue (test), "#A6");
Assert.IsFalse (prop7PD.ShouldSerializeValue (test), "#A7");
test.Prop1 = "whatever";
Assert.IsFalse (prop1PD.ShouldSerializeValue (test), "#B1");
test.Prop2 = "whatever";
Assert.IsTrue (prop2PD.ShouldSerializeValue (test), "#B2");
test.Prop3 = "whatever";
Assert.IsFalse (prop3PD.ShouldSerializeValue (test), "#B3");
test.Prop4 = "whatever";
Assert.IsFalse (prop4PD.ShouldSerializeValue (test), "#B4");
test.Prop7 = "whatever";
Assert.IsFalse (prop7PD.ShouldSerializeValue (test), "#B5");
test.Prop1 = "ok";
Assert.IsFalse (prop1PD.ShouldSerializeValue (test), "#C1");
test.SerializeProp3 = true;
Assert.IsTrue (prop3PD.ShouldSerializeValue (test), "#C2");
test.SerializeProp4 = true;
Assert.IsTrue (prop4PD.ShouldSerializeValue (test), "#C3");
test.SerializeProp5 = true;
Assert.IsTrue (prop5PD.ShouldSerializeValue (test), "#C4");
test.SerializeProp6 = true;
Assert.IsTrue (prop6PD.ShouldSerializeValue (test), "#C5");
test.Prop7 = "good";
Assert.IsFalse (prop7PD.ShouldSerializeValue (test), "#C6");
test.SerializeProp7 = true;
Assert.IsTrue (prop7PD.ShouldSerializeValue (test), "#C7");
test.Prop7 = "good";
Assert.IsTrue (prop7PD.ShouldSerializeValue (test), "#C8");
// has both DesignerSerializationVisibility.Content and ShouldSerialize { return false }
Assert.IsFalse (prop8PD.ShouldSerializeValue (test), "#D1");
// has DesignerSerializationVisibility.Content, no ShouldSerialize
Assert.IsTrue (prop9PD.ShouldSerializeValue (test), "#D2");
}
[Test]
public void CanResetTest_public ()
{
PropertyDescriptor p = TypeDescriptor.GetProperties (typeof (CanReset_public_test))["Prop"];
CanReset_public_test test = new CanReset_public_test ();
Assert.IsTrue (p.CanResetValue (test), "1");
Assert.AreEqual (5, test.Prop, "2");
p.ResetValue (test);
Assert.AreEqual (10, test.Prop, "3");
}
[Test]
public void CanResetTest_protected ()
{
PropertyDescriptor p = TypeDescriptor.GetProperties (typeof (CanReset_protected_test))["Prop"];
CanReset_protected_test test = new CanReset_protected_test ();
Assert.IsTrue (p.CanResetValue (test), "1");
Assert.AreEqual (5, test.Prop, "2");
p.ResetValue (test);
Assert.AreEqual (10, test.Prop, "3");
}
[Test]
public void CanResetTest_private ()
{
PropertyDescriptor p = TypeDescriptor.GetProperties (typeof (CanReset_private_test))["Prop"];
CanReset_private_test test = new CanReset_private_test ();
Assert.IsTrue (p.CanResetValue (test), "1");
Assert.AreEqual (5, test.Prop, "2");
p.ResetValue (test);
Assert.AreEqual (10, test.Prop, "3");
}
[Test]
public void CanResetTestNoSetterTest ()
{
PropertyDescriptor p = TypeDescriptor.GetProperties (typeof (CanResetNoSetter_test))["Prop"];
CanResetNoSetter_test test = new CanResetNoSetter_test ();
#if NET_2_0
Assert.IsFalse (p.CanResetValue (test), "1");
#else
Assert.IsTrue (p.CanResetValue (test), "1");
#endif
Assert.AreEqual (5, test.Prop, "2");
p.ResetValue (test);
Assert.AreEqual (10, test.Prop, "3");
}
[Test]
public void NoSerializeOrResetPropTest ()
{
PropertyDescriptor p = TypeDescriptor.GetProperties (typeof (NoSerializeOrResetProp_test))["Prop"];
NoSerializeOrResetProp_test test = new NoSerializeOrResetProp_test ();
Assert.IsFalse (p.CanResetValue (test), "1");
Assert.IsFalse (p.ShouldSerializeValue (test), "2");
}
[Test]
public void ShouldSerializeFalseEffectOnCanResetTest ()
{
PropertyDescriptor p = TypeDescriptor.GetProperties (typeof (ShouldSerializeFalseEffectOnCanReset_test))["Prop"];
ShouldSerializeFalseEffectOnCanReset_test test = new ShouldSerializeFalseEffectOnCanReset_test ();
Assert.IsFalse (p.ShouldSerializeValue (test), "1");
Assert.IsFalse (p.CanResetValue (test), "2");
}
[Test]
public void ReadOnlyPropertyTest ()
{
PropertyDescriptorCollection col = TypeDescriptor.GetProperties (typeof (ReadOnlyProperty_test));
Assert.IsTrue (col["Prop"].IsReadOnly, "1");
}
[Test]
public void ReadOnlyAttributeTest ()
{
PropertyDescriptorCollection col = TypeDescriptor.GetProperties (typeof (ReadOnlyAttribute_test));
Assert.IsTrue (col["Prop"].IsReadOnly, "1");
}
[Test]
public void ReadOnlyConflictingTest ()
{
PropertyDescriptorCollection col = TypeDescriptor.GetProperties (typeof (ConflictingReadOnly_test));
Assert.IsTrue (col["Prop"].IsReadOnly, "1");
}
[Test] // bug #80292
public void DisplayNameTest ()
{
PropertyDescriptor p1 = TypeDescriptor.GetProperties (typeof (DisplayName_test)) ["Explicit"];
PropertyDescriptor p2 = TypeDescriptor.GetProperties (typeof (DisplayName_test)) ["Implicit"];
#if NET_2_0
Assert.AreEqual ("An explicit displayname", p1.DisplayName, "#1");
#else
Assert.AreEqual ("Explicit", p1.DisplayName, "#1");
#endif
Assert.AreEqual ("Implicit", p2.DisplayName, "#2");
}
[Test]
public void AddValueChanged ()
{
MockPropertyDescriptor pd = new MockPropertyDescriptor (
"Name", new Attribute [0]);
object compA = new object ();
object compB = new object ();
EventHandler handlerA = new EventHandler (ValueChanged1);
EventHandler handlerB = new EventHandler (ValueChanged1);
EventHandler handlerC = new EventHandler (ValueChanged2);
pd.AddValueChanged (compA, handlerA);
pd.AddValueChanged (compA, handlerC);
pd.AddValueChanged (compA, handlerC);
pd.AddValueChanged (compA, handlerB);
pd.FireValueChanged (compA, new EventArgs ());
Assert.AreEqual (4, _invokedHandlers.Count, "#A1");
Assert.AreEqual ("ValueChanged1", _invokedHandlers [0], "#A1");
Assert.AreEqual ("ValueChanged2", _invokedHandlers [1], "#A2");
Assert.AreEqual ("ValueChanged2", _invokedHandlers [2], "#A3");
Assert.AreEqual ("ValueChanged1", _invokedHandlers [3], "#A4");
Reset ();
pd.FireValueChanged (compB, new EventArgs ());
Assert.AreEqual (0, _invokedHandlers.Count, "#B");
}
[Test]
public void AddValueChanged_Component_Null ()
{
MockPropertyDescriptor pd = new MockPropertyDescriptor (
"Name", new Attribute [0]);
try {
pd.AddValueChanged (null, new EventHandler (ValueChanged1));
Assert.Fail ("#1");
} catch (ArgumentNullException ex) {
Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.IsNotNull (ex.ParamName, "#5");
Assert.AreEqual ("component", ex.ParamName, "#6");
}
}
[Test]
public void AddValueChanged_Handler_Null ()
{
MockPropertyDescriptor pd = new MockPropertyDescriptor (
"Name", new Attribute [0]);
try {
pd.AddValueChanged (new object (), (EventHandler) null);
Assert.Fail ("#1");
} catch (ArgumentNullException ex) {
Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.IsNotNull (ex.ParamName, "#5");
Assert.AreEqual ("handler", ex.ParamName, "#6");
}
}
#if NET_2_0
[Test]
public void GetInvocationTarget_Instance_Null ()
{
MockPropertyDescriptor pd = new MockPropertyDescriptor (
"Name", new Attribute [0]);
try {
pd.GetInvocationTarget (typeof (int), null);
Assert.Fail ("#1");
} catch (ArgumentNullException ex) {
Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.IsNotNull (ex.ParamName, "#5");
Assert.AreEqual ("instance", ex.ParamName, "#6");
}
}
[Test]
public void GetInvocationTarget_Type_Null ()
{
MockPropertyDescriptor pd = new MockPropertyDescriptor (
"Name", new Attribute [0]);
try {
pd.GetInvocationTarget ((Type) null, new object ());
Assert.Fail ("#1");
} catch (ArgumentNullException ex) {
Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.IsNotNull (ex.ParamName, "#5");
Assert.AreEqual ("type", ex.ParamName, "#6");
}
}
[Test]
public void GetValueChangedHandler ()
{
object compA = new object ();
object compB = new object ();
EventHandler handlerA = new EventHandler (ValueChanged1);
EventHandler handlerB = new EventHandler (ValueChanged1);
EventHandler handlerC = new EventHandler (ValueChanged2);
MockPropertyDescriptor pd = new MockPropertyDescriptor (
"Name", new Attribute [0]);
Assert.IsNull (pd.GetValueChangedHandler (null), "#A1");
Assert.IsNull (pd.GetValueChangedHandler (compA), "#A2");
Assert.IsNull (pd.GetValueChangedHandler (compB), "#A3");
pd.AddValueChanged (compA, handlerA);
Assert.IsNull (pd.GetValueChangedHandler (null), "#B1");
Assert.AreSame (handlerA, pd.GetValueChangedHandler (compA), "#B2");
Assert.IsNull (pd.GetValueChangedHandler (compB), "#B3");
pd.AddValueChanged (compA, handlerB);
Assert.IsNull (pd.GetValueChangedHandler (null), "#C1");
EventHandler handler = pd.GetValueChangedHandler (compA);
Assert.AreEqual (2, handler.GetInvocationList ().Length, "#C2");
Assert.AreEqual (handlerA, handler.GetInvocationList () [0], "#C3");
Assert.AreEqual (handlerB, handler.GetInvocationList () [1], "#C4");
Assert.IsNull (pd.GetValueChangedHandler (compB), "#C5");
pd.AddValueChanged (compB, handlerA);
Assert.IsNull (pd.GetValueChangedHandler (null), "#D1");
handler = pd.GetValueChangedHandler (compA);
Assert.AreEqual (2, handler.GetInvocationList ().Length, "#D2");
Assert.AreSame (handlerA, pd.GetValueChangedHandler (compB), "#D3");
pd.RemoveValueChanged (compB, handlerB);
Assert.IsNull (pd.GetValueChangedHandler (null), "#E1");
handler = pd.GetValueChangedHandler (compA);
Assert.AreEqual (2, handler.GetInvocationList ().Length, "#E2");
Assert.IsNull (pd.GetValueChangedHandler (compB), "#E3");
pd.RemoveValueChanged (compB, handlerB);
Assert.IsNull (pd.GetValueChangedHandler (null), "#F1");
handler = pd.GetValueChangedHandler (compA);
Assert.AreEqual (2, handler.GetInvocationList ().Length, "#F2");
Assert.IsNull (pd.GetValueChangedHandler (compB), "#F3");
pd.RemoveValueChanged (compA, handlerC);
Assert.IsNull (pd.GetValueChangedHandler (null), "#G1");
handler = pd.GetValueChangedHandler (compA);
Assert.AreEqual (2, handler.GetInvocationList ().Length, "#G2");
Assert.IsNull (pd.GetValueChangedHandler (compB), "#G3");
pd.AddValueChanged (compA, handlerC);
Assert.IsNull (pd.GetValueChangedHandler (null), "#H1");
handler = pd.GetValueChangedHandler (compA);
Assert.AreEqual (3, handler.GetInvocationList ().Length, "#H2");
Assert.IsNull (pd.GetValueChangedHandler (compB), "#H3");
pd.RemoveValueChanged (compA, handlerB);
Assert.IsNull (pd.GetValueChangedHandler (null), "#I1");
handler = pd.GetValueChangedHandler (compA);
Assert.AreEqual (2, handler.GetInvocationList ().Length, "#I2");
Assert.AreEqual (handlerA, handler.GetInvocationList () [0], "#I3");
Assert.AreEqual (handlerC, handler.GetInvocationList () [1], "#I4");
Assert.IsNull (pd.GetValueChangedHandler (compB), "#I5");
}
#endif
[Test]
public void RemoveValueChanged ()
{
MockPropertyDescriptor pd = new MockPropertyDescriptor (
"Name", new Attribute [0]);
object compA = new object ();
object compB = new object ();
EventHandler handlerA = new EventHandler (ValueChanged1);
EventHandler handlerB = new EventHandler (ValueChanged1);
EventHandler handlerC = new EventHandler (ValueChanged2);
pd.AddValueChanged (compA, handlerA);
pd.AddValueChanged (compA, handlerC);
pd.AddValueChanged (compA, handlerC);
pd.AddValueChanged (compA, handlerB);
pd.AddValueChanged (compB, handlerC);
pd.FireValueChanged (compA, new EventArgs ());
Assert.AreEqual (4, _invokedHandlers.Count, "#A1");
pd.RemoveValueChanged (new object (), handlerC);
pd.FireValueChanged (compA, new EventArgs ());
Assert.AreEqual (8, _invokedHandlers.Count, "#A2");
Reset ();
pd.RemoveValueChanged (compA, handlerC);
pd.FireValueChanged (compA, new EventArgs ());
Assert.AreEqual (3, _invokedHandlers.Count, "#B1");
Assert.AreEqual ("ValueChanged1", _invokedHandlers [0], "#B2");
Assert.AreEqual ("ValueChanged2", _invokedHandlers [1], "#B3");
Assert.AreEqual ("ValueChanged1", _invokedHandlers [2], "#B4");
Reset ();
pd.FireValueChanged (compB, new EventArgs ());
Assert.AreEqual (1, _invokedHandlers.Count, "#C1");
Assert.AreEqual ("ValueChanged2", _invokedHandlers [0], "#C2");
Reset ();
pd.RemoveValueChanged (compB, handlerC);
pd.FireValueChanged (compB, new EventArgs ());
Assert.AreEqual (0, _invokedHandlers.Count, "#D");
}
[Test]
public void RemoveValueChanged_Component_Null ()
{
MockPropertyDescriptor pd = new MockPropertyDescriptor (
"Name", new Attribute [0]);
try {
pd.RemoveValueChanged (null, new EventHandler (ValueChanged1));
Assert.Fail ("#1");
} catch (ArgumentNullException ex) {
Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.IsNotNull (ex.ParamName, "#5");
Assert.AreEqual ("component", ex.ParamName, "#6");
}
}
[Test]
public void RemoveValueChanged_Handler_Null ()
{
MockPropertyDescriptor pd = new MockPropertyDescriptor (
"Name", new Attribute [0]);
try {
pd.RemoveValueChanged (new object (), (EventHandler) null);
Assert.Fail ("#1");
} catch (ArgumentNullException ex) {
Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
Assert.IsNull (ex.InnerException, "#3");
Assert.IsNotNull (ex.Message, "#4");
Assert.IsNotNull (ex.ParamName, "#5");
Assert.AreEqual ("handler", ex.ParamName, "#6");
}
}
void ValueChanged1 (object sender, EventArgs e)
{
_invokedHandlers.Add ("ValueChanged1");
}
void ValueChanged2 (object sender, EventArgs e)
{
_invokedHandlers.Add ("ValueChanged2");
}
static Attribute FindAttribute (PropertyDescriptor pd, Type type)
{
foreach (Attribute attr in pd.Attributes)
if (attr.GetType () == type)
return attr;
return null;
}
#if !MOBILE
class GetEditor_test
{
[Editor (typeof (UIEditor), typeof (UITypeEditor))]
public string Property {
get { return "abc"; }
set { }
}
}
class UIEditor : UITypeEditor
{
}
[Test]
public void GetEditorTest ()
{
PropertyDescriptorCollection col;
PropertyDescriptor pd;
UITypeEditor ed;
col = TypeDescriptor.GetProperties (typeof (GetEditor_test));
pd = col [0];
ed = pd.GetEditor (typeof (UITypeEditor)) as UITypeEditor;
Assert.IsNotNull (ed, "#01");
Assert.AreEqual (ed.GetType ().Name, "UIEditor", "#02");
}
#endif
class MockPropertyDescriptor : PropertyDescriptor
{
public MockPropertyDescriptor (MemberDescriptor reference)
: base (reference)
{
}
public MockPropertyDescriptor (MemberDescriptor reference, Attribute [] attrs)
: base (reference, attrs)
{
}
public MockPropertyDescriptor (string name, Attribute [] attrs)
: base (name, attrs)
{
}
public override Type ComponentType {
get { return typeof (int); }
}
public override bool IsReadOnly {
get { return false; }
}
public override Type PropertyType{
get { return typeof (DateTime); }
}
public override object GetValue (object component)
{
return null;
}
public override void SetValue (object component, object value)
{
}
public override void ResetValue (object component)
{
}
public override bool CanResetValue (object component)
{
return true;
}
public override bool ShouldSerializeValue (object component)
{
return true;
}
public void FireValueChanged (object component, EventArgs e)
{
base.OnValueChanged (component, e);
}
#if NET_2_0
public new object GetInvocationTarget (Type type, object instance)
{
return base.GetInvocationTarget (type, instance);
}
public new EventHandler GetValueChangedHandler (object component)
{
return base.GetValueChangedHandler (component);
}
#endif
}
[AttributeUsage (AttributeTargets.Field | AttributeTargets.Property)]
public class PropTestAttribute : Attribute
{
public PropTestAttribute ()
{
}
}
public class TestBase
{
[PropTest]
public int PropBase1
{
get { return 0; }
set { }
}
[PropTest]
[Description ("whatever")]
public string PropBase2
{
get { return ""; }
set { }
}
[PropTest]
public virtual string PropBase3
{
get { return ""; }
set { }
}
}
public class TestSub : TestBase
{
[PropTest]
public int PropSub1
{
get { return 0; }
set { }
}
[PropTest]
public string PropSub2
{
get { return ""; }
set { }
}
public override string PropBase3
{
get { return ""; }
set { }
}
}
}
}