ProtocolMessagesTests.cs 49 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333
  1. using Microsoft.VisualStudio.TestTools.UnitTesting;
  2. using Dfs.WayneChina.HengshanPayTerminal;
  3. using Dfs.WayneChina.HengshanPayTerminal.MessageEntity.Incoming;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using Dfs.WayneChina.HengshanPayTerminal.MessageEntity.Outgoing;
  8. using Dfs.WayneChina.HengshanPayTerminal.MessageEntity;
  9. namespace HengshanPayTerminal_Test
  10. {
  11. [TestClass]
  12. public class HengshanICProtocolMessagesTests
  13. {
  14. #region Parser instance
  15. Dfs.WayneChina.HengshanPayTerminal.Parser parser = new Dfs.WayneChina.HengshanPayTerminal.Parser();
  16. #endregion
  17. #region Incoming raw messages in bytes
  18. byte[] checkCmdReqBytes = new byte[] { 0xFA, 0x01, 0x01, 0x55, 0x00, 0x12, 0x10, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x03,
  19. 0x00, 0x00, 0x04, 0x40, 0x00, 0x01, 0xD0, 0x09, 0x29, 0xFF, 0x09, 0x67 };
  20. byte[] registerReqBytes = new byte[] { 0xFA, 0x01, 0x01, 0x01, 0x00, 0x05, 0x13, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x0A, 0x08 };
  21. byte[] validateCardReqBytes = new byte[] { 0xFA, 0x01, 0x01, 0x67, 0x00, 0x1C, 0x15, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
  22. 0x00, 0x00, 0x00, 0x10, 0x01, 0x05, 0x28, 0xFD, 0xC6, 0x93, 0x06, 0x01, 0x01, 0x01, 0x04, 0xE2, 0x03, 0xFB, 0x41, 0xF0,
  23. 0xFF, 0x24, 0x05 };
  24. byte[] authReqBytes = new byte[] { 0xFA, 0x01, 0x01, 0x6A, 0x00, 0x2B, 0x17, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
  25. 0x00, 0x00, 0x10, 0x01, 0x05, 0x28, 0x0F, 0x41, 0xDC, 0x00, 0x00, 0x00, 0x20, 0x19, 0x03, 0x12, 0x08, 0x42, 0x26, 0x00,
  26. 0x00, 0x03, 0x0A, 0x06, 0x0E, 0x50, 0x01, 0x01, 0x10, 0x31, 0x01, 0x04, 0xE3, 0x67, 0xFF, 0x1C, 0x01 };
  27. byte[] fuelDataReqBytes = new byte[] { 0xFA, 0x01, 0x01, 0x74, 0x00, 0x36, 0x1C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x0A,
  28. 0x06, 0x0F, 0x01, 0x01, 0x10, 0x31, 0x00, 0x20, 0x33, 0x00, 0x04, 0xFA, 0x02, 0x87, 0x20, 0x19, 0x03, 0x12, 0x08, 0x42,
  29. 0x26, 0x20, 0x19, 0x03, 0x12, 0x08, 0x42, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x05, 0x28, 0x01, 0x04,
  30. 0xE3, 0x00, 0x46, 0xA3, 0x7A, 0xFF, 0x18, 0x38 };
  31. byte[] paymentReq = new byte[] { 0xFA, 0x01, 0x01, 0x75, 0x00, 0x22, 0x30, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
  32. 0x00, 0x10, 0x01, 0x05, 0x28, 0x20, 0x19, 0x03, 0x12, 0x08, 0x42, 0x26, 0x00, 0x00, 0x03, 0x0A, 0x06, 0x0F, 0x01, 0x01, 0x00,
  33. 0x00, 0x00, 0x00, 0xFF, 0x75, 0x60 };
  34. byte[] trxDataReqBytes1 = new byte[] { 0xFA, 0x01, 0x01, 0x76, 0x00, 0x80, 0x2D, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x03, 0x0A,
  35. 0x06, 0x0F, 0x00, 0x20, 0x19, 0x03, 0x12, 0x08, 0x42, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x05, 0x28,
  36. 0x03, 0xFB, 0x21, 0xBD, 0x00, 0x20, 0x33, 0x00, 0x20, 0x33, 0x67, 0x00, 0x00, 0x01, 0x04, 0xE3, 0x01, 0x01, 0x02, 0x87,
  37. 0x10, 0x31, 0x00, 0x04, 0xFA, 0x00, 0x46, 0xA3, 0x7A, 0x20, 0x19, 0x03, 0x12, 0x08, 0x42, 0x51, 0x00, 0x00, 0x00, 0x00,
  38. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  39. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  40. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
  41. 0x6D, 0x79 };
  42. byte[] changeAuthModeBytes = new byte[] { 0xFA, 0x01, 0x01, 0x73, 0x00, 0x04, 0x1B, 0x01, 0x01, 0x02, 0xFF, 0x3E, 0x25 };
  43. byte[] changeAuthModeAckBytes = new byte[] { 0xFA, 0x01, 0x01, 0x74, 0x00, 0x05, 0x20, 0x01, 0x01, 0x01, 0x01, 0xFF, 0x39, 0x1A };
  44. byte[] lockPumpResult = new byte[] { 0xFA, 0x01, 0x01, 0x0E, 0x00, 0x09, 0x45, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x01,
  45. 0xFF, 0x36, 0x18 };
  46. byte[] fullTotalizerBytes = new byte[] { 0xFA, 0x01, 0x01, 0x28, 0x00, 0x0B, 0x49, 0x01, 0x01, 0x01, 0xEE, 0xBD, 0xBD, 0x0C, 0x55,
  47. 0x37, 0x82, 0xFF, 0x1E, 0x16 };
  48. byte[] cancelAuthRequestBytes = new byte[]
  49. {
  50. 0xFA, 0x03, 0x03, 0x35, 0x00, 0x23, 0x19, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
  51. 0x00, 0x10, 0x01, 0x05, 0x43, 0x20, 0x19, 0x12, 0x12, 0x12, 0x22, 0x46, 0x00, 0x00, 0x2F, 0x77,
  52. 0x00, 0x00, 0x50, 0x03, 0x03, 0x01, 0x3E, 0x05, 0x67, 0xFF, 0x6A, 0x7B
  53. };
  54. byte[] queryGrayRecordReqBytes = new byte[]
  55. {
  56. 0xfa, 0x04, 0x04, 0x1d, 0x00, 0x18, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x02, 0x03,
  57. 0x83, 0x00, 0x00, 0x19, 0xe9, 0x00, 0x04, 0x20, 0x19, 0x11, 0x19, 0x17, 0x07, 0x15, 0xff, 0x09,
  58. 0x38
  59. };
  60. byte[] trxDataReqBytes = new byte[]
  61. {
  62. 0xFA,0x03,0x03,0x1C,0x00,0x80,0x2D,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x37,0x00,
  63. 0x00,0x00,0x20,0x20,0x03,0x25,0x10,0x54,0x42,0x11,0x00,0x01,0x10,0x00,0x13,0x80,
  64. 0x00,0x10,0x51,0x00,0x01,0x77,0xE6,0x00,0x01,0xEE,0x00,0x01,0xB2,0x64,0x00,0x00,
  65. 0x01,0x00,0x05,0x03,0x03,0x02,0xA5,0x10,0x21,0x00,0x00,0x49,0x00,0x00,0x17,0x12,
  66. 0x20,0x20,0x03,0x25,0x10,0x55,0x09,0x11,0x00,0x10,0x19,0x90,0x10,0x00,0x00,0x30,
  67. 0x87,0x6F,0xAA,0xDF,0x2F,0x20,0x20,0x03,0x05,0x10,0x05,0x00,0x00,0x00,0x40,0x5C,
  68. 0x39,0x33,0xCA,0x04,0x7F,0x97,0xF9,0x1A,0xF3,0x8C,0x48,0x00,0x00,0x00,0x00,0x00,
  69. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  70. 0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x2D,0x62
  71. };
  72. byte[] incompleteCheckCmdBytes = new byte[]
  73. {
  74. 0xFA, 0x02, 0x02, 0x12, 0xFA, 0x01, 0x01, 0x24, 0x00, 0x1C, 0x10, 0x00, 0x00, 0x00,
  75. 0x49, 0x31, 0x31, 0x01, 0x03, 0x00, 0x00, 0x07, 0x08, 0x00, 0x01, 0x5C, 0x02, 0x06,
  76. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x54, 0x49
  77. };
  78. #endregion
  79. /**************************************************************************/
  80. /****************************** FEED TESTS ******************************/
  81. /**************************************************************************/
  82. [TestMethod()]
  83. public void Incomplete_feed_is_processed()
  84. {
  85. List<byte> result = null;
  86. var stateMachine = new StateMachineMessageCutter();
  87. stateMachine.OnMessageCut += (r, _) =>
  88. {
  89. result = stateMachine.Message.ToList();
  90. };
  91. bool invalidMessageCutCalled = false;
  92. stateMachine.OnInvalidMessageRead += (__, ___) => invalidMessageCutCalled = true;
  93. stateMachine.Feed(incompleteCheckCmdBytes);
  94. Assert.AreEqual(true, result != null);
  95. Assert.AreEqual(true, invalidMessageCutCalled != true);
  96. Assert.AreEqual(true, result.Any());
  97. Assert.AreEqual(true, result[0] == 0xFA);
  98. }
  99. /**************************************************************************/
  100. /************************ DE-SERIALIZATION TESTS ************************/
  101. /**************************************************************************/
  102. #region Deserialization tests
  103. /*************************** Check Cmd Request ****************************/
  104. #region Check Cmd request
  105. [TestMethod]
  106. public void Check_cmd_could_be_parsed_Ok()
  107. {
  108. var msg = parser.Deserialize(checkCmdReqBytes) as CheckCmdRequest;
  109. Assert.IsNotNull(msg);
  110. Assert.AreEqual(msg.DispenserState, 3);
  111. Assert.AreEqual(msg.Price, 2345);
  112. }
  113. #endregion
  114. /**************************** Register Request ****************************/
  115. #region Register request
  116. [TestMethod]
  117. public void RegisterRequest_could_be_parsed_Ok()
  118. {
  119. var msg = parser.Deserialize(registerReqBytes) as RegisterRequest;
  120. Assert.IsNotNull(msg);
  121. Assert.AreEqual("00000001", msg.TerminalId); //Only one field `Terminal ID` exists for this request.
  122. }
  123. #endregion
  124. /************************** Change Auth Mode Ack **************************/
  125. #region Change Auth Mode Ack
  126. [TestMethod]
  127. public void ChangeAuthModeAck_could_be_parsed_Ok()
  128. {
  129. var msg = parser.Deserialize(changeAuthModeAckBytes) as ChangeAuthModeAck;
  130. Assert.IsNotNull(msg);
  131. Assert.AreEqual(msg.ModeChangeResult, 1); //result 1, failure
  132. }
  133. #endregion
  134. /**************************** Lock Unlock Ack *****************************/
  135. #region Lock pump
  136. [TestMethod]
  137. public void LockPumpResponse_could_be_parsed_Ok()
  138. {
  139. var msg = parser.Deserialize(lockPumpResult) as LockOrUnlockPumpAck;
  140. Assert.IsNotNull(msg);
  141. Assert.AreEqual(msg.DispenserState, DispenserState.Closed); //dispenser state 2, closed
  142. }
  143. #endregion
  144. /************************* Validate Card Request ***************************/
  145. #region Validate card
  146. [TestMethod]
  147. public void ValidateCardRequest_could_be_parsed_Ok()
  148. {
  149. var msg = parser.Deserialize(validateCardReqBytes) as ValidateCardRequest;
  150. Assert.IsNotNull(msg);
  151. Assert.IsTrue(msg.Asn.Contains("10010528"));
  152. }
  153. [TestMethod]
  154. public void ValidateCardRequest_terminalId_is_Ok()
  155. {
  156. var msg = parser.Deserialize(validateCardReqBytes) as ValidateCardRequest;
  157. Assert.AreEqual("00000001", msg.TerminalID);
  158. }
  159. [TestMethod]
  160. public void ValidateCardRequest_physicalCardNo_is_Ok()
  161. {
  162. var msg = parser.Deserialize(validateCardReqBytes) as ValidateCardRequest;
  163. Assert.AreEqual(110348029, int.Parse(msg.PhysicalCardNo, System.Globalization.NumberStyles.HexNumber)); //"FDC69306"
  164. }
  165. [TestMethod]
  166. public void ValidateCardRequest_cardInfo_is_Ok()
  167. {
  168. var msg = parser.Deserialize(validateCardReqBytes) as ValidateCardRequest;
  169. Assert.AreEqual(1, msg.CurrentCardInfo.CardType);
  170. Assert.AreEqual(0x4E2, msg.CurrentCardInfo.CardCtc);
  171. }
  172. [TestMethod]
  173. public void ValidateCardRequest_balance_is_Ok()
  174. {
  175. var msg = parser.Deserialize(validateCardReqBytes) as ValidateCardRequest;
  176. Assert.AreEqual(66798064, msg.Balance);
  177. }
  178. #endregion
  179. /***************************** Auth Request ********************************/
  180. #region Auth request
  181. [TestMethod]
  182. public void AuthRequest_could_be_parsed_Ok()
  183. {
  184. var msg = parser.Deserialize(authReqBytes) as AuthRequest;
  185. Assert.IsNotNull(msg);
  186. Assert.IsTrue(msg.Asn.Contains("10010528"));
  187. Assert.AreEqual(msg.MaxAmount, 0xF41DC);
  188. }
  189. [TestMethod]
  190. public void AuthRequest_FPCode_is_Ok()
  191. {
  192. var msg = parser.Deserialize(authReqBytes) as AuthRequest;
  193. Assert.IsNotNull(msg);
  194. Assert.AreEqual(1, msg.FuelingPoint.NozzleNo);
  195. Assert.AreEqual(1, msg.FuelingPoint.PumpNo);
  196. }
  197. [TestMethod]
  198. public void AuthRequest_cardCtc_is_Ok()
  199. {
  200. var msg = parser.Deserialize(authReqBytes) as AuthRequest;
  201. Assert.IsNotNull(msg);
  202. Assert.AreEqual(msg.CurrentCardInfo.CardCtc, 0x4E3);
  203. }
  204. [TestMethod]
  205. public void AuthRequest_maxAllowedAmount_is_Ok()
  206. {
  207. var msg = parser.Deserialize(authReqBytes) as AuthRequest;
  208. Assert.IsNotNull(msg);
  209. Assert.AreEqual(msg.MaxAmount, 0xF41DC);
  210. }
  211. #endregion
  212. /***************************Cancel Auth Request ****************************/
  213. #region Cancel auth
  214. [TestMethod]
  215. public void CancelAuthRequest_can_be_parsed_Ok()
  216. {
  217. var msg = parser.Deserialize(cancelAuthRequestBytes) as CancelAuthRequest;
  218. Assert.IsNotNull(msg);
  219. Assert.IsTrue(msg.Asn.Contains("10010543"));
  220. }
  221. [TestMethod]
  222. public void CancelAuthRequest_posttc_is_ok()
  223. {
  224. var msg = parser.Deserialize(cancelAuthRequestBytes) as CancelAuthRequest;
  225. Assert.IsNotNull(msg);
  226. Assert.AreEqual(0x2F77, msg.PosTtc);
  227. }
  228. #endregion
  229. /************************ Fueling Data Request ****************************/
  230. #region FuelingDataRequest
  231. [TestMethod]
  232. public void FuelDataRequest_terminalId_is_Ok()
  233. {
  234. var msg = parser.Deserialize(fuelDataReqBytes) as FuelingDataRequest;
  235. Assert.IsNotNull(msg);
  236. Assert.AreEqual("00000001", msg.TerminalId);
  237. }
  238. [TestMethod]
  239. public void FuelingDataRequest_PosTtc_is_Ok()
  240. {
  241. var msg = parser.Deserialize(fuelDataReqBytes) as FuelingDataRequest;
  242. Assert.IsNotNull(msg);
  243. Assert.AreEqual(msg.PosTtc, 0x30A);
  244. }
  245. [TestMethod]
  246. public void FuelingDataRequest_SeqNo_is_Ok()
  247. {
  248. var msg = parser.Deserialize(fuelDataReqBytes) as FuelingDataRequest;
  249. Assert.IsNotNull(msg);
  250. Assert.AreEqual(0x60F, msg.SeqNo);
  251. }
  252. [TestMethod]
  253. public void FuelDataRequest_productCode_is_Ok()
  254. {
  255. var msg = parser.Deserialize(fuelDataReqBytes) as FuelingDataRequest;
  256. Assert.IsNotNull(msg);
  257. Assert.AreEqual(1031, msg.ProductCode);
  258. }
  259. [TestMethod]
  260. public void FuelDataRequest_amount_is_Ok ()
  261. {
  262. var msg = parser.Deserialize(fuelDataReqBytes) as FuelingDataRequest;
  263. Assert.IsNotNull(msg);
  264. Assert.AreEqual(0x2033, msg.Amount);
  265. }
  266. [TestMethod]
  267. public void FuelingDataRequest_volume_is_Ok()
  268. {
  269. var msg = parser.Deserialize(fuelDataReqBytes) as FuelingDataRequest;
  270. Assert.IsNotNull(msg);
  271. Assert.AreEqual(0x4FA, msg.Volume);
  272. }
  273. [TestMethod]
  274. public void FuelingDataRequest_price_is_Ok()
  275. {
  276. var msg = parser.Deserialize(fuelDataReqBytes) as FuelingDataRequest;
  277. Assert.IsNotNull(msg);
  278. Assert.AreEqual(0x287, msg.Price);
  279. }
  280. [TestMethod]
  281. public void FuelDataRequest_cardNo_is_Ok()
  282. {
  283. var msg = parser.Deserialize(fuelDataReqBytes) as FuelingDataRequest;
  284. Assert.IsNotNull(msg);
  285. Assert.IsTrue(msg.Asn.Contains("10010528"));
  286. }
  287. [TestMethod]
  288. public void FuelingDataRequest_cardType_is_Ok()
  289. {
  290. var msg = parser.Deserialize(fuelDataReqBytes) as FuelingDataRequest;
  291. Assert.IsNotNull(msg);
  292. Assert.AreEqual(1, msg.CurrentCardInfo.CardType);
  293. }
  294. [TestMethod]
  295. public void FuelingDataRequest_cardCtc_is_Ok()
  296. {
  297. var msg = parser.Deserialize(fuelDataReqBytes) as FuelingDataRequest;
  298. Assert.IsNotNull(msg);
  299. Assert.AreEqual(0x4E3, msg.CurrentCardInfo.CardCtc);
  300. }
  301. #endregion
  302. /***************************** Payment Request ****************************/
  303. #region Payment request tests
  304. [TestMethod]
  305. public void PaymentRequest_terminalId_is_Ok()
  306. {
  307. var msg = parser.Deserialize(paymentReq) as PaymentRequest;
  308. Assert.AreEqual("00000001", msg.TerminalId);
  309. }
  310. [TestMethod]
  311. public void PaymentRequest_cardNo_is_parsed_Ok()
  312. {
  313. var msg = parser.Deserialize(paymentReq) as PaymentRequest;
  314. Assert.IsNotNull(msg);
  315. Assert.AreEqual("10010528", msg.Asn.TrimStart('0'));
  316. }
  317. [TestMethod]
  318. public void PaymentRequest_authTime_is_Ok()
  319. {
  320. var msg = parser.Deserialize(paymentReq) as PaymentRequest;
  321. Assert.AreEqual("20190312084226", msg.AuthTime);
  322. }
  323. [TestMethod]
  324. public void PaymentRequest_posTtc_is_Ok()
  325. {
  326. var msg = parser.Deserialize(paymentReq) as PaymentRequest;
  327. Assert.AreEqual(0x30A, msg.PosTtc);
  328. }
  329. [TestMethod]
  330. public void PaymentRequest_seqNo_is_Ok()
  331. {
  332. var msg = parser.Deserialize(paymentReq) as PaymentRequest;
  333. Assert.AreEqual(1551, msg.SeqNo); //0x60F
  334. }
  335. [TestMethod]
  336. public void PaymentRequest_fuelingPoint_is_Ok()
  337. {
  338. var msg = parser.Deserialize(paymentReq) as PaymentRequest;
  339. Assert.AreEqual(1, msg.FuelingPoint.PumpNo);
  340. Assert.AreEqual(1, msg.FuelingPoint.NozzleNo);
  341. }
  342. #endregion
  343. /********************** Transaction Data Request **************************/
  344. #region TransactionData request tests
  345. [TestMethod]
  346. public void TransactionData_could_be_parsed_Ok()
  347. {
  348. var msg = parser.Deserialize(trxDataReqBytes) as TransactionDataRequest;
  349. Assert.IsNotNull(msg);
  350. }
  351. [TestMethod]
  352. public void TransactionData_terminalId_is_Ok()
  353. {
  354. var msg = parser.Deserialize(trxDataReqBytes) as TransactionDataRequest;
  355. Assert.AreEqual("00000003", msg.TerminalId);
  356. }
  357. [TestMethod]
  358. public void TransactionData_terminal_ttc_could_be_parsed_Ok()
  359. {
  360. var msg = parser.Deserialize(trxDataReqBytes) as TransactionDataRequest;
  361. Assert.AreEqual(msg.DitTTC, 0x37);
  362. }
  363. [TestMethod]
  364. public void TransactionData_pump_filling_sequence_number_could_be_parsed_Ok()
  365. {
  366. var msg = parser.Deserialize(trxDataReqBytes) as TransactionDataRequest;
  367. Assert.AreEqual(msg.SeqNo, 0);
  368. }
  369. [TestMethod]
  370. public void TransactionData_transaction_type_could_be_parsed_Ok()
  371. {
  372. var msg = parser.Deserialize(trxDataReqBytes) as TransactionDataRequest;
  373. Assert.AreEqual(msg.TrxType, 0x00);
  374. }
  375. [TestMethod]
  376. public void TransactionData_card_number_could_be_parsed_Ok()
  377. {
  378. var msg = parser.Deserialize(trxDataReqBytes) as TransactionDataRequest;
  379. Assert.AreEqual("11000110001380001051", msg.Asn.TrimStart('0'));
  380. }
  381. [TestMethod]
  382. public void TransactionData_card_balance_could_be_parsed_Ok()
  383. {
  384. var msg = parser.Deserialize(trxDataReqBytes) as TransactionDataRequest;
  385. Assert.AreEqual(msg.CardBalance, 0x177E6);
  386. }
  387. [TestMethod]
  388. public void TransactionData_filling_amount_could_be_parsed_Ok()
  389. {
  390. var msg = parser.Deserialize(trxDataReqBytes) as TransactionDataRequest;
  391. Assert.AreEqual(msg.FillingAmount, 0x1EE);
  392. }
  393. [TestMethod]
  394. public void TransactionData_pay_amount_is_Ok()
  395. {
  396. var msg = parser.Deserialize(trxDataReqBytes) as TransactionDataRequest;
  397. Assert.AreEqual(0x1B2, msg.PaymentAmount);
  398. }
  399. [TestMethod]
  400. public void TransactionData_pay_x_could_be_parsed_Ok()
  401. {
  402. var msg = parser.Deserialize(trxDataReqBytes) as TransactionDataRequest;
  403. Assert.AreEqual(msg.PaymentMethodLocation, 0x64);
  404. }
  405. [TestMethod]
  406. public void TransactionData_discountNo_is_Ok()
  407. {
  408. var msg = parser.Deserialize(trxDataReqBytes) as TransactionDataRequest;
  409. Assert.AreEqual(0, msg.DiscountNo);
  410. }
  411. [TestMethod]
  412. public void TransactionData_cardInfo_is_Ok()
  413. {
  414. var msg = parser.Deserialize(trxDataReqBytes) as TransactionDataRequest;
  415. Assert.AreEqual(1, msg.CurrentCardInfo.CardType);
  416. Assert.AreEqual(5, msg.CurrentCardInfo.CardCtc);
  417. }
  418. [TestMethod]
  419. public void TransactionData_price_could_be_parsed_Ok()
  420. {
  421. var msg = parser.Deserialize(trxDataReqBytes) as TransactionDataRequest;
  422. Assert.AreEqual(msg.Price, 0x2A5);
  423. }
  424. [TestMethod]
  425. public void TransactionData_product_code_could_be_parsed_Ok()
  426. {
  427. var msg = parser.Deserialize(trxDataReqBytes) as TransactionDataRequest;
  428. Assert.AreEqual(1021, msg.ProductCode);
  429. }
  430. [TestMethod]
  431. public void TransactionData_volume_could_be_parsed_Ok()
  432. {
  433. var msg = parser.Deserialize(trxDataReqBytes) as TransactionDataRequest;
  434. Assert.AreEqual(msg.Volume, 0x49);
  435. }
  436. [TestMethod]
  437. public void TransactionData_volume_total_could_be_parsed_Ok()
  438. {
  439. var msg = parser.Deserialize(trxDataReqBytes) as TransactionDataRequest;
  440. Assert.AreEqual(msg.VolumeTotal, 0x00001712);
  441. }
  442. [TestMethod]
  443. public void TransactionData_transaction_end_time_could_be_parsed_Ok()
  444. {
  445. var msg = parser.Deserialize(trxDataReqBytes) as TransactionDataRequest;
  446. Assert.AreEqual("20200325105509", msg.TrxEndTime);
  447. }
  448. [TestMethod]
  449. public void TransactionData_psamAsn_is_Ok()
  450. {
  451. var msg = parser.Deserialize(trxDataReqBytes) as TransactionDataRequest;
  452. Assert.AreEqual("11001019901000003087", msg.PsamAsn);
  453. }
  454. [TestMethod]
  455. public void TransactionData_PsamTac_is_Ok()
  456. {
  457. var msg = parser.Deserialize(trxDataReqBytes) as TransactionDataRequest;
  458. Assert.AreEqual("6FAADF2F", msg.PsamTac);
  459. }
  460. [TestMethod]
  461. public void TransactionData_PsamTid_is_Ok()
  462. {
  463. var msg = parser.Deserialize(trxDataReqBytes) as TransactionDataRequest;
  464. Assert.AreEqual("202003051005", msg.PsamTid);
  465. }
  466. [TestMethod]
  467. public void TransactionData_PsamTtc_is_Ok()
  468. {
  469. var msg = parser.Deserialize(trxDataReqBytes) as TransactionDataRequest;
  470. Assert.AreEqual("00000040", msg.PsamTtc);
  471. }
  472. [TestMethod]
  473. public void TransactionData_tac_is_Ok()
  474. {
  475. var msg = parser.Deserialize(trxDataReqBytes) as TransactionDataRequest;
  476. Assert.AreEqual("5C3933CA", msg.Tac);
  477. }
  478. [TestMethod]
  479. public void TransactionData_gMac_is_Ok()
  480. {
  481. var msg = parser.Deserialize(trxDataReqBytes) as TransactionDataRequest;
  482. Assert.AreEqual("047F97F9", msg.Gmac);
  483. }
  484. [TestMethod]
  485. public void TransactionData_tMac_is_Ok()
  486. {
  487. var msg = parser.Deserialize(trxDataReqBytes) as TransactionDataRequest;
  488. Assert.AreEqual("1AF38C48", msg.Tmac);
  489. }
  490. [TestMethod]
  491. public void TransactionData_lineCode_is_Ok()
  492. {
  493. var msg = parser.Deserialize(trxDataReqBytes) as TransactionDataRequest;
  494. Assert.AreEqual("000000", msg.LineCode);
  495. }
  496. [TestMethod]
  497. public void TransactionData_carCode_is_Ok()
  498. {
  499. var msg = parser.Deserialize(trxDataReqBytes) as TransactionDataRequest;
  500. Assert.AreEqual("000000", msg.CarCode);
  501. }
  502. [TestMethod]
  503. public void TransactionData_vehiclNo_is_Ok()
  504. {
  505. var msg = parser.Deserialize(trxDataReqBytes) as TransactionDataRequest;
  506. Assert.AreEqual("00000000000000000000000000000000", msg.VehicleNo);
  507. }
  508. [TestMethod]
  509. public void TransactionData_loyaltyCardNo_is_Ok()
  510. {
  511. var msg = parser.Deserialize(trxDataReqBytes) as TransactionDataRequest;
  512. Assert.AreEqual("00000000", msg.LoyaltyCardNo);
  513. }
  514. #endregion
  515. /************************* Data Download Request **************************/
  516. #region Data Download request
  517. [TestMethod]
  518. public void DataDownloadRequest_could_be_parsed_Ok()
  519. {
  520. var dataDownloadReq = new byte[] { 0xFA, 0x03, 0x03, 0x26, 0x00, 0x04, 0x25, 0x04, 0x00, 0x29, 0xFF, 0x64, 0x64 };
  521. var msg = parser.Deserialize(dataDownloadReq) as DataDownloadRequest;
  522. Assert.IsNotNull(msg);
  523. Assert.AreEqual(msg.DataContentType, Dfs.WayneChina.HengshanPayTerminal.Support.DataContentType.FuelPriceList);
  524. }
  525. #endregion
  526. /************************** Data Content Request **************************/
  527. #region Data Content request
  528. [TestMethod]
  529. public void DataContentRequest_could_be_parsed_Ok()
  530. {
  531. var dataContentReq = new byte[] { 0xFA, 0x02, 0x02, 0x3D, 0x00, 0x05, 0x27, 0x04, 0x00, 0x00, 0x0A, 0xFF, 0x07, 0x1E };
  532. var msg = parser.Deserialize(dataContentReq) as DataContentRequest;
  533. Assert.IsNotNull(msg);
  534. Assert.AreEqual(msg.DataContentType, Dfs.WayneChina.HengshanPayTerminal.Support.DataContentType.FuelPriceList);
  535. }
  536. #endregion
  537. #region Data Content request
  538. [TestMethod]
  539. public void NewlyDeleted_Blacklist_Request_could_be_parsed_Ok()
  540. {
  541. var newlyDeletedBlacklistReq = new byte[] { 0xFA, 0x01, 0x01, 0x19, 0x00, 0x05, 0x27, 0x02, 0x00, 0x00, 0x01, 0xFF, 0x5C, 0x38 };
  542. var dataContentReq = new byte[] { 0xFA, 0x02, 0x02, 0x3D, 0x00, 0x05, 0x27, 0x04, 0x00, 0x00, 0x0A, 0xFF, 0x07, 0x1E };
  543. var msg = parser.Deserialize(newlyDeletedBlacklistReq) as DataContentRequest;
  544. Assert.IsNotNull(msg);
  545. Assert.AreEqual(msg.DataContentType, Dfs.WayneChina.HengshanPayTerminal.Support.DataContentType.NewlyDeletedBlacklist);
  546. Assert.AreEqual(msg.SegmentOffset, 0);
  547. Assert.AreEqual(msg.SegmentCount, 1);
  548. }
  549. #endregion
  550. /*********************** Query Gray Record Request ************************/
  551. #region Query gray record request
  552. [TestMethod]
  553. public void QueryGrayRecordRequest_parsed_Ok()
  554. {
  555. var msg = parser.Deserialize(queryGrayRecordReqBytes) as QueryGrayRecordRequest;
  556. Assert.IsNotNull(msg);
  557. Assert.IsTrue(msg.Asn.Contains("10020383"));
  558. }
  559. [TestMethod]
  560. public void QueryGrayRecordRequest_ctc_is_ok()
  561. {
  562. var msg = parser.Deserialize(queryGrayRecordReqBytes) as QueryGrayRecordRequest;
  563. Assert.IsNotNull(msg);
  564. Assert.AreEqual(4, msg.Ctc);
  565. }
  566. [TestMethod]
  567. public void QueryGrayRecordRequest_balance_is_Ok()
  568. {
  569. var msg = parser.Deserialize(queryGrayRecordReqBytes) as QueryGrayRecordRequest;
  570. Assert.IsNotNull(msg);
  571. Assert.AreEqual(0x19e9, msg.Balance);
  572. }
  573. #endregion
  574. #endregion
  575. #region Full totalizer data
  576. [TestMethod]
  577. public void Full_totalizer_could_be_parsed_ok()
  578. {
  579. int volumeTotal = int.Parse("01EEBDBD", System.Globalization.NumberStyles.HexNumber);
  580. int amountTotal = int.Parse("0C553782", System.Globalization.NumberStyles.HexNumber);
  581. var msg = parser.Deserialize(fullTotalizerBytes) as Totalizer;
  582. Assert.IsNotNull(msg);
  583. Assert.AreEqual(1, msg.NozzleCount);
  584. Assert.AreEqual("01EEBDBD", msg.TotalizerData.First().VolumeTotal);
  585. Assert.AreEqual("0C553782", msg.TotalizerData.First().AmountTotal);
  586. }
  587. #endregion
  588. /**************************************************************************/
  589. /************************ SERIALIZATION TESTS ***************************/
  590. /**************************************************************************/
  591. #region Serialization tests
  592. /**************************** Register Result *****************************/
  593. #region Register reuslt
  594. [TestMethod]
  595. public void RegisterResult_serialize_Ok()
  596. {
  597. var expected = new byte[] { 0xFA, 0x01, 0x01, 0x01, 0x00, 0x22, 0x14, 0x00, 0x00, 0x00, 0x01, 0x12, 0x59, 0x8A, 0x93, 0xF2,
  598. 0x27, 0x54, 0xF4, 0x6B, 0x17, 0x20, 0x98, 0x8B, 0x8C, 0x1C, 0x24, 0x00, 0x00, 0x0A, 0xD7, 0xA2, 0xB2, 0xE1, 0xB3, 0xC9,
  599. 0xB9, 0xA6, 0x0D, 0x0A, 0xFF, 0x69, 0x2D };
  600. RegisterResult registerResult = new RegisterResult
  601. {
  602. Prefix = 0xFA,
  603. SourceAddress = 1,
  604. DestinationAddress = 1,
  605. Handle = Convert.ToByte(Command.RegisterResult),
  606. TerminalId = "00000001",
  607. SystemKey = "12598A93F22754F46B1720988B8C1C24",
  608. Result = 0,
  609. StationNameLength = 0,
  610. AdditionalInfoLength = 10,
  611. AdditionalInfo = StringToByteArray("D7A2B2E1B3C9B9A60D0A").ToList(),
  612. };
  613. registerResult.SetCallingParty(CallingParty.System);
  614. registerResult.SetSeqNo(1);
  615. var sourceBytes = parser.Serialize(registerResult);
  616. string hex = BitConverter.ToString(sourceBytes);
  617. Assert.IsTrue(ValueEquals(sourceBytes, expected));
  618. }
  619. #endregion
  620. /************************** Check cmd response ****************************/
  621. #region Check cmd response
  622. [TestMethod]
  623. public void CheckCmdResponse_serialize_Ok()
  624. {
  625. var expectedBytes = new byte[] { 0xFA, 0x01, 0x01, 0x73, 0x00, 0x12, 0x11, 0x20, 0x19, 0x03, 0x12, 0x08, 0x42, 0x48, 0x00,
  626. 0x29, 0xEB, 0x78, 0x24, 0xF4, 0x62, 0x00, 0x00, 0x00, 0xFF, 0x3C, 0x07 };
  627. var timeStamp = DateTime.ParseExact("20190312084248", "yyyyMMddHHmmss", System.Globalization.CultureInfo.InvariantCulture);
  628. InquiryResult inquiryResult = new InquiryResult
  629. {
  630. Prefix = 0xFA,
  631. SourceAddress = 1,
  632. DestinationAddress = 1,
  633. Handle = Convert.ToByte(Command.Ver_info),
  634. BaseBlacklistVersion = 0x29,
  635. NewlyAddedBlacklistVersion = 0xEB,
  636. NewlyDeletedBlacklistVersion = 0x78,
  637. WhitelistVersion = 0x24,
  638. FuelPriceVersion = 0xF4,
  639. StationGeneralInfoVersion = 0x62,
  640. PrinterReceiptInfoVersion = 0x00,
  641. SoftwareDownloadFlag = 0x00,
  642. UnspecifiedField1 = 0x00,
  643. };
  644. inquiryResult.SetCallingParty(CallingParty.Pump);
  645. inquiryResult.SetSeqNo(51);
  646. inquiryResult.SetTime(timeStamp);
  647. var sourceBytes = parser.Serialize(inquiryResult);
  648. string hex = BitConverter.ToString(sourceBytes);
  649. Assert.IsTrue(ValueEquals(sourceBytes, expectedBytes));
  650. }
  651. #endregion
  652. /*********************** Change auth mode response ************************/
  653. #region Change auth mode
  654. [TestMethod]
  655. public void ChangeAuthMode_serialize_Ok()
  656. {
  657. var expected = new byte[] { 0xFA, 0x01, 0x01, 0x73, 0x00, 0x04, 0x1B, 0x01, 0x01, 0x02, 0xFF, 0x3E, 0x25 };
  658. ChangeAuthMode changeAuthModeReq = new ChangeAuthMode
  659. {
  660. Prefix = 0xFA,
  661. SourceAddress = 0x01,
  662. DestinationAddress = 0x01,
  663. Handle = Convert.ToByte(Command.ChangeAuthMode),
  664. FPCode = "0101",
  665. WorkMode = WorkMode.ServiceAutoAuth,
  666. };
  667. changeAuthModeReq.SetCallingParty(CallingParty.Pump);
  668. changeAuthModeReq.SetSeqNo(51);
  669. var sourceBytes = parser.Serialize(changeAuthModeReq);
  670. string hex = BitConverter.ToString(sourceBytes);
  671. Assert.IsTrue(ValueEquals(sourceBytes, expected));
  672. }
  673. #endregion
  674. /************************* Validate card response *************************/
  675. #region Validate card result
  676. [TestMethod]
  677. public void ValidateCardResult_serialize_Ok()
  678. {
  679. var expected = new byte[] { 0xFA, 0x01, 0x01, 0x5C, 0x00, 0x1A, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x05,
  680. 0x53, 0x05, 0x7A, 0x40, 0x6D, 0xCA, 0x9D, 0x06, 0x00, 0x00, 0x00, 0x05, 0x7A, 0x40, 0x00, 0x00, 0xFF, 0x4E, 0x1F };
  681. ValidateCardResult validateCardResult = new ValidateCardResult
  682. {
  683. Prefix = 0xFA,
  684. SourceAddress = 0x01,
  685. DestinationAddress = 0x01,
  686. Handle = Convert.ToByte(Command.ValidateCardResult),
  687. Asn = "00000000000010010553",
  688. MaxAllowedAmount = 0x057A40,
  689. PhysicalCardNo = 0x6DCA9D06,
  690. DiscountNo = 0x0000,
  691. CardBalance = 0x057A40,
  692. CardState = Dfs.WayneChina.HengshanPayTerminal.Support.CardState.Ok,
  693. AdditionalInfoLength = 0x00
  694. };
  695. validateCardResult.SetCallingParty(CallingParty.Pump);
  696. validateCardResult.SetSeqNo(28);
  697. var sourceBytes = parser.Serialize(validateCardResult);
  698. string hex = BitConverter.ToString(sourceBytes);
  699. Assert.IsTrue(ValueEquals(sourceBytes, expected));
  700. }
  701. [TestMethod]
  702. public void ValidateCardResult_chip_card_serialize_Ok()
  703. {
  704. var expected = new byte[] { 0xFA, 0x01, 0x01, 0x3E, 0x00, 0x1A, 0x16, 0x11, 0x00, 0x01, 0x10, 0x00, 0x13, 0x80, 0x00, 0x10, 0x49,
  705. 0x07, 0x6A, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x6A, 0x26, 0x00, 0x00, 0xFF, 0x41, 0x66 };
  706. ValidateCardResult validateCardResult = new ValidateCardResult
  707. {
  708. Prefix = 0xFA,
  709. SourceAddress = 0x01,
  710. DestinationAddress = 0x01,
  711. FrameSqNoByte = 0x3E,
  712. Handle = Convert.ToByte(Command.ValidateCardResult),
  713. Asn = "11000110001380001049",
  714. MaxAllowedAmount = 0x076A26,
  715. PhysicalCardNo = 0,
  716. DiscountNo = 0x0000,
  717. CardBalance = 0x00076A26,
  718. CardState = Dfs.WayneChina.HengshanPayTerminal.Support.CardState.Ok,
  719. AdditionalInfoLength = 0x00
  720. };
  721. var sourceBytes = parser.Serialize(validateCardResult);
  722. string hex = BitConverter.ToString(sourceBytes);
  723. Assert.IsTrue(ValueEquals(sourceBytes, expected));
  724. }
  725. #endregion
  726. /******************************* Auth result ******************************/
  727. #region Auth result
  728. [TestMethod]
  729. public void AuthResult_serialize_Ok()
  730. {
  731. var expected = new byte[] { 0xFA, 0x01, 0x01, 0x6A, 0x00, 0x15, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x05,
  732. 0x28, 0x00, 0x00, 0x03, 0x0A, 0x06, 0x0E, 0x01, 0x01, 0x00, 0x00, 0xFF, 0x5D, 0x73 };
  733. AuthResult authResult = new AuthResult
  734. {
  735. Prefix = 0xFA,
  736. SourceAddress = 0x01,
  737. DestinationAddress = 0x01,
  738. Handle = Convert.ToByte(Command.AuthResult),
  739. Asn = "00000000000010010528",
  740. PosTtc = 0x30A,
  741. SeqNo = 0x60E,
  742. FuelCode = 0x0101,
  743. ResultCode = Dfs.WayneChina.HengshanPayTerminal.Support.AuthResultCode.Passed,
  744. AdditionalInfoLength = 0
  745. };
  746. authResult.SetCallingParty(CallingParty.Pump);
  747. authResult.SetSeqNo(42);
  748. var sourceBytes = parser.Serialize(authResult);
  749. string hex = BitConverter.ToString(sourceBytes);
  750. Assert.IsTrue(ValueEquals(sourceBytes, expected));
  751. }
  752. #endregion
  753. /************************** Cancel auth result ****************************/
  754. #region Cancel auth result
  755. [TestMethod]
  756. public void CancelAuthResult_serialize_Ok()
  757. {
  758. var expected = new byte[]
  759. {
  760. 0xFA, 0x03, 0x03, 0x35, 0x00, 0x15, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x05,
  761. 0x43, 0x00, 0x00, 0x2F, 0x77, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0xFF, 0x00, 0x3B
  762. };
  763. var cancelAuthResult = new CancelAuthResult();
  764. cancelAuthResult.Prefix = 0xFA;
  765. cancelAuthResult.DestinationAddress = 0x03;
  766. cancelAuthResult.SourceAddress = 0x03;
  767. cancelAuthResult.FrameSqNoByte = 0x35;
  768. cancelAuthResult.Handle = (byte)Command.CancelAuthResult;
  769. cancelAuthResult.Asn = "00000000000010010543";
  770. cancelAuthResult.PosTtc = 0x2F77;
  771. cancelAuthResult.SeqNo = 0;
  772. cancelAuthResult.FPCode = 0x0303;
  773. cancelAuthResult.Result = 0;
  774. cancelAuthResult.AdditionalInfoLength = 0;
  775. var bytes = parser.Serialize(cancelAuthResult);
  776. string hex = BitConverter.ToString(bytes);
  777. Assert.IsTrue(ValueEquals(bytes, expected));
  778. }
  779. #endregion
  780. /**************************** Fueling data ack ****************************/
  781. #region Fueling data ack
  782. [TestMethod]
  783. public void FuelingDataProcessingResult_serialize_Ok()
  784. {
  785. var expected = new byte[] { 0xFA, 0x01, 0x01, 0x08, 0x00, 0x09, 0x35, 0x00, 0x00, 0x03, 0x23, 0x00, 0x0F, 0x01, 0x01,
  786. 0xFF, 0x07, 0x6D };
  787. var fuelingDataResult = new FuelingDataProcessingResult
  788. {
  789. Prefix = 0xFA,
  790. SourceAddress = 0x01,
  791. DestinationAddress = 0x01,
  792. Handle = Convert.ToByte(Command.FuelingDataResult),
  793. PosTtc = 0x323,
  794. SeqNo = 0x0F,
  795. FPCode = 0x101
  796. };
  797. fuelingDataResult.SetCallingParty(CallingParty.System);
  798. fuelingDataResult.SetSeqNo(8);
  799. var sourceBytes = parser.Serialize(fuelingDataResult);
  800. string hex = BitConverter.ToString(sourceBytes);
  801. Assert.IsTrue(ValueEquals(sourceBytes, expected));
  802. }
  803. #endregion
  804. /******************************* Payment ack ******************************/
  805. #region Payment ack
  806. [TestMethod]
  807. public void PaymentData_serialize_Ok()
  808. {
  809. var expected = new byte[] { 0xFA, 0x01, 0x01, 0x5A, 0x00, 0x32, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x05,
  810. 0x53, 0x00, 0x00, 0x03, 0x22, 0x00, 0x0E, 0x00, 0x1D, 0x4D, 0x00, 0x1D, 0x4D, 0x00, 0x01, 0x44, 0x09, 0x0B, 0x04, 0x07,
  811. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00,
  812. 0xFF, 0x3D, 0x6C };
  813. var paymentData = new PaymentData
  814. {
  815. Prefix = 0xFA,
  816. SourceAddress = 0x01,
  817. DestinationAddress = 0x01,
  818. Handle = Convert.ToByte(Command.PaymentData),
  819. Asn = "00000000000010010553",
  820. PosTtc = 0x322,
  821. SeqNo = 0x0E,
  822. FillingAmount = 0x1D4D,
  823. PayAmount = 0x1D4D,
  824. FillingVolume = 0x144,
  825. Price = 0x90B,
  826. ProductCode = 0x407,
  827. C_Name = "00000000000000000000000000000000",
  828. FPCode = 0x101,
  829. Result = 0x00
  830. };
  831. paymentData.SetCallingParty(CallingParty.Pump);
  832. paymentData.SetSeqNo(0x1A);
  833. var sourceBytes = parser.Serialize(paymentData);
  834. string hex = BitConverter.ToString(sourceBytes);
  835. Assert.IsTrue(ValueEquals(sourceBytes, expected));
  836. }
  837. #endregion
  838. /************************** Transaction data ack **************************/
  839. #region Transaction Data ack
  840. [TestMethod]
  841. public void TransactionDataAck_serialize_Ok()
  842. {
  843. var expected = new byte[] { 0xFA, 0x01, 0x01, 0x5B, 0x00, 0x08, 0x32, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xFF, 0x2B,
  844. 0x6D };
  845. var trxDataAck = new TransactionDataAck
  846. {
  847. Prefix = 0xFA,
  848. SourceAddress = 0x01,
  849. DestinationAddress = 0x01,
  850. Handle = Convert.ToByte(Command.TransactionDataAck),
  851. Result = 0x00,
  852. TerminalId = "00000001",
  853. UnspecifiedField1 = 0,
  854. };
  855. trxDataAck.SetCallingParty(CallingParty.Pump);
  856. trxDataAck.SetSeqNo(0x1B);
  857. var sourceBytes = parser.Serialize(trxDataAck);
  858. string hex = BitConverter.ToString(sourceBytes);
  859. Assert.IsTrue(ValueEquals(sourceBytes, expected));
  860. }
  861. #endregion
  862. /**************************** Data download ack ***************************/
  863. #region Data download ack
  864. [TestMethod]
  865. public void DataBytesLength_serialize_Ok()
  866. {
  867. var expected = new byte[] { 0xFA, 0x02, 0x02, 0x2B, 0x00, 0x06, 0x26, 0x00, 0x00, 0x00, 0x32, 0x04, 0xFF, 0x5A, 0x31 };
  868. var dataBytesLen = new DataBytesLength
  869. {
  870. Prefix = 0xFA,
  871. SourceAddress = 0x02,
  872. DestinationAddress = 0x02,
  873. Handle = Convert.ToByte(Command.DataBytesLength),
  874. DataLength = 0x32,
  875. DataContentType = Dfs.WayneChina.HengshanPayTerminal.Support.DataContentType.FuelPriceList
  876. };
  877. dataBytesLen.SetCallingParty(CallingParty.System);
  878. dataBytesLen.SetSeqNo(0x2B);
  879. var sourceBytes = parser.Serialize(dataBytesLen);
  880. string hex = BitConverter.ToString(sourceBytes);
  881. Assert.IsTrue(ValueEquals(sourceBytes, expected));
  882. }
  883. #endregion
  884. /*************************** Data content response ************************/
  885. #region Data content response
  886. [TestMethod]
  887. public void DataContent_serialize_Ok()
  888. {
  889. System.Text.EncodingProvider provider = System.Text.CodePagesEncodingProvider.Instance;
  890. System.Text.Encoding.RegisterProvider(provider);
  891. var expected = new byte[]
  892. {
  893. 0xFA, 0x01, 0x01, 0x2A, 0x00, 0x45, 0x28, 0x04, 0x00, 0x00, 0x04, 0xC9, 0x20, 0x19, 0x08, 0x08,
  894. 0x08, 0x43, 0x01, 0x01, 0x10, 0x40, 0x39, 0x35, 0x23, 0xC6, 0xFB, 0xD3, 0xCD, 0x00, 0x00, 0x00,
  895. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  896. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0xFE, 0x00, 0x00, 0x00,
  897. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x1B, 0x39
  898. };
  899. var dataContent = new DataContent
  900. {
  901. Prefix = 0xFA,
  902. DestinationAddress = 0x01,
  903. SourceAddress = 0x01,
  904. FrameSqNoByte = 0x2A,
  905. Handle = (byte)Command.DataContent,
  906. DataContentType = Dfs.WayneChina.HengshanPayTerminal.Support.DataContentType.FuelPriceList,
  907. SegmentOffset = 0,
  908. SegmentCount = 4
  909. };
  910. var record = new FuelPriceRecord();
  911. record.Density = 0;
  912. record.Version = 0xC9;
  913. record.EffectiveTime = "201908080843";
  914. record.NozzleNo = 0x01;
  915. record.ValidPriceCount = 1;
  916. record.RecordCount = 1;
  917. record.FuelProductCode = 1040;
  918. record.FuelProductName = ByteArrayToString(System.Text.Encoding.GetEncoding("GB2312").GetBytes("95#汽油")).PadRight(64, '0');
  919. record.Price1 = 0x2FE;
  920. dataContent.Content = parser.SerializeInnerElement(record).ToList();
  921. var sourceBytes = parser.Serialize(dataContent);
  922. string hex = BitConverter.ToString(sourceBytes);
  923. Assert.IsTrue(ValueEquals(sourceBytes, expected));
  924. }
  925. #endregion
  926. #region Fuel price record
  927. [TestMethod]
  928. public void FuelPriceRecord_serialize_Ok()
  929. {
  930. var expected = new byte[] { 0x3D, 0x20, 0x19, 0x03, 0x18, 0x13, 0x54, 0x01, 0x02, 0x10, 0x30, 0x39, 0x32, 0x23, 0xC6, 0xFB,
  931. 0xD3, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  932. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  933. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
  934. var fpc = System.Text.Encoding.ASCII.GetBytes("393223C6FBD3CD00000000000000000000000000000000000000000000000000");
  935. FuelPriceRecord record = new FuelPriceRecord
  936. {
  937. Version = 0x3D,
  938. EffectiveTime = "201903181354",
  939. RecordCount = 1,
  940. NozzleNo = 2,
  941. FuelProductCode = 1030,
  942. FuelProductName = "393223C6FBD3CD00000000000000000000000000000000000000000000000000",
  943. Density = 0,
  944. ValidPriceCount = 1,
  945. Price1 = 0x314
  946. };
  947. var bytes = parser.SerializeInnerElement(record);
  948. string hex = BitConverter.ToString(bytes);
  949. Assert.IsTrue(ValueEquals(bytes, expected));
  950. }
  951. #endregion
  952. #region Listed cards
  953. [TestMethod]
  954. public void ListedCards_serialize_Ok()
  955. {
  956. var expected = new byte[]
  957. {
  958. 0x00, 0x2A, 0x20, 0x14, 0x03, 0x10, 0x21, 0x14, 0x03, 0x10, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0F
  959. };
  960. ListedCardRecord record = new ListedCardRecord
  961. {
  962. Version = 0x2A,
  963. ValidStartDate = "20140310",
  964. ExpiryDate = "21140310",
  965. Region = Convert.ToString(ushort.MaxValue),
  966. CardCount = 15
  967. };
  968. var bytes = parser.SerializeInnerElement(record);
  969. Assert.IsTrue(ValueEquals(bytes, expected));
  970. }
  971. #endregion
  972. /**************************** Lock Pump Request ***************************/
  973. #region Lock pump
  974. [TestMethod]
  975. public void LockPump_is_serialized_Ok()
  976. {
  977. //FA01010D000444010101FF2C69
  978. // ----<-Fueling point
  979. // --<01=Lock pump
  980. byte[] lockPumpReq = new byte[] { 0xFA, 0x01, 0x01, 0x0D, 0x00, 0x04, 0x44, 0x01, 0x01, 0x01, 0xFF, 0x2C, 0x69 };
  981. LockOrUnlockPumpRequest lockRequest = new LockOrUnlockPumpRequest
  982. {
  983. Prefix = 0xFA,
  984. SourceAddress = 1,
  985. DestinationAddress = 1,
  986. FrameSqNoByte = 0x0D,
  987. Handle = Convert.ToByte(Command.LockOrUnlockPump),
  988. FPCode = "0101",
  989. OperationType = Dfs.WayneChina.HengshanPayTerminal.Support.LockUnlockOperation.Lock,
  990. };
  991. var bytes = parser.Serialize(lockRequest);
  992. string hex = BitConverter.ToString(bytes);
  993. Assert.IsTrue(ValueEquals(bytes, lockPumpReq));
  994. }
  995. #endregion
  996. #region QueryGrayRecord result
  997. [TestMethod]
  998. public void QueryGrayRecordResult_serialize_Ok()
  999. {
  1000. var expected = new byte[]
  1001. {
  1002. 0xFA, 0x04, 0x04, 0x1F, 0x00, 0x30, 0x22, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x02,
  1003. 0x03, 0x83, 0x00, 0x00, 0x19, 0xE9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x20, 0x19,
  1004. 0x11, 0x19, 0x17, 0x07, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1005. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x62, 0x31
  1006. };
  1007. var result = new QueryGrayRecordResult();
  1008. result.Prefix = 0xFA;
  1009. result.DestinationAddress = 4;
  1010. result.SourceAddress = 4;
  1011. result.FrameSqNoByte = 0x1F;
  1012. result.Handle = 0x22;
  1013. result.Match = 1;
  1014. result.Asn = "00000000000010020383";
  1015. result.Balance = 0x19e9;
  1016. //result.Amount = 0;
  1017. result.Amount1 = 0;
  1018. result.Ctc = 4;
  1019. result.Time = "20191119170715";
  1020. result.Gmac = "00000000";
  1021. result.PsamTid = "000000000000";
  1022. result.PsamTtc = 0;
  1023. result.Volume = 0;
  1024. var bytes = parser.Serialize(result);
  1025. string hex = BitConverter.ToString(bytes);
  1026. Assert.IsTrue(ValueEquals(bytes, expected));
  1027. }
  1028. #endregion
  1029. ///////////////////////// SERIALIZATION END //////////////////
  1030. #endregion
  1031. #region Helper method
  1032. public static bool ValueEquals(IEnumerable<byte> array1, IEnumerable<byte> array2)
  1033. {
  1034. if (array1 == null && array2 == null)
  1035. {
  1036. return true;
  1037. }
  1038. if ((array1 == null) || (array2 == null))
  1039. {
  1040. return false;
  1041. }
  1042. if (array1.Count() != array2.Count())
  1043. {
  1044. return false;
  1045. }
  1046. if (array1.Equals(array2))
  1047. {
  1048. return true;
  1049. }
  1050. else
  1051. {
  1052. for (int Index = 0; Index < array1.Count(); Index++)
  1053. {
  1054. if (!Equals(array1.ElementAt(Index), array2.ElementAt(Index)))
  1055. {
  1056. return false;
  1057. }
  1058. }
  1059. }
  1060. return true;
  1061. }
  1062. public byte[] StringToByteArray(string hex)
  1063. {
  1064. int numberChars = hex.Length;
  1065. byte[] bytes = new byte[numberChars / 2];
  1066. for (int i = 0; i < numberChars; i += 2)
  1067. bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
  1068. return bytes;
  1069. }
  1070. public static string ByteArrayToString(byte[] ba)
  1071. {
  1072. return BitConverter.ToString(ba).Replace("-", "");
  1073. }
  1074. #endregion
  1075. }
  1076. }