diff --git a/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests.cs b/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests.cs index eeda582d35..a54ff022ac 100644 --- a/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests.cs +++ b/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests.cs @@ -109,6 +109,20 @@ namespace Avalonia.Controls.UnitTests.Presenters Assert.Same(target, content.Parent); } + [Fact] + public void Should_Add_Child_To_Own_LogicalChildren_Outside_Template() + { + var content = new Border(); + var target = new ContentPresenter { Content = content }; + + target.UpdateChild(); + + var logicalChildren = target.GetLogicalChildren(); + + Assert.Equal(1, logicalChildren.Count()); + Assert.Equal(content, logicalChildren.First()); + } + [Fact] public void Adding_To_Logical_Tree_Should_Reevaluate_DataTemplates() { @@ -181,7 +195,7 @@ namespace Avalonia.Controls.UnitTests.Presenters } [Fact] - public void Should_Raise_DetachedFromLogicalTree_On_Content_Changed() + public void Should_Raise_DetachedFromLogicalTree_On_Content_Changed_OutsideTemplate() { var target = new ContentPresenter { @@ -193,8 +207,6 @@ namespace Avalonia.Controls.UnitTests.Presenters parentMock.As(); parentMock.As(); - // target.SetValue(ContentPresenter.TemplatedParentProperty, parentMock.Object); - (target as ISetLogicalParent).SetParent(parentMock.Object); target.Content = "foo"; @@ -222,7 +234,7 @@ namespace Avalonia.Controls.UnitTests.Presenters } [Fact] - public void Should_Raise_DetachedFromLogicalTree_In_ContentControl_On_Content_Changed() + public void Should_Raise_DetachedFromLogicalTree_In_ContentControl_On_Content_Changed_OutsideTemplate() { var contentControl = new ContentControl { @@ -269,6 +281,72 @@ namespace Avalonia.Controls.UnitTests.Presenters Assert.True(foodetached); } + [Fact] + public void Should_Raise_DetachedFromLogicalTree_On_Detached_OutsideTemplate() + { + var target = new ContentPresenter + { + ContentTemplate = + new FuncDataTemplate(t => new ContentControl() { Content = t }, false) + }; + + var parentMock = new Mock(); + parentMock.As(); + parentMock.As(); + + (target as ISetLogicalParent).SetParent(parentMock.Object); + + target.Content = "foo"; + + target.UpdateChild(); + + var foo = target.Child as ContentControl; + + bool foodetached = false; + + Assert.NotNull(foo); + Assert.Equal("foo", foo.Content); + + foo.DetachedFromLogicalTree += delegate { foodetached = true; }; + + (target as ISetLogicalParent).SetParent(null); + + Assert.False((foo as IControl).IsAttachedToLogicalTree); + Assert.True(foodetached); + } + + [Fact] + public void Should_Remove_Old_Child_From_LogicalChildren_On_ContentChanged_OutsideTemplate() + { + var target = new ContentPresenter + { + ContentTemplate = + new FuncDataTemplate(t => new ContentControl() { Content = t }, false) + }; + + target.Content = "foo"; + + target.UpdateChild(); + + var foo = target.Child as ContentControl; + + Assert.NotNull(foo); + + var logicalChildren = target.GetLogicalChildren(); + + Assert.Equal(1, logicalChildren.Count()); + + target.Content = "bar"; + target.UpdateChild(); + + Assert.Equal(null, foo.Parent); + + logicalChildren = target.GetLogicalChildren(); + + Assert.Equal(1, logicalChildren.Count()); + Assert.NotEqual(foo, logicalChildren.First()); + } + private class TestContentControl : ContentControl { public IControl Child { get; set; }