PageRenderTime 55ms CodeModel.GetById 26ms RepoModel.GetById 1ms app.codeStats 0ms

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

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