From 2bff56023bfd4204bb92c355ee867a1eff984cea Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Mon, 30 Mar 2020 18:02:30 +0200 Subject: [PATCH] Added failing test for #3708. --- .../StyledElementTests.cs | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/tests/Avalonia.Styling.UnitTests/StyledElementTests.cs b/tests/Avalonia.Styling.UnitTests/StyledElementTests.cs index 711fcd0708..d66d40e5f7 100644 --- a/tests/Avalonia.Styling.UnitTests/StyledElementTests.cs +++ b/tests/Avalonia.Styling.UnitTests/StyledElementTests.cs @@ -11,6 +11,10 @@ using Xunit; using Avalonia.LogicalTree; using Avalonia.Controls; using System.ComponentModel; +using Avalonia.Controls.Primitives; +using Avalonia.Markup.Xaml.Templates; +using Avalonia.Controls.Templates; +using Avalonia.Data; namespace Avalonia.Styling.UnitTests { @@ -575,6 +579,53 @@ namespace Avalonia.Styling.UnitTests Times.Once); } + [Fact] + public void SetParent_Does_Not_Crash_Due_To_Reentrancy() + { + // Issue #3708 + var app = UnitTestApplication.Start(TestServices.StyledWindow); + + ContentControl target; + var root = new TestRoot + { + DataContext = false, + Child = target = new ContentControl + { + Styles = + { + new Style(x => x.OfType()) + { + Setters = + { + new Setter( + ContentControl.ContentProperty, + new FuncTemplate(() => new TextBlock { Text = "Enabled" })), + }, + }, + new Style(x => x.OfType().Class(":disabled")) + { + Setters = + { + new Setter( + ContentControl.ContentProperty, + new FuncTemplate(() => new TextBlock { Text = "Disabled" })), + }, + }, + }, + [!ContentControl.IsEnabledProperty] = new Binding(), + } + }; + + root.Measure(Size.Infinity); + root.Arrange(new Rect(0, 0, 100, 100)); + + var textBlock = Assert.IsType(target.Content); + Assert.Equal("Disabled", textBlock.Text); + + // #3708 was crashing here with AvaloniaInternalException. + root.Child = null; + } + private interface IDataContextEvents { event EventHandler DataContextBeginUpdate;