3 using System.Collections;
4 using System.Collections.Generic;
6 using System.Linq.Expressions;
7 using System.Reflection;
11 namespace MonoTests.System.Linq
15 public class QueryableProviderTest
17 QueryProvider _provider;
21 int [] _array = { 1, 2, 3 };
22 int [] _otherArray = { 0, 2 };
24 public QueryableProviderTest ()
26 _provider = new QueryProvider ();
27 _src = new Query<int> (_provider, _array);
32 public void MyTestCleanup ()
38 public void TestAggregate ()
40 _src.Aggregate<int> ((n, m) => n + m);
41 Assert.AreEqual (StatusEnum.Execute, _provider.Status);
46 public void TestAll ()
48 _src.All<int> ((n) => true);
49 Assert.AreEqual (StatusEnum.Execute, _provider.Status);
53 public void TestAny ()
56 Assert.AreEqual (StatusEnum.Execute, _provider.Status);
60 public void TestAverage ()
62 _src.Average<int> ((n) => n);
63 Assert.AreEqual (StatusEnum.Execute, _provider.Status);
67 public void TestCast ()
70 Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
74 public void TestConcat ()
76 _src.Concat<int> (_otherArray);
77 Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
81 public void TestContains ()
83 _src.Contains<int> (3);
84 Assert.AreEqual (StatusEnum.Execute, _provider.Status);
89 public void TestCount ()
92 Assert.AreEqual (StatusEnum.Execute, _provider.Status);
96 public void TestDefaultIfEmpty ()
98 _src.DefaultIfEmpty<int> (0);
99 Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
103 public void TestDistinct ()
105 _src.Distinct<int> ();
106 Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
110 public void TestElementAt ()
112 _src.ElementAt<int> (1);
113 Assert.AreEqual (StatusEnum.Execute, _provider.Status);
117 public void TestElementAtOrDefault ()
119 _src.ElementAtOrDefault<int> (1);
120 Assert.AreEqual (StatusEnum.Execute, _provider.Status);
124 public void TestExcept ()
126 _src.Except<int> (_otherArray);
127 Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
131 public void TestFirst ()
134 Assert.AreEqual (StatusEnum.Execute, _provider.Status);
138 public void TestFirstOrDefault ()
140 _src.FirstOrDefault<int> ((n) => n > 1);
141 Assert.AreEqual (StatusEnum.Execute, _provider.Status);
145 public void TestGroupBy ()
147 _src.GroupBy<int, bool> ((n) => n > 2);
148 Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
152 public void TestGroupJoin ()
154 _src.GroupJoin<int, int, bool, int> (_otherArray, (n) => n > 1, (n) => n > 1, (n, col) => n);
155 Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
159 public void TestIntersect ()
161 _src.Intersect<int> (_otherArray);
162 Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
166 public void TestJoin ()
168 _src.Join<int, int, int, int> (_otherArray, (n) => n, (n => n), (n, m) => n + m);
169 Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
173 public void TestLast ()
175 _src.Last<int> ((n) => n > 1);
176 Assert.AreEqual (StatusEnum.Execute, _provider.Status);
180 public void TestLastOrDefault ()
182 _src.LastOrDefault<int> ();
183 Assert.AreEqual (StatusEnum.Execute, _provider.Status);
187 public void TestLongCount ()
189 _src.LongCount<int> ();
190 Assert.AreEqual (StatusEnum.Execute, _provider.Status);
194 public void TestMax ()
197 Assert.AreEqual (StatusEnum.Execute, _provider.Status);
201 public void TestMin ()
204 Assert.AreEqual (StatusEnum.Execute, _provider.Status);
208 public void TestOfType ()
211 Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
215 public void TestOrderBy ()
217 _src.OrderBy<int, bool> ((n) => n > 1);
218 Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
222 public void TestOrderByDescending ()
224 _src.OrderByDescending<int, bool> ((n) => n > 1);
225 Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
229 public void TestReverse ()
231 _src.Reverse<int> ();
232 Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
236 public void TestSelect ()
238 _src.Select<int, int> ((n) => n);
239 Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
243 public void TestSelectMany ()
245 _src.SelectMany<int, int> ((n) => new int [] { n });
246 Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
250 public void TestSequenceEqual ()
252 _src.SequenceEqual<int> (_otherArray);
253 Assert.AreEqual (StatusEnum.Execute, _provider.Status);
257 public void TestSingle ()
259 (new Query<int> (_provider, new int [] { 1 })).Single<int> ();
260 Assert.AreEqual (StatusEnum.Execute, _provider.Status);
264 public void TestSingleOrDefault ()
266 (new Query<int> (_provider, new int [] { 1 })).SingleOrDefault<int> ();
267 Assert.AreEqual (StatusEnum.Execute, _provider.Status);
271 public void TestSkip ()
274 Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
278 public void TestSkipWhile ()
280 _src.SkipWhile<int> ((n) => n > 1);
281 Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
285 public void TestSum ()
287 _src.Sum<int> ((n) => n);
288 Assert.AreEqual (StatusEnum.Execute, _provider.Status);
292 public void TestTake ()
295 Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
300 public void TestTakeWhile ()
302 _src.TakeWhile<int> ((n) => n < 2);
303 Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
307 public void TestThenBy ()
309 _src.ThenBy<int, bool> ((n) => n < 2);
310 Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
314 public void TestThenByDescending ()
316 _src.ThenByDescending<int, bool> ((n) => n < 2);
317 Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
321 public void TestUnion ()
323 _src.Union<int> (_otherArray);
324 Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
328 public void TestWhere ()
330 _src.Where<int> ((n) => true);
331 Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
334 public class Query<T> : IQueryable<T>, IQueryable, IEnumerable<T>, IEnumerable, IOrderedQueryable<T>, IOrderedQueryable
336 IQueryProvider provider;
338 Expression expression;
340 IEnumerable<T> _context;
342 public Query (IQueryProvider provider, IEnumerable<T> context)
345 this.provider = provider;
346 this.expression = Expression.Constant (this);
349 Expression IQueryable.Expression
352 get { return this.expression; }
358 Type IQueryable.ElementType
361 get { return typeof (T); }
366 IQueryProvider IQueryable.Provider
369 get { return this.provider; }
374 public IEnumerator<T> GetEnumerator ()
376 throw new NotImplementedException ();
379 IEnumerator IEnumerable.GetEnumerator ()
381 throw new NotImplementedException ();
386 public enum StatusEnum { NotInitilized, Execute, CreateQuery }
388 public class QueryProvider : IQueryProvider
391 private StatusEnum _status = StatusEnum.NotInitilized;
393 public StatusEnum Status
395 get { return _status; }
396 set { _status = value; }
401 _status = StatusEnum.NotInitilized;
404 public QueryProvider ()
409 #region IQueryProvider Members
411 IQueryable<S> IQueryProvider.CreateQuery<S> (Expression expression)
413 Status = StatusEnum.CreateQuery;
417 IQueryable IQueryProvider.CreateQuery (Expression expression)
419 Status = StatusEnum.CreateQuery;
424 S IQueryProvider.Execute<S> (Expression expression)
426 Status = StatusEnum.Execute;
432 object IQueryProvider.Execute (Expression expression)
434 Status = StatusEnum.Execute;