MessageBoxTests.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571
  1. using System.Threading.Tasks;
  2. using Xunit;
  3. using Xunit.Abstractions;
  4. using System.Text;
  5. using Terminal.Gui;
  6. using Microsoft.VisualStudio.TestPlatform.CommunicationUtilities;
  7. namespace Terminal.Gui.DialogTests {
  8. public class MessageBoxTests {
  9. readonly ITestOutputHelper output;
  10. public MessageBoxTests (ITestOutputHelper output)
  11. {
  12. this.output = output;
  13. }
  14. [Fact]
  15. [AutoInitShutdown]
  16. public void Size_Default ()
  17. {
  18. var iterations = -1;
  19. Application.Begin (Application.Top);
  20. ((FakeDriver)Application.Driver).SetBufferSize (100, 100);
  21. Application.Iteration += () => {
  22. iterations++;
  23. if (iterations == 0) {
  24. MessageBox.Query (string.Empty, string.Empty, null);
  25. Application.RequestStop ();
  26. } else if (iterations == 1) {
  27. Application.Refresh ();
  28. Assert.IsType<Dialog> (Application.Current);
  29. // Default size is Percent(60)
  30. Assert.Equal (new Size ((int)(100 * .60), 5), Application.Current.Frame.Size);
  31. Application.RequestStop ();
  32. }
  33. };
  34. Application.Run ();
  35. }
  36. [Fact]
  37. [AutoInitShutdown]
  38. public void Location_Default ()
  39. {
  40. var iterations = -1;
  41. Application.Begin (Application.Top);
  42. ((FakeDriver)Application.Driver).SetBufferSize (100, 100);
  43. Application.Iteration += () => {
  44. iterations++;
  45. if (iterations == 0) {
  46. MessageBox.Query (string.Empty, string.Empty, null);
  47. Application.RequestStop ();
  48. } else if (iterations == 1) {
  49. Application.Refresh ();
  50. Assert.IsType<Dialog> (Application.Current);
  51. // Default location is centered, so
  52. // X = (100 / 2) - (60 / 2) = 20
  53. // Y = (100 / 2) - (5 / 2) = 47
  54. Assert.Equal (new Point (20, 47), Application.Current.Frame.Location);
  55. Application.RequestStop ();
  56. }
  57. };
  58. Application.Run ();
  59. }
  60. [Theory]
  61. [InlineData (0, 0)]
  62. [InlineData (1, 1)]
  63. [InlineData (7, 5)]
  64. [InlineData (50, 50)]
  65. [AutoInitShutdown]
  66. public void Size_Not_Default_No_Message (int height, int width)
  67. {
  68. var iterations = -1;
  69. Application.Begin (Application.Top);
  70. ((FakeDriver)Application.Driver).SetBufferSize (100, 100);
  71. Application.Iteration += () => {
  72. iterations++;
  73. if (iterations == 0) {
  74. MessageBox.Query (height, width, string.Empty, string.Empty, null);
  75. Application.RequestStop ();
  76. } else if (iterations == 1) {
  77. Application.Refresh ();
  78. Assert.IsType<Dialog> (Application.Current);
  79. Assert.Equal (new Size (height, width), Application.Current.Frame.Size);
  80. Application.RequestStop ();
  81. }
  82. };
  83. }
  84. [Theory]
  85. [InlineData (0, 0, "1")]
  86. [InlineData (1, 1, "1")]
  87. [InlineData (7, 5, "1")]
  88. [InlineData (50, 50, "1")]
  89. [InlineData (0, 0, "message")]
  90. [InlineData (1, 1, "message")]
  91. [InlineData (7, 5, "message")]
  92. [InlineData (50, 50, "message")]
  93. [AutoInitShutdown]
  94. public void Size_Not_Default_Message (int height, int width, string message)
  95. {
  96. var iterations = -1;
  97. Application.Begin (Application.Top);
  98. ((FakeDriver)Application.Driver).SetBufferSize (100, 100);
  99. Application.Iteration += () => {
  100. iterations++;
  101. if (iterations == 0) {
  102. MessageBox.Query (height, width, string.Empty, message, null);
  103. Application.RequestStop ();
  104. } else if (iterations == 1) {
  105. Application.Refresh ();
  106. Assert.IsType<Dialog> (Application.Current);
  107. Assert.Equal (new Size (height, width), Application.Current.Frame.Size);
  108. Application.RequestStop ();
  109. }
  110. };
  111. }
  112. [Theory]
  113. [InlineData (0, 0, "1")]
  114. [InlineData (1, 1, "1")]
  115. [InlineData (7, 5, "1")]
  116. [InlineData (50, 50, "1")]
  117. [InlineData (0, 0, "message")]
  118. [InlineData (1, 1, "message")]
  119. [InlineData (7, 5, "message")]
  120. [InlineData (50, 50, "message")]
  121. [AutoInitShutdown]
  122. public void Size_Not_Default_Message_Button (int height, int width, string message)
  123. {
  124. var iterations = -1;
  125. Application.Begin (Application.Top);
  126. ((FakeDriver)Application.Driver).SetBufferSize (100, 100);
  127. Application.Iteration += () => {
  128. iterations++;
  129. if (iterations == 0) {
  130. MessageBox.Query (height, width, string.Empty, message, "_Ok");
  131. Application.RequestStop ();
  132. } else if (iterations == 1) {
  133. Application.Refresh ();
  134. Assert.IsType<Dialog> (Application.Current);
  135. Assert.Equal (new Size (height, width), Application.Current.Frame.Size);
  136. Application.RequestStop ();
  137. }
  138. };
  139. }
  140. [Fact, AutoInitShutdown]
  141. public void Size_None_No_Buttons ()
  142. {
  143. var iterations = -1;
  144. Application.Begin (Application.Top);
  145. Application.Iteration += () => {
  146. iterations++;
  147. if (iterations == 0) {
  148. MessageBox.Query ("Title", "Message");
  149. Application.RequestStop ();
  150. } else if (iterations == 1) {
  151. Application.Refresh ();
  152. TestHelpers.AssertDriverContentsWithFrameAre (@"
  153. ┌┤Title├───────────────────────────────────────┐
  154. │ Message │
  155. │ │
  156. │ │
  157. └──────────────────────────────────────────────┘
  158. ", output);
  159. Application.RequestStop ();
  160. }
  161. };
  162. Application.Run ();
  163. }
  164. [Fact, AutoInitShutdown]
  165. public void Size_No_With_Button ()
  166. {
  167. Application.Top.BorderStyle = LineStyle.Double;
  168. var iterations = -1;
  169. Application.Begin (Application.Top);
  170. var aboutMessage = new StringBuilder ();
  171. aboutMessage.AppendLine (@"0123456789012345678901234567890123456789");
  172. aboutMessage.AppendLine (@"https://github.com/gui-cs/Terminal.Gui");
  173. var message = aboutMessage.ToString ();
  174. ((FakeDriver)Application.Driver).SetBufferSize (40 + 4, 8);
  175. Application.Iteration += () => {
  176. iterations++;
  177. if (iterations == 0) {
  178. MessageBox.Query (string.Empty, message, "_Ok");
  179. Application.RequestStop ();
  180. } else if (iterations == 1) {
  181. Application.Refresh ();
  182. TestHelpers.AssertDriverContentsWithFrameAre (@"
  183. ╔══════════════════════════════════════════╗
  184. ║┌────────────────────────────────────────┐║
  185. ║│0123456789012345678901234567890123456789│║
  186. ║│ https://github.com/gui-cs/Terminal.Gui │║
  187. ║│ │║
  188. ║│ [◦ Ok ◦] │║
  189. ║└────────────────────────────────────────┘║
  190. ╚══════════════════════════════════════════╝
  191. ", output);
  192. Application.RequestStop ();
  193. }
  194. };
  195. Application.Run ();
  196. }
  197. [Fact, AutoInitShutdown]
  198. public void Size_Tiny_Fixed_Size ()
  199. {
  200. var iterations = -1;
  201. Application.Begin (Application.Top);
  202. Application.Iteration += () => {
  203. iterations++;
  204. if (iterations == 0) {
  205. MessageBox.Query (7, 5, string.Empty, "Message", "_Ok");
  206. Application.RequestStop ();
  207. } else if (iterations == 1) {
  208. Application.Refresh ();
  209. Assert.Equal (new Size (7, 5), Application.Current.Frame.Size);
  210. TestHelpers.AssertDriverContentsWithFrameAre (@"
  211. ┌─────┐
  212. │Messa│
  213. │ ge │
  214. │ Ok ◦│
  215. └─────┘
  216. ", output);
  217. Application.RequestStop ();
  218. }
  219. };
  220. Application.Run ();
  221. }
  222. [Fact, AutoInitShutdown]
  223. public void Size_JustBigEnough_Fixed_Size ()
  224. {
  225. var iterations = -1;
  226. Application.Begin (Application.Top);
  227. Application.Iteration += () => {
  228. iterations++;
  229. if (iterations == 0) {
  230. MessageBox.Query (11, 5, string.Empty, "Message", "_Ok");
  231. Application.RequestStop ();
  232. } else if (iterations == 1) {
  233. Application.Refresh ();
  234. TestHelpers.AssertDriverContentsWithFrameAre (@"
  235. ┌─────────┐
  236. │ Message │
  237. │ │
  238. │[◦ Ok ◦] │
  239. └─────────┘
  240. ", output);
  241. Application.RequestStop ();
  242. }
  243. };
  244. Application.Run ();
  245. }
  246. [Fact, AutoInitShutdown]
  247. public void Message_Long_Without_Spaces_WrapMessage_True ()
  248. {
  249. var iterations = -1;
  250. Application.Begin (Application.Top);
  251. Application.Top.BorderStyle = LineStyle.Double;
  252. ((FakeDriver)Application.Driver).SetBufferSize (20, 10);
  253. Application.Iteration += () => {
  254. iterations++;
  255. if (iterations == 0) {
  256. // 50 characters should make the height of the wrapped text 7
  257. MessageBox.Query (string.Empty, new string ('f', 50), defaultButton: 0, wrapMessage: true, "btn");
  258. Application.RequestStop ();
  259. } else if (iterations == 1) {
  260. Application.Refresh ();
  261. TestHelpers.AssertDriverContentsWithFrameAre (@"
  262. ╔══════════════════╗
  263. ║┌────────────────┐║
  264. ║│ffffffffffffffff│║
  265. ║│ffffffffffffffff│║
  266. ║│ffffffffffffffff│║
  267. ║│ ff │║
  268. ║│ │║
  269. ║│ [◦ btn ◦] │║
  270. ║└────────────────┘║
  271. ╚══════════════════╝", output);
  272. Assert.Equal (new Size (20 - 2, 10 - 2), Application.Current.Frame.Size);
  273. Application.RequestStop ();
  274. // Really long text
  275. MessageBox.Query (string.Empty, new string ('f', 500), defaultButton: 0, wrapMessage: true, "btn");
  276. } else if (iterations == 2) {
  277. Application.Refresh ();
  278. TestHelpers.AssertDriverContentsWithFrameAre (@"
  279. ╔┌────────────────┐╗
  280. ║│ffffffffffffffff│║
  281. ║│ffffffffffffffff│║
  282. ║│ffffffffffffffff│║
  283. ║│ffffffffffffffff│║
  284. ║│ffffffffffffffff│║
  285. ║│ffffffffffffffff│║
  286. ║│ffffffffffffffff│║
  287. ║│ [◦ btn ◦] │║
  288. ╚└────────────────┘╝", output);
  289. Application.RequestStop ();
  290. }
  291. };
  292. Application.Run ();
  293. }
  294. [Fact, AutoInitShutdown]
  295. public void Message_With_Spaces_WrapMessage_True ()
  296. {
  297. var iterations = -1;
  298. Application.Begin (Application.Top);
  299. Application.Top.BorderStyle = LineStyle.Double;
  300. ((FakeDriver)Application.Driver).SetBufferSize (20, 10);
  301. Application.Iteration += () => {
  302. iterations++;
  303. if (iterations == 0) {
  304. var sb = new StringBuilder ();
  305. for (int i = 0; i < 17; i++)
  306. sb.Append ("ff ");
  307. MessageBox.Query (string.Empty, sb.ToString (), defaultButton: 0, wrapMessage: true, "btn");
  308. Application.RequestStop ();
  309. } else if (iterations == 1) {
  310. Application.Refresh ();
  311. TestHelpers.AssertDriverContentsWithFrameAre (@"
  312. ╔══════════════════╗
  313. ║ ┌──────────────┐ ║
  314. ║ │ff ff ff ff ff│ ║
  315. ║ │ff ff ff ff ff│ ║
  316. ║ │ff ff ff ff ff│ ║
  317. ║ │ ff ff │ ║
  318. ║ │ │ ║
  319. ║ │ [◦ btn ◦] │ ║
  320. ║ └──────────────┘ ║
  321. ╚══════════════════╝", output);
  322. Application.RequestStop ();
  323. // Really long text
  324. MessageBox.Query (string.Empty, new string ('f', 500), defaultButton: 0, wrapMessage: true, "btn");
  325. } else if (iterations == 2) {
  326. Application.Refresh ();
  327. TestHelpers.AssertDriverContentsWithFrameAre (@"
  328. ╔┌────────────────┐╗
  329. ║│ffffffffffffffff│║
  330. ║│ffffffffffffffff│║
  331. ║│ffffffffffffffff│║
  332. ║│ffffffffffffffff│║
  333. ║│ffffffffffffffff│║
  334. ║│ffffffffffffffff│║
  335. ║│ffffffffffffffff│║
  336. ║│ [◦ btn ◦] │║
  337. ╚└────────────────┘╝", output);
  338. Application.RequestStop ();
  339. }
  340. };
  341. Application.Run ();
  342. }
  343. [Fact, AutoInitShutdown]
  344. public void Message_Without_Spaces_WrapMessage_False ()
  345. {
  346. var iterations = -1;
  347. Application.Begin (Application.Top);
  348. Application.Top.BorderStyle = LineStyle.Double;
  349. ((FakeDriver)Application.Driver).SetBufferSize (20, 10);
  350. Application.Iteration += () => {
  351. iterations++;
  352. if (iterations == 0) {
  353. MessageBox.Query (string.Empty, new string ('f', 50), defaultButton: 0, wrapMessage: true, "btn");
  354. Application.RequestStop ();
  355. } else if (iterations == 1) {
  356. Application.Refresh ();
  357. TestHelpers.AssertDriverContentsWithFrameAre (@"
  358. ╔══════════════════╗
  359. ║┌────────────────┐║
  360. ║│ffffffffffffffff│║
  361. ║│ffffffffffffffff│║
  362. ║│ffffffffffffffff│║
  363. ║│ ff │║
  364. ║│ │║
  365. ║│ [◦ btn ◦] │║
  366. ║└────────────────┘║
  367. ╚══════════════════╝", output);
  368. Application.RequestStop ();
  369. // Really long text
  370. MessageBox.Query (string.Empty, new string ('f', 500), defaultButton: 0, wrapMessage: true, "btn");
  371. } else if (iterations == 2) {
  372. Application.Refresh ();
  373. TestHelpers.AssertDriverContentsWithFrameAre (@"
  374. ╔┌────────────────┐╗
  375. ║│ffffffffffffffff│║
  376. ║│ffffffffffffffff│║
  377. ║│ffffffffffffffff│║
  378. ║│ffffffffffffffff│║
  379. ║│ffffffffffffffff│║
  380. ║│ffffffffffffffff│║
  381. ║│ffffffffffffffff│║
  382. ║│ [◦ btn ◦] │║
  383. ╚└────────────────┘╝", output);
  384. Application.RequestStop ();
  385. }
  386. };
  387. Application.Run ();
  388. }
  389. [Fact, AutoInitShutdown]
  390. public void Message_With_Spaces_WrapMessage_False ()
  391. {
  392. var iterations = -1;
  393. Application.Begin (Application.Top);
  394. Application.Top.BorderStyle = LineStyle.Double;
  395. ((FakeDriver)Application.Driver).SetBufferSize (20, 10);
  396. Application.Iteration += () => {
  397. iterations++;
  398. if (iterations == 0) {
  399. var sb = new StringBuilder ();
  400. for (int i = 0; i < 17; i++)
  401. sb.Append ("ff ");
  402. MessageBox.Query (string.Empty, sb.ToString (), defaultButton: 0, wrapMessage: false, "btn");
  403. Application.RequestStop ();
  404. } else if (iterations == 1) {
  405. Application.Refresh ();
  406. TestHelpers.AssertDriverContentsWithFrameAre (@"
  407. ╔══════════════════╗
  408. ║ ┌──────────────┐ ║
  409. ║ │ff ff ff ff ff│ ║
  410. ║ │ff ff ff ff ff│ ║
  411. ║ │ff ff ff ff ff│ ║
  412. ║ │ ff ff │ ║
  413. ║ │ │ ║
  414. ║ │ [◦ btn ◦] │ ║
  415. ║ └──────────────┘ ║
  416. ╚══════════════════╝", output);
  417. Application.RequestStop ();
  418. // Really long text
  419. MessageBox.Query (string.Empty, new string ('f', 500), defaultButton: 0, wrapMessage: false, "btn");
  420. } else if (iterations == 2) {
  421. Application.Refresh ();
  422. TestHelpers.AssertDriverContentsWithFrameAre (@"
  423. ╔┌────────────────┐╗
  424. ║│ffffffffffffffff│║
  425. ║│ffffffffffffffff│║
  426. ║│ffffffffffffffff│║
  427. ║│ffffffffffffffff│║
  428. ║│ffffffffffffffff│║
  429. ║│ffffffffffffffff│║
  430. ║│ffffffffffffffff│║
  431. ║│ [◦ btn ◦] │║
  432. ╚└────────────────┘╝", output);
  433. Application.RequestStop ();
  434. }
  435. };
  436. Application.Run ();
  437. }
  438. [Theory, AutoInitShutdown]
  439. [InlineData (" ", true)]
  440. [InlineData (" ", false)]
  441. [InlineData ("", true)]
  442. [InlineData ("", false)]
  443. [InlineData ("\n", true)]
  444. [InlineData ("\n", false)]
  445. [InlineData (" \n", true)]
  446. [InlineData (" \n", false)]
  447. public void Message_Empty_Or_A_NewLline_WrapMessagge_True_Or_False (string message, bool wrapMessage)
  448. {
  449. var iterations = -1;
  450. Application.Begin (Application.Top);
  451. Application.Iteration += () => {
  452. iterations++;
  453. if (iterations == 0) {
  454. MessageBox.Query (string.Empty, message, 0, wrapMessage, "ok");
  455. Application.RequestStop ();
  456. } else if (iterations == 1) {
  457. Application.Refresh ();
  458. TestHelpers.AssertDriverContentsWithFrameAre (@"
  459. ┌──────────────────────────────────────────────┐
  460. │ │
  461. │ │
  462. │ [◦ ok ◦] │
  463. └──────────────────────────────────────────────┘", output);
  464. Application.RequestStop ();
  465. }
  466. };
  467. Application.Run ();
  468. }
  469. }
  470. }