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(preview);
}
}
[Fact]
public void Design_Mode_PreviewWith_Works_With_Control_Template()
{
using (UnitTestApplication.Start(TestServices.MockWindowingPlatform))
{
var obj = (Control)AvaloniaRuntimeXamlLoader.Load(@"
", designMode: true);
var preview = Design.CreatePreviewWithControl(obj);
var previewBorder = Assert.IsType(preview);
Assert.IsType(previewBorder.Child);
}
}
[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);
}
}