* Convert.cs: Do not throw InvalidCastException if IConvertible.ToType
authorGert Driesen <drieseng@users.sourceforge.net>
Sat, 7 Mar 2009 09:10:04 +0000 (09:10 -0000)
committerGert Driesen <drieseng@users.sourceforge.net>
Sat, 7 Mar 2009 09:10:04 +0000 (09:10 -0000)
returns null.
* ConvertTest.cs: Merged and improved test for bug #481687.
* ConvertTest2.cs: Merged into ConvertTest.cs.

svn path=/trunk/mcs/; revision=128830

mcs/class/corlib/System/ChangeLog
mcs/class/corlib/System/Convert.cs
mcs/class/corlib/Test/System/ChangeLog
mcs/class/corlib/Test/System/ConvertTest.cs
mcs/class/corlib/Test/System/ConvertTest2.cs [deleted file]

index 76935d91bbaf0b9c43d80240392c3e39a316185c..5aee180fb09cfba7778447de2708377f0b2c052d 100644 (file)
@@ -1,3 +1,8 @@
+2009-03-07  Gert Driesen  <drieseng@users.sourceforge.net>
+
+       * Convert.cs: Do not throw InvalidCastException if IConvertible.ToType
+       returns null.
+
 2009-03-06  AndrĂ©s G. Aragoneses  <aaragoneses@novell.com>
 
        * Convert.cs: Correct typo in exception message.
index 346cee3367a644bfe2e3006fab40437e9fc37728..4329219e56d2d625558c6ee345fd870a6f348cf2 100644 (file)
@@ -2906,15 +2906,7 @@ namespace System {
                                else if (conversionType == conversionTable[18]) // 18 TypeCode.String
                                        return (object) convertValue.ToString (provider);
                                else {
-                                       object ret = convertValue.ToType (conversionType, provider);
-                                       if (ret != null)
-                                               return ret;
-                                       else
-                                       {
-                                               throw new InvalidCastException (
-                                                       String.Format (Locale.GetText ("Unknown target conversion type from {0} to {1}"), 
-                                                                      value.GetType (), conversionType));
-                                       }
+                                       return convertValue.ToType (conversionType, provider);
                                }
                        } else
                                // Not in the conversion table
index 27eda7cd42f63ca951edea3e9f95aed4eb47b41f..3b3828c41118ee4df28c7f8b308fca531e0ebce2 100644 (file)
@@ -1,6 +1,11 @@
+2009-03-07  Gert Driesen  <drieseng@users.sourceforge.net>
+
+       * ConvertTest.cs: Merged and improved test for bug #481687.
+       * ConvertTest2.cs: Merged into ConvertTest.cs.
+
 2009-02-27  Rodrigo Kumpera  <rkumpera@novell.com>
 
-       EnumTest.cs: Tests for CompareTo.
+       EnumTest.cs: Tests for CompareTo.
 
 2009-02-02  Rodrigo Kumpera  <rkumpera@novell.com>
 
index 22258153447f0e7461807f62b80cb6e19b134393..4aaf3e7d8b59235aa2b935775cf8ad1242a25d84 100644 (file)
@@ -4596,5 +4596,147 @@ namespace MonoTests.System {
                {
                        Convert.ToUInt64 ("-", 16);
                }
+
+               [Test] // bug #481687
+               public void ChangeType_Value_IConvertible ()
+               {
+                       BitmapStatus bitmapStatus = new BitmapStatus (3);
+                       Image c1 = Convert.ChangeType (bitmapStatus, typeof (Image)) as Image;
+                       AssertNotNull ("#A1", c1);
+                       AssertEquals ("#A2", 32, c1.ColorDepth);
+
+                       bitmapStatus.ConvertToImage = false;
+                       object c2 = Convert.ChangeType (bitmapStatus, typeof (Image));
+                       AssertNull ("#B", c2);
+
+                       object c3 = Convert.ChangeType (bitmapStatus, typeof (int));
+                       AssertNotNull ("#C1", c3);
+                       AssertEquals ("#C2", 3, c3);
+               }
+       }
+
+       public class Image
+       {
+               private int colorDepth;
+
+               public Image ()
+               {
+                       colorDepth = 8;
+               }
+
+               public Image (int colorDepth)
+               {
+                       this.colorDepth = colorDepth;
+               }
+
+               public int ColorDepth {
+                       get { return colorDepth; }
+               }
+       }
+
+       public class BitmapStatus : IConvertible
+       {
+               protected int m_Status;
+               private bool convertToImage;
+
+               public BitmapStatus (int status)
+               {
+                       m_Status = status;
+                       convertToImage = true;
+               }
+
+               public bool ConvertToImage {
+                       get { return convertToImage; }
+                       set { convertToImage = value; }
+               }
+
+               TypeCode IConvertible.GetTypeCode ()
+               {
+                       return TypeCode.Int32;
+               }
+
+               bool IConvertible.ToBoolean (IFormatProvider provider)
+               {
+                       return (bool)((IConvertible)this).ToType (typeof (bool), provider);
+               }
+
+               byte IConvertible.ToByte (IFormatProvider provider)
+               {
+                       return (byte)((IConvertible)this).ToType (typeof (byte), provider);
+               }
+
+               char IConvertible.ToChar (IFormatProvider provider)
+               {
+                       return (char)((IConvertible)this).ToType (typeof (char), provider);
+               }
+
+               DateTime IConvertible.ToDateTime (IFormatProvider provider)
+               {
+                       return (DateTime)((IConvertible)this).ToType (typeof (DateTime), provider);
+               }
+
+               decimal IConvertible.ToDecimal (IFormatProvider provider)
+               {
+                       return (decimal)((IConvertible)this).ToType (typeof (decimal), provider);
+               }
+
+               double IConvertible.ToDouble (IFormatProvider provider)
+               {
+                       return (double)((IConvertible)this).ToType (typeof (double), provider);
+               }
+
+               short IConvertible.ToInt16 (IFormatProvider provider)
+               {
+                       return (short)((IConvertible)this).ToType (typeof (short), provider);
+               }
+
+               int IConvertible.ToInt32 (IFormatProvider provider)
+               {
+                       return (int)m_Status;
+               }
+
+               long IConvertible.ToInt64 (IFormatProvider provider)
+               {
+                       return (long)((IConvertible)this).ToType (typeof (long), provider);
+               }
+
+               sbyte IConvertible.ToSByte (IFormatProvider provider)
+               {
+                       return (sbyte)((IConvertible)this).ToType (typeof (sbyte), provider);
+               }
+
+               float IConvertible.ToSingle (IFormatProvider provider)
+               {
+                       return (float)((IConvertible)this).ToType (typeof (float), provider);
+               }
+
+               string IConvertible.ToString (IFormatProvider provider)
+               {
+                       return (string)((IConvertible)this).ToType (typeof (string), provider);
+               }
+
+               object IConvertible.ToType (Type conversionType, IFormatProvider provider)
+               {
+                       if (ConvertToImage && conversionType == typeof (Image))
+                               return new Image (32);
+                       else if (conversionType.IsAssignableFrom (typeof (int)))
+                               return Convert.ChangeType (1, conversionType, provider);
+                       return null;
+               }
+
+               ushort IConvertible.ToUInt16 (IFormatProvider provider)
+               {
+                       return (ushort)((IConvertible)this).ToType (typeof (ushort), provider);
+               }
+
+               uint IConvertible.ToUInt32 (IFormatProvider provider)
+               {
+                       return (uint)((IConvertible)this).ToType (typeof (uint), provider);
+               }
+
+               ulong IConvertible.ToUInt64 (IFormatProvider provider)
+               {
+                       return (ulong)((IConvertible)this).ToType (typeof (ulong), provider);
+               }
        }
 }
diff --git a/mcs/class/corlib/Test/System/ConvertTest2.cs b/mcs/class/corlib/Test/System/ConvertTest2.cs
deleted file mode 100644 (file)
index e6b0202..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-using NUnit.Framework;
-using System;
-using System.Globalization;
-
-namespace MonoTests.System {
-
-       [TestFixture]
-       public class ConvertTest : Assertion {
-
-               //Bug: 481687
-               [Test]
-               public void TestConvertToType ()
-               {
-                       BitmapStatus bitmapStatus = new BitmapStatus(1);
-                       Image i = System.Convert.ChangeType(bitmapStatus, typeof(Image)) as Image;
-                       AssertNotNull ("convert result", i);
-               }
-       }
-
-       public class Image {
-       }
-       
-       public class BitmapStatus : IConvertible
-       {
-               protected int m_Status;
-       
-               public BitmapStatus(int status)
-               {
-                       m_Status = status;
-               }
-       
-               TypeCode IConvertible.GetTypeCode()
-               {
-                       return TypeCode.Int32;
-               }
-       
-               bool IConvertible.ToBoolean(IFormatProvider provider)
-               {
-                       return (bool)((IConvertible)this).ToType(typeof(bool), provider);
-               }
-       
-               byte IConvertible.ToByte(IFormatProvider provider)
-               {
-                       return (byte)((IConvertible)this).ToType(typeof(byte), provider);
-               }
-       
-               char IConvertible.ToChar(IFormatProvider provider)
-               {
-                       return (char)((IConvertible)this).ToType(typeof(char), provider);
-               }
-       
-               DateTime IConvertible.ToDateTime(IFormatProvider provider)
-               {
-                       return (DateTime)((IConvertible)this).ToType(typeof(DateTime), provider);
-               }
-       
-               decimal IConvertible.ToDecimal(IFormatProvider provider)
-               {
-                       return (decimal)((IConvertible)this).ToType(typeof(decimal), provider);
-               }
-       
-               double IConvertible.ToDouble(IFormatProvider provider)
-               {
-                       return (double)((IConvertible)this).ToType(typeof(double), provider);
-               }
-       
-               short IConvertible.ToInt16(IFormatProvider provider)
-               {
-                       return (short)((IConvertible)this).ToType(typeof(short), provider);
-               }
-       
-               int IConvertible.ToInt32(IFormatProvider provider)
-               {
-                       return (int)m_Status;
-               }
-       
-               long IConvertible.ToInt64(IFormatProvider provider)
-               {
-                       return (long)((IConvertible)this).ToType(typeof(long), provider);
-               }
-       
-               sbyte IConvertible.ToSByte(IFormatProvider provider)
-               {
-                       return (sbyte)((IConvertible)this).ToType(typeof(sbyte), provider);
-               }
-       
-               float IConvertible.ToSingle(IFormatProvider provider)
-               {
-                       return (float)((IConvertible)this).ToType(typeof(float), provider);
-               }
-       
-               string IConvertible.ToString(IFormatProvider provider)
-               {
-                       return (string)((IConvertible)this).ToType(typeof(string), provider);
-               }
-       
-               object IConvertible.ToType(Type conversionType, IFormatProvider provider)
-               {
-                       if (conversionType == typeof(Image))
-                               return new Image ();
-                       
-                       else if (conversionType.IsAssignableFrom(typeof(int)))
-                               return Convert.ChangeType(1, conversionType, provider);
-                       return null;
-               }
-       
-               ushort IConvertible.ToUInt16(IFormatProvider provider)
-               {
-                       return (ushort)((IConvertible)this).ToType(typeof(ushort), provider);
-               }
-       
-               uint IConvertible.ToUInt32(IFormatProvider provider)
-               {
-                       return (uint)((IConvertible)this).ToType(typeof(uint), provider);
-               }
-       
-               ulong IConvertible.ToUInt64(IFormatProvider provider)
-               {
-                       return (ulong)((IConvertible)this).ToType(typeof(ulong), provider);
-               }
-       
-       }
-               
-}
-