/Simple.Data.UnitTest/SimpleResultSetTest.cs

https://github.com/alastairs/Simple.Data
C# | 424 lines | 360 code | 64 blank | 0 comment | 1 complexity | f0d60d24310589ce79553460dfba3f45 MD5 | raw file
  1. namespace Simple.Data.UnitTest
  2. {
  3. using System;
  4. using System.Collections;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using NUnit.Framework;
  8. public class SimpleResultSetTest
  9. {
  10. private IEnumerable<dynamic> Records(int count)
  11. {
  12. for (int i = 0; i < count; i++)
  13. {
  14. yield return new SimpleRecord(new Dictionary<string, object> { { "Data", i.ToString() } });
  15. }
  16. }
  17. [Test]
  18. public void FirstReturnsFirstElement()
  19. {
  20. var list = new SimpleResultSet(Records(10));
  21. Assert.AreEqual("0", list.First().Data);
  22. }
  23. [Test]
  24. public void FirstThrowsOnEmptyList()
  25. {
  26. var list = new SimpleResultSet(Records(0));
  27. Assert.Throws<InvalidOperationException>(() => list.First());
  28. }
  29. [Test]
  30. public void FirstOrDefaultReturnsFirstElement()
  31. {
  32. var list = new SimpleResultSet(Records(10));
  33. Assert.AreEqual("0", list.FirstOrDefault().Data);
  34. }
  35. [Test]
  36. public void FirstOrDefaultReturnsNullOnEmptyList()
  37. {
  38. var list = new SimpleResultSet(Records(0));
  39. Assert.IsNull(list.FirstOrDefault());
  40. }
  41. [Test]
  42. public void FirstWithCriteriaReturnsMatch()
  43. {
  44. var list = new SimpleResultSet(Records(20));
  45. Assert.AreEqual("8", list.First<TestType>(t => t.Data.EndsWith("8")).Data);
  46. }
  47. [Test]
  48. public void FirstWithFailingCriteriaThrows()
  49. {
  50. var list = new SimpleResultSet(Records(20));
  51. Assert.Throws<InvalidOperationException>(() => list.First<TestType>(t => t.Data.EndsWith("A")));
  52. }
  53. [Test]
  54. public void FirstOrDefaultWithCriteriaReturnsMatch()
  55. {
  56. var list = new SimpleResultSet(Records(20));
  57. Assert.AreEqual("8", list.FirstOrDefault<TestType>(t => t.Data.EndsWith("8")).Data);
  58. }
  59. [Test]
  60. public void FirstOrDefaultWithFailingCriteriaReturnsNull()
  61. {
  62. var list = new SimpleResultSet(Records(20));
  63. Assert.IsNull(list.FirstOrDefault<TestType>(t => t.Data.EndsWith("A")));
  64. }
  65. [Test]
  66. public void LastReturnsLastElement()
  67. {
  68. var list = new SimpleResultSet(Records(10));
  69. Assert.AreEqual("9", list.Last().Data);
  70. }
  71. [Test]
  72. public void LastThrowsOnEmptyList()
  73. {
  74. var list = new SimpleResultSet(Records(0));
  75. Assert.Throws<InvalidOperationException>(() => list.Last());
  76. }
  77. [Test]
  78. public void LastOrDefaultReturnsLastElement()
  79. {
  80. var list = new SimpleResultSet(Records(10));
  81. Assert.AreEqual("9", list.LastOrDefault().Data);
  82. }
  83. [Test]
  84. public void LastOrDefaultReturnsNullOnEmptyList()
  85. {
  86. var list = new SimpleResultSet(Records(0));
  87. Assert.IsNull(list.LastOrDefault());
  88. }
  89. [Test]
  90. public void LastWithCriteriaReturnsMatch()
  91. {
  92. var list = new SimpleResultSet(Records(20));
  93. Assert.AreEqual("18", list.Last<TestType>(t => t.Data.EndsWith("18")).Data);
  94. }
  95. [Test]
  96. public void LastWithFailingCriteriaThrows()
  97. {
  98. var list = new SimpleResultSet(Records(20));
  99. Assert.Throws<InvalidOperationException>(() => list.Last<TestType>(t => t.Data.EndsWith("A")));
  100. }
  101. [Test]
  102. public void LastOrDefaultWithCriteriaReturnsMatch()
  103. {
  104. var list = new SimpleResultSet(Records(20));
  105. Assert.AreEqual("18", list.LastOrDefault<TestType>(t => t.Data.EndsWith("18")).Data);
  106. }
  107. [Test]
  108. public void LastOrDefaultWithFailingCriteriaReturnsNull()
  109. {
  110. var list = new SimpleResultSet(Records(20));
  111. Assert.IsNull(list.LastOrDefault<TestType>(t => t.Data.EndsWith("A")));
  112. }
  113. [Test]
  114. public void SingleReturnsSingleElement()
  115. {
  116. var list = new SimpleResultSet(Records(1));
  117. Assert.AreEqual("0", list.Single().Data);
  118. }
  119. [Test]
  120. public void SingleThrowsOnEmptyList()
  121. {
  122. var list = new SimpleResultSet(Records(0));
  123. Assert.Throws<InvalidOperationException>(() => list.Single());
  124. }
  125. [Test]
  126. public void SingleThrowsOnListWithMoreThanOneElement()
  127. {
  128. var list = new SimpleResultSet(Records(2));
  129. Assert.Throws<InvalidOperationException>(() => list.Single());
  130. }
  131. [Test]
  132. public void SingleOrDefaultReturnsSingleElement()
  133. {
  134. var list = new SimpleResultSet(Records(1));
  135. Assert.AreEqual("0", list.SingleOrDefault().Data);
  136. }
  137. [Test]
  138. public void SingleOrDefaultReturnsNullOnEmptyList()
  139. {
  140. var list = new SimpleResultSet(Records(0));
  141. Assert.IsNull(list.SingleOrDefault());
  142. }
  143. [Test]
  144. public void SingleOrDefaultThrowsOnListWithMoreThanOneElement()
  145. {
  146. var list = new SimpleResultSet(Records(2));
  147. Assert.Throws<InvalidOperationException>(() => list.SingleOrDefault());
  148. }
  149. [Test]
  150. public void SingleWithCriteriaMatchingOneRecordReturnsMatch()
  151. {
  152. var list = new SimpleResultSet(Records(10));
  153. Assert.AreEqual("8", list.Single<TestType>(t => t.Data.EndsWith("8")).Data);
  154. }
  155. [Test]
  156. public void SingleWithCriteriaMatchingMultipleRecordsThrows()
  157. {
  158. var list = new SimpleResultSet(Records(20));
  159. Assert.Throws<InvalidOperationException>(() => list.Single<TestType>(t => t.Data.EndsWith("8")));
  160. }
  161. [Test]
  162. public void SingleWithFailingCriteriaThrows()
  163. {
  164. var list = new SimpleResultSet(Records(20));
  165. Assert.Throws<InvalidOperationException>(() => list.Single<TestType>(t => t.Data.EndsWith("A")));
  166. }
  167. [Test]
  168. public void SingleOrDefaultWithCriteriaReturnsMatch()
  169. {
  170. var list = new SimpleResultSet(Records(10));
  171. Assert.AreEqual("8", list.SingleOrDefault<TestType>(t => t.Data.EndsWith("8")).Data);
  172. }
  173. [Test]
  174. public void SingleOrDefaultWithFailingCriteriaReturnsNull()
  175. {
  176. var list = new SimpleResultSet(Records(20));
  177. Assert.IsNull(list.SingleOrDefault<TestType>(t => t.Data.EndsWith("A")));
  178. }
  179. [Test]
  180. public void SingleOrDefaultWithCriteriaMatchingMultipleRecordsThrows()
  181. {
  182. var list = new SimpleResultSet(Records(20));
  183. Assert.Throws<InvalidOperationException>(() => list.SingleOrDefault<TestType>(t => t.Data.EndsWith("8")));
  184. }
  185. [Test]
  186. public void GenericFirstReturnsFirstElement()
  187. {
  188. var list = new SimpleResultSet(Records(10));
  189. Assert.AreEqual("0", list.First<TestType>().Data);
  190. }
  191. [Test]
  192. public void GenericFirstThrowsOnEmptyList()
  193. {
  194. var list = new SimpleResultSet(Records(0));
  195. Assert.Throws<InvalidOperationException>(() => list.First<TestType>());
  196. }
  197. [Test]
  198. public void GenericFirstOrDefaultReturnsFirstElement()
  199. {
  200. var list = new SimpleResultSet(Records(10));
  201. Assert.AreEqual("0", list.FirstOrDefault<TestType>().Data);
  202. }
  203. [Test]
  204. public void GenericFirstOrDefaultReturnsNullOnEmptyList()
  205. {
  206. var list = new SimpleResultSet(Records(0));
  207. Assert.IsNull(list.FirstOrDefault<TestType>());
  208. }
  209. [Test]
  210. public void GenericLastReturnsLastElement()
  211. {
  212. var list = new SimpleResultSet(Records(10));
  213. Assert.AreEqual("9", list.Last<TestType>().Data);
  214. }
  215. [Test]
  216. public void GenericLastThrowsOnEmptyList()
  217. {
  218. var list = new SimpleResultSet(Records(0));
  219. Assert.Throws<InvalidOperationException>(() => list.Last<TestType>());
  220. }
  221. [Test]
  222. public void GenericLastOrDefaultReturnsLastElement()
  223. {
  224. var list = new SimpleResultSet(Records(10));
  225. Assert.AreEqual("9", list.LastOrDefault<TestType>().Data);
  226. }
  227. [Test]
  228. public void GenericLastOrDefaultReturnsNullOnEmptyList()
  229. {
  230. var list = new SimpleResultSet(Records(0));
  231. Assert.IsNull(list.LastOrDefault<TestType>());
  232. }
  233. [Test]
  234. public void GenericSingleReturnsSingleElement()
  235. {
  236. var list = new SimpleResultSet(Records(1));
  237. Assert.AreEqual("0", list.Single<TestType>().Data);
  238. }
  239. [Test]
  240. public void GenericSingleThrowsOnEmptyList()
  241. {
  242. var list = new SimpleResultSet(Records(0));
  243. Assert.Throws<InvalidOperationException>(() => list.Single<TestType>());
  244. }
  245. [Test]
  246. public void GenericSingleThrowsOnListWithMoreThanOneElement()
  247. {
  248. var list = new SimpleResultSet(Records(2));
  249. Assert.Throws<InvalidOperationException>(() => list.Single<TestType>());
  250. }
  251. [Test]
  252. public void GenericSingleOrDefaultReturnsSingleElement()
  253. {
  254. var list = new SimpleResultSet(Records(1));
  255. Assert.AreEqual("0", list.SingleOrDefault<TestType>().Data);
  256. }
  257. [Test]
  258. public void GenericSingleOrDefaultReturnsNullOnEmptyList()
  259. {
  260. var list = new SimpleResultSet(Records(0));
  261. Assert.IsNull(list.SingleOrDefault<TestType>());
  262. }
  263. [Test]
  264. public void GenericSingleOrDefaultThrowsOnListWithMoreThanOneElement()
  265. {
  266. var list = new SimpleResultSet(Records(2));
  267. Assert.Throws<InvalidOperationException>(() => list.SingleOrDefault<TestType>());
  268. }
  269. [Test]
  270. public void ConvertsToGenericList()
  271. {
  272. dynamic list = new SimpleResultSet(Records(1));
  273. List<dynamic> generic = list;
  274. Assert.IsNotNull(generic);
  275. Assert.AreEqual("0", generic[0].Data);
  276. }
  277. [Test]
  278. public void ConvertsToNonGenericList()
  279. {
  280. dynamic list = new SimpleResultSet(Records(1));
  281. ArrayList generic = list;
  282. Assert.IsNotNull(generic);
  283. Assert.AreEqual("0", ((dynamic)generic[0]).Data);
  284. }
  285. [Test]
  286. public void ConvertsToHashSet()
  287. {
  288. dynamic list = new SimpleResultSet(Records(1));
  289. HashSet<dynamic> generic = list;
  290. Assert.IsNotNull(generic);
  291. Assert.AreEqual("0", generic.Single().Data);
  292. }
  293. [Test]
  294. public void ToArrayCreatesArray()
  295. {
  296. dynamic list = new SimpleResultSet(Records(1));
  297. dynamic[] array = list.ToArray();
  298. Assert.IsNotNull(array);
  299. Assert.AreEqual(1, array.Length);
  300. Assert.AreEqual("0", array[0].Data);
  301. }
  302. [Test]
  303. public void ToGenericArrayCreatesTypedArray()
  304. {
  305. dynamic list = new SimpleResultSet(Records(1));
  306. TestType[] array = list.ToArray<TestType>();
  307. Assert.IsNotNull(array);
  308. Assert.AreEqual(1, array.Length);
  309. Assert.AreEqual("0", array[0].Data);
  310. }
  311. [Test]
  312. public void ToListCreatesList()
  313. {
  314. dynamic list = new SimpleResultSet(Records(1));
  315. List<dynamic> array = list.ToList();
  316. Assert.IsNotNull(array);
  317. Assert.AreEqual(1, array.Count);
  318. Assert.AreEqual("0", array[0].Data);
  319. }
  320. [Test]
  321. public void ToGenericListCreatesTypedList()
  322. {
  323. dynamic list = new SimpleResultSet(Records(1));
  324. List<TestType> converted = list.ToList<TestType>();
  325. Assert.IsNotNull(converted);
  326. Assert.AreEqual(1, converted.Count);
  327. Assert.AreEqual("0", converted[0].Data);
  328. }
  329. [Test]
  330. public void CastToGenericCreatesTypedList()
  331. {
  332. dynamic list = new SimpleResultSet(Records(1));
  333. IEnumerable<TestType> converted = list.Cast<TestType>();
  334. Assert.IsNotNull(converted);
  335. Assert.AreEqual(1, converted.Count());
  336. Assert.AreEqual("0", converted.First().Data);
  337. }
  338. [Test]
  339. public void CastToGenericCreatesTypedListWithSubTypes()
  340. {
  341. var firstRecord = new SimpleRecord(new Dictionary<string, object>
  342. {
  343. { "Data", "First" },
  344. { "List", new List<string> { "First-One", "First-Two" } }
  345. });
  346. var list = new SimpleResultSet(new List<dynamic> { firstRecord });
  347. var result = list.Cast<TestType2>().First();
  348. Assert.AreEqual(2, result.List.Count);
  349. }
  350. }
  351. class TestType
  352. {
  353. public string Data { get; set; }
  354. }
  355. class TestType2
  356. {
  357. public string Data { get; set; }
  358. public List<string> List { get; set; }
  359. }
  360. }