2
0

TextValidateFieldTests.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657
  1. using System.Text.RegularExpressions;
  2. using Terminal.Gui.TextValidateProviders;
  3. namespace Terminal.Gui.ViewsTests;
  4. public class TextValidateField_NET_Provider_Tests
  5. {
  6. [Fact]
  7. public void Backspace_Key_Deletes_Previous_Character ()
  8. {
  9. var field = new TextValidateField
  10. {
  11. TextAlignment = Alignment.Center,
  12. Width = 20,
  13. // ****
  14. // 0123456789
  15. Provider = new NetMaskedTextProvider ("--(0000)--") { Text = "1234" }
  16. };
  17. // Go to the end.
  18. field.NewKeyDownEvent (Key.End);
  19. field.NewKeyDownEvent (Key.Backspace);
  20. Assert.Equal ("--(12_4)--", field.Provider.DisplayText);
  21. Assert.False (field.IsValid);
  22. field.NewKeyDownEvent (Key.Backspace);
  23. Assert.Equal ("--(1__4)--", field.Provider.DisplayText);
  24. Assert.False (field.IsValid);
  25. field.NewKeyDownEvent (Key.Backspace);
  26. Assert.Equal ("--(___4)--", field.Provider.DisplayText);
  27. Assert.False (field.IsValid);
  28. // One more
  29. field.NewKeyDownEvent (Key.Backspace);
  30. Assert.Equal ("--(___4)--", field.Provider.DisplayText);
  31. Assert.False (field.IsValid);
  32. }
  33. [Fact]
  34. public void Changing_The_Mask_Tries_To_Keep_The_Previous_Text ()
  35. {
  36. var field = new TextValidateField
  37. {
  38. TextAlignment = Alignment.Start,
  39. Width = 30,
  40. // ****
  41. // 0123456789
  42. Provider = new NetMaskedTextProvider ("--(0000)--")
  43. };
  44. field.Text = "1234";
  45. Assert.Equal ("--(1234)--", field.Text);
  46. Assert.True (field.IsValid);
  47. var provider = field.Provider as NetMaskedTextProvider;
  48. provider.Mask = "--------(00000000)--------";
  49. Assert.Equal ("--------(1234____)--------", field.Provider.DisplayText);
  50. Assert.False (field.IsValid);
  51. }
  52. [Fact]
  53. public void Default_Width_Is_Always_Equal_To_The_Provider_DisplayText_Length ()
  54. {
  55. // 9-Digit or space, optional. 0-Digit, required. L-Letter, required.
  56. // > Shift up. Converts all characters that follow to uppercase.
  57. // | Disable a previous shift up or shift down.
  58. // A-Alphanumeric, required. a-Alphanumeric, optional.
  59. var field = new TextValidateField { Provider = new NetMaskedTextProvider ("999 000 LLL >LLL |AAA aaa") };
  60. Assert.Equal (field.Viewport.Width, field.Provider.DisplayText.Length);
  61. Assert.NotEqual (field.Provider.DisplayText.Length, field.Provider.Text.Length);
  62. Assert.Equal (new string (' ', field.Text.Length), field.Provider.Text);
  63. }
  64. [Fact]
  65. public void Delete_Key_Doesnt_Move_Cursor ()
  66. {
  67. var field = new TextValidateField
  68. {
  69. TextAlignment = Alignment.Center,
  70. Width = 20,
  71. // ****
  72. // 0123456789
  73. Provider = new NetMaskedTextProvider ("--(0000)--") { Text = "1234" }
  74. };
  75. Assert.Equal ("--(1234)--", field.Provider.DisplayText);
  76. Assert.True (field.IsValid);
  77. field.NewKeyDownEvent (Key.Delete);
  78. field.NewKeyDownEvent (Key.Delete);
  79. field.NewKeyDownEvent (Key.Delete);
  80. Assert.Equal ("--(_234)--", field.Provider.DisplayText);
  81. Assert.False (field.IsValid);
  82. field.NewKeyDownEvent (Key.CursorRight);
  83. field.NewKeyDownEvent (Key.CursorRight);
  84. field.NewKeyDownEvent (Key.Delete);
  85. field.NewKeyDownEvent (Key.Delete);
  86. field.NewKeyDownEvent (Key.Delete);
  87. Assert.Equal ("--(_2_4)--", field.Provider.DisplayText);
  88. Assert.False (field.IsValid);
  89. }
  90. [Fact]
  91. public void End_Key_Last_Editable_Character ()
  92. {
  93. var field = new TextValidateField
  94. {
  95. TextAlignment = Alignment.Center,
  96. Width = 20,
  97. // *
  98. // 0123456789
  99. Provider = new NetMaskedTextProvider ("--(0000)--")
  100. };
  101. field.NewKeyDownEvent (Key.End);
  102. field.NewKeyDownEvent (Key.D1);
  103. Assert.Equal ("--(___1)--", field.Provider.DisplayText);
  104. Assert.Equal ("--( 1)--", field.Text);
  105. Assert.False (field.IsValid);
  106. }
  107. [Fact]
  108. public void Home_Key_First_Editable_Character ()
  109. {
  110. var field = new TextValidateField
  111. {
  112. TextAlignment = Alignment.Center,
  113. Width = 20,
  114. // *
  115. // 0123456789
  116. Provider = new NetMaskedTextProvider ("--(0000)--")
  117. };
  118. field.NewKeyDownEvent (Key.CursorRight);
  119. field.NewKeyDownEvent (Key.CursorRight);
  120. field.NewKeyDownEvent (Key.Home);
  121. field.NewKeyDownEvent (Key.D1);
  122. Assert.Equal ("--(1___)--", field.Provider.DisplayText);
  123. Assert.Equal ("--(1 )--", field.Text);
  124. Assert.False (field.IsValid);
  125. }
  126. [Fact]
  127. public void Initial_Value_Bigger_Than_Mask_Discarded ()
  128. {
  129. var field = new TextValidateField
  130. {
  131. TextAlignment = Alignment.Center,
  132. Width = 20,
  133. // ****
  134. // 0123456789
  135. Provider = new NetMaskedTextProvider ("--(0000)--") { Text = "12345" }
  136. };
  137. Assert.Equal ("--(____)--", field.Provider.DisplayText);
  138. Assert.Equal ("--( )--", field.Text);
  139. Assert.False (field.IsValid);
  140. }
  141. [Fact]
  142. public void Initial_Value_Exact_Valid ()
  143. {
  144. var field = new TextValidateField
  145. {
  146. TextAlignment = Alignment.Center,
  147. Width = 20,
  148. // ****
  149. // 0123456789
  150. Provider = new NetMaskedTextProvider ("--(0000)--") { Text = "1234" }
  151. };
  152. Assert.Equal ("--(1234)--", field.Text);
  153. Assert.True (field.IsValid);
  154. }
  155. [Fact]
  156. public void Initial_Value_Smaller_Than_Mask_Accepted ()
  157. {
  158. var field = new TextValidateField
  159. {
  160. TextAlignment = Alignment.Center,
  161. Width = 20,
  162. // ****
  163. // 0123456789
  164. Provider = new NetMaskedTextProvider ("--(0000)--") { Text = "123" }
  165. };
  166. Assert.Equal ("--(123_)--", field.Provider.DisplayText);
  167. Assert.Equal ("--(123 )--", field.Text);
  168. Assert.False (field.IsValid);
  169. }
  170. [Fact]
  171. public void Initialized_With_Cursor_On_First_Editable_Character ()
  172. {
  173. var field = new TextValidateField
  174. {
  175. TextAlignment = Alignment.Center,
  176. Width = 20,
  177. // *
  178. // 0123456789
  179. Provider = new NetMaskedTextProvider ("--(0000)--")
  180. };
  181. field.NewKeyDownEvent (Key.D1);
  182. Assert.Equal ("--(1___)--", field.Provider.DisplayText);
  183. Assert.Equal ("--(1 )--", field.Text);
  184. }
  185. [Fact]
  186. public void Input_Ilegal_Character ()
  187. {
  188. var field = new TextValidateField
  189. {
  190. TextAlignment = Alignment.Center,
  191. Width = 20,
  192. // *
  193. // 0123456789
  194. Provider = new NetMaskedTextProvider ("--(0000)--")
  195. };
  196. field.NewKeyDownEvent (Key.A);
  197. Assert.Equal ("--( )--", field.Text);
  198. Assert.Equal ("--(____)--", field.Provider.DisplayText);
  199. Assert.False (field.IsValid);
  200. }
  201. [Fact]
  202. public void Insert_Skips_Non_Editable_Characters ()
  203. {
  204. var field = new TextValidateField
  205. {
  206. TextAlignment = Alignment.Center,
  207. Width = 20,
  208. // ** **
  209. // 01234567890
  210. Provider = new NetMaskedTextProvider ("--(00-00)--")
  211. };
  212. field.NewKeyDownEvent (Key.D1);
  213. Assert.Equal ("--(1_-__)--", field.Provider.DisplayText);
  214. Assert.False (field.IsValid);
  215. field.NewKeyDownEvent (Key.D2);
  216. Assert.Equal ("--(12-__)--", field.Provider.DisplayText);
  217. Assert.False (field.IsValid);
  218. field.NewKeyDownEvent (Key.D3);
  219. Assert.Equal ("--(12-3_)--", field.Provider.DisplayText);
  220. Assert.False (field.IsValid);
  221. field.NewKeyDownEvent (Key.D4);
  222. Assert.Equal ("--(12-34)--", field.Provider.DisplayText);
  223. Assert.True (field.IsValid);
  224. }
  225. [Fact]
  226. public void Left_Key_Stops_In_First_Editable_Character ()
  227. {
  228. var field = new TextValidateField
  229. {
  230. TextAlignment = Alignment.Center,
  231. Width = 20,
  232. // *
  233. // 0123456789
  234. Provider = new NetMaskedTextProvider ("--(0000)--")
  235. };
  236. for (var i = 0; i < 10; i++)
  237. {
  238. field.NewKeyDownEvent (Key.CursorLeft);
  239. }
  240. field.NewKeyDownEvent (Key.D1);
  241. Assert.Equal ("--(1___)--", field.Provider.DisplayText);
  242. Assert.Equal ("--(1 )--", field.Text);
  243. Assert.False (field.IsValid);
  244. }
  245. [Fact]
  246. public void MouseClick_Right_X_Greater_Than_Text_Width_Goes_To_Last_Editable_Position ()
  247. {
  248. var field = new TextValidateField
  249. {
  250. TextAlignment = Alignment.Start,
  251. Width = 30,
  252. // ****
  253. // 0123456789
  254. Provider = new NetMaskedTextProvider ("--(0000)--")
  255. };
  256. field.NewKeyDownEvent (Key.D1);
  257. Assert.Equal ("--(1___)--", field.Provider.DisplayText);
  258. Assert.False (field.IsValid);
  259. Assert.Equal ("--(1 )--", field.Provider.Text);
  260. field.NewMouseEvent (new MouseEvent { Position = new (25, 0), Flags = MouseFlags.Button1Pressed });
  261. field.NewKeyDownEvent (Key.D1);
  262. Assert.Equal ("--(1__1)--", field.Provider.DisplayText);
  263. Assert.False (field.IsValid);
  264. Assert.Equal ("--(1 1)--", field.Provider.Text);
  265. }
  266. [Fact]
  267. public void OnTextChanged_TextChanged_Event ()
  268. {
  269. var wasTextChanged = false;
  270. var field = new TextValidateField
  271. {
  272. TextAlignment = Alignment.Start, Width = 30, Provider = new NetMaskedTextProvider ("--(0000)--")
  273. };
  274. field.Provider.TextChanged += (sender, e) => wasTextChanged = true;
  275. field.NewKeyDownEvent (Key.D1);
  276. Assert.Equal ("--(1___)--", field.Provider.DisplayText);
  277. Assert.False (field.IsValid);
  278. Assert.Equal ("--(1 )--", field.Provider.Text);
  279. Assert.True (wasTextChanged);
  280. }
  281. [Fact]
  282. public void Right_Key_Stops_In_Last_Editable_Character ()
  283. {
  284. var field = new TextValidateField
  285. {
  286. TextAlignment = Alignment.Center,
  287. Width = 20,
  288. // *
  289. // 0123456789
  290. Provider = new NetMaskedTextProvider ("--(0000)--")
  291. };
  292. for (var i = 0; i < 10; i++)
  293. {
  294. field.NewKeyDownEvent (Key.CursorRight);
  295. }
  296. field.NewKeyDownEvent (Key.D1);
  297. Assert.Equal ("--(___1)--", field.Provider.DisplayText);
  298. Assert.Equal ("--( 1)--", field.Text);
  299. Assert.False (field.IsValid);
  300. }
  301. [Fact]
  302. public void Set_Text_After_Initialization ()
  303. {
  304. var field = new TextValidateField
  305. {
  306. TextAlignment = Alignment.Start,
  307. Width = 30,
  308. // ****
  309. // 0123456789
  310. Provider = new NetMaskedTextProvider ("--(0000)--")
  311. };
  312. field.Text = "1234";
  313. Assert.Equal ("--(1234)--", field.Text);
  314. Assert.True (field.IsValid);
  315. }
  316. [Fact]
  317. public void When_Valid_Is_Valid_True ()
  318. {
  319. var field = new TextValidateField
  320. {
  321. TextAlignment = Alignment.Center,
  322. Width = 20,
  323. // ****
  324. // 0123456789
  325. Provider = new NetMaskedTextProvider ("--(0000)--")
  326. };
  327. field.NewKeyDownEvent (Key.D1);
  328. Assert.Equal ("--(1 )--", field.Text);
  329. Assert.False (field.IsValid);
  330. field.NewKeyDownEvent (Key.D2);
  331. Assert.Equal ("--(12 )--", field.Text);
  332. Assert.False (field.IsValid);
  333. field.NewKeyDownEvent (Key.D3);
  334. Assert.Equal ("--(123 )--", field.Text);
  335. Assert.False (field.IsValid);
  336. field.NewKeyDownEvent (Key.D4);
  337. Assert.Equal ("--(1234)--", field.Text);
  338. Assert.True (field.IsValid);
  339. }
  340. }
  341. public class TextValidateField_Regex_Provider_Tests
  342. {
  343. [Fact]
  344. public void End_Key_End_Of_Input ()
  345. {
  346. // Exactly 5 numbers
  347. var field = new TextValidateField
  348. {
  349. Width = 20, Provider = new TextRegexProvider ("^[0-9]{5}$") { ValidateOnInput = false }
  350. };
  351. for (var i = 0; i < 4; i++)
  352. {
  353. field.NewKeyDownEvent (Key.D0);
  354. }
  355. Assert.Equal ("0000", field.Text);
  356. Assert.False (field.IsValid);
  357. // HOME KEY
  358. field.NewKeyDownEvent (Key.Home);
  359. // END KEY
  360. field.NewKeyDownEvent (Key.End);
  361. // Insert 9
  362. field.NewKeyDownEvent (Key.D9);
  363. Assert.Equal ("00009", field.Text);
  364. Assert.True (field.IsValid);
  365. // Insert 9
  366. field.NewKeyDownEvent (Key.D9);
  367. Assert.Equal ("000099", field.Text);
  368. Assert.False (field.IsValid);
  369. }
  370. [Fact]
  371. public void Home_Key_First_Editable_Character ()
  372. {
  373. // Range 0 to 1000
  374. // Accepts 001 too.
  375. var field = new TextValidateField { Width = 20, Provider = new TextRegexProvider ("^[0-9]?[0-9]?[0-9]|1000$") };
  376. field.NewKeyDownEvent (Key.D1);
  377. field.NewKeyDownEvent (Key.D0);
  378. field.NewKeyDownEvent (Key.D0);
  379. field.NewKeyDownEvent (Key.D0);
  380. Assert.Equal ("1000", field.Text);
  381. Assert.True (field.IsValid);
  382. // HOME KEY
  383. field.NewKeyDownEvent (Key.Home);
  384. // DELETE
  385. field.NewKeyDownEvent (Key.Delete);
  386. Assert.Equal ("000", field.Text);
  387. Assert.True (field.IsValid);
  388. }
  389. [Fact]
  390. public void Input_With_Validate_On_Input_Set_Text ()
  391. {
  392. var field = new TextValidateField { Width = 20, Provider = new TextRegexProvider ("^[0-9][0-9][0-9]$") };
  393. // Input dosen't validates the pattern.
  394. field.NewKeyDownEvent (Key.D1);
  395. Assert.Equal ("", field.Text);
  396. Assert.False (field.IsValid);
  397. // Dosen't match
  398. field.Text = "12356";
  399. Assert.Equal ("", field.Text);
  400. Assert.False (field.IsValid);
  401. // Yes.
  402. field.Text = "123";
  403. Assert.Equal ("123", field.Text);
  404. Assert.True (field.IsValid);
  405. }
  406. [Fact]
  407. public void Input_Without_Validate_On_Input ()
  408. {
  409. var field = new TextValidateField
  410. {
  411. Width = 20, Provider = new TextRegexProvider ("^[0-9][0-9][0-9]$") { ValidateOnInput = false }
  412. };
  413. field.NewKeyDownEvent (Key.D1);
  414. Assert.Equal ("1", field.Text);
  415. Assert.False (field.IsValid);
  416. field.NewKeyDownEvent (Key.D2);
  417. Assert.Equal ("12", field.Text);
  418. Assert.False (field.IsValid);
  419. field.NewKeyDownEvent (Key.D3);
  420. Assert.Equal ("123", field.Text);
  421. Assert.True (field.IsValid);
  422. field.NewKeyDownEvent (Key.D4);
  423. Assert.Equal ("1234", field.Text);
  424. Assert.False (field.IsValid);
  425. }
  426. [Fact]
  427. public void Left_Key_Stops_At_Start_And_Insert ()
  428. {
  429. var field = new TextValidateField
  430. {
  431. TextAlignment = Alignment.Center,
  432. Width = 20,
  433. Provider = new TextRegexProvider ("^[0-9][0-9][0-9]$") { ValidateOnInput = false }
  434. };
  435. field.Text = "123";
  436. for (var i = 0; i < 10; i++)
  437. {
  438. field.NewKeyDownEvent (Key.CursorLeft);
  439. }
  440. Assert.Equal ("123", field.Text);
  441. Assert.True (field.IsValid);
  442. // Insert 4
  443. field.NewKeyDownEvent (Key.D4);
  444. Assert.Equal ("4123", field.Text);
  445. Assert.False (field.IsValid);
  446. }
  447. [Fact]
  448. public void Mask_With_Invalid_Pattern_Exception ()
  449. {
  450. // Regex Exception
  451. // Maybe it's not the right behaviour.
  452. var mask = "";
  453. for (var i = 0; i < 255; i++)
  454. {
  455. mask += (char)i;
  456. }
  457. try
  458. {
  459. var field = new TextValidateField { Width = 20, Provider = new TextRegexProvider (mask) };
  460. }
  461. catch (RegexParseException ex)
  462. {
  463. Assert.True (true, ex.Message);
  464. return;
  465. }
  466. Assert.True (false);
  467. }
  468. [Fact]
  469. public void OnTextChanged_TextChanged_Event ()
  470. {
  471. var wasTextChanged = false;
  472. var field = new TextValidateField
  473. {
  474. TextAlignment = Alignment.Center,
  475. Width = 20,
  476. Provider = new TextRegexProvider ("^[0-9][0-9][0-9]$") { ValidateOnInput = false }
  477. };
  478. field.Provider.TextChanged += (sender, e) => wasTextChanged = true;
  479. field.NewKeyDownEvent (Key.D1);
  480. Assert.Equal ("1", field.Provider.DisplayText);
  481. Assert.False (field.IsValid);
  482. Assert.Equal ("1", field.Provider.Text);
  483. Assert.True (wasTextChanged);
  484. }
  485. [Fact]
  486. public void Right_Key_Stops_At_End_And_Insert ()
  487. {
  488. var field = new TextValidateField
  489. {
  490. TextAlignment = Alignment.Center,
  491. Width = 20,
  492. Provider = new TextRegexProvider ("^[0-9][0-9][0-9]$") { ValidateOnInput = false }
  493. };
  494. field.Text = "123";
  495. for (var i = 0; i < 10; i++)
  496. {
  497. field.NewKeyDownEvent (Key.CursorRight);
  498. }
  499. Assert.Equal ("123", field.Text);
  500. Assert.True (field.IsValid);
  501. // Insert 4
  502. field.NewKeyDownEvent (Key.D4);
  503. Assert.Equal ("1234", field.Text);
  504. Assert.False (field.IsValid);
  505. }
  506. [Fact]
  507. public void Text_With_All_Charset ()
  508. {
  509. var field = new TextValidateField { Width = 20, Provider = new TextRegexProvider ("^[0-9][0-9][0-9]$") };
  510. var text = "";
  511. for (var i = 0; i < 255; i++)
  512. {
  513. text += (char)i;
  514. }
  515. field.Text = text;
  516. Assert.False (field.IsValid);
  517. }
  518. }