diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/EnumToEnumerable.cs b/tests/Avalonia.Markup.Xaml.UnitTests/EnumToEnumerable.cs new file mode 100644 index 00000000000..c3c037a924f --- /dev/null +++ b/tests/Avalonia.Markup.Xaml.UnitTests/EnumToEnumerable.cs @@ -0,0 +1,21 @@ +using System; + +namespace Avalonia.Markup.Xaml.UnitTests +{ + public class EnumToEnumerable : MarkupExtension + { + private readonly Type _enumType; + + public EnumToEnumerable(Type type) + { + if (!type.IsEnum) + throw new ArgumentException(nameof(type)); + _enumType = type; + } + + public override object ProvideValue(IServiceProvider serviceProvider) + { + return Enum.GetValues(_enumType); + } + } +} diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/MarkupExtensionTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/MarkupExtensionTests.cs new file mode 100644 index 00000000000..3af3d78a0a5 --- /dev/null +++ b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/MarkupExtensionTests.cs @@ -0,0 +1,32 @@ +using System.Collections; +using Avalonia.Controls; +using Avalonia.UnitTests; +using Xunit; + +namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions +{ + public class MarkupExtensionTests : XamlTestBase + { + [Fact] + public void Markup_Extension_Can_Accept_Nested_Type() + { + using (UnitTestApplication.Start(TestServices.MockWindowingPlatform)) + { + var xaml = @" + + +"; + + var window = AvaloniaRuntimeXamlLoader.Parse(xaml); + var listBox = (ListBox)window.Content; + var items = (IList)listBox.Items; + + Assert.Equal(2, items.Count); + Assert.Equal(TestViewModel.NestedEnum.Item1, items[0]); + Assert.Equal(TestViewModel.NestedEnum.Item2, items[1]); + } + } + } +} diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/TestViewModel.cs b/tests/Avalonia.Markup.Xaml.UnitTests/TestViewModel.cs index 93232cd3552..a964f68c283 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/TestViewModel.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/TestViewModel.cs @@ -37,5 +37,16 @@ public TestViewModel Child RaisePropertyChanged(); } } + + public class NestedType + { + public string String { get; set; } + } + + public enum NestedEnum + { + Item1, + Item2, + } } -} \ No newline at end of file +} diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/DataTemplateTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/DataTemplateTests.cs index 53881467e79..0e619129a55 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/DataTemplateTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/DataTemplateTests.cs @@ -1,5 +1,6 @@ using Avalonia.Controls; using Avalonia.Controls.Presenters; +using Avalonia.Markup.Xaml.Templates; using Avalonia.UnitTests; using Xunit; @@ -132,5 +133,47 @@ public void Can_Set_DataContext_In_DataTemplate() Assert.Same(viewModel.Child.Child, canvas.DataContext); } } + + [Fact] + public void DataType_Can_Be_Nested_Type() + { + using (UnitTestApplication.Start(TestServices.StyledWindow)) + { + var xaml = @" + + + + + + + +"; + var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); + var dataTemplate = (DataTemplate)window.DataTemplates[0]; + var target = window.FindControl("target"); + + window.DataContext = new TestViewModel.NestedType + { + String = "Nested" + }; + + window.ApplyTemplate(); + target.ApplyTemplate(); + ((ContentPresenter)target.Presenter).UpdateChild(); + + Assert.Equal(typeof(TestViewModel.NestedType), dataTemplate.DataType); + + var child = Assert.IsType(target.Presenter.Child); + Assert.Equal("Nested", child.Text); + Assert.Equal("NestedType", child.Tag); + } + } + + public class NestedType + { + } } }