FdcPumpControllerUnitTest.cs 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421
  1. using System;
  2. using Microsoft.VisualStudio.TestTools.UnitTesting;
  3. using Edge.Core.Processor;
  4. using Edge.Core.IndustryStandardInterface.Pump;
  5. using HengShan_Pump_NonIC.MessageEntity;
  6. using System.Threading;
  7. using Wayne.FDCPOSLibrary;
  8. using HengShan_Pump_NonIC;
  9. using static HengShan_Pump_NonIC.MessageEntity.GetNozzleStatusResponse;
  10. using Mocks;
  11. namespace Test_HengShan_Pump_NonIC
  12. {
  13. [TestClass]
  14. public class FdcPumpControllerUnitTest
  15. {
  16. private GenericDeviceProcessor<byte[], HengShan_Pump_NonIC.MessageEntity.NonICMessageTemplateBase> processor;
  17. [Microsoft.VisualStudio.TestTools.UnitTesting.TestInitialize()]
  18. public void InitProcessor()
  19. {
  20. var mockCommunicator = new ComPortCommunicatorMock<HengShan_Pump_NonIC.MessageEntity.NonICMessageTemplateBase>();
  21. mockCommunicator.OnRawDataWriting += (s, a) => { };
  22. this.processor = new GenericDeviceProcessor<byte[], HengShan_Pump_NonIC.MessageEntity.NonICMessageTemplateBase>(
  23. new HengShan_Pump_NonIC.PumpHandler(1,
  24. "<Nozzles>" +
  25. " <Nozzle No ='1' ProductBarcode ='1' />" +
  26. " <Nozzle No ='2' ProductBarcode ='5' />" +
  27. "</Nozzles>"),
  28. mockCommunicator, null);
  29. }
  30. [TestMethod]
  31. public void Should_Send_Polling_Pump_Message_Test()
  32. {
  33. var mockCommunicator = this.processor.Communicator as ComPortCommunicatorMock<HengShan_Pump_NonIC.MessageEntity.NonICMessageTemplateBase>;
  34. var fdcPumpController = processor.Context.Handler as IFdcPumpController;
  35. int pollingMessageSendTimes = 0;
  36. processor.Context.Outgoing.OnWriting += (s, a) =>
  37. {
  38. if (a.Message is GetNozzleStatusRequest)
  39. pollingMessageSendTimes++;
  40. };
  41. processor.Start();
  42. /* fire anything, otherwise the polling will not start since Context is null*/
  43. var statusResponse_Fuelling = new GetNozzleStatusResponse();
  44. statusResponse_Fuelling.AddPumpStatus(PumpStatus.加油结束);
  45. mockCommunicator.FireOnDataReceived(statusResponse_Fuelling);
  46. // hardcode for now.
  47. Thread.Sleep(2000);
  48. Assert.AreEqual(true, pollingMessageSendTimes >= 1, "polling message should send more than 1 times");
  49. }
  50. [TestMethod]
  51. public void IdleState_Test()
  52. {
  53. var mockCommunicator = this.processor.Communicator as ComPortCommunicatorMock<HengShan_Pump_NonIC.MessageEntity.NonICMessageTemplateBase>;
  54. var fdcPumpController = processor.Context.Handler as IFdcPumpController;
  55. int onStateChangeCalledTimes = 0;
  56. FdcPumpControllerOnStateChangeEventArg onStateChangeEventArg = null;
  57. fdcPumpController.OnStateChange += (s, a) =>
  58. {
  59. onStateChangeEventArg = a;
  60. onStateChangeCalledTimes++;
  61. };
  62. /* fire */
  63. var statusResponse_Fuelling = new GetNozzleStatusResponse();
  64. statusResponse_Fuelling.AddPumpStatus(PumpStatus.加油结束);
  65. mockCommunicator.FireOnDataReceived(statusResponse_Fuelling);
  66. Assert.AreEqual(1, onStateChangeCalledTimes, "OnStateChange should be called just 1 time");
  67. Assert.AreNotEqual(null, onStateChangeEventArg, "OnStateChange should be called.");
  68. Assert.AreEqual(LogicalDeviceState.FDC_READY, onStateChangeEventArg.NewPumpState, "OnStateChange should have the new state of FDC_READY");
  69. Assert.AreEqual(LogicalDeviceState.FDC_READY, fdcPumpController.QueryStatusAsync().Result,
  70. "status should change to: FDC_READY, but now is: " + fdcPumpController.QueryStatusAsync().Result);
  71. //Thread.Sleep(100000);
  72. }
  73. [TestMethod]
  74. public void FuellingState_Test()
  75. {
  76. var mockCommunicator = this.processor.Communicator as ComPortCommunicatorMock<HengShan_Pump_NonIC.MessageEntity.NonICMessageTemplateBase>;
  77. IFdcPumpController fdcPumpController = processor.Context.Handler as IFdcPumpController;
  78. int onStateChangeCalledTimes = 0;
  79. FdcPumpControllerOnStateChangeEventArg onStateChangeEventArg = null;
  80. fdcPumpController.OnStateChange += (s, a) =>
  81. {
  82. onStateChangeEventArg = a;
  83. onStateChangeCalledTimes++;
  84. };
  85. /* fire */
  86. var statusResponse_Fuelling = new GetNozzleStatusResponse();
  87. statusResponse_Fuelling.AddPumpStatus(PumpStatus.允许加油);
  88. statusResponse_Fuelling.AddPumpStatus(PumpStatus.油枪打开);
  89. statusResponse_Fuelling.AddPumpStatus(PumpStatus.加油过程);
  90. mockCommunicator.FireOnDataReceived(statusResponse_Fuelling);
  91. Assert.AreEqual(1, onStateChangeCalledTimes, "OnStateChange should be called just 1 time");
  92. Assert.AreNotEqual(null, onStateChangeEventArg, "OnStateChange should be called.");
  93. Assert.AreEqual(LogicalDeviceState.FDC_FUELLING, onStateChangeEventArg.NewPumpState, "OnStateChange should have the new state of FDC_FUELLING");
  94. Assert.AreEqual(LogicalDeviceState.FDC_FUELLING, fdcPumpController.QueryStatusAsync().Result,
  95. "status should change to: FDC_FUELLING, but now is: " + fdcPumpController.QueryStatusAsync().Result);
  96. //Thread.Sleep(100000);
  97. }
  98. [TestMethod]
  99. public void FuellingState_Test1()
  100. {
  101. var mockCommunicator = this.processor.Communicator as ComPortCommunicatorMock<HengShan_Pump_NonIC.MessageEntity.NonICMessageTemplateBase>;
  102. IFdcPumpController fdcPumpController = processor.Context.Handler as IFdcPumpController;
  103. int onStateChangeCalledTimes = 0;
  104. FdcPumpControllerOnStateChangeEventArg onStateChangeEventArg = null;
  105. fdcPumpController.OnStateChange += (s, a) =>
  106. {
  107. onStateChangeEventArg = a;
  108. onStateChangeCalledTimes++;
  109. };
  110. /* fire multiple times, stateChange should only fired one time*/
  111. var statusResponse_Fuelling = new GetNozzleStatusResponse();
  112. statusResponse_Fuelling.AddPumpStatus(PumpStatus.允许加油);
  113. statusResponse_Fuelling.AddPumpStatus(PumpStatus.油枪打开);
  114. statusResponse_Fuelling.AddPumpStatus(PumpStatus.加油过程);
  115. mockCommunicator.FireOnDataReceived(statusResponse_Fuelling);
  116. mockCommunicator.FireOnDataReceived(statusResponse_Fuelling);
  117. mockCommunicator.FireOnDataReceived(statusResponse_Fuelling);
  118. mockCommunicator.FireOnDataReceived(statusResponse_Fuelling);
  119. Assert.AreEqual(1, onStateChangeCalledTimes, "OnStateChange should be called just 1 time");
  120. Assert.AreNotEqual(null, onStateChangeEventArg, "OnStateChange should be called.");
  121. Assert.AreEqual(LogicalDeviceState.FDC_FUELLING, onStateChangeEventArg.NewPumpState, "OnStateChange should have the new state of FDC_FUELLING");
  122. Assert.AreEqual(LogicalDeviceState.FDC_FUELLING, fdcPumpController.QueryStatusAsync().Result,
  123. "status should change to: FDC_FUELLING, but now is: " + fdcPumpController.QueryStatusAsync().Result);
  124. //Thread.Sleep(100000);
  125. }
  126. [TestMethod]
  127. public void FuellingState_Test2()
  128. {
  129. var mockCommunicator = this.processor.Communicator as ComPortCommunicatorMock<HengShan_Pump_NonIC.MessageEntity.NonICMessageTemplateBase>;
  130. IFdcPumpController fdcPumpController = processor.Context.Handler as IFdcPumpController;
  131. int onStateChangeCalledTimes = 0;
  132. FdcPumpControllerOnStateChangeEventArg onStateChangeEventArg = null;
  133. fdcPumpController.OnStateChange += (s, a) =>
  134. {
  135. onStateChangeEventArg = a;
  136. onStateChangeCalledTimes++;
  137. };
  138. /* fire multiple times, stateChange should only fired one time*/
  139. var statusResponse_Fuelling = new GetNozzleStatusResponse();
  140. statusResponse_Fuelling.AddPumpStatus(PumpStatus.允许加油);
  141. statusResponse_Fuelling.AddPumpStatus(PumpStatus.油枪打开);
  142. statusResponse_Fuelling.AddPumpStatus(PumpStatus.加油过程);
  143. mockCommunicator.FireOnDataReceived(statusResponse_Fuelling);
  144. mockCommunicator.FireOnDataReceived(statusResponse_Fuelling);
  145. mockCommunicator.FireOnDataReceived(statusResponse_Fuelling);
  146. mockCommunicator.FireOnDataReceived(statusResponse_Fuelling);
  147. Assert.AreEqual(1, onStateChangeCalledTimes, "OnStateChange should be called just 1 time");
  148. Assert.AreNotEqual(null, onStateChangeEventArg, "OnStateChange should be called.");
  149. Assert.AreEqual(LogicalDeviceState.FDC_FUELLING, onStateChangeEventArg.NewPumpState, "OnStateChange should have the new state of FDC_FUELLING");
  150. //Thread.Sleep(PumpHandler.lastLogicalDeviceStateExpiredTime * 1000 + 1000);
  151. Assert.AreEqual(LogicalDeviceState.FDC_OFFLINE, fdcPumpController.QueryStatusAsync().Result,
  152. "status should change to: FDC_OFFLINE since many time passed, but now is: " + fdcPumpController.QueryStatusAsync().Result);
  153. }
  154. [TestMethod]
  155. public void FuellingState_Test3()
  156. {
  157. var mockCommunicator = this.processor.Communicator as ComPortCommunicatorMock<HengShan_Pump_NonIC.MessageEntity.NonICMessageTemplateBase>;
  158. IFdcPumpController fdcPumpController = processor.Context.Handler as IFdcPumpController;
  159. int onStateChangeCalledTimes = 0;
  160. FdcPumpControllerOnStateChangeEventArg onStateChangeEventArg = null;
  161. fdcPumpController.OnStateChange += (s, a) =>
  162. {
  163. onStateChangeEventArg = a;
  164. onStateChangeCalledTimes++;
  165. };
  166. /* fire multiple times, stateChange should only fired one time*/
  167. var statusResponse_Fuelling = new GetNozzleStatusResponse();
  168. statusResponse_Fuelling.AddPumpStatus(PumpStatus.允许加油);
  169. statusResponse_Fuelling.AddPumpStatus(PumpStatus.油枪打开);
  170. statusResponse_Fuelling.AddPumpStatus(PumpStatus.加油过程);
  171. mockCommunicator.FireOnDataReceived(statusResponse_Fuelling);
  172. mockCommunicator.FireOnDataReceived(statusResponse_Fuelling);
  173. mockCommunicator.FireOnDataReceived(statusResponse_Fuelling);
  174. mockCommunicator.FireOnDataReceived(statusResponse_Fuelling);
  175. Assert.AreEqual(1, onStateChangeCalledTimes, "OnStateChange should be called just 1 time");
  176. Assert.AreNotEqual(null, onStateChangeEventArg, "OnStateChange should be called.");
  177. Assert.AreEqual(LogicalDeviceState.FDC_FUELLING, onStateChangeEventArg.NewPumpState, "OnStateChange should have the new state of FDC_FUELLING");
  178. //Thread.Sleep(PumpHandler.lastLogicalDeviceStateExpiredTime * 1000 + 1000);
  179. Assert.AreEqual(LogicalDeviceState.FDC_OFFLINE, fdcPumpController.QueryStatusAsync().Result,
  180. "status should change to: FDC_OFFLINE since many time passed, but now is: " + fdcPumpController.QueryStatusAsync().Result);
  181. mockCommunicator.FireOnDataReceived(statusResponse_Fuelling);
  182. Assert.AreEqual(LogicalDeviceState.FDC_FUELLING, fdcPumpController.QueryStatusAsync().Result,
  183. "status should change to: FDC_FUELLING , but now is: " + fdcPumpController.QueryStatusAsync().Result);
  184. }
  185. [TestMethod]
  186. public void PayableTransaction_State_Test1()
  187. {
  188. int fuelingAmount = 344;
  189. var mockCommunicator = this.processor.Communicator as ComPortCommunicatorMock<HengShan_Pump_NonIC.MessageEntity.NonICMessageTemplateBase>;
  190. IFdcPumpController fdcPumpController = processor.Context.Handler as IFdcPumpController;
  191. int onStateChangeCalledTimes = 0;
  192. FdcPumpControllerOnStateChangeEventArg onStateChangeEventArg = null;
  193. fdcPumpController.OnStateChange += (s, a) =>
  194. {
  195. onStateChangeEventArg = a;
  196. onStateChangeCalledTimes++;
  197. };
  198. int onCurrentFuellingStatusChangeCalledTimes = 0;
  199. FdcTransactionDoneEventArg onCurrentFuellingStatusChangeEventArg = null;
  200. fdcPumpController.OnCurrentFuellingStatusChange += (s, a) =>
  201. {
  202. onCurrentFuellingStatusChangeEventArg = a;
  203. onCurrentFuellingStatusChangeCalledTimes++;
  204. };
  205. /* fire multiple times, stateChange should only fired one time*/
  206. var statusResponse_Fuelling = new GetNozzleStatusResponse();
  207. statusResponse_Fuelling.加油金额 = fuelingAmount;
  208. statusResponse_Fuelling.AddPumpStatus(PumpStatus.加油结束);
  209. mockCommunicator.FireOnDataReceived(statusResponse_Fuelling);
  210. Assert.AreEqual(1, onStateChangeCalledTimes, "OnStateChange should be called just 1 time");
  211. Assert.AreNotEqual(null, onStateChangeEventArg, "OnStateChange should be called.");
  212. Assert.AreEqual(LogicalDeviceState.FDC_READY, onStateChangeEventArg.NewPumpState, "OnStateChange should have the new state of FDC_READY");
  213. Assert.AreEqual(LogicalDeviceState.FDC_READY, fdcPumpController.QueryStatusAsync().Result,
  214. "status should change to: FDC_READY, but now is: " + fdcPumpController.QueryStatusAsync().Result);
  215. Assert.AreEqual(1, onCurrentFuellingStatusChangeCalledTimes, "OnCurrentFuellingStatusChange should be called just 1 time");
  216. Assert.AreNotEqual(null, onCurrentFuellingStatusChangeEventArg, "OnCurrentFuellingStatusChange should be called.");
  217. Assert.AreEqual(true, onCurrentFuellingStatusChangeEventArg.Transaction.Finished, "Transaction should Finished.");
  218. Assert.AreEqual(fuelingAmount, onCurrentFuellingStatusChangeEventArg.Transaction.Amount, "Transaction amount should match.");
  219. }
  220. [TestMethod]
  221. public void PayableTransaction_State_Test2()
  222. {
  223. int fuelingAmount = 344;
  224. var mockCommunicator = this.processor.Communicator as ComPortCommunicatorMock<HengShan_Pump_NonIC.MessageEntity.NonICMessageTemplateBase>;
  225. IFdcPumpController fdcPumpController = processor.Context.Handler as IFdcPumpController;
  226. int onStateChangeCalledTimes = 0;
  227. FdcPumpControllerOnStateChangeEventArg onStateChangeEventArg = null;
  228. fdcPumpController.OnStateChange += (s, a) =>
  229. {
  230. onStateChangeEventArg = a;
  231. onStateChangeCalledTimes++;
  232. };
  233. int onCurrentFuellingStatusChangeCalledTimes = 0;
  234. FdcTransactionDoneEventArg onCurrentFuellingStatusChangeEventArg = null;
  235. fdcPumpController.OnCurrentFuellingStatusChange += (s, a) =>
  236. {
  237. onCurrentFuellingStatusChangeEventArg = a;
  238. onCurrentFuellingStatusChangeCalledTimes++;
  239. };
  240. /* fire multiple times, stateChange should only fired one time*/
  241. var statusResponse_Fuelling = new GetNozzleStatusResponse();
  242. statusResponse_Fuelling.加油金额 = fuelingAmount;
  243. statusResponse_Fuelling.AddPumpStatus(PumpStatus.加油结束);
  244. mockCommunicator.FireOnDataReceived(statusResponse_Fuelling);
  245. Assert.AreEqual(1, onStateChangeCalledTimes, "OnStateChange should be called just 1 time");
  246. Assert.AreNotEqual(null, onStateChangeEventArg, "OnStateChange should be called.");
  247. Assert.AreEqual(LogicalDeviceState.FDC_READY, onStateChangeEventArg.NewPumpState, "OnStateChange should have the new state of FDC_READY");
  248. Assert.AreEqual(LogicalDeviceState.FDC_READY, fdcPumpController.QueryStatusAsync().Result,
  249. "status should change to: FDC_READY, but now is: " + fdcPumpController.QueryStatusAsync().Result);
  250. Assert.AreEqual(1, onCurrentFuellingStatusChangeCalledTimes, "OnCurrentFuellingStatusChange should be called just 1 time");
  251. Assert.AreNotEqual(null, onCurrentFuellingStatusChangeEventArg, "OnCurrentFuellingStatusChange should be called.");
  252. Assert.AreEqual(true, onCurrentFuellingStatusChangeEventArg.Transaction.Finished, "Transaction should Finished.");
  253. Assert.AreEqual(fuelingAmount, onCurrentFuellingStatusChangeEventArg.Transaction.Amount, "Transaction amount should match.");
  254. mockCommunicator.FireOnDataReceived(statusResponse_Fuelling);
  255. mockCommunicator.FireOnDataReceived(statusResponse_Fuelling);
  256. mockCommunicator.FireOnDataReceived(statusResponse_Fuelling);
  257. Assert.AreEqual(1, onStateChangeCalledTimes, "OnStateChange should be called just 1 time");
  258. Assert.AreEqual(LogicalDeviceState.FDC_READY, fdcPumpController.QueryStatusAsync().Result,
  259. "status should change to: FDC_READY, but now is: " + fdcPumpController.QueryStatusAsync().Result);
  260. Assert.AreEqual(1, onCurrentFuellingStatusChangeCalledTimes, "OnCurrentFuellingStatusChange should be called just 1 time");
  261. }
  262. [TestMethod]
  263. public void Authorize_State_Test1()
  264. {
  265. var mockCommunicator = this.processor.Communicator as ComPortCommunicatorMock<NonICMessageTemplateBase>;
  266. IFdcPumpController fdcPumpController = processor.Context.Handler as IFdcPumpController;
  267. int onStateChangeCalledTimes = 0;
  268. FdcPumpControllerOnStateChangeEventArg onStateChangeEventArg = null;
  269. fdcPumpController.OnStateChange += (s, a) =>
  270. {
  271. Console.WriteLine("OnStateChange to: " + a.NewPumpState);
  272. onStateChangeEventArg = a;
  273. onStateChangeCalledTimes++;
  274. };
  275. /* set to idle (FDC_Ready) */
  276. var statusResponse_Fuelling = new GetNozzleStatusResponse();
  277. statusResponse_Fuelling.AddPumpStatus(PumpStatus.加油结束);
  278. mockCommunicator.FireOnDataReceived(statusResponse_Fuelling);
  279. Assert.AreEqual(1, onStateChangeCalledTimes, "OnStateChange should be called");
  280. Assert.AreNotEqual(null, onStateChangeEventArg, "OnStateChange should be called");
  281. ThreadPool.QueueUserWorkItem(o =>
  282. {
  283. Thread.Sleep(1000);
  284. /* fire StartResponse */
  285. var startResponse = new StartResponse();
  286. startResponse.EnumResult = NonICMessageTemplateBase.Result.成功;
  287. mockCommunicator.FireOnDataReceived(startResponse);
  288. });
  289. var result = fdcPumpController.AuthorizeAsync(1).Result;
  290. Assert.AreEqual(true, result, "Authorize should return succeed");
  291. Assert.AreEqual(2, onStateChangeCalledTimes, "OnStateChange should be called just 2 time");
  292. Assert.AreNotEqual(null, onStateChangeEventArg, "OnStateChange should be called.");
  293. Assert.AreEqual(LogicalDeviceState.FDC_AUTHORISED, onStateChangeEventArg.NewPumpState, "OnStateChange should have the new state of FDC_AUTHORISED");
  294. Assert.AreEqual(LogicalDeviceState.FDC_AUTHORISED, fdcPumpController.QueryStatusAsync().Result,
  295. "status should change to: FDC_AUTHORISED, but now is: " + fdcPumpController.QueryStatusAsync().Result);
  296. }
  297. [TestMethod]
  298. public void Authorize_With_Amount_Test()
  299. {
  300. var mockCommunicator = this.processor.Communicator as ComPortCommunicatorMock<NonICMessageTemplateBase>;
  301. IFdcPumpController fdcPumpController = processor.Context.Handler as IFdcPumpController;
  302. int onStateChangeCalledTimes = 0;
  303. FdcPumpControllerOnStateChangeEventArg onStateChangeEventArg = null;
  304. fdcPumpController.OnStateChange += (s, a) =>
  305. {
  306. onStateChangeEventArg = a;
  307. onStateChangeCalledTimes++;
  308. };
  309. /* set to idle (FDC_Ready) */
  310. var statusResponse_Fuelling = new GetNozzleStatusResponse();
  311. statusResponse_Fuelling.AddPumpStatus(PumpStatus.加油结束);
  312. mockCommunicator.FireOnDataReceived(statusResponse_Fuelling);
  313. Assert.AreEqual(1, onStateChangeCalledTimes, "OnStateChange should be called");
  314. Assert.AreNotEqual(null, onStateChangeEventArg, "OnStateChange should be called");
  315. ThreadPool.QueueUserWorkItem(o =>
  316. {
  317. Thread.Sleep(1000);
  318. /* fire AuthPumpWithAmountResponse */
  319. var authPumpWithAmountResponse = new AuthPumpWithAmountResponse();
  320. authPumpWithAmountResponse.EnumResult = NonICMessageTemplateBase.Result.成功;
  321. mockCommunicator.FireOnDataReceived(authPumpWithAmountResponse);
  322. Thread.Sleep(200);
  323. /* fire StartResponse */
  324. var startResponse = new StartResponse();
  325. startResponse.EnumResult = NonICMessageTemplateBase.Result.成功;
  326. mockCommunicator.FireOnDataReceived(startResponse);
  327. });
  328. var result = fdcPumpController.AuthorizeWithAmountAsync(1983, 0).Result;
  329. // wait StartResponse
  330. Thread.Sleep(1000);
  331. Assert.AreEqual(true, result, "Authorize should return succeed");
  332. Assert.AreEqual(2, onStateChangeCalledTimes, "OnStateChange should be called 2 times");
  333. Assert.AreNotEqual(null, onStateChangeEventArg, "OnStateChange should be called.");
  334. Assert.AreEqual(LogicalDeviceState.FDC_AUTHORISED, onStateChangeEventArg.NewPumpState, "OnStateChange should have the new state of FDC_AUTHORISED");
  335. Assert.AreEqual(LogicalDeviceState.FDC_AUTHORISED, fdcPumpController.QueryStatusAsync().Result,
  336. "status should change to: FDC_AUTHORISED, but now is: " + fdcPumpController.QueryStatusAsync().Result);
  337. }
  338. [TestMethod]
  339. public void Authorize_With_Vol_Test()
  340. {
  341. var mockCommunicator = this.processor.Communicator as ComPortCommunicatorMock<NonICMessageTemplateBase>;
  342. IFdcPumpController fdcPumpController = processor.Context.Handler as IFdcPumpController;
  343. int onStateChangeCalledTimes = 0;
  344. FdcPumpControllerOnStateChangeEventArg onStateChangeEventArg = null;
  345. fdcPumpController.OnStateChange += (s, a) =>
  346. {
  347. onStateChangeEventArg = a;
  348. onStateChangeCalledTimes++;
  349. };
  350. /* set to idle (FDC_Ready) */
  351. var statusResponse_Fuelling = new GetNozzleStatusResponse();
  352. statusResponse_Fuelling.AddPumpStatus(PumpStatus.加油结束);
  353. mockCommunicator.FireOnDataReceived(statusResponse_Fuelling);
  354. Assert.AreEqual(1, onStateChangeCalledTimes, "OnStateChange should be called");
  355. Assert.AreNotEqual(null, onStateChangeEventArg, "OnStateChange should be called");
  356. ThreadPool.QueueUserWorkItem(o =>
  357. {
  358. Thread.Sleep(500);
  359. /* fire AuthPumpWithAmountResponse */
  360. var authPumpWithGalResponse = new AuthPumpWithGallonResponse();
  361. authPumpWithGalResponse.EnumResult = NonICMessageTemplateBase.Result.成功;
  362. mockCommunicator.FireOnDataReceived(authPumpWithGalResponse);
  363. Thread.Sleep(1000);
  364. /* fire StartResponse */
  365. var startResponse = new StartResponse();
  366. startResponse.EnumResult = NonICMessageTemplateBase.Result.成功;
  367. mockCommunicator.FireOnDataReceived(startResponse);
  368. });
  369. var result = fdcPumpController.AuthorizeWithVolumeAsync(1983, 0).Result;
  370. // wait StartResponse
  371. Thread.Sleep(1000);
  372. Assert.AreEqual(true, result, "Authorize should return succeed");
  373. Assert.AreEqual(2, onStateChangeCalledTimes, "OnStateChange should be called 2 times");
  374. Assert.AreNotEqual(null, onStateChangeEventArg, "OnStateChange should be called.");
  375. Assert.AreEqual(LogicalDeviceState.FDC_AUTHORISED, onStateChangeEventArg.NewPumpState, "OnStateChange should have the new state of FDC_AUTHORISED");
  376. Assert.AreEqual(LogicalDeviceState.FDC_AUTHORISED, fdcPumpController.QueryStatusAsync().Result,
  377. "status should change to: FDC_AUTHORISED, but now is: " + fdcPumpController.QueryStatusAsync().Result);
  378. }
  379. }
  380. }