MessageBoxTests.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577
  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 += (s, a) => {
  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 += (s, a) => {
  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 += (s, a) => {
  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 += (s, a) => {
  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 += (s, a) => {
  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 += (s, a) => {
  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. var btn = $"{CM.Glyphs.LeftBracket}{CM.Glyphs.LeftDefaultIndicator} Ok {CM.Glyphs.RightDefaultIndicator}{CM.Glyphs.RightBracket}";
  175. ((FakeDriver)Application.Driver).SetBufferSize (40 + 4, 8);
  176. Application.Iteration += (s, a) => {
  177. iterations++;
  178. if (iterations == 0) {
  179. MessageBox.Query (string.Empty, message, "_Ok");
  180. Application.RequestStop ();
  181. } else if (iterations == 1) {
  182. Application.Refresh ();
  183. TestHelpers.AssertDriverContentsWithFrameAre (@$"
  184. ╔══════════════════════════════════════════╗
  185. ║┌────────────────────────────────────────┐║
  186. ║│0123456789012345678901234567890123456789│║
  187. ║│ https://github.com/gui-cs/Terminal.Gui │║
  188. ║│ │║
  189. ║│ {btn} │║
  190. ║└────────────────────────────────────────┘║
  191. ╚══════════════════════════════════════════╝
  192. ", output);
  193. Application.RequestStop ();
  194. }
  195. };
  196. Application.Run ();
  197. }
  198. [Fact, AutoInitShutdown]
  199. public void Size_Tiny_Fixed_Size ()
  200. {
  201. var iterations = -1;
  202. Application.Begin (Application.Top);
  203. Application.Iteration += (s, a) => {
  204. iterations++;
  205. if (iterations == 0) {
  206. MessageBox.Query (7, 5, string.Empty, "Message", "_Ok");
  207. Application.RequestStop ();
  208. } else if (iterations == 1) {
  209. Application.Refresh ();
  210. Assert.Equal (new Size (7, 5), Application.Current.Frame.Size);
  211. TestHelpers.AssertDriverContentsWithFrameAre (@$"
  212. ┌─────┐
  213. │Messa│
  214. │ ge │
  215. │ Ok {CM.Glyphs.RightDefaultIndicator}│
  216. └─────┘
  217. ", output);
  218. Application.RequestStop ();
  219. }
  220. };
  221. Application.Run ();
  222. }
  223. [Fact, AutoInitShutdown]
  224. public void Size_JustBigEnough_Fixed_Size ()
  225. {
  226. var iterations = -1;
  227. Application.Begin (Application.Top);
  228. var btn = $"{CM.Glyphs.LeftBracket}{CM.Glyphs.LeftDefaultIndicator} Ok {CM.Glyphs.RightDefaultIndicator}{CM.Glyphs.RightBracket}";
  229. Application.Iteration += (s, a) => {
  230. iterations++;
  231. if (iterations == 0) {
  232. MessageBox.Query (11, 5, string.Empty, "Message", "_Ok");
  233. Application.RequestStop ();
  234. } else if (iterations == 1) {
  235. Application.Refresh ();
  236. TestHelpers.AssertDriverContentsWithFrameAre (@$"
  237. ┌─────────┐
  238. │ Message │
  239. │ │
  240. │{btn} │
  241. └─────────┘
  242. ", output);
  243. Application.RequestStop ();
  244. }
  245. };
  246. Application.Run ();
  247. }
  248. [Fact, AutoInitShutdown]
  249. public void Message_Long_Without_Spaces_WrapMessage_True ()
  250. {
  251. var iterations = -1;
  252. Application.Begin (Application.Top);
  253. Application.Top.BorderStyle = LineStyle.Double;
  254. ((FakeDriver)Application.Driver).SetBufferSize (20, 10);
  255. var btn = $"{CM.Glyphs.LeftBracket}{CM.Glyphs.LeftDefaultIndicator} btn {CM.Glyphs.RightDefaultIndicator}{CM.Glyphs.RightBracket}";
  256. Application.Iteration += (s, a) => {
  257. iterations++;
  258. if (iterations == 0) {
  259. // 50 characters should make the height of the wrapped text 7
  260. MessageBox.Query (string.Empty, new string ('f', 50), defaultButton: 0, wrapMessage: true, "btn");
  261. Application.RequestStop ();
  262. } else if (iterations == 1) {
  263. Application.Refresh ();
  264. TestHelpers.AssertDriverContentsWithFrameAre (@$"
  265. ╔══════════════════╗
  266. ║┌────────────────┐║
  267. ║│ffffffffffffffff│║
  268. ║│ffffffffffffffff│║
  269. ║│ffffffffffffffff│║
  270. ║│ ff │║
  271. ║│ │║
  272. ║│ {btn} │║
  273. ║└────────────────┘║
  274. ╚══════════════════╝", output);
  275. Assert.Equal (new Size (20 - 2, 10 - 2), Application.Current.Frame.Size);
  276. Application.RequestStop ();
  277. // Really long text
  278. MessageBox.Query (string.Empty, new string ('f', 500), defaultButton: 0, wrapMessage: true, "btn");
  279. } else if (iterations == 2) {
  280. Application.Refresh ();
  281. TestHelpers.AssertDriverContentsWithFrameAre (@$"
  282. ╔┌────────────────┐╗
  283. ║│ffffffffffffffff│║
  284. ║│ffffffffffffffff│║
  285. ║│ffffffffffffffff│║
  286. ║│ffffffffffffffff│║
  287. ║│ffffffffffffffff│║
  288. ║│ffffffffffffffff│║
  289. ║│ffffffffffffffff│║
  290. ║│ {btn} │║
  291. ╚└────────────────┘╝", output);
  292. Application.RequestStop ();
  293. }
  294. };
  295. Application.Run ();
  296. }
  297. [Fact, AutoInitShutdown]
  298. public void Message_With_Spaces_WrapMessage_True ()
  299. {
  300. var iterations = -1;
  301. Application.Begin (Application.Top);
  302. Application.Top.BorderStyle = LineStyle.Double;
  303. ((FakeDriver)Application.Driver).SetBufferSize (20, 10);
  304. var btn = $"{CM.Glyphs.LeftBracket}{CM.Glyphs.LeftDefaultIndicator} btn {CM.Glyphs.RightDefaultIndicator}{CM.Glyphs.RightBracket}";
  305. Application.Iteration += (s, a) => {
  306. iterations++;
  307. if (iterations == 0) {
  308. var sb = new StringBuilder ();
  309. for (int i = 0; i < 17; i++)
  310. sb.Append ("ff ");
  311. MessageBox.Query (string.Empty, sb.ToString (), defaultButton: 0, wrapMessage: true, "btn");
  312. Application.RequestStop ();
  313. } else if (iterations == 1) {
  314. Application.Refresh ();
  315. TestHelpers.AssertDriverContentsWithFrameAre (@$"
  316. ╔══════════════════╗
  317. ║ ┌──────────────┐ ║
  318. ║ │ff ff ff ff ff│ ║
  319. ║ │ff ff ff ff ff│ ║
  320. ║ │ff ff ff ff ff│ ║
  321. ║ │ ff ff │ ║
  322. ║ │ │ ║
  323. ║ │ {btn} │ ║
  324. ║ └──────────────┘ ║
  325. ╚══════════════════╝", output);
  326. Application.RequestStop ();
  327. // Really long text
  328. MessageBox.Query (string.Empty, new string ('f', 500), defaultButton: 0, wrapMessage: true, "btn");
  329. } else if (iterations == 2) {
  330. Application.Refresh ();
  331. TestHelpers.AssertDriverContentsWithFrameAre (@$"
  332. ╔┌────────────────┐╗
  333. ║│ffffffffffffffff│║
  334. ║│ffffffffffffffff│║
  335. ║│ffffffffffffffff│║
  336. ║│ffffffffffffffff│║
  337. ║│ffffffffffffffff│║
  338. ║│ffffffffffffffff│║
  339. ║│ffffffffffffffff│║
  340. ║│ {btn} │║
  341. ╚└────────────────┘╝", output);
  342. Application.RequestStop ();
  343. }
  344. };
  345. Application.Run ();
  346. }
  347. [Fact, AutoInitShutdown]
  348. public void Message_Without_Spaces_WrapMessage_False ()
  349. {
  350. var iterations = -1;
  351. Application.Begin (Application.Top);
  352. Application.Top.BorderStyle = LineStyle.Double;
  353. ((FakeDriver)Application.Driver).SetBufferSize (20, 10);
  354. var btn = $"{CM.Glyphs.LeftBracket}{CM.Glyphs.LeftDefaultIndicator} btn {CM.Glyphs.RightDefaultIndicator}{CM.Glyphs.RightBracket}";
  355. Application.Iteration += (s, a) => {
  356. iterations++;
  357. if (iterations == 0) {
  358. MessageBox.Query (string.Empty, new string ('f', 50), defaultButton: 0, wrapMessage: true, "btn");
  359. Application.RequestStop ();
  360. } else if (iterations == 1) {
  361. Application.Refresh ();
  362. TestHelpers.AssertDriverContentsWithFrameAre (@$"
  363. ╔══════════════════╗
  364. ║┌────────────────┐║
  365. ║│ffffffffffffffff│║
  366. ║│ffffffffffffffff│║
  367. ║│ffffffffffffffff│║
  368. ║│ ff │║
  369. ║│ │║
  370. ║│ {btn} │║
  371. ║└────────────────┘║
  372. ╚══════════════════╝", output);
  373. Application.RequestStop ();
  374. // Really long text
  375. MessageBox.Query (string.Empty, new string ('f', 500), defaultButton: 0, wrapMessage: true, "btn");
  376. } else if (iterations == 2) {
  377. Application.Refresh ();
  378. TestHelpers.AssertDriverContentsWithFrameAre (@$"
  379. ╔┌────────────────┐╗
  380. ║│ffffffffffffffff│║
  381. ║│ffffffffffffffff│║
  382. ║│ffffffffffffffff│║
  383. ║│ffffffffffffffff│║
  384. ║│ffffffffffffffff│║
  385. ║│ffffffffffffffff│║
  386. ║│ffffffffffffffff│║
  387. ║│ {btn} │║
  388. ╚└────────────────┘╝", output);
  389. Application.RequestStop ();
  390. }
  391. };
  392. Application.Run ();
  393. }
  394. [Fact, AutoInitShutdown]
  395. public void Message_With_Spaces_WrapMessage_False ()
  396. {
  397. var iterations = -1;
  398. Application.Begin (Application.Top);
  399. Application.Top.BorderStyle = LineStyle.Double;
  400. ((FakeDriver)Application.Driver).SetBufferSize (20, 10);
  401. var btn = $"{CM.Glyphs.LeftBracket}{CM.Glyphs.LeftDefaultIndicator} btn {CM.Glyphs.RightDefaultIndicator}{CM.Glyphs.RightBracket}";
  402. Application.Iteration += (s, a) => {
  403. iterations++;
  404. if (iterations == 0) {
  405. var sb = new StringBuilder ();
  406. for (int i = 0; i < 17; i++)
  407. sb.Append ("ff ");
  408. MessageBox.Query (string.Empty, sb.ToString (), defaultButton: 0, wrapMessage: false, "btn");
  409. Application.RequestStop ();
  410. } else if (iterations == 1) {
  411. Application.Refresh ();
  412. TestHelpers.AssertDriverContentsWithFrameAre (@$"
  413. ╔══════════════════╗
  414. ║ ┌──────────────┐ ║
  415. ║ │ff ff ff ff ff│ ║
  416. ║ │ff ff ff ff ff│ ║
  417. ║ │ff ff ff ff ff│ ║
  418. ║ │ ff ff │ ║
  419. ║ │ │ ║
  420. ║ │ {btn} │ ║
  421. ║ └──────────────┘ ║
  422. ╚══════════════════╝", output);
  423. Application.RequestStop ();
  424. // Really long text
  425. MessageBox.Query (string.Empty, new string ('f', 500), defaultButton: 0, wrapMessage: false, "btn");
  426. } else if (iterations == 2) {
  427. Application.Refresh ();
  428. TestHelpers.AssertDriverContentsWithFrameAre (@$"
  429. ╔┌────────────────┐╗
  430. ║│ffffffffffffffff│║
  431. ║│ffffffffffffffff│║
  432. ║│ffffffffffffffff│║
  433. ║│ffffffffffffffff│║
  434. ║│ffffffffffffffff│║
  435. ║│ffffffffffffffff│║
  436. ║│ffffffffffffffff│║
  437. ║│ {btn} │║
  438. ╚└────────────────┘╝", output);
  439. Application.RequestStop ();
  440. }
  441. };
  442. Application.Run ();
  443. }
  444. [Theory, AutoInitShutdown]
  445. [InlineData (" ", true)]
  446. [InlineData (" ", false)]
  447. [InlineData ("", true)]
  448. [InlineData ("", false)]
  449. [InlineData ("\n", true)]
  450. [InlineData ("\n", false)]
  451. [InlineData (" \n", true)]
  452. [InlineData (" \n", false)]
  453. public void Message_Empty_Or_A_NewLline_WrapMessagge_True_Or_False (string message, bool wrapMessage)
  454. {
  455. var iterations = -1;
  456. Application.Begin (Application.Top);
  457. Application.Iteration += (s, a) => {
  458. iterations++;
  459. if (iterations == 0) {
  460. MessageBox.Query (string.Empty, message, 0, wrapMessage, "ok");
  461. Application.RequestStop ();
  462. } else if (iterations == 1) {
  463. Application.Refresh ();
  464. TestHelpers.AssertDriverContentsWithFrameAre (@$"
  465. ┌──────────────────────────────────────────────┐
  466. │ │
  467. │ │
  468. │ {CM.Glyphs.LeftBracket}{CM.Glyphs.LeftDefaultIndicator} ok {CM.Glyphs.RightDefaultIndicator}{CM.Glyphs.RightBracket} │
  469. └──────────────────────────────────────────────┘", output);
  470. Application.RequestStop ();
  471. }
  472. };
  473. Application.Run ();
  474. }
  475. }
  476. }