Files
Terminal.Gui/Tests/UnitTestsParallelizable/Drivers/ContentsTests.cs
BDisp cd75a20c60 Fixes #4387. Runes should not be used on a cell, but rather should use a single grapheme rendering 1 or 2 columns (#4388)
* Fixes #4382. StringExtensions.GetColumns method should only return the total text width and not the sum of all runes width

* Trying to fix unit test error

* Update StringExtensions.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Resolving merge conflicts

* Prevents Runes throwing if Grapheme is null

* Add unit test to prove that null and empty string doesn't not throws anything.

* Fix unit test failure

* Fix IsValidLocation for wide graphemes

* Add more combining

* Prevent set invalid graphemes

* Fix unit tests

* Grapheme doesn't support invalid code points like lone surrogates

* Fixes more unit tests

* Fix unit test

* Seems all test are fixed now

* Adjust CharMap scenario with graphemes

* Upgrade Wcwidth to version 4.0.0

* Reformat

* Trying fix CheckDefaultState assertion

* Revert "Trying fix CheckDefaultState assertion"

This reverts commit c9b46b796a.

* Forgot to include driver.End in the test

* Reapply "Trying fix CheckDefaultState assertion"

This reverts commit 1060ac9b63.

* Remove ToString

* Fix merge errors

* Change to conditional expression

* Assertion to prove that no exception throws during cell initialization.

* Remove unnecessary assignment

* Remove assignment to end

* Replace string concatenation with 'StringBuilder'.

* Replace more string concatenation with 'StringBuilder'

* Remove redundant call to 'ToString' because Rune cast to a String object.

* Replace foreach loop with Sum linq

---------

Co-authored-by: Tig <tig@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-11-20 13:45:13 -05:00

138 lines
4.2 KiB
C#

using System.Text;
using UnitTests;
using Xunit.Abstractions;
// Alias Console to MockConsole so we don't accidentally use Console
namespace UnitTests_Parallelizable.DriverTests;
public class ContentsTests (ITestOutputHelper output) : FakeDriverBase
{
[Fact]
public void AddStr_Combining_Character_1st_Column ()
{
IDriver driver = CreateFakeDriver ();
var expected = "\u0301!";
driver.AddStr ("\u0301!"); // acute accent + exclamation mark
DriverAssert.AssertDriverContentsAre (expected, output, driver);
driver.End ();
}
[Fact]
public void AddStr_With_Combining_Characters ()
{
IDriver driver = CreateFakeDriver ();
var acuteAccent = new Rune (0x0301); // Combining acute accent (é)
string combined = "e" + acuteAccent;
var expected = "é";
driver.AddStr (combined);
DriverAssert.AssertDriverContentsAre (expected, output, driver);
// 3 char combine
// a + ogonek + acute = <U+0061, U+0328, U+0301> ( ą́ )
var oGonek = new Rune (0x0328); // Combining ogonek (a small hook or comma shape)
combined = "a" + oGonek + acuteAccent;
expected = ("a" + oGonek + acuteAccent).Normalize (NormalizationForm.FormC); // See Issue #2616
driver.Move (0, 0);
driver.AddStr (combined);
DriverAssert.AssertDriverContentsAre (expected, output, driver);
// e + ogonek + acute = <U+0061, U+0328, U+0301> ( ę́́ )
combined = "e" + oGonek + acuteAccent;
expected = ("e" + oGonek + acuteAccent).Normalize (NormalizationForm.FormC); // See Issue #2616
driver.Move (0, 0);
driver.AddStr (combined);
DriverAssert.AssertDriverContentsAre (expected, output, driver);
// i + ogonek + acute = <U+0061, U+0328, U+0301> ( į́́́ )
combined = "i" + oGonek + acuteAccent;
expected = ("i" + oGonek + acuteAccent).Normalize (NormalizationForm.FormC); // See Issue #2616
driver.Move (0, 0);
driver.AddStr (combined);
DriverAssert.AssertDriverContentsAre (expected, output, driver);
// u + ogonek + acute = <U+0061, U+0328, U+0301> ( ų́́́́ )
combined = "u" + oGonek + acuteAccent;
expected = ("u" + oGonek + acuteAccent).Normalize (NormalizationForm.FormC); // See Issue #2616
driver.Move (0, 0);
driver.AddStr (combined);
DriverAssert.AssertDriverContentsAre (expected, output, driver);
driver.End ();
}
[Fact]
public void Move_Bad_Coordinates ()
{
IDriver driver = CreateFakeDriver ();
Assert.Equal (0, driver.Col);
Assert.Equal (0, driver.Row);
driver.Move (-1, 0);
Assert.Equal (-1, driver.Col);
Assert.Equal (0, driver.Row);
driver.Move (0, -1);
Assert.Equal (0, driver.Col);
Assert.Equal (-1, driver.Row);
driver.Move (driver.Cols, 0);
Assert.Equal (driver.Cols, driver.Col);
Assert.Equal (0, driver.Row);
driver.Move (0, driver.Rows);
Assert.Equal (0, driver.Col);
Assert.Equal (driver.Rows, driver.Row);
driver.Move (500, 500);
Assert.Equal (500, driver.Col);
Assert.Equal (500, driver.Row);
driver.End ();
}
// TODO: Add these unit tests
// AddRune moves correctly
// AddRune with wide characters are handled correctly
// AddRune with wide characters and Col < 0 are handled correctly
// AddRune with wide characters and Col == Cols - 1 are handled correctly
// AddRune with wide characters and Col == Cols are handled correctly
// AddStr moves correctly
// AddStr with wide characters moves correctly
// AddStr where Col is negative works
// AddStr where Col is negative and characters include wide / combining characters works
// AddStr where Col is near Cols and characters include wide / combining characters works
// Clipping works correctly
// Clipping works correctly with wide characters
// Clipping works correctly with combining characters
// Clipping works correctly with combining characters and wide characters
// ResizeScreen works correctly
// Refresh works correctly
// IsDirty tests
}