MenuItemTests.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Windows.Input;
  5. using Avalonia.Data;
  6. using Avalonia.Input;
  7. using Avalonia.UnitTests;
  8. using Xunit;
  9. namespace Avalonia.Controls.UnitTests
  10. {
  11. public class MenuItemTests
  12. {
  13. [Fact]
  14. public void Header_Of_Minus_Should_Apply_Separator_Pseudoclass()
  15. {
  16. var target = new MenuItem { Header = "-" };
  17. Assert.True(target.Classes.Contains(":separator"));
  18. }
  19. [Fact]
  20. public void Separator_Item_Should_Set_Focusable_False()
  21. {
  22. var target = new MenuItem { Header = "-" };
  23. Assert.False(target.Focusable);
  24. }
  25. [Fact]
  26. public void MenuItem_Is_Disabled_When_Command_Is_Enabled_But_IsEnabled_Is_False()
  27. {
  28. var command = new TestCommand(true);
  29. var target = new MenuItem
  30. {
  31. IsEnabled = false,
  32. Command = command,
  33. };
  34. var root = new TestRoot { Child = target };
  35. Assert.False(((IInputElement)target).IsEffectivelyEnabled);
  36. }
  37. [Fact]
  38. public void MenuItem_Is_Disabled_When_Bound_Command_Doesnt_Exist()
  39. {
  40. var target = new MenuItem
  41. {
  42. [!MenuItem.CommandProperty] = new Binding("Command"),
  43. };
  44. Assert.True(target.IsEnabled);
  45. Assert.False(target.IsEffectivelyEnabled);
  46. }
  47. [Fact]
  48. public void MenuItem_Is_Disabled_When_Bound_Command_Is_Removed()
  49. {
  50. var viewModel = new
  51. {
  52. Command = new TestCommand(true),
  53. };
  54. var target = new MenuItem
  55. {
  56. DataContext = viewModel,
  57. [!MenuItem.CommandProperty] = new Binding("Command"),
  58. };
  59. Assert.True(target.IsEnabled);
  60. Assert.True(target.IsEffectivelyEnabled);
  61. target.DataContext = null;
  62. Assert.True(target.IsEnabled);
  63. Assert.False(target.IsEffectivelyEnabled);
  64. }
  65. [Fact]
  66. public void MenuItem_Is_Enabled_When_Bound_Command_Is_Added()
  67. {
  68. var viewModel = new
  69. {
  70. Command = new TestCommand(true),
  71. };
  72. var target = new MenuItem
  73. {
  74. DataContext = new object(),
  75. [!MenuItem.CommandProperty] = new Binding("Command"),
  76. };
  77. Assert.True(target.IsEnabled);
  78. Assert.False(target.IsEffectivelyEnabled);
  79. target.DataContext = viewModel;
  80. Assert.True(target.IsEnabled);
  81. Assert.True(target.IsEffectivelyEnabled);
  82. }
  83. [Fact]
  84. public void MenuItem_Is_Disabled_When_Disabled_Bound_Command_Is_Added()
  85. {
  86. var viewModel = new
  87. {
  88. Command = new TestCommand(false),
  89. };
  90. var target = new MenuItem
  91. {
  92. DataContext = new object(),
  93. [!MenuItem.CommandProperty] = new Binding("Command"),
  94. };
  95. Assert.True(target.IsEnabled);
  96. Assert.False(target.IsEffectivelyEnabled);
  97. target.DataContext = viewModel;
  98. Assert.True(target.IsEnabled);
  99. Assert.False(target.IsEffectivelyEnabled);
  100. }
  101. [Fact]
  102. public void MenuItem_Does_Not_Subscribe_To_Command_CanExecuteChanged_Until_Added_To_Logical_Tree()
  103. {
  104. var command = new TestCommand();
  105. var target = new MenuItem
  106. {
  107. Command = command,
  108. };
  109. Assert.Equal(0, command.SubscriptionCount);
  110. }
  111. [Fact]
  112. public void MenuItem_Subscribes_To_Command_CanExecuteChanged_When_Added_To_Logical_Tree()
  113. {
  114. var command = new TestCommand();
  115. var target = new MenuItem { Command = command };
  116. var root = new TestRoot { Child = target };
  117. Assert.Equal(1, command.SubscriptionCount);
  118. }
  119. [Fact]
  120. public void MenuItem_Unsubscribes_From_Command_CanExecuteChanged_When_Removed_From_Logical_Tree()
  121. {
  122. var command = new TestCommand();
  123. var target = new MenuItem { Command = command };
  124. var root = new TestRoot { Child = target };
  125. root.Child = null;
  126. Assert.Equal(0, command.SubscriptionCount);
  127. }
  128. private class TestCommand : ICommand
  129. {
  130. private bool _enabled;
  131. private EventHandler _canExecuteChanged;
  132. public TestCommand(bool enabled = true)
  133. {
  134. _enabled = enabled;
  135. }
  136. public int SubscriptionCount { get; private set; }
  137. public event EventHandler CanExecuteChanged
  138. {
  139. add { _canExecuteChanged += value; ++SubscriptionCount; }
  140. remove { _canExecuteChanged -= value; --SubscriptionCount; }
  141. }
  142. public bool CanExecute(object parameter) => _enabled;
  143. public void Execute(object parameter)
  144. {
  145. }
  146. }
  147. }
  148. }