TextValidateFieldTests.cs 18 KB

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