mirror of
https://github.com/gui-cs/Terminal.Gui.git
synced 2026-01-01 16:59:35 +01:00
Started on DimAuto unit tests
This commit is contained in:
@@ -255,28 +255,28 @@ public class Pos {
|
||||
public static Pos At (int n) => new PosAbsolute (n);
|
||||
|
||||
internal class PosCombine : Pos {
|
||||
internal Pos left, right;
|
||||
internal bool add;
|
||||
internal Pos _left, _right;
|
||||
internal bool _add;
|
||||
|
||||
public PosCombine (bool add, Pos left, Pos right)
|
||||
{
|
||||
this.left = left;
|
||||
this.right = right;
|
||||
this.add = add;
|
||||
_left = left;
|
||||
_right = right;
|
||||
_add = add;
|
||||
}
|
||||
|
||||
internal override int Anchor (int width)
|
||||
{
|
||||
int la = left.Anchor (width);
|
||||
int ra = right.Anchor (width);
|
||||
if (add) {
|
||||
int la = _left.Anchor (width);
|
||||
int ra = _right.Anchor (width);
|
||||
if (_add) {
|
||||
return la + ra;
|
||||
} else {
|
||||
return la - ra;
|
||||
}
|
||||
}
|
||||
|
||||
public override string ToString () => $"Combine({left}{(add ? '+' : '-')}{right})";
|
||||
public override string ToString () => $"Combine({_left}{(_add ? '+' : '-')}{_right})";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -404,7 +404,6 @@ namespace Terminal.Gui {
|
||||
return dim;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets whether validation of <see cref="Pos"/> and <see cref="Dim"/> occurs.
|
||||
/// </summary>
|
||||
@@ -427,14 +426,26 @@ namespace Terminal.Gui {
|
||||
|
||||
void ThrowInvalid (View view, object checkPosDim, string name)
|
||||
{
|
||||
// TODO: Figure out how to make CheckDimAuto deal with PosCombine
|
||||
object bad = null;
|
||||
switch (checkPosDim) {
|
||||
case Pos pos and not Pos.PosAbsolute and not Pos.PosView:
|
||||
case Pos pos and not Pos.PosAbsolute and not Pos.PosView and not Pos.PosCombine:
|
||||
bad = pos;
|
||||
break;
|
||||
case Dim dim and not Dim.DimAbsolute and not Dim.DimView:
|
||||
case Pos pos and Pos.PosCombine:
|
||||
// Recursively check for not Absolute or not View
|
||||
ThrowInvalid (view, (pos as Pos.PosCombine)._left, name);
|
||||
ThrowInvalid (view, (pos as Pos.PosCombine)._right, name);
|
||||
break;
|
||||
|
||||
case Dim dim and not Dim.DimAbsolute and not Dim.DimView and not Dim.DimCombine:
|
||||
bad = dim;
|
||||
break;
|
||||
case Dim dim and Dim.DimCombine:
|
||||
// Recursively check for not Absolute or not View
|
||||
ThrowInvalid (view, (dim as Dim.DimCombine)._left, name);
|
||||
ThrowInvalid (view, (dim as Dim.DimCombine)._right, name);
|
||||
break;
|
||||
}
|
||||
|
||||
if (bad != null) {
|
||||
@@ -723,9 +734,9 @@ namespace Terminal.Gui {
|
||||
|
||||
case Pos.PosCombine combine:
|
||||
int left, right;
|
||||
(left, newDimension) = GetNewLocationAndDimension (width, superviewLocation, superviewDimension, combine.left, dim, autosizeDimension);
|
||||
(right, newDimension) = GetNewLocationAndDimension (width, superviewLocation, superviewDimension, combine.right, dim, autosizeDimension);
|
||||
if (combine.add) {
|
||||
(left, newDimension) = GetNewLocationAndDimension (width, superviewLocation, superviewDimension, combine._left, dim, autosizeDimension);
|
||||
(right, newDimension) = GetNewLocationAndDimension (width, superviewLocation, superviewDimension, combine._right, dim, autosizeDimension);
|
||||
if (combine._add) {
|
||||
newLocation = left + right;
|
||||
} else {
|
||||
newLocation = left - right;
|
||||
@@ -861,8 +872,8 @@ namespace Terminal.Gui {
|
||||
}
|
||||
return;
|
||||
case Pos.PosCombine pc:
|
||||
CollectPos (pc.left, from, ref nNodes, ref nEdges);
|
||||
CollectPos (pc.right, from, ref nNodes, ref nEdges);
|
||||
CollectPos (pc._left, from, ref nNodes, ref nEdges);
|
||||
CollectPos (pc._right, from, ref nNodes, ref nEdges);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ public class DimAutoSize : Scenario {
|
||||
var button = new Button () { Text = "Press to make button move down.",
|
||||
X = 0,
|
||||
Y = Pos.Bottom (label),
|
||||
Width = Dim.Fill()
|
||||
Width = 10
|
||||
};
|
||||
button.Clicked += (s, e) => {
|
||||
button.Y = button.Frame.Y + 1;
|
||||
|
||||
361
UnitTests/View/Layout/DimAutoTests.cs
Normal file
361
UnitTests/View/Layout/DimAutoTests.cs
Normal file
@@ -0,0 +1,361 @@
|
||||
using System;
|
||||
using System.Globalization;
|
||||
using System.Threading;
|
||||
using Xunit;
|
||||
using Xunit.Abstractions;
|
||||
|
||||
// Alias Console to MockConsole so we don't accidentally use Console
|
||||
using Console = Terminal.Gui.FakeConsole;
|
||||
|
||||
namespace Terminal.Gui.ViewTests;
|
||||
|
||||
public class DimAutoTests {
|
||||
readonly ITestOutputHelper _output;
|
||||
|
||||
public DimAutoTests (ITestOutputHelper output)
|
||||
{
|
||||
_output = output;
|
||||
Console.OutputEncoding = System.Text.Encoding.Default;
|
||||
// Change current culture
|
||||
var culture = CultureInfo.CreateSpecificCulture ("en-US");
|
||||
Thread.CurrentThread.CurrentCulture = culture;
|
||||
Thread.CurrentThread.CurrentUICulture = culture;
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void NoSubViews_Does_Nothing ()
|
||||
{
|
||||
var superView = new View () {
|
||||
X = 0,
|
||||
Y = 0,
|
||||
Width = Dim.Auto (),
|
||||
Height = Dim.Auto (),
|
||||
ValidatePosDim = true,
|
||||
};
|
||||
|
||||
superView.BeginInit ();
|
||||
superView.EndInit ();
|
||||
superView.SetRelativeLayout (new Rect (0, 0, 0, 0));
|
||||
Assert.Equal (new Rect (0, 0, 0, 0), superView.Frame);
|
||||
|
||||
superView.SetRelativeLayout (new Rect (0, 0, 10, 10));
|
||||
Assert.Equal (new Rect (0, 0, 0, 0), superView.Frame);
|
||||
|
||||
superView.SetRelativeLayout (new Rect (10, 10, 10, 10));
|
||||
Assert.Equal (new Rect (0, 0, 0, 0), superView.Frame);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData (0, 0, 0, 0, 0, 0)]
|
||||
[InlineData (0, 0, 5, 0, 5, 0)]
|
||||
[InlineData (0, 0, 0, 5, 0, 5)]
|
||||
[InlineData (0, 0, 5, 5, 5, 5)]
|
||||
|
||||
[InlineData (1, 0, 5, 0, 6, 0)]
|
||||
[InlineData (1, 0, 0, 5, 1, 5)]
|
||||
[InlineData (1, 0, 5, 5, 6, 5)]
|
||||
[InlineData (1, 1, 5, 5, 6, 6)]
|
||||
|
||||
[InlineData (-1, 0, 5, 0, 4, 0)]
|
||||
[InlineData (-1, 0, 0, 5, 0, 5)]
|
||||
[InlineData (-1, 0, 5, 5, 4, 5)]
|
||||
[InlineData (-1, -1, 5, 5, 4, 4)]
|
||||
public void SubView_ChangesSuperViewSize (int subX, int subY, int subWidth, int subHeight, int expectedWidth, int expectedHeight)
|
||||
{
|
||||
var superView = new View () {
|
||||
X = 0,
|
||||
Y = 0,
|
||||
Width = Dim.Auto (),
|
||||
Height = Dim.Auto (),
|
||||
ValidatePosDim = true,
|
||||
};
|
||||
|
||||
var subView = new View () {
|
||||
X = subX,
|
||||
Y = subY,
|
||||
Width = subWidth,
|
||||
Height = subHeight,
|
||||
ValidatePosDim = true,
|
||||
};
|
||||
|
||||
superView.Add (subView);
|
||||
|
||||
superView.BeginInit ();
|
||||
superView.EndInit ();
|
||||
superView.SetRelativeLayout (new Rect (0, 0, 0, 0));
|
||||
Assert.Equal (new Rect (0, 0, expectedWidth, expectedHeight), superView.Frame);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData (0, 0, 0, 0, 0)]
|
||||
[InlineData (0, 0, 5, 0, 5)]
|
||||
[InlineData (0, 0, 0, 5, 0)]
|
||||
[InlineData (0, 0, 5, 5, 5)]
|
||||
|
||||
[InlineData (1, 0, 5, 0, 6)]
|
||||
[InlineData (1, 0, 0, 5, 1)]
|
||||
[InlineData (1, 0, 5, 5, 6)]
|
||||
[InlineData (1, 1, 5, 5, 6)]
|
||||
|
||||
[InlineData (-1, 0, 5, 0, 4)]
|
||||
[InlineData (-1, 0, 0, 5, 0)]
|
||||
[InlineData (-1, 0, 5, 5, 4)]
|
||||
[InlineData (-1, -1, 5, 5, 4)]
|
||||
public void Width_Auto_Height_NotChanged (int subX, int subY, int subWidth, int subHeight, int expectedWidth)
|
||||
{
|
||||
var superView = new View () {
|
||||
X = 0,
|
||||
Y = 0,
|
||||
Width = Dim.Auto (),
|
||||
Height = 10,
|
||||
ValidatePosDim = true,
|
||||
};
|
||||
|
||||
var subView = new View () {
|
||||
X = subX,
|
||||
Y = subY,
|
||||
Width = subWidth,
|
||||
Height = subHeight,
|
||||
ValidatePosDim = true,
|
||||
};
|
||||
|
||||
superView.Add (subView);
|
||||
|
||||
superView.BeginInit ();
|
||||
superView.EndInit ();
|
||||
superView.SetRelativeLayout (new Rect (0, 0, 0, 0));
|
||||
Assert.Equal (new Rect (0, 0, expectedWidth, 10), superView.Frame);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData (0, 0, 0, 0, 0)]
|
||||
[InlineData (0, 0, 5, 0, 0)]
|
||||
[InlineData (0, 0, 0, 5, 5)]
|
||||
[InlineData (0, 0, 5, 5, 5)]
|
||||
|
||||
[InlineData (1, 0, 5, 0, 0)]
|
||||
[InlineData (1, 0, 0, 5, 5)]
|
||||
[InlineData (1, 0, 5, 5, 5)]
|
||||
[InlineData (1, 1, 5, 5, 6)]
|
||||
|
||||
[InlineData (-1, 0, 5, 0, 0)]
|
||||
[InlineData (-1, 0, 0, 5, 5)]
|
||||
[InlineData (-1, 0, 5, 5, 5)]
|
||||
[InlineData (-1, -1, 5, 5, 4)]
|
||||
public void Height_Auto_Width_NotChanged (int subX, int subY, int subWidth, int subHeight, int expectedHeight)
|
||||
{
|
||||
var superView = new View () {
|
||||
X = 0,
|
||||
Y = 0,
|
||||
Width = 10,
|
||||
Height = Dim.Auto (),
|
||||
ValidatePosDim = true,
|
||||
};
|
||||
|
||||
var subView = new View () {
|
||||
X = subX,
|
||||
Y = subY,
|
||||
Width = subWidth,
|
||||
Height = subHeight,
|
||||
ValidatePosDim = true,
|
||||
};
|
||||
|
||||
superView.Add (subView);
|
||||
|
||||
superView.BeginInit ();
|
||||
superView.EndInit ();
|
||||
superView.SetRelativeLayout (new Rect (0, 0, 0, 0));
|
||||
Assert.Equal (new Rect (0, 0, 10, expectedHeight), superView.Frame);
|
||||
}
|
||||
|
||||
// Test validation
|
||||
[Fact]
|
||||
public void ValidatePosDim_True_Throws_When_SubView_Uses_SuperView_Dims ()
|
||||
{
|
||||
var superView = new View () {
|
||||
X = 0,
|
||||
Y = 0,
|
||||
Width = Dim.Auto (),
|
||||
Height = Dim.Auto (),
|
||||
ValidatePosDim = true,
|
||||
};
|
||||
|
||||
var subView = new View () {
|
||||
X = 0,
|
||||
Y = 0,
|
||||
Width = Dim.Fill (),
|
||||
Height = 10
|
||||
};
|
||||
|
||||
superView.Add (subView);
|
||||
|
||||
superView.BeginInit ();
|
||||
superView.EndInit ();
|
||||
superView.SetRelativeLayout (new Rect (0, 0, 0, 0));
|
||||
Assert.Throws<InvalidOperationException> (() => superView.LayoutSubviews ());
|
||||
|
||||
subView.Width = 10;
|
||||
subView.Height = Dim.Fill ();
|
||||
superView.SetRelativeLayout (new Rect (0, 0, 0, 0));
|
||||
Assert.Throws<InvalidOperationException> (() => superView.LayoutSubviews ());
|
||||
|
||||
subView.Width = 10;
|
||||
subView.Height = Dim.Percent(50);
|
||||
superView.SetRelativeLayout (new Rect (0, 0, 0, 0));
|
||||
Assert.Throws<InvalidOperationException> (() => superView.LayoutSubviews ());
|
||||
|
||||
subView.Width = 10;
|
||||
subView.Height = 10;
|
||||
subView.X = Pos.Center();
|
||||
superView.SetRelativeLayout (new Rect (0, 0, 0, 0));
|
||||
Assert.Throws<InvalidOperationException> (() => superView.LayoutSubviews ());
|
||||
|
||||
subView.Width = 10;
|
||||
subView.Height = 10;
|
||||
subView.X = 0;
|
||||
subView.Y = Pos.Center ();
|
||||
superView.SetRelativeLayout (new Rect (0, 0, 0, 0));
|
||||
Assert.Throws<InvalidOperationException> (() => superView.LayoutSubviews ());
|
||||
|
||||
subView.Width = 10;
|
||||
subView.Height = 10;
|
||||
subView.X = 0;
|
||||
subView.Y = 0;
|
||||
superView.SetRelativeLayout (new Rect (0, 0, 0, 0));
|
||||
superView.LayoutSubviews ();
|
||||
}
|
||||
|
||||
// Test validation
|
||||
[Fact]
|
||||
public void ValidatePosDim_True_Throws_When_SubView_Uses_SuperView_Dims_Combine ()
|
||||
{
|
||||
var superView = new View () {
|
||||
X = 0,
|
||||
Y = 0,
|
||||
Width = Dim.Auto (),
|
||||
Height = Dim.Auto (),
|
||||
ValidatePosDim = true,
|
||||
};
|
||||
|
||||
var subView = new View () {
|
||||
X = 0,
|
||||
Y = 0,
|
||||
Width = 10,
|
||||
Height = 10
|
||||
};
|
||||
|
||||
|
||||
var subView2 = new View () {
|
||||
X = 0,
|
||||
Y = 0,
|
||||
Width = 10,
|
||||
Height = 10
|
||||
};
|
||||
|
||||
superView.Add (subView, subView2);
|
||||
superView.BeginInit ();
|
||||
superView.EndInit ();
|
||||
superView.SetRelativeLayout (new Rect (0, 0, 0, 0));
|
||||
superView.LayoutSubviews (); // no throw
|
||||
|
||||
subView.Height = Dim.Fill () + 3;
|
||||
superView.SetRelativeLayout (new Rect (0, 0, 0, 0));
|
||||
Assert.Throws<InvalidOperationException> (() => superView.LayoutSubviews ());
|
||||
|
||||
subView.Height = 3 + Dim.Fill ();
|
||||
superView.SetRelativeLayout (new Rect (0, 0, 0, 0));
|
||||
Assert.Throws<InvalidOperationException> (() => superView.LayoutSubviews ());
|
||||
|
||||
subView.Height = 3 + 5 + Dim.Fill ();
|
||||
superView.SetRelativeLayout (new Rect (0, 0, 0, 0));
|
||||
Assert.Throws<InvalidOperationException> (() => superView.LayoutSubviews ());
|
||||
|
||||
subView.Height = 3 + 5 + Dim.Percent (10);
|
||||
superView.SetRelativeLayout (new Rect (0, 0, 0, 0));
|
||||
Assert.Throws<InvalidOperationException> (() => superView.LayoutSubviews ());
|
||||
|
||||
|
||||
// Tests nested Combine
|
||||
subView.Height = 5 + new Dim.DimCombine (true, 3, new Dim.DimCombine (true, Dim.Percent(10), 9));
|
||||
superView.SetRelativeLayout (new Rect (0, 0, 0, 0));
|
||||
Assert.Throws<InvalidOperationException> (() => superView.LayoutSubviews ());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ValidatePosDim_True_Throws_When_SubView_Uses_SuperView_Pos_Combine ()
|
||||
{
|
||||
var superView = new View () {
|
||||
X = 0,
|
||||
Y = 0,
|
||||
Width = Dim.Auto (),
|
||||
Height = Dim.Auto (),
|
||||
ValidatePosDim = true,
|
||||
};
|
||||
|
||||
var subView = new View () {
|
||||
X = 0,
|
||||
Y = 0,
|
||||
Width = 10,
|
||||
Height = 10
|
||||
};
|
||||
|
||||
var subView2 = new View () {
|
||||
X = 0,
|
||||
Y = 0,
|
||||
Width = 10,
|
||||
Height = 10
|
||||
};
|
||||
|
||||
superView.Add (subView, subView2);
|
||||
superView.BeginInit ();
|
||||
superView.EndInit ();
|
||||
|
||||
superView.SetRelativeLayout (new Rect (0, 0, 0, 0));
|
||||
superView.LayoutSubviews (); // no throw
|
||||
|
||||
subView.X = Pos.Right(subView2);
|
||||
superView.SetRelativeLayout (new Rect (0, 0, 0, 0));
|
||||
superView.LayoutSubviews (); // no throw
|
||||
|
||||
subView.X = 3 + Pos.Right (subView2);
|
||||
superView.SetRelativeLayout (new Rect (0, 0, 0, 0)); // no throw
|
||||
superView.LayoutSubviews (); // no throw
|
||||
|
||||
subView.X = Pos.Right (subView2) + 3;
|
||||
superView.SetRelativeLayout (new Rect (0, 0, 0, 0)); // no throw
|
||||
superView.LayoutSubviews (); // no throw
|
||||
|
||||
subView.X = new Pos.PosCombine (true, Pos.Right (subView2), new Pos.PosCombine (true, 7, 9));
|
||||
superView.SetRelativeLayout (new Rect (0, 0, 0, 0)); // no throw
|
||||
|
||||
subView.X = Pos.Center () + 3;
|
||||
superView.SetRelativeLayout (new Rect (0, 0, 0, 0));
|
||||
Assert.Throws<InvalidOperationException> (() => superView.LayoutSubviews ());
|
||||
|
||||
subView.X = 3 + Pos.Center ();
|
||||
superView.SetRelativeLayout (new Rect (0, 0, 0, 0));
|
||||
Assert.Throws<InvalidOperationException> (() => superView.LayoutSubviews ());
|
||||
|
||||
subView.X = 3 + 5 + Pos.Center ();
|
||||
superView.SetRelativeLayout (new Rect (0, 0, 0, 0));
|
||||
Assert.Throws<InvalidOperationException> (() => superView.LayoutSubviews ());
|
||||
|
||||
subView.X = 3 + 5 + Pos.Percent (10);
|
||||
superView.SetRelativeLayout (new Rect (0, 0, 0, 0));
|
||||
Assert.Throws<InvalidOperationException> (() => superView.LayoutSubviews ());
|
||||
|
||||
subView.X = Pos.Percent (10) + Pos.Center();
|
||||
superView.SetRelativeLayout (new Rect (0, 0, 0, 0));
|
||||
Assert.Throws<InvalidOperationException> (() => superView.LayoutSubviews ());
|
||||
|
||||
// Tests nested Combine
|
||||
subView.X = 5 + new Pos.PosCombine (true, Pos.Right (subView2), new Pos.PosCombine (true, Pos.Center (), 9));
|
||||
superView.SetRelativeLayout (new Rect (0, 0, 0, 0));
|
||||
Assert.Throws<InvalidOperationException> (() => superView.LayoutSubviews ());
|
||||
|
||||
}
|
||||
|
||||
// Test variations of Frame
|
||||
|
||||
// test PosCombine (can DimAuto be combined??!)
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user