diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/DynamicResourceExtensionTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/DynamicResourceExtensionTests.cs index 96955539c1..adeae810c6 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/DynamicResourceExtensionTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/DynamicResourceExtensionTests.cs @@ -627,6 +627,137 @@ namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions Assert.Equal(0xff506070, brush.Color.ToUint32()); } + [Fact] + public void Resource_With_DynamicResource_Is_Updated_When_Added_To_Parent() + { + var xaml = @" + + + + + + +"; + + var loader = new AvaloniaXamlLoader(); + var userControl = (UserControl)loader.Load(xaml); + var border = userControl.FindControl("border"); + + DelayedBinding.ApplyBindings(border); + + var brush = (SolidColorBrush)border.Background; + Assert.Equal(0u, brush.Color.ToUint32()); + + brush.GetObservable(SolidColorBrush.ColorProperty).Subscribe(_ => { }); + + using (UnitTestApplication.Start(TestServices.StyledWindow)) + { + var window = new Window + { + Resources = + { + { "color", Colors.Red } + }, + Content = userControl, + }; + + window.Show(); + + Assert.Equal(Colors.Red, brush.Color); + } + } + + [Fact] + public void MergedDictionary_Resource_With_DynamicResource_Is_Updated_When_Added_To_Parent() + { + var xaml = @" + + + + + + + + + + + + +"; + + var loader = new AvaloniaXamlLoader(); + var userControl = (UserControl)loader.Load(xaml); + var border = userControl.FindControl("border"); + + DelayedBinding.ApplyBindings(border); + + var brush = (SolidColorBrush)border.Background; + Assert.Equal(0u, brush.Color.ToUint32()); + + brush.GetObservable(SolidColorBrush.ColorProperty).Subscribe(_ => { }); + + using (UnitTestApplication.Start(TestServices.StyledWindow)) + { + var window = new Window + { + Resources = + { + { "color", Colors.Red } + }, + Content = userControl, + }; + + window.Show(); + + Assert.Equal(Colors.Red, brush.Color); + } + } + + [Fact] + public void Style_Resource_With_DynamicResource_Is_Updated_When_Added_To_Parent() + { + var xaml = @" + + + + + + +"; + + var loader = new AvaloniaXamlLoader(); + var userControl = (UserControl)loader.Load(xaml); + var border = userControl.FindControl("border"); + + DelayedBinding.ApplyBindings(border); + + var brush = (SolidColorBrush)border.Background; + Assert.Equal(0u, brush.Color.ToUint32()); + + using (UnitTestApplication.Start(TestServices.StyledWindow)) + { + var window = new Window + { + Resources = + { + { "color", Colors.Red } + }, + Content = userControl, + }; + + window.Show(); + + Assert.Equal(Colors.Red, brush.Color); + } + } + private IDisposable StyledWindow(params (string, string)[] assets) { var services = TestServices.StyledWindow.With( diff --git a/tests/Avalonia.Styling.UnitTests/StyledElementTests.cs b/tests/Avalonia.Styling.UnitTests/StyledElementTests.cs index ae519ed674..3a676529c7 100644 --- a/tests/Avalonia.Styling.UnitTests/StyledElementTests.cs +++ b/tests/Avalonia.Styling.UnitTests/StyledElementTests.cs @@ -489,6 +489,53 @@ namespace Avalonia.Styling.UnitTests called); } + [Fact] + public void Changing_Parent_Notifies_Resources_ParentResourcesChanged() + { + var resources = new Mock(); + var setResourceParent = resources.As(); + var target = new TestControl { Resources = resources.Object }; + var parent = new Decorator { Resources = { { "foo", "bar" } } }; + + setResourceParent.ResetCalls(); + parent.Child = target; + + setResourceParent.Verify(x => + x.ParentResourcesChanged(It.IsAny()), + Times.Once); + } + + [Fact] + public void Changing_Parent_Notifies_Styles_ParentResourcesChanged() + { + var style = new Mock(); + var setResourceParent = style.As(); + var target = new TestControl { Styles = { style.Object } }; + var parent = new Decorator { Resources = { { "foo", "bar" } } }; + + setResourceParent.ResetCalls(); + parent.Child = target; + + setResourceParent.Verify(x => + x.ParentResourcesChanged(It.IsAny()), + Times.Once); + } + + [Fact] + public void Changing_Resources_Notifies_Styles() + { + var style = new Mock(); + var setResourceParent = style.As(); + var target = new TestControl { Styles = { style.Object } }; + + setResourceParent.ResetCalls(); + target.Resources.Add("foo", "bar"); + + setResourceParent.Verify(x => + x.ParentResourcesChanged(It.IsAny()), + Times.Once); + } + private interface IDataContextEvents { event EventHandler DataContextBeginUpdate; diff --git a/tests/Avalonia.Styling.UnitTests/StyledElementTests_Resources.cs b/tests/Avalonia.Styling.UnitTests/StyledElementTests_Resources.cs index b8d53b38b2..ee275ca4ba 100644 --- a/tests/Avalonia.Styling.UnitTests/StyledElementTests_Resources.cs +++ b/tests/Avalonia.Styling.UnitTests/StyledElementTests_Resources.cs @@ -205,7 +205,7 @@ namespace Avalonia.Controls.UnitTests } [Fact] - public void Setting_Logical_Parent_Subscribes_To_Parents_ResourceChanged_Event() + public void Setting_Logical_Parent_Raises_Child_ResourcesChanged() { var parent = new ContentControl(); var child = new StyledElement(); @@ -220,6 +220,23 @@ namespace Avalonia.Controls.UnitTests Assert.True(raisedOnChild); } + [Fact] + public void Setting_Logical_Parent_Raises_Style_ResourcesChanged() + { + var style = new Style(x => x.OfType()); + var parent = new ContentControl(); + var child = new StyledElement { Styles = { style } }; + + ((ISetLogicalParent)child).SetParent(parent); + var raised = false; + + style.ResourcesChanged += (_, __) => raised = true; + + parent.Resources.Add("foo", "bar"); + + Assert.True(raised); + } + private IControlTemplate ContentControlTemplate() { return new FuncControlTemplate((x, scope) =>