Explorar o código

Bring additional tests for binding hooks

artyom %!s(int64=5) %!d(string=hai) anos
pai
achega
b2b7fafabf

+ 54 - 10
tests/Avalonia.ReactiveUI.UnitTests/AutoDataTemplateBindingHookTest.cs

@@ -28,11 +28,36 @@ namespace Avalonia.ReactiveUI.UnitTests
 
 
         public class ExampleView : ReactiveUserControl<ExampleViewModel>
         public class ExampleView : ReactiveUserControl<ExampleViewModel>
         {
         {
-            public ItemsControl List { get; } = new ItemsControl();
+            public ItemsControl List { get; } = new ItemsControl
+            {
+                Template = GetTemplate()
+            };
 
 
             public ExampleView()
             public ExampleView()
             {
             {
+                List.ApplyTemplate();
+                List.Presenter.ApplyTemplate();
                 Content = List;
                 Content = List;
+
+                ViewModel = new ExampleViewModel();
+                this.OneWayBind(ViewModel, x => x.Items, x => x.List.Items);
+            }
+        }
+
+        public class ExampleViewWithItemTemplate : ReactiveUserControl<ExampleViewModel>
+        {
+            public ItemsControl List { get; } = new ItemsControl
+            {
+                Template = GetTemplate()
+            };
+
+            public ExampleViewWithItemTemplate()
+            {
+                List.ApplyTemplate();
+                List.Presenter.ApplyTemplate();
+                List.ItemTemplate = GetItemTemplate();
+                Content = List;
+
                 ViewModel = new ExampleViewModel();
                 ViewModel = new ExampleViewModel();
                 this.OneWayBind(ViewModel, x => x.Items, x => x.List.Items);
                 this.OneWayBind(ViewModel, x => x.Items, x => x.List.Items);
             }
             }
@@ -50,6 +75,15 @@ namespace Avalonia.ReactiveUI.UnitTests
         {
         {
             var view = new ExampleView();
             var view = new ExampleView();
             Assert.NotNull(view.List.ItemTemplate);
             Assert.NotNull(view.List.ItemTemplate);
+            Assert.IsType<FuncDataTemplate<object>>(view.List.ItemTemplate);
+        }
+
+        [Fact]
+        public void Should_Not_Override_Data_Template_Binding_When_Item_Template_Is_Set()
+        {
+            var view = new ExampleViewWithItemTemplate();
+            Assert.NotNull(view.List.ItemTemplate);
+            Assert.IsType<FuncDataTemplate<TextBlock>>(view.List.ItemTemplate);
         }
         }
 
 
         [Fact]
         [Fact]
@@ -58,10 +92,6 @@ namespace Avalonia.ReactiveUI.UnitTests
             var view = new ExampleView();
             var view = new ExampleView();
             view.ViewModel.Items.Add(new NestedViewModel());
             view.ViewModel.Items.Add(new NestedViewModel());
 
 
-            view.List.Template = GetTemplate();
-            view.List.ApplyTemplate();
-            view.List.Presenter.ApplyTemplate();
-
             var child = view.List.Presenter.Panel.Children[0];
             var child = view.List.Presenter.Panel.Children[0];
             var container = (ContentPresenter) child;
             var container = (ContentPresenter) child;
             container.UpdateChild();
             container.UpdateChild();
@@ -69,6 +99,19 @@ namespace Avalonia.ReactiveUI.UnitTests
             Assert.IsType<ViewModelViewHost>(container.Child);
             Assert.IsType<ViewModelViewHost>(container.Child);
         }
         }
 
 
+        [Fact]
+        public void Should_Not_Use_View_Model_View_Host_When_Item_Template_Is_Set()
+        {
+            var view = new ExampleViewWithItemTemplate();
+            view.ViewModel.Items.Add(new NestedViewModel());
+
+            var child = view.List.Presenter.Panel.Children[0];
+            var container = (ContentPresenter) child;
+            container.UpdateChild();
+
+            Assert.IsType<TextBlock>(container.Child);
+        }
+
         [Fact]
         [Fact]
         public void Should_Resolve_And_Embedd_Appropriate_View_Model()
         public void Should_Resolve_And_Embedd_Appropriate_View_Model()
         {
         {
@@ -76,10 +119,6 @@ namespace Avalonia.ReactiveUI.UnitTests
             var root = new TestRoot { Child = view };
             var root = new TestRoot { Child = view };
             view.ViewModel.Items.Add(new NestedViewModel());
             view.ViewModel.Items.Add(new NestedViewModel());
 
 
-            view.List.Template = GetTemplate();
-            view.List.ApplyTemplate();
-            view.List.Presenter.ApplyTemplate();
-
             var child = view.List.Presenter.Panel.Children[0];
             var child = view.List.Presenter.Panel.Children[0];
             var container = (ContentPresenter) child;
             var container = (ContentPresenter) child;
             container.UpdateChild();
             container.UpdateChild();
@@ -93,7 +132,12 @@ namespace Avalonia.ReactiveUI.UnitTests
             Assert.IsType<string>(host.DataContext);
             Assert.IsType<string>(host.DataContext);
         }
         }
 
 
-        private FuncControlTemplate GetTemplate()
+        private static FuncDataTemplate GetItemTemplate()
+        {
+            return new FuncDataTemplate<TextBlock>((parent, scope) => new TextBlock());
+        }
+
+        private static FuncControlTemplate GetTemplate()
         {
         {
             return new FuncControlTemplate<ItemsControl>((parent, scope) =>
             return new FuncControlTemplate<ItemsControl>((parent, scope) =>
             {
             {