EscSeqUtilsTests.cs 50 KB

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