QueryableProviderTest.cs 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. using System;
  2. using System.Text;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Linq.Expressions;
  7. using System.Reflection;
  8. using NUnit.Framework;
  9. namespace MonoTests.System.Linq
  10. {
  11. [TestFixture]
  12. public class QueryableProviderTest
  13. {
  14. QueryProvider _provider;
  15. Query<int> _src;
  16. int [] _array = { 1, 2, 3 };
  17. int [] _otherArray = { 0, 2 };
  18. public QueryableProviderTest ()
  19. {
  20. _provider = new QueryProvider ();
  21. _src = new Query<int> (_provider, _array);
  22. }
  23. [SetUp]
  24. public void MyTestCleanup ()
  25. {
  26. _provider.Init ();
  27. }
  28. [Test]
  29. public void TestAggregate ()
  30. {
  31. _src.Aggregate<int> ((n, m) => n + m);
  32. Assert.AreEqual (StatusEnum.Execute, _provider.Status);
  33. }
  34. [Test]
  35. public void TestAll ()
  36. {
  37. _src.All<int> ((n) => true);
  38. Assert.AreEqual (StatusEnum.Execute, _provider.Status);
  39. }
  40. [Test]
  41. public void TestAny ()
  42. {
  43. _src.Any<int> ();
  44. Assert.AreEqual (StatusEnum.Execute, _provider.Status);
  45. }
  46. [Test]
  47. public void TestAverage ()
  48. {
  49. _src.Average<int> ((n) => n);
  50. Assert.AreEqual (StatusEnum.Execute, _provider.Status);
  51. }
  52. [Test]
  53. public void TestCast ()
  54. {
  55. _src.Cast<int> ();
  56. Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
  57. }
  58. [Test]
  59. public void TestConcat ()
  60. {
  61. _src.Concat<int> (_otherArray);
  62. Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
  63. }
  64. [Test]
  65. public void TestContains ()
  66. {
  67. _src.Contains<int> (3);
  68. Assert.AreEqual (StatusEnum.Execute, _provider.Status);
  69. }
  70. [Test]
  71. public void TestCount ()
  72. {
  73. _src.Count<int> ();
  74. Assert.AreEqual (StatusEnum.Execute, _provider.Status);
  75. }
  76. [Test]
  77. public void TestDefaultIfEmpty ()
  78. {
  79. _src.DefaultIfEmpty<int> (0);
  80. Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
  81. }
  82. [Test]
  83. public void TestDistinct ()
  84. {
  85. _src.Distinct<int> ();
  86. Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
  87. }
  88. [Test]
  89. public void TestElementAt ()
  90. {
  91. _src.ElementAt<int> (1);
  92. Assert.AreEqual (StatusEnum.Execute, _provider.Status);
  93. }
  94. [Test]
  95. public void TestElementAtOrDefault ()
  96. {
  97. _src.ElementAtOrDefault<int> (1);
  98. Assert.AreEqual (StatusEnum.Execute, _provider.Status);
  99. }
  100. [Test]
  101. public void TestExcept ()
  102. {
  103. _src.Except<int> (_otherArray);
  104. Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
  105. }
  106. [Test]
  107. public void TestFirst ()
  108. {
  109. _src.First<int> ();
  110. Assert.AreEqual (StatusEnum.Execute, _provider.Status);
  111. }
  112. [Test]
  113. public void TestFirstOrDefault ()
  114. {
  115. _src.FirstOrDefault<int> ((n) => n > 1);
  116. Assert.AreEqual (StatusEnum.Execute, _provider.Status);
  117. }
  118. [Test]
  119. public void TestGroupBy ()
  120. {
  121. _src.GroupBy<int, bool> ((n) => n > 2);
  122. Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
  123. }
  124. [Test]
  125. public void TestGroupJoin ()
  126. {
  127. _src.GroupJoin<int, int, bool, int> (_otherArray, (n) => n > 1, (n) => n > 1, (n, col) => n);
  128. Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
  129. }
  130. [Test]
  131. public void TestIntersect ()
  132. {
  133. _src.Intersect<int> (_otherArray);
  134. Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
  135. }
  136. [Test]
  137. public void TestJoin ()
  138. {
  139. _src.Join<int, int, int, int> (_otherArray, (n) => n, (n => n), (n, m) => n + m);
  140. Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
  141. }
  142. [Test]
  143. public void TestLast ()
  144. {
  145. _src.Last<int> ((n) => n > 1);
  146. Assert.AreEqual (StatusEnum.Execute, _provider.Status);
  147. }
  148. [Test]
  149. public void TestLastOrDefault ()
  150. {
  151. _src.LastOrDefault<int> ();
  152. Assert.AreEqual (StatusEnum.Execute, _provider.Status);
  153. }
  154. [Test]
  155. public void TestLongCount ()
  156. {
  157. _src.LongCount<int> ();
  158. Assert.AreEqual (StatusEnum.Execute, _provider.Status);
  159. }
  160. [Test]
  161. public void TestMax ()
  162. {
  163. _src.Max<int> ();
  164. Assert.AreEqual (StatusEnum.Execute, _provider.Status);
  165. }
  166. [Test]
  167. public void TestMin ()
  168. {
  169. _src.Min<int> ();
  170. Assert.AreEqual (StatusEnum.Execute, _provider.Status);
  171. }
  172. [Test]
  173. public void TestOfType ()
  174. {
  175. _src.OfType<int> ();
  176. Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
  177. }
  178. [Test]
  179. public void TestOrderBy ()
  180. {
  181. _src.OrderBy<int, bool> ((n) => n > 1);
  182. Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
  183. }
  184. [Test]
  185. public void TestOrderByDescending ()
  186. {
  187. _src.OrderByDescending<int, bool> ((n) => n > 1);
  188. Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
  189. }
  190. [Test]
  191. public void TestReverse ()
  192. {
  193. _src.Reverse<int> ();
  194. Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
  195. }
  196. [Test]
  197. public void TestSelect ()
  198. {
  199. _src.Select<int, int> ((n) => n);
  200. Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
  201. }
  202. [Test]
  203. public void TestSelectMany ()
  204. {
  205. _src.SelectMany<int, int> ((n) => new int [] { n });
  206. Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
  207. }
  208. [Test]
  209. public void TestSequenceEqual ()
  210. {
  211. _src.SequenceEqual<int> (_otherArray);
  212. Assert.AreEqual (StatusEnum.Execute, _provider.Status);
  213. }
  214. [Test]
  215. public void TestSingle ()
  216. {
  217. (new Query<int> (_provider, new int [] { 1 })).Single<int> ();
  218. Assert.AreEqual (StatusEnum.Execute, _provider.Status);
  219. }
  220. [Test]
  221. public void TestSingleOrDefault ()
  222. {
  223. (new Query<int> (_provider, new int [] { 1 })).SingleOrDefault<int> ();
  224. Assert.AreEqual (StatusEnum.Execute, _provider.Status);
  225. }
  226. [Test]
  227. public void TestSkip ()
  228. {
  229. _src.Skip<int> (1);
  230. Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
  231. }
  232. [Test]
  233. public void TestSkipWhile ()
  234. {
  235. _src.SkipWhile<int> ((n) => n > 1);
  236. Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
  237. }
  238. [Test]
  239. public void TestSum ()
  240. {
  241. _src.Sum<int> ((n) => n);
  242. Assert.AreEqual (StatusEnum.Execute, _provider.Status);
  243. }
  244. [Test]
  245. public void TestTake ()
  246. {
  247. _src.Take<int> (3);
  248. Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
  249. }
  250. [Test]
  251. public void TestTakeWhile ()
  252. {
  253. _src.TakeWhile<int> ((n) => n < 2);
  254. Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
  255. }
  256. [Test]
  257. public void TestThenBy ()
  258. {
  259. _src.ThenBy<int, bool> ((n) => n < 2);
  260. Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
  261. }
  262. [Test]
  263. public void TestThenByDescending ()
  264. {
  265. _src.ThenByDescending<int, bool> ((n) => n < 2);
  266. Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
  267. }
  268. [Test]
  269. public void TestUnion ()
  270. {
  271. _src.Union<int> (_otherArray);
  272. Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
  273. }
  274. [Test]
  275. public void TestWhere ()
  276. {
  277. _src.Where<int> ((n) => true);
  278. Assert.AreEqual (StatusEnum.CreateQuery, _provider.Status);
  279. }
  280. public class Query<T> : IQueryable<T>, IQueryable, IEnumerable<T>, IEnumerable, IOrderedQueryable<T>, IOrderedQueryable
  281. {
  282. IQueryProvider provider;
  283. Expression expression;
  284. IEnumerable<T> _context;
  285. public Query (IQueryProvider provider, IEnumerable<T> context)
  286. {
  287. _context = context;
  288. this.provider = provider;
  289. this.expression = Expression.Constant (this);
  290. }
  291. Expression IQueryable.Expression
  292. {
  293. get { return this.expression; }
  294. }
  295. Type IQueryable.ElementType
  296. {
  297. get { return typeof (T); }
  298. }
  299. IQueryProvider IQueryable.Provider
  300. {
  301. get { return this.provider; }
  302. }
  303. public IEnumerator<T> GetEnumerator ()
  304. {
  305. throw new NotImplementedException ();
  306. }
  307. IEnumerator IEnumerable.GetEnumerator ()
  308. {
  309. throw new NotImplementedException ();
  310. }
  311. }
  312. public enum StatusEnum { NotInitilized, Execute, CreateQuery }
  313. public class QueryProvider : IQueryProvider
  314. {
  315. private StatusEnum _status = StatusEnum.NotInitilized;
  316. public StatusEnum Status
  317. {
  318. get { return _status; }
  319. set { _status = value; }
  320. }
  321. public void Init ()
  322. {
  323. _status = StatusEnum.NotInitilized;
  324. }
  325. public QueryProvider ()
  326. {
  327. Init ();
  328. }
  329. #region IQueryProvider Members
  330. IQueryable<S> IQueryProvider.CreateQuery<S> (Expression expression)
  331. {
  332. Status = StatusEnum.CreateQuery;
  333. return null;
  334. }
  335. IQueryable IQueryProvider.CreateQuery (Expression expression)
  336. {
  337. Status = StatusEnum.CreateQuery;
  338. return null;
  339. }
  340. S IQueryProvider.Execute<S> (Expression expression)
  341. {
  342. Status = StatusEnum.Execute;
  343. return default (S);
  344. }
  345. object IQueryProvider.Execute (Expression expression)
  346. {
  347. Status = StatusEnum.Execute;
  348. return null;
  349. }
  350. #endregion
  351. }
  352. }
  353. }