PageRenderTime 53ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 1ms

/ControllableQuery/DevBranches/Demo/Source/ConsoleApplication2/MainTest.cs

#
C# | 344 lines | 329 code | 15 blank | 0 comment | 4 complexity | f76712ba3793331c346e4c4cbd91d040 MD5 | raw file
  1. using System;
  2. using System.Linq;
  3. using NUnit.Framework;
  4. using PropertyExpression.Common;
  5. using PropertyExpression.ControllableQuery;
  6. using PropertyExpression.ControllableQuery.Toolkit;
  7. namespace ConsoleApplication2
  8. {
  9. [TestFixture]
  10. public class QueryTest
  11. {
  12. [Test]
  13. public void CheckAllQueries()
  14. {
  15. var qRepository = new FindUsagesQRepository();
  16. QueryChecker.CheckAllQueries(
  17. QExecutor.ConnectionString,
  18. typeof (Program).Assembly,
  19. (type, context) => {
  20. if (typeof(Program.RedSwitch).Equals(type))
  21. return typeof (Program).Assembly.GetTypes().Where(type.IsAssignableFrom)
  22. .SelectMany(_ => context.GetConstructorInvocations(_));
  23. throw new ApplicationException();
  24. },
  25. qRepository);
  26. foreach (var qLocationString in qRepository.FindUsages(
  27. QExecutor.ConnectionString, "BillOfMaterialsLine", "PartNumber".AsOption())
  28. .Select(QLocationExtensions.GetQLocationString))
  29. {
  30. Console.WriteLine(qLocationString);
  31. }
  32. }
  33. private class IdGenerator
  34. {
  35. private int i;
  36. public int NewId()
  37. {
  38. return i++;
  39. }
  40. }
  41. [Test]
  42. public void InsertTestData()
  43. {
  44. QExecutor.ExecuteNonQuery(() => new Q("DELETE FROM ServicePartsPage").NonQuery());
  45. QExecutor.ExecuteNonQuery(() => new Q("DELETE FROM ModelPublication").NonQuery());
  46. QExecutor.ExecuteNonQuery(() => new Q("DELETE FROM LocalizedPublication").NonQuery());
  47. QExecutor.ExecuteNonQuery(() => new Q("DELETE FROM Publication").NonQuery());
  48. QExecutor.ExecuteNonQuery(() => new Q("DELETE FROM PublicationType").NonQuery());
  49. QExecutor.ExecuteNonQuery(() => new Q("DELETE FROM BillOfMaterialsLine").NonQuery());
  50. QExecutor.ExecuteNonQuery(() => new Q("DELETE FROM BillOfMaterialsHeader").NonQuery());
  51. QExecutor.ExecuteNonQuery(() => new Q("DELETE FROM Model").NonQuery());
  52. var idGenerator = new IdGenerator();
  53. var modelCode = "M1";
  54. var modelSequence = "MS1";
  55. var modelId = idGenerator.NewId();
  56. InsertModel(modelId, modelCode, modelSequence);
  57. var publicationTypeID = idGenerator.NewId();
  58. InsertPublicationType(publicationTypeID, 1);
  59. var publicationID1 = idGenerator.NewId();
  60. InsertPublication(publicationID1, "P1", publicationTypeID, Option.Nothing<int>());
  61. var languageCode = "en";
  62. InsertLocalizedPublication("PubName1", idGenerator.NewId(), publicationID1, languageCode);
  63. var modelPublicationId = idGenerator.NewId();
  64. InsertModelPublication(modelPublicationId, modelCode, modelSequence, publicationID1);
  65. var billOfMaterialsHeaderId1 = idGenerator.NewId();
  66. InsertBillOfMaterialsHeader(billOfMaterialsHeaderId1);
  67. var partNumber1 = "PN1";
  68. InsertBillOfMaterialsLine(idGenerator.NewId(), 1, 1, 0, 1, 1, partNumber1, billOfMaterialsHeaderId1);
  69. var partNumber2 = "PN2";
  70. InsertBillOfMaterialsLine(idGenerator.NewId(), 0, 1, 1, 1, 2, partNumber2, billOfMaterialsHeaderId1);
  71. var partNumber3 = "PN3";
  72. InsertBillOfMaterialsLine(idGenerator.NewId(), 0, 1, 1, 1, 3, partNumber3, billOfMaterialsHeaderId1);
  73. var servicePartsPageId1 = idGenerator.NewId();
  74. InsertServicePartsPage(servicePartsPageId1, modelPublicationId, billOfMaterialsHeaderId1);
  75. var billOfMaterialsHeaderId2 = idGenerator.NewId();
  76. InsertBillOfMaterialsHeader(billOfMaterialsHeaderId2);
  77. InsertBillOfMaterialsLine(idGenerator.NewId(), 1, 1, 1, 0, 1, partNumber1, billOfMaterialsHeaderId2);
  78. InsertServicePartsPage(idGenerator.NewId(), modelPublicationId, billOfMaterialsHeaderId2);
  79. var billOfMaterialsHeaderId3 = idGenerator.NewId();
  80. InsertBillOfMaterialsHeader(billOfMaterialsHeaderId3);
  81. InsertBillOfMaterialsLine(idGenerator.NewId(), 1, 0, 1, 1, 1, partNumber2, billOfMaterialsHeaderId3);
  82. InsertServicePartsPage(idGenerator.NewId(), modelPublicationId, billOfMaterialsHeaderId3);
  83. var publicationID2 = idGenerator.NewId();
  84. InsertPublication(publicationID2, "P2", publicationTypeID, publicationID2.AsOption());
  85. InsertLocalizedPublication("PubName2", idGenerator.NewId(), publicationID2, languageCode);
  86. var modelPublicationId2 = idGenerator.NewId();
  87. InsertModelPublication(modelPublicationId2, modelCode, modelSequence, publicationID2);
  88. var billOfMaterialsHeaderId4 = idGenerator.NewId();
  89. InsertBillOfMaterialsHeader(billOfMaterialsHeaderId4);
  90. InsertBillOfMaterialsLine(idGenerator.NewId(), 1, 0, 1, 1, 1, partNumber3, billOfMaterialsHeaderId4);
  91. InsertServicePartsPage(idGenerator.NewId(), modelPublicationId2, billOfMaterialsHeaderId4);
  92. Assert.AreEqual(
  93. 1,
  94. LineWithLink(modelId, languageCode, billOfMaterialsHeaderId1, servicePartsPageId1, modelPublicationId, false, false));
  95. Assert.AreEqual(
  96. 3,
  97. LineWithLink(modelId, languageCode, billOfMaterialsHeaderId1, servicePartsPageId1, modelPublicationId, true, false));
  98. Assert.AreEqual(
  99. 2,
  100. LineWithLink(modelId, languageCode, billOfMaterialsHeaderId1, servicePartsPageId1, modelPublicationId, true, true));
  101. }
  102. private static int LineWithLink(int modelId, string languageCode, int billOfMaterialsHeaderId1, int servicePartsPageId1, int modelPublicationId, bool redCondition, bool blueCondition)
  103. {
  104. return QExecutor.MaterializeReader(
  105. context => new {
  106. billOfMaterialsHeaderId = context.Param(billOfMaterialsHeaderId1),
  107. modelPublicationId = context.Param(modelPublicationId),
  108. servicePartsPageId = context.Param(servicePartsPageId1),
  109. languageCode = context.Param(languageCode),
  110. modelId = context.Param(modelId),
  111. redCondition,
  112. blueCondition
  113. },
  114. p => {
  115. var q = new Q(@"FROM BillOfMaterialsLine
  116. WHERE BillOfMaterialsHeaderId = ")._(p.billOfMaterialsHeaderId)._(@"
  117. AND ( ( BillOfMaterialsLine.MainLinkExcludedFrom = 0
  118. AND EXISTS ( SELECT 1
  119. FROM MainPartLink
  120. WHERE MainPartLink.PartNumber = BillOfMaterialsLine.PartNumber
  121. AND MainPartLink.ModelPublicationId = ")._(p.modelPublicationId)._(@"
  122. AND MainPartLink.ServicePartsPageId <> ")._(p.servicePartsPageId)._(@" )
  123. )");
  124. if (p.redCondition)
  125. {
  126. q._(@"
  127. OR ( BillOfMaterialsLine.InnerLinkExcludedFrom = 0
  128. AND EXISTS ( SELECT 1
  129. FROM InnerPartLink
  130. INNER JOIN Model
  131. ON InnerPartLink.ModelCode = Model.ModelCode
  132. AND InnerPartLink.ModelSequence = Model.ModelSequence");
  133. if (p.blueCondition)
  134. q._(@"
  135. INNER JOIN Publication
  136. ON InnerPartLink.PublicationId = Publication.PublicationId");
  137. q._(@"
  138. INNER JOIN LocalizedPublication
  139. ON InnerPartLink.PublicationId = LocalizedPublication.PublicationId
  140. AND LocalizedPublication.LanguageCode = ")._(p.languageCode)._(@"
  141. WHERE InnerPartLink.PartNumber = BillOfMaterialsLine.PartNumber
  142. AND Model.ModelId = ")._(p.modelId);
  143. if (p.blueCondition)
  144. q._(@"
  145. AND Publication.FollowingPublicationId IS NULL");
  146. q._(@" )
  147. )");
  148. }
  149. q._(@"
  150. )");
  151. return q.Select(_ => new {
  152. BillOfMaterialsLineId = _._<int>(),
  153. PartNumber = _._<string>()
  154. });
  155. }).Count();
  156. }
  157. private static void InsertPublicationType(int publicationTypeID, int code)
  158. {
  159. QExecutor.ExecuteNonQuery(
  160. context => new {
  161. PublicationTypeId = context.Param(publicationTypeID),
  162. Code = context.Param(code)
  163. },
  164. p => new Q(@"INSERT INTO PublicationType
  165. ( PublicationTypeId,
  166. Code,
  167. Decimal1,
  168. Money1
  169. )
  170. VALUES ( ")._(p.PublicationTypeId)._(@",
  171. ")._(p.Code)._(@",
  172. 7,
  173. 7
  174. )").NonQuery());
  175. }
  176. private static void InsertPublication(int publicationID, string code, int publicationTypeId, IOption<int> followingPublicationId)
  177. {
  178. QExecutor.ExecuteNonQuery(
  179. context => new {
  180. PublicationId = context.Param(publicationID),
  181. Code = context.Param(code),
  182. PublicationTypeId = context.Param(publicationTypeId),
  183. FollowingPublicationId = context.Param(followingPublicationId)
  184. },
  185. p => new Q(@"INSERT INTO Publication
  186. ( PublicationId,
  187. Code,
  188. PublicationTypeId,
  189. FollowingPublicationId
  190. )
  191. VALUES ( ")._(p.PublicationId)._(@",
  192. ")._(p.Code)._(@",
  193. ")._(p.PublicationTypeId)._(@",
  194. ")._(p.FollowingPublicationId)._(@"
  195. )").NonQuery());
  196. }
  197. private static void InsertModelPublication(int modelPublicationId, string modelCode, string modelSequence, int publicationId)
  198. {
  199. QExecutor.ExecuteNonQuery(
  200. context => new {
  201. ModelPublicationId = context.Param(modelPublicationId),
  202. ModelCode = context.Param(modelCode),
  203. ModelSequence = context.Param(modelSequence),
  204. PublicationId = context.Param(publicationId)
  205. },
  206. p => new Q(@"INSERT INTO ModelPublication
  207. ( ModelPublicationId,
  208. ModelCode,
  209. ModelSequence,
  210. PublicationId
  211. )
  212. VALUES ( ")._(p.ModelPublicationId)._(@",
  213. ")._(p.ModelCode)._(@",
  214. ")._(p.ModelSequence)._(@",
  215. ")._(p.PublicationId)._(@"
  216. )").NonQuery());
  217. }
  218. private static void InsertServicePartsPage(int servicePartsPageId, int modelPublicationId, int billOfMaterialsHeaderId)
  219. {
  220. QExecutor.ExecuteNonQuery(
  221. context => new {
  222. ServicePartsPageId = context.Param(servicePartsPageId),
  223. ModelPublicationId = context.Param(modelPublicationId),
  224. BillOfMaterialsHeaderId = context.Param(billOfMaterialsHeaderId)
  225. },
  226. p => new Q(@"INSERT INTO ServicePartsPage
  227. ( ServicePartsPageId,
  228. ModelPublicationId,
  229. BillOfMaterialsHeaderId
  230. )
  231. VALUES ( ")._(p.ServicePartsPageId)._(@",
  232. ")._(p.ModelPublicationId)._(@",
  233. ")._(p.BillOfMaterialsHeaderId)._(@"
  234. )").NonQuery());
  235. }
  236. private static void InsertBillOfMaterialsHeader(int billOfMaterialsHeaderId)
  237. {
  238. QExecutor.ExecuteNonQuery(
  239. context => new {
  240. BillOfMaterialsHeaderId = context.Param(billOfMaterialsHeaderId)
  241. },
  242. p => new Q(@"INSERT INTO BillOfMaterialsHeader
  243. ( BillOfMaterialsHeaderId
  244. )
  245. VALUES ( ")._(p.BillOfMaterialsHeaderId)._(@"
  246. )").NonQuery());
  247. }
  248. private static void InsertBillOfMaterialsLine(
  249. int billOfMaterialsLineId,
  250. int innerLinkExcludedFrom,
  251. int innerLinkExcludedTo,
  252. int mainLinkExcludedFrom,
  253. int mainLinkExcludedTo,
  254. int itemSequence,
  255. string partNumber,
  256. int billOfMaterialsHeaderId)
  257. {
  258. QExecutor.ExecuteNonQuery(
  259. context => new {
  260. BillOfMaterialsLineId = context.Param(billOfMaterialsLineId),
  261. InnerLinkExcludedFrom = context.Param(innerLinkExcludedFrom),
  262. InnerLinkExcludedTo = context.Param(innerLinkExcludedTo),
  263. MainLinkExcludedFrom = context.Param(mainLinkExcludedFrom),
  264. MainLinkExcludedTo = context.Param(mainLinkExcludedTo),
  265. ItemSequence = context.Param(itemSequence),
  266. PartNumber = context.Param(partNumber),
  267. BillOfMaterialsHeaderId = context.Param(billOfMaterialsHeaderId),
  268. },
  269. p => new Q(@"INSERT INTO BillOfMaterialsLine
  270. ( BillOfMaterialsLineId,
  271. InnerLinkExcludedFrom,
  272. InnerLinkExcludedTo,
  273. MainLinkExcludedFrom,
  274. MainLinkExcludedTo,
  275. ItemSequence,
  276. PartNumber,
  277. BillOfMaterialsHeaderId
  278. )
  279. VALUES ( ")._(p.BillOfMaterialsLineId)._(@",
  280. ")._(p.InnerLinkExcludedFrom)._(@",
  281. ")._(p.InnerLinkExcludedTo)._(@",
  282. ")._(p.MainLinkExcludedFrom)._(@",
  283. ")._(p.MainLinkExcludedTo)._(@",
  284. ")._(p.ItemSequence)._(@",
  285. ")._(p.PartNumber)._(@",
  286. ")._(p.BillOfMaterialsHeaderId)._(@"
  287. )").NonQuery());
  288. }
  289. private static void InsertModel(int modelId, string modelCode, string modelSequence)
  290. {
  291. QExecutor.ExecuteNonQuery(
  292. context => new {
  293. ModelId = context.Param(modelId),
  294. ModelCode = context.Param(modelCode),
  295. ModelSequence = context.Param(modelSequence)
  296. },
  297. p => new Q(@"INSERT INTO Model
  298. ( ModelId,
  299. ModelCode,
  300. ModelSequence
  301. )
  302. VALUES ( ")._(p.ModelId)._(@",
  303. ")._(p.ModelCode)._(@",
  304. ")._(p.ModelSequence)._(@"
  305. )").NonQuery());
  306. }
  307. private static void InsertLocalizedPublication(string publicationName, int localizedPublicationId, int publicationId, string languageCode)
  308. {
  309. QExecutor.ExecuteNonQuery(
  310. context => new {
  311. PublicationName = context.Param(publicationName),
  312. LocalizedPublicationId = context.Param(localizedPublicationId),
  313. PublicationId = context.Param(publicationId),
  314. LanguageCode = context.Param(languageCode)
  315. },
  316. p => new Q(@"INSERT INTO LocalizedPublication
  317. ( PublicationName,
  318. LocalizedPublicationId,
  319. PublicationId,
  320. LanguageCode
  321. )
  322. VALUES ( ")._(p.PublicationName)._(@",
  323. ")._(p.LocalizedPublicationId)._(@",
  324. ")._(p.PublicationId)._(@",
  325. ")._(p.LanguageCode)._(@"
  326. )").NonQuery());
  327. }
  328. }
  329. }