AddRuneTests.cs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. using System.Buffers;
  2. using System.Text;
  3. using UnitTests;
  4. using Xunit.Abstractions;
  5. namespace DriverTests;
  6. public class AddRuneTests (ITestOutputHelper output) : FakeDriverBase
  7. {
  8. [Fact]
  9. public void AddRune ()
  10. {
  11. IDriver driver = CreateFakeDriver ();
  12. driver.Rows = 25;
  13. driver.Cols = 80;
  14. driver.AddRune (new Rune ('a'));
  15. Assert.Equal ("a", driver.Contents? [0, 0].Grapheme);
  16. driver.Dispose ();
  17. }
  18. [Fact]
  19. public void AddRune_Accented_Letter_With_Three_Combining_Unicode_Chars ()
  20. {
  21. IDriver driver = CreateFakeDriver ();
  22. var expected = "ắ";
  23. var text = "\u1eaf";
  24. driver.AddStr (text);
  25. Assert.Equal (expected, driver.Contents! [0, 0].Grapheme);
  26. Assert.Equal (" ", driver.Contents [0, 1].Grapheme);
  27. driver.ClearContents ();
  28. driver.Move (0, 0);
  29. expected = "ắ";
  30. text = "\u0103\u0301";
  31. driver.AddStr (text);
  32. Assert.Equal (expected, driver.Contents [0, 0].Grapheme);
  33. Assert.Equal (" ", driver.Contents [0, 1].Grapheme);
  34. driver.ClearContents ();
  35. driver.Move (0, 0);
  36. expected = "ắ";
  37. text = "\u0061\u0306\u0301";
  38. driver.AddStr (text);
  39. Assert.Equal (expected, driver.Contents [0, 0].Grapheme);
  40. Assert.Equal (" ", driver.Contents [0, 1].Grapheme);
  41. // var s = "a\u0301\u0300\u0306";
  42. // DriverAsserts.AssertDriverContentsWithFrameAre (@"
  43. //ắ", output);
  44. // tf.Text = "\u1eaf";
  45. // Application.Refresh ();
  46. // DriverAsserts.AssertDriverContentsWithFrameAre (@"
  47. //ắ", output);
  48. // tf.Text = "\u0103\u0301";
  49. // Application.Refresh ();
  50. // DriverAsserts.AssertDriverContentsWithFrameAre (@"
  51. //ắ", output);
  52. // tf.Text = "\u0061\u0306\u0301";
  53. // Application.Refresh ();
  54. // DriverAsserts.AssertDriverContentsWithFrameAre (@"
  55. //ắ", output);
  56. driver.Dispose ();
  57. }
  58. [Fact]
  59. public void AddRune_InvalidLocation_DoesNothing ()
  60. {
  61. IDriver driver = CreateFakeDriver ();
  62. driver.Move (driver.Cols, driver.Rows);
  63. driver.AddRune ('a');
  64. for (var col = 0; col < driver.Cols; col++)
  65. {
  66. for (var row = 0; row < driver.Rows; row++)
  67. {
  68. Assert.Equal (" ", driver.Contents? [row, col].Grapheme);
  69. }
  70. }
  71. driver.Dispose ();
  72. }
  73. [Fact]
  74. public void AddRune_MovesToNextColumn ()
  75. {
  76. IDriver driver = CreateFakeDriver ();
  77. driver.AddRune ('a');
  78. Assert.Equal ("a", driver.Contents? [0, 0].Grapheme);
  79. Assert.Equal (0, driver.Row);
  80. Assert.Equal (1, driver.Col);
  81. driver.AddRune ('b');
  82. Assert.Equal ("b", driver.Contents? [0, 1].Grapheme);
  83. Assert.Equal (0, driver.Row);
  84. Assert.Equal (2, driver.Col);
  85. // Move to the last column of the first row
  86. int lastCol = driver.Cols - 1;
  87. driver.Move (lastCol, 0);
  88. Assert.Equal (0, driver.Row);
  89. Assert.Equal (lastCol, driver.Col);
  90. // Add a rune to the last column of the first row; should increment the row or col even though it's now invalid
  91. driver.AddRune ('c');
  92. Assert.Equal ("c", driver.Contents? [0, lastCol].Grapheme);
  93. Assert.Equal (lastCol + 1, driver.Col);
  94. // Add a rune; should succeed but do nothing as it's outside of Contents
  95. driver.AddRune ('d');
  96. Assert.Equal (lastCol + 2, driver.Col);
  97. for (var col = 0; col < driver.Cols; col++)
  98. {
  99. for (var row = 0; row < driver.Rows; row++)
  100. {
  101. Assert.NotEqual ("d", driver.Contents? [row, col].Grapheme);
  102. }
  103. }
  104. driver.Dispose ();
  105. }
  106. [Fact]
  107. public void AddRune_MovesToNextColumn_Wide ()
  108. {
  109. IDriver driver = CreateFakeDriver ();
  110. // 🍕 Slice of Pizza "\U0001F355"
  111. OperationStatus operationStatus = Rune.DecodeFromUtf16 ("\U0001F355", out Rune rune, out int charsConsumed);
  112. Assert.Equal (OperationStatus.Done, operationStatus);
  113. Assert.Equal (charsConsumed, rune.Utf16SequenceLength);
  114. Assert.Equal (2, rune.GetColumns ());
  115. driver.AddRune (rune);
  116. Assert.Equal (rune.ToString (), driver.Contents? [0, 0].Grapheme);
  117. Assert.Equal (0, driver.Row);
  118. Assert.Equal (2, driver.Col);
  119. //driver.AddRune ('b');
  120. //Assert.Equal ((Text)'b', driver.Contents [0, 1].Text);
  121. //Assert.Equal (0, driver.Row);
  122. //Assert.Equal (2, driver.Col);
  123. //// Move to the last column of the first row
  124. //var lastCol = driver.Cols - 1;
  125. //driver.Move (lastCol, 0);
  126. //Assert.Equal (0, driver.Row);
  127. //Assert.Equal (lastCol, driver.Col);
  128. //// Add a rune to the last column of the first row; should increment the row or col even though it's now invalid
  129. //driver.AddRune ('c');
  130. //Assert.Equal ((Text)'c', driver.Contents [0, lastCol].Text);
  131. //Assert.Equal (lastCol + 1, driver.Col);
  132. //// Add a rune; should succeed but do nothing as it's outside of Contents
  133. //driver.AddRune ('d');
  134. //Assert.Equal (lastCol + 2, driver.Col);
  135. //for (var col = 0; col < driver.Cols; col++) {
  136. // for (var row = 0; row < driver.Rows; row++) {
  137. // Assert.NotEqual ((Text)'d', driver.Contents [row, col].Text);
  138. // }
  139. //}
  140. driver.Dispose ();
  141. }
  142. [Fact]
  143. public void AddStr_Glyph_On_Second_Cell_Of_Wide_Glyph_Outputs_Correctly ()
  144. {
  145. IDriver? driver = CreateFakeDriver ();
  146. driver.SetScreenSize (6, 3);
  147. driver!.Clip = new (driver.Screen);
  148. driver.Move (1, 0);
  149. driver.AddStr ("┌");
  150. driver.Move (2, 0);
  151. driver.AddStr ("─");
  152. driver.Move (3, 0);
  153. driver.AddStr ("┐");
  154. driver.Clip.Exclude (new Region (new (1, 0, 3, 1)));
  155. driver.Move (0, 0);
  156. driver.AddStr ("🍎🍎🍎🍎");
  157. DriverAssert.AssertDriverContentsAre (
  158. """
  159. �┌─┐🍎
  160. """,
  161. output,
  162. driver);
  163. driver.Refresh ();
  164. DriverAssert.AssertDriverOutputIs (@"\x1b[38;2;0;0;0m\x1b[48;2;0;0;0m�┌─┐🍎\x1b[38;2;255;255;255m\x1b[48;2;0;0;0m",
  165. output, driver);
  166. }
  167. }