PageRenderTime 40ms CodeModel.GetById 13ms RepoModel.GetById 1ms app.codeStats 0ms

/src/NHibernate.Test/Linq/FunctionTests.cs

https://github.com/okb/nhibernate-core
C# | 341 lines | 280 code | 60 blank | 1 comment | 22 complexity | a4b36c206e67f8822ed592a4ee9bfc2a MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause, LGPL-2.1, MPL-2.0-no-copyleft-exception, LGPL-3.0, Apache-2.0, CC-BY-SA-3.0
  1. using System;
  2. using System.Linq;
  3. using System.Collections.Generic;
  4. using NHibernate.Dialect;
  5. using NHibernate.DomainModel;
  6. using NHibernate.DomainModel.Northwind.Entities;
  7. using NHibernate.Linq;
  8. using NUnit.Framework;
  9. namespace NHibernate.Test.Linq
  10. {
  11. [TestFixture]
  12. public class FunctionTests : LinqTestCase
  13. {
  14. [Test]
  15. public void SubstringFunction2()
  16. {
  17. if (Dialect is FirebirdDialect)
  18. Assert.Ignore("Firebird before 2.0 only support integer literals for substring() - NH generates parameters.");
  19. var query = (from e in db.Employees
  20. where e.FirstName.Substring(0, 2) == "An"
  21. select e).ToList();
  22. Assert.That(query.Count, Is.EqualTo(2));
  23. }
  24. [Test]
  25. public void SubstringFunction1()
  26. {
  27. if (Dialect is FirebirdDialect)
  28. Assert.Ignore("Firebird before 2.0 only support integer literals for substring() - NH generates parameters.");
  29. var query = (from e in db.Employees
  30. where e.FirstName.Substring(3) == "rew"
  31. select e).ToList();
  32. Assert.That(query.Count, Is.EqualTo(1));
  33. Assert.That(query[0].FirstName, Is.EqualTo("Andrew"));
  34. }
  35. [Test]
  36. public void LeftFunction()
  37. {
  38. var query = (from e in db.Employees
  39. where e.FirstName.Substring(0, 2) == "An"
  40. select e.FirstName.Substring(3)).ToList();
  41. Assert.That(query.Count, Is.EqualTo(2));
  42. Assert.That(query[0], Is.EqualTo("rew")); //Andrew
  43. Assert.That(query[1], Is.EqualTo("e")); //Anne
  44. }
  45. [Test]
  46. public void ReplaceFunction()
  47. {
  48. var query = from e in db.Employees
  49. where e.FirstName.StartsWith("An")
  50. select new
  51. {
  52. Before = e.FirstName,
  53. AfterMethod = e.FirstName.Replace("An", "Zan"),
  54. AfterExtension = ExtensionMethods.Replace(e.FirstName, "An", "Zan"),
  55. AfterExtension2 = e.FirstName.ReplaceExtension("An", "Zan")
  56. };
  57. var s = ObjectDumper.Write(query);
  58. }
  59. [Test]
  60. public void CharIndexFunction()
  61. {
  62. if (!TestDialect.SupportsLocate)
  63. Assert.Ignore("Locate function not supported.");
  64. var query = from e in db.Employees
  65. where e.FirstName.IndexOf('A') == 1
  66. select e.FirstName;
  67. ObjectDumper.Write(query);
  68. }
  69. [Test]
  70. public void IndexOfFunctionExpression()
  71. {
  72. if (!TestDialect.SupportsLocate)
  73. Assert.Ignore("Locate function not supported.");
  74. var query = from e in db.Employees
  75. where e.FirstName.IndexOf("An") == 1
  76. select e.FirstName;
  77. ObjectDumper.Write(query);
  78. }
  79. [Test]
  80. public void IndexOfFunctionProjection()
  81. {
  82. if (!TestDialect.SupportsLocate)
  83. Assert.Ignore("Locate function not supported.");
  84. var query = from e in db.Employees
  85. where e.FirstName.Contains("a")
  86. select e.FirstName.IndexOf('A', 3);
  87. ObjectDumper.Write(query);
  88. }
  89. [Test]
  90. public void TwoFunctionExpression()
  91. {
  92. if (!TestDialect.SupportsLocate)
  93. Assert.Ignore("Locate function not supported.");
  94. var query = from e in db.Employees
  95. where e.FirstName.IndexOf("A") == e.BirthDate.Value.Month
  96. select e.FirstName;
  97. ObjectDumper.Write(query);
  98. }
  99. [Test]
  100. public void ToStringFunction()
  101. {
  102. var query = from ol in db.OrderLines
  103. where ol.Quantity.ToString() == "4"
  104. select ol;
  105. Assert.AreEqual(55, query.Count());
  106. }
  107. [Test]
  108. public void ToStringWithContains()
  109. {
  110. var query = from ol in db.OrderLines
  111. where ol.Quantity.ToString().Contains("5")
  112. select ol;
  113. Assert.AreEqual(498, query.Count());
  114. }
  115. [Test]
  116. public void Coalesce()
  117. {
  118. Assert.AreEqual(2, session.Query<AnotherEntity>().Where(e => (e.Input ?? "hello") == "hello").Count());
  119. }
  120. [Test]
  121. public void Trim()
  122. {
  123. List<int> idsToDelete = new List<int>();
  124. try
  125. {
  126. AnotherEntity ae1 = new AnotherEntity {Input = " hi "};
  127. AnotherEntity ae2 = new AnotherEntity {Input = "hi"};
  128. AnotherEntity ae3 = new AnotherEntity {Input = "heh"};
  129. session.Save(ae1);
  130. idsToDelete.Add(ae1.Id);
  131. session.Save(ae2);
  132. idsToDelete.Add(ae2.Id);
  133. session.Save(ae3);
  134. idsToDelete.Add(ae3.Id);
  135. session.Flush();
  136. Assert.AreEqual(2, session.Query<AnotherEntity>().Where(e => e.Input.Trim() == "hi").Count());
  137. Assert.AreEqual(1, session.Query<AnotherEntity>().Where(e => e.Input.TrimEnd() == " hi").Count());
  138. // Emulated trim does not support multiple trim characters, but for many databases it should work fine anyways.
  139. Assert.AreEqual(1, session.Query<AnotherEntity>().Where(e => e.Input.Trim('h') == "e").Count());
  140. Assert.AreEqual(1, session.Query<AnotherEntity>().Where(e => e.Input.TrimStart('h') == "eh").Count());
  141. Assert.AreEqual(1, session.Query<AnotherEntity>().Where(e => e.Input.TrimEnd('h') == "he").Count());
  142. }
  143. finally
  144. {
  145. foreach (int idToDelete in idsToDelete)
  146. session.Delete(session.Get<AnotherEntity>(idToDelete));
  147. session.Flush();
  148. }
  149. }
  150. [Test, Ignore()]
  151. public void TrimTrailingWhitespace()
  152. {
  153. try
  154. {
  155. session.Save(new AnotherEntity {Input = " hi "});
  156. session.Save(new AnotherEntity {Input = "hi"});
  157. session.Save(new AnotherEntity {Input = "heh"});
  158. session.Flush();
  159. Assert.AreEqual(TestDialect.IgnoresTrailingWhitespace ? 2 : 1, session.Query<AnotherEntity>().Where(e => e.Input.TrimStart() == "hi ").Count());
  160. }
  161. finally
  162. {
  163. session.Delete("from AnotherEntity e where e.Id > 5");
  164. session.Flush();
  165. }
  166. }
  167. [Test]
  168. public void WhereStringEqual()
  169. {
  170. var query = (from item in db.Users
  171. where item.Name.Equals("ayende")
  172. select item).ToList();
  173. ObjectDumper.Write(query);
  174. }
  175. [Test]
  176. public void WhereIntEqual()
  177. {
  178. var query = (from item in db.Users
  179. where item.Id.Equals(-1)
  180. select item).ToList();
  181. ObjectDumper.Write(query);
  182. }
  183. [Test]
  184. public void WhereShortEqual()
  185. {
  186. var query = from item in session.Query<Foo>()
  187. where item.Short.Equals(-1)
  188. select item;
  189. ObjectDumper.Write(query);
  190. }
  191. [Test]
  192. public void WhereBoolConstantEqual()
  193. {
  194. var query = from item in db.Role
  195. where item.IsActive.Equals(true)
  196. select item;
  197. ObjectDumper.Write(query);
  198. }
  199. [Test]
  200. public void WhereBoolParameterEqual()
  201. {
  202. var query = from item in db.Role
  203. where item.IsActive.Equals(1 == 1)
  204. select item;
  205. ObjectDumper.Write(query);
  206. }
  207. [Test]
  208. public void WhereBoolFuncEqual()
  209. {
  210. Func<bool> f = () => 1 == 1;
  211. var query = from item in db.Role
  212. where item.IsActive.Equals(f())
  213. select item;
  214. ObjectDumper.Write(query);
  215. }
  216. [Test]
  217. public void WhereLongEqual()
  218. {
  219. var query = from item in db.PatientRecords
  220. where item.Id.Equals(-1)
  221. select item;
  222. ObjectDumper.Write(query);
  223. }
  224. [Test]
  225. public void WhereDateTimeEqual()
  226. {
  227. var query = from item in db.Users
  228. where item.RegisteredAt.Equals(DateTime.Today)
  229. select item;
  230. ObjectDumper.Write(query);
  231. }
  232. [Test]
  233. public void WhereGuidEqual()
  234. {
  235. var query = from item in db.Shippers
  236. where item.Reference.Equals(Guid.Empty)
  237. select item;
  238. ObjectDumper.Write(query);
  239. }
  240. [Test]
  241. public void WhereDoubleEqual()
  242. {
  243. var query = from item in db.Animals
  244. where item.BodyWeight.Equals(-1)
  245. select item;
  246. ObjectDumper.Write(query);
  247. }
  248. [Test]
  249. public void WhereFloatEqual()
  250. {
  251. var query = from item in session.Query<Foo>()
  252. where item.Float.Equals(-1)
  253. select item;
  254. ObjectDumper.Write(query);
  255. }
  256. [Test]
  257. public void WhereCharEqual()
  258. {
  259. var query = from item in session.Query<Foo>()
  260. where item.Char.Equals('A')
  261. select item;
  262. ObjectDumper.Write(query);
  263. }
  264. [Test]
  265. public void WhereByteEqual()
  266. {
  267. var query = from item in session.Query<Foo>()
  268. where item.Byte.Equals(1)
  269. select item;
  270. ObjectDumper.Write(query);
  271. }
  272. [Test]
  273. public void WhereDecimalEqual()
  274. {
  275. var query = from item in db.OrderLines
  276. where item.Discount.Equals(-1)
  277. select item;
  278. ObjectDumper.Write(query);
  279. }
  280. }
  281. }