Started on DimAuto unit tests

This commit is contained in:
Tig Kindel
2023-12-18 13:39:21 -07:00
parent af17636d1f
commit 84bbd5f25d
6 changed files with 2272 additions and 1900 deletions

View File

@@ -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>

View File

@@ -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;
}
}

View File

@@ -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;

View 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