|
@@ -2096,6 +2096,93 @@ namespace Terminal.Gui.ViewTests {
|
|
|
}
|
|
|
|
|
|
|
|
|
+ [Fact,AutoInitShutdown]
|
|
|
+ public void TestDisposal_NoEarlyDisposalsOfUsersViews_DuringRebuildForTileCount ()
|
|
|
+ {
|
|
|
+ var tv = GetTileView (20,10);
|
|
|
+
|
|
|
+ var myReusableView = new DisposeCounter ();
|
|
|
+
|
|
|
+ // I want my view in the first tile
|
|
|
+ tv.Tiles.ElementAt (0).View.Add (myReusableView);
|
|
|
+ Assert.Equal (0, myReusableView.DisposalCount);
|
|
|
+
|
|
|
+ // I've changed my mind, I want 3 tiles now
|
|
|
+ tv.RebuildForTileCount (3);
|
|
|
+
|
|
|
+ // but I still want my view in the first tile
|
|
|
+ tv.Tiles.ElementAt (0).View.Add (myReusableView);
|
|
|
+ Assert.Multiple (
|
|
|
+ ()=>Assert.Equal (0, myReusableView.DisposalCount)
|
|
|
+ ,()=> {
|
|
|
+ tv.Dispose ();
|
|
|
+ Assert.Equal (1, myReusableView.DisposalCount);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ [Fact, AutoInitShutdown]
|
|
|
+ public void TestDisposal_NoEarlyDisposalsOfUsersViews_DuringInsertTile ()
|
|
|
+ {
|
|
|
+ var tv = GetTileView (20, 10);
|
|
|
+
|
|
|
+ var myReusableView = new DisposeCounter ();
|
|
|
+
|
|
|
+ // I want my view in the first tile
|
|
|
+ tv.Tiles.ElementAt (0).View.Add (myReusableView);
|
|
|
+ Assert.Equal (0, myReusableView.DisposalCount);
|
|
|
+
|
|
|
+ // I've changed my mind, I want 3 tiles now
|
|
|
+ tv.InsertTile (0);
|
|
|
+ tv.InsertTile (2);
|
|
|
+
|
|
|
+ // but I still want my view in the first tile
|
|
|
+ tv.Tiles.ElementAt (0).View.Add (myReusableView);
|
|
|
+ Assert.Multiple (
|
|
|
+ () => Assert.Equal (0, myReusableView.DisposalCount)
|
|
|
+ , () => {
|
|
|
+ tv.Dispose ();
|
|
|
+
|
|
|
+ // TODO seems to be double disposed ?!
|
|
|
+ Assert.True (myReusableView.DisposalCount >= 1);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ [Theory, AutoInitShutdown]
|
|
|
+ [InlineData(0)]
|
|
|
+ [InlineData (1)]
|
|
|
+ public void TestDisposal_NoEarlyDisposalsOfUsersViews_DuringRemoveTile(int idx)
|
|
|
+ {
|
|
|
+ var tv = GetTileView (20, 10);
|
|
|
+
|
|
|
+ var myReusableView = new DisposeCounter ();
|
|
|
+
|
|
|
+ // I want my view in the first tile
|
|
|
+ tv.Tiles.ElementAt (0).View.Add (myReusableView);
|
|
|
+ Assert.Equal (0, myReusableView.DisposalCount);
|
|
|
+
|
|
|
+ tv.RemoveTile (idx);
|
|
|
+
|
|
|
+ // but I still want my view in the first tile
|
|
|
+ tv.Tiles.ElementAt (0).View.Add (myReusableView);
|
|
|
+ Assert.Multiple (
|
|
|
+ () => Assert.Equal (0, myReusableView.DisposalCount)
|
|
|
+ , () => {
|
|
|
+ tv.Dispose ();
|
|
|
+
|
|
|
+ // TODO seems to be double disposed ?!
|
|
|
+ Assert.True (myReusableView.DisposalCount >= 1);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ private class DisposeCounter : View
|
|
|
+ {
|
|
|
+ public int DisposalCount;
|
|
|
+ protected override void Dispose (bool disposing)
|
|
|
+ {
|
|
|
+ DisposalCount++;
|
|
|
+ base.Dispose (disposing);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// Creates a vertical orientation root container with left pane split into
|
|
|
/// two (with horizontal splitter line).
|