using System.Linq; using Avalonia.Controls; using Avalonia.Controls.Primitives; using Avalonia.Controls.Templates; using Avalonia.Media; using Avalonia.Styling; using Avalonia.UnitTests; using Avalonia.VisualTree; using Xunit; #nullable enable namespace Avalonia.Base.UnitTests.Styling; public class StyledElementTests_Theming : ScopedTestBase { public class InlineTheme : ScopedTestBase { [Fact] public void Theme_Is_Applied_When_Attached_To_Logical_Tree() { var target = CreateTarget(); Assert.Null(target.Template); CreateRoot(target); Assert.NotNull(target.Template); var border = Assert.IsType(target.VisualChild); Assert.Equal(Brushes.Red, border.Background); target.Classes.Add("foo"); Assert.Equal(Brushes.Green, border.Background); } [Fact] public void Theme_Is_Applied_To_Derived_Class_When_Attached_To_Logical_Tree() { var target = new DerivedThemedControl { Theme = CreateTheme(), }; Assert.Null(target.Template); CreateRoot(target); Assert.NotNull(target.Template); var border = Assert.IsType(target.VisualChild); Assert.Equal(Brushes.Red, border.Background); target.Classes.Add("foo"); Assert.Equal(Brushes.Green, border.Background); } [Fact] public void Theme_Is_Detached_When_Theme_Property_Cleared() { var target = CreateTarget(); CreateRoot(target); Assert.NotNull(target.Template); target.Theme = null; Assert.Null(target.Template); } [Fact] public void Setting_Explicit_Theme_Detaches_Default_Theme() { var target = new ThemedControl(); var root = new TestRoot { Resources = { { typeof(ThemedControl), CreateTheme() } }, Child = target, }; root.LayoutManager.ExecuteInitialLayoutPass(); Assert.Equal("theme", target.Tag); target.Theme = new ControlTheme(typeof(ThemedControl)) { Setters = { new Setter(ThemedControl.BackgroundProperty, Brushes.Yellow), } }; root.LayoutManager.ExecuteLayoutPass(); Assert.Null(target.Tag); Assert.Equal(Brushes.Yellow, target.Background); } [Fact] public void Unrelated_Styles_Are_Not_Detached_When_Theme_Property_Cleared() { var target = CreateTarget(); CreateRoot(target, createAdditionalStyles: true); Assert.Equal("style", target.Tag); target.Theme = null; Assert.Equal("style", target.Tag); } [Fact] public void TemplatedParent_Theme_Is_Detached_From_Template_Controls_When_Theme_Property_Cleared() { var theme = new ControlTheme { TargetType = typeof(ThemedControl), Children = { new Style(x => x.Nesting().Template().OfType()) { Setters = { new Setter(Panel.BackgroundProperty, Brushes.Red), } }, } }; var target = CreateTarget(theme); target.Template = new FuncControlTemplate((o, n) => new Canvas()); var root = CreateRoot(target); var canvas = Assert.IsType(target.VisualChild); Assert.Equal(Brushes.Red, canvas.Background); target.Theme = null; Assert.Same(canvas, target.VisualChild); Assert.Null(canvas.Background); } [Fact] public void Primary_Theme_Is_Not_Detached_From_Template_Controls_When_Theme_Property_Cleared() { var templatedParentTheme = new ControlTheme { TargetType = typeof(ThemedControl), Children = { new Style(x => x.Nesting().Template().OfType