EscSeqUtilsTests.cs 49 KB

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