/PetaPoco.Tests/SqlBuilder.cs

http://github.com/toptensoftware/PetaPoco · C# · 277 lines · 231 code · 43 blank · 3 comment · 0 complexity · 18e57eff038b7159cca7bc06cce8af9a MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using PetaTest;
  6. using PetaPoco;
  7. namespace PetaPoco.Tests
  8. {
  9. [TestFixture]
  10. public class SqlBuilder
  11. {
  12. public SqlBuilder()
  13. {
  14. }
  15. [Test]
  16. public void simple_append()
  17. {
  18. var sql = new Sql();
  19. sql.Append("LINE 1");
  20. sql.Append("LINE 2");
  21. sql.Append("LINE 3");
  22. Assert.AreEqual(sql.SQL, "LINE 1\nLINE 2\nLINE 3");
  23. Assert.AreEqual(sql.Arguments.Length, 0);
  24. }
  25. [Test]
  26. public void single_arg()
  27. {
  28. var sql = new Sql();
  29. sql.Append("arg @0", "a1");
  30. Assert.AreEqual(sql.SQL, "arg @0");
  31. Assert.AreEqual(sql.Arguments.Length, 1);
  32. Assert.AreEqual(sql.Arguments[0], "a1");
  33. }
  34. [Test]
  35. public void multiple_args()
  36. {
  37. var sql = new Sql();
  38. sql.Append("arg @0 @1", "a1", "a2");
  39. Assert.AreEqual(sql.SQL, "arg @0 @1");
  40. Assert.AreEqual(sql.Arguments.Length, 2);
  41. Assert.AreEqual(sql.Arguments[0], "a1");
  42. Assert.AreEqual(sql.Arguments[1], "a2");
  43. }
  44. [Test]
  45. public void unused_args()
  46. {
  47. var sql = new Sql();
  48. sql.Append("arg @0 @2", "a1", "a2", "a3");
  49. Assert.AreEqual(sql.SQL, "arg @0 @1");
  50. Assert.AreEqual(sql.Arguments.Length, 2);
  51. Assert.AreEqual(sql.Arguments[0], "a1");
  52. Assert.AreEqual(sql.Arguments[1], "a3");
  53. }
  54. [Test]
  55. public void unordered_args()
  56. {
  57. var sql = new Sql();
  58. sql.Append("arg @2 @1", "a1", "a2", "a3");
  59. Assert.AreEqual(sql.SQL, "arg @0 @1");
  60. Assert.AreEqual(sql.Arguments.Length, 2);
  61. Assert.AreEqual(sql.Arguments[0], "a3");
  62. Assert.AreEqual(sql.Arguments[1], "a2");
  63. }
  64. [Test]
  65. public void repeated_args()
  66. {
  67. var sql = new Sql();
  68. sql.Append("arg @0 @1 @0 @1", "a1", "a2");
  69. Assert.AreEqual(sql.SQL, "arg @0 @1 @2 @3");
  70. Assert.AreEqual(sql.Arguments.Length, 4);
  71. Assert.AreEqual(sql.Arguments[0], "a1");
  72. Assert.AreEqual(sql.Arguments[1], "a2");
  73. Assert.AreEqual(sql.Arguments[2], "a1");
  74. Assert.AreEqual(sql.Arguments[3], "a2");
  75. }
  76. [Test]
  77. public void mysql_user_vars()
  78. {
  79. var sql = new Sql();
  80. sql.Append("arg @@user1 @2 @1 @@@system1", "a1", "a2", "a3");
  81. Assert.AreEqual(sql.SQL, "arg @@user1 @0 @1 @@@system1");
  82. Assert.AreEqual(sql.Arguments.Length, 2);
  83. Assert.AreEqual(sql.Arguments[0], "a3");
  84. Assert.AreEqual(sql.Arguments[1], "a2");
  85. }
  86. [Test]
  87. public void named_args()
  88. {
  89. var sql = new Sql();
  90. sql.Append("arg @name @password", new { name = "n", password = "p" });
  91. Assert.AreEqual(sql.SQL, "arg @0 @1");
  92. Assert.AreEqual(sql.Arguments.Length, 2);
  93. Assert.AreEqual(sql.Arguments[0], "n");
  94. Assert.AreEqual(sql.Arguments[1], "p");
  95. }
  96. [Test]
  97. public void mixed_named_and_numbered_args()
  98. {
  99. var sql = new Sql();
  100. sql.Append("arg @0 @name @1 @password @2", "a1", "a2", "a3", new { name = "n", password = "p" });
  101. Assert.AreEqual(sql.SQL, "arg @0 @1 @2 @3 @4");
  102. Assert.AreEqual(sql.Arguments.Length, 5);
  103. Assert.AreEqual(sql.Arguments[0], "a1");
  104. Assert.AreEqual(sql.Arguments[1], "n");
  105. Assert.AreEqual(sql.Arguments[2], "a2");
  106. Assert.AreEqual(sql.Arguments[3], "p");
  107. Assert.AreEqual(sql.Arguments[4], "a3");
  108. }
  109. [Test]
  110. public void append_with_args()
  111. {
  112. var sql = new Sql();
  113. sql.Append("l1 @0", "a0");
  114. sql.Append("l2 @0", "a1");
  115. sql.Append("l3 @0", "a2");
  116. Assert.AreEqual(sql.SQL, "l1 @0\nl2 @1\nl3 @2");
  117. Assert.AreEqual(sql.Arguments.Length, 3);
  118. Assert.AreEqual(sql.Arguments[0], "a0");
  119. Assert.AreEqual(sql.Arguments[1], "a1");
  120. Assert.AreEqual(sql.Arguments[2], "a2");
  121. }
  122. [Test]
  123. public void append_with_args2()
  124. {
  125. var sql = new Sql();
  126. sql.Append("l1");
  127. sql.Append("l2 @0 @1", "a1", "a2");
  128. sql.Append("l3 @0", "a3");
  129. Assert.AreEqual(sql.SQL, "l1\nl2 @0 @1\nl3 @2");
  130. Assert.AreEqual(sql.Arguments.Length, 3);
  131. Assert.AreEqual(sql.Arguments[0], "a1");
  132. Assert.AreEqual(sql.Arguments[1], "a2");
  133. Assert.AreEqual(sql.Arguments[2], "a3");
  134. }
  135. [Test]
  136. public void invalid_arg_index()
  137. {
  138. Assert.Throws<ArgumentOutOfRangeException>(()=>{
  139. var sql = new Sql();
  140. sql.Append("arg @0 @1", "a0");
  141. Assert.AreEqual(sql.SQL, "arg @0 @1");
  142. });
  143. }
  144. [Test]
  145. public void invalid_arg_name()
  146. {
  147. Assert.Throws<ArgumentException>(() =>
  148. {
  149. var sql = new Sql();
  150. sql.Append("arg @name1 @name2", new { x = 1, y = 2 });
  151. Assert.AreEqual(sql.SQL, "arg @0 @1");
  152. });
  153. }
  154. [Test]
  155. public void append_instances()
  156. {
  157. var sql = new Sql("l0 @0", "a0");
  158. var sql1 = new Sql("l1 @0", "a1");
  159. var sql2 = new Sql("l2 @0", "a2");
  160. Assert.AreSame(sql.Append(sql1), sql);
  161. Assert.AreSame(sql.Append(sql2), sql);
  162. Assert.AreEqual(sql.SQL, "l0 @0\nl1 @1\nl2 @2");
  163. Assert.AreEqual(sql.Arguments.Length, 3);
  164. Assert.AreEqual(sql.Arguments[0], "a0");
  165. Assert.AreEqual(sql.Arguments[1], "a1");
  166. Assert.AreEqual(sql.Arguments[2], "a2");
  167. }
  168. [Test]
  169. public void ConsecutiveWhere()
  170. {
  171. var sql = new Sql()
  172. .Append("SELECT * FROM blah");
  173. sql.Append("WHERE x");
  174. sql.Append("WHERE y");
  175. Assert.AreEqual(sql.SQL, "SELECT * FROM blah\nWHERE x\nAND y");
  176. }
  177. [Test]
  178. public void ConsecutiveOrderBy()
  179. {
  180. var sql = new Sql()
  181. .Append("SELECT * FROM blah");
  182. sql.Append("ORDER BY x");
  183. sql.Append("ORDER BY y");
  184. Assert.AreEqual(sql.SQL, "SELECT * FROM blah\nORDER BY x\n, y");
  185. }
  186. [Test]
  187. public void param_expansion_1()
  188. {
  189. // Simple collection parameter expansion
  190. var sql = Sql.Builder.Append("@0 IN (@1) @2", 20, new int[] { 1, 2, 3 }, 30);
  191. Assert.AreEqual(sql.SQL, "@0 IN (@1,@2,@3) @4");
  192. Assert.AreEqual(sql.Arguments.Length, 5);
  193. Assert.AreEqual(sql.Arguments[0], 20);
  194. Assert.AreEqual(sql.Arguments[1], 1);
  195. Assert.AreEqual(sql.Arguments[2], 2);
  196. Assert.AreEqual(sql.Arguments[3], 3);
  197. Assert.AreEqual(sql.Arguments[4], 30);
  198. }
  199. [Test]
  200. public void param_expansion_2()
  201. {
  202. // Out of order expansion
  203. var sql = Sql.Builder.Append("IN (@3) (@1)", null, new int[] { 1, 2, 3 }, null, new int[] { 4, 5, 6 });
  204. Assert.AreEqual(sql.SQL, "IN (@0,@1,@2) (@3,@4,@5)");
  205. Assert.AreEqual(sql.Arguments.Length, 6);
  206. Assert.AreEqual(sql.Arguments[0], 4);
  207. Assert.AreEqual(sql.Arguments[1], 5);
  208. Assert.AreEqual(sql.Arguments[2], 6);
  209. Assert.AreEqual(sql.Arguments[3], 1);
  210. Assert.AreEqual(sql.Arguments[4], 2);
  211. Assert.AreEqual(sql.Arguments[5], 3);
  212. }
  213. [Test]
  214. public void param_expansion_named()
  215. {
  216. // Expand a named parameter
  217. var sql = Sql.Builder.Append("IN (@numbers)", new { numbers = (new int[] { 1, 2, 3 }) } );
  218. Assert.AreEqual(sql.SQL, "IN (@0,@1,@2)");
  219. Assert.AreEqual(sql.Arguments.Length, 3);
  220. Assert.AreEqual(sql.Arguments[0], 1);
  221. Assert.AreEqual(sql.Arguments[1], 2);
  222. Assert.AreEqual(sql.Arguments[2], 3);
  223. }
  224. [Test]
  225. public void join()
  226. {
  227. var sql = Sql.Builder
  228. .Select("*")
  229. .From("articles")
  230. .LeftJoin("comments").On("articles.article_id=comments.article_id");
  231. Assert.AreEqual(sql.SQL, "SELECT *\nFROM articles\nLEFT JOIN comments\nON articles.article_id=comments.article_id");
  232. }
  233. }
  234. }