using System; using Avalonia.Controls; using Avalonia.Markup.Xaml.Templates; using Avalonia.Media; using Avalonia.Styling; using Avalonia.UnitTests; using Avalonia.VisualTree; using Xunit; namespace Avalonia.Markup.Xaml.UnitTests.Xaml; public class DesignModeTests : XamlTestBase { public static object? SomeStaticProperty { get; set; } [Fact] public void Design_Mode_PreviewWith_Should_Be_Ignored_Without_Design_Mode() { using (UnitTestApplication.Start(TestServices.MockWindowingPlatform)) { var obj = (Control)AvaloniaRuntimeXamlLoader.Load(@" ", designMode: false); var preview = Design.CreatePreviewWithControl(obj); // Should return the original control, not the preview. Assert.IsType", designMode: true); var preview = Design.CreatePreviewWithControl(obj); // Should return the original control, not the preview, as this is not supported to avoid stack overflows. Assert.Same(obj, preview); } } [Fact] public void Design_Mode_PreviewWith_Works_With_Style() { using (UnitTestApplication.Start(TestServices.MockWindowingPlatform)) { var obj = (Style)AvaloniaRuntimeXamlLoader.Load(@" ", designMode: true); var preview = Design.CreatePreviewWithControl(obj); var previewBorder = Assert.IsType(preview); previewBorder.ApplyStyling(); Assert.Equal(Colors.Red, (previewBorder.Background as ISolidColorBrush)?.Color); } } [Fact] public void Design_Mode_PreviewWith_Works_With_ResourceDictionary() { using (UnitTestApplication.Start(TestServices.MockWindowingPlatform)) { var obj = (ResourceDictionary)AvaloniaRuntimeXamlLoader.Load(@" ", designMode: true); var preview = Design.CreatePreviewWithControl(obj); var previewBorder = Assert.IsType(preview); Assert.Equal(Colors.Red, (previewBorder.Background as ISolidColorBrush)?.Color); } } [Fact] public void Design_Mode_PreviewWith_Works_With_IDataTemplate() { using (UnitTestApplication.Start(TestServices.MockWindowingPlatform)) { var obj = (DataTemplate)AvaloniaRuntimeXamlLoader.Load(@" ", designMode: true); var preview = Design.CreatePreviewWithControl(obj); var previewContentControl = Assert.IsType(preview); previewContentControl.ApplyTemplate(); previewContentControl.Presenter!.UpdateChild(); var border = previewContentControl.FindDescendantOfType(); Assert.NotNull(border); Assert.Equal(Colors.Red, (border.Background as ISolidColorBrush)?.Color); } } [Fact] public void Design_Mode_Properties_Should_Be_Ignored_At_Runtime_And_Set_In_Design_Mode() { using (UnitTestApplication.Start(TestServices.MockWindowingPlatform)) { foreach (var designMode in new[] { true, false }) { var obj = (Window)AvaloniaRuntimeXamlLoader.Load(@" ", designMode: designMode); var context = Design.GetDataContext(obj); var width = Design.GetWidth(obj); var height = Design.GetHeight(obj); if (designMode) { Assert.Equal("data-context", context); Assert.Equal(123, width); Assert.Equal(321, height); } else { Assert.False(obj.IsSet(Design.DataContextProperty)); Assert.False(obj.IsSet(Design.WidthProperty)); Assert.False(obj.IsSet(Design.HeightProperty)); } } } } // https://github.com/AvaloniaUI/Avalonia/issues/2570 [Fact] public void Design_Mode_Throws_On_Invalid_Static_Property_Reference() { SomeStaticProperty = "123"; var ex = Assert.ThrowsAny(() => AvaloniaRuntimeXamlLoader .Load(@" ", typeof(XamlIlTests).Assembly, designMode: true)); Assert.Contains("Unable to resolve ", ex.Message); Assert.Contains(" as static field, property, constant or enum value", ex.Message); } [Fact] public void Design_Mode_DataContext_Should_Be_Set() { SomeStaticProperty = "123"; var loaded = (UserControl)AvaloniaRuntimeXamlLoader .Load(@" ", typeof(XamlIlTests).Assembly, designMode: true); Assert.Equal(Design.GetDataContext(loaded), SomeStaticProperty); } }