A cross-platform UI framework for .NET
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

193 lines
7.2 KiB

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(@"
<Button xmlns='https://github.com/avaloniaui'>
<Design.PreviewWith>
<Template>
<Border />
</Template>
</Design.PreviewWith>
</Button>", designMode: false);
var preview = Design.CreatePreviewWithControl(obj);
// Should return the original control, not the preview.
Assert.IsType<Button>(preview);
}
}
[Fact]
public void Design_Mode_PreviewWith_Works_With_Control_Template()
{
using (UnitTestApplication.Start(TestServices.MockWindowingPlatform))
{
var obj = (Control)AvaloniaRuntimeXamlLoader.Load(@"
<Button xmlns='https://github.com/avaloniaui'>
<Design.PreviewWith>
<Template>
<Border>
<Button />
</Border>
</Template>
</Design.PreviewWith>
</Button>", designMode: true);
var preview = Design.CreatePreviewWithControl(obj);
var previewBorder = Assert.IsType<Border>(preview);
Assert.IsType<Button>(previewBorder.Child);
}
}
[Fact]
public void Design_Mode_PreviewWith_Works_With_Style()
{
using (UnitTestApplication.Start(TestServices.MockWindowingPlatform))
{
var obj = (Style)AvaloniaRuntimeXamlLoader.Load(@"
<Style xmlns='https://github.com/avaloniaui'
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
Selector='Border.preview-border' >
<Design.PreviewWith>
<Border Classes='preview-border' />
</Design.PreviewWith>
<Setter Property='Background' Value='Red'/>
</Style>", designMode: true);
var preview = Design.CreatePreviewWithControl(obj);
var previewBorder = Assert.IsType<Border>(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(@"
<ResourceDictionary xmlns='https://github.com/avaloniaui'
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
<Design.PreviewWith>
<Border Background='{DynamicResource PreviewBackground}' />
</Design.PreviewWith>
<SolidColorBrush x:Key='PreviewBackground' Color='Red'/>
</ResourceDictionary>", designMode: true);
var preview = Design.CreatePreviewWithControl(obj);
var previewBorder = Assert.IsType<Border>(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(@"
<DataTemplate xmlns='https://github.com/avaloniaui'
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
x:DataType='SolidColorBrush'>
<Design.PreviewWith>
<ContentControl>
<ContentControl.Content>
<SolidColorBrush Color='Red'/>
</ContentControl.Content>
</ContentControl>
</Design.PreviewWith>
<Border Background='{Binding}' />
</DataTemplate>", designMode: true);
var preview = Design.CreatePreviewWithControl(obj);
var previewContentControl = Assert.IsType<ContentControl>(preview);
previewContentControl.ApplyTemplate();
previewContentControl.Presenter!.UpdateChild();
var border = previewContentControl.FindDescendantOfType<Border>();
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(@"
<Window xmlns='https://github.com/avaloniaui'
xmlns:d='http://schemas.microsoft.com/expression/blend/2008'
xmlns:mc='http://schemas.openxmlformats.org/markup-compatibility/2006'
mc:Ignorable='d'
d:DataContext='data-context'
d:DesignWidth='123'
d:DesignHeight='321'>
</Window>", 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<Exception>(() => AvaloniaRuntimeXamlLoader
.Load(@"
<UserControl
xmlns='https://github.com/avaloniaui'
xmlns:d='http://schemas.microsoft.com/expression/blend/2008'
xmlns:tests='using:Avalonia.Markup.Xaml.UnitTests.Xaml'
d:DataContext='{x:Static tests:DesignModeTests.SomeStaticPropery}'
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'/>", 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(@"
<UserControl
xmlns='https://github.com/avaloniaui'
xmlns:d='http://schemas.microsoft.com/expression/blend/2008'
xmlns:tests='using:Avalonia.Markup.Xaml.UnitTests.Xaml'
d:DataContext='{x:Static tests:DesignModeTests.SomeStaticProperty}'
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'/>", typeof(XamlIlTests).Assembly,
designMode: true);
Assert.Equal(Design.GetDataContext(loaded), SomeStaticProperty);
}
}