TextValidateFieldTests.cs 17 KB

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