TextValidateFieldTests.cs 17 KB

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