+//\r
+// EnumerableAsQueryableTest.cs\r
+//\r
+// Authors:\r
+// Roei Erez (roeie@mainsoft.com)\r
+//\r
+// Copyright (C) 2007 Novell, Inc (http://www.novell.com)\r
+//\r
+// Permission is hereby granted, free of charge, to any person obtaining\r
+// a copy of this software and associated documentation files (the\r
+// "Software"), to deal in the Software without restriction, including\r
+// without limitation the rights to use, copy, modify, merge, publish,\r
+// distribute, sublicense, and/or sell copies of the Software, and to\r
+// permit persons to whom the Software is furnished to do so, subject to\r
+// the following conditions:\r
+//\r
+// The above copyright notice and this permission notice shall be\r
+// included in all copies or substantial portions of the Software.\r
+//\r
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+//\r
+\r
+using System;\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using System.Text;\r
+using NUnit.Framework;\r
+using System.Linq.Expressions;\r
+using System.Runtime.CompilerServices;\r
+using System.Reflection;\r
+\r
+namespace MonoTests.System.Linq {\r
+\r
+ [TestFixture]\r
+ public class EnumerableAsQueryableTest {\r
+\r
+ int [] _array;\r
+ IQueryable<int> _src;\r
+\r
+ [SetUp]\r
+ public void MyTestCleanup ()\r
+ {\r
+ _array = new int [] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };\r
+ _src = _array.AsQueryable<int> ();\r
+ }\r
+\r
+#if TARGET_JVM //TODO: gmcs fails, bug #390666\r
+ [Test]\r
+ public void Aggregate () \r
+ {\r
+ Assert.AreEqual (_src.Aggregate<int> ((n, m) => n + m), _array.Aggregate<int> ((n, m) => n + m));\r
+ }\r
+#endif\r
+\r
+#if TARGET_JVM //TODO: gmcs fails, bug #390666\r
+ [Test]\r
+ public void All ()\r
+ {\r
+ Assert.AreEqual (_src.All<int> ((n) => n < 11), _array.All<int> ((n) => n < 11));\r
+ Assert.AreEqual (_src.All<int> ((n) => n < 10), _array.All<int> ((n) => n < 10));\r
+ }\r
+#endif\r
+\r
+#if TARGET_JVM //TODO: gmcs fails, bug #390666\r
+ [Test]\r
+ public void Any ()\r
+ {\r
+ Assert.AreEqual (_src.Any<int> (i => i > 5), _array.Any<int> (i => i > 5));\r
+ }\r
+#endif\r
+\r
+#if TARGET_JVM //TODO: gmcs fails, bug #390666\r
+ [Test]\r
+ public void Average ()\r
+ {\r
+ Assert.AreEqual (_src.Average<int> ((n) => 11), _array.Average<int> ((n) => 11));\r
+ } \r
+#endif\r
+\r
+ [Test]\r
+ public void Concat ()\r
+ {\r
+ Assert.AreEqual (_src.Concat<int> (_src).Count (), _array.Concat<int> (_src).Count ());\r
+ }\r
+\r
+ [Test]\r
+ public void Contains ()\r
+ {\r
+\r
+ for (int i = 1; i < 20; ++i)\r
+ Assert.AreEqual (_src.Contains<int> (i), _array.Contains<int> (i));\r
+ }\r
+\r
+ [Test]\r
+ public void Count ()\r
+ {\r
+ Assert.AreEqual (_src.Count<int> (), _array.Count<int> ());\r
+ }\r
+\r
+\r
+ [Test]\r
+ public void Distinct ()\r
+ {\r
+ Assert.AreEqual (_src.Distinct<int> ().Count (), _array.Distinct<int> ().Count ());\r
+ Assert.AreEqual (_src.Distinct<int> (new CustomEqualityComparer ()).Count (), _array.Distinct<int> (new CustomEqualityComparer ()).Count ());\r
+ }\r
+\r
+ [Test]\r
+ public void ElementAt ()\r
+ {\r
+ for (int i = 0; i < 10; ++i)\r
+ Assert.AreEqual (_src.ElementAt<int> (i), _array.ElementAt<int> (i)); \r
+ }\r
+\r
+ [Test]\r
+ public void ElementAtOrDefault ()\r
+ {\r
+ for (int i = 0; i < 10; ++i)\r
+ Assert.AreEqual (_src.ElementAtOrDefault<int> (i), _array.ElementAtOrDefault<int> (i));\r
+ Assert.AreEqual (_src.ElementAtOrDefault<int> (100), _array.ElementAtOrDefault<int> (100));\r
+ }\r
+\r
+ [Test]\r
+ public void Except ()\r
+ {\r
+ int [] except = { 1, 2, 3 };\r
+ Assert.AreEqual (_src.Except<int> (except.AsQueryable ()).Count (), _array.Except<int> (except).Count ());\r
+ }\r
+\r
+ [Test]\r
+ public void First ()\r
+ {\r
+ Assert.AreEqual (_src.First<int> (), _array.First<int> ());\r
+ }\r
+\r
+#if TARGET_JVM //TODO: gmcs fails, bug #390666\r
+ [Test]\r
+ public void FirstOrDefault ()\r
+ {\r
+ Assert.AreEqual (_src.FirstOrDefault<int> ((n) => n > 5), _array.FirstOrDefault<int> ((n) => n > 5));\r
+ Assert.AreEqual (_src.FirstOrDefault<int> ((n) => n > 10), _array.FirstOrDefault<int> ((n) => n > 10));\r
+ }\r
+#endif\r
+\r
+#if TARGET_JVM //TODO: gmcs fails, bug #390666\r
+ [Test]\r
+ public void GroupBy ()\r
+ {\r
+ IQueryable<IGrouping<bool, int>> grouping = _src.GroupBy<int, bool> ((n) => n > 5);\r
+ Assert.AreEqual (grouping.Count(), 2);\r
+ foreach (IGrouping<bool, int> group in grouping) \r
+ {\r
+ Assert.AreEqual(group.Count(), 5); \r
+ }\r
+ }\r
+#endif\r
+\r
+#if TARGET_JVM //TODO: gmcs fails, bug #390666\r
+ [Test]\r
+ public void Intersect ()\r
+ {\r
+ int [] subset = { 1, 2, 3 };\r
+ int[] intersection = _src.Intersect<int> (subset.AsQueryable()).ToArray();\r
+ Assert.AreEqual (subset, intersection);\r
+ }\r
+#endif\r
+\r
+#if TARGET_JVM //TODO: gmcs fails, bug #390666\r
+ [Test]\r
+ public void Last ()\r
+ {\r
+ Assert.AreEqual (_src.Last<int> ((n) => n > 1), _array.Last<int> ((n) => n > 1)); \r
+ }\r
+#endif\r
+\r
+ [Test]\r
+ public void LastOrDefault ()\r
+ {\r
+ Assert.AreEqual (_src.LastOrDefault<int> (), _array.LastOrDefault<int> ()); \r
+ }\r
+\r
+ [Test]\r
+ public void LongCount ()\r
+ {\r
+ Assert.AreEqual (_src.LongCount<int> (), _array.LongCount<int> ()); \r
+ }\r
+\r
+ [Test]\r
+ public void Max ()\r
+ {\r
+ Assert.AreEqual (_src.Max<int> (), _array.Max<int> ());\r
+ }\r
+\r
+ [Test]\r
+ public void Min ()\r
+ {\r
+ Assert.AreEqual (_src.Min<int> (), _array.Min<int> ()); \r
+ }\r
+\r
+ [Test]\r
+ public void OfType ()\r
+ {\r
+ Assert.AreEqual (_src.OfType<int> ().Count (), _array.OfType<int> ().Count ()); \r
+ }\r
+\r
+#if TARGET_JVM //TODO: gmcs fails, bug #390666\r
+ [Test]\r
+ public void OrderBy () \r
+ {\r
+ int [] arr1 = _array.OrderBy<int, int> ((n) => n * -1).ToArray ();\r
+ int [] arr2 = _src.OrderBy<int, int> ((n) => n * -1).ToArray ();\r
+ Assert.AreEqual (arr1, arr2);\r
+ }\r
+#endif\r
+\r
+#if TARGET_JVM //TODO: gmcs fails, bug #390666\r
+ [Test]\r
+ public void OrderByDescending ()\r
+ {\r
+ int [] arr1 = _array.OrderBy<int, int> ((n) => n).ToArray ();\r
+ int [] arr2 = _src.OrderBy<int, int> ((n) => n).ToArray ();\r
+ Assert.AreEqual (arr1, arr2);\r
+ }\r
+#endif\r
+\r
+ [Test]\r
+ public void Reverse ()\r
+ {\r
+ int [] arr1 = _array.Reverse<int> ().Reverse ().ToArray ();\r
+ int [] arr2 = _src.Reverse<int> ().Reverse ().ToArray ();\r
+ Assert.AreEqual (arr1, arr2);\r
+ }\r
+\r
+#if TARGET_JVM //TODO: gmcs fails, bug #390666\r
+ [Test]\r
+ public void Select ()\r
+ {\r
+ int [] arr1 = _array.Select<int, int> ((n) => n - 1).ToArray ();\r
+ int [] arr2 = _src.Select<int, int> ((n) => n - 1).ToArray ();\r
+ Assert.AreEqual (arr1, arr2); \r
+ }\r
+#endif\r
+\r
+#if TARGET_JVM //TODO: gmcs fails, bug #390666\r
+ [Test]\r
+ public void SelectMany ()\r
+ {\r
+ int [] arr1 = _array.SelectMany<int, int> ((n) => new int [] { n, n, n }).ToArray ();\r
+ int [] arr2 = _src.SelectMany<int, int> ((n) => new int [] { n, n, n }).ToArray ();\r
+ Assert.AreEqual (arr1, arr2); \r
+ }\r
+#endif\r
+\r
+ [Test]\r
+ public void SequenceEqual ()\r
+ {\r
+ Assert.IsTrue (_src.SequenceEqual<int> (_src)); \r
+ }\r
+\r
+#if TARGET_JVM //TODO: gmcs fails, bug #390666\r
+ [Test]\r
+ public void Single ()\r
+ {\r
+ Assert.AreEqual (_src.Single (n => n == 10), 10); \r
+ }\r
+#endif\r
+\r
+#if TARGET_JVM //TODO: gmcs fails, bug #390666\r
+ [Test]\r
+ public void SingleOrDefault ()\r
+ {\r
+ Assert.AreEqual (_src.SingleOrDefault (n => n == 10), 10);\r
+ Assert.AreEqual (_src.SingleOrDefault (n => n == 11), 0);\r
+ }\r
+#endif\r
+\r
+ [Test]\r
+ public void Skip ()\r
+ {\r
+ int [] arr1 = _array.Skip<int> (5).ToArray ();\r
+ int [] arr2 = _src.Skip<int> (5).ToArray ();\r
+ Assert.AreEqual (arr1, arr2); \r
+ }\r
+\r
+#if TARGET_JVM //TODO: gmcs fails, bug #390666\r
+ [Test]\r
+ public void SkipWhile ()\r
+ {\r
+ int[] arr1 = _src.SkipWhile<int> ((n) => n < 6).ToArray();\r
+ int[] arr2 = _src.Skip<int> (5).ToArray();\r
+ Assert.AreEqual (arr1, arr2); \r
+ }\r
+#endif\r
+\r
+#if TARGET_JVM //TODO: gmcs fails, bug #390666\r
+ [Test]\r
+ public void Sum ()\r
+ {\r
+ Assert.AreEqual (_src.Sum<int> ((n) => n), _array.Sum<int> ((n) => n));\r
+ Assert.AreEqual (_src.Sum<int> ((n) => n + 1), _array.Sum<int> ((n) => n + 1)); \r
+ }\r
+#endif\r
+\r
+ [Test]\r
+ public void Take ()\r
+ {\r
+ int [] arr1 = _array.Take<int> (3).ToArray ();\r
+ int [] arr2 = _src.Take<int> (3).ToArray ();\r
+ Assert.AreEqual (arr1, arr2);\r
+ }\r
+\r
+#if TARGET_JVM //TODO: gmcs fails, bug #390666\r
+ [Test]\r
+ public void TakeWhile () \r
+ {\r
+ int [] arr1 = _array.TakeWhile<int> (n => n < 6).ToArray ();\r
+ int [] arr2 = _src.TakeWhile<int> (n => n < 6).ToArray ();\r
+ Assert.AreEqual (arr1, arr2);\r
+ }\r
+#endif\r
+\r
+ [Test]\r
+ public void Union ()\r
+ {\r
+ int [] arr1 = _src.ToArray ();\r
+ int[] arr2 = _src.Union (_src).ToArray ();\r
+ Assert.AreEqual (arr1, arr2);\r
+\r
+ int [] arr = { 11,12,13};\r
+ Assert.AreEqual (_src.Union (arr).ToArray (), _array.Union (arr).ToArray ());\r
+ }\r
+\r
+#if TARGET_JVM //TODO: gmcs fails, bug #390666\r
+ [Test]\r
+ public void Where ()\r
+ {\r
+ int[] oddArray1 = _array.Where<int> ((n) => (n % 2) == 1).ToArray();\r
+ int [] oddArray2 = _src.Where<int> ((n) => (n % 2) == 1).ToArray ();\r
+ Assert.AreEqual (oddArray1, oddArray2);\r
+ }\r
+#endif\r
+\r
+ [Test]\r
+ public void UserExtensionMethod ()\r
+ {\r
+ BindingFlags extensionFlags = BindingFlags.Static | BindingFlags.Public; \r
+ MethodInfo method = (from m in typeof (Ext).GetMethods (extensionFlags)\r
+ where (m.Name == "UserQueryableExt1" && m.GetParameters () [0].ParameterType.GetGenericTypeDefinition () == typeof (IQueryable<>))\r
+ select m).FirstOrDefault ().MakeGenericMethod (typeof (int));\r
+ Expression<Func<int, int>> exp = i => i;\r
+ Expression e = Expression.Equal (\r
+ Expression.Constant ("UserEnumerableExt1"),\r
+ Expression.Call (method, _src.Expression, Expression.Quote (exp)));\r
+ Assert.AreEqual (_src.Provider.Execute<bool> (e), true, "UserQueryableExt1");\r
+\r
+ method = (from m in typeof (Ext).GetMethods (extensionFlags)\r
+ where (m.Name == "UserQueryableExt2" && m.GetParameters () [0].ParameterType.GetGenericTypeDefinition () == typeof (IQueryable<>))\r
+ select m).FirstOrDefault ().MakeGenericMethod (typeof (int));\r
+ e = Expression.Equal (\r
+ Expression.Constant ("UserEnumerableExt2"),\r
+ Expression.Call (method, _src.Expression, Expression.Quote (exp)));\r
+ Assert.AreEqual (_src.Provider.Execute<bool> (e), true, "UserQueryableExt2");\r
+ }\r
+\r
+ [Test]\r
+ [ExpectedException (typeof (InvalidOperationException))]\r
+ public void UserExtensionMethodNegative ()\r
+ {\r
+ BindingFlags extensionFlags = BindingFlags.Static | BindingFlags.Public;\r
+ MethodInfo method = (from m in typeof (Ext).GetMethods (extensionFlags)\r
+ where (m.Name == "UserQueryableExt3" && m.GetParameters () [0].ParameterType.GetGenericTypeDefinition () == typeof (IQueryable<>))\r
+ select m).FirstOrDefault ().MakeGenericMethod (typeof (int));\r
+ Expression<Func<int, int>> exp = i => i;\r
+ Expression e = Expression.Call (method, _src.Expression, Expression.Quote (exp), Expression.Constant (10));\r
+ _src.Provider.Execute (e);\r
+ }\r
+\r
+ [Test] \r
+ public void NonGenericMethod () {\r
+ BindingFlags extensionFlags = BindingFlags.Static | BindingFlags.Public;\r
+ MethodInfo method = (from m in typeof (Ext).GetMethods (extensionFlags)\r
+ where (m.Name == "NonGenericMethod" && m.GetParameters () [0].ParameterType.GetGenericTypeDefinition () == typeof (IQueryable<>))\r
+ select m).FirstOrDefault ();\r
+ Expression<Func<int, int>> exp = i => i;\r
+ Expression e = Expression.Call (method, _src.Expression);\r
+ Assert.AreEqual (_src.Provider.Execute (e), "EnumerableNonGenericMethod", "NonGenericMethod");\r
+ }\r
+\r
+ [Test]\r
+ [ExpectedException(typeof(InvalidOperationException))]\r
+ public void InstantiatedGenericMethod () {\r
+ BindingFlags extensionFlags = BindingFlags.Static | BindingFlags.Public;\r
+ MethodInfo method = (from m in typeof (Ext).GetMethods (extensionFlags)\r
+ where (m.Name == "InstantiatedGenericMethod" && m.GetParameters () [0].ParameterType.GetGenericTypeDefinition () == typeof (IQueryable<>))\r
+ select m).FirstOrDefault ().MakeGenericMethod (typeof (int));\r
+ Expression<Func<int, int>> exp = i => i;\r
+ Expression e = Expression.Call (method, _src.Expression, Expression.Constant(0));\r
+ _src.Provider.Execute (e);\r
+ }\r
+ }\r
+\r
+ class CustomEqualityComparer : IEqualityComparer<int> { \r
+\r
+ public bool Equals (int x, int y)\r
+ {\r
+ return true; \r
+ }\r
+\r
+ public int GetHashCode (int obj)\r
+ {\r
+ return 0;\r
+ } \r
+ }\r
+\r
+ public static class Ext {\r
+ \r
+ public static string UserQueryableExt1<T> (this IQueryable<T> e, Expression<Func<int, int>> ex)\r
+ {\r
+ return "UserQueryableExt1";\r
+ }\r
+\r
+ public static string UserQueryableExt2<T> (this IQueryable<T> e, Expression<Func<int, int>> ex)\r
+ {\r
+ return "UserQueryableExt2";\r
+ }\r
+\r
+ public static string UserQueryableExt3<T> (this IQueryable<T> e, Expression<Func<int, int>> ex, int dummy)\r
+ {\r
+ return "UserQueryableExt3";\r
+ }\r
+\r
+ public static string UserQueryableExt1<T> (this IEnumerable<T> e, Expression<Func<int, int>> ex)\r
+ {\r
+ return "UserEnumerableExt1";\r
+ }\r
+\r
+ public static string UserQueryableExt2<T> (this IEnumerable<T> e, Func<int, int> ex)\r
+ {\r
+ return "UserEnumerableExt2";\r
+ }\r
+\r
+ public static string NonGenericMethod (this IQueryable<int> iq) \r
+ {\r
+ return "QueryableNonGenericMethod";\r
+ }\r
+\r
+ public static string NonGenericMethod (this IEnumerable<int> iq) \r
+ {\r
+ return "EnumerableNonGenericMethod";\r
+ }\r
+\r
+ public static string InstantiatedGenericMethod<T> (this IQueryable<int> iq, T t) \r
+ {\r
+ return "QueryableInstantiatedGenericMethod";\r
+ }\r
+\r
+ public static string InstantiatedGenericMethod (this IEnumerable<int> ie, int t) \r
+ {\r
+ return "EnumerableInstantiatedGenericMethod";\r
+ }\r
+ }\r
+}\r