diff --git a/UnitTests/Views/TileViewTests.cs b/UnitTests/Views/TileViewTests.cs index 4505694f0..a29dfad9a 100644 --- a/UnitTests/Views/TileViewTests.cs +++ b/UnitTests/Views/TileViewTests.cs @@ -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); + } + + } + /// /// Creates a vertical orientation root container with left pane split into /// two (with horizontal splitter line).