Browse Source

Added failing test for #10626 and #10718.

Steven Kirk 2 years ago
parent
commit
7bb6d06ac5
1 changed files with 44 additions and 0 deletions
  1. 44 0
      tests/Avalonia.Controls.UnitTests/MenuItemTests.cs

+ 44 - 0
tests/Avalonia.Controls.UnitTests/MenuItemTests.cs

@@ -3,7 +3,9 @@ using System.Collections.Generic;
 using System.Text;
 using System.Windows.Input;
 using Avalonia.Collections;
+using Avalonia.Controls.Presenters;
 using Avalonia.Controls.Primitives;
+using Avalonia.Controls.Templates;
 using Avalonia.Data;
 using Avalonia.Input;
 using Avalonia.Platform;
@@ -348,6 +350,46 @@ namespace Avalonia.Controls.UnitTests
             }
         }
 
+        [Fact]
+        public void Menu_ItemTemplate_Should_Be_Applied_To_TopLevel_MenuItem_Header()
+        {
+            using var app = Application();
+
+            var items = new[]
+            {
+                new MenuViewModel("Foo"),
+                new MenuViewModel("Bar"),
+            };
+
+            var itemTemplate = new FuncDataTemplate<MenuViewModel>((x, _) =>
+                new TextBlock { Text = x.Header });
+
+            var menu = new Menu
+            {
+                ItemTemplate = itemTemplate,
+                ItemsSource = items,
+            };
+
+            var window = new Window { Content = menu };
+            window.LayoutManager.ExecuteInitialLayoutPass();
+
+            var panel = Assert.IsType<StackPanel>(menu.Presenter.Panel);
+            Assert.Equal(2, panel.Children.Count);
+
+            for (var i = 0; i <  panel.Children.Count; i++)
+            {
+                var menuItem = Assert.IsType<MenuItem>(panel.Children[i]);
+
+                Assert.Equal(items[i], menuItem.Header);
+
+                var headerPresenter = Assert.IsType<ContentPresenter>(menuItem.HeaderPresenter);
+                Assert.Same(itemTemplate, headerPresenter.ContentTemplate);
+
+                var headerControl = Assert.IsType<TextBlock>(headerPresenter.Child);
+                Assert.Equal(items[i].Header, headerControl.Text);
+            }
+        }
+
         private IDisposable Application()
         {
             var screen = new PixelRect(new PixelPoint(), new PixelSize(100, 100));
@@ -401,5 +443,7 @@ namespace Avalonia.Controls.UnitTests
 
             public void RaiseCanExecuteChanged() => _canExecuteChanged?.Invoke(this, EventArgs.Empty);
         }
+
+        private record MenuViewModel(string Header);
     }
 }