PageRenderTime 46ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

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

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