using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Runtime.CompilerServices; using System.Xml; using Avalonia.Controls; using Avalonia.Markup.Xaml.Styling; using Avalonia.Markup.Xaml.Templates; using Avalonia.Media; using Avalonia.Styling; using Avalonia.UnitTests; using Xunit; namespace Avalonia.Markup.Xaml.UnitTests.Xaml { public class StyleTests : XamlTestBase { [Fact] public void Color_Can_Be_Added_To_Style_Resources() { using (UnitTestApplication.Start(TestServices.MockPlatformWrapper)) { var xaml = @" "; var userControl = (UserControl)AvaloniaRuntimeXamlLoader.Load(xaml); var color = (Color)((Style)userControl.Styles[0]).Resources["color"]; Assert.Equal(0xff506070, color.ToUInt32()); } } [Fact] public void DataTemplate_Can_Be_Added_To_Style_Resources() { using (UnitTestApplication.Start(TestServices.MockPlatformWrapper)) { var xaml = @" "; var userControl = (UserControl)AvaloniaRuntimeXamlLoader.Load(xaml); var dataTemplate = (DataTemplate)((Style)userControl.Styles[0]).Resources["dataTemplate"]; Assert.NotNull(dataTemplate); } } [Fact] public void ControlTemplate_Can_Be_Added_To_Style_Resources() { using (UnitTestApplication.Start(TestServices.MockPlatformWrapper)) { var xaml = @" "; var userControl = (UserControl)AvaloniaRuntimeXamlLoader.Load(xaml); var controlTemplate = (ControlTemplate)((Style)userControl.Styles[0]).Resources["controlTemplate"]; Assert.NotNull(controlTemplate); Assert.Equal(typeof(Button), controlTemplate.TargetType); } } [Fact] public void SolidColorBrush_Can_Be_Added_To_Style_Resources() { using (UnitTestApplication.Start(TestServices.MockPlatformWrapper)) { var xaml = @" "; var userControl = (UserControl)AvaloniaRuntimeXamlLoader.Load(xaml); var brush = (ISolidColorBrush)((Style)userControl.Styles[0]).Resources["brush"]; Assert.Equal(0xff506070, brush.Color.ToUInt32()); } } [Fact] public void Setter_Can_Contain_Template() { using (UnitTestApplication.Start(TestServices.StyledWindow)) { var xaml = @" "; var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); var target = window.Find("target"); Assert.IsType(target.Content); Assert.Equal("Hello World!", ((TextBlock)target.Content).Text); } } [Fact] public void Setter_Value_Is_Bound_Directly_If_The_Target_Type_Derives_From_ITemplate() { using (UnitTestApplication.Start(TestServices.StyledWindow)) { var xaml = @" "; var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); var target = window.Find("target"); Assert.NotNull(target.FocusAdorner); } } [Fact] public void Setter_Can_Set_Attached_Property() { using (UnitTestApplication.Start(TestServices.StyledWindow)) { var xaml = @" "; var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); var textBlock = (TextBlock)window.Content; window.ApplyTemplate(); Assert.Equal(Dock.Right, DockPanel.GetDock(textBlock)); } } [Fact(Skip = "The animation system currently needs to be able to set any property on any object")] public void Disallows_Setting_Non_Registered_Property() { using (UnitTestApplication.Start(TestServices.StyledWindow)) { var xaml = @" "; var ex = Assert.Throws(() => AvaloniaRuntimeXamlLoader.Load(xaml)); Assert.Equal( "Property 'Button.IsDefault' is not registered on 'Avalonia.Controls.TextBlock'.", ex.InnerException.Message); } } [Fact] public void Style_Can_Use_Not_Selector() { using (UnitTestApplication.Start(TestServices.StyledWindow)) { var xaml = @" "; var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); var foo = window.FindControl("foo"); var notFoo = window.FindControl("notFoo"); Assert.Null(foo.Background); Assert.Equal(Colors.Red, ((ISolidColorBrush)notFoo.Background).Color); } } [Fact] public void Style_Can_Use_NthChild_Selector() { using (UnitTestApplication.Start(TestServices.StyledWindow)) { var xaml = @" "; var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); var b1 = window.FindControl("b1"); var b2 = window.FindControl("b2"); Assert.Equal(Brushes.Red, b1.Background); Assert.Null(b2.Background); } } [Fact] public void Style_Can_Use_NthChild_Selector_After_Reorder() { using (UnitTestApplication.Start(TestServices.StyledWindow)) { var xaml = @" "; var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); var parent = window.FindControl("parent"); var b1 = window.FindControl("b1"); var b2 = window.FindControl("b2"); Assert.Null(b1.Background); Assert.Equal(Brushes.Red, b2.Background); parent.Children.Remove(b1); Assert.Null(b1.Background); Assert.Null(b2.Background); parent.Children.Add(b1); Assert.Equal(Brushes.Red, b1.Background); Assert.Null(b2.Background); } } [Fact] public void Style_Can_Use_NthLastChild_Selector_After_Reorder() { using (UnitTestApplication.Start(TestServices.StyledWindow)) { var xaml = @" "; var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); var parent = window.FindControl("parent"); var b1 = window.FindControl("b1"); var b2 = window.FindControl("b2"); Assert.Equal(Brushes.Red, b1.Background); Assert.Null(b2.Background); parent.Children.Remove(b1); Assert.Null(b1.Background); Assert.Null(b2.Background); parent.Children.Add(b1); Assert.Null(b1.Background); Assert.Equal(Brushes.Red, b2.Background); } } [Fact] public void Style_Can_Use_NthChild_Selector_With_ListBox() { using (UnitTestApplication.Start(TestServices.StyledWindow)) { var xaml = @" "; var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); var collection = new ObservableCollection() { Brushes.Red, Brushes.Green, Brushes.Blue }; var list = window.FindControl("list"); list.ItemsSource = collection; window.Show(); IEnumerable GetColors() => list.GetRealizedContainers().Cast().Select(t => t.Background); Assert.Equal(new[] { Brushes.Transparent, Brushes.Green, Brushes.Transparent }, GetColors()); collection.Remove(Brushes.Green); window.UpdateLayout(); Assert.Equal(new[] { Brushes.Transparent, Brushes.Blue }, GetColors()); collection.Add(Brushes.Violet); collection.Add(Brushes.Black); window.UpdateLayout(); Assert.Equal(new[] { Brushes.Transparent, Brushes.Blue, Brushes.Transparent, Brushes.Black }, GetColors()); } } [Fact] public void Style_Can_Use_Or_Selector_1() { using (UnitTestApplication.Start(TestServices.StyledWindow)) { var xaml = @" "; var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); var foo = window.FindControl("foo"); var bar = window.FindControl("bar"); var baz = window.FindControl("baz"); Assert.Equal(Brushes.Red, foo.Background); Assert.Equal(Brushes.Red, bar.Background); Assert.Null(baz.Background); } } [Fact] public void Style_Can_Use_Or_Selector_2() { using (UnitTestApplication.Start(TestServices.StyledWindow)) { var xaml = @"