Files
Terminal.Gui/Tests/UnitTests/Drawing/StraightLineExtensionsTests.cs
Tig b0f32811eb Fixes #3930 - Splits tests to Tests/UnitTests, Tests/IntegrationTests, Tests/StressTests (#3954)
* Tons of API doc updates

* Removed stale test

* Removed stale tests

* Fixed Skipped Shadow test 1

* Fixed Skipped Shadow test 2

* Fixed Skipped Shadow test 3

* Removed stale test

* Removed stale test2

* Explicit unregister of event handler on Application.Driver!.ClearedContents

* Added Toplevels to dict

* code cleanup

* spelling error

* Removed stale test3

* Removed stale test4

* Removed stale test5

* added script

* tweaked script

* tweaked script

* Created StressTests project; moved some tests

* Created IntegrationTests project; moved some tests

* New yml

* made old yml just unit tests

* Tweaked Button_IsDefault_Raises_Accepted_Correctly

* tweaked script

* cleaned up ymls

* tweakled up ymls

* stress tests...

* stress tests on ubuntu only

* Fixed WindowsDriver in InvokeLeakTest

* Fixed WindowsDriver in InvokeLeakTest2

* Added Directory.Packages.props.
Added Directory.Build.props

* Shortened StressTest time

* Removed dupe file.

* DemoFiles

* Moved all tests to ./Tests dir.

* Fixed release build issue

* Fixed .sln file

* Fixed .sl* files

* Fixing ymls

* Fixing interation tests

* Create link to the file TestHelpers.

* Created Tests/UnitTestsParallelizable.
Moved all obviously parallelizable tests.
Updated yml.

* fixing logs

* fixing logs2

* fixing logs3

* don't require stress to pass for PRs

* Fix a failure?

* tweaked script

* Coudl this be it?

* Moved tons of tests to parallelizable

* Fixed some stuff

* Script to find duplicate tests

* Testing workflows

* Updated to v4

* Fix RelativeBasePath issue

* Replace powershell to pwsh

* Add ignore projects.

* Removed dupe unit tests

* Code cleanup of tests

* Cleaned up test warnings

* yml tweak

* Moved setter

* tweak ymls

* just randomly throwing spaghetti at a wall

* Enable runing 5 test runners in par

* Turned off DEBUG_DISPOSABLE for par tests

* RunningUnitTests=true

* code cleanup (forcing more Action runs)

* DISABLE_DEBUG_IDISPOSABLE

* Added View.DebugIDisposable. False by default.

* Remobed bogus tareet

* Remobed bogus tareet2

* fixed warning

* added api doc

* fixed warning

* fixed warning

* fixed warning2

* fixed warning3

* fixed warning4

---------

Co-authored-by: BDisp <bd.bdisp@gmail.com>
2025-03-05 23:44:27 -07:00

499 lines
16 KiB
C#

using UnitTests;
using UnitTests;
using Xunit.Abstractions;
namespace Terminal.Gui.DrawingTests;
public class StraightLineExtensionsTests (ITestOutputHelper output)
{
[Fact]
[AutoInitShutdown]
public void LineCanvasIntegrationTest ()
{
var lc = new LineCanvas ();
lc.AddLine (Point.Empty, 10, Orientation.Horizontal, LineStyle.Single);
lc.AddLine (new Point (9, 0), 5, Orientation.Vertical, LineStyle.Single);
lc.AddLine (new Point (9, 4), -10, Orientation.Horizontal, LineStyle.Single);
lc.AddLine (new Point (0, 4), -5, Orientation.Vertical, LineStyle.Single);
OutputAssert.AssertEqual (
output,
@"
┌────────┐
│ │
│ │
│ │
└────────┘",
$"{Environment.NewLine}{lc}"
);
IReadOnlyCollection<StraightLine> origLines = lc.Lines;
lc = new LineCanvas (origLines.Exclude (Point.Empty, 10, Orientation.Horizontal));
OutputAssert.AssertEqual (
output,
@"
│ │
│ │
│ │
└────────┘",
$"{Environment.NewLine}{lc}"
);
lc = new LineCanvas (origLines.Exclude (new Point (0, 1), 10, Orientation.Horizontal));
OutputAssert.AssertEqual (
output,
@"
┌────────┐
│ │
│ │
└────────┘",
$"{Environment.NewLine}{lc}"
);
lc = new LineCanvas (origLines.Exclude (new Point (0, 2), 10, Orientation.Horizontal));
OutputAssert.AssertEqual (
output,
@"
┌────────┐
│ │
│ │
└────────┘",
$"{Environment.NewLine}{lc}"
);
lc = new LineCanvas (origLines.Exclude (new Point (0, 3), 10, Orientation.Horizontal));
OutputAssert.AssertEqual (
output,
@"
┌────────┐
│ │
│ │
└────────┘",
$"{Environment.NewLine}{lc}"
);
lc = new LineCanvas (origLines.Exclude (new Point (0, 4), 10, Orientation.Horizontal));
OutputAssert.AssertEqual (
output,
@"
┌────────┐
│ │
│ │
│ │",
$"{Environment.NewLine}{lc}"
);
lc = new LineCanvas (origLines.Exclude (Point.Empty, 10, Orientation.Vertical));
OutputAssert.AssertEqual (
output,
@"
────────┐
────────┘",
$"{Environment.NewLine}{lc}"
);
lc = new LineCanvas (origLines.Exclude (new Point (1, 0), 10, Orientation.Vertical));
OutputAssert.AssertEqual (
output,
@"
┌ ───────┐
│ │
│ │
│ │
└ ───────┘",
$"{Environment.NewLine}{lc}"
);
lc = new LineCanvas (origLines.Exclude (new Point (8, 0), 10, Orientation.Vertical));
OutputAssert.AssertEqual (
output,
@"
┌─────── ┐
│ │
│ │
│ │
└─────── ┘",
$"{Environment.NewLine}{lc}"
);
lc = new LineCanvas (origLines.Exclude (new Point (9, 0), 10, Orientation.Vertical));
OutputAssert.AssertEqual (
output,
@"
┌────────
└────────",
$"{Environment.NewLine}{lc}"
);
}
#region Parallel Tests
[Fact]
[AutoInitShutdown]
public void TestExcludeParallel_HorizontalLines_LeftOnly ()
{
// x=1 to x=10
var l1 = new StraightLine (new Point (1, 2), 10, Orientation.Horizontal, LineStyle.Single);
StraightLine [] after = new [] { l1 }
// exclude x=3 to x=103
.Exclude (new Point (3, 2), 100, Orientation.Horizontal)
.ToArray ();
// x=1 to x=2
StraightLine afterLine = Assert.Single (after);
Assert.Equal (l1.Start, afterLine.Start);
Assert.Equal (2, afterLine.Length);
}
[Fact]
[AutoInitShutdown]
public void TestExcludeParallel_HorizontalLines_RightOnly ()
{
// x=1 to x=10
var l1 = new StraightLine (new Point (1, 2), 10, Orientation.Horizontal, LineStyle.Single);
StraightLine [] after = new [] { l1 }
// exclude x=0 to x=2
.Exclude (new Point (0, 2), 3, Orientation.Horizontal)
.ToArray ();
// x=3 to x=10
StraightLine afterLine = Assert.Single (after);
Assert.Equal (3, afterLine.Start.X);
Assert.Equal (2, afterLine.Start.Y);
Assert.Equal (8, afterLine.Length);
}
[Fact]
[AutoInitShutdown]
public void TestExcludeParallel_HorizontalLines_HorizontalSplit ()
{
// x=1 to x=10
var l1 = new StraightLine (new Point (1, 2), 10, Orientation.Horizontal, LineStyle.Single);
StraightLine [] after = new [] { l1 }
// exclude x=4 to x=5
.Exclude (new Point (4, 2), 2, Orientation.Horizontal)
.ToArray ();
// x=1 to x=3,
// x=6 to x=10
Assert.Equal (2, after.Length);
StraightLine afterLeft = after [0];
StraightLine afterRight = after [1];
Assert.Equal (1, afterLeft.Start.X);
Assert.Equal (2, afterLeft.Start.Y);
Assert.Equal (3, afterLeft.Length);
Assert.Equal (6, afterRight.Start.X);
Assert.Equal (2, afterRight.Start.Y);
Assert.Equal (5, afterRight.Length);
}
[Fact]
[AutoInitShutdown]
public void TestExcludeParallel_HorizontalLines_CoverCompletely ()
{
// x=1 to x=10
var l1 = new StraightLine (new Point (1, 2), 10, Orientation.Horizontal, LineStyle.Single);
StraightLine [] after = new [] { l1 }
// exclude x=4 to x=5
.Exclude (new Point (1, 2), 10, Orientation.Horizontal)
.ToArray ();
Assert.Empty (after);
}
[Fact]
[AutoInitShutdown]
public void TestExcludeParallel_VerticalLines_TopOnly ()
{
// y=1 to y=10
var l1 = new StraightLine (new Point (2, 1), 10, Orientation.Vertical, LineStyle.Single);
StraightLine [] after = new [] { l1 }
// exclude y=3 to y=103
.Exclude (new Point (2, 3), 100, Orientation.Vertical)
.ToArray ();
// y=1 to y=2
StraightLine afterLine = Assert.Single (after);
Assert.Equal (l1.Start, afterLine.Start);
Assert.Equal (2, afterLine.Length);
}
[Fact]
[AutoInitShutdown]
public void TestExcludeParallel_HorizontalLines_BottomOnly ()
{
// y=1 to y=10
var l1 = new StraightLine (new Point (2, 1), 10, Orientation.Vertical, LineStyle.Single);
StraightLine [] after = new [] { l1 }
// exclude y=0 to y=2
.Exclude (new Point (2, 0), 3, Orientation.Vertical)
.ToArray ();
// y=3 to y=10
StraightLine afterLine = Assert.Single (after);
Assert.Equal (3, afterLine.Start.Y);
Assert.Equal (2, afterLine.Start.X);
Assert.Equal (8, afterLine.Length);
}
[Fact]
[AutoInitShutdown]
public void TestExcludeParallel_VerticalLines_VerticalSplit ()
{
// y=1 to y=10
var l1 = new StraightLine (new Point (2, 1), 10, Orientation.Vertical, LineStyle.Single);
StraightLine [] after = new [] { l1 }
// exclude y=4 to y=5
.Exclude (new Point (2, 4), 2, Orientation.Vertical)
.ToArray ();
// y=1 to y=3,
// y=6 to y=10
Assert.Equal (2, after.Length);
StraightLine afterLeft = after [0];
StraightLine afterRight = after [1];
Assert.Equal (1, afterLeft.Start.Y);
Assert.Equal (2, afterLeft.Start.X);
Assert.Equal (3, afterLeft.Length);
Assert.Equal (6, afterRight.Start.Y);
Assert.Equal (2, afterRight.Start.X);
Assert.Equal (5, afterRight.Length);
}
[Fact]
[AutoInitShutdown]
public void TestExcludeParallel_VerticalLines_CoverCompletely ()
{
// y=1 to y=10
var l1 = new StraightLine (new Point (2, 1), 10, Orientation.Vertical, LineStyle.Single);
StraightLine [] after = new [] { l1 }
// exclude y=4 to y=5
.Exclude (new Point (2, 1), 10, Orientation.Vertical)
.ToArray ();
Assert.Empty (after);
}
#endregion
#region Perpendicular Intersection Tests
[Fact]
[AutoInitShutdown]
public void TestExcludePerpendicular_HorizontalLine_VerticalExclusion_Splits ()
{
// x=1 to x=10
var l1 = new StraightLine (new Point (1, 2), 10, Orientation.Horizontal, LineStyle.Single);
StraightLine [] after = new [] { l1 }
// exclude x=3 y=0-10
.Exclude (new Point (3, 0), 10, Orientation.Vertical)
.ToArray ();
// x=1 to x=2,
// x=4 to x=10
Assert.Equal (2, after.Length);
StraightLine afterLeft = after [0];
StraightLine afterRight = after [1];
Assert.Equal (1, afterLeft.Start.X);
Assert.Equal (2, afterLeft.Start.Y);
Assert.Equal (2, afterLeft.Length);
Assert.Equal (4, afterRight.Start.X);
Assert.Equal (2, afterRight.Start.Y);
Assert.Equal (7, afterRight.Length);
}
[Fact]
[AutoInitShutdown]
public void TestExcludePerpendicular_HorizontalLine_VerticalExclusion_ClipLeft ()
{
// x=1 to x=10
var l1 = new StraightLine (new Point (1, 2), 10, Orientation.Horizontal, LineStyle.Single);
StraightLine [] after = new [] { l1 }
// exclude x=1 y=0-10
.Exclude (new Point (1, 0), 10, Orientation.Vertical)
.ToArray ();
// x=2 to x=10,
StraightLine lineAfter = Assert.Single (after);
Assert.Equal (2, lineAfter.Start.X);
Assert.Equal (2, lineAfter.Start.Y);
Assert.Equal (9, lineAfter.Length);
}
[Fact]
[AutoInitShutdown]
public void TestExcludePerpendicular_HorizontalLine_VerticalExclusion_ClipRight ()
{
// x=1 to x=10
var l1 = new StraightLine (new Point (1, 2), 10, Orientation.Horizontal, LineStyle.Single);
StraightLine [] after = new [] { l1 }
// exclude x=10 y=0-10
.Exclude (new Point (10, 0), 10, Orientation.Vertical)
.ToArray ();
// x=1 to x=9,
StraightLine lineAfter = Assert.Single (after);
Assert.Equal (1, lineAfter.Start.X);
Assert.Equal (2, lineAfter.Start.Y);
Assert.Equal (9, lineAfter.Length);
}
[Fact]
[AutoInitShutdown]
public void TestExcludePerpendicular_HorizontalLine_VerticalExclusion_MissLeft ()
{
// x=1 to x=10
var l1 = new StraightLine (new Point (1, 2), 10, Orientation.Horizontal, LineStyle.Single);
StraightLine [] after = new [] { l1 }
// exclude x=0 y=0-10
.Exclude (Point.Empty, 10, Orientation.Vertical)
.ToArray ();
// Exclusion line is too far to the left so hits nothing
Assert.Same (Assert.Single (after), l1);
}
[Fact]
[AutoInitShutdown]
public void TestExcludePerpendicular_HorizontalLine_VerticalExclusion_MissRight ()
{
// x=1 to x=10
var l1 = new StraightLine (new Point (1, 2), 10, Orientation.Horizontal, LineStyle.Single);
StraightLine [] after = new [] { l1 }
// exclude x=11 y=0-10
.Exclude (new Point (11, 0), 10, Orientation.Vertical)
.ToArray ();
// Exclusion line is too far to the right so hits nothing
Assert.Same (Assert.Single (after), l1);
}
[Fact]
[AutoInitShutdown]
public void TestExcludePerpendicular_VerticalLine_HorizontalExclusion_ClipTop ()
{
// y=1 to y=10
var l1 = new StraightLine (new Point (2, 1), 10, Orientation.Vertical, LineStyle.Single);
StraightLine [] after = new [] { l1 }
// exclude y=1 x=0-10
.Exclude (new Point (0, 1), 10, Orientation.Horizontal)
.ToArray ();
// y=2 to y=10,
StraightLine lineAfter = Assert.Single (after);
Assert.Equal (2, lineAfter.Start.Y);
Assert.Equal (2, lineAfter.Start.X);
Assert.Equal (9, lineAfter.Length);
}
[Fact]
[AutoInitShutdown]
public void TestExcludePerpendicular_VerticalLine_HorizontalExclusion_ClipBottom ()
{
// y=1 to y=10
var l1 = new StraightLine (new Point (2, 1), 10, Orientation.Vertical, LineStyle.Single);
StraightLine [] after = new [] { l1 }
// exclude y=10 x=0-10
.Exclude (new Point (0, 10), 10, Orientation.Horizontal)
.ToArray ();
// y=1 to y=9,
StraightLine lineAfter = Assert.Single (after);
Assert.Equal (1, lineAfter.Start.Y);
Assert.Equal (2, lineAfter.Start.X);
Assert.Equal (9, lineAfter.Length);
}
[Fact]
[AutoInitShutdown]
public void TestExcludePerpendicular_VerticalLine_HorizontalExclusion_MissTop ()
{
// y=1 to y=10
var l1 = new StraightLine (new Point (2, 1), 10, Orientation.Vertical, LineStyle.Single);
StraightLine [] after = new [] { l1 }
// exclude y=0 x=0-10
.Exclude (Point.Empty, 10, Orientation.Horizontal)
.ToArray ();
// Exclusion line is too far above so hits nothing
Assert.Same (Assert.Single (after), l1);
}
[Fact]
[AutoInitShutdown]
public void TestExcludePerpendicular_VerticalLine_HorizontalExclusion_MissBottom ()
{
// y=1 to y=10
var l1 = new StraightLine (new Point (2, 1), 10, Orientation.Vertical, LineStyle.Single);
StraightLine [] after = new [] { l1 }
// exclude y=11 x=0-10
.Exclude (new Point (0, 11), 10, Orientation.Horizontal)
.ToArray ();
// Exclusion line is too far to the right so hits nothing
Assert.Same (Assert.Single (after), l1);
}
#endregion Perpendicular Intersection Tests
}