EscSeqUtilsTests.cs 49 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181
  1. using System.Diagnostics;
  2. using System.Runtime.InteropServices;
  3. namespace Terminal.Gui.InputTests;
  4. public class EscSeqUtilsTests
  5. {
  6. private bool _actionStarted;
  7. private MouseFlags _arg1;
  8. private Point _arg2;
  9. private string _c1Control, _code, _terminating;
  10. private ConsoleKeyInfo [] _cki;
  11. private EscSeqRequests _escSeqReqProc;
  12. private bool _isKeyMouse;
  13. private bool _isReq;
  14. private ConsoleKey _key;
  15. private ConsoleModifiers _mod;
  16. private List<MouseFlags> _mouseFlags;
  17. private ConsoleKeyInfo _newConsoleKeyInfo;
  18. private Point _pos;
  19. private string [] _values;
  20. [Fact]
  21. [AutoInitShutdown]
  22. public void DecodeEscSeq_Tests ()
  23. {
  24. // ESC
  25. _cki = new ConsoleKeyInfo [] { new ('\u001b', 0, false, false, false) };
  26. var expectedCki = new ConsoleKeyInfo ('\u001b', ConsoleKey.Escape, false, false, false);
  27. EscSeqUtils.DecodeEscSeq (
  28. _escSeqReqProc,
  29. ref _newConsoleKeyInfo,
  30. ref _key,
  31. _cki,
  32. ref _mod,
  33. out _c1Control,
  34. out _code,
  35. out _values,
  36. out _terminating,
  37. out _isKeyMouse,
  38. out _mouseFlags,
  39. out _pos,
  40. out _isReq,
  41. ProcessContinuousButtonPressed
  42. );
  43. Assert.Null (_escSeqReqProc);
  44. Assert.Equal (expectedCki, _newConsoleKeyInfo);
  45. Assert.Equal (ConsoleKey.Escape, _key);
  46. Assert.Equal (0, (int)_mod);
  47. Assert.Equal ("ESC", _c1Control);
  48. Assert.Null (_code);
  49. Assert.Null (_values);
  50. Assert.Null (_terminating);
  51. Assert.False (_isKeyMouse);
  52. Assert.Equal (new List<MouseFlags> { 0 }, _mouseFlags);
  53. Assert.Equal (Point.Empty, _pos);
  54. Assert.False (_isReq);
  55. Assert.Equal (0, (int)_arg1);
  56. Assert.Equal (Point.Empty, _arg2);
  57. ClearAll ();
  58. _cki = new ConsoleKeyInfo [] { new ('\u001b', 0, false, false, false), new ('\u0012', 0, false, false, false) };
  59. expectedCki = new ConsoleKeyInfo ('\u0012', ConsoleKey.R, false, true, true);
  60. EscSeqUtils.DecodeEscSeq (
  61. _escSeqReqProc,
  62. ref _newConsoleKeyInfo,
  63. ref _key,
  64. _cki,
  65. ref _mod,
  66. out _c1Control,
  67. out _code,
  68. out _values,
  69. out _terminating,
  70. out _isKeyMouse,
  71. out _mouseFlags,
  72. out _pos,
  73. out _isReq,
  74. ProcessContinuousButtonPressed
  75. );
  76. Assert.Null (_escSeqReqProc);
  77. Assert.Equal (expectedCki, _newConsoleKeyInfo);
  78. Assert.Equal (ConsoleKey.R, _key);
  79. Assert.Equal (0, (int)_mod);
  80. Assert.Equal ("ESC", _c1Control);
  81. Assert.Null (_code);
  82. Assert.Null (_values);
  83. Assert.Equal ("\u0012", _terminating);
  84. Assert.False (_isKeyMouse);
  85. Assert.Equal (new List<MouseFlags> { 0 }, _mouseFlags);
  86. Assert.Equal (Point.Empty, _pos);
  87. Assert.False (_isReq);
  88. Assert.Equal (0, (int)_arg1);
  89. Assert.Equal (Point.Empty, _arg2);
  90. ClearAll ();
  91. _cki = new ConsoleKeyInfo [] { new ('\u001b', 0, false, false, false), new ('r', 0, false, false, false) };
  92. expectedCki = new ConsoleKeyInfo ('R', ConsoleKey.R, false, true, false);
  93. EscSeqUtils.DecodeEscSeq (
  94. _escSeqReqProc,
  95. ref _newConsoleKeyInfo,
  96. ref _key,
  97. _cki,
  98. ref _mod,
  99. out _c1Control,
  100. out _code,
  101. out _values,
  102. out _terminating,
  103. out _isKeyMouse,
  104. out _mouseFlags,
  105. out _pos,
  106. out _isReq,
  107. ProcessContinuousButtonPressed
  108. );
  109. Assert.Null (_escSeqReqProc);
  110. Assert.Equal (expectedCki, _newConsoleKeyInfo);
  111. Assert.Equal (ConsoleKey.R, _key);
  112. Assert.Equal (0, (int)_mod);
  113. Assert.Equal ("ESC", _c1Control);
  114. Assert.Null (_code);
  115. Assert.Null (_values);
  116. Assert.Equal ("r", _terminating);
  117. Assert.False (_isKeyMouse);
  118. Assert.Equal (new List<MouseFlags> { 0 }, _mouseFlags);
  119. Assert.Equal (Point.Empty, _pos);
  120. Assert.False (_isReq);
  121. Assert.Equal (0, (int)_arg1);
  122. Assert.Equal (Point.Empty, _arg2);
  123. // SS3
  124. ClearAll ();
  125. _cki = new ConsoleKeyInfo []
  126. {
  127. new ('\u001b', 0, false, false, false), new ('O', 0, false, false, false), new ('R', 0, false, false, false)
  128. };
  129. expectedCki = new ConsoleKeyInfo ('\0', ConsoleKey.F3, false, false, false);
  130. EscSeqUtils.DecodeEscSeq (
  131. _escSeqReqProc,
  132. ref _newConsoleKeyInfo,
  133. ref _key,
  134. _cki,
  135. ref _mod,
  136. out _c1Control,
  137. out _code,
  138. out _values,
  139. out _terminating,
  140. out _isKeyMouse,
  141. out _mouseFlags,
  142. out _pos,
  143. out _isReq,
  144. ProcessContinuousButtonPressed
  145. );
  146. Assert.Null (_escSeqReqProc);
  147. Assert.Equal (expectedCki, _newConsoleKeyInfo);
  148. Assert.Equal (ConsoleKey.F3, _key);
  149. Assert.Equal (0, (int)_mod);
  150. Assert.Equal ("SS3", _c1Control);
  151. Assert.Null (_code);
  152. Assert.Single (_values);
  153. Assert.Null (_values [0]);
  154. Assert.Equal ("R", _terminating);
  155. Assert.False (_isKeyMouse);
  156. Assert.Equal (new List<MouseFlags> { 0 }, _mouseFlags);
  157. Assert.Equal (Point.Empty, _pos);
  158. Assert.False (_isReq);
  159. Assert.Equal (0, (int)_arg1);
  160. Assert.Equal (Point.Empty, _arg2);
  161. // CSI
  162. ClearAll ();
  163. _cki = new ConsoleKeyInfo []
  164. {
  165. new ('\u001b', 0, false, false, false),
  166. new ('[', 0, false, false, false),
  167. new ('1', 0, false, false, false),
  168. new (';', 0, false, false, false),
  169. new ('2', 0, false, false, false),
  170. new ('R', 0, false, false, false)
  171. };
  172. expectedCki = new ConsoleKeyInfo ('\0', ConsoleKey.F3, true, false, false);
  173. EscSeqUtils.DecodeEscSeq (
  174. _escSeqReqProc,
  175. ref _newConsoleKeyInfo,
  176. ref _key,
  177. _cki,
  178. ref _mod,
  179. out _c1Control,
  180. out _code,
  181. out _values,
  182. out _terminating,
  183. out _isKeyMouse,
  184. out _mouseFlags,
  185. out _pos,
  186. out _isReq,
  187. ProcessContinuousButtonPressed
  188. );
  189. Assert.Null (_escSeqReqProc);
  190. Assert.Equal (expectedCki, _newConsoleKeyInfo);
  191. Assert.Equal (ConsoleKey.F3, _key);
  192. Assert.Equal (ConsoleModifiers.Shift, _mod);
  193. Assert.Equal ("CSI", _c1Control);
  194. Assert.Null (_code);
  195. Assert.Equal (2, _values.Length);
  196. Assert.Equal ("1", _values [0]);
  197. Assert.Equal ("2", _values [^1]);
  198. Assert.Equal ("R", _terminating);
  199. Assert.False (_isKeyMouse);
  200. Assert.Equal (new List<MouseFlags> { 0 }, _mouseFlags);
  201. Assert.Equal (Point.Empty, _pos);
  202. Assert.False (_isReq);
  203. Assert.Equal (0, (int)_arg1);
  204. Assert.Equal (Point.Empty, _arg2);
  205. ClearAll ();
  206. _cki = new ConsoleKeyInfo []
  207. {
  208. new ('\u001b', 0, false, false, false),
  209. new ('[', 0, false, false, false),
  210. new ('1', 0, false, false, false),
  211. new (';', 0, false, false, false),
  212. new ('3', 0, false, false, false),
  213. new ('R', 0, false, false, false)
  214. };
  215. expectedCki = new ConsoleKeyInfo ('\0', ConsoleKey.F3, false, true, false);
  216. EscSeqUtils.DecodeEscSeq (
  217. _escSeqReqProc,
  218. ref _newConsoleKeyInfo,
  219. ref _key,
  220. _cki,
  221. ref _mod,
  222. out _c1Control,
  223. out _code,
  224. out _values,
  225. out _terminating,
  226. out _isKeyMouse,
  227. out _mouseFlags,
  228. out _pos,
  229. out _isReq,
  230. ProcessContinuousButtonPressed
  231. );
  232. Assert.Null (_escSeqReqProc);
  233. Assert.Equal (expectedCki, _newConsoleKeyInfo);
  234. Assert.Equal (ConsoleKey.F3, _key);
  235. Assert.Equal (ConsoleModifiers.Alt, _mod);
  236. Assert.Equal ("CSI", _c1Control);
  237. Assert.Null (_code);
  238. Assert.Equal (2, _values.Length);
  239. Assert.Equal ("1", _values [0]);
  240. Assert.Equal ("3", _values [^1]);
  241. Assert.Equal ("R", _terminating);
  242. Assert.False (_isKeyMouse);
  243. Assert.Equal (new List<MouseFlags> { 0 }, _mouseFlags);
  244. Assert.Equal (Point.Empty, _pos);
  245. Assert.False (_isReq);
  246. Assert.Equal (0, (int)_arg1);
  247. Assert.Equal (Point.Empty, _arg2);
  248. ClearAll ();
  249. _cki = new ConsoleKeyInfo []
  250. {
  251. new ('\u001b', 0, false, false, false),
  252. new ('[', 0, false, false, false),
  253. new ('1', 0, false, false, false),
  254. new (';', 0, false, false, false),
  255. new ('4', 0, false, false, false),
  256. new ('R', 0, false, false, false)
  257. };
  258. expectedCki = new ConsoleKeyInfo ('\0', ConsoleKey.F3, true, true, false);
  259. EscSeqUtils.DecodeEscSeq (
  260. _escSeqReqProc,
  261. ref _newConsoleKeyInfo,
  262. ref _key,
  263. _cki,
  264. ref _mod,
  265. out _c1Control,
  266. out _code,
  267. out _values,
  268. out _terminating,
  269. out _isKeyMouse,
  270. out _mouseFlags,
  271. out _pos,
  272. out _isReq,
  273. ProcessContinuousButtonPressed
  274. );
  275. Assert.Null (_escSeqReqProc);
  276. Assert.Equal (expectedCki, _newConsoleKeyInfo);
  277. Assert.Equal (ConsoleKey.F3, _key);
  278. Assert.Equal (ConsoleModifiers.Shift | ConsoleModifiers.Alt, _mod);
  279. Assert.Equal ("CSI", _c1Control);
  280. Assert.Null (_code);
  281. Assert.Equal (2, _values.Length);
  282. Assert.Equal ("1", _values [0]);
  283. Assert.Equal ("4", _values [^1]);
  284. Assert.Equal ("R", _terminating);
  285. Assert.False (_isKeyMouse);
  286. Assert.Equal (new List<MouseFlags> { 0 }, _mouseFlags);
  287. Assert.Equal (Point.Empty, _pos);
  288. Assert.False (_isReq);
  289. Assert.Equal (0, (int)_arg1);
  290. Assert.Equal (Point.Empty, _arg2);
  291. ClearAll ();
  292. _cki = new ConsoleKeyInfo []
  293. {
  294. new ('\u001b', 0, false, false, false),
  295. new ('[', 0, false, false, false),
  296. new ('1', 0, false, false, false),
  297. new (';', 0, false, false, false),
  298. new ('5', 0, false, false, false),
  299. new ('R', 0, false, false, false)
  300. };
  301. expectedCki = new ConsoleKeyInfo ('\0', ConsoleKey.F3, false, false, true);
  302. EscSeqUtils.DecodeEscSeq (
  303. _escSeqReqProc,
  304. ref _newConsoleKeyInfo,
  305. ref _key,
  306. _cki,
  307. ref _mod,
  308. out _c1Control,
  309. out _code,
  310. out _values,
  311. out _terminating,
  312. out _isKeyMouse,
  313. out _mouseFlags,
  314. out _pos,
  315. out _isReq,
  316. ProcessContinuousButtonPressed
  317. );
  318. Assert.Null (_escSeqReqProc);
  319. Assert.Equal (expectedCki, _newConsoleKeyInfo);
  320. Assert.Equal (ConsoleKey.F3, _key);
  321. Assert.Equal (ConsoleModifiers.Control, _mod);
  322. Assert.Equal ("CSI", _c1Control);
  323. Assert.Null (_code);
  324. Assert.Equal (2, _values.Length);
  325. Assert.Equal ("1", _values [0]);
  326. Assert.Equal ("5", _values [^1]);
  327. Assert.Equal ("R", _terminating);
  328. Assert.False (_isKeyMouse);
  329. Assert.Equal (new List<MouseFlags> { 0 }, _mouseFlags);
  330. Assert.Equal (Point.Empty, _pos);
  331. Assert.False (_isReq);
  332. Assert.Equal (0, (int)_arg1);
  333. Assert.Equal (Point.Empty, _arg2);
  334. ClearAll ();
  335. _cki = new ConsoleKeyInfo []
  336. {
  337. new ('\u001b', 0, false, false, false),
  338. new ('[', 0, false, false, false),
  339. new ('1', 0, false, false, false),
  340. new (';', 0, false, false, false),
  341. new ('6', 0, false, false, false),
  342. new ('R', 0, false, false, false)
  343. };
  344. expectedCki = new ConsoleKeyInfo ('\0', ConsoleKey.F3, true, false, true);
  345. EscSeqUtils.DecodeEscSeq (
  346. _escSeqReqProc,
  347. ref _newConsoleKeyInfo,
  348. ref _key,
  349. _cki,
  350. ref _mod,
  351. out _c1Control,
  352. out _code,
  353. out _values,
  354. out _terminating,
  355. out _isKeyMouse,
  356. out _mouseFlags,
  357. out _pos,
  358. out _isReq,
  359. ProcessContinuousButtonPressed
  360. );
  361. Assert.Null (_escSeqReqProc);
  362. Assert.Equal (expectedCki, _newConsoleKeyInfo);
  363. Assert.Equal (ConsoleKey.F3, _key);
  364. Assert.Equal (ConsoleModifiers.Shift | ConsoleModifiers.Control, _mod);
  365. Assert.Equal ("CSI", _c1Control);
  366. Assert.Null (_code);
  367. Assert.Equal (2, _values.Length);
  368. Assert.Equal ("1", _values [0]);
  369. Assert.Equal ("6", _values [^1]);
  370. Assert.Equal ("R", _terminating);
  371. Assert.False (_isKeyMouse);
  372. Assert.Equal (new List<MouseFlags> { 0 }, _mouseFlags);
  373. Assert.Equal (Point.Empty, _pos);
  374. Assert.False (_isReq);
  375. Assert.Equal (0, (int)_arg1);
  376. Assert.Equal (Point.Empty, _arg2);
  377. ClearAll ();
  378. _cki = new ConsoleKeyInfo []
  379. {
  380. new ('\u001b', 0, false, false, false),
  381. new ('[', 0, false, false, false),
  382. new ('1', 0, false, false, false),
  383. new (';', 0, false, false, false),
  384. new ('7', 0, false, false, false),
  385. new ('R', 0, false, false, false)
  386. };
  387. expectedCki = new ConsoleKeyInfo ('\0', ConsoleKey.F3, false, true, true);
  388. EscSeqUtils.DecodeEscSeq (
  389. _escSeqReqProc,
  390. ref _newConsoleKeyInfo,
  391. ref _key,
  392. _cki,
  393. ref _mod,
  394. out _c1Control,
  395. out _code,
  396. out _values,
  397. out _terminating,
  398. out _isKeyMouse,
  399. out _mouseFlags,
  400. out _pos,
  401. out _isReq,
  402. ProcessContinuousButtonPressed
  403. );
  404. Assert.Null (_escSeqReqProc);
  405. Assert.Equal (expectedCki, _newConsoleKeyInfo);
  406. Assert.Equal (ConsoleKey.F3, _key);
  407. Assert.Equal (ConsoleModifiers.Alt | ConsoleModifiers.Control, _mod);
  408. Assert.Equal ("CSI", _c1Control);
  409. Assert.Null (_code);
  410. Assert.Equal (2, _values.Length);
  411. Assert.Equal ("1", _values [0]);
  412. Assert.Equal ("7", _values [^1]);
  413. Assert.Equal ("R", _terminating);
  414. Assert.False (_isKeyMouse);
  415. Assert.Equal (new List<MouseFlags> { 0 }, _mouseFlags);
  416. Assert.Equal (Point.Empty, _pos);
  417. Assert.False (_isReq);
  418. Assert.Equal (0, (int)_arg1);
  419. Assert.Equal (Point.Empty, _arg2);
  420. ClearAll ();
  421. _cki = new ConsoleKeyInfo []
  422. {
  423. new ('\u001b', 0, false, false, false),
  424. new ('[', 0, false, false, false),
  425. new ('1', 0, false, false, false),
  426. new (';', 0, false, false, false),
  427. new ('8', 0, false, false, false),
  428. new ('R', 0, false, false, false)
  429. };
  430. expectedCki = new ConsoleKeyInfo ('\0', ConsoleKey.F3, true, true, true);
  431. EscSeqUtils.DecodeEscSeq (
  432. _escSeqReqProc,
  433. ref _newConsoleKeyInfo,
  434. ref _key,
  435. _cki,
  436. ref _mod,
  437. out _c1Control,
  438. out _code,
  439. out _values,
  440. out _terminating,
  441. out _isKeyMouse,
  442. out _mouseFlags,
  443. out _pos,
  444. out _isReq,
  445. ProcessContinuousButtonPressed
  446. );
  447. Assert.Null (_escSeqReqProc);
  448. Assert.Equal (expectedCki, _newConsoleKeyInfo);
  449. Assert.Equal (ConsoleKey.F3, _key);
  450. Assert.Equal (ConsoleModifiers.Shift | ConsoleModifiers.Alt | ConsoleModifiers.Control, _mod);
  451. Assert.Equal ("CSI", _c1Control);
  452. Assert.Null (_code);
  453. Assert.Equal (2, _values.Length);
  454. Assert.Equal ("1", _values [0]);
  455. Assert.Equal ("8", _values [^1]);
  456. Assert.Equal ("R", _terminating);
  457. Assert.False (_isKeyMouse);
  458. Assert.Equal (new List<MouseFlags> { 0 }, _mouseFlags);
  459. Assert.Equal (Point.Empty, _pos);
  460. Assert.False (_isReq);
  461. Assert.Equal (0, (int)_arg1);
  462. Assert.Equal (Point.Empty, _arg2);
  463. ClearAll ();
  464. _cki = new ConsoleKeyInfo []
  465. {
  466. new ('\u001b', 0, false, false, false),
  467. new ('[', 0, false, false, false),
  468. new ('<', 0, false, false, false),
  469. new ('0', 0, false, false, false),
  470. new (';', 0, false, false, false),
  471. new ('2', 0, false, false, false),
  472. new (';', 0, false, false, false),
  473. new ('3', 0, false, false, false),
  474. new ('M', 0, false, false, false)
  475. };
  476. expectedCki = default (ConsoleKeyInfo);
  477. EscSeqUtils.DecodeEscSeq (
  478. _escSeqReqProc,
  479. ref _newConsoleKeyInfo,
  480. ref _key,
  481. _cki,
  482. ref _mod,
  483. out _c1Control,
  484. out _code,
  485. out _values,
  486. out _terminating,
  487. out _isKeyMouse,
  488. out _mouseFlags,
  489. out _pos,
  490. out _isReq,
  491. ProcessContinuousButtonPressed
  492. );
  493. Assert.Null (_escSeqReqProc);
  494. Assert.Equal (expectedCki, _newConsoleKeyInfo);
  495. Assert.Equal (0, (int)_key);
  496. Assert.Equal (0, (int)_mod);
  497. Assert.Equal ("CSI", _c1Control);
  498. Assert.Equal ("<", _code);
  499. Assert.Equal (3, _values.Length);
  500. Assert.Equal ("0", _values [0]);
  501. Assert.Equal ("2", _values [1]);
  502. Assert.Equal ("3", _values [^1]);
  503. Assert.Equal ("M", _terminating);
  504. Assert.True (_isKeyMouse);
  505. Assert.Equal (new List<MouseFlags> { MouseFlags.Button1Pressed }, _mouseFlags);
  506. Assert.Equal (new Point (1, 2), _pos);
  507. Assert.False (_isReq);
  508. Assert.Equal (0, (int)_arg1);
  509. Assert.Equal (Point.Empty, _arg2);
  510. ClearAll ();
  511. _cki = new ConsoleKeyInfo []
  512. {
  513. new ('\u001b', 0, false, false, false),
  514. new ('[', 0, false, false, false),
  515. new ('<', 0, false, false, false),
  516. new ('0', 0, false, false, false),
  517. new (';', 0, false, false, false),
  518. new ('2', 0, false, false, false),
  519. new (';', 0, false, false, false),
  520. new ('3', 0, false, false, false),
  521. new ('m', 0, false, false, false)
  522. };
  523. expectedCki = default (ConsoleKeyInfo);
  524. EscSeqUtils.DecodeEscSeq (
  525. _escSeqReqProc,
  526. ref _newConsoleKeyInfo,
  527. ref _key,
  528. _cki,
  529. ref _mod,
  530. out _c1Control,
  531. out _code,
  532. out _values,
  533. out _terminating,
  534. out _isKeyMouse,
  535. out _mouseFlags,
  536. out _pos,
  537. out _isReq,
  538. ProcessContinuousButtonPressed
  539. );
  540. Assert.Null (_escSeqReqProc);
  541. Assert.Equal (expectedCki, _newConsoleKeyInfo);
  542. Assert.Equal (0, (int)_key);
  543. Assert.Equal (0, (int)_mod);
  544. Assert.Equal ("CSI", _c1Control);
  545. Assert.Equal ("<", _code);
  546. Assert.Equal (3, _values.Length);
  547. Assert.Equal ("0", _values [0]);
  548. Assert.Equal ("2", _values [1]);
  549. Assert.Equal ("3", _values [^1]);
  550. Assert.Equal ("m", _terminating);
  551. Assert.True (_isKeyMouse);
  552. Assert.Equal (2, _mouseFlags.Count);
  553. Assert.Equal (
  554. new List<MouseFlags> { MouseFlags.Button1Released, MouseFlags.Button1Clicked },
  555. _mouseFlags
  556. );
  557. Assert.Equal (new Point (1, 2), _pos);
  558. Assert.False (_isReq);
  559. Assert.Equal (0, (int)_arg1);
  560. Assert.Equal (Point.Empty, _arg2);
  561. ClearAll ();
  562. _cki = new ConsoleKeyInfo []
  563. {
  564. new ('\u001b', 0, false, false, false),
  565. new ('[', 0, false, false, false),
  566. new ('<', 0, false, false, false),
  567. new ('0', 0, false, false, false),
  568. new (';', 0, false, false, false),
  569. new ('2', 0, false, false, false),
  570. new (';', 0, false, false, false),
  571. new ('3', 0, false, false, false),
  572. new ('M', 0, false, false, false)
  573. };
  574. expectedCki = default (ConsoleKeyInfo);
  575. EscSeqUtils.DecodeEscSeq (
  576. _escSeqReqProc,
  577. ref _newConsoleKeyInfo,
  578. ref _key,
  579. _cki,
  580. ref _mod,
  581. out _c1Control,
  582. out _code,
  583. out _values,
  584. out _terminating,
  585. out _isKeyMouse,
  586. out _mouseFlags,
  587. out _pos,
  588. out _isReq,
  589. ProcessContinuousButtonPressed
  590. );
  591. Assert.Null (_escSeqReqProc);
  592. Assert.Equal (expectedCki, _newConsoleKeyInfo);
  593. Assert.Equal (0, (int)_key);
  594. Assert.Equal (0, (int)_mod);
  595. Assert.Equal ("CSI", _c1Control);
  596. Assert.Equal ("<", _code);
  597. Assert.Equal (3, _values.Length);
  598. Assert.Equal ("0", _values [0]);
  599. Assert.Equal ("2", _values [1]);
  600. Assert.Equal ("3", _values [^1]);
  601. Assert.Equal ("M", _terminating);
  602. Assert.True (_isKeyMouse);
  603. Assert.Equal (new List<MouseFlags> { MouseFlags.Button1DoubleClicked }, _mouseFlags);
  604. Assert.Equal (new Point (1, 2), _pos);
  605. Assert.False (_isReq);
  606. ClearAll ();
  607. _cki = new ConsoleKeyInfo []
  608. {
  609. new ('\u001b', 0, false, false, false),
  610. new ('[', 0, false, false, false),
  611. new ('<', 0, false, false, false),
  612. new ('0', 0, false, false, false),
  613. new (';', 0, false, false, false),
  614. new ('2', 0, false, false, false),
  615. new (';', 0, false, false, false),
  616. new ('3', 0, false, false, false),
  617. new ('M', 0, false, false, false)
  618. };
  619. expectedCki = default (ConsoleKeyInfo);
  620. EscSeqUtils.DecodeEscSeq (
  621. _escSeqReqProc,
  622. ref _newConsoleKeyInfo,
  623. ref _key,
  624. _cki,
  625. ref _mod,
  626. out _c1Control,
  627. out _code,
  628. out _values,
  629. out _terminating,
  630. out _isKeyMouse,
  631. out _mouseFlags,
  632. out _pos,
  633. out _isReq,
  634. ProcessContinuousButtonPressed
  635. );
  636. Assert.Null (_escSeqReqProc);
  637. Assert.Equal (expectedCki, _newConsoleKeyInfo);
  638. Assert.Equal (0, (int)_key);
  639. Assert.Equal (0, (int)_mod);
  640. Assert.Equal ("CSI", _c1Control);
  641. Assert.Equal ("<", _code);
  642. Assert.Equal (3, _values.Length);
  643. Assert.Equal ("0", _values [0]);
  644. Assert.Equal ("2", _values [1]);
  645. Assert.Equal ("3", _values [^1]);
  646. Assert.Equal ("M", _terminating);
  647. Assert.True (_isKeyMouse);
  648. Assert.Equal (new List<MouseFlags> { MouseFlags.Button1TripleClicked }, _mouseFlags);
  649. Assert.Equal (new Point (1, 2), _pos);
  650. Assert.False (_isReq);
  651. var view = new View { Width = Dim.Fill (), Height = Dim.Fill (), WantContinuousButtonPressed = true };
  652. var top = new Toplevel ();
  653. top.Add (view);
  654. Application.Begin (top);
  655. Application.OnMouseEvent (
  656. new MouseEventEventArgs (
  657. new MouseEvent { X = 0, Y = 0, Flags = 0 }
  658. )
  659. );
  660. ClearAll ();
  661. _cki = new ConsoleKeyInfo []
  662. {
  663. new ('\u001b', 0, false, false, false),
  664. new ('[', 0, false, false, false),
  665. new ('<', 0, false, false, false),
  666. new ('0', 0, false, false, false),
  667. new (';', 0, false, false, false),
  668. new ('2', 0, false, false, false),
  669. new (';', 0, false, false, false),
  670. new ('3', 0, false, false, false),
  671. new ('M', 0, false, false, false)
  672. };
  673. expectedCki = default (ConsoleKeyInfo);
  674. EscSeqUtils.DecodeEscSeq (
  675. _escSeqReqProc,
  676. ref _newConsoleKeyInfo,
  677. ref _key,
  678. _cki,
  679. ref _mod,
  680. out _c1Control,
  681. out _code,
  682. out _values,
  683. out _terminating,
  684. out _isKeyMouse,
  685. out _mouseFlags,
  686. out _pos,
  687. out _isReq,
  688. ProcessContinuousButtonPressed
  689. );
  690. Assert.Null (_escSeqReqProc);
  691. Assert.Equal (expectedCki, _newConsoleKeyInfo);
  692. Assert.Equal (0, (int)_key);
  693. Assert.Equal (0, (int)_mod);
  694. Assert.Equal ("CSI", _c1Control);
  695. Assert.Equal ("<", _code);
  696. Assert.Equal (3, _values.Length);
  697. Assert.Equal ("0", _values [0]);
  698. Assert.Equal ("2", _values [1]);
  699. Assert.Equal ("3", _values [^1]);
  700. Assert.Equal ("M", _terminating);
  701. Assert.True (_isKeyMouse);
  702. Assert.Equal (new List<MouseFlags> { MouseFlags.Button1Pressed }, _mouseFlags);
  703. Assert.Equal (new Point (1, 2), _pos);
  704. Assert.False (_isReq);
  705. Application.Iteration += (s, a) =>
  706. {
  707. if (_actionStarted)
  708. {
  709. // set Application.WantContinuousButtonPressedView to null
  710. view.WantContinuousButtonPressed = false;
  711. Application.OnMouseEvent (
  712. new MouseEventEventArgs (
  713. new MouseEvent { X = 0, Y = 0, Flags = 0 }
  714. )
  715. );
  716. Application.RequestStop ();
  717. }
  718. };
  719. Application.Run (top);
  720. Assert.Null (Application.WantContinuousButtonPressedView);
  721. Assert.Equal (MouseFlags.Button1Pressed, _arg1);
  722. Assert.Equal (new Point (1, 2), _arg2);
  723. ClearAll ();
  724. _cki = new ConsoleKeyInfo []
  725. {
  726. new ('\u001b', 0, false, false, false),
  727. new ('[', 0, false, false, false),
  728. new ('<', 0, false, false, false),
  729. new ('0', 0, false, false, false),
  730. new (';', 0, false, false, false),
  731. new ('2', 0, false, false, false),
  732. new (';', 0, false, false, false),
  733. new ('3', 0, false, false, false),
  734. new ('m', 0, false, false, false)
  735. };
  736. expectedCki = default (ConsoleKeyInfo);
  737. EscSeqUtils.DecodeEscSeq (
  738. _escSeqReqProc,
  739. ref _newConsoleKeyInfo,
  740. ref _key,
  741. _cki,
  742. ref _mod,
  743. out _c1Control,
  744. out _code,
  745. out _values,
  746. out _terminating,
  747. out _isKeyMouse,
  748. out _mouseFlags,
  749. out _pos,
  750. out _isReq,
  751. ProcessContinuousButtonPressed
  752. );
  753. Assert.Null (_escSeqReqProc);
  754. Assert.Equal (expectedCki, _newConsoleKeyInfo);
  755. Assert.Equal (0, (int)_key);
  756. Assert.Equal (0, (int)_mod);
  757. Assert.Equal ("CSI", _c1Control);
  758. Assert.Equal ("<", _code);
  759. Assert.Equal (3, _values.Length);
  760. Assert.Equal ("0", _values [0]);
  761. Assert.Equal ("2", _values [1]);
  762. Assert.Equal ("3", _values [^1]);
  763. Assert.Equal ("m", _terminating);
  764. Assert.True (_isKeyMouse);
  765. Assert.Equal (new List<MouseFlags> { MouseFlags.Button1Released }, _mouseFlags);
  766. Assert.Equal (new Point (1, 2), _pos);
  767. Assert.False (_isReq);
  768. Assert.Equal (0, (int)_arg1);
  769. Assert.Equal (Point.Empty, _arg2);
  770. ClearAll ();
  771. Assert.Null (_escSeqReqProc);
  772. _escSeqReqProc = new EscSeqRequests ();
  773. _escSeqReqProc.Add ("t");
  774. _cki = new ConsoleKeyInfo []
  775. {
  776. new ('\u001b', 0, false, false, false),
  777. new ('[', 0, false, false, false),
  778. new ('8', 0, false, false, false),
  779. new (';', 0, false, false, false),
  780. new ('1', 0, false, false, false),
  781. new ('0', 0, false, false, false),
  782. new (';', 0, false, false, false),
  783. new ('2', 0, false, false, false),
  784. new ('0', 0, false, false, false),
  785. new ('t', 0, false, false, false)
  786. };
  787. expectedCki = default (ConsoleKeyInfo);
  788. Assert.Single (_escSeqReqProc.Statuses);
  789. Assert.Equal ("t", _escSeqReqProc.Statuses [^1].Terminator);
  790. EscSeqUtils.DecodeEscSeq (
  791. _escSeqReqProc,
  792. ref _newConsoleKeyInfo,
  793. ref _key,
  794. _cki,
  795. ref _mod,
  796. out _c1Control,
  797. out _code,
  798. out _values,
  799. out _terminating,
  800. out _isKeyMouse,
  801. out _mouseFlags,
  802. out _pos,
  803. out _isReq,
  804. ProcessContinuousButtonPressed
  805. );
  806. Assert.Empty (_escSeqReqProc.Statuses);
  807. Assert.Equal (expectedCki, _newConsoleKeyInfo);
  808. Assert.Equal (0, (int)_key);
  809. Assert.Equal (0, (int)_mod);
  810. Assert.Equal ("CSI", _c1Control);
  811. Assert.Null (_code);
  812. Assert.Equal (3, _values.Length);
  813. Assert.Equal ("8", _values [0]);
  814. Assert.Equal ("10", _values [1]);
  815. Assert.Equal ("20", _values [^1]);
  816. Assert.Equal ("t", _terminating);
  817. Assert.False (_isKeyMouse);
  818. Assert.Equal (new List<MouseFlags> { 0 }, _mouseFlags);
  819. Assert.Equal (Point.Empty, _pos);
  820. Assert.True (_isReq);
  821. Assert.Equal (0, (int)_arg1);
  822. Assert.Equal (Point.Empty, _arg2);
  823. }
  824. [Fact]
  825. public void Defaults_Values ()
  826. {
  827. Assert.Equal ('\x1b', EscSeqUtils.KeyEsc);
  828. Assert.Equal ("\x1b[", EscSeqUtils.CSI);
  829. Assert.Equal ("\x1b[?1003h", EscSeqUtils.CSI_EnableAnyEventMouse);
  830. Assert.Equal ("\x1b[?1006h", EscSeqUtils.CSI_EnableSgrExtModeMouse);
  831. Assert.Equal ("\x1b[?1015h", EscSeqUtils.CSI_EnableUrxvtExtModeMouse);
  832. Assert.Equal ("\x1b[?1003l", EscSeqUtils.CSI_DisableAnyEventMouse);
  833. Assert.Equal ("\x1b[?1006l", EscSeqUtils.CSI_DisableSgrExtModeMouse);
  834. Assert.Equal ("\x1b[?1015l", EscSeqUtils.CSI_DisableUrxvtExtModeMouse);
  835. Assert.Equal ("\x1b[?1003h\x1b[?1015h\u001b[?1006h", EscSeqUtils.CSI_EnableMouseEvents);
  836. Assert.Equal ("\x1b[?1003l\x1b[?1015l\u001b[?1006l", EscSeqUtils.CSI_DisableMouseEvents);
  837. }
  838. [Fact]
  839. public void GetC1ControlChar_Tests ()
  840. {
  841. Assert.Equal ("IND", EscSeqUtils.GetC1ControlChar ('D'));
  842. Assert.Equal ("NEL", EscSeqUtils.GetC1ControlChar ('E'));
  843. Assert.Equal ("HTS", EscSeqUtils.GetC1ControlChar ('H'));
  844. Assert.Equal ("RI", EscSeqUtils.GetC1ControlChar ('M'));
  845. Assert.Equal ("SS2", EscSeqUtils.GetC1ControlChar ('N'));
  846. Assert.Equal ("SS3", EscSeqUtils.GetC1ControlChar ('O'));
  847. Assert.Equal ("DCS", EscSeqUtils.GetC1ControlChar ('P'));
  848. Assert.Equal ("SPA", EscSeqUtils.GetC1ControlChar ('V'));
  849. Assert.Equal ("EPA", EscSeqUtils.GetC1ControlChar ('W'));
  850. Assert.Equal ("SOS", EscSeqUtils.GetC1ControlChar ('X'));
  851. Assert.Equal ("DECID", EscSeqUtils.GetC1ControlChar ('Z'));
  852. Assert.Equal ("CSI", EscSeqUtils.GetC1ControlChar ('['));
  853. Assert.Equal ("ST", EscSeqUtils.GetC1ControlChar ('\\'));
  854. Assert.Equal ("OSC", EscSeqUtils.GetC1ControlChar (']'));
  855. Assert.Equal ("PM", EscSeqUtils.GetC1ControlChar ('^'));
  856. Assert.Equal ("APC", EscSeqUtils.GetC1ControlChar ('_'));
  857. Assert.Equal ("", EscSeqUtils.GetC1ControlChar ('\0'));
  858. }
  859. [Fact]
  860. public void GetConsoleInputKey_ConsoleKeyInfo ()
  861. {
  862. var cki = new ConsoleKeyInfo ('r', 0, false, false, false);
  863. var expectedCki = new ConsoleKeyInfo ('r', 0, false, false, false);
  864. Assert.Equal (expectedCki, EscSeqUtils.MapConsoleKeyInfo (cki));
  865. cki = new ConsoleKeyInfo ('r', 0, true, false, false);
  866. expectedCki = new ConsoleKeyInfo ('r', 0, true, false, false);
  867. Assert.Equal (expectedCki, EscSeqUtils.MapConsoleKeyInfo (cki));
  868. cki = new ConsoleKeyInfo ('r', 0, false, true, false);
  869. expectedCki = new ConsoleKeyInfo ('r', 0, false, true, false);
  870. Assert.Equal (expectedCki, EscSeqUtils.MapConsoleKeyInfo (cki));
  871. cki = new ConsoleKeyInfo ('r', 0, false, false, true);
  872. expectedCki = new ConsoleKeyInfo ('r', 0, false, false, true);
  873. Assert.Equal (expectedCki, EscSeqUtils.MapConsoleKeyInfo (cki));
  874. cki = new ConsoleKeyInfo ('r', 0, true, true, false);
  875. expectedCki = new ConsoleKeyInfo ('r', 0, true, true, false);
  876. Assert.Equal (expectedCki, EscSeqUtils.MapConsoleKeyInfo (cki));
  877. cki = new ConsoleKeyInfo ('r', 0, false, true, true);
  878. expectedCki = new ConsoleKeyInfo ('r', 0, false, true, true);
  879. Assert.Equal (expectedCki, EscSeqUtils.MapConsoleKeyInfo (cki));
  880. cki = new ConsoleKeyInfo ('r', 0, true, true, true);
  881. expectedCki = new ConsoleKeyInfo ('r', 0, true, true, true);
  882. Assert.Equal (expectedCki, EscSeqUtils.MapConsoleKeyInfo (cki));
  883. cki = new ConsoleKeyInfo ('\u0012', 0, false, false, false);
  884. expectedCki = new ConsoleKeyInfo ('R', ConsoleKey.R, false, false, true);
  885. Assert.Equal (expectedCki, EscSeqUtils.MapConsoleKeyInfo (cki));
  886. cki = new ConsoleKeyInfo ('\0', (ConsoleKey)64, false, false, true);
  887. expectedCki = new ConsoleKeyInfo (' ', ConsoleKey.Spacebar, false, false, true);
  888. Assert.Equal (expectedCki, EscSeqUtils.MapConsoleKeyInfo (cki));
  889. cki = new ConsoleKeyInfo ('\r', 0, false, false, false);
  890. expectedCki = new ConsoleKeyInfo ('\r', ConsoleKey.Enter, false, false, false);
  891. Assert.Equal (expectedCki, EscSeqUtils.MapConsoleKeyInfo (cki));
  892. cki = new ConsoleKeyInfo ('\u007f', 0, false, false, false);
  893. expectedCki = new ConsoleKeyInfo ('\u007f', ConsoleKey.Backspace, false, false, false);
  894. Assert.Equal (expectedCki, EscSeqUtils.MapConsoleKeyInfo (cki));
  895. cki = new ConsoleKeyInfo ('R', 0, false, false, false);
  896. expectedCki = new ConsoleKeyInfo ('R', 0, false, false, false);
  897. Assert.Equal (expectedCki, EscSeqUtils.MapConsoleKeyInfo (cki));
  898. }
  899. [Fact]
  900. public void GetConsoleKey_Tests ()
  901. {
  902. ConsoleModifiers mod = 0;
  903. Assert.Equal (ConsoleKey.UpArrow, EscSeqUtils.GetConsoleKey ('A', "", ref mod));
  904. Assert.Equal (ConsoleKey.DownArrow, EscSeqUtils.GetConsoleKey ('B', "", ref mod));
  905. Assert.Equal (_key = ConsoleKey.RightArrow, EscSeqUtils.GetConsoleKey ('C', "", ref mod));
  906. Assert.Equal (ConsoleKey.LeftArrow, EscSeqUtils.GetConsoleKey ('D', "", ref mod));
  907. Assert.Equal (ConsoleKey.End, EscSeqUtils.GetConsoleKey ('F', "", ref mod));
  908. Assert.Equal (ConsoleKey.Home, EscSeqUtils.GetConsoleKey ('H', "", ref mod));
  909. Assert.Equal (ConsoleKey.F1, EscSeqUtils.GetConsoleKey ('P', "", ref mod));
  910. Assert.Equal (ConsoleKey.F2, EscSeqUtils.GetConsoleKey ('Q', "", ref mod));
  911. Assert.Equal (ConsoleKey.F3, EscSeqUtils.GetConsoleKey ('R', "", ref mod));
  912. Assert.Equal (ConsoleKey.F4, EscSeqUtils.GetConsoleKey ('S', "", ref mod));
  913. Assert.Equal (ConsoleKey.Tab, EscSeqUtils.GetConsoleKey ('Z', "", ref mod));
  914. Assert.Equal (ConsoleModifiers.Shift, mod);
  915. Assert.Equal (0, (int)EscSeqUtils.GetConsoleKey ('\0', "", ref mod));
  916. Assert.Equal (ConsoleKey.Insert, EscSeqUtils.GetConsoleKey ('~', "2", ref mod));
  917. Assert.Equal (ConsoleKey.Delete, EscSeqUtils.GetConsoleKey ('~', "3", ref mod));
  918. Assert.Equal (ConsoleKey.PageUp, EscSeqUtils.GetConsoleKey ('~', "5", ref mod));
  919. Assert.Equal (ConsoleKey.PageDown, EscSeqUtils.GetConsoleKey ('~', "6", ref mod));
  920. Assert.Equal (ConsoleKey.F5, EscSeqUtils.GetConsoleKey ('~', "15", ref mod));
  921. Assert.Equal (ConsoleKey.F6, EscSeqUtils.GetConsoleKey ('~', "17", ref mod));
  922. Assert.Equal (ConsoleKey.F7, EscSeqUtils.GetConsoleKey ('~', "18", ref mod));
  923. Assert.Equal (ConsoleKey.F8, EscSeqUtils.GetConsoleKey ('~', "19", ref mod));
  924. Assert.Equal (ConsoleKey.F9, EscSeqUtils.GetConsoleKey ('~', "20", ref mod));
  925. Assert.Equal (ConsoleKey.F10, EscSeqUtils.GetConsoleKey ('~', "21", ref mod));
  926. Assert.Equal (ConsoleKey.F11, EscSeqUtils.GetConsoleKey ('~', "23", ref mod));
  927. Assert.Equal (ConsoleKey.F12, EscSeqUtils.GetConsoleKey ('~', "24", ref mod));
  928. Assert.Equal (0, (int)EscSeqUtils.GetConsoleKey ('~', "", ref mod));
  929. }
  930. [Fact]
  931. public void GetConsoleModifiers_Tests ()
  932. {
  933. Assert.Equal (ConsoleModifiers.Shift, EscSeqUtils.GetConsoleModifiers ("2"));
  934. Assert.Equal (ConsoleModifiers.Alt, EscSeqUtils.GetConsoleModifiers ("3"));
  935. Assert.Equal (ConsoleModifiers.Shift | ConsoleModifiers.Alt, EscSeqUtils.GetConsoleModifiers ("4"));
  936. Assert.Equal (ConsoleModifiers.Control, EscSeqUtils.GetConsoleModifiers ("5"));
  937. Assert.Equal (ConsoleModifiers.Shift | ConsoleModifiers.Control, EscSeqUtils.GetConsoleModifiers ("6"));
  938. Assert.Equal (ConsoleModifiers.Alt | ConsoleModifiers.Control, EscSeqUtils.GetConsoleModifiers ("7"));
  939. Assert.Equal (
  940. ConsoleModifiers.Shift | ConsoleModifiers.Alt | ConsoleModifiers.Control,
  941. EscSeqUtils.GetConsoleModifiers ("8")
  942. );
  943. Assert.Equal (0, (int)EscSeqUtils.GetConsoleModifiers (""));
  944. }
  945. [Fact]
  946. public void GetEscapeResult_Tests ()
  947. {
  948. char [] kChars = { '\u001b', '[', '5', ';', '1', '0', 'r' };
  949. (_c1Control, _code, _values, _terminating) = EscSeqUtils.GetEscapeResult (kChars);
  950. Assert.Equal ("CSI", _c1Control);
  951. Assert.Null (_code);
  952. Assert.Equal (2, _values.Length);
  953. Assert.Equal ("5", _values [0]);
  954. Assert.Equal ("10", _values [^1]);
  955. Assert.Equal ("r", _terminating);
  956. }
  957. [Fact]
  958. public void GetKeyCharArray_Tests ()
  959. {
  960. ConsoleKeyInfo [] cki =
  961. {
  962. new ('\u001b', 0, false, false, false),
  963. new ('[', 0, false, false, false),
  964. new ('5', 0, false, false, false),
  965. new (';', 0, false, false, false),
  966. new ('1', 0, false, false, false),
  967. new ('0', 0, false, false, false),
  968. new ('r', 0, false, false, false)
  969. };
  970. Assert.Equal (new [] { '\u001b', '[', '5', ';', '1', '0', 'r' }, EscSeqUtils.GetKeyCharArray (cki));
  971. }
  972. [Fact]
  973. [AutoInitShutdown]
  974. public void GetMouse_Tests ()
  975. {
  976. ConsoleKeyInfo [] cki =
  977. {
  978. new ('\u001b', 0, false, false, false),
  979. new ('[', 0, false, false, false),
  980. new ('<', 0, false, false, false),
  981. new ('0', 0, false, false, false),
  982. new (';', 0, false, false, false),
  983. new ('2', 0, false, false, false),
  984. new (';', 0, false, false, false),
  985. new ('3', 0, false, false, false),
  986. new ('M', 0, false, false, false)
  987. };
  988. EscSeqUtils.GetMouse (cki, out List<MouseFlags> mouseFlags, out Point pos, ProcessContinuousButtonPressed);
  989. Assert.Equal (new List<MouseFlags> { MouseFlags.Button1Pressed }, mouseFlags);
  990. Assert.Equal (new Point (1, 2), pos);
  991. cki = new ConsoleKeyInfo []
  992. {
  993. new ('\u001b', 0, false, false, false),
  994. new ('[', 0, false, false, false),
  995. new ('<', 0, false, false, false),
  996. new ('0', 0, false, false, false),
  997. new (';', 0, false, false, false),
  998. new ('2', 0, false, false, false),
  999. new (';', 0, false, false, false),
  1000. new ('3', 0, false, false, false),
  1001. new ('m', 0, false, false, false)
  1002. };
  1003. EscSeqUtils.GetMouse (cki, out mouseFlags, out pos, ProcessContinuousButtonPressed);
  1004. Assert.Equal (2, mouseFlags.Count);
  1005. Assert.Equal (
  1006. new List<MouseFlags> { MouseFlags.Button1Released, MouseFlags.Button1Clicked },
  1007. mouseFlags
  1008. );
  1009. Assert.Equal (new Point (1, 2), pos);
  1010. cki = new ConsoleKeyInfo []
  1011. {
  1012. new ('\u001b', 0, false, false, false),
  1013. new ('[', 0, false, false, false),
  1014. new ('<', 0, false, false, false),
  1015. new ('0', 0, false, false, false),
  1016. new (';', 0, false, false, false),
  1017. new ('2', 0, false, false, false),
  1018. new (';', 0, false, false, false),
  1019. new ('3', 0, false, false, false),
  1020. new ('M', 0, false, false, false)
  1021. };
  1022. EscSeqUtils.GetMouse (cki, out mouseFlags, out pos, ProcessContinuousButtonPressed);
  1023. Assert.Equal (new List<MouseFlags> { MouseFlags.Button1DoubleClicked }, mouseFlags);
  1024. Assert.Equal (new Point (1, 2), pos);
  1025. cki = new ConsoleKeyInfo []
  1026. {
  1027. new ('\u001b', 0, false, false, false),
  1028. new ('[', 0, false, false, false),
  1029. new ('<', 0, false, false, false),
  1030. new ('0', 0, false, false, false),
  1031. new (';', 0, false, false, false),
  1032. new ('2', 0, false, false, false),
  1033. new (';', 0, false, false, false),
  1034. new ('3', 0, false, false, false),
  1035. new ('M', 0, false, false, false)
  1036. };
  1037. EscSeqUtils.GetMouse (cki, out mouseFlags, out pos, ProcessContinuousButtonPressed);
  1038. Assert.Equal (new List<MouseFlags> { MouseFlags.Button1TripleClicked }, mouseFlags);
  1039. Assert.Equal (new Point (1, 2), pos);
  1040. cki = new ConsoleKeyInfo []
  1041. {
  1042. new ('\u001b', 0, false, false, false),
  1043. new ('[', 0, false, false, false),
  1044. new ('<', 0, false, false, false),
  1045. new ('0', 0, false, false, false),
  1046. new (';', 0, false, false, false),
  1047. new ('2', 0, false, false, false),
  1048. new (';', 0, false, false, false),
  1049. new ('3', 0, false, false, false),
  1050. new ('m', 0, false, false, false)
  1051. };
  1052. EscSeqUtils.GetMouse (cki, out mouseFlags, out pos, ProcessContinuousButtonPressed);
  1053. Assert.Equal (new List<MouseFlags> { MouseFlags.Button1Released }, mouseFlags);
  1054. Assert.Equal (new Point (1, 2), pos);
  1055. }
  1056. [Fact]
  1057. public void ResizeArray_ConsoleKeyInfo ()
  1058. {
  1059. ConsoleKeyInfo [] expectedCkInfos = null;
  1060. var cki = new ConsoleKeyInfo ('\u001b', ConsoleKey.Escape, false, false, false);
  1061. expectedCkInfos = EscSeqUtils.ResizeArray (cki, expectedCkInfos);
  1062. Assert.Single (expectedCkInfos);
  1063. Assert.Equal (cki, expectedCkInfos [0]);
  1064. }
  1065. private void ClearAll ()
  1066. {
  1067. _escSeqReqProc = default (EscSeqRequests);
  1068. _newConsoleKeyInfo = default (ConsoleKeyInfo);
  1069. _key = default (ConsoleKey);
  1070. _cki = default (ConsoleKeyInfo []);
  1071. _mod = default (ConsoleModifiers);
  1072. _c1Control = default (string);
  1073. _code = default (string);
  1074. _terminating = default (string);
  1075. _values = default (string []);
  1076. _isKeyMouse = default (bool);
  1077. _isReq = default (bool);
  1078. _mouseFlags = default (List<MouseFlags>);
  1079. _pos = default (Point);
  1080. _arg1 = default (MouseFlags);
  1081. _arg2 = default (Point);
  1082. }
  1083. private void ProcessContinuousButtonPressed (MouseFlags arg1, Point arg2)
  1084. {
  1085. _arg1 = arg1;
  1086. _arg2 = arg2;
  1087. _actionStarted = true;
  1088. }
  1089. }