Add implementation for the non-generic Queryable.AsQueryable method, and some test...
authorRoei Erez <roeie@mono-cvs.ximian.com>
Tue, 20 May 2008 10:27:34 +0000 (10:27 -0000)
committerRoei Erez <roeie@mono-cvs.ximian.com>
Tue, 20 May 2008 10:27:34 +0000 (10:27 -0000)
svn path=/trunk/mcs/; revision=103562

mcs/class/System.Core/System.Linq.Expressions/ChangeLog
mcs/class/System.Core/System.Linq.Expressions/Extensions.cs
mcs/class/System.Core/System.Linq/ChangeLog
mcs/class/System.Core/System.Linq/Queryable.cs
mcs/class/System.Core/Test/System.Linq/ChangeLog
mcs/class/System.Core/Test/System.Linq/EnumerableAsQueryableTest.cs

index d859e527c419710aa0afbf798b484b7a067e036b..4f127e1b3367564f1a2451577dad0653198691f4 100644 (file)
@@ -1,3 +1,7 @@
+2008-05-20  Roei Erez  <roeie@mainsoft.com>
+
+       * Extensions.cs: Add 'IsGenericImplementationOf' extension method
+
 2008-05-15  Jb Evain  <jbevain@novell.com>
 
        * UnaryExpression.cs, EmitContext.cs: emit convert from and
index 474479fbb4a540530eb5a4bdf82db6c0e12c5b68..97d41ba639fb4e2a6f13af5e5d36a2d6871265fd 100644 (file)
@@ -43,6 +43,14 @@ namespace System.Linq.Expressions {
                        return self.GetGenericTypeDefinition () == type;
                }
 
+               public static bool IsGenericImplementationOf (this Type self, Type type)
+               {                       
+                       foreach (Type iface in self.GetInterfaces ())
+                               if (iface.IsGenericInstanceOf (type))
+                                       return true;
+                       return false;
+               }
+
                public static bool IsAssignableTo (this Type self, Type type)
                {
                        return type.IsAssignableFrom (self) ||
index 705248b4d465f41c2dada6ba2ece3bab2b4cf5e9..2b190b0e171d659a63cd676346ceb1be7d9ddc08 100644 (file)
@@ -1,3 +1,7 @@
+2008-05-20  Roei Erez  <roeie@mainsoft.com>
+
+       * Queryable.cs: Implement the non-generic AsQureyable method.
+
 2008-05-20  Marek Safar  <marek.safar@gmail.com>
 
        * Enumerable.cs: Removed GroupBy MonoTODO.
index ff63ea18658a9ef9523f290f0d42667ee25a8581..65280120dada28372eb4778aa72c361975cd3c0d 100644 (file)
@@ -139,6 +139,9 @@ namespace System.Linq {
 
                public static IQueryable<TElement> AsQueryable<TElement> (this IEnumerable<TElement> source)
                {
+                       if (source == null)
+                               throw new ArgumentNullException ("source");
+
                        var queryable = source as IQueryable<TElement>;
                        if (queryable != null)
                                return queryable;
@@ -149,11 +152,20 @@ namespace System.Linq {
                [MonoTODO]
                public static IQueryable AsQueryable (this IEnumerable source)
                {
+                       if (source == null)
+                               throw new ArgumentNullException ("source");
+
                        var queryable = source as IQueryable;
                        if (queryable != null)
                                return queryable;
 
-                       throw new NotImplementedException ();
+                       Type sourceType = source.GetType ();
+                       if (!sourceType.IsGenericImplementationOf (typeof (IEnumerable<>)))
+                               throw new ArgumentException ("source is not IEnumerable<>");
+                       
+                       Type sourceArgType = sourceType.GetFirstGenericArgument ();
+                       return (IQueryable) Activator.CreateInstance (typeof (QueryableEnumerable<>)
+                                       .MakeGenericType (sourceArgType), source);
                }
 
                #endregion
index d0728314d09398e222f4c4a036a495c1bf3844f1..a59868a2df19d5abc873d7aab2a994eded04545f 100644 (file)
@@ -1,3 +1,7 @@
+2008-05-20  Roei Erez  <roeie@mainsoft.com>
+
+       * Add tests for Queryable.AsQureyable
+
 2008-05-15  Roei Erez  <roeie@mainsoft.com>
 
        * EnumerableAsQueryableTest.cs: test cases for Queryable.AsQueryable() implementation.
index 6881ab9a1b62f273b7222fc24e00de9391a5ffcb..375bbf6a9f459841b8ada0f7860b2b427085382d 100644 (file)
@@ -34,6 +34,7 @@ using NUnit.Framework;
 using System.Linq.Expressions;
 using System.Runtime.CompilerServices;
 using System.Reflection;
+using System.Collections;
 
 namespace MonoTests.System.Linq {
 
@@ -379,6 +380,36 @@ namespace MonoTests.System.Linq {
                        Expression e = Expression.Call (method, _src.Expression, Expression.Constant(0));
                        _src.Provider.Execute (e);
                }
+
+               [Test]
+               [ExpectedException (typeof (ArgumentNullException))]
+               public void NullEnumerable ()
+               {
+                       IEnumerable<int> a = null;
+                       a.AsQueryable ();
+               }
+
+               [Test]
+               [ExpectedException (typeof (ArgumentException))]
+               public void NonGenericEnumerable1 ()
+               {
+                       new MyEnum ().AsQueryable ();
+               }
+
+               [Test]
+               public void NonGenericEnumerable2 ()
+               {
+                       IEnumerable<int> nonGen = new int[] { 1, 2, 3 };
+                       Assert.IsTrue (nonGen.AsQueryable () is IQueryable<int>);
+               }
+       }
+
+       class MyEnum : IEnumerable
+       {
+               public IEnumerator GetEnumerator ()
+               {
+                       throw new NotImplementedException ();
+               }
        }
 
        class CustomEqualityComparer : IEqualityComparer<int> {