mirror of
https://github.com/gui-cs/Terminal.Gui.git
synced 2025-12-27 00:07:58 +01:00
* Added ClipRegion; cleaned up driver code * clip region unit tests * api docs * Moved color stuff from ConsoleDriver to Color.cs * Removes unused ConsoleDriver APIs * Code cleanup and Removes unused ConsoleDriver APIs * Code cleanup and Removes unused ConsoleDriver APIs * Work around https://github.com/gui-cs/Terminal.Gui/issues/2610 * adjusted unit tests * initial commit * Made Rows, Cols, Top, Left virtual * Made Clipboard non-virtual * Made EnableConsoleScrolling non-virtual * Made Contents non-virtual * Pulled Row/Col up * Made MoveTo virtual; fixed stupid FakeDriver cursor issue * Made CurrentAttribute non-virtual * Made SetAttribute non-virtual * Moved clipboard code out * Code cleanup * Removes dependecy on NStack from ConsoleDrivers - WIP * Fixed unit tests * Fixed unit tests * Added list of unit tests needed * Did some perf testing; tweaked code and charmap to address * Brough in code from PR #2264 (but commented) * Tons of code cleanup * Fighting with ScrollView * Fixing bugs * Fixed TabView tests * Fixed View.Visible test that was not really working * Fixed unit tests * Cleaned up clipboard APIs in attempt to track down unit test failure * Add Cut_Preserves_Selection test * Removed invalid code * Removed invalid test code; unit tests now pass * EscSeq* - Adjusted naming, added more sequences, made code more consistent, simplified, etc... * Added CSI_SetGraphicsRendition * NetDriver code cleanup * code cleanup * Cleaned up color handling in NetDriver * refixed tabview unit test * WindowsDriver color code cleanup * WindowsDriver color code cleanup * CursesDriver color code cleanup * CursesDriver - Adding _BOLD has no effect. Further up the stack we cast the return of ColorToCursesColor from int to short and the _BOLD values don't fit in a short. * CursesDriver color code - make code more accurate * CursesDriver color code - make code more accurate * Simplified ConsoleDriver.GetColors API * Simplified ConsoleDriver.GetColors API further * Improved encapslation of Attribute; prep for TrueColor & other attributes like blink * Fixes #2249. CharacterMap isn't refreshing well non-BMP code points on scroll. * Use GetRange to take some of the runes before convert to string. * Attempting to fix unit tests not being cleaned up * Fixes #2658 - ConsoleDriver.IsRuneSupported * Fixes #2658 - ConsoleDriver.IsRuneSupported (for WindowsDriver) * Check all the range values and not only the max value. * Reducing code. * Fixes #2674 - Unit test process doesn't exit * Changed Cell to support IsDirty and list of Runes * add support for rendering TrueColor output on Windows merging veeman & tznind code * add colorconverter changes * fixed merged v2_develop * Fixing merge bugs * Fixed merge bugs * Fixed merge bugs - all unit tests pass * Debugging netdriver * More netdriver diag * API docs for escutils * Update unicode scenario to stress more stuff * Contents: Now a 2D array of Cells; WIP * AddRune and ClearContents no longer virtual/abstract * WindowsDriver renders correctly again * Progress on Curses * Progress on Curses * broke windowsdriver * Cleaned up FakeMainLoop * Cleaned up some build warnings * Removed _init from AutoInitShutdown as it's not needed anymore * Removed unused var * Removed unused var * Fixed nullabiltiy warning in LineCanvas * Fixed charmap crash * Fixes #2758 in v2 * Port testonfail fix to v2 * Remove EnableConsoleScrolling * Backport #2764 from develop (clear last line) * Remove uneeded usings * Progress on unicode * Merged in changes from PR #2786, Fixes #2784 * revamp charmap rendering * Charmap option to show glyph widths * Fixed issue with wide glpyhs being overwritten * Fixed charmap startcodepoint change issue * Added abiltiy to see ncurses verison/lib * Fought with CursesDriver; giving up for now. See notes. * Leverage Wcwidth nuget library instaed of our own tables * enhanced charmap Details dialog * Final attempt at fixing curses --------- Co-authored-by: BDisp <bd.bdisp@gmail.com> Co-authored-by: adstep <stephensonadamj@gmail.com>
340 lines
8.1 KiB
C#
340 lines
8.1 KiB
C#
using System.Text;
|
||
using System;
|
||
using Xunit;
|
||
using Xunit.Abstractions;
|
||
|
||
namespace Terminal.Gui.ViewsTests {
|
||
public class DrawTests {
|
||
readonly ITestOutputHelper output;
|
||
|
||
public DrawTests (ITestOutputHelper output)
|
||
{
|
||
this.output = output;
|
||
}
|
||
|
||
// TODO: The tests below that use Label should use View instead.
|
||
[Fact, AutoInitShutdown]
|
||
public void Non_Bmp_ConsoleWidth_ColumnWidth_Equal_Two ()
|
||
{
|
||
string us = "\U0001d539";
|
||
Rune r = (Rune)0x1d539;
|
||
|
||
Assert.Equal ("𝔹", us);
|
||
Assert.Equal ("𝔹", r.ToString ());
|
||
Assert.Equal (us, r.ToString ());
|
||
|
||
Assert.Equal (1, us.GetColumns ());
|
||
Assert.Equal (1, r.GetColumns ());
|
||
|
||
var win = new Window () { Title = us };
|
||
var label = new Label (r.ToString ());
|
||
var tf = new TextField (us) { Y = 1, Width = 3 };
|
||
win.Add (label, tf);
|
||
var top = Application.Top;
|
||
top.Add (win);
|
||
|
||
Application.Begin (top);
|
||
((FakeDriver)Application.Driver).SetBufferSize (10, 4);
|
||
|
||
var expected = @"
|
||
┌┤𝔹├─────┐
|
||
│𝔹 │
|
||
│𝔹 │
|
||
└────────┘";
|
||
TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
|
||
|
||
TestHelpers.AssertDriverContentsAre (expected, output);
|
||
|
||
var expectedColors = new Attribute [] {
|
||
// 0
|
||
Colors.Base.Normal,
|
||
// 1
|
||
Colors.Base.Focus,
|
||
// 2
|
||
Colors.Base.HotNormal
|
||
};
|
||
|
||
TestHelpers.AssertDriverColorsAre (@"
|
||
0020000000
|
||
0000000000
|
||
0111000000
|
||
0000000000", expectedColors);
|
||
}
|
||
|
||
[Fact, AutoInitShutdown]
|
||
public void CJK_Compatibility_Ideographs_ConsoleWidth_ColumnWidth_Equal_Two ()
|
||
{
|
||
string us = "\U0000f900";
|
||
Rune r = (Rune)0xf900;
|
||
|
||
Assert.Equal ("豈", us);
|
||
Assert.Equal ("豈", r.ToString ());
|
||
Assert.Equal (us, r.ToString ());
|
||
|
||
Assert.Equal (2, us.GetColumns ());
|
||
Assert.Equal (2, r.GetColumns ());
|
||
|
||
var win = new Window () { Title = us };
|
||
var label = new Label (r.ToString ());
|
||
var tf = new TextField (us) { Y = 1, Width = 3 };
|
||
win.Add (label, tf);
|
||
var top = Application.Top;
|
||
top.Add (win);
|
||
|
||
Application.Begin (top);
|
||
((FakeDriver)Application.Driver).SetBufferSize (10, 4);
|
||
|
||
var expected = @"
|
||
┌┤豈├────┐
|
||
│豈 │
|
||
│豈 │
|
||
└────────┘";
|
||
TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
|
||
|
||
TestHelpers.AssertDriverContentsAre (expected, output);
|
||
|
||
var expectedColors = new Attribute [] {
|
||
// 0
|
||
Colors.Base.Normal,
|
||
// 1
|
||
Colors.Base.Focus,
|
||
// 2
|
||
Colors.Base.HotNormal
|
||
};
|
||
|
||
TestHelpers.AssertDriverColorsAre (@"
|
||
0022000000
|
||
0000000000
|
||
0111000000
|
||
0000000000", expectedColors);
|
||
}
|
||
|
||
[Fact, AutoInitShutdown]
|
||
public void Colors_On_TextAlignment_Right_And_Bottom ()
|
||
{
|
||
var labelRight = new Label ("Test") {
|
||
Width = 6,
|
||
Height = 1,
|
||
TextAlignment = TextAlignment.Right,
|
||
ColorScheme = Colors.Base
|
||
};
|
||
var labelBottom = new Label ("Test", TextDirection.TopBottom_LeftRight) {
|
||
Y = 1,
|
||
Width = 1,
|
||
Height = 6,
|
||
VerticalTextAlignment = VerticalTextAlignment.Bottom,
|
||
ColorScheme = Colors.Base
|
||
};
|
||
var top = Application.Top;
|
||
top.Add (labelRight, labelBottom);
|
||
|
||
Application.Begin (top);
|
||
((FakeDriver)Application.Driver).SetBufferSize (7, 7);
|
||
|
||
TestHelpers.AssertDriverContentsWithFrameAre (@"
|
||
Test
|
||
|
||
|
||
T
|
||
e
|
||
s
|
||
t ", output);
|
||
|
||
TestHelpers.AssertDriverColorsAre (@"
|
||
000000
|
||
0
|
||
0
|
||
0
|
||
0
|
||
0
|
||
0", new Attribute [] { Colors.Base.Normal });
|
||
}
|
||
|
||
[Fact, AutoInitShutdown]
|
||
public void Draw_Negative_Bounds_Horizontal_Without_New_Lines ()
|
||
{
|
||
// BUGBUG: This previously assumed the default height of a View was 1.
|
||
var subView = new View () { Id = "subView", Y = 1, Width = 7, Height = 1, Text = "subView" };
|
||
var view = new View () { Id = "view", Width = 20, Height = 2, Text = "01234567890123456789" };
|
||
view.Add (subView);
|
||
var content = new View () { Id = "content", Width = 20, Height = 20 };
|
||
content.Add (view);
|
||
var container = new View () { Id = "container", X = 1, Y = 1, Width = 5, Height = 5 };
|
||
container.Add (content);
|
||
var top = Application.Top;
|
||
top.Add (container);
|
||
// BUGBUG: v2 - it's bogus to reference .Frame before BeginInit. And why is the clip being set anyway???
|
||
|
||
void Top_LayoutComplete (object sender, LayoutEventArgs e)
|
||
{
|
||
Application.Driver.Clip = container.Frame;
|
||
}
|
||
top.LayoutComplete += Top_LayoutComplete;
|
||
Application.Begin (top);
|
||
|
||
TestHelpers.AssertDriverContentsWithFrameAre (@"
|
||
01234
|
||
subVi", output);
|
||
|
||
content.X = -1;
|
||
Application.Refresh ();
|
||
TestHelpers.AssertDriverContentsWithFrameAre (@"
|
||
12345
|
||
ubVie", output);
|
||
|
||
content.Y = -1;
|
||
Application.Refresh ();
|
||
TestHelpers.AssertDriverContentsWithFrameAre (@"
|
||
ubVie", output);
|
||
|
||
content.Y = -2;
|
||
Application.Refresh ();
|
||
TestHelpers.AssertDriverContentsWithFrameAre ("", output);
|
||
|
||
content.X = -20;
|
||
content.Y = 0;
|
||
Application.Refresh ();
|
||
TestHelpers.AssertDriverContentsWithFrameAre ("", output);
|
||
}
|
||
|
||
[Fact, AutoInitShutdown]
|
||
public void Draw_Negative_Bounds_Horizontal_With_New_Lines ()
|
||
{
|
||
var subView = new View () { Id = "subView", X = 1, Width = 1, Height = 7, Text = "s\nu\nb\nV\ni\ne\nw" };
|
||
var view = new View () { Id = "view", Width = 2, Height = 20, Text = "0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n0\n1\n2\n3\n4\n5\n6\n7\n8\n9" };
|
||
view.Add (subView);
|
||
var content = new View () { Id = "content", Width = 20, Height = 20 };
|
||
content.Add (view);
|
||
var container = new View () { Id = "container", X = 1, Y = 1, Width = 5, Height = 5 };
|
||
container.Add (content);
|
||
var top = Application.Top;
|
||
top.Add (container);
|
||
Application.Driver.Clip = container.Frame;
|
||
Application.Begin (top);
|
||
|
||
TestHelpers.AssertDriverContentsWithFrameAre (@"
|
||
0s
|
||
1u
|
||
2b
|
||
3V
|
||
4i", output);
|
||
|
||
content.X = -1;
|
||
Application.Refresh ();
|
||
TestHelpers.AssertDriverContentsWithFrameAre (@"
|
||
s
|
||
u
|
||
b
|
||
V
|
||
i", output);
|
||
|
||
content.X = -2;
|
||
Application.Refresh ();
|
||
TestHelpers.AssertDriverContentsWithFrameAre (@"", output);
|
||
|
||
content.X = 0;
|
||
content.Y = -1;
|
||
Application.Refresh ();
|
||
TestHelpers.AssertDriverContentsWithFrameAre (@"
|
||
1u
|
||
2b
|
||
3V
|
||
4i
|
||
5e", output);
|
||
|
||
content.Y = -6;
|
||
Application.Refresh ();
|
||
TestHelpers.AssertDriverContentsWithFrameAre (@"
|
||
6w
|
||
7
|
||
8
|
||
9
|
||
0 ", output);
|
||
|
||
content.Y = -19;
|
||
Application.Refresh ();
|
||
TestHelpers.AssertDriverContentsWithFrameAre (@"
|
||
9", output);
|
||
|
||
content.Y = -20;
|
||
Application.Refresh ();
|
||
TestHelpers.AssertDriverContentsWithFrameAre ("", output);
|
||
|
||
content.X = -2;
|
||
content.Y = 0;
|
||
Application.Refresh ();
|
||
TestHelpers.AssertDriverContentsWithFrameAre ("", output);
|
||
}
|
||
|
||
[Fact, AutoInitShutdown]
|
||
public void Draw_Negative_Bounds_Vertical ()
|
||
{
|
||
var subView = new View () { Id = "subView", X = 1, Width = 1, Height = 7, Text = "subView", TextDirection = TextDirection.TopBottom_LeftRight };
|
||
var view = new View () { Id = "view", Width = 2, Height = 20, Text = "01234567890123456789", TextDirection = TextDirection.TopBottom_LeftRight };
|
||
view.Add (subView);
|
||
var content = new View () { Id = "content", Width = 20, Height = 20 };
|
||
content.Add (view);
|
||
var container = new View () { Id = "container", X = 1, Y = 1, Width = 5, Height = 5 };
|
||
container.Add (content);
|
||
var top = Application.Top;
|
||
top.Add (container);
|
||
Application.Driver.Clip = container.Frame;
|
||
Application.Begin (top);
|
||
|
||
TestHelpers.AssertDriverContentsWithFrameAre (@"
|
||
0s
|
||
1u
|
||
2b
|
||
3V
|
||
4i", output);
|
||
|
||
content.X = -1;
|
||
Application.Refresh ();
|
||
TestHelpers.AssertDriverContentsWithFrameAre (@"
|
||
s
|
||
u
|
||
b
|
||
V
|
||
i", output);
|
||
|
||
content.X = -2;
|
||
Application.Refresh ();
|
||
TestHelpers.AssertDriverContentsWithFrameAre (@"", output);
|
||
|
||
content.X = 0;
|
||
content.Y = -1;
|
||
Application.Refresh ();
|
||
TestHelpers.AssertDriverContentsWithFrameAre (@"
|
||
1u
|
||
2b
|
||
3V
|
||
4i
|
||
5e", output);
|
||
|
||
content.Y = -6;
|
||
Application.Refresh ();
|
||
TestHelpers.AssertDriverContentsWithFrameAre (@"
|
||
6w
|
||
7
|
||
8
|
||
9
|
||
0 ", output);
|
||
|
||
content.Y = -19;
|
||
Application.Refresh ();
|
||
TestHelpers.AssertDriverContentsWithFrameAre (@"
|
||
9", output);
|
||
|
||
content.Y = -20;
|
||
Application.Refresh ();
|
||
TestHelpers.AssertDriverContentsWithFrameAre ("", output);
|
||
|
||
content.X = -2;
|
||
content.Y = 0;
|
||
Application.Refresh ();
|
||
TestHelpers.AssertDriverContentsWithFrameAre ("", output);
|
||
}
|
||
}
|
||
}
|
||
|