Cleans up/Refactors View.Subviews (#3962)

* Subview clean up

* New Add/Remove event pattern

* Using Logging

* cleanup

* Subview -> SubView

* Test code cleanup. Killed many warnings.

* Fix tznind feedback

* Refactored AllViewTest helpers

* Moved keyboard tests to parallel

* Moved mouse tests to parallel

* Moved view tests to parallel

* Test code cleanup. Killed many warnings.

* dupe test

* Some mouse tests can't run in parallel because MouseGrabView

* Made SpinnerView more testable

* Moved more tests

* SubViews to IReadOnlyCollection<View>

* SubViews to IReadOnlyCollection<View> 2

* scrollbar tests

* shortcut tests

* Use InternalSubViews vs. _subviews

* Nuked View.IsAdded.
Added View.SuperViewChanged.

* API doc updats

* Unit Test tweak

* Unit Test tweak
This commit is contained in:
Tig
2025-03-08 15:42:17 -07:00
committed by GitHub
parent 85cf6619ed
commit acb5979e6c
226 changed files with 7235 additions and 7188 deletions

View File

@@ -1,242 +0,0 @@
using UnitTests;
using Xunit.Abstractions;
namespace Terminal.Gui.ViewTests;
public class AddRemoveNavigationTests () : TestsAllViews
{
[Fact]
public void Add_First_Subview_Gets_Focus ()
{
View top = new View ()
{
Id = "top",
CanFocus = true
};
top.SetFocus ();
Assert.True (top.HasFocus);
View subView = new View ()
{
Id = "subView",
CanFocus = true
};
top.Add (subView);
Assert.True (top.HasFocus);
Assert.Equal (subView, top.Focused);
Assert.True (subView.HasFocus);
}
[Fact]
public void Add_Subsequent_Subview_Gets_Focus ()
{
View top = new View ()
{
Id = "top",
CanFocus = true
};
top.SetFocus ();
Assert.True (top.HasFocus);
View subView = new View ()
{
Id = "subView",
CanFocus = true
};
top.Add (subView);
Assert.True (subView.HasFocus);
View subView2 = new View ()
{
Id = "subView2",
CanFocus = true
};
top.Add (subView2);
Assert.True (subView2.HasFocus);
}
[Fact]
public void Add_Nested_Subviews_Deepest_Gets_Focus ()
{
View top = new View ()
{
Id = "top",
CanFocus = true
};
top.SetFocus ();
Assert.True (top.HasFocus);
View subView = new View ()
{
Id = "subView",
CanFocus = true
};
View subSubView = new View ()
{
Id = "subSubView",
CanFocus = true
};
subView.Add (subSubView);
top.Add (subView);
Assert.True (top.HasFocus);
Assert.Equal (subView, top.Focused);
Assert.True (subView.HasFocus);
Assert.True (subSubView.HasFocus);
}
[Fact]
public void Remove_Subview_Raises_HasFocusChanged ()
{
var top = new View
{
Id = "top",
CanFocus = true
};
var subView1 = new View
{
Id = "subView1",
CanFocus = true
};
var subView2 = new View
{
Id = "subView2",
CanFocus = true
};
top.Add (subView1, subView2);
var subView1HasFocusChangedTrueCount = 0;
var subView1HasFocusChangedFalseCount = 0;
subView1.HasFocusChanged += (s, e) =>
{
if (e.NewValue)
{
subView1HasFocusChangedTrueCount++;
}
else
{
subView1HasFocusChangedFalseCount++;
}
};
var subView2HasFocusChangedTrueCount = 0;
var subView2HasFocusChangedFalseCount = 0;
subView2.HasFocusChanged += (s, e) =>
{
if (e.NewValue)
{
subView2HasFocusChangedTrueCount++;
}
else
{
subView2HasFocusChangedFalseCount++;
}
};
top.SetFocus ();
Assert.True (top.HasFocus);
Assert.True (subView1.HasFocus);
Assert.False (subView2.HasFocus);
Assert.Equal (1, subView1HasFocusChangedTrueCount);
Assert.Equal (0, subView1HasFocusChangedFalseCount);
Assert.Equal (0, subView2HasFocusChangedTrueCount);
Assert.Equal (0, subView2HasFocusChangedFalseCount);
top.Remove (subView1); // this should have the same resuilt as top.AdvanceFocus (NavigationDirection.Forward, null);
Assert.False (subView1.HasFocus);
Assert.True (subView2.HasFocus);
Assert.Equal (1, subView1HasFocusChangedTrueCount);
Assert.Equal (1, subView1HasFocusChangedFalseCount);
Assert.Equal (1, subView2HasFocusChangedTrueCount);
Assert.Equal (0, subView2HasFocusChangedFalseCount);
}
[Fact]
public void Remove_Focused_Subview_Keeps_Focus_And_SubView_Looses_Focus ()
{
View top = new View ()
{
Id = "top",
CanFocus = true
};
View subView = new View ()
{
Id = "subView",
CanFocus = true
};
top.Add (subView);
top.SetFocus ();
Assert.True (top.HasFocus);
Assert.Equal (subView, top.Focused);
Assert.True (subView.HasFocus);
top.Remove (subView);
Assert.True (top.HasFocus);
Assert.Null (top.Focused);
Assert.False (subView.HasFocus);
}
[Fact]
public void Remove_Focused_Subview_Keeps_Focus_And_SubView_Looses_Focus_And_Next_Gets_Focus ()
{
View top = new View ()
{
Id = "top",
CanFocus = true
};
View subView1 = new View ()
{
Id = "subView1",
CanFocus = true
};
View subView2 = new View ()
{
Id = "subView2",
CanFocus = true
};
top.Add (subView1, subView2);
top.SetFocus ();
Assert.True (top.HasFocus);
Assert.Equal (subView1, top.Focused);
Assert.True (subView1.HasFocus);
Assert.False (subView2.HasFocus);
top.Remove (subView1);
Assert.True (top.HasFocus);
Assert.True (subView2.HasFocus);
Assert.Equal (subView2, top.Focused);
Assert.False (subView1.HasFocus);
}
}

View File

@@ -1,647 +0,0 @@
using System.Runtime.Intrinsics;
using Xunit.Abstractions;
namespace Terminal.Gui.ViewTests;
public class AdvanceFocusTests ()
{
[Fact]
public void AdvanceFocus_CanFocus_Mixed ()
{
var r = new View ();
var v1 = new View { CanFocus = true, TabStop = TabBehavior.NoStop };
var v2 = new View { CanFocus = false, TabStop = TabBehavior.TabStop };
var v3 = new View { CanFocus = false, TabStop = TabBehavior.NoStop };
r.Add (v1, v2, v3);
r.AdvanceFocus (NavigationDirection.Forward, TabBehavior.TabStop);
Assert.False (v1.HasFocus);
Assert.False (v2.HasFocus);
Assert.False (v3.HasFocus);
r.AdvanceFocus (NavigationDirection.Forward, TabBehavior.TabStop);
Assert.False (v1.HasFocus);
Assert.False (v2.HasFocus);
Assert.False (v3.HasFocus);
r.AdvanceFocus (NavigationDirection.Forward, TabBehavior.TabStop);
Assert.False (v1.HasFocus);
Assert.False (v2.HasFocus);
Assert.False (v3.HasFocus);
r.Dispose ();
}
[Theory]
[CombinatorialData]
public void AdvanceFocus_Change_CanFocus_Works ([CombinatorialValues (TabBehavior.NoStop, TabBehavior.TabStop, TabBehavior.TabGroup)] TabBehavior behavior)
{
var r = new View { CanFocus = true };
var v1 = new View ();
var v2 = new View ();
var v3 = new View ();
Assert.True (r.CanFocus);
Assert.False (v1.CanFocus);
Assert.False (v2.CanFocus);
Assert.False (v3.CanFocus);
r.Add (v1, v2, v3);
r.AdvanceFocus (NavigationDirection.Forward, behavior);
Assert.False (v1.HasFocus);
Assert.False (v2.HasFocus);
Assert.False (v3.HasFocus);
v1.CanFocus = true;
v1.TabStop = behavior;
r.AdvanceFocus (NavigationDirection.Forward, behavior);
Assert.True (v1.HasFocus);
Assert.False (v2.HasFocus);
Assert.False (v3.HasFocus);
v2.CanFocus = true;
v2.TabStop = behavior;
r.AdvanceFocus (NavigationDirection.Forward, behavior);
Assert.False (v1.HasFocus);
Assert.True (v2.HasFocus);
Assert.False (v3.HasFocus);
v3.CanFocus = true;
v3.TabStop = behavior;
r.AdvanceFocus (NavigationDirection.Forward, behavior);
Assert.False (v1.HasFocus);
Assert.False (v2.HasFocus);
Assert.True (v3.HasFocus);
r.Dispose ();
}
[Fact]
public void AdvanceFocus_Subviews_TabStop ()
{
TabBehavior behavior = TabBehavior.TabStop;
var top = new View { Id = "top", CanFocus = true };
var v1 = new View { Id = "v1", CanFocus = true, TabStop = behavior };
var v2 = new View { Id = "v2", CanFocus = true, TabStop = behavior };
var v3 = new View { Id = "v3", CanFocus = false, TabStop = behavior };
top.Add (v1, v2, v3);
// Cycle through v1 & v2
top.AdvanceFocus (NavigationDirection.Forward, behavior);
Assert.True (v1.HasFocus);
top.AdvanceFocus (NavigationDirection.Forward, behavior);
Assert.True (v2.HasFocus);
// Should cycle back to v1
top.AdvanceFocus (NavigationDirection.Forward, behavior);
Assert.True (v1.HasFocus);
// Go backwards
top.AdvanceFocus (NavigationDirection.Backward, behavior);
Assert.True (v2.HasFocus);
top.AdvanceFocus (NavigationDirection.Backward, behavior);
Assert.True (v1.HasFocus);
top.Dispose ();
}
[Fact]
public void AdvanceFocus_Compound_Subview_TabStop ()
{
TabBehavior behavior = TabBehavior.TabStop;
var top = new View { Id = "top", CanFocus = true };
var compoundSubview = new View
{
CanFocus = true,
Id = "compoundSubview",
TabStop = behavior
};
var v1 = new View { Id = "v1", CanFocus = true, TabStop = behavior };
var v2 = new View { Id = "v2", CanFocus = true, TabStop = behavior };
var v3 = new View { Id = "v3", CanFocus = false, TabStop = behavior };
compoundSubview.Add (v1, v2, v3);
top.Add (compoundSubview);
// Cycle through v1 & v2
top.AdvanceFocus (NavigationDirection.Forward, behavior);
Assert.True (v1.HasFocus);
Assert.False (v2.HasFocus);
Assert.False (v3.HasFocus);
top.AdvanceFocus (NavigationDirection.Forward, behavior);
Assert.False (v1.HasFocus);
Assert.True (v2.HasFocus);
Assert.False (v3.HasFocus);
top.AdvanceFocus (NavigationDirection.Forward, behavior);
Assert.True (v1.HasFocus);
Assert.False (v2.HasFocus);
Assert.False (v3.HasFocus);
// Add another subview
View otherSubview = new ()
{
CanFocus = true,
TabStop = behavior,
Id = "otherSubview"
};
top.Add (otherSubview);
// Adding a focusable subview causes advancefocus
Assert.True (otherSubview.HasFocus);
Assert.False (v1.HasFocus);
// Cycle through v1 & v2
top.AdvanceFocus (NavigationDirection.Forward, behavior);
Assert.True (v1.HasFocus);
Assert.False (v2.HasFocus);
Assert.False (v3.HasFocus);
top.AdvanceFocus (NavigationDirection.Forward, behavior);
Assert.False (v1.HasFocus);
Assert.True (v2.HasFocus);
Assert.False (v3.HasFocus);
top.AdvanceFocus (NavigationDirection.Forward, behavior);
Assert.False (v1.HasFocus);
Assert.False (v2.HasFocus);
Assert.False (v3.HasFocus);
Assert.True (otherSubview.HasFocus);
// v2 was previously focused down the compoundSubView focus chain
top.AdvanceFocus (NavigationDirection.Forward, behavior);
Assert.False (v1.HasFocus);
Assert.True (v2.HasFocus);
Assert.False (v3.HasFocus);
top.Dispose ();
}
[Fact]
public void AdvanceFocus_CompoundCompound_Subview_TabStop ()
{
TabBehavior behavior = TabBehavior.TabStop;
var top = new View { Id = "top", CanFocus = true };
var topv1 = new View { Id = "topv1", CanFocus = true, TabStop = behavior };
var topv2 = new View { Id = "topv2", CanFocus = true, TabStop = behavior };
var topv3 = new View { Id = "topv3", CanFocus = false, TabStop = behavior };
top.Add (topv1, topv2, topv3);
var compoundSubview = new View
{
CanFocus = true,
Id = "compoundSubview",
TabStop = behavior
};
var v1 = new View { Id = "v1", CanFocus = true, TabStop = behavior };
var v2 = new View { Id = "v2", CanFocus = true, TabStop = behavior };
var v3 = new View { Id = "v3", CanFocus = false, TabStop = behavior };
compoundSubview.Add (v1, v2, v3);
var compoundCompoundSubview = new View
{
CanFocus = true,
Id = "compoundCompoundSubview",
TabStop = behavior
};
var v4 = new View { Id = "v4", CanFocus = true, TabStop = behavior };
var v5 = new View { Id = "v5", CanFocus = true, TabStop = behavior };
var v6 = new View { Id = "v6", CanFocus = false, TabStop = behavior };
compoundCompoundSubview.Add (v4, v5, v6);
compoundSubview.Add (compoundCompoundSubview);
top.Add (compoundSubview);
top.SetFocus ();
Assert.True (topv1.HasFocus);
// Cycle through topv2
top.AdvanceFocus (NavigationDirection.Forward, behavior);
Assert.True (topv2.HasFocus);
// Cycle v1, v2, v4, v5
top.AdvanceFocus (NavigationDirection.Forward, behavior);
Assert.True (v1.HasFocus);
top.AdvanceFocus (NavigationDirection.Forward, behavior);
Assert.True (v2.HasFocus);
top.AdvanceFocus (NavigationDirection.Forward, behavior);
Assert.True (v4.HasFocus);
top.AdvanceFocus (NavigationDirection.Forward, behavior);
Assert.True (v5.HasFocus);
// Should cycle back to topv1
top.AdvanceFocus (NavigationDirection.Forward, behavior);
Assert.True (topv1.HasFocus);
top.AdvanceFocus (NavigationDirection.Forward, behavior);
Assert.True (topv2.HasFocus);
// Add another top subview. Should cycle to it after v5
View otherSubview = new ()
{
CanFocus = true,
TabStop = behavior,
Id = "otherSubview"
};
top.Add (otherSubview);
// Adding a focusable subview causes advancefocus
Assert.True (otherSubview.HasFocus);
// Cycle through topv1, topv2, v1, v2, v4, v5
top.AdvanceFocus (NavigationDirection.Forward, behavior);
Assert.True (topv1.HasFocus);
top.AdvanceFocus (NavigationDirection.Forward, behavior);
Assert.True (topv2.HasFocus);
top.AdvanceFocus (NavigationDirection.Forward, behavior);
// the above should have cycled to v5 since it was the previously most focused subview of compoundSubView
Assert.True (v5.HasFocus);
top.AdvanceFocus (NavigationDirection.Forward, behavior);
Assert.True (otherSubview.HasFocus);
// Should cycle back to topv1
top.AdvanceFocus (NavigationDirection.Forward, behavior);
Assert.True (topv1.HasFocus);
top.Dispose ();
}
[Fact]
public void AdvanceFocus_Compound_Subview_TabGroup ()
{
var top = new View { Id = "top", CanFocus = true, TabStop = TabBehavior.TabGroup };
var compoundSubview = new View
{
CanFocus = true,
Id = "compoundSubview",
TabStop = TabBehavior.TabGroup
};
var tabStopView = new View { Id = "tabStop", CanFocus = true, TabStop = TabBehavior.TabStop };
var tabGroupView1 = new View { Id = "tabGroup1", CanFocus = true, TabStop = TabBehavior.TabGroup };
var tabGroupView2 = new View { Id = "tabGroup2", CanFocus = true, TabStop = TabBehavior.TabGroup };
compoundSubview.Add (tabStopView, tabGroupView1, tabGroupView2);
top.Add (compoundSubview);
top.SetFocus ();
Assert.True (tabStopView.HasFocus);
// TabGroup should cycle to tabGroup1 then tabGroup2
top.AdvanceFocus (NavigationDirection.Forward, TabBehavior.TabGroup);
Assert.False (tabStopView.HasFocus);
Assert.True (tabGroupView1.HasFocus);
Assert.False (tabGroupView2.HasFocus);
top.AdvanceFocus (NavigationDirection.Forward, TabBehavior.TabGroup);
Assert.False (tabStopView.HasFocus);
Assert.False (tabGroupView1.HasFocus);
Assert.True (tabGroupView2.HasFocus);
// Add another TabGroup subview
View otherTabGroupSubview = new ()
{
CanFocus = true,
TabStop = TabBehavior.TabGroup,
Id = "otherTabGroupSubview"
};
top.Add (otherTabGroupSubview);
// Adding a focusable subview causes advancefocus
Assert.True (otherTabGroupSubview.HasFocus);
Assert.False (tabStopView.HasFocus);
// TagBroup navs to the other subview
top.AdvanceFocus (NavigationDirection.Forward, TabBehavior.TabGroup);
Assert.Equal (compoundSubview, top.Focused);
Assert.True (tabStopView.HasFocus);
top.AdvanceFocus (NavigationDirection.Forward, TabBehavior.TabGroup);
Assert.Equal (compoundSubview, top.Focused);
Assert.True (tabGroupView1.HasFocus);
top.AdvanceFocus (NavigationDirection.Forward, TabBehavior.TabGroup);
Assert.Equal (compoundSubview, top.Focused);
Assert.True (tabGroupView2.HasFocus);
// Now go backwards
top.AdvanceFocus (NavigationDirection.Backward, TabBehavior.TabGroup);
Assert.Equal (compoundSubview, top.Focused);
Assert.True (tabGroupView1.HasFocus);
top.AdvanceFocus (NavigationDirection.Backward, TabBehavior.TabGroup);
Assert.Equal (otherTabGroupSubview, top.Focused);
Assert.True (otherTabGroupSubview.HasFocus);
top.Dispose ();
}
[Fact]
public void AdvanceFocus_NoStop_And_CanFocus_True_No_Focus ()
{
var r = new View ();
var v1 = new View { CanFocus = true, TabStop = TabBehavior.NoStop };
var v2 = new View { CanFocus = true, TabStop = TabBehavior.NoStop };
var v3 = new View { CanFocus = true, TabStop = TabBehavior.NoStop };
r.Add (v1, v2, v3);
r.AdvanceFocus (NavigationDirection.Forward, TabBehavior.TabStop);
Assert.False (v1.HasFocus);
Assert.False (v2.HasFocus);
Assert.False (v3.HasFocus);
r.AdvanceFocus (NavigationDirection.Forward, TabBehavior.TabStop);
Assert.False (v1.HasFocus);
Assert.False (v2.HasFocus);
Assert.False (v3.HasFocus);
r.AdvanceFocus (NavigationDirection.Forward, TabBehavior.TabStop);
Assert.False (v1.HasFocus);
Assert.False (v2.HasFocus);
Assert.False (v3.HasFocus);
r.Dispose ();
}
[Fact]
public void AdvanceFocus_NoStop_Change_Enables_Stop ()
{
var r = new View { CanFocus = true };
var v1 = new View { CanFocus = true, TabStop = TabBehavior.NoStop };
var v2 = new View { CanFocus = true, TabStop = TabBehavior.NoStop };
var v3 = new View { CanFocus = true, TabStop = TabBehavior.NoStop };
r.Add (v1, v2, v3);
v1.TabStop = TabBehavior.TabStop;
r.AdvanceFocus (NavigationDirection.Forward, TabBehavior.TabStop);
Assert.True (v1.HasFocus);
Assert.False (v2.HasFocus);
Assert.False (v3.HasFocus);
v2.TabStop = TabBehavior.TabStop;
r.AdvanceFocus (NavigationDirection.Forward, TabBehavior.TabStop);
Assert.False (v1.HasFocus);
Assert.True (v2.HasFocus);
Assert.False (v3.HasFocus);
v3.TabStop = TabBehavior.TabStop;
r.AdvanceFocus (NavigationDirection.Forward, TabBehavior.TabStop);
Assert.False (v1.HasFocus);
Assert.False (v2.HasFocus);
Assert.True (v3.HasFocus);
r.Dispose ();
}
[Fact]
public void AdvanceFocus_NoStop_Prevents_Stop ()
{
var r = new View ();
var v1 = new View { CanFocus = true, TabStop = TabBehavior.NoStop };
var v2 = new View { CanFocus = true, TabStop = TabBehavior.NoStop };
var v3 = new View { CanFocus = true, TabStop = TabBehavior.NoStop };
r.Add (v1, v2, v3);
r.AdvanceFocus (NavigationDirection.Forward, TabBehavior.TabStop);
Assert.False (v1.HasFocus);
Assert.False (v2.HasFocus);
Assert.False (v3.HasFocus);
}
[Fact]
public void AdvanceFocus_Null_And_CanFocus_False_No_Advance ()
{
var r = new View ();
var v1 = new View ();
var v2 = new View ();
var v3 = new View ();
Assert.False (v1.CanFocus);
Assert.Null (v1.TabStop);
r.Add (v1, v2, v3);
r.AdvanceFocus (NavigationDirection.Forward, TabBehavior.TabStop);
Assert.False (v1.HasFocus);
Assert.False (v2.HasFocus);
Assert.False (v3.HasFocus);
r.AdvanceFocus (NavigationDirection.Forward, TabBehavior.TabStop);
Assert.False (v1.HasFocus);
Assert.False (v2.HasFocus);
Assert.False (v3.HasFocus);
r.AdvanceFocus (NavigationDirection.Forward, TabBehavior.TabStop);
Assert.False (v1.HasFocus);
Assert.False (v2.HasFocus);
Assert.False (v3.HasFocus);
r.Dispose ();
}
[Fact]
public void AdvanceFocus_Subviews_Raises_HasFocusChanged ()
{
var top = new View
{
Id = "top",
CanFocus = true
};
var subView1 = new View
{
Id = "subView1",
CanFocus = true
};
var subView2 = new View
{
Id = "subView2",
CanFocus = true
};
top.Add (subView1, subView2);
var subView1HasFocusChangedTrueCount = 0;
var subView1HasFocusChangedFalseCount = 0;
subView1.HasFocusChanged += (s, e) =>
{
if (e.NewValue)
{
subView1HasFocusChangedTrueCount++;
}
else
{
subView1HasFocusChangedFalseCount++;
}
};
var subView2HasFocusChangedTrueCount = 0;
var subView2HasFocusChangedFalseCount = 0;
subView2.HasFocusChanged += (s, e) =>
{
if (e.NewValue)
{
subView2HasFocusChangedTrueCount++;
}
else
{
subView2HasFocusChangedFalseCount++;
}
};
top.SetFocus ();
Assert.True (top.HasFocus);
Assert.True (subView1.HasFocus);
Assert.False (subView2.HasFocus);
Assert.Equal (1, subView1HasFocusChangedTrueCount);
Assert.Equal (0, subView1HasFocusChangedFalseCount);
Assert.Equal (0, subView2HasFocusChangedTrueCount);
Assert.Equal (0, subView2HasFocusChangedFalseCount);
top.AdvanceFocus (NavigationDirection.Forward, null);
Assert.False (subView1.HasFocus);
Assert.True (subView2.HasFocus);
Assert.Equal (1, subView1HasFocusChangedTrueCount);
Assert.Equal (1, subView1HasFocusChangedFalseCount);
Assert.Equal (1, subView2HasFocusChangedTrueCount);
Assert.Equal (0, subView2HasFocusChangedFalseCount);
top.AdvanceFocus (NavigationDirection.Forward, null);
Assert.True (subView1.HasFocus);
Assert.False (subView2.HasFocus);
Assert.Equal (2, subView1HasFocusChangedTrueCount);
Assert.Equal (1, subView1HasFocusChangedFalseCount);
Assert.Equal (1, subView2HasFocusChangedTrueCount);
Assert.Equal (1, subView2HasFocusChangedFalseCount);
}
[Fact]
public void AdvanceFocus_Subviews_Raises_HasFocusChanging ()
{
var top = new View
{
Id = "top",
CanFocus = true
};
var subView1 = new View
{
Id = "subView1",
CanFocus = true
};
var subView2 = new View
{
Id = "subView2",
CanFocus = true
};
top.Add (subView1, subView2);
var subView1HasFocusChangingTrueCount = 0;
var subView1HasFocusChangingFalseCount = 0;
subView1.HasFocusChanging += (s, e) =>
{
if (e.NewValue)
{
subView1HasFocusChangingTrueCount++;
}
else
{
subView1HasFocusChangingFalseCount++;
}
};
var subView2HasFocusChangingTrueCount = 0;
var subView2HasFocusChangingFalseCount = 0;
subView2.HasFocusChanging += (s, e) =>
{
if (e.NewValue)
{
subView2HasFocusChangingTrueCount++;
}
else
{
subView2HasFocusChangingFalseCount++;
}
};
top.SetFocus ();
Assert.True (top.HasFocus);
Assert.True (subView1.HasFocus);
Assert.False (subView2.HasFocus);
Assert.Equal (1, subView1HasFocusChangingTrueCount);
Assert.Equal (0, subView1HasFocusChangingFalseCount);
Assert.Equal (0, subView2HasFocusChangingTrueCount);
Assert.Equal (0, subView2HasFocusChangingFalseCount);
top.AdvanceFocus (NavigationDirection.Forward, null);
Assert.False (subView1.HasFocus);
Assert.True (subView2.HasFocus);
Assert.Equal (1, subView1HasFocusChangingTrueCount);
Assert.Equal (1, subView1HasFocusChangingFalseCount);
Assert.Equal (1, subView2HasFocusChangingTrueCount);
Assert.Equal (0, subView2HasFocusChangingFalseCount);
top.AdvanceFocus (NavigationDirection.Forward, null);
Assert.True (subView1.HasFocus);
Assert.False (subView2.HasFocus);
Assert.Equal (2, subView1HasFocusChangingTrueCount);
Assert.Equal (1, subView1HasFocusChangingFalseCount);
Assert.Equal (1, subView2HasFocusChangingTrueCount);
Assert.Equal (1, subView2HasFocusChangingFalseCount);
}
[Fact]
public void AdvanceFocus_With_CanFocus_Are_All_True ()
{
var top = new View { Id = "top", CanFocus = true };
var v1 = new View { Id = "v1", CanFocus = true };
var v2 = new View { Id = "v2", CanFocus = true };
var v3 = new View { Id = "v3", CanFocus = true };
top.Add (v1, v2, v3);
top.AdvanceFocus (NavigationDirection.Forward, TabBehavior.TabStop);
Assert.True (v1.HasFocus);
Assert.False (v2.HasFocus);
Assert.False (v3.HasFocus);
top.AdvanceFocus (NavigationDirection.Forward, TabBehavior.TabStop);
Assert.False (v1.HasFocus);
Assert.True (v2.HasFocus);
Assert.False (v3.HasFocus);
top.AdvanceFocus (NavigationDirection.Forward, TabBehavior.TabStop);
Assert.False (v1.HasFocus);
Assert.False (v2.HasFocus);
Assert.True (v3.HasFocus);
top.Dispose ();
}
[Theory]
[CombinatorialData]
public void TabStop_And_CanFocus_Are_Decoupled (bool canFocus, TabBehavior tabStop)
{
var view = new View { CanFocus = canFocus, TabStop = tabStop };
Assert.Equal (canFocus, view.CanFocus);
Assert.Equal (tabStop, view.TabStop);
}
}

View File

@@ -1,211 +1,9 @@
using UnitTests;
using Xunit.Abstractions;
namespace Terminal.Gui.ViewTests;
public class CanFocusTests () : TestsAllViews
public class CanFocusTests
{
[Fact]
public void CanFocus_False_Prevents_SubSubView_HasFocus ()
{
var view = new View { };
var subView = new View { };
var subSubView = new View { CanFocus = true };
subView.Add (subSubView);
view.Add (subView);
Assert.False (view.CanFocus);
Assert.False (subView.CanFocus);
Assert.True (subSubView.CanFocus);
view.SetFocus ();
Assert.False (view.HasFocus);
subView.SetFocus ();
Assert.False (subView.HasFocus);
subSubView.SetFocus ();
Assert.False (subSubView.HasFocus);
}
[Fact]
public void CanFocus_False_Prevents_SubView_HasFocus ()
{
var view = new View { };
var subView = new View { CanFocus = true };
var subSubView = new View { };
subView.Add (subSubView);
view.Add (subView);
Assert.False (view.CanFocus);
Assert.True (subView.CanFocus);
Assert.False (subSubView.CanFocus);
view.SetFocus ();
Assert.False (view.HasFocus);
subView.SetFocus ();
Assert.False (subView.HasFocus);
subSubView.SetFocus ();
Assert.False (subSubView.HasFocus);
}
[Fact]
public void CanFocus_Set_True_No_SuperView_Doesnt_Set_HasFocus ()
{
var view = new View { };
// Act
view.CanFocus = true;
Assert.False (view.HasFocus);
}
[Fact]
public void CanFocus_Set_True_Sets_HasFocus_To_True ()
{
var view = new View { };
var subView = new View { };
view.Add (subView);
Assert.False (view.CanFocus);
Assert.False (subView.CanFocus);
view.SetFocus ();
Assert.False (view.HasFocus);
Assert.False (subView.HasFocus);
view.CanFocus = true;
view.SetFocus ();
Assert.True (view.HasFocus);
// Act
subView.CanFocus = true;
Assert.True (subView.HasFocus);
}
[Fact]
public void CanFocus_Set_SubView_True_Sets_HasFocus_To_True ()
{
var view = new View
{
CanFocus = true
};
var subView = new View
{
CanFocus = false
};
var subSubView = new View
{
CanFocus = true
};
subView.Add (subSubView);
view.Add (subView);
view.SetFocus ();
Assert.True (view.HasFocus);
Assert.False (subView.HasFocus);
Assert.False (subSubView.HasFocus);
// Act
subView.CanFocus = true;
Assert.True (subView.HasFocus);
Assert.True (subSubView.HasFocus);
}
[Fact]
public void CanFocus_Set_SubView_True_Does_Not_Change_Focus_If_SuperView_Focused_Is_True ()
{
var top = new View
{
Id = "top",
CanFocus = true
};
var subView = new View
{
Id = "subView",
CanFocus = true
};
var subSubView = new View
{
Id = "subSubView",
CanFocus = true
};
subView.Add (subSubView);
var subView2 = new View
{
Id = "subView2",
CanFocus = false
};
top.Add (subView, subView2);
top.SetFocus ();
Assert.True (top.HasFocus);
Assert.Equal (subView, top.Focused);
Assert.True (subView.HasFocus);
Assert.True (subSubView.HasFocus);
// Act
subView2.CanFocus = true;
Assert.False (subView2.HasFocus);
Assert.True (subView.HasFocus);
Assert.True (subSubView.HasFocus);
}
[Fact]
public void CanFocus_Set_False_Sets_HasFocus_To_False ()
{
var view = new View { CanFocus = true };
var view2 = new View { CanFocus = true };
view2.Add (view);
Assert.True (view.CanFocus);
view.SetFocus ();
Assert.True (view.HasFocus);
view.CanFocus = false;
Assert.False (view.CanFocus);
Assert.False (view.HasFocus);
}
// TODO: Figure out what this test is supposed to be testing
[Fact]
public void CanFocus_Faced_With_Container ()
{
var t = new Toplevel ();
var w = new Window ();
var f = new FrameView ();
var v = new View { CanFocus = true };
f.Add (v);
w.Add (f);
t.Add (w);
Assert.True (t.CanFocus);
Assert.True (w.CanFocus);
Assert.True (f.CanFocus);
Assert.True (v.CanFocus);
f.CanFocus = false;
Assert.False (f.CanFocus);
Assert.True (v.CanFocus);
v.CanFocus = false;
Assert.False (f.CanFocus);
Assert.False (v.CanFocus);
v.CanFocus = true;
Assert.False (f.CanFocus);
Assert.True (v.CanFocus);
}
// TODO: Figure out what this test is supposed to be testing
[Fact]
public void CanFocus_Faced_With_Container_Before_Run ()
@@ -288,38 +86,6 @@ public class CanFocusTests () : TestsAllViews
// r.Dispose ();
//}
[Fact]
public void CanFocus_True_Focuses ()
{
View view = new ()
{
Id = "view"
};
View superView = new ()
{
Id = "superView",
CanFocus = true
};
superView.Add (view);
superView.SetFocus ();
Assert.True (superView.HasFocus);
Assert.NotEqual (view, superView.Focused);
view.CanFocus = true;
Assert.True (superView.HasFocus);
Assert.Equal (view, superView.Focused);
Assert.True (view.HasFocus);
view.CanFocus = false;
Assert.True (superView.HasFocus);
Assert.NotEqual (view, superView.Focused);
Assert.False (view.HasFocus);
}
[Fact]
public void CanFocus_Set_True_Get_AdvanceFocus_Works ()
{

View File

@@ -1,261 +1,13 @@
using UnitTests;
using UnitTests;
using Xunit.Abstractions;
namespace Terminal.Gui.ViewTests;
public class EnabledTests () : TestsAllViews
public class EnabledTests
{
[Fact]
public void Enabled_False_Leaves ()
{
var view = new View
{
Id = "view",
CanFocus = true
};
view.SetFocus ();
Assert.True (view.HasFocus);
view.Enabled = false;
Assert.False (view.HasFocus);
}
[Fact]
public void Enabled_False_Leaves_Subview ()
{
var view = new View
{
Id = "view",
CanFocus = true
};
var subView = new View
{
Id = "subView",
CanFocus = true
};
view.Add (subView);
view.SetFocus ();
Assert.True (view.HasFocus);
Assert.True (subView.HasFocus);
Assert.Equal (subView, view.Focused);
view.Enabled = false;
Assert.False (view.HasFocus);
Assert.False (subView.HasFocus);
}
[Fact]
public void Enabled_False_Leaves_Subview2 ()
{
var view = new Window
{
Id = "view",
CanFocus = true
};
var subView = new View
{
Id = "subView",
CanFocus = true
};
view.Add (subView);
view.SetFocus ();
Assert.True (view.HasFocus);
Assert.True (subView.HasFocus);
Assert.Equal (subView, view.Focused);
view.Enabled = false;
Assert.False (view.HasFocus);
Assert.False (subView.HasFocus);
}
[Fact]
public void Enabled_False_On_Subview_Leaves_Just_Subview ()
{
var view = new View
{
Id = "view",
CanFocus = true
};
var subView = new View
{
Id = "subView",
CanFocus = true
};
view.Add (subView);
view.SetFocus ();
Assert.True (view.HasFocus);
Assert.True (subView.HasFocus);
Assert.Equal (subView, view.Focused);
subView.Enabled = false;
Assert.True (view.HasFocus);
Assert.False (subView.HasFocus);
}
[Fact]
public void Enabled_False_Focuses_Deepest_Focusable_Subview ()
{
var view = new View
{
Id = "view",
CanFocus = true
};
var subView = new View
{
Id = "subView",
CanFocus = true
};
var subViewSubView1 = new View
{
Id = "subViewSubView1",
CanFocus = false
};
var subViewSubView2 = new View
{
Id = "subViewSubView2",
CanFocus = true
};
var subViewSubView3 = new View
{
Id = "subViewSubView3",
CanFocus = true // This is the one that will be focused
};
subView.Add (subViewSubView1, subViewSubView2, subViewSubView3);
view.Add (subView);
view.SetFocus ();
Assert.True (subView.HasFocus);
Assert.Equal (subView, view.Focused);
Assert.Equal (subViewSubView2, subView.Focused);
subViewSubView2.Enabled = false;
Assert.True (subView.HasFocus);
Assert.Equal (subView, view.Focused);
Assert.Equal (subViewSubView3, subView.Focused);
Assert.True (subViewSubView3.HasFocus);
}
[Fact]
public void Enabled_True_Subview_Focuses_SubView ()
{
var view = new View
{
Id = "view",
CanFocus = true,
Enabled = false
};
var subView = new View
{
Id = "subView",
CanFocus = true
};
view.Add (subView);
view.SetFocus ();
Assert.False (view.HasFocus);
Assert.False (subView.HasFocus);
view.Enabled = true;
Assert.True (view.HasFocus);
Assert.True (subView.HasFocus);
}
[Fact]
public void Enabled_True_On_Subview_Focuses ()
{
var view = new View
{
Id = "view",
CanFocus = true
};
var subView = new View
{
Id = "subView",
CanFocus = true,
Enabled = false
};
view.Add (subView);
view.SetFocus ();
Assert.True (view.HasFocus);
Assert.False (subView.HasFocus);
subView.Enabled = true;
Assert.True (view.HasFocus);
Assert.True (subView.HasFocus);
}
[Fact]
public void Enabled_True_Focuses_Deepest_Focusable_Subview ()
{
var view = new View
{
Id = "view",
CanFocus = true
};
var subView = new View
{
Id = "subView",
CanFocus = true,
Enabled = false
};
var subViewSubView1 = new View
{
Id = "subViewSubView1",
CanFocus = false
};
var subViewSubView2 = new View
{
Id = "subViewSubView2",
CanFocus = true // This is the one that will be focused
};
var subViewSubView3 = new View
{
Id = "subViewSubView3",
CanFocus = true
};
subView.Add (subViewSubView1, subViewSubView2, subViewSubView3);
view.Add (subView);
view.SetFocus ();
Assert.False (subView.HasFocus);
Assert.False (subViewSubView2.HasFocus);
subView.Enabled = true;
Assert.True (subView.HasFocus);
Assert.Equal (subView, view.Focused);
Assert.Equal (subViewSubView2, subView.Focused);
Assert.True (subViewSubView2.HasFocus);
}
[Fact]
[AutoInitShutdown]
public void _Enabled_Sets_Also_Sets_Subviews ()
public void _Enabled_Sets_Also_Sets_SubViews ()
{
var wasClicked = false;
var button = new Button { Text = "Click Me" };

File diff suppressed because it is too large Load Diff

View File

@@ -1,234 +0,0 @@
using UnitTests;
using Xunit.Abstractions;
namespace Terminal.Gui.ViewTests;
public class HasFocusTests () : TestsAllViews
{
[Fact]
public void HasFocus_False ()
{
var view = new View ()
{
Id = "view",
CanFocus = true
};
view.SetFocus ();
Assert.True (view.HasFocus);
view.HasFocus = false;
Assert.False (view.HasFocus);
}
[Fact]
public void HasFocus_False_WithSuperView_Does_Not_Change_SuperView ()
{
var view = new View ()
{
Id = "view",
CanFocus = true
};
var subview = new View ()
{
Id = "subview",
CanFocus = true
};
view.Add (subview);
view.SetFocus ();
Assert.True (view.HasFocus);
Assert.True (subview.HasFocus);
subview.HasFocus = false;
Assert.False (subview.HasFocus);
Assert.True (view.HasFocus);
}
[Fact]
public void HasFocus_False_WithSubview_Leaves_All ()
{
var view = new View ()
{
Id = "view",
CanFocus = true
};
var subview = new View ()
{
Id = "subview",
CanFocus = true
};
view.Add (subview);
view.SetFocus ();
Assert.True (view.HasFocus);
Assert.True (subview.HasFocus);
Assert.Equal (subview, view.Focused);
view.HasFocus = false;
Assert.Null (view.Focused);
Assert.False (view.HasFocus);
Assert.False (subview.HasFocus);
}
[Fact]
public void Enabled_False_Sets_HasFocus_To_False ()
{
var wasClicked = false;
var view = new Button { Text = "Click Me" };
view.Accepting += (s, e) => wasClicked = !wasClicked;
view.NewKeyDownEvent (Key.Space);
Assert.True (wasClicked);
view.NewMouseEvent (new () { Flags = MouseFlags.Button1Clicked });
Assert.False (wasClicked);
Assert.True (view.Enabled);
Assert.True (view.CanFocus);
Assert.True (view.HasFocus);
view.Enabled = false;
view.NewKeyDownEvent (Key.Space);
Assert.False (wasClicked);
view.NewMouseEvent (new () { Flags = MouseFlags.Button1Clicked });
Assert.False (wasClicked);
Assert.False (view.Enabled);
Assert.True (view.CanFocus);
Assert.False (view.HasFocus);
view.SetFocus ();
Assert.False (view.HasFocus);
}
[Fact]
public void HasFocus_False_CompoundSubView_Leaves_All ()
{
var view = new View ()
{
Id = "view",
CanFocus = true
};
var subView = new View ()
{
Id = "subView",
CanFocus = true
};
var subViewSubView1 = new View ()
{
Id = "subViewSubView1",
CanFocus = false
};
var subViewSubView2 = new View ()
{
Id = "subViewSubView2",
CanFocus = true
};
var subViewSubView3 = new View ()
{
Id = "subViewSubView3",
CanFocus = false
};
subView.Add (subViewSubView1, subViewSubView2, subViewSubView3);
view.Add (subView);
view.SetFocus ();
Assert.True (view.HasFocus);
Assert.True (subView.HasFocus);
Assert.False (subViewSubView1.HasFocus);
Assert.True (subViewSubView2.HasFocus);
Assert.False (subViewSubView3.HasFocus);
view.HasFocus = false;
Assert.False (view.HasFocus);
Assert.False (subView.HasFocus);
Assert.False (subViewSubView1.HasFocus);
Assert.False (subViewSubView2.HasFocus);
Assert.False (subViewSubView3.HasFocus);
}
[Fact]
public void HasFocus_False_Subview_Raises_HasFocusChanged ()
{
var top = new View
{
Id = "top",
CanFocus = true
};
var subView1 = new View
{
Id = "subView1",
CanFocus = true
};
var subView2 = new View
{
Id = "subView2",
CanFocus = true
};
top.Add (subView1, subView2);
var subView1HasFocusChangedTrueCount = 0;
var subView1HasFocusChangedFalseCount = 0;
subView1.HasFocusChanged += (s, e) =>
{
if (e.NewValue)
{
subView1HasFocusChangedTrueCount++;
}
else
{
subView1HasFocusChangedFalseCount++;
}
};
var subView2HasFocusChangedTrueCount = 0;
var subView2HasFocusChangedFalseCount = 0;
subView2.HasFocusChanged += (s, e) =>
{
if (e.NewValue)
{
subView2HasFocusChangedTrueCount++;
}
else
{
subView2HasFocusChangedFalseCount++;
}
};
top.SetFocus ();
Assert.True (top.HasFocus);
Assert.True (subView1.HasFocus);
Assert.False (subView2.HasFocus);
Assert.Equal (1, subView1HasFocusChangedTrueCount);
Assert.Equal (0, subView1HasFocusChangedFalseCount);
Assert.Equal (0, subView2HasFocusChangedTrueCount);
Assert.Equal (0, subView2HasFocusChangedFalseCount);
subView1.HasFocus = false; // this should have the same resuilt as top.AdvanceFocus (NavigationDirection.Forward, null);
Assert.False (subView1.HasFocus);
Assert.True (subView2.HasFocus);
Assert.Equal (1, subView1HasFocusChangedTrueCount);
Assert.Equal (1, subView1HasFocusChangedFalseCount);
Assert.Equal (1, subView2HasFocusChangedTrueCount);
Assert.Equal (0, subView2HasFocusChangedFalseCount);
}
}

View File

@@ -1,11 +1,9 @@
using JetBrains.Annotations;
using UnitTests;
using UnitTests;
using UnitTests;
using Xunit.Abstractions;
namespace Terminal.Gui.ViewTests;
public class NavigationTests (ITestOutputHelper _output) : TestsAllViews
public class NavigationTests (ITestOutputHelper output) : TestsAllViews
{
[Theory]
[MemberData (nameof (AllViewTypes))]
@@ -16,22 +14,21 @@ public class NavigationTests (ITestOutputHelper _output) : TestsAllViews
if (view == null)
{
_output.WriteLine ($"Ignoring {viewType} - It's a Generic");
output.WriteLine ($"Ignoring {viewType} - It's a Generic");
return;
}
if (!view.CanFocus)
{
_output.WriteLine ($"Ignoring {viewType} - It can't focus.");
output.WriteLine ($"Ignoring {viewType} - It can't focus.");
return;
}
Toplevel top = new ();
Application.Top = top;
Application.Navigation = new ApplicationNavigation ();
Application.Navigation = new ();
View otherView = new ()
{
@@ -68,6 +65,7 @@ public class NavigationTests (ITestOutputHelper _output) : TestsAllViews
// Try once more (HexView)
Application.RaiseKeyDownEvent (key);
}
break;
default:
Application.RaiseKeyDownEvent (Key.Tab);
@@ -78,12 +76,12 @@ public class NavigationTests (ITestOutputHelper _output) : TestsAllViews
if (!view.HasFocus)
{
left = true;
_output.WriteLine ($"{view.GetType ().Name} - {key} Left.");
output.WriteLine ($"{view.GetType ().Name} - {key} Left.");
break;
}
_output.WriteLine ($"{view.GetType ().Name} - {key} did not Leave.");
output.WriteLine ($"{view.GetType ().Name} - {key} did not Leave.");
}
top.Dispose ();
@@ -101,28 +99,28 @@ public class NavigationTests (ITestOutputHelper _output) : TestsAllViews
if (view == null)
{
_output.WriteLine ($"Ignoring {viewType} - It's a Generic");
output.WriteLine ($"Ignoring {viewType} - It's a Generic");
return;
}
if (!view.CanFocus)
{
_output.WriteLine ($"Ignoring {viewType} - It can't focus.");
output.WriteLine ($"Ignoring {viewType} - It can't focus.");
return;
}
if (view is Toplevel && ((Toplevel)view).Modal)
{
_output.WriteLine ($"Ignoring {viewType} - It's a Modal Toplevel");
output.WriteLine ($"Ignoring {viewType} - It's a Modal Toplevel");
return;
}
Toplevel top = new ();
Application.Top = top;
Application.Navigation = new ApplicationNavigation ();
Application.Navigation = new ();
View otherView = new ()
{
@@ -135,16 +133,16 @@ public class NavigationTests (ITestOutputHelper _output) : TestsAllViews
var hasFocusFalse = 0;
view.HasFocusChanged += (s, e) =>
{
if (e.NewValue)
{
hasFocusTrue++;
}
else
{
hasFocusFalse++;
}
};
{
if (e.NewValue)
{
hasFocusTrue++;
}
else
{
hasFocusFalse++;
}
};
top.Add (view, otherView);
Assert.False (view.HasFocus);
@@ -185,7 +183,10 @@ public class NavigationTests (ITestOutputHelper _output) : TestsAllViews
// Try another nav key (e.g. for TextView that eats Tab)
Application.RaiseKeyDownEvent (Key.CursorDown);
}
};
}
;
break;
case TabBehavior.TabGroup:
@@ -263,21 +264,21 @@ public class NavigationTests (ITestOutputHelper _output) : TestsAllViews
if (view == null)
{
_output.WriteLine ($"Ignoring {viewType} - It's a Generic");
output.WriteLine ($"Ignoring {viewType} - It's a Generic");
return;
}
if (!view.CanFocus)
{
_output.WriteLine ($"Ignoring {viewType} - It can't focus.");
output.WriteLine ($"Ignoring {viewType} - It can't focus.");
return;
}
if (view is Toplevel && ((Toplevel)view).Modal)
{
_output.WriteLine ($"Ignoring {viewType} - It's a Modal Toplevel");
output.WriteLine ($"Ignoring {viewType} - It's a Modal Toplevel");
return;
}
@@ -285,7 +286,7 @@ public class NavigationTests (ITestOutputHelper _output) : TestsAllViews
Toplevel top = new ();
Application.Top = top;
Application.Navigation = new ApplicationNavigation ();
Application.Navigation = new ();
View otherView = new ()
{
@@ -321,66 +322,8 @@ public class NavigationTests (ITestOutputHelper _output) : TestsAllViews
top.Dispose ();
Application.ResetState ();
}
// View.Focused & View.MostFocused tests
// View.Focused - No subviews
[Fact]
public void Focused_NoSubviews ()
{
var view = new View ();
Assert.Null (view.Focused);
view.CanFocus = true;
view.SetFocus ();
}
[Fact]
public void GetMostFocused_NoSubviews_Returns_Null ()
{
var view = new View ();
Assert.Null (view.Focused);
view.CanFocus = true;
Assert.False (view.HasFocus);
view.SetFocus ();
Assert.True (view.HasFocus);
Assert.Null (view.MostFocused);
}
[Fact]
public void GetMostFocused_Returns_Most ()
{
var view = new View ()
{
Id = "view",
CanFocus = true
};
var subview = new View ()
{
Id = "subview",
CanFocus = true
};
view.Add (subview);
view.SetFocus ();
Assert.True (view.HasFocus);
Assert.True (subview.HasFocus);
Assert.Equal (subview, view.MostFocused);
var subview2 = new View ()
{
Id = "subview2",
CanFocus = true
};
view.Add (subview2);
Assert.Equal (subview2, view.MostFocused);
}
[Fact]
[SetupFakeDriver]
@@ -403,7 +346,6 @@ public class NavigationTests (ITestOutputHelper _output) : TestsAllViews
Application.Shutdown ();
}
[Fact]
[AutoInitShutdown]
public void Application_Begin_FocusesDeepest ()

View File

@@ -1,174 +0,0 @@
using UnitTests;
using Xunit.Abstractions;
namespace Terminal.Gui.ViewTests;
public class RestoreFocusTests () : TestsAllViews
{
[Fact]
public void RestoreFocus_Restores ()
{
var view = new View
{
Id = "view",
CanFocus = true
};
var subView = new View
{
Id = "subView",
CanFocus = true
};
var subViewSubView1 = new View
{
Id = "subViewSubView1",
CanFocus = true
};
var subViewSubView2 = new View
{
Id = "subViewSubView2",
CanFocus = true
};
var subViewSubView3 = new View
{
Id = "subViewSubView3",
CanFocus = true
};
subView.Add (subViewSubView1, subViewSubView2, subViewSubView3);
view.Add (subView);
view.SetFocus ();
Assert.True (view.HasFocus);
Assert.True (subView.HasFocus);
Assert.Equal (subView, view.Focused);
Assert.True (subViewSubView1.HasFocus);
Assert.Equal (subViewSubView1, subView.Focused);
view.HasFocus = false;
Assert.False (view.HasFocus);
Assert.False (subView.HasFocus);
Assert.False (subViewSubView1.HasFocus);
Assert.False (subViewSubView2.HasFocus);
Assert.False (subViewSubView3.HasFocus);
view.RestoreFocus ();
Assert.True (view.HasFocus);
Assert.True (subView.HasFocus);
Assert.Equal (subView, view.Focused);
Assert.Equal (subViewSubView1, subView.Focused);
Assert.True (subViewSubView1.HasFocus);
Assert.False (subViewSubView2.HasFocus);
Assert.False (subViewSubView3.HasFocus);
subViewSubView2.SetFocus ();
Assert.True (view.HasFocus);
Assert.True (subView.HasFocus);
Assert.False (subViewSubView1.HasFocus);
Assert.True (subViewSubView2.HasFocus);
Assert.False (subViewSubView3.HasFocus);
view.HasFocus = false;
Assert.False (view.HasFocus);
Assert.False (subView.HasFocus);
Assert.False (subViewSubView1.HasFocus);
Assert.False (subViewSubView2.HasFocus);
Assert.False (subViewSubView3.HasFocus);
view.RestoreFocus ();
Assert.True (subView.HasFocus);
Assert.Equal (subView, view.Focused);
Assert.True (subViewSubView2.HasFocus);
Assert.Equal (subViewSubView2, subView.Focused);
Assert.False (subViewSubView1.HasFocus);
Assert.False (subViewSubView3.HasFocus);
}
[Fact]
public void RestoreFocus_Across_TabGroup ()
{
var top = new View
{
Id = "top",
CanFocus = true,
TabStop = TabBehavior.TabGroup
};
var tabGroup1 = new View
{
Id = "tabGroup1",
CanFocus = true,
TabStop = TabBehavior.TabGroup
};
var tabGroup1SubView1 = new View
{
Id = "tabGroup1SubView1",
CanFocus = true,
TabStop = TabBehavior.TabStop
};
var tabGroup1SubView2 = new View
{
Id = "tabGroup1SubView2",
CanFocus = true,
TabStop = TabBehavior.TabStop
};
tabGroup1.Add (tabGroup1SubView1, tabGroup1SubView2);
var tabGroup2 = new View
{
Id = "tabGroup2",
CanFocus = true,
TabStop = TabBehavior.TabGroup
};
var tabGroup2SubView1 = new View
{
Id = "tabGroup2SubView1",
CanFocus = true,
TabStop = TabBehavior.TabStop
};
var tabGroup2SubView2 = new View
{
Id = "tabGroup2SubView2",
CanFocus = true,
TabStop = TabBehavior.TabStop
};
tabGroup2.Add (tabGroup2SubView1, tabGroup2SubView2);
top.Add (tabGroup1, tabGroup2);
top.SetFocus ();
Assert.True (top.HasFocus);
Assert.Equal (tabGroup1, top.Focused);
Assert.Equal (tabGroup1SubView1, tabGroup1.Focused);
top.AdvanceFocus (NavigationDirection.Forward, TabBehavior.TabGroup);
Assert.True (top.HasFocus);
Assert.Equal (tabGroup2, top.Focused);
Assert.Equal (tabGroup2SubView1, tabGroup2.Focused);
top.HasFocus = false;
Assert.False (top.HasFocus);
top.RestoreFocus ();
Assert.True (top.HasFocus);
Assert.Equal (tabGroup2, top.Focused);
Assert.Equal (tabGroup2SubView1, tabGroup2.Focused);
top.HasFocus = false;
Assert.False (top.HasFocus);
top.RestoreFocus ();
Assert.True (top.HasFocus);
Assert.Equal (tabGroup2, top.Focused);
Assert.Equal (tabGroup2SubView1, tabGroup2.Focused);
}
}

View File

@@ -1,396 +0,0 @@
using UnitTests;
using Xunit.Abstractions;
namespace Terminal.Gui.ViewTests;
public class SetFocusTests () : TestsAllViews
{
[Fact]
public void SetFocus_With_Null_Superview_Does_Not_Throw_Exception ()
{
var view = new View
{
Id = "view",
CanFocus = true
};
Assert.True (view.CanFocus);
Assert.False (view.HasFocus);
Exception exception = Record.Exception (() => view.SetFocus ());
Assert.Null (exception);
Assert.True (view.CanFocus);
Assert.True (view.HasFocus);
}
[Fact]
public void SetFocus_SetsFocus ()
{
var view = new View
{
Id = "view",
CanFocus = true
};
Assert.True (view.CanFocus);
Assert.False (view.HasFocus);
view.SetFocus ();
Assert.True (view.HasFocus);
}
[Fact]
public void SetFocus_NoSubView_Focused_Is_Null ()
{
var view = new View
{
Id = "view",
CanFocus = true
};
Assert.True (view.CanFocus);
Assert.False (view.HasFocus);
view.SetFocus ();
Assert.True (view.HasFocus);
Assert.Null (view.Focused);
}
[Fact]
public void SetFocus_SubView_Focused_Is_Set ()
{
var view = new Window
{
Id = "view",
CanFocus = true
};
var subview = new View
{
Id = "subview",
CanFocus = true
};
view.Add (subview);
Assert.True (view.CanFocus);
Assert.False (view.HasFocus);
view.SetFocus ();
Assert.True (view.HasFocus);
Assert.Equal (subview, view.Focused);
}
[Fact]
public void SetFocus_SetsFocus_DeepestSubView ()
{
var view = new View
{
Id = "view",
CanFocus = true
};
var subview = new View
{
Id = "subview",
CanFocus = true
};
view.Add (subview);
view.SetFocus ();
Assert.True (subview.HasFocus);
Assert.Equal (subview, view.Focused);
}
[Fact]
public void SetFocus_SetsFocus_DeepestSubView_CompoundSubView ()
{
var view = new View
{
Id = "view",
CanFocus = true
};
var subView = new View
{
Id = "subView",
CanFocus = true
};
var subViewSubView1 = new View
{
Id = "subViewSubView1",
CanFocus = false
};
var subViewSubView2 = new View
{
Id = "subViewSubView2",
CanFocus = true
};
var subViewSubView3 = new View
{
Id = "subViewSubView3",
CanFocus = false
};
subView.Add (subViewSubView1, subViewSubView2, subViewSubView3);
view.Add (subView);
view.SetFocus ();
Assert.True (subView.HasFocus);
Assert.Equal (subView, view.Focused);
Assert.Equal (subViewSubView2, subView.Focused);
}
[Fact]
public void SetFocus_CompoundSubView_SetFocus_Sets ()
{
var view = new View
{
Id = "view",
CanFocus = true
};
var subView = new View
{
Id = "subView",
CanFocus = true
};
var subViewSubView1 = new View
{
Id = "subViewSubView1",
CanFocus = true
};
var subViewSubView2 = new View
{
Id = "subViewSubView2",
CanFocus = true
};
var subViewSubView3 = new View
{
Id = "subViewSubView3",
CanFocus = true
};
subView.Add (subViewSubView1, subViewSubView2, subViewSubView3);
view.Add (subView);
view.SetFocus ();
Assert.True (view.HasFocus);
Assert.True (subView.HasFocus);
Assert.Equal (subView, view.Focused);
Assert.True (subViewSubView1.HasFocus);
Assert.Equal (subViewSubView1, subView.Focused);
subViewSubView2.SetFocus ();
Assert.True (view.HasFocus);
Assert.True (subView.HasFocus);
Assert.False (subViewSubView1.HasFocus);
Assert.True (subViewSubView2.HasFocus);
Assert.False (subViewSubView3.HasFocus);
}
[Fact]
public void SetFocus_AdornmentSubView_SetFocus_Sets ()
{
var view = new View
{
Id = "view",
CanFocus = true
};
var subView = new View
{
Id = "subView",
CanFocus = true
};
view.Add (subView);
var borderSubView = new View
{
Id = "borderSubView",
CanFocus = true
};
var subViewSubView1 = new View
{
Id = "subViewSubView1",
CanFocus = true
};
var subViewSubView2 = new View
{
Id = "subViewSubView2",
CanFocus = true
};
var subViewSubView3 = new View
{
Id = "subViewSubView3",
CanFocus = true
};
borderSubView.Add (subViewSubView1, subViewSubView2, subViewSubView3);
view.Border.Add (borderSubView);
view.SetFocus ();
Assert.True (view.HasFocus);
Assert.True (subView.HasFocus);
Assert.False (borderSubView.HasFocus);
view.Border.CanFocus = true;
subViewSubView1.SetFocus ();
Assert.True (view.HasFocus);
Assert.False (subView.HasFocus);
Assert.True (borderSubView.HasFocus);
Assert.True (subViewSubView1.HasFocus);
Assert.False (subViewSubView2.HasFocus);
Assert.False (subViewSubView3.HasFocus);
view.Border.CanFocus = false;
Assert.True (view.HasFocus);
Assert.True (subView.HasFocus);
Assert.False (view.Border.HasFocus);
Assert.False (borderSubView.HasFocus);
Assert.False (subViewSubView1.HasFocus);
Assert.False (subViewSubView2.HasFocus);
Assert.False (subViewSubView3.HasFocus);
view.Border.CanFocus = true;
Assert.True (view.HasFocus);
Assert.True (subView.HasFocus);
Assert.False (view.Border.HasFocus);
Assert.False (borderSubView.HasFocus);
Assert.False (subViewSubView1.HasFocus);
Assert.False (subViewSubView2.HasFocus);
Assert.False (subViewSubView3.HasFocus);
view.Border.SetFocus ();
Assert.True (view.HasFocus);
Assert.True (view.Border.HasFocus);
Assert.False (subView.HasFocus);
Assert.True (borderSubView.HasFocus);
Assert.True (subViewSubView1.HasFocus);
Assert.False (subViewSubView2.HasFocus);
Assert.False (subViewSubView3.HasFocus);
view.Border.CanFocus = false;
Assert.True (view.HasFocus);
Assert.True (subView.HasFocus);
Assert.False (view.Border.HasFocus);
Assert.False (borderSubView.HasFocus);
Assert.False (subViewSubView1.HasFocus);
Assert.False (subViewSubView2.HasFocus);
Assert.False (subViewSubView3.HasFocus);
view.Border.CanFocus = true;
subViewSubView1.SetFocus ();
Assert.True (view.HasFocus);
Assert.False (subView.HasFocus);
Assert.True (view.Border.HasFocus);
Assert.True (borderSubView.HasFocus);
Assert.True (subViewSubView1.HasFocus);
Assert.False (subViewSubView2.HasFocus);
Assert.False (subViewSubView3.HasFocus);
subView.SetFocus ();
Assert.True (view.HasFocus);
Assert.True (subView.HasFocus);
Assert.False (view.Border.HasFocus);
Assert.False (borderSubView.HasFocus);
Assert.False (subViewSubView1.HasFocus);
Assert.False (subViewSubView2.HasFocus);
Assert.False (subViewSubView3.HasFocus);
}
[Fact]
public void SetFocus_Peer_LeavesOther ()
{
var view = new View
{
Id = "view",
CanFocus = true
};
var subview1 = new View
{
Id = "subview1",
CanFocus = true
};
var subview2 = new View
{
Id = "subview2",
CanFocus = true
};
view.Add (subview1, subview2);
view.SetFocus ();
Assert.Equal (subview1, view.Focused);
Assert.True (subview1.HasFocus);
Assert.False (subview2.HasFocus);
subview2.SetFocus ();
Assert.Equal (subview2, view.Focused);
Assert.True (subview2.HasFocus);
Assert.False (subview1.HasFocus);
}
[Fact]
public void SetFocus_On_Peer_Moves_Focus_To_Peer ()
{
var top = new View
{
Id = "top",
CanFocus = true
};
var view1 = new View
{
Id = "view1",
CanFocus = true
};
var subView1 = new View
{
Id = "subView1",
CanFocus = true
};
view1.Add (subView1);
var subView1SubView1 = new View
{
Id = "subView1subView1",
CanFocus = true
};
subView1.Add (subView1SubView1);
var view2 = new View
{
Id = "view2",
CanFocus = true
};
top.Add (view1, view2);
Assert.False (view1.HasFocus);
Assert.False (view2.HasFocus);
view1.SetFocus ();
Assert.True (view1.HasFocus);
Assert.True (subView1.HasFocus);
Assert.True (subView1SubView1.HasFocus);
Assert.Equal (subView1, view1.Focused);
Assert.Equal (subView1SubView1, subView1.Focused);
view2.SetFocus ();
Assert.False (view1.HasFocus);
Assert.True (view2.HasFocus);
}
}

View File

@@ -1,254 +0,0 @@
using UnitTests;
using Xunit.Abstractions;
namespace Terminal.Gui.ViewTests;
public class VisibleTests () : TestsAllViews
{
[Fact]
public void Visible_False_Leaves ()
{
var view = new View
{
Id = "view",
CanFocus = true
};
view.SetFocus ();
Assert.True (view.HasFocus);
view.Visible = false;
Assert.False (view.HasFocus);
}
[Fact]
public void Visible_False_Leaves_Subview ()
{
var view = new View
{
Id = "view",
CanFocus = true
};
var subView = new View
{
Id = "subView",
CanFocus = true
};
view.Add (subView);
view.SetFocus ();
Assert.True (view.HasFocus);
Assert.True (subView.HasFocus);
Assert.Equal (subView, view.Focused);
view.Visible = false;
Assert.False (view.HasFocus);
Assert.False (subView.HasFocus);
}
[Fact]
public void Visible_False_Leaves_Subview2 ()
{
var view = new Window
{
Id = "view",
CanFocus = true
};
var subView = new View
{
Id = "subView",
CanFocus = true
};
view.Add (subView);
view.SetFocus ();
Assert.True (view.HasFocus);
Assert.True (subView.HasFocus);
Assert.Equal (subView, view.Focused);
view.Visible = false;
Assert.False (view.HasFocus);
Assert.False (subView.HasFocus);
}
[Fact]
public void Visible_False_On_Subview_Leaves_Just_Subview ()
{
var view = new View
{
Id = "view",
CanFocus = true
};
var subView = new View
{
Id = "subView",
CanFocus = true
};
view.Add (subView);
view.SetFocus ();
Assert.True (view.HasFocus);
Assert.True (subView.HasFocus);
Assert.Equal (subView, view.Focused);
subView.Visible = false;
Assert.True (view.HasFocus);
Assert.False (subView.HasFocus);
}
[Fact]
public void Visible_False_Focuses_Deepest_Focusable_Subview ()
{
var view = new View
{
Id = "view",
CanFocus = true
};
var subView = new View
{
Id = "subView",
CanFocus = true
};
var subViewSubView1 = new View
{
Id = "subViewSubView1",
CanFocus = false
};
var subViewSubView2 = new View
{
Id = "subViewSubView2",
CanFocus = true
};
var subViewSubView3 = new View
{
Id = "subViewSubView3",
CanFocus = true // This is the one that will be focused
};
subView.Add (subViewSubView1, subViewSubView2, subViewSubView3);
view.Add (subView);
view.SetFocus ();
Assert.True (subView.HasFocus);
Assert.Equal (subView, view.Focused);
Assert.Equal (subViewSubView2, subView.Focused);
subViewSubView2.Visible = false;
Assert.True (subView.HasFocus);
Assert.Equal (subView, view.Focused);
Assert.Equal (subViewSubView3, subView.Focused);
Assert.True (subViewSubView3.HasFocus);
}
[Fact]
public void Visible_True_Subview_Focuses_SubView ()
{
var view = new View
{
Id = "view",
CanFocus = true,
Visible = false
};
var subView = new View
{
Id = "subView",
CanFocus = true
};
view.Add (subView);
view.SetFocus ();
Assert.False (view.HasFocus);
Assert.False (subView.HasFocus);
view.Visible = true;
Assert.True (view.HasFocus);
Assert.True (subView.HasFocus);
}
[Fact]
public void Visible_True_On_Subview_Focuses ()
{
var view = new View
{
Id = "view",
CanFocus = true
};
var subView = new View
{
Id = "subView",
CanFocus = true,
Visible = false
};
view.Add (subView);
view.SetFocus ();
Assert.True (view.HasFocus);
Assert.False (subView.HasFocus);
subView.Visible = true;
Assert.True (view.HasFocus);
Assert.True (subView.HasFocus);
}
[Fact]
public void Visible_True_Focuses_Deepest_Focusable_Subview ()
{
var view = new View
{
Id = "view",
CanFocus = true
};
var subView = new View
{
Id = "subView",
CanFocus = true,
Visible = false
};
var subViewSubView1 = new View
{
Id = "subViewSubView1",
CanFocus = false
};
var subViewSubView2 = new View
{
Id = "subViewSubView2",
CanFocus = true // This is the one that will be focused
};
var subViewSubView3 = new View
{
Id = "subViewSubView3",
CanFocus = true
};
subView.Add (subViewSubView1, subViewSubView2, subViewSubView3);
view.Add (subView);
view.SetFocus ();
Assert.False (subView.HasFocus);
Assert.False (subViewSubView2.HasFocus);
subView.Visible = true;
Assert.True (subView.HasFocus);
Assert.Equal (subView, view.Focused);
Assert.Equal (subViewSubView2, subView.Focused);
Assert.True (subViewSubView2.HasFocus);
}
}