@ -1,5 +1,11 @@
using System ;
using System.Linq ;
using Avalonia.Controls ;
using Avalonia.Controls.Presenters ;
using Avalonia.Controls.Templates ;
using Avalonia.Markup.Xaml.Templates ;
using Avalonia.Markup.Xaml.UnitTests.MarkupExtensions ;
using Avalonia.Metadata ;
using Avalonia.UnitTests ;
using Xunit ;
@ -89,6 +95,93 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml
}
}
[Fact]
public void XDataType_Should_Be_Assigned_To_Clr_Property ( )
{
using ( UnitTestApplication . Start ( TestServices . StyledWindow ) )
{
var xaml = @ "
< Window xmlns = ' https : //github.com/avaloniaui'
xmlns : sys = ' clr - namespace : System ; assembly = netstandard '
xmlns : x = ' http : //schemas.microsoft.com/winfx/2006/xaml'>
< Window . DataTemplates >
< DataTemplate x : DataType = ' sys : String ' >
< Canvas Name = ' foo ' / >
< / DataTemplate >
< / Window . DataTemplates >
< ContentControl Name = ' target ' Content = ' Foo ' / >
< / Window > ";
var window = ( Window ) AvaloniaRuntimeXamlLoader . Load ( xaml ) ;
var target = window . FindControl < ContentControl > ( "target" ) ;
var template = ( DataTemplate ) window . DataTemplates . First ( ) ;
window . ApplyTemplate ( ) ;
target . ApplyTemplate ( ) ;
( ( ContentPresenter ) target . Presenter ) . UpdateChild ( ) ;
Assert . Equal ( typeof ( string ) , template . DataType ) ;
Assert . IsType < Canvas > ( target . Presenter . Child ) ;
}
}
[Fact]
public void XDataType_Should_Be_Ignored_If_DataType_Already_Set ( )
{
using ( UnitTestApplication . Start ( TestServices . StyledWindow ) )
{
var xaml = @ "
< Window xmlns = ' https : //github.com/avaloniaui'
xmlns : sys = ' clr - namespace : System ; assembly = netstandard '
xmlns : x = ' http : //schemas.microsoft.com/winfx/2006/xaml'>
< Window . DataTemplates >
< DataTemplate DataType = ' sys : String ' x : DataType = ' UserControl ' >
< Canvas Name = ' foo ' / >
< / DataTemplate >
< / Window . DataTemplates >
< ContentControl Name = ' target ' Content = ' Foo ' / >
< / Window > ";
var window = ( Window ) AvaloniaRuntimeXamlLoader . Load ( xaml ) ;
var target = window . FindControl < ContentControl > ( "target" ) ;
window . ApplyTemplate ( ) ;
target . ApplyTemplate ( ) ;
( ( ContentPresenter ) target . Presenter ) . UpdateChild ( ) ;
Assert . IsType < Canvas > ( target . Presenter . Child ) ;
}
}
[Fact]
public void XDataType_Should_Be_Ignored_If_DataType_Has_Non_Standard_Name ( )
{
// We don't want DataType to be mapped to FancyDataType, avoid possible confusion.
using ( UnitTestApplication . Start ( TestServices . StyledWindow ) )
{
var xaml = @ "
< Window xmlns = ' https : //github.com/avaloniaui'
xmlns : sys = ' clr - namespace : System ; assembly = netstandard '
xmlns : x = ' http : //schemas.microsoft.com/winfx/2006/xaml'
xmlns : local = ' clr - namespace : Avalonia . Markup . Xaml . UnitTests . MarkupExtensions ; assembly = Avalonia . Markup . Xaml . UnitTests ' >
< ContentControl Name = ' target ' Content = ' Foo ' >
< ContentControl . ContentTemplate >
< local : CustomDataTemplate x : DataType = ' local : TestDataContext ' >
< TextBlock Text = ' { CompiledBinding StringProperty } ' Name = ' textBlock ' / >
< / local : CustomDataTemplate >
< / ContentControl . ContentTemplate >
< / ContentControl >
< / Window > ";
var window = ( Window ) AvaloniaRuntimeXamlLoader . Load ( xaml ) ;
var target = window . FindControl < ContentControl > ( "target" ) ;
window . ApplyTemplate ( ) ;
target . ApplyTemplate ( ) ;
( ( ContentPresenter ) target . Presenter ) . UpdateChild ( ) ;
var dataTemplate = ( CustomDataTemplate ) target . ContentTemplate ;
Assert . Null ( dataTemplate . FancyDataType ) ;
}
}
[Fact]
public void Can_Set_DataContext_In_DataTemplate ( )
{
@ -132,5 +225,25 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml
Assert . Same ( viewModel . Child . Child , canvas . DataContext ) ;
}
}
[Fact]
public void DataTemplates_Without_Type_Should_Throw ( )
{
using ( UnitTestApplication . Start ( TestServices . StyledWindow ) )
{
var xaml = @ "
< Window xmlns = ' https : //github.com/avaloniaui'
xmlns : sys = ' clr - namespace : System ; assembly = netstandard '
xmlns : x = ' http : //schemas.microsoft.com/winfx/2006/xaml'>
< Window . DataTemplates >
< DataTemplate >
< Canvas Name = ' foo ' / >
< / DataTemplate >
< / Window . DataTemplates >
< ContentControl Name = ' target ' Content = ' Foo ' / >
< / Window > ";
Assert . Throws < InvalidOperationException > ( ( ) = > ( Window ) AvaloniaRuntimeXamlLoader . Load ( xaml ) ) ;
}
}
}
}