MaskedTextBoxTest.cs 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935
  1. //
  2. // Copyright (c) 2007 Novell, Inc.
  3. //
  4. // Authors:
  5. // Rolf Bjarne Kvinge ([email protected])
  6. //
  7. #if NET_2_0
  8. using System;
  9. using System.Collections;
  10. using System.ComponentModel;
  11. using System.Drawing;
  12. using System.Windows.Forms;
  13. using System.Xml;
  14. using System.Threading;
  15. using NUnit.Framework;
  16. using System.Globalization;
  17. using Thread=System.Threading.Thread;
  18. using CategoryAttribute=NUnit.Framework.CategoryAttribute;
  19. using System.Reflection;
  20. namespace MonoTests.System.Windows.Forms
  21. {
  22. [TestFixture]
  23. public class MaskedTextBoxTest
  24. {
  25. [SetUp]
  26. public void Setup ()
  27. {
  28. Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo ("en-US");
  29. }
  30. [Test]
  31. public void InitialProperties ()
  32. {
  33. MaskedTextBox mtb = new MaskedTextBox ();
  34. Assert.AreEqual (false, mtb.AcceptsTab, "#A1");
  35. Assert.AreEqual (true, mtb.AllowPromptAsInput, "#A2");
  36. Assert.AreEqual (false, mtb.AsciiOnly, "#A3");
  37. Assert.AreEqual (false, mtb.BeepOnError, "#B1");
  38. Assert.AreEqual (false, mtb.CanUndo, "#C1");
  39. Assert.IsNotNull (mtb.Culture, "#C3");
  40. Assert.AreEqual (Thread.CurrentThread.CurrentCulture.Name, mtb.Culture.Name, "#4");
  41. Assert.AreEqual (MaskFormat.IncludeLiterals, mtb.CutCopyMaskFormat, "#C5");
  42. Assert.IsNull (mtb.FormatProvider, "#F1");
  43. Assert.AreEqual (false, mtb.HidePromptOnLeave, "#H1");
  44. Assert.AreEqual (InsertKeyMode.Default, mtb.InsertKeyMode, "#I1");
  45. Assert.AreEqual (false, mtb.IsOverwriteMode, "#I2");
  46. Assert.AreEqual (0, mtb.Lines.Length, "#L1");
  47. Assert.AreEqual ("", mtb.Mask, "#M1");
  48. Assert.AreEqual (true, mtb.MaskCompleted, "#M2");
  49. Assert.IsNull (mtb.MaskedTextProvider, "#M3");
  50. Assert.AreEqual (true, mtb.MaskFull, "#M4");
  51. Assert.AreEqual (Int16.MaxValue, mtb.MaxLength, "#M5");
  52. Assert.AreEqual (false, mtb.Multiline, "#M6");
  53. Assert.AreEqual ('\0', mtb.PasswordChar, "#P1");
  54. Assert.AreEqual ('_', mtb.PromptChar, "#P2");
  55. Assert.AreEqual (false, mtb.ReadOnly, "#R1");
  56. Assert.AreEqual (false, mtb.RejectInputOnFirstFailure, "#R2");
  57. Assert.AreEqual (true, mtb.ResetOnPrompt, "#R3");
  58. Assert.AreEqual (true, mtb.ResetOnSpace, "#R4");
  59. Assert.AreEqual ("", mtb.SelectedText, "#S1");
  60. Assert.AreEqual (true, mtb.SkipLiterals, "#S2");
  61. Assert.AreEqual ("", mtb.Text, "#T1");
  62. Assert.AreEqual (HorizontalAlignment.Left, mtb.TextAlign, "#T2");
  63. Assert.AreEqual (0, mtb.TextLength, "#T3");
  64. Assert.AreEqual (MaskFormat.IncludeLiterals, mtb.TextMaskFormat, "#T4");
  65. Assert.AreEqual (false, mtb.UseSystemPasswordChar, "#U1");
  66. Assert.IsNull (mtb.ValidatingType, "#V1");
  67. Assert.AreEqual (false, mtb.WordWrap, "#W1");
  68. mtb.Dispose ();
  69. }
  70. [Test]
  71. public void WordWrapTest ()
  72. {
  73. MaskedTextBox mtb;
  74. mtb = new MaskedTextBox ();
  75. Assert.AreEqual (false, mtb.WordWrap, "#W1");
  76. mtb.WordWrap = true;
  77. Assert.AreEqual (false, mtb.WordWrap, "#W2");
  78. mtb.Dispose ();
  79. }
  80. [Test]
  81. public void ValidatingTypeTest ()
  82. {
  83. MaskedTextBox mtb;
  84. mtb = new MaskedTextBox ();
  85. Assert.IsNull (mtb.ValidatingType, "#V1");
  86. mtb.ValidatingType = typeof(int);
  87. Assert.IsNotNull (mtb.ValidatingType, "#V2");
  88. Assert.AreSame (typeof(int), mtb.ValidatingType, "#V3");
  89. mtb.Dispose ();
  90. }
  91. [Test]
  92. public void UseSystemPasswordCharTest ()
  93. {
  94. MaskedTextBox mtb;
  95. mtb = new MaskedTextBox ();
  96. Assert.AreEqual (false, mtb.UseSystemPasswordChar, "#U1");
  97. mtb.UseSystemPasswordChar = true;
  98. Assert.AreEqual (true, mtb.UseSystemPasswordChar, "#U2");
  99. mtb.Dispose ();
  100. }
  101. [Test]
  102. public void TextMaskFormatTest ()
  103. {
  104. MaskedTextBox mtb;
  105. mtb = new MaskedTextBox ();
  106. Assert.AreEqual (MaskFormat.IncludeLiterals, mtb.TextMaskFormat, "#T1");
  107. mtb.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals;
  108. Assert.AreEqual (MaskFormat.ExcludePromptAndLiterals, mtb.TextMaskFormat, "#T2");
  109. mtb.TextMaskFormat = MaskFormat.IncludePromptAndLiterals;
  110. Assert.AreEqual (MaskFormat.IncludePromptAndLiterals, mtb.TextMaskFormat, "#T3");
  111. mtb.TextMaskFormat = MaskFormat.IncludePrompt;
  112. Assert.AreEqual (MaskFormat.IncludePrompt, mtb.TextMaskFormat, "#T4");
  113. mtb.TextMaskFormat = MaskFormat.IncludeLiterals;
  114. Assert.AreEqual (MaskFormat.IncludeLiterals, mtb.TextMaskFormat, "#T4");
  115. mtb.Dispose ();
  116. }
  117. [Test]
  118. [ExpectedException (typeof(InvalidEnumArgumentException))]
  119. public void TextMaskFormatExceptionTestException ()
  120. {
  121. MaskedTextBox mtb;
  122. mtb = new MaskedTextBox ();
  123. mtb.TextMaskFormat = (MaskFormat) 123;
  124. mtb.Dispose ();
  125. }
  126. [Test]
  127. public void TextLengthTest ()
  128. {
  129. MaskedTextBox mtb;
  130. mtb = new MaskedTextBox ();
  131. Assert.AreEqual (0, mtb.TextLength, "#T1");
  132. mtb.Text = "abc";
  133. Assert.AreEqual (3, mtb.TextLength, "#T2");
  134. mtb.Dispose ();
  135. }
  136. [Test]
  137. public void TextAlignTest ()
  138. {
  139. MaskedTextBox mtb;
  140. mtb = new MaskedTextBox ();
  141. Assert.AreEqual (HorizontalAlignment.Left, mtb.TextAlign, "#T1");
  142. mtb.TextAlign = HorizontalAlignment.Center;
  143. Assert.AreEqual (HorizontalAlignment.Center, mtb.TextAlign, "#T2");
  144. mtb.TextAlign = HorizontalAlignment.Right;
  145. Assert.AreEqual (HorizontalAlignment.Right, mtb.TextAlign, "#T3");
  146. mtb.TextAlign = HorizontalAlignment.Left;
  147. Assert.AreEqual (HorizontalAlignment.Left, mtb.TextAlign, "#T4");
  148. mtb.Dispose ();
  149. }
  150. [Test]
  151. [ExpectedException (typeof (InvalidEnumArgumentException))]
  152. public void TextAlignExceptionTest ()
  153. {
  154. MaskedTextBox mtb;
  155. mtb = new MaskedTextBox ();
  156. mtb.TextAlign = (HorizontalAlignment) 123;
  157. mtb.Dispose ();
  158. }
  159. [Test]
  160. public void TextTest ()
  161. {
  162. MaskedTextBox mtb;
  163. mtb = new MaskedTextBox ();
  164. Assert.AreEqual ("", mtb.Text, "#T1");
  165. mtb.Text = "abc";
  166. Assert.AreEqual ("abc", mtb.Text, "#T2");
  167. mtb.Text = "ABC";
  168. Assert.AreEqual ("ABC", mtb.Text, "#T3");
  169. mtb.Mask = "abc";
  170. mtb.Text = "abc";
  171. Assert.AreEqual ("abc", mtb.Text, "#T4");
  172. mtb.Text = "ABC";
  173. Assert.AreEqual ("Abc", mtb.Text, "#T5");
  174. mtb.Text = "123";
  175. Assert.AreEqual ("1bc", mtb.Text, "#T6");
  176. mtb.Dispose ();
  177. }
  178. [Test]
  179. public void SkipLiteralsTest ()
  180. {
  181. MaskedTextBox mtb;
  182. mtb = new MaskedTextBox ();
  183. Assert.AreEqual (true, mtb.SkipLiterals, "#S1");
  184. mtb.SkipLiterals = false;
  185. Assert.AreEqual (false, mtb.SkipLiterals, "#S2");
  186. mtb.Dispose ();
  187. }
  188. [Test]
  189. public void SelectedTextTest ()
  190. {
  191. MaskedTextBox mtb;
  192. mtb = new MaskedTextBox ();
  193. Assert.AreEqual ("", mtb.SelectedText, "#S1");
  194. mtb.Text = "abc";
  195. Assert.AreEqual ("", mtb.SelectedText, "#S2");
  196. mtb.SelectAll ();
  197. Assert.AreEqual ("abc", mtb.SelectedText, "#S3");
  198. mtb.Dispose ();
  199. }
  200. [Test]
  201. public void ResetOnSpaceTest ()
  202. {
  203. MaskedTextBox mtb;
  204. mtb = new MaskedTextBox ();
  205. Assert.AreEqual (true, mtb.ResetOnSpace, "#R1");
  206. mtb.ResetOnSpace = false;
  207. Assert.AreEqual (false, mtb.ResetOnSpace, "#R2");
  208. mtb.Dispose ();
  209. }
  210. [Test]
  211. public void ResetOnPromptTest ()
  212. {
  213. MaskedTextBox mtb;
  214. mtb = new MaskedTextBox ();
  215. Assert.AreEqual (true, mtb.ResetOnPrompt, "#R1");
  216. mtb.ResetOnPrompt = false;
  217. Assert.AreEqual (false, mtb.ResetOnPrompt, "#R2");
  218. mtb.Dispose ();
  219. }
  220. [Test]
  221. public void RejectInputOnFirstFailureTest ()
  222. {
  223. MaskedTextBox mtb;
  224. mtb = new MaskedTextBox ();
  225. Assert.AreEqual (false, mtb.RejectInputOnFirstFailure, "#R1");
  226. mtb.RejectInputOnFirstFailure = true;
  227. Assert.AreEqual (true, mtb.RejectInputOnFirstFailure, "#R2");
  228. mtb.Dispose ();
  229. }
  230. [Test]
  231. public void ReadOnlyTest ()
  232. {
  233. MaskedTextBox mtb;
  234. mtb = new MaskedTextBox ();
  235. Assert.AreEqual (false, mtb.ReadOnly, "#R1");
  236. mtb.ReadOnly = true;
  237. Assert.AreEqual (true, mtb.ReadOnly, "#R2");
  238. mtb.Dispose ();
  239. }
  240. [Test]
  241. public void PromptCharTest ()
  242. {
  243. MaskedTextBox mtb;
  244. mtb = new MaskedTextBox ();
  245. Assert.AreEqual ('_', mtb.PromptChar, "#P1");
  246. mtb.PromptChar = '*';
  247. Assert.AreEqual ('*', mtb.PromptChar, "#P2");
  248. mtb.Dispose ();
  249. }
  250. [Test]
  251. public void PasswordCharTest ()
  252. {
  253. MaskedTextBox mtb;
  254. mtb = new MaskedTextBox ();
  255. Assert.AreEqual ('\0', mtb.PasswordChar, "#P1");
  256. mtb.PasswordChar = '*';
  257. Assert.AreEqual ('*', mtb.PasswordChar, "#P2");
  258. mtb.Dispose ();
  259. }
  260. [Test]
  261. public void MultilineTest ()
  262. {
  263. MaskedTextBox mtb;
  264. mtb = new MaskedTextBox ();
  265. Assert.AreEqual (false, mtb.Multiline, "#M1");
  266. mtb.Multiline = true;
  267. Assert.AreEqual (false, mtb.Multiline, "#M2");
  268. mtb.Dispose ();
  269. }
  270. [Test]
  271. public void MaskFullTest ()
  272. {
  273. MaskedTextBox mtb;
  274. mtb = new MaskedTextBox ();
  275. Assert.AreEqual (true, mtb.MaskFull, "#M1");
  276. mtb.Mask = "abc";
  277. Assert.AreEqual (false, mtb.MaskFull, "#M2");
  278. mtb.Text = "abc";
  279. Assert.AreEqual (true, mtb.MaskFull, "#M3");
  280. mtb.Dispose ();
  281. }
  282. [Test]
  283. public void MaskedTextProviderTest ()
  284. {
  285. MaskedTextBox mtb;
  286. MaskedTextProvider mtp;
  287. mtb = new MaskedTextBox ();
  288. Assert.IsNull (mtb.MaskedTextProvider, "#M1");
  289. mtb.Mask = "abc";
  290. Assert.IsNotNull (mtb.MaskedTextProvider, "#M2");
  291. Assert.AreEqual ("abc", mtb.MaskedTextProvider.Mask, "#M3");
  292. // We always get a clone of the current mtp.
  293. Assert.IsTrue (mtb.MaskedTextProvider != mtb.MaskedTextProvider, "#M4");
  294. mtb.Dispose ();
  295. mtp = new MaskedTextProvider ("Z");
  296. mtb = new MaskedTextBox (mtp);
  297. Assert.IsNotNull (mtb.MaskedTextProvider, "#M5");
  298. Assert.AreEqual ("Z", mtb.MaskedTextProvider.Mask, "#6");
  299. Assert.IsTrue (mtb.MaskedTextProvider != mtb.MaskedTextProvider, "#M7");
  300. Assert.IsTrue (mtb.MaskedTextProvider != mtp, "#M8");
  301. mtb.Dispose ();
  302. }
  303. [Test]
  304. public void MaskCompletedTest ()
  305. {
  306. MaskedTextBox mtb;
  307. mtb = new MaskedTextBox ();
  308. Assert.AreEqual (true, mtb.MaskCompleted, "#M1");
  309. mtb.Mask = "abcABCZZZ";
  310. Assert.AreEqual (false, mtb.MaskCompleted, "#M2");
  311. mtb.Text = "abcabcabc";
  312. Assert.AreEqual (true, mtb.MaskCompleted, "#M3");
  313. mtb.Dispose ();
  314. }
  315. [Test]
  316. public void MaskTest ()
  317. {
  318. MaskedTextBox mtb;
  319. mtb = new MaskedTextBox ();
  320. Assert.AreEqual ("", mtb.Mask, "#M1");
  321. mtb.Mask = "abc";
  322. Assert.AreEqual ("abc", mtb.Mask, "#M2");
  323. mtb.Mask = "";
  324. Assert.AreEqual ("", mtb.Mask, "#M3");
  325. mtb.Mask = null;
  326. Assert.AreEqual ("", mtb.Mask, "#M4");
  327. mtb.Mask = "";
  328. Assert.AreEqual ("", mtb.Mask, "#M5");
  329. mtb.Dispose ();
  330. }
  331. [Test]
  332. public void LinesTest ()
  333. {
  334. MaskedTextBox mtb;
  335. mtb = new MaskedTextBox ();
  336. Assert.AreEqual (0, mtb.Lines.Length, "#L1");
  337. mtb.Text = "abc";
  338. Assert.AreEqual (1, mtb.Lines.Length, "#L2");
  339. Assert.AreEqual ("abc", mtb.Lines [0], "#L2a");
  340. mtb.Text = "abc\nabc";
  341. Assert.AreEqual (2, mtb.Lines.Length, "#L3");
  342. Assert.AreEqual ("abc", mtb.Lines [0], "#L3a");
  343. Assert.AreEqual ("abc", mtb.Lines [1], "#L3b");
  344. mtb.Dispose ();
  345. }
  346. [Test]
  347. public void IsOverwriteModeTest ()
  348. {
  349. MaskedTextBox mtb;
  350. mtb = new MaskedTextBox ();
  351. Assert.AreEqual (false, mtb.IsOverwriteMode, "#I1");
  352. mtb.Dispose ();
  353. }
  354. [Test]
  355. public void InsertKeyModeTest ()
  356. {
  357. MaskedTextBox mtb;
  358. mtb = new MaskedTextBox ();
  359. Assert.AreEqual (InsertKeyMode.Default, mtb.InsertKeyMode, "#I1");
  360. mtb.InsertKeyMode = InsertKeyMode.Insert;
  361. Assert.AreEqual (InsertKeyMode.Insert, mtb.InsertKeyMode, "#I2");
  362. mtb.InsertKeyMode = InsertKeyMode.Overwrite;
  363. Assert.AreEqual (InsertKeyMode.Overwrite, mtb.InsertKeyMode, "#I3");
  364. mtb.InsertKeyMode = InsertKeyMode.Default;
  365. Assert.AreEqual (InsertKeyMode.Default, mtb.InsertKeyMode, "#I4");
  366. mtb.Dispose ();
  367. }
  368. [Test]
  369. [ExpectedException (typeof (InvalidEnumArgumentException))]
  370. public void InsertKeyModeExceptionTest ()
  371. {
  372. MaskedTextBox mtb;
  373. mtb = new MaskedTextBox ();
  374. mtb.InsertKeyMode = (InsertKeyMode) 123;
  375. mtb.Dispose ();
  376. }
  377. [Test]
  378. public void HidePromptOnLeaveTest ()
  379. {
  380. MaskedTextBox mtb;
  381. mtb = new MaskedTextBox ();
  382. Assert.AreEqual (false, mtb.HidePromptOnLeave, "#H1");
  383. mtb.HidePromptOnLeave = true;
  384. Assert.AreEqual (true, mtb.HidePromptOnLeave, "#H1");
  385. mtb.Dispose ();
  386. }
  387. [Test]
  388. public void FormatProviderTest ()
  389. {
  390. MaskedTextBox mtb;
  391. mtb = new MaskedTextBox ();
  392. Assert.IsNull (mtb.FormatProvider, "#F1");
  393. mtb.FormatProvider = CultureInfo.CurrentCulture.NumberFormat;
  394. Assert.IsNotNull (mtb.FormatProvider, "#F2");
  395. Assert.AreSame (CultureInfo.CurrentCulture.NumberFormat, mtb.FormatProvider, "#F3");
  396. mtb.Dispose ();
  397. }
  398. [Test]
  399. public void CutCopyMaskFormatTest ()
  400. {
  401. MaskedTextBox mtb;
  402. mtb = new MaskedTextBox ();
  403. Assert.AreEqual (MaskFormat.IncludeLiterals, mtb.CutCopyMaskFormat, "#C1");
  404. mtb.CutCopyMaskFormat = MaskFormat.ExcludePromptAndLiterals;
  405. Assert.AreEqual (MaskFormat.ExcludePromptAndLiterals, mtb.CutCopyMaskFormat, "#C2");
  406. mtb.CutCopyMaskFormat = MaskFormat.IncludeLiterals;
  407. Assert.AreEqual (MaskFormat.IncludeLiterals, mtb.CutCopyMaskFormat, "#C3");
  408. mtb.CutCopyMaskFormat = MaskFormat.IncludePrompt;
  409. Assert.AreEqual (MaskFormat.IncludePrompt, mtb.CutCopyMaskFormat, "#C4");
  410. mtb.CutCopyMaskFormat = MaskFormat.IncludePromptAndLiterals;
  411. Assert.AreEqual (MaskFormat.IncludePromptAndLiterals, mtb.CutCopyMaskFormat, "#C5");
  412. mtb.Dispose ();
  413. }
  414. [Test]
  415. [ExpectedException (typeof (InvalidEnumArgumentException))]
  416. public void CutCopyMaskFormatExceptionTest ()
  417. {
  418. MaskedTextBox mtb;
  419. mtb = new MaskedTextBox ();
  420. mtb.CutCopyMaskFormat = (MaskFormat) 123;
  421. mtb.Dispose ();
  422. }
  423. [Test]
  424. public void CultureTest ()
  425. {
  426. MaskedTextBox mtb;
  427. MaskedTextProvider mtp;
  428. try {
  429. Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo ("en-US");
  430. mtb = new MaskedTextBox ();
  431. Assert.IsNotNull (mtb.Culture, "#A1");
  432. Assert.AreEqual ("en-US", mtb.Culture.Name, "#A2");
  433. mtb.Dispose ();
  434. Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo ("es-ES");
  435. mtb = new MaskedTextBox ();
  436. Assert.IsNotNull (mtb.Culture, "#B1");
  437. Assert.AreEqual ("es-ES", mtb.Culture.Name, "#B2");
  438. mtb.Dispose ();
  439. mtp = new MaskedTextProvider ("abc");
  440. Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo ("es-AR");
  441. mtb = new MaskedTextBox (mtp);
  442. Assert.IsNotNull (mtb.Culture, "#C1");
  443. Assert.AreEqual ("es-ES", mtb.Culture.Name, "#C2");
  444. mtb.Dispose ();
  445. mtb = new MaskedTextBox ();
  446. mtb.Culture = CultureInfo.GetCultureInfo ("de-DE");
  447. Assert.AreEqual ("de-DE", mtb.Culture.Name, "#D1");
  448. } finally {
  449. Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo ("en-US");
  450. }
  451. }
  452. [Test]
  453. public void CanUndoTest ()
  454. {
  455. MaskedTextBox mtb = new MaskedTextBox ();
  456. TextBoxBase tbb = mtb;
  457. Assert.AreEqual (false, mtb.CanUndo, "#A1");
  458. Assert.AreEqual (false, tbb.CanUndo, "#A2");
  459. mtb.Dispose ();
  460. }
  461. [Test]
  462. public void BeepOnErrorTest ()
  463. {
  464. MaskedTextBox mtb = new MaskedTextBox ();
  465. Assert.AreEqual (false, mtb.BeepOnError, "#A1");
  466. mtb.BeepOnError = true;
  467. Assert.AreEqual (true, mtb.BeepOnError, "#A2");
  468. mtb.BeepOnError = false;
  469. Assert.AreEqual (false, mtb.BeepOnError, "#A3");
  470. mtb.Dispose ();
  471. }
  472. [Test]
  473. public void AsciiOnlyTest ()
  474. {
  475. MaskedTextBox mtb = new MaskedTextBox ();
  476. Assert.AreEqual (false, mtb.AsciiOnly, "#A1");
  477. mtb.AsciiOnly = true;
  478. Assert.AreEqual (true, mtb.AsciiOnly, "#A2");
  479. mtb.AsciiOnly = false;
  480. Assert.AreEqual (false, mtb.AsciiOnly, "#A3");
  481. mtb.Dispose ();
  482. }
  483. [Test]
  484. public void AllowPromptAsInputTest ()
  485. {
  486. MaskedTextBox mtb = new MaskedTextBox ();
  487. Assert.AreEqual (true, mtb.AllowPromptAsInput, "#A1");
  488. mtb.AllowPromptAsInput = true;
  489. Assert.AreEqual (true, mtb.AllowPromptAsInput, "#A2");
  490. mtb.AllowPromptAsInput = false;
  491. Assert.AreEqual (false, mtb.AllowPromptAsInput, "#A3");
  492. mtb.Dispose ();
  493. }
  494. [Test]
  495. public void AcceptsTabTest ()
  496. {
  497. MaskedTextBox mtb = new MaskedTextBox ();
  498. Assert.AreEqual (false, mtb.AcceptsTab, "#A1");
  499. mtb.AcceptsTab = true;
  500. Assert.AreEqual (false, mtb.AcceptsTab, "#A2");
  501. mtb.AcceptsTab = false;
  502. Assert.AreEqual (false, mtb.AcceptsTab, "#A3");
  503. mtb.Dispose ();
  504. }
  505. [Test]
  506. public void ConstructorTest ()
  507. {
  508. using (MaskedTextBox mtb = new MaskedTextBox ()) {
  509. Assert.AreEqual (false, mtb.AcceptsTab, "#A_A1");
  510. Assert.AreEqual (true, mtb.AllowPromptAsInput, "#A_A2");
  511. Assert.AreEqual (false, mtb.AsciiOnly, "#A_A3");
  512. Assert.AreEqual (false, mtb.BeepOnError, "#A_B1");
  513. Assert.AreEqual (false, mtb.CanUndo, "#A_C1");
  514. Assert.IsNotNull (mtb.Culture, "#A_C3");
  515. Assert.AreEqual (Thread.CurrentThread.CurrentCulture.Name, mtb.Culture.Name, "#A_4");
  516. Assert.AreEqual (MaskFormat.IncludeLiterals, mtb.CutCopyMaskFormat, "#A_C5");
  517. Assert.IsNull (mtb.FormatProvider, "#A_F1");
  518. Assert.AreEqual (false, mtb.HidePromptOnLeave, "#A_H1");
  519. Assert.AreEqual (InsertKeyMode.Default, mtb.InsertKeyMode, "#A_I1");
  520. Assert.AreEqual (false, mtb.IsOverwriteMode, "#A_I2");
  521. Assert.AreEqual (0, mtb.Lines.Length, "#A_L1");
  522. Assert.AreEqual ("", mtb.Mask, "#A_M1");
  523. Assert.AreEqual (true, mtb.MaskCompleted, "#A_M2");
  524. Assert.IsNull (mtb.MaskedTextProvider, "#A_M3");
  525. Assert.AreEqual (true, mtb.MaskFull, "#A_M4");
  526. Assert.AreEqual (Int16.MaxValue, mtb.MaxLength, "#A_M5");
  527. Assert.AreEqual (false, mtb.Multiline, "#A_M6");
  528. Assert.AreEqual ('\0', mtb.PasswordChar, "#A_P1");
  529. Assert.AreEqual ('_', mtb.PromptChar, "#A_P2");
  530. Assert.AreEqual (false, mtb.ReadOnly, "#A_R1");
  531. Assert.AreEqual (false, mtb.RejectInputOnFirstFailure, "#A_R2");
  532. Assert.AreEqual (true, mtb.ResetOnPrompt, "#A_R3");
  533. Assert.AreEqual (true, mtb.ResetOnSpace, "#A_R4");
  534. Assert.AreEqual ("", mtb.SelectedText, "#A_S1");
  535. Assert.AreEqual (true, mtb.SkipLiterals, "#A_S2");
  536. Assert.AreEqual ("", mtb.Text, "#A_T1");
  537. Assert.AreEqual (HorizontalAlignment.Left, mtb.TextAlign, "#A_T2");
  538. Assert.AreEqual (0, mtb.TextLength, "#A_T3");
  539. Assert.AreEqual (MaskFormat.IncludeLiterals, mtb.TextMaskFormat, "#A_T4");
  540. Assert.AreEqual (false, mtb.UseSystemPasswordChar, "#A_U1");
  541. Assert.IsNull (mtb.ValidatingType, "#A_V1");
  542. Assert.AreEqual (false, mtb.WordWrap, "#A_W1");
  543. }
  544. using (MaskedTextBox mtb = new MaskedTextBox ("abc")) {
  545. Assert.AreEqual (false, mtb.AcceptsTab, "#B_A1");
  546. Assert.AreEqual (true, mtb.AllowPromptAsInput, "#B_A2");
  547. Assert.AreEqual (false, mtb.AsciiOnly, "#B_A3");
  548. Assert.AreEqual (false, mtb.BeepOnError, "#B_B1");
  549. Assert.AreEqual (false, mtb.CanUndo, "#B_C1");
  550. Assert.IsNotNull (mtb.Culture, "#B_C3");
  551. Assert.AreEqual (Thread.CurrentThread.CurrentCulture.Name, mtb.Culture.Name, "#B_4");
  552. Assert.AreEqual (MaskFormat.IncludeLiterals, mtb.CutCopyMaskFormat, "#B_C5");
  553. Assert.IsNull (mtb.FormatProvider, "#B_F1");
  554. Assert.AreEqual (false, mtb.HidePromptOnLeave, "#B_H1");
  555. Assert.AreEqual (InsertKeyMode.Default, mtb.InsertKeyMode, "#B_I1");
  556. Assert.AreEqual (false, mtb.IsOverwriteMode, "#B_I2");
  557. Assert.AreEqual (1, mtb.Lines.Length, "#B_L1");
  558. Assert.AreEqual ("abc", mtb.Mask, "#B_M1");
  559. Assert.AreEqual (true, mtb.MaskCompleted, "#B_M2");
  560. Assert.IsNotNull (mtb.MaskedTextProvider, "#B_M3");
  561. Assert.AreEqual (false, mtb.MaskFull, "#B_M4");
  562. Assert.AreEqual (Int16.MaxValue, mtb.MaxLength, "#B_M5");
  563. Assert.AreEqual (false, mtb.Multiline, "#B_M6");
  564. Assert.AreEqual ('\0', mtb.PasswordChar, "#B_P1");
  565. Assert.AreEqual ('_', mtb.PromptChar, "#B_P2");
  566. Assert.AreEqual (false, mtb.ReadOnly, "#B_R1");
  567. Assert.AreEqual (false, mtb.RejectInputOnFirstFailure, "#B_R2");
  568. Assert.AreEqual (true, mtb.ResetOnPrompt, "#B_R3");
  569. Assert.AreEqual (true, mtb.ResetOnSpace, "#B_R4");
  570. Assert.AreEqual ("", mtb.SelectedText, "#B_S1");
  571. Assert.AreEqual (true, mtb.SkipLiterals, "#B_S2");
  572. Assert.AreEqual (" bc", mtb.Text, "#B_T1");
  573. Assert.AreEqual (HorizontalAlignment.Left, mtb.TextAlign, "#B_T2");
  574. Assert.AreEqual (3, mtb.TextLength, "#B_T3");
  575. Assert.AreEqual (MaskFormat.IncludeLiterals, mtb.TextMaskFormat, "#B_T4");
  576. Assert.AreEqual (false, mtb.UseSystemPasswordChar, "#B_U1");
  577. Assert.IsNull (mtb.ValidatingType, "#B_V1");
  578. Assert.AreEqual (false, mtb.WordWrap, "#B_W1");
  579. }
  580. using (MaskedTextBox mtb = new MaskedTextBox ("<>")) {
  581. Assert.AreEqual (false, mtb.AcceptsTab, "#C_A1");
  582. Assert.AreEqual (true, mtb.AllowPromptAsInput, "#C_A2");
  583. Assert.AreEqual (false, mtb.AsciiOnly, "#C_A3");
  584. Assert.AreEqual (false, mtb.BeepOnError, "#C_B1");
  585. Assert.AreEqual (false, mtb.CanUndo, "#C_C1");
  586. Assert.IsNotNull (mtb.Culture, "#C_C3");
  587. Assert.AreEqual (Thread.CurrentThread.CurrentCulture.Name, mtb.Culture.Name, "#C_4");
  588. Assert.AreEqual (MaskFormat.IncludeLiterals, mtb.CutCopyMaskFormat, "#C_C5");
  589. Assert.IsNull (mtb.FormatProvider, "#C_F1");
  590. Assert.AreEqual (false, mtb.HidePromptOnLeave, "#C_H1");
  591. Assert.AreEqual (InsertKeyMode.Default, mtb.InsertKeyMode, "#C_I1");
  592. Assert.AreEqual (false, mtb.IsOverwriteMode, "#C_I2");
  593. Assert.AreEqual (0, mtb.Lines.Length, "#C_L1");
  594. Assert.AreEqual ("<>", mtb.Mask, "#C_M1");
  595. Assert.AreEqual (true, mtb.MaskCompleted, "#C_M2");
  596. Assert.IsNotNull (mtb.MaskedTextProvider, "#C_M3");
  597. Assert.AreEqual (true, mtb.MaskFull, "#C_M4");
  598. Assert.AreEqual (Int16.MaxValue, mtb.MaxLength, "#C_M5");
  599. Assert.AreEqual (false, mtb.Multiline, "#C_M6");
  600. Assert.AreEqual ('\0', mtb.PasswordChar, "#C_P1");
  601. Assert.AreEqual ('_', mtb.PromptChar, "#C_P2");
  602. Assert.AreEqual (false, mtb.ReadOnly, "#C_R1");
  603. Assert.AreEqual (false, mtb.RejectInputOnFirstFailure, "#C_R2");
  604. Assert.AreEqual (true, mtb.ResetOnPrompt, "#C_R3");
  605. Assert.AreEqual (true, mtb.ResetOnSpace, "#C_R4");
  606. Assert.AreEqual ("", mtb.SelectedText, "#C_S1");
  607. Assert.AreEqual (true, mtb.SkipLiterals, "#C_S2");
  608. Assert.AreEqual ("", mtb.Text, "#C_T1");
  609. Assert.AreEqual (HorizontalAlignment.Left, mtb.TextAlign, "#C_T2");
  610. Assert.AreEqual (0, mtb.TextLength, "#C_T3");
  611. Assert.AreEqual (MaskFormat.IncludeLiterals, mtb.TextMaskFormat, "#C_T4");
  612. Assert.AreEqual (false, mtb.UseSystemPasswordChar, "#C_U1");
  613. Assert.IsNull (mtb.ValidatingType, "#C_V1");
  614. Assert.AreEqual (false, mtb.WordWrap, "#C_W1");
  615. }
  616. using (MaskedTextBox mtb = new MaskedTextBox ("abcdefghijklmopqrstuvwxyzABCDEFGHIJKLMOPQRSTUVWXYZ1234567890ÑñæøåÆØÅ!\\ºª\"·$%&/()='?¡¿`^+*´¨Çç-_.:,;}{][")) {
  617. Assert.AreEqual (false, mtb.AcceptsTab, "#D_A1");
  618. Assert.AreEqual (true, mtb.AllowPromptAsInput, "#D_A2");
  619. Assert.AreEqual (false, mtb.AsciiOnly, "#D_A3");
  620. Assert.AreEqual (false, mtb.BeepOnError, "#D_B1");
  621. Assert.AreEqual (false, mtb.CanUndo, "#D_C1");
  622. Assert.IsNotNull (mtb.Culture, "#D_C3");
  623. Assert.AreEqual (Thread.CurrentThread.CurrentCulture.Name, mtb.Culture.Name, "#D_4");
  624. Assert.AreEqual (MaskFormat.IncludeLiterals, mtb.CutCopyMaskFormat, "#D_C5");
  625. Assert.IsNull (mtb.FormatProvider, "#D_F1");
  626. Assert.AreEqual (false, mtb.HidePromptOnLeave, "#D_H1");
  627. Assert.AreEqual (InsertKeyMode.Default, mtb.InsertKeyMode, "#D_I1");
  628. Assert.AreEqual (false, mtb.IsOverwriteMode, "#D_I2");
  629. Assert.AreEqual (1, mtb.Lines.Length, "#D_L1");
  630. Assert.AreEqual ("abcdefghijklmopqrstuvwxyzABCDEFGHIJKLMOPQRSTUVWXYZ1234567890ÑñæøåÆØÅ!\\ºª\"·$%&/()='?¡¿`^+*´¨Çç-_.:,;}{][", mtb.Mask, "#D_M1");
  631. Assert.AreEqual (false, mtb.MaskCompleted, "#D_M2");
  632. Assert.IsNotNull (mtb.MaskedTextProvider, "#D_M3");
  633. Assert.AreEqual (false, mtb.MaskFull, "#D_M4");
  634. Assert.AreEqual (Int16.MaxValue, mtb.MaxLength, "#D_M5");
  635. Assert.AreEqual (false, mtb.Multiline, "#D_M6");
  636. Assert.AreEqual ('\0', mtb.PasswordChar, "#D_P1");
  637. Assert.AreEqual ('_', mtb.PromptChar, "#D_P2");
  638. Assert.AreEqual (false, mtb.ReadOnly, "#D_R1");
  639. Assert.AreEqual (false, mtb.RejectInputOnFirstFailure, "#D_R2");
  640. Assert.AreEqual (true, mtb.ResetOnPrompt, "#D_R3");
  641. Assert.AreEqual (true, mtb.ResetOnSpace, "#D_R4");
  642. Assert.AreEqual ("", mtb.SelectedText, "#D_S1");
  643. Assert.AreEqual (true, mtb.SkipLiterals, "#D_S2");
  644. Assert.AreEqual (" bcdefghijklmopqrstuvwxyz B DEFGHIJK MOPQRSTUVWXYZ12345678 ÑñæøåÆØÅ!ºª\"·$% /()=' ¡¿`^+*´¨Çç-_.:,;}{][", mtb.Text, "#D_T1");
  645. Assert.AreEqual (HorizontalAlignment.Left, mtb.TextAlign, "#D_T2");
  646. Assert.AreEqual (102, mtb.TextLength, "#D_T3");
  647. Assert.AreEqual (MaskFormat.IncludeLiterals, mtb.TextMaskFormat, "#D_T4");
  648. Assert.AreEqual (false, mtb.UseSystemPasswordChar, "#D_U1");
  649. Assert.IsNull (mtb.ValidatingType, "#D_V1");
  650. Assert.AreEqual (false, mtb.WordWrap, "#D_W1");
  651. }
  652. MaskedTextProvider mtp = new MaskedTextProvider ("abcd", CultureInfo.GetCultureInfo ("es-AR"), false, '>', '^', false);
  653. using (MaskedTextBox mtb = new MaskedTextBox (mtp)) {
  654. Assert.AreEqual (false, mtb.AcceptsTab, "#E_A1");
  655. Assert.AreEqual (false, mtb.AllowPromptAsInput, "#E_A2");
  656. Assert.AreEqual (false, mtb.AsciiOnly, "#E_A3");
  657. Assert.AreEqual (false, mtb.BeepOnError, "#E_B1");
  658. Assert.AreEqual (false, mtb.CanUndo, "#E_C1");
  659. Assert.IsNotNull (mtb.Culture, "#E_C3");
  660. Assert.AreEqual ("es-AR", mtb.Culture.Name, "#E_4");
  661. Assert.AreEqual (MaskFormat.IncludeLiterals, mtb.CutCopyMaskFormat, "#E_C5");
  662. Assert.IsNull (mtb.FormatProvider, "#E_F1");
  663. Assert.AreEqual (false, mtb.HidePromptOnLeave, "#E_H1");
  664. Assert.AreEqual (InsertKeyMode.Default, mtb.InsertKeyMode, "#E_I1");
  665. Assert.AreEqual (false, mtb.IsOverwriteMode, "#E_I2");
  666. Assert.AreEqual (1, mtb.Lines.Length, "#E_L1");
  667. Assert.AreEqual ("abcd", mtb.Mask, "#E_M1");
  668. Assert.AreEqual (true, mtb.MaskCompleted, "#E_M2");
  669. Assert.IsNotNull (mtb.MaskedTextProvider, "#E_M3");
  670. Assert.IsFalse (mtb.MaskedTextProvider == mtp, "#E_M3-b");
  671. Assert.AreEqual (false, mtb.MaskFull, "#E_M4");
  672. Assert.AreEqual (Int16.MaxValue, mtb.MaxLength, "#E_M5");
  673. Assert.AreEqual (false, mtb.Multiline, "#E_M6");
  674. Assert.AreEqual ('^', mtb.PasswordChar, "#E_P1");
  675. Assert.AreEqual ('>', mtb.PromptChar, "#E_P2");
  676. Assert.AreEqual (false, mtb.ReadOnly, "#E_R1");
  677. Assert.AreEqual (false, mtb.RejectInputOnFirstFailure, "#E_R2");
  678. Assert.AreEqual (true, mtb.ResetOnPrompt, "#E_R3");
  679. Assert.AreEqual (true, mtb.ResetOnSpace, "#E_R4");
  680. Assert.AreEqual ("", mtb.SelectedText, "#E_S1");
  681. Assert.AreEqual (true, mtb.SkipLiterals, "#E_S2");
  682. Assert.AreEqual (" bcd", mtb.Text, "#E_T1");
  683. Assert.AreEqual (HorizontalAlignment.Left, mtb.TextAlign, "#E_T2");
  684. Assert.AreEqual (4, mtb.TextLength, "#E_T3");
  685. Assert.AreEqual (MaskFormat.IncludeLiterals, mtb.TextMaskFormat, "#E_T4");
  686. Assert.AreEqual (false, mtb.UseSystemPasswordChar, "#E_U1");
  687. Assert.IsNull (mtb.ValidatingType, "#E_V1");
  688. Assert.AreEqual (false, mtb.WordWrap, "#E_W1");
  689. }
  690. }
  691. [Test]
  692. public void UndoTest ()
  693. {
  694. MaskedTextBox mtb;
  695. mtb = new MaskedTextBox ();
  696. mtb.Text = "abcdef";
  697. Assert.AreEqual (false, mtb.CanUndo, "#A0-c");
  698. mtb.Undo ();
  699. Assert.AreEqual ("abcdef", mtb.Text, "#A1");
  700. Assert.AreEqual (false, mtb.CanUndo, "#A1-c");
  701. mtb.Text = "cdef";
  702. mtb.ClearUndo ();
  703. Assert.AreEqual ("cdef", mtb.Text, "#A2");
  704. Assert.AreEqual (false, mtb.CanUndo, "#A2-c");
  705. mtb.Dispose ();
  706. }
  707. [Test]
  708. public void CreateHandleTest ()
  709. {
  710. using (MaskedTextBox mtb = new MaskedTextBox ()) {
  711. Assert.AreEqual (false, mtb.IsHandleCreated, "#A1");
  712. typeof (MaskedTextBox).GetMethod ("CreateHandle", global::System.Reflection.BindingFlags.Instance | global::System.Reflection.BindingFlags.NonPublic).Invoke (mtb, new object [] { });
  713. Assert.AreEqual (true, mtb.IsHandleCreated, "#A2");
  714. }
  715. }
  716. [Test]
  717. public void GetFirstCharIndexFromLineTest ()
  718. {
  719. using (MaskedTextBox mtb = new MaskedTextBox ()) {
  720. for (int i = -100; i < 100; i++) {
  721. Assert.AreEqual (0, mtb.GetFirstCharIndexFromLine (i), "#A" + i.ToString ());
  722. }
  723. mtb.Text = "alñsdh gaph" + Environment.NewLine + "asldg";
  724. for (int i = -100; i < 100; i++) {
  725. Assert.AreEqual (0, mtb.GetFirstCharIndexFromLine (i), "#B" + i.ToString ());
  726. }
  727. }
  728. }
  729. [Test]
  730. public void GetFirstCharIndexOfCurrentLineTest ()
  731. {
  732. using (MaskedTextBox mtb = new MaskedTextBox ()) {
  733. Assert.AreEqual (0, mtb.GetFirstCharIndexOfCurrentLine (), "#A1");
  734. mtb.Text = "alñsdh gaph" + Environment.NewLine + "asldg";
  735. Assert.AreEqual (0, mtb.GetFirstCharIndexOfCurrentLine (), "#B1");
  736. }
  737. }
  738. [Test]
  739. public void GetLineFromCharIndexTest ()
  740. {
  741. using (MaskedTextBox mtb = new MaskedTextBox ()) {
  742. for (int i = -100; i < 100; i++) {
  743. Assert.AreEqual (0, mtb.GetLineFromCharIndex (i), "#A" + i.ToString ());
  744. }
  745. mtb.Text = "alñsdh gaph" + Environment.NewLine + "asldg";
  746. for (int i = -100; i < 100; i++) {
  747. Assert.AreEqual (0, mtb.GetLineFromCharIndex (i), "#B" + i.ToString ());
  748. }
  749. }
  750. }
  751. [Test]
  752. public void IsInputKeyTest ()
  753. {
  754. using (Form f = new Form ()) {
  755. using (MaskedTextBox mtb = new MaskedTextBox ()) {
  756. f.Controls.Add (mtb);
  757. f.Show ();
  758. MethodInfo IsInputKey = typeof (MaskedTextBox).GetMethod ("IsInputKey", global::System.Reflection.BindingFlags.NonPublic | global::System.Reflection.BindingFlags.Instance);
  759. for (int i = 0; i <= 0xFF; i++) {
  760. Keys key = (Keys) i;
  761. Keys key_ALT = key | Keys.Alt;
  762. Keys key_SHIFT = key | Keys.Shift;
  763. Keys key_CTRL = key | Keys.Control;
  764. Keys key_ALT_SHIFT = key | Keys.Alt | Keys.Shift;
  765. Keys key_ALT_CTRL = key | Keys.Alt | Keys.Control;
  766. Keys key_SHIFT_CTLR = key | Keys.Shift | Keys.Control;
  767. Keys key_ALT_SHIFT_CTLR = key | Keys.Alt | Keys.Shift | Keys.Control;
  768. bool is_input = false;
  769. switch (key) {
  770. case Keys.PageDown:
  771. case Keys.PageUp:
  772. case Keys.End:
  773. case Keys.Home:
  774. case Keys.Left:
  775. case Keys.Right:
  776. case Keys.Up:
  777. case Keys.Down:
  778. is_input = true;
  779. break;
  780. }
  781. Assert.AreEqual (is_input, (bool)IsInputKey.Invoke (mtb, new object [] { key }));
  782. Assert.AreEqual (false, (bool)IsInputKey.Invoke (mtb, new object [] { key_ALT }));
  783. Assert.AreEqual (is_input, (bool)IsInputKey.Invoke (mtb, new object [] { key_SHIFT }));
  784. Assert.AreEqual (is_input, (bool)IsInputKey.Invoke (mtb, new object [] { key_CTRL }));
  785. Assert.AreEqual (false, (bool)IsInputKey.Invoke (mtb, new object [] { key_ALT_SHIFT }));
  786. Assert.AreEqual (false, (bool)IsInputKey.Invoke (mtb, new object [] { key_ALT_CTRL }));
  787. Assert.AreEqual (is_input, (bool)IsInputKey.Invoke (mtb, new object [] { key_SHIFT_CTLR }));
  788. Assert.AreEqual (false, (bool)IsInputKey.Invoke (mtb, new object [] { key_ALT_SHIFT_CTLR }));
  789. }
  790. }
  791. }
  792. }
  793. [Test]
  794. public void ValidateTextTest ()
  795. {
  796. Assert.Ignore ("Pending implementation");
  797. }
  798. [Test]
  799. public void ToStringTest ()
  800. {
  801. Assert.Ignore ("Pending implementation");
  802. }
  803. }
  804. }
  805. #endif