2
0

TextValidateFieldTests.cs 17 KB

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