AddRuneTests.cs 5.6 KB

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