using System; using System.Text; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Reflection; using NUnit.Framework; namespace MonoTests.System.Linq { [TestFixture] public class QueryableProviderTest { QueryProvider _provider; Query _src; int [] _array = { 1, 2, 3 }; int [] _otherArray = { 0, 2 }; public QueryableProviderTest () { _provider = new QueryProvider (); _src = new Query (_provider, _array); } [SetUp] public void MyTestCleanup () { _provider.Init (); } [Test] public void TestAggregate () { _src.Aggregate ((n, m) => n + m); Assert.AreEqual (StatusEnum.Execute, _provider.Status); } [Test] public void TestAll () { _src.All ((n) => true); Assert.AreEqual (StatusEnum.Execute, _provider.Status); } [Test] public void TestAny () { _src.Any (); Assert.AreEqual (StatusEnum.Execute, _provider.Status); } [Test] public void TestAverage () { _src.Average ((n) => n); Assert.AreEqual (StatusEnum.Execute, _provider.Status); } [Test] public void TestCast () { _src.Cast (); Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status); } [Test] public void TestConcat () { _src.Concat (_otherArray); Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status); } [Test] public void TestContains () { _src.Contains (3); Assert.AreEqual (StatusEnum.Execute, _provider.Status); } [Test] public void TestCount () { _src.Count (); Assert.AreEqual (StatusEnum.Execute, _provider.Status); } [Test] public void TestDefaultIfEmpty () { _src.DefaultIfEmpty (0); Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status); } [Test] public void TestDistinct () { _src.Distinct (); Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status); } [Test] public void TestElementAt () { _src.ElementAt (1); Assert.AreEqual (StatusEnum.Execute, _provider.Status); } [Test] public void TestElementAtOrDefault () { _src.ElementAtOrDefault (1); Assert.AreEqual (StatusEnum.Execute, _provider.Status); } [Test] public void TestExcept () { _src.Except (_otherArray); Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status); } [Test] public void TestFirst () { _src.First (); Assert.AreEqual (StatusEnum.Execute, _provider.Status); } [Test] public void TestFirstOrDefault () { _src.FirstOrDefault ((n) => n > 1); Assert.AreEqual (StatusEnum.Execute, _provider.Status); } [Test] public void TestGroupBy () { _src.GroupBy ((n) => n > 2); Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status); } [Test] public void TestGroupJoin () { _src.GroupJoin (_otherArray, (n) => n > 1, (n) => n > 1, (n, col) => n); Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status); } [Test] public void TestIntersect () { _src.Intersect (_otherArray); Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status); } [Test] public void TestJoin () { _src.Join (_otherArray, (n) => n, (n => n), (n, m) => n + m); Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status); } [Test] public void TestLast () { _src.Last ((n) => n > 1); Assert.AreEqual (StatusEnum.Execute, _provider.Status); } [Test] public void TestLastOrDefault () { _src.LastOrDefault (); Assert.AreEqual (StatusEnum.Execute, _provider.Status); } [Test] public void TestLongCount () { _src.LongCount (); Assert.AreEqual (StatusEnum.Execute, _provider.Status); } [Test] public void TestMax () { _src.Max (); Assert.AreEqual (StatusEnum.Execute, _provider.Status); } [Test] public void TestMin () { _src.Min (); Assert.AreEqual (StatusEnum.Execute, _provider.Status); } [Test] public void TestOfType () { _src.OfType (); Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status); } [Test] public void TestOrderBy () { _src.OrderBy ((n) => n > 1); Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status); } [Test] public void TestOrderByDescending () { _src.OrderByDescending ((n) => n > 1); Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status); } [Test] public void TestReverse () { _src.Reverse (); Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status); } [Test] public void TestSelect () { _src.Select ((n) => n); Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status); } [Test] public void TestSelectMany () { _src.SelectMany ((n) => new int [] { n }); Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status); } [Test] public void TestSequenceEqual () { _src.SequenceEqual (_otherArray); Assert.AreEqual (StatusEnum.Execute, _provider.Status); } [Test] public void TestSingle () { (new Query (_provider, new int [] { 1 })).Single (); Assert.AreEqual (StatusEnum.Execute, _provider.Status); } [Test] public void TestSingleOrDefault () { (new Query (_provider, new int [] { 1 })).SingleOrDefault (); Assert.AreEqual (StatusEnum.Execute, _provider.Status); } [Test] public void TestSkip () { _src.Skip (1); Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status); } [Test] public void TestSkipWhile () { _src.SkipWhile ((n) => n > 1); Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status); } [Test] public void TestSum () { _src.Sum ((n) => n); Assert.AreEqual (StatusEnum.Execute, _provider.Status); } [Test] public void TestTake () { _src.Take (3); Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status); } [Test] public void TestTakeWhile () { _src.TakeWhile ((n) => n < 2); Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status); } [Test] public void TestThenBy () { _src.ThenBy ((n) => n < 2); Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status); } [Test] public void TestThenByDescending () { _src.ThenByDescending ((n) => n < 2); Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status); } [Test] public void TestUnion () { _src.Union (_otherArray); Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status); } [Test] public void TestWhere () { _src.Where ((n) => true); Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status); } public class Query : IQueryable, IQueryable, IEnumerable, IEnumerable, IOrderedQueryable, IOrderedQueryable { IQueryProvider provider; Expression expression; IEnumerable _context; public Query (IQueryProvider provider, IEnumerable context) { _context = context; this.provider = provider; this.expression = Expression.Constant (this); } Expression IQueryable.Expression { get { return this.expression; } } Type IQueryable.ElementType { get { return typeof (T); } } IQueryProvider IQueryable.Provider { get { return this.provider; } } public IEnumerator GetEnumerator () { throw new NotImplementedException (); } IEnumerator IEnumerable.GetEnumerator () { throw new NotImplementedException (); } } public enum StatusEnum { NotInitilized, Execute, CreateQuery } public class QueryProvider : IQueryProvider { private StatusEnum _status = StatusEnum.NotInitilized; public StatusEnum Status { get { return _status; } set { _status = value; } } public void Init () { _status = StatusEnum.NotInitilized; } public QueryProvider () { Init (); } #region IQueryProvider Members IQueryable IQueryProvider.CreateQuery (Expression expression) { Status = StatusEnum.CreateQuery; return null; } IQueryable IQueryProvider.CreateQuery (Expression expression) { Status = StatusEnum.CreateQuery; return null; } S IQueryProvider.Execute (Expression expression) { Status = StatusEnum.Execute; return default (S); } object IQueryProvider.Execute (Expression expression) { Status = StatusEnum.Execute; return null; } #endregion } } }