MessageBoxTests.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587
  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: false, "btn");
  359. Application.RequestStop ();
  360. } else if (iterations == 1) {
  361. Application.Refresh ();
  362. TestHelpers.AssertDriverContentsWithFrameAre (@$"
  363. ╔══════════════════╗
  364. ║ ║
  365. ────────────────────
  366. ffffffffffffffffffff
  367. ⟦► btn ◄⟧
  368. ────────────────────
  369. ║ ║
  370. ║ ║
  371. ╚══════════════════╝", output);
  372. Application.RequestStop ();
  373. // Really long text
  374. MessageBox.Query (string.Empty, new string ('f', 500), defaultButton: 0, wrapMessage: false, "btn");
  375. } else if (iterations == 2) {
  376. Application.Refresh ();
  377. TestHelpers.AssertDriverContentsWithFrameAre (@$"
  378. ╔══════════════════╗
  379. ║ ║
  380. ────────────────────
  381. ffffffffffffffffffff
  382. ⟦► btn ◄⟧
  383. ────────────────────
  384. ║ ║
  385. ║ ║
  386. ╚══════════════════╝", output);
  387. Application.RequestStop ();
  388. }
  389. };
  390. Application.Run ();
  391. }
  392. [Fact, AutoInitShutdown]
  393. public void Message_With_Spaces_WrapMessage_False ()
  394. {
  395. var iterations = -1;
  396. Application.Begin (Application.Top);
  397. Application.Top.BorderStyle = LineStyle.Double;
  398. ((FakeDriver)Application.Driver).SetBufferSize (20, 10);
  399. var btn = $"{CM.Glyphs.LeftBracket}{CM.Glyphs.LeftDefaultIndicator} btn {CM.Glyphs.RightDefaultIndicator}{CM.Glyphs.RightBracket}";
  400. Application.Iteration += (s, a) => {
  401. iterations++;
  402. if (iterations == 0) {
  403. var sb = new StringBuilder ();
  404. for (int i = 0; i < 17; i++)
  405. sb.Append ("ff ");
  406. MessageBox.Query (string.Empty, sb.ToString (), defaultButton: 0, wrapMessage: false, "btn");
  407. Application.RequestStop ();
  408. } else if (iterations == 1) {
  409. Application.Refresh ();
  410. TestHelpers.AssertDriverContentsWithFrameAre (@$"
  411. ╔══════════════════╗
  412. ║ ║
  413. ────────────────────
  414. ff ff ff ff ff ff ff
  415. ⟦► btn ◄⟧
  416. ────────────────────
  417. ║ ║
  418. ║ ║
  419. ╚══════════════════╝", output);
  420. Application.RequestStop ();
  421. // Really long text
  422. MessageBox.Query (string.Empty, new string ('f', 500), defaultButton: 0, wrapMessage: false, "btn");
  423. } else if (iterations == 2) {
  424. Application.Refresh ();
  425. TestHelpers.AssertDriverContentsWithFrameAre (@$"
  426. ╔══════════════════╗
  427. ║ ║
  428. ────────────────────
  429. ffffffffffffffffffff
  430. ⟦► btn ◄⟧
  431. ────────────────────
  432. ║ ║
  433. ║ ║
  434. ╚══════════════════╝", output);
  435. Application.RequestStop ();
  436. }
  437. };
  438. Application.Run ();
  439. }
  440. [Theory, AutoInitShutdown]
  441. [InlineData (" ", true, 1)]
  442. [InlineData (" ", false, 1)]
  443. [InlineData ("", true, 1)]
  444. [InlineData ("", false, 1)]
  445. [InlineData ("\n", true, 1)]
  446. [InlineData ("\n", false, 1)]
  447. [InlineData (" \n", true, 1)]
  448. [InlineData (" \n", false, 2)]
  449. public void Message_Empty_Or_A_NewLline_WrapMessagge_True_Or_False (string message, bool wrapMessage, int linesLength)
  450. {
  451. var iterations = -1;
  452. Application.Begin (Application.Top);
  453. Application.Iteration += (s, a) => {
  454. iterations++;
  455. if (iterations == 0) {
  456. MessageBox.Query (string.Empty, message, 0, wrapMessage, "ok");
  457. Application.RequestStop ();
  458. } else if (iterations == 1) {
  459. Application.Refresh ();
  460. if (linesLength == 1) {
  461. TestHelpers.AssertDriverContentsWithFrameAre (@$"
  462. ┌──────────────────────────────────────────────┐
  463. │ │
  464. │ │
  465. │ {CM.Glyphs.LeftBracket}{CM.Glyphs.LeftDefaultIndicator} ok {CM.Glyphs.RightDefaultIndicator}{CM.Glyphs.RightBracket} │
  466. └──────────────────────────────────────────────┘", output);
  467. } else {
  468. TestHelpers.AssertDriverContentsWithFrameAre (@$"
  469. ┌──────────────────────────────────────────────┐
  470. │ │
  471. │ │
  472. │ │
  473. │ {CM.Glyphs.LeftBracket}{CM.Glyphs.LeftDefaultIndicator} ok {CM.Glyphs.RightDefaultIndicator}{CM.Glyphs.RightBracket} │
  474. └──────────────────────────────────────────────┘", output);
  475. }
  476. Application.RequestStop ();
  477. }
  478. };
  479. Application.Run ();
  480. }
  481. }
  482. }