Browse Source

Enable nullability in Controls.UnitTests (#20373)

pull/20378/head
Julien Lebosquain 1 month ago
committed by GitHub
parent
commit
960cb39414
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 2
      src/Avalonia.Controls/HotkeyManager.cs
  2. 8
      tests/Avalonia.Controls.UnitTests/ApplicationTests.cs
  3. 105
      tests/Avalonia.Controls.UnitTests/AutoCompleteBoxTests.cs
  4. 1
      tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.csproj
  5. 15
      tests/Avalonia.Controls.UnitTests/ButtonTests.cs
  6. 5
      tests/Avalonia.Controls.UnitTests/CalendarDatePickerTests.cs
  7. 22
      tests/Avalonia.Controls.UnitTests/CalendarTests.cs
  8. 6
      tests/Avalonia.Controls.UnitTests/CarouselTests.cs
  9. 24
      tests/Avalonia.Controls.UnitTests/ComboBoxTests.cs
  10. 45
      tests/Avalonia.Controls.UnitTests/ContentControlTests.cs
  11. 94
      tests/Avalonia.Controls.UnitTests/ContextMenuTests.cs
  12. 62
      tests/Avalonia.Controls.UnitTests/DatePickerTests.cs
  13. 4
      tests/Avalonia.Controls.UnitTests/DesktopStyleApplicationLifetimeTests.cs
  14. 18
      tests/Avalonia.Controls.UnitTests/FlyoutTests.cs
  15. 6
      tests/Avalonia.Controls.UnitTests/GridTests.cs
  16. 2
      tests/Avalonia.Controls.UnitTests/HeaderedItemsControlTests .cs
  17. 16
      tests/Avalonia.Controls.UnitTests/HotKeyedControlsTests.cs
  18. 4
      tests/Avalonia.Controls.UnitTests/InlineTests.cs
  19. 17
      tests/Avalonia.Controls.UnitTests/ItemsSourceViewTests.cs
  20. 8
      tests/Avalonia.Controls.UnitTests/LayoutTransformControlTests.cs
  21. 93
      tests/Avalonia.Controls.UnitTests/ListBoxTests.cs
  22. 122
      tests/Avalonia.Controls.UnitTests/ListBoxTests_Multiple.cs
  23. 32
      tests/Avalonia.Controls.UnitTests/ListBoxTests_Single.cs
  24. 8
      tests/Avalonia.Controls.UnitTests/MaskedTextBoxTests.cs
  25. 22
      tests/Avalonia.Controls.UnitTests/MenuItemTests.cs
  26. 3
      tests/Avalonia.Controls.UnitTests/NameScopeTests.cs
  27. 21
      tests/Avalonia.Controls.UnitTests/NumericUpDownTests.cs
  28. 17
      tests/Avalonia.Controls.UnitTests/Platform/DefaultMenuInteractionHandlerTests.cs
  29. 16
      tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_InTemplate.cs
  30. 7
      tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Standalone.cs
  31. 6
      tests/Avalonia.Controls.UnitTests/Presenters/ScrollContentPresenterTests.cs
  32. 6
      tests/Avalonia.Controls.UnitTests/Presenters/ScrollContentPresenterTests_ILogicalScrollable.cs
  33. 2
      tests/Avalonia.Controls.UnitTests/Presenters/TextPresenter_Tests.cs
  34. 47
      tests/Avalonia.Controls.UnitTests/Primitives/PopupRootTests.cs
  35. 36
      tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs
  36. 6
      tests/Avalonia.Controls.UnitTests/Primitives/RangeBaseTests.cs
  37. 4
      tests/Avalonia.Controls.UnitTests/Primitives/ScrollBarTests.cs
  38. 66
      tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs
  39. 4
      tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests_AutoSelect.cs
  40. 8
      tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests_SelectedValue.cs
  41. 2
      tests/Avalonia.Controls.UnitTests/Primitives/TabStripTests.cs
  42. 6
      tests/Avalonia.Controls.UnitTests/Primitives/TemplatedControlTests.cs
  43. 8
      tests/Avalonia.Controls.UnitTests/ScrollViewerTests.cs
  44. 4
      tests/Avalonia.Controls.UnitTests/SelectableTextBlockTests.cs
  45. 14
      tests/Avalonia.Controls.UnitTests/Selection/InternalSelectionModelTests.cs
  46. 10
      tests/Avalonia.Controls.UnitTests/Shapes/PathTests.cs
  47. 6
      tests/Avalonia.Controls.UnitTests/SplitButtonTests.cs
  48. 10
      tests/Avalonia.Controls.UnitTests/SplitViewTests.cs
  49. 27
      tests/Avalonia.Controls.UnitTests/TabControlTests.cs
  50. 20
      tests/Avalonia.Controls.UnitTests/TextBlockTests.cs
  51. 25
      tests/Avalonia.Controls.UnitTests/TextBoxTests_DataValidation.cs
  52. 58
      tests/Avalonia.Controls.UnitTests/TimePickerTests.cs
  53. 34
      tests/Avalonia.Controls.UnitTests/ToolTipTests.cs
  54. 21
      tests/Avalonia.Controls.UnitTests/TopLevelTests.cs
  55. 7
      tests/Avalonia.Controls.UnitTests/Utils/AncestorFinderTests.cs
  56. 2
      tests/Avalonia.Controls.UnitTests/Utils/CollectionChangedEventManagerTests.cs
  57. 49
      tests/Avalonia.Controls.UnitTests/Utils/HotKeyManagerTests.cs
  58. 14
      tests/Avalonia.Controls.UnitTests/Utils/TestCommand.cs
  59. 16
      tests/Avalonia.Controls.UnitTests/WindowBaseTests.cs
  60. 22
      tests/Avalonia.Controls.UnitTests/WindowTests.cs
  61. 4
      tests/Avalonia.UnitTests/MockWindowingPlatform.cs

2
src/Avalonia.Controls/HotkeyManager.cs

@ -159,7 +159,7 @@ namespace Avalonia.Controls
new Manager(control).Init(); new Manager(control).Init();
}); });
} }
public static void SetHotKey(AvaloniaObject target, KeyGesture value) => target.SetValue(HotKeyProperty, value); public static void SetHotKey(AvaloniaObject target, KeyGesture? value) => target.SetValue(HotKeyProperty, value);
public static KeyGesture? GetHotKey(AvaloniaObject target) => target.GetValue(HotKeyProperty); public static KeyGesture? GetHotKey(AvaloniaObject target) => target.GetValue(HotKeyProperty);
} }
} }

8
tests/Avalonia.Controls.UnitTests/ApplicationTests.cs

@ -12,7 +12,7 @@ namespace Avalonia.Controls.UnitTests
{ {
using (UnitTestApplication.Start(TestServices.StyledWindow)) using (UnitTestApplication.Start(TestServices.StyledWindow))
{ {
Assert.Throws<ArgumentNullException>(() => { Application.Current.Run(null); }); Assert.Throws<ArgumentNullException>(() => { Application.Current!.Run(null!); });
} }
} }
@ -22,7 +22,7 @@ namespace Avalonia.Controls.UnitTests
// Test for #1765. // Test for #1765.
using (UnitTestApplication.Start()) using (UnitTestApplication.Start())
{ {
var resources = Application.Current.Resources; var resources = Application.Current!.Resources;
var raised = false; var raised = false;
Application.Current.ResourcesChanged += (s, e) => raised = true; Application.Current.ResourcesChanged += (s, e) => raised = true;
@ -37,13 +37,13 @@ namespace Avalonia.Controls.UnitTests
{ {
using (UnitTestApplication.Start()) using (UnitTestApplication.Start())
{ {
var application = Application.Current; var application = Application.Current!;
application.DataContext = "Test"; application.DataContext = "Test";
application.Bind(Application.NameProperty, new Binding(".")); application.Bind(Application.NameProperty, new Binding("."));
Assert.Equal("Test", Application.Current.Name); Assert.Equal("Test", application.Name);
} }
} }
} }

105
tests/Avalonia.Controls.UnitTests/AutoCompleteBoxTests.cs

@ -21,60 +21,60 @@ namespace Avalonia.Controls.UnitTests
[Fact] [Fact]
public void Search_Filters() public void Search_Filters()
{ {
Assert.True(GetFilter(AutoCompleteFilterMode.Contains)("am", "name")); Assert.True(GetNotNullFilter(AutoCompleteFilterMode.Contains)("am", "name"));
Assert.True(GetFilter(AutoCompleteFilterMode.Contains)("AME", "name")); Assert.True(GetNotNullFilter(AutoCompleteFilterMode.Contains)("AME", "name"));
Assert.False(GetFilter(AutoCompleteFilterMode.Contains)("hello", "name")); Assert.False(GetNotNullFilter(AutoCompleteFilterMode.Contains)("hello", "name"));
Assert.True(GetFilter(AutoCompleteFilterMode.ContainsCaseSensitive)("na", "name")); Assert.True(GetNotNullFilter(AutoCompleteFilterMode.ContainsCaseSensitive)("na", "name"));
Assert.False(GetFilter(AutoCompleteFilterMode.ContainsCaseSensitive)("AME", "name")); Assert.False(GetNotNullFilter(AutoCompleteFilterMode.ContainsCaseSensitive)("AME", "name"));
Assert.False(GetFilter(AutoCompleteFilterMode.ContainsCaseSensitive)("hello", "name")); Assert.False(GetNotNullFilter(AutoCompleteFilterMode.ContainsCaseSensitive)("hello", "name"));
Assert.Null(GetFilter(AutoCompleteFilterMode.Custom)); Assert.Null(GetFilter(AutoCompleteFilterMode.Custom));
Assert.Null(GetFilter(AutoCompleteFilterMode.None)); Assert.Null(GetFilter(AutoCompleteFilterMode.None));
Assert.True(GetFilter(AutoCompleteFilterMode.Equals)("na", "na")); Assert.True(GetNotNullFilter(AutoCompleteFilterMode.Equals)("na", "na"));
Assert.True(GetFilter(AutoCompleteFilterMode.Equals)("na", "NA")); Assert.True(GetNotNullFilter(AutoCompleteFilterMode.Equals)("na", "NA"));
Assert.False(GetFilter(AutoCompleteFilterMode.Equals)("hello", "name")); Assert.False(GetNotNullFilter(AutoCompleteFilterMode.Equals)("hello", "name"));
Assert.True(GetFilter(AutoCompleteFilterMode.EqualsCaseSensitive)("na", "na")); Assert.True(GetNotNullFilter(AutoCompleteFilterMode.EqualsCaseSensitive)("na", "na"));
Assert.False(GetFilter(AutoCompleteFilterMode.EqualsCaseSensitive)("na", "NA")); Assert.False(GetNotNullFilter(AutoCompleteFilterMode.EqualsCaseSensitive)("na", "NA"));
Assert.False(GetFilter(AutoCompleteFilterMode.EqualsCaseSensitive)("hello", "name")); Assert.False(GetNotNullFilter(AutoCompleteFilterMode.EqualsCaseSensitive)("hello", "name"));
Assert.True(GetFilter(AutoCompleteFilterMode.StartsWith)("na", "name")); Assert.True(GetNotNullFilter(AutoCompleteFilterMode.StartsWith)("na", "name"));
Assert.True(GetFilter(AutoCompleteFilterMode.StartsWith)("NAM", "name")); Assert.True(GetNotNullFilter(AutoCompleteFilterMode.StartsWith)("NAM", "name"));
Assert.False(GetFilter(AutoCompleteFilterMode.StartsWith)("hello", "name")); Assert.False(GetNotNullFilter(AutoCompleteFilterMode.StartsWith)("hello", "name"));
Assert.True(GetFilter(AutoCompleteFilterMode.StartsWithCaseSensitive)("na", "name")); Assert.True(GetNotNullFilter(AutoCompleteFilterMode.StartsWithCaseSensitive)("na", "name"));
Assert.False(GetFilter(AutoCompleteFilterMode.StartsWithCaseSensitive)("NAM", "name")); Assert.False(GetNotNullFilter(AutoCompleteFilterMode.StartsWithCaseSensitive)("NAM", "name"));
Assert.False(GetFilter(AutoCompleteFilterMode.StartsWithCaseSensitive)("hello", "name")); Assert.False(GetNotNullFilter(AutoCompleteFilterMode.StartsWithCaseSensitive)("hello", "name"));
} }
[Fact] [Fact]
public void Ordinal_Search_Filters() public void Ordinal_Search_Filters()
{ {
Assert.True(GetFilter(AutoCompleteFilterMode.ContainsOrdinal)("am", "name")); Assert.True(GetNotNullFilter(AutoCompleteFilterMode.ContainsOrdinal)("am", "name"));
Assert.True(GetFilter(AutoCompleteFilterMode.ContainsOrdinal)("AME", "name")); Assert.True(GetNotNullFilter(AutoCompleteFilterMode.ContainsOrdinal)("AME", "name"));
Assert.False(GetFilter(AutoCompleteFilterMode.ContainsOrdinal)("hello", "name")); Assert.False(GetNotNullFilter(AutoCompleteFilterMode.ContainsOrdinal)("hello", "name"));
Assert.True(GetFilter(AutoCompleteFilterMode.ContainsOrdinalCaseSensitive)("na", "name")); Assert.True(GetNotNullFilter(AutoCompleteFilterMode.ContainsOrdinalCaseSensitive)("na", "name"));
Assert.False(GetFilter(AutoCompleteFilterMode.ContainsOrdinalCaseSensitive)("AME", "name")); Assert.False(GetNotNullFilter(AutoCompleteFilterMode.ContainsOrdinalCaseSensitive)("AME", "name"));
Assert.False(GetFilter(AutoCompleteFilterMode.ContainsOrdinalCaseSensitive)("hello", "name")); Assert.False(GetNotNullFilter(AutoCompleteFilterMode.ContainsOrdinalCaseSensitive)("hello", "name"));
Assert.True(GetFilter(AutoCompleteFilterMode.EqualsOrdinal)("na", "na")); Assert.True(GetNotNullFilter(AutoCompleteFilterMode.EqualsOrdinal)("na", "na"));
Assert.True(GetFilter(AutoCompleteFilterMode.EqualsOrdinal)("na", "NA")); Assert.True(GetNotNullFilter(AutoCompleteFilterMode.EqualsOrdinal)("na", "NA"));
Assert.False(GetFilter(AutoCompleteFilterMode.EqualsOrdinal)("hello", "name")); Assert.False(GetNotNullFilter(AutoCompleteFilterMode.EqualsOrdinal)("hello", "name"));
Assert.True(GetFilter(AutoCompleteFilterMode.EqualsOrdinalCaseSensitive)("na", "na")); Assert.True(GetNotNullFilter(AutoCompleteFilterMode.EqualsOrdinalCaseSensitive)("na", "na"));
Assert.False(GetFilter(AutoCompleteFilterMode.EqualsOrdinalCaseSensitive)("na", "NA")); Assert.False(GetNotNullFilter(AutoCompleteFilterMode.EqualsOrdinalCaseSensitive)("na", "NA"));
Assert.False(GetFilter(AutoCompleteFilterMode.EqualsOrdinalCaseSensitive)("hello", "name")); Assert.False(GetNotNullFilter(AutoCompleteFilterMode.EqualsOrdinalCaseSensitive)("hello", "name"));
Assert.True(GetFilter(AutoCompleteFilterMode.StartsWithOrdinal)("na", "name")); Assert.True(GetNotNullFilter(AutoCompleteFilterMode.StartsWithOrdinal)("na", "name"));
Assert.True(GetFilter(AutoCompleteFilterMode.StartsWithOrdinal)("NAM", "name")); Assert.True(GetNotNullFilter(AutoCompleteFilterMode.StartsWithOrdinal)("NAM", "name"));
Assert.False(GetFilter(AutoCompleteFilterMode.StartsWithOrdinal)("hello", "name")); Assert.False(GetNotNullFilter(AutoCompleteFilterMode.StartsWithOrdinal)("hello", "name"));
Assert.True(GetFilter(AutoCompleteFilterMode.StartsWithOrdinalCaseSensitive)("na", "name")); Assert.True(GetNotNullFilter(AutoCompleteFilterMode.StartsWithOrdinalCaseSensitive)("na", "name"));
Assert.False(GetFilter(AutoCompleteFilterMode.StartsWithOrdinalCaseSensitive)("NAM", "name")); Assert.False(GetNotNullFilter(AutoCompleteFilterMode.StartsWithOrdinalCaseSensitive)("NAM", "name"));
Assert.False(GetFilter(AutoCompleteFilterMode.StartsWithOrdinalCaseSensitive)("hello", "name")); Assert.False(GetNotNullFilter(AutoCompleteFilterMode.StartsWithOrdinalCaseSensitive)("hello", "name"));
} }
[Fact] [Fact]
@ -261,7 +261,7 @@ namespace Avalonia.Controls.UnitTests
control.Populated += (s, e) => control.Populated += (s, e) =>
{ {
populated = true; populated = true;
ReadOnlyCollection<object> collection = e.Data as ReadOnlyCollection<object>; var collection = e.Data as ReadOnlyCollection<object>;
populatedOk = collection != null && collection.Count == 1; populatedOk = collection != null && collection.Count == 1;
}; };
@ -328,14 +328,10 @@ namespace Avalonia.Controls.UnitTests
RunTest((control, textbox) => RunTest((control, textbox) =>
{ {
control.FilterMode = AutoCompleteFilterMode.Custom; control.FilterMode = AutoCompleteFilterMode.Custom;
control.ItemFilter = (search, item) => control.ItemFilter = (_, item) => item is string;
{
string s = item as string;
return s == null ? false : true;
};
// Just set to null briefly to exercise that code path // Just set to null briefly to exercise that code path
AutoCompleteFilterPredicate<object> filter = control.ItemFilter; var filter = control.ItemFilter;
Assert.NotNull(filter); Assert.NotNull(filter);
control.ItemFilter = null; control.ItemFilter = null;
Assert.Null(control.ItemFilter); Assert.Null(control.ItemFilter);
@ -377,6 +373,8 @@ namespace Avalonia.Controls.UnitTests
{ {
RunTest((control, textbox) => RunTest((control, textbox) =>
{ {
Assert.NotNull(control.ItemsSource);
object selectedItem = control.ItemsSource.Cast<object>().First(); object selectedItem = control.ItemsSource.Cast<object>().First();
string input = "42"; string input = "42";
@ -394,6 +392,8 @@ namespace Avalonia.Controls.UnitTests
{ {
RunTest((control, textbox) => RunTest((control, textbox) =>
{ {
Assert.NotNull(control.ItemsSource);
object selectedItem = control.ItemsSource.Cast<object>().First(); object selectedItem = control.ItemsSource.Cast<object>().First();
string input = "42"; string input = "42";
@ -416,8 +416,8 @@ namespace Avalonia.Controls.UnitTests
control.Bind(AutoCompleteBox.TextProperty, textObservable); control.Bind(AutoCompleteBox.TextProperty, textObservable);
Dispatcher.UIThread.RunJobs(); Dispatcher.UIThread.RunJobs();
Assert.Equal(DataValidationErrors.GetHasErrors(control), true); Assert.True(DataValidationErrors.GetHasErrors(control));
Assert.Equal(DataValidationErrors.GetErrors(control).SequenceEqual(new[] { exception }), true); Assert.Equal([exception], DataValidationErrors.GetErrors(control));
}); });
} }
@ -453,8 +453,8 @@ namespace Avalonia.Controls.UnitTests
control.Bind(AutoCompleteBox.SelectedItemProperty, itemObservable); control.Bind(AutoCompleteBox.SelectedItemProperty, itemObservable);
Dispatcher.UIThread.RunJobs(); Dispatcher.UIThread.RunJobs();
Assert.Equal(DataValidationErrors.GetHasErrors(control), true); Assert.True(DataValidationErrors.GetHasErrors(control));
Assert.Equal(DataValidationErrors.GetErrors(control).SequenceEqual(new[] { exception }), true); Assert.Equal([exception], DataValidationErrors.GetErrors(control));
}); });
} }
@ -587,12 +587,19 @@ namespace Avalonia.Controls.UnitTests
/// </summary> /// </summary>
/// <param name="mode">The FilterMode of interest.</param> /// <param name="mode">The FilterMode of interest.</param>
/// <returns>Returns the predicate instance.</returns> /// <returns>Returns the predicate instance.</returns>
private static AutoCompleteFilterPredicate<string> GetFilter(AutoCompleteFilterMode mode) private static AutoCompleteFilterPredicate<string?>? GetFilter(AutoCompleteFilterMode mode)
{ {
return new AutoCompleteBox { FilterMode = mode } return new AutoCompleteBox { FilterMode = mode }
.TextFilter; .TextFilter;
} }
private static AutoCompleteFilterPredicate<string?> GetNotNullFilter(AutoCompleteFilterMode mode)
{
var filter = GetFilter(mode);
Assert.NotNull(filter);
return filter;
}
/// <summary> /// <summary>
/// Creates a large list of strings for AutoCompleteBox testing. /// Creates a large list of strings for AutoCompleteBox testing.
/// </summary> /// </summary>
@ -1200,7 +1207,7 @@ namespace Avalonia.Controls.UnitTests
var window = new Window {Content = control}; var window = new Window {Content = control};
window.ApplyStyling(); window.ApplyStyling();
window.ApplyTemplate(); window.ApplyTemplate();
window.Presenter.ApplyTemplate(); window.Presenter!.ApplyTemplate();
Dispatcher.UIThread.RunJobs(); Dispatcher.UIThread.RunJobs();
test.Invoke(control, textBox); test.Invoke(control, textBox);
} }

1
tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.csproj

@ -13,6 +13,7 @@
<Import Project="..\..\build\Base.props" /> <Import Project="..\..\build\Base.props" />
<Import Project="..\..\build\SharedVersion.props" /> <Import Project="..\..\build\SharedVersion.props" />
<Import Project="..\..\build\HarfBuzzSharp.props" /> <Import Project="..\..\build\HarfBuzzSharp.props" />
<Import Project="..\..\build\NullableEnable.props" />
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\src\Markup\Avalonia.Markup.Xaml.Loader\Avalonia.Markup.Xaml.Loader.csproj" /> <ProjectReference Include="..\..\src\Markup\Avalonia.Markup.Xaml.Loader\Avalonia.Markup.Xaml.Loader.csproj" />
<ProjectReference Include="..\..\src\Markup\Avalonia.Markup.Xaml\Avalonia.Markup.Xaml.csproj" /> <ProjectReference Include="..\..\src\Markup\Avalonia.Markup.Xaml\Avalonia.Markup.Xaml.csproj" />

15
tests/Avalonia.Controls.UnitTests/ButtonTests.cs

@ -212,7 +212,7 @@ namespace Avalonia.Controls.UnitTests
var pt = new Point(150, 50); var pt = new Point(150, 50);
renderer.Setup(r => r.HitTest(It.IsAny<Point>(), It.IsAny<Visual>(), It.IsAny<Func<Visual, bool>>())) renderer.Setup(r => r.HitTest(It.IsAny<Point>(), It.IsAny<Visual>(), It.IsAny<Func<Visual, bool>>()))
.Returns<Point, Visual, Func<Visual, bool>>((p, r, f) => .Returns<Point, Visual, Func<Visual, bool>>((p, r, f) =>
r.Bounds.Contains(p.Transform(r.RenderTransform.Value.Invert())) ? r.Bounds.Contains(p.Transform(r.RenderTransform!.Value.Invert())) ?
new Visual[] { r } : new Visual[0]); new Visual[] { r } : new Visual[0]);
using var _ = UnitTestApplication.Start(TestServices.StyledWindow); using var _ = UnitTestApplication.Start(TestServices.StyledWindow);
@ -336,9 +336,9 @@ namespace Avalonia.Controls.UnitTests
}; };
root.ApplyTemplate(); root.ApplyTemplate();
root.Presenter.UpdateChild(); root.Presenter!.UpdateChild();
target.ApplyTemplate(); target.ApplyTemplate();
target.Presenter.UpdateChild(); target.Presenter!.UpdateChild();
kd.SetFocusedElement(target, NavigationMethod.Unspecified, KeyModifiers.None); kd.SetFocusedElement(target, NavigationMethod.Unspecified, KeyModifiers.None);
Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded);
@ -535,7 +535,7 @@ namespace Avalonia.Controls.UnitTests
public void Button_CommandParameter_Does_Not_Change_While_Execution() public void Button_CommandParameter_Does_Not_Change_While_Execution()
{ {
var target = new Button(); var target = new Button();
object lastParamenter = "A"; object? lastParamenter = "A";
var generator = new Random(); var generator = new Random();
var onlyOnce = false; var onlyOnce = false;
var command = new TestCommand(parameter => var command = new TestCommand(parameter =>
@ -582,12 +582,12 @@ namespace Avalonia.Controls.UnitTests
} }
} }
private KeyEventArgs CreateKeyDownEvent(Key key, Interactive source = null) private KeyEventArgs CreateKeyDownEvent(Key key, Interactive? source = null)
{ {
return new KeyEventArgs { RoutedEvent = InputElement.KeyDownEvent, Key = key, Source = source }; return new KeyEventArgs { RoutedEvent = InputElement.KeyDownEvent, Key = key, Source = source };
} }
private KeyEventArgs CreateKeyUpEvent(Key key, Interactive source = null) private KeyEventArgs CreateKeyUpEvent(Key key, Interactive? source = null)
{ {
return new KeyEventArgs { RoutedEvent = InputElement.KeyUpEvent, Key = key, Source = source }; return new KeyEventArgs { RoutedEvent = InputElement.KeyUpEvent, Key = key, Source = source };
} }
@ -682,6 +682,7 @@ namespace Avalonia.Controls.UnitTests
button.ApplyTemplate(); button.ApplyTemplate();
var presenter = button.Presenter; var presenter = button.Presenter;
Assert.NotNull(presenter);
button.LetterSpacing = 5.0; button.LetterSpacing = 5.0;
@ -758,7 +759,7 @@ namespace Avalonia.Controls.UnitTests
private readonly ILayoutManager _layoutManager; private readonly ILayoutManager _layoutManager;
public bool IsClosed { get; private set; } public bool IsClosed { get; private set; }
public TestTopLevel(ITopLevelImpl impl, ILayoutManager layoutManager = null) public TestTopLevel(ITopLevelImpl impl, ILayoutManager? layoutManager = null)
: base(impl) : base(impl)
{ {
_layoutManager = layoutManager ?? new LayoutManager(this); _layoutManager = layoutManager ?? new LayoutManager(this);

5
tests/Avalonia.Controls.UnitTests/CalendarDatePickerTests.cs

@ -44,6 +44,7 @@ namespace Avalonia.Controls.UnitTests
using (UnitTestApplication.Start(Services)) using (UnitTestApplication.Start(Services))
{ {
CalendarDatePicker datePicker = CreateControl(); CalendarDatePicker datePicker = CreateControl();
Assert.NotNull(datePicker.BlackoutDates);
datePicker.BlackoutDates.AddDatesInPast(); datePicker.BlackoutDates.AddDatesInPast();
DateTime goodValue = DateTime.Today.AddDays(1); DateTime goodValue = DateTime.Today.AddDays(1);
@ -65,7 +66,7 @@ namespace Avalonia.Controls.UnitTests
datePicker.SelectedDate = DateTime.Today.AddDays(5); datePicker.SelectedDate = DateTime.Today.AddDays(5);
Assert.ThrowsAny<ArgumentOutOfRangeException>( Assert.ThrowsAny<ArgumentOutOfRangeException>(
() => datePicker.BlackoutDates.Add(new CalendarDateRange(DateTime.Today, DateTime.Today.AddDays(10)))); () => datePicker.BlackoutDates!.Add(new CalendarDateRange(DateTime.Today, DateTime.Today.AddDays(10))));
} }
} }
@ -86,7 +87,7 @@ namespace Avalonia.Controls.UnitTests
RaiseKeyEvent(tb, Key.Enter, KeyModifiers.None); RaiseKeyEvent(tb, Key.Enter, KeyModifiers.None);
Assert.Equal("17.10.2024", datePicker.Text); Assert.Equal("17.10.2024", datePicker.Text);
Assert.True(CompareDates(datePicker.SelectedDate.Value, new DateTime(2024, 10, 17))); Assert.True(CompareDates(datePicker.SelectedDate!.Value, new DateTime(2024, 10, 17)));
tb.Clear(); tb.Clear();
RaiseTextEvent(tb, "12.10.2024"); RaiseTextEvent(tb, "12.10.2024");

22
tests/Avalonia.Controls.UnitTests/CalendarTests.cs

@ -143,12 +143,12 @@ namespace Avalonia.Controls.UnitTests
/// <summary> /// <summary>
/// The days added to the SelectedDates collection. /// The days added to the SelectedDates collection.
/// </summary> /// </summary>
private IList<object> _selectedDatesChangedAddedDays; private IList<object>? _selectedDatesChangedAddedDays;
/// <summary> /// <summary>
/// The days removed from the SelectedDates collection. /// The days removed from the SelectedDates collection.
/// </summary> /// </summary>
private IList<object> _selectedDateChangedRemovedDays; private IList<object>? _selectedDatesChangedRemovedDays;
/// <summary> /// <summary>
/// The number of times the SelectedDatesChanged event has been fired. /// The number of times the SelectedDatesChanged event has been fired.
@ -160,13 +160,13 @@ namespace Avalonia.Controls.UnitTests
/// </summary> /// </summary>
/// <param name="sender">The calendar.</param> /// <param name="sender">The calendar.</param>
/// <param name="e">Event arguments.</param> /// <param name="e">Event arguments.</param>
private void OnSelectedDatesChanged(object sender, SelectionChangedEventArgs e) private void OnSelectedDatesChanged(object? sender, SelectionChangedEventArgs e)
{ {
_selectedDatesChangedAddedDays = _selectedDatesChangedAddedDays =
e.AddedItems e.AddedItems
.Cast<object>() .Cast<object>()
.ToList(); .ToList();
_selectedDateChangedRemovedDays = _selectedDatesChangedRemovedDays =
e.RemovedItems e.RemovedItems
.Cast<object>() .Cast<object>()
.ToList(); .ToList();
@ -183,9 +183,9 @@ namespace Avalonia.Controls.UnitTests
_selectedDatesChangedAddedDays.Clear(); _selectedDatesChangedAddedDays.Clear();
} }
if (_selectedDateChangedRemovedDays != null) if (_selectedDatesChangedRemovedDays != null)
{ {
_selectedDateChangedRemovedDays.Clear(); _selectedDatesChangedRemovedDays.Clear();
} }
_selectedDatesChangedCount = 0; _selectedDatesChangedCount = 0;
@ -203,8 +203,10 @@ namespace Avalonia.Controls.UnitTests
Assert.True(calendar.SelectedDates.Count == 1); Assert.True(calendar.SelectedDates.Count == 1);
Assert.True(CompareDates(calendar.SelectedDates[0], DateTime.Today)); Assert.True(CompareDates(calendar.SelectedDates[0], DateTime.Today));
Assert.True(_selectedDatesChangedCount == 1); Assert.True(_selectedDatesChangedCount == 1);
Assert.NotNull(_selectedDatesChangedAddedDays);
Assert.True(_selectedDatesChangedAddedDays.Count == 1); Assert.True(_selectedDatesChangedAddedDays.Count == 1);
Assert.True(_selectedDateChangedRemovedDays.Count == 0); Assert.NotNull(_selectedDatesChangedRemovedDays);
Assert.True(_selectedDatesChangedRemovedDays.Count == 0);
ResetSelectedDatesChanged(); ResetSelectedDatesChanged();
calendar.SelectedDate = DateTime.Today; calendar.SelectedDate = DateTime.Today;
@ -241,8 +243,10 @@ namespace Avalonia.Controls.UnitTests
Assert.True(calendar.SelectedDates.Count == 1); Assert.True(calendar.SelectedDates.Count == 1);
Assert.True(CompareDates(calendar.SelectedDates[0], DateTime.Today)); Assert.True(CompareDates(calendar.SelectedDates[0], DateTime.Today));
Assert.True(_selectedDatesChangedCount == 1); Assert.True(_selectedDatesChangedCount == 1);
Assert.NotNull(_selectedDatesChangedAddedDays);
Assert.True(_selectedDatesChangedAddedDays.Count == 1); Assert.True(_selectedDatesChangedAddedDays.Count == 1);
Assert.True(_selectedDateChangedRemovedDays.Count == 0); Assert.NotNull(_selectedDatesChangedRemovedDays);
Assert.True(_selectedDatesChangedRemovedDays.Count == 0);
ResetSelectedDatesChanged(); ResetSelectedDatesChanged();
calendar.SelectedDates.Clear(); calendar.SelectedDates.Clear();
@ -264,7 +268,7 @@ namespace Avalonia.Controls.UnitTests
Assert.True(calendar.SelectedDates.Count == 21); Assert.True(calendar.SelectedDates.Count == 21);
Assert.True(_selectedDatesChangedCount == 1); Assert.True(_selectedDatesChangedCount == 1);
Assert.True(_selectedDatesChangedAddedDays.Count == 21); Assert.True(_selectedDatesChangedAddedDays.Count == 21);
Assert.True(_selectedDateChangedRemovedDays.Count == 11); Assert.True(_selectedDatesChangedRemovedDays.Count == 11);
ResetSelectedDatesChanged(); ResetSelectedDatesChanged();
calendar.SelectedDates.Add(DateTime.Today.AddDays(100)); calendar.SelectedDates.Add(DateTime.Today.AddDays(100));

6
tests/Avalonia.Controls.UnitTests/CarouselTests.cs

@ -257,7 +257,7 @@ namespace Avalonia.Controls.UnitTests
target.Bind(ComboBox.SelectedItemProperty, textObservable); target.Bind(ComboBox.SelectedItemProperty, textObservable);
Assert.True(DataValidationErrors.GetHasErrors(target)); Assert.True(DataValidationErrors.GetHasErrors(target));
Assert.True(DataValidationErrors.GetErrors(target).SequenceEqual(new[] { exception })); Assert.Equal([exception], DataValidationErrors.GetErrors(target));
} }
} }
@ -336,7 +336,7 @@ namespace Avalonia.Controls.UnitTests
private static void Layout(Carousel target) private static void Layout(Carousel target)
{ {
((ILayoutRoot)target.GetVisualRoot()).LayoutManager.ExecuteLayoutPass(); ((ILayoutRoot)target.GetVisualRoot()!).LayoutManager.ExecuteLayoutPass();
} }
private static IControlTemplate CarouselTemplate() private static IControlTemplate CarouselTemplate()
@ -371,7 +371,7 @@ namespace Avalonia.Controls.UnitTests
}); });
} }
private static TextBlock GetContainerTextBlock(object control) private static TextBlock GetContainerTextBlock(object? control)
{ {
var contentPresenter = Assert.IsType<ContentPresenter>(control); var contentPresenter = Assert.IsType<ContentPresenter>(control);
return Assert.IsType<TextBlock>(contentPresenter.Child); return Assert.IsType<TextBlock>(contentPresenter.Child);

24
tests/Avalonia.Controls.UnitTests/ComboBoxTests.cs

@ -81,7 +81,7 @@ namespace Avalonia.Controls.UnitTests
}; };
var root = new TestRoot(target); var root = new TestRoot(target);
target.ApplyTemplate(); target.ApplyTemplate();
((Control)target.Presenter).ApplyTemplate(); target.Presenter!.ApplyTemplate();
target.Focus(); target.Focus();
Assert.Equal(target.SelectedIndex, -1); Assert.Equal(target.SelectedIndex, -1);
Assert.True(target.IsFocused); Assert.True(target.IsFocused);
@ -117,7 +117,7 @@ namespace Avalonia.Controls.UnitTests
}; };
var root = new TestRoot(target); var root = new TestRoot(target);
target.ApplyTemplate(); target.ApplyTemplate();
((Control)target.Presenter).ApplyTemplate(); target.Presenter!.ApplyTemplate();
target.Focus(); target.Focus();
Assert.Equal(target.SelectedIndex, -1); Assert.Equal(target.SelectedIndex, -1);
Assert.True(target.IsFocused); Assert.True(target.IsFocused);
@ -166,9 +166,10 @@ namespace Avalonia.Controls.UnitTests
var root = new TestRoot { Child = target }; var root = new TestRoot { Child = target };
target.ApplyTemplate(); target.ApplyTemplate();
((Control)target.Presenter).ApplyTemplate(); target.Presenter!.ApplyTemplate();
var rectangle = target.GetValue(ComboBox.SelectionBoxItemProperty) as Rectangle; var rectangle = target.GetValue(ComboBox.SelectionBoxItemProperty) as Rectangle;
Assert.NotNull(rectangle);
Assert.True(((ILogical)target).IsAttachedToLogicalTree); Assert.True(((ILogical)target).IsAttachedToLogicalTree);
Assert.True(((ILogical)rectangle).IsAttachedToLogicalTree); Assert.True(((ILogical)rectangle).IsAttachedToLogicalTree);
@ -202,7 +203,7 @@ namespace Avalonia.Controls.UnitTests
Content = new ItemsPresenter Content = new ItemsPresenter
{ {
Name = "PART_ItemsPresenter", Name = "PART_ItemsPresenter",
ItemsPanel = new FuncTemplate<Panel>(() => new VirtualizingStackPanel()), ItemsPanel = new FuncTemplate<Panel?>(() => new VirtualizingStackPanel()),
}.RegisterInNameScope(scope) }.RegisterInNameScope(scope)
}.RegisterInNameScope(scope) }.RegisterInNameScope(scope)
}.RegisterInNameScope(scope), }.RegisterInNameScope(scope),
@ -234,7 +235,7 @@ namespace Avalonia.Controls.UnitTests
var root = new TestRoot { Child = panel = new StackPanel { Children = { target, other } } }; var root = new TestRoot { Child = panel = new StackPanel { Children = { target, other } } };
target.ApplyTemplate(); target.ApplyTemplate();
target.Presenter.ApplyTemplate(); target.Presenter!.ApplyTemplate();
other.Focus(); other.Focus();
@ -379,14 +380,14 @@ namespace Avalonia.Controls.UnitTests
}; };
target.ApplyTemplate(); target.ApplyTemplate();
target.Presenter.ApplyTemplate(); target.Presenter!.ApplyTemplate();
var exception = new System.InvalidCastException("failed validation"); var exception = new System.InvalidCastException("failed validation");
var textObservable = new BehaviorSubject<BindingNotification>(new BindingNotification(exception, BindingErrorType.DataValidationError)); var textObservable = new BehaviorSubject<BindingNotification>(new BindingNotification(exception, BindingErrorType.DataValidationError));
target.Bind(ComboBox.SelectedItemProperty, textObservable); target.Bind(ComboBox.SelectedItemProperty, textObservable);
Assert.True(DataValidationErrors.GetHasErrors(target)); Assert.True(DataValidationErrors.GetHasErrors(target));
Assert.True(DataValidationErrors.GetErrors(target).SequenceEqual(new[] { exception })); Assert.Equal([exception], DataValidationErrors.GetErrors(target));
} }
} }
@ -473,7 +474,7 @@ namespace Avalonia.Controls.UnitTests
target.SelectedIndex = 0; target.SelectedIndex = 0;
var rectangle = target.GetValue(ComboBox.SelectionBoxItemProperty) as Rectangle; var rectangle = target.GetValue(ComboBox.SelectionBoxItemProperty) as Rectangle;
Assert.NotNull(rectangle);
Assert.Equal(FlowDirection.LeftToRight, rectangle.FlowDirection); Assert.Equal(FlowDirection.LeftToRight, rectangle.FlowDirection);
} }
@ -503,6 +504,7 @@ namespace Avalonia.Controls.UnitTests
target.SelectedIndex = 0; target.SelectedIndex = 0;
var rectangle = target.GetValue(ComboBox.SelectionBoxItemProperty) as Rectangle; var rectangle = target.GetValue(ComboBox.SelectionBoxItemProperty) as Rectangle;
Assert.NotNull(rectangle);
Assert.Equal(FlowDirection.LeftToRight, rectangle.FlowDirection); Assert.Equal(FlowDirection.LeftToRight, rectangle.FlowDirection);
parentContent.FlowDirection = FlowDirection.RightToLeft; parentContent.FlowDirection = FlowDirection.RightToLeft;
@ -539,6 +541,7 @@ namespace Avalonia.Controls.UnitTests
target.SelectedIndex = 0; target.SelectedIndex = 0;
var rectangle = target.GetValue(ComboBox.SelectionBoxItemProperty) as Rectangle; var rectangle = target.GetValue(ComboBox.SelectionBoxItemProperty) as Rectangle;
Assert.NotNull(rectangle);
Assert.Equal(FlowDirection.LeftToRight, rectangle.FlowDirection); Assert.Equal(FlowDirection.LeftToRight, rectangle.FlowDirection);
parentContent.FlowDirection = FlowDirection.RightToLeft; parentContent.FlowDirection = FlowDirection.RightToLeft;
@ -807,7 +810,7 @@ namespace Avalonia.Controls.UnitTests
keyboardNavHandler.SetOwner(root); keyboardNavHandler.SetOwner(root);
target.ApplyTemplate(); target.ApplyTemplate();
target.Presenter.ApplyTemplate(); target.Presenter!.ApplyTemplate();
var containerPanel = target.GetTemplateChildren().OfType<Panel>().FirstOrDefault(x => x.Name == "container"); var containerPanel = target.GetTemplateChildren().OfType<Panel>().FirstOrDefault(x => x.Name == "container");
var editableTextBox = containerPanel?.GetVisualDescendants().OfType<TextBox>().FirstOrDefault(x => x.Name == "PART_EditableTextBox"); var editableTextBox = containerPanel?.GetVisualDescendants().OfType<TextBox>().FirstOrDefault(x => x.Name == "PART_EditableTextBox");
@ -815,6 +818,9 @@ namespace Avalonia.Controls.UnitTests
var popupScrollViewer = popup?.Child as ScrollViewer; var popupScrollViewer = popup?.Child as ScrollViewer;
var scrollViewerItemsPresenter = popupScrollViewer?.Content as ItemsPresenter; var scrollViewerItemsPresenter = popupScrollViewer?.Content as ItemsPresenter;
var popupVirtualizingStackPanel = scrollViewerItemsPresenter?.GetVisualDescendants().OfType<VirtualizingStackPanel>().FirstOrDefault(); var popupVirtualizingStackPanel = scrollViewerItemsPresenter?.GetVisualDescendants().OfType<VirtualizingStackPanel>().FirstOrDefault();
Assert.NotNull(editableTextBox);
Assert.NotNull(scrollViewerItemsPresenter);
Assert.NotNull(popupVirtualizingStackPanel); Assert.NotNull(popupVirtualizingStackPanel);
//force the popup to render the ComboBoxItem(s) as they are what get set as "focused" if this test fails //force the popup to render the ComboBoxItem(s) as they are what get set as "focused" if this test fails

45
tests/Avalonia.Controls.UnitTests/ContentControlTests.cs

@ -24,7 +24,7 @@ namespace Avalonia.Controls.UnitTests
target.Content = "Foo"; target.Content = "Foo";
target.Template = GetTemplate(); target.Template = GetTemplate();
target.ApplyTemplate(); target.ApplyTemplate();
target.Presenter.UpdateChild(); target.Presenter!.UpdateChild();
var child = target.VisualChildren.Single(); var child = target.VisualChildren.Single();
Assert.IsType<Border>(child); Assert.IsType<Border>(child);
@ -55,7 +55,7 @@ namespace Avalonia.Controls.UnitTests
root.Child = target; root.Child = target;
target.ApplyTemplate(); target.ApplyTemplate();
target.Presenter.ApplyTemplate(); target.Presenter!.ApplyTemplate();
foreach (Control child in target.GetTemplateChildren()) foreach (Control child in target.GetTemplateChildren())
Assert.Equal("foo", child.Tag); Assert.Equal("foo", child.Tag);
@ -70,9 +70,10 @@ namespace Avalonia.Controls.UnitTests
target.Template = GetTemplate(); target.Template = GetTemplate();
target.Content = child; target.Content = child;
target.ApplyTemplate(); target.ApplyTemplate();
target.Presenter.UpdateChild(); target.Presenter!.UpdateChild();
var contentPresenter = child.GetVisualParent<ContentPresenter>(); var contentPresenter = child.GetVisualParent<ContentPresenter>();
Assert.NotNull(contentPresenter);
Assert.Equal(target, contentPresenter.TemplatedParent); Assert.Equal(target, contentPresenter.TemplatedParent);
} }
@ -85,7 +86,7 @@ namespace Avalonia.Controls.UnitTests
target.Template = GetTemplate(); target.Template = GetTemplate();
target.Content = child; target.Content = child;
target.ApplyTemplate(); target.ApplyTemplate();
target.Presenter.UpdateChild(); target.Presenter!.UpdateChild();
Assert.Null(child.TemplatedParent); Assert.Null(child.TemplatedParent);
} }
@ -117,7 +118,7 @@ namespace Avalonia.Controls.UnitTests
var child = new Control(); var child = new Control();
target.Content = child; target.Content = child;
target.ApplyTemplate(); target.ApplyTemplate();
target.Presenter.UpdateChild(); target.Presenter!.UpdateChild();
Assert.Equal(child.Parent, target); Assert.Equal(child.Parent, target);
Assert.Equal(child.GetLogicalParent(), target); Assert.Equal(child.GetLogicalParent(), target);
@ -135,7 +136,7 @@ namespace Avalonia.Controls.UnitTests
target.Content = "Foo"; target.Content = "Foo";
target.ApplyTemplate(); target.ApplyTemplate();
target.Presenter.UpdateChild(); target.Presenter!.UpdateChild();
var child = target.Presenter.Child; var child = target.Presenter.Child;
@ -152,7 +153,7 @@ namespace Avalonia.Controls.UnitTests
target.Content = "Foo"; target.Content = "Foo";
target.ApplyTemplate(); target.ApplyTemplate();
target.Presenter.UpdateChild(); target.Presenter!.UpdateChild();
var child = target.Presenter.Child; var child = target.Presenter.Child;
@ -192,7 +193,7 @@ namespace Avalonia.Controls.UnitTests
target.Template = GetTemplate(); target.Template = GetTemplate();
target.Content = child; target.Content = child;
target.ApplyTemplate(); target.ApplyTemplate();
target.Presenter.UpdateChild(); target.Presenter!.UpdateChild();
Assert.True(called); Assert.True(called);
} }
@ -207,7 +208,7 @@ namespace Avalonia.Controls.UnitTests
target.Template = GetTemplate(); target.Template = GetTemplate();
target.Content = child; target.Content = child;
target.ApplyTemplate(); target.ApplyTemplate();
target.Presenter.UpdateChild(); target.Presenter!.UpdateChild();
((ILogical)target).LogicalChildren.CollectionChanged += (s, e) => called = true; ((ILogical)target).LogicalChildren.CollectionChanged += (s, e) => called = true;
@ -228,7 +229,7 @@ namespace Avalonia.Controls.UnitTests
target.Template = GetTemplate(); target.Template = GetTemplate();
target.Content = child1; target.Content = child1;
target.ApplyTemplate(); target.ApplyTemplate();
target.Presenter.UpdateChild(); target.Presenter!.UpdateChild();
((ILogical)target).LogicalChildren.CollectionChanged += (s, e) => called = true; ((ILogical)target).LogicalChildren.CollectionChanged += (s, e) => called = true;
@ -245,14 +246,14 @@ namespace Avalonia.Controls.UnitTests
target.Template = GetTemplate(); target.Template = GetTemplate();
target.ApplyTemplate(); target.ApplyTemplate();
target.Presenter.UpdateChild(); target.Presenter!.UpdateChild();
target.Content = "Foo"; target.Content = "Foo";
target.Presenter.UpdateChild(); target.Presenter.UpdateChild();
Assert.Equal("Foo", ((TextBlock)target.Presenter.Child).Text); Assert.Equal("Foo", ((TextBlock)target.Presenter.Child!).Text);
target.Content = "Bar"; target.Content = "Bar";
target.Presenter.UpdateChild(); target.Presenter.UpdateChild();
Assert.Equal("Bar", ((TextBlock)target.Presenter.Child).Text); Assert.Equal("Bar", ((TextBlock)target.Presenter.Child!).Text);
} }
[Fact] [Fact]
@ -263,9 +264,9 @@ namespace Avalonia.Controls.UnitTests
target.Template = GetTemplate(); target.Template = GetTemplate();
target.Content = "Foo"; target.Content = "Foo";
target.ApplyTemplate(); target.ApplyTemplate();
target.Presenter.UpdateChild(); target.Presenter!.UpdateChild();
Assert.Equal("Foo", target.Presenter.Child.DataContext); Assert.Equal("Foo", target.Presenter.Child!.DataContext);
} }
[Fact] [Fact]
@ -276,16 +277,16 @@ namespace Avalonia.Controls.UnitTests
target.Template = GetTemplate(); target.Template = GetTemplate();
target.Content = new TextBlock(); target.Content = new TextBlock();
target.ApplyTemplate(); target.ApplyTemplate();
target.Presenter.UpdateChild(); target.Presenter!.UpdateChild();
Assert.Null(target.Presenter.Child.DataContext); Assert.Null(target.Presenter.Child!.DataContext);
} }
[Fact] [Fact]
public void Binding_ContentTemplate_After_Content_Does_Not_Leave_Orpaned_TextBlock() public void Binding_ContentTemplate_After_Content_Does_Not_Leave_Orpaned_TextBlock()
{ {
// Test for #1271. // Test for #1271.
var children = new List<Control>(); var children = new List<Control?>();
var presenter = new ContentPresenter(); var presenter = new ContentPresenter();
// The content and then the content template property need to be bound with delayed bindings // The content and then the content template property need to be bound with delayed bindings
@ -328,7 +329,7 @@ namespace Avalonia.Controls.UnitTests
x => Assert.IsType<TextBlock>(x), x => Assert.IsType<TextBlock>(x),
x => Assert.IsType<Canvas>(x)); x => Assert.IsType<Canvas>(x));
var textBlock = (TextBlock)children[1]; var textBlock = (TextBlock)children[1]!;
// The leak in #1271 was caused by the TextBlock's logical parent not being cleared when // The leak in #1271 was caused by the TextBlock's logical parent not being cleared when
// it is replaced by the Canvas. // it is replaced by the Canvas.
@ -356,9 +357,9 @@ namespace Avalonia.Controls.UnitTests
target.Content = "Foo"; target.Content = "Foo";
target.ApplyTemplate(); target.ApplyTemplate();
target.Presenter.ApplyTemplate(); target.Presenter!.ApplyTemplate();
Assert.Equal(target, target.Presenter.Child.GetLogicalParent()); Assert.Equal(target, target.Presenter!.Child!.GetLogicalParent());
Assert.Equal(new[] { target.Presenter.Child }, target.LogicalChildren); Assert.Equal(new[] { target.Presenter.Child }, target.LogicalChildren);
root.Child = null; root.Child = null;
@ -370,7 +371,7 @@ namespace Avalonia.Controls.UnitTests
root.Child = target; root.Child = target;
target.Content = "Bar"; target.Content = "Bar";
Assert.Equal(target, target.Presenter.Child.GetLogicalParent()); Assert.Equal(target, target.Presenter.Child!.GetLogicalParent());
Assert.Equal(new[] { target.Presenter.Child }, target.LogicalChildren); Assert.Equal(new[] { target.Presenter.Child }, target.LogicalChildren);
} }

94
tests/Avalonia.Controls.UnitTests/ContextMenuTests.cs

@ -1,11 +1,9 @@
using System; using System;
using System.Diagnostics.CodeAnalysis;
using Avalonia.Controls.Primitives; using Avalonia.Controls.Primitives;
using Avalonia.Input; using Avalonia.Input;
using Avalonia.Markup.Xaml; using Avalonia.Markup.Xaml;
using Avalonia.Platform; using Avalonia.Platform;
using Avalonia.Rendering;
using Avalonia.Rendering.Composition;
using Avalonia.UnitTests; using Avalonia.UnitTests;
using Moq; using Moq;
@ -15,7 +13,7 @@ namespace Avalonia.Controls.UnitTests
{ {
public class ContextMenuTests : ScopedTestBase public class ContextMenuTests : ScopedTestBase
{ {
private Mock<IPopupImpl> popupImpl; private Mock<IPopupImpl>? _popupImpl;
private MouseTestHelper _mouse = new MouseTestHelper(); private MouseTestHelper _mouse = new MouseTestHelper();
[Fact] [Fact]
@ -32,7 +30,7 @@ namespace Avalonia.Controls.UnitTests
var window = new Window { Content = target }; var window = new Window { Content = target };
window.ApplyStyling(); window.ApplyStyling();
window.ApplyTemplate(); window.ApplyTemplate();
((Control)window.Presenter).ApplyTemplate(); window.Presenter!.ApplyTemplate();
int openedCount = 0; int openedCount = 0;
@ -65,7 +63,7 @@ namespace Avalonia.Controls.UnitTests
var window = new Window { Content = target }; var window = new Window { Content = target };
window.ApplyStyling(); window.ApplyStyling();
window.ApplyTemplate(); window.ApplyTemplate();
((Control)window.Presenter).ApplyTemplate(); window.Presenter!.ApplyTemplate();
target.RaiseEvent(new ContextRequestedEventArgs()); target.RaiseEvent(new ContextRequestedEventArgs());
@ -135,7 +133,7 @@ namespace Avalonia.Controls.UnitTests
var window = new Window { Content = target }; var window = new Window { Content = target };
window.ApplyStyling(); window.ApplyStyling();
window.ApplyTemplate(); window.ApplyTemplate();
((Control)window.Presenter).ApplyTemplate(); window.Presenter!.ApplyTemplate();
int openedCount = 0; int openedCount = 0;
@ -164,7 +162,7 @@ namespace Avalonia.Controls.UnitTests
var window = new Window { Content = target }; var window = new Window { Content = target };
window.ApplyStyling(); window.ApplyStyling();
window.ApplyTemplate(); window.ApplyTemplate();
((Control)window.Presenter).ApplyTemplate(); window.Presenter!.ApplyTemplate();
bool opened = false; bool opened = false;
@ -193,7 +191,7 @@ namespace Avalonia.Controls.UnitTests
var window = new Window { Content = target }; var window = new Window { Content = target };
window.ApplyStyling(); window.ApplyStyling();
window.ApplyTemplate(); window.ApplyTemplate();
((Control)window.Presenter).ApplyTemplate(); window.Presenter!.ApplyTemplate();
target.ContextMenu = null; target.ContextMenu = null;
@ -215,7 +213,7 @@ namespace Avalonia.Controls.UnitTests
var window = new Window { Content = target }; var window = new Window { Content = target };
window.ApplyStyling(); window.ApplyStyling();
window.ApplyTemplate(); window.ApplyTemplate();
((Control)window.Presenter).ApplyTemplate(); window.Presenter!.ApplyTemplate();
sut.Open(target); sut.Open(target);
@ -237,8 +235,8 @@ namespace Avalonia.Controls.UnitTests
{ {
using (Application()) using (Application())
{ {
popupImpl.Setup(x => x.Show(true, false)).Verifiable(); _popupImpl.Setup(x => x.Show(true, false)).Verifiable();
popupImpl.Setup(x => x.Hide()).Verifiable(); _popupImpl.Setup(x => x.Hide()).Verifiable();
var window = PreparedWindow(); var window = PreparedWindow();
window.Width = 100; window.Width = 100;
@ -268,14 +266,15 @@ namespace Avalonia.Controls.UnitTests
c.Open(button); c.Open(button);
var overlay = LightDismissOverlayLayer.GetLightDismissOverlayLayer(window); var overlay = LightDismissOverlayLayer.GetLightDismissOverlayLayer(window);
Assert.NotNull(overlay);
_mouse.Down(overlay, MouseButton.Left, new Point(90, 90)); _mouse.Down(overlay, MouseButton.Left, new Point(90, 90));
_mouse.Up(button, MouseButton.Left, new Point(90, 90)); _mouse.Up(button, MouseButton.Left, new Point(90, 90));
Assert.Equal(1, tracker); Assert.Equal(1, tracker);
Assert.True(c.IsOpen); Assert.True(c.IsOpen);
popupImpl.Verify(x => x.Hide(), Times.Never); _popupImpl.Verify(x => x.Hide(), Times.Never);
popupImpl.Verify(x => x.Show(true, false), Times.Exactly(1)); _popupImpl.Verify(x => x.Show(true, false), Times.Exactly(1));
} }
} }
@ -284,8 +283,8 @@ namespace Avalonia.Controls.UnitTests
{ {
using (Application()) using (Application())
{ {
popupImpl.Setup(x => x.Show(true, false)).Verifiable(); _popupImpl.Setup(x => x.Show(true, false)).Verifiable();
popupImpl.Setup(x => x.Hide()).Verifiable(); _popupImpl.Setup(x => x.Hide()).Verifiable();
var window = PreparedWindow(); var window = PreparedWindow();
window.Width = 100; window.Width = 100;
@ -308,12 +307,13 @@ namespace Avalonia.Controls.UnitTests
c.Open(button); c.Open(button);
var overlay = LightDismissOverlayLayer.GetLightDismissOverlayLayer(window); var overlay = LightDismissOverlayLayer.GetLightDismissOverlayLayer(window);
Assert.NotNull(overlay);
_mouse.Down(overlay, MouseButton.Left, new Point(90, 90)); _mouse.Down(overlay, MouseButton.Left, new Point(90, 90));
_mouse.Up(button, MouseButton.Left, new Point(90, 90)); _mouse.Up(button, MouseButton.Left, new Point(90, 90));
Assert.False(c.IsOpen); Assert.False(c.IsOpen);
popupImpl.Verify(x => x.Hide(), Times.Exactly(1)); _popupImpl.Verify(x => x.Hide(), Times.Exactly(1));
popupImpl.Verify(x => x.Show(true, false), Times.Exactly(1)); _popupImpl.Verify(x => x.Show(true, false), Times.Exactly(1));
} }
} }
@ -322,8 +322,8 @@ namespace Avalonia.Controls.UnitTests
{ {
using (Application()) using (Application())
{ {
popupImpl.Setup(x => x.Show(true, false)).Verifiable(); _popupImpl.Setup(x => x.Show(true, false)).Verifiable();
popupImpl.Setup(x => x.Hide()).Verifiable(); _popupImpl.Setup(x => x.Hide()).Verifiable();
var sut = new ContextMenu(); var sut = new ContextMenu();
var target = new Panel var target = new Panel
@ -334,6 +334,7 @@ namespace Avalonia.Controls.UnitTests
var window = PreparedWindow(target); var window = PreparedWindow(target);
window.Show(); window.Show();
var overlay = LightDismissOverlayLayer.GetLightDismissOverlayLayer(window); var overlay = LightDismissOverlayLayer.GetLightDismissOverlayLayer(window);
Assert.NotNull(overlay);
_mouse.Click(target, MouseButton.Right); _mouse.Click(target, MouseButton.Right);
@ -343,8 +344,8 @@ namespace Avalonia.Controls.UnitTests
_mouse.Up(target); _mouse.Up(target);
Assert.False(sut.IsOpen); Assert.False(sut.IsOpen);
popupImpl.Verify(x => x.Show(true, false), Times.Once); _popupImpl.Verify(x => x.Show(true, false), Times.Once);
popupImpl.Verify(x => x.Hide(), Times.Once); _popupImpl.Verify(x => x.Hide(), Times.Once);
} }
} }
@ -353,8 +354,8 @@ namespace Avalonia.Controls.UnitTests
{ {
using (Application()) using (Application())
{ {
popupImpl.Setup(x => x.Show(true, false)).Verifiable(); _popupImpl.Setup(x => x.Show(true, false)).Verifiable();
popupImpl.Setup(x => x.Hide()).Verifiable(); _popupImpl.Setup(x => x.Hide()).Verifiable();
var sut = new ContextMenu(); var sut = new ContextMenu();
var target = new Panel var target = new Panel
@ -366,6 +367,7 @@ namespace Avalonia.Controls.UnitTests
window.Show(); window.Show();
var overlay = LightDismissOverlayLayer.GetLightDismissOverlayLayer(window); var overlay = LightDismissOverlayLayer.GetLightDismissOverlayLayer(window);
Assert.NotNull(overlay);
_mouse.Click(target, MouseButton.Right); _mouse.Click(target, MouseButton.Right);
Assert.True(sut.IsOpen); Assert.True(sut.IsOpen);
@ -374,8 +376,8 @@ namespace Avalonia.Controls.UnitTests
_mouse.Up(target, MouseButton.Right); _mouse.Up(target, MouseButton.Right);
Assert.True(sut.IsOpen); Assert.True(sut.IsOpen);
popupImpl.Verify(x => x.Hide(), Times.Once); _popupImpl.Verify(x => x.Hide(), Times.Once);
popupImpl.Verify(x => x.Show(true, false), Times.Exactly(2)); _popupImpl.Verify(x => x.Show(true, false), Times.Exactly(2));
} }
} }
@ -400,7 +402,7 @@ namespace Avalonia.Controls.UnitTests
window.ApplyStyling(); window.ApplyStyling();
window.ApplyTemplate(); window.ApplyTemplate();
((Control)window.Presenter).ApplyTemplate(); window.Presenter!.ApplyTemplate();
_mouse.Click(target1, MouseButton.Right); _mouse.Click(target1, MouseButton.Right);
@ -421,7 +423,7 @@ namespace Avalonia.Controls.UnitTests
{ {
using (Application()) using (Application())
{ {
popupImpl.Setup(x => x.Show(true, false)).Verifiable(); _popupImpl.Setup(x => x.Show(true, false)).Verifiable();
bool eventCalled = false; bool eventCalled = false;
var sut = new ContextMenu(); var sut = new ContextMenu();
@ -437,7 +439,7 @@ namespace Avalonia.Controls.UnitTests
Assert.True(eventCalled); Assert.True(eventCalled);
Assert.False(sut.IsOpen); Assert.False(sut.IsOpen);
popupImpl.Verify(x => x.Show(true, false), Times.Never); _popupImpl.Verify(x => x.Show(true, false), Times.Never);
} }
} }
@ -496,8 +498,8 @@ namespace Avalonia.Controls.UnitTests
</Window>"; </Window>";
var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
var target1 = window.Find<TextBlock>("target1"); var target1 = window.Get<TextBlock>("target1");
var target2 = window.Find<TextBlock>("target2"); var target2 = window.Get<TextBlock>("target2");
var mouse = new MouseTestHelper(); var mouse = new MouseTestHelper();
Assert.NotNull(target1.ContextMenu); Assert.NotNull(target1.ContextMenu);
@ -539,8 +541,8 @@ namespace Avalonia.Controls.UnitTests
</Window>"; </Window>";
var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
var target1 = window.Find<TextBlock>("target1"); var target1 = window.Get<TextBlock>("target1");
var target2 = window.Find<TextBlock>("target2"); var target2 = window.Get<TextBlock>("target2");
var mouse = new MouseTestHelper(); var mouse = new MouseTestHelper();
Assert.NotNull(target1.ContextMenu); Assert.NotNull(target1.ContextMenu);
@ -562,8 +564,8 @@ namespace Avalonia.Controls.UnitTests
{ {
using (Application()) using (Application())
{ {
popupImpl.Setup(x => x.Show(true, false)).Verifiable(); _popupImpl.Setup(x => x.Show(true, false)).Verifiable();
popupImpl.Setup(x => x.Hide()).Verifiable(); _popupImpl.Setup(x => x.Hide()).Verifiable();
bool eventCalled = false; bool eventCalled = false;
var sut = new ContextMenu(); var sut = new ContextMenu();
@ -574,6 +576,7 @@ namespace Avalonia.Controls.UnitTests
var window = PreparedWindow(target); var window = PreparedWindow(target);
var overlay = LightDismissOverlayLayer.GetLightDismissOverlayLayer(window); var overlay = LightDismissOverlayLayer.GetLightDismissOverlayLayer(window);
Assert.NotNull(overlay);
sut.Closing += (c, e) => { eventCalled = true; e.Cancel = true; }; sut.Closing += (c, e) => { eventCalled = true; e.Cancel = true; };
@ -589,8 +592,8 @@ namespace Avalonia.Controls.UnitTests
Assert.True(eventCalled); Assert.True(eventCalled);
Assert.True(sut.IsOpen); Assert.True(sut.IsOpen);
popupImpl.Verify(x => x.Show(true, false), Times.Once()); _popupImpl.Verify(x => x.Show(true, false), Times.Once());
popupImpl.Verify(x => x.Hide(), Times.Never); _popupImpl.Verify(x => x.Hide(), Times.Never);
} }
} }
@ -599,8 +602,8 @@ namespace Avalonia.Controls.UnitTests
{ {
using (Application()) using (Application())
{ {
popupImpl.Setup(x => x.Show(true, false)).Verifiable(); _popupImpl.Setup(x => x.Show(true, false)).Verifiable();
popupImpl.Setup(x => x.Hide()).Verifiable(); _popupImpl.Setup(x => x.Hide()).Verifiable();
var item = new MenuItem(); var item = new MenuItem();
var sut = new ContextMenu var sut = new ContextMenu
@ -643,7 +646,7 @@ namespace Avalonia.Controls.UnitTests
} }
} }
private static Window PreparedWindow(object content = null) private static Window PreparedWindow(object? content = null)
{ {
var platform = AvaloniaLocator.Current.GetRequiredService<IWindowingPlatform>(); var platform = AvaloniaLocator.Current.GetRequiredService<IWindowingPlatform>();
@ -653,10 +656,11 @@ namespace Avalonia.Controls.UnitTests
var w = new Window(windowImpl.Object) { Content = content }; var w = new Window(windowImpl.Object) { Content = content };
w.ApplyStyling(); w.ApplyStyling();
w.ApplyTemplate(); w.ApplyTemplate();
((Control)w.Presenter).ApplyTemplate(); w.Presenter!.ApplyTemplate();
return w; return w;
} }
[MemberNotNull(nameof(_popupImpl))]
private IDisposable Application() private IDisposable Application()
{ {
var screen = new PixelRect(new PixelPoint(), new PixelSize(100, 100)); var screen = new PixelRect(new PixelPoint(), new PixelSize(100, 100));
@ -665,9 +669,9 @@ namespace Avalonia.Controls.UnitTests
screenImpl.Setup(X => X.AllScreens).Returns( new[] { new Screen(1, screen, screen, true) }); screenImpl.Setup(X => X.AllScreens).Returns( new[] { new Screen(1, screen, screen, true) });
var windowImpl = MockWindowingPlatform.CreateWindowMock(); var windowImpl = MockWindowingPlatform.CreateWindowMock();
popupImpl = MockWindowingPlatform.CreatePopupMock(windowImpl.Object); _popupImpl = MockWindowingPlatform.CreatePopupMock(windowImpl.Object);
popupImpl.SetupGet(x => x.RenderScaling).Returns(1); _popupImpl.SetupGet(x => x.RenderScaling).Returns(1);
windowImpl.Setup(x => x.CreatePopup()).Returns(popupImpl.Object); windowImpl.Setup(x => x.CreatePopup()).Returns(_popupImpl.Object);
windowImpl.Setup(x => x.TryGetFeature(It.Is<Type>(t => t == typeof(IScreenImpl)))).Returns(screenImpl.Object); windowImpl.Setup(x => x.TryGetFeature(It.Is<Type>(t => t == typeof(IScreenImpl)))).Returns(screenImpl.Object);
@ -675,7 +679,7 @@ namespace Avalonia.Controls.UnitTests
keyboardDevice: () => new KeyboardDevice(), keyboardDevice: () => new KeyboardDevice(),
inputManager: new InputManager(), inputManager: new InputManager(),
windowImpl: windowImpl.Object, windowImpl: windowImpl.Object,
windowingPlatform: new MockWindowingPlatform(() => windowImpl.Object, x => popupImpl.Object)); windowingPlatform: new MockWindowingPlatform(() => windowImpl.Object, x => _popupImpl.Object));
return UnitTestApplication.Start(services); return UnitTestApplication.Start(services);
} }

62
tests/Avalonia.Controls.UnitTests/DatePickerTests.cs

@ -50,13 +50,10 @@ namespace Avalonia.Controls.UnitTests
var desc = datePicker.GetVisualDescendants(); var desc = datePicker.GetVisualDescendants();
Assert.True(desc.Count() > 1);//Should be layoutroot grid & button Assert.True(desc.Count() > 1);//Should be layoutroot grid & button
TextBlock dayText = null; TextBlock? dayText = null;
Grid container = null;
Assert.True(desc.ElementAt(1) is Button); var button = Assert.IsAssignableFrom<Button>(desc.ElementAt(1));
var container = Assert.IsAssignableFrom<Grid>(button.Content);
container = (desc.ElementAt(1) as Button).Content as Grid;
Assert.True(container != null);
for(int i = 0; i < container.Children.Count; i++) for(int i = 0; i < container.Children.Count; i++)
{ {
@ -67,9 +64,9 @@ namespace Avalonia.Controls.UnitTests
} }
} }
Assert.True(dayText != null); Assert.NotNull(dayText);
Assert.True(!dayText.IsVisible); Assert.False(dayText.IsVisible);
Assert.True(container.ColumnDefinitions.Count == 3); Assert.Equal(3, container.ColumnDefinitions.Count);
} }
} }
@ -88,13 +85,10 @@ namespace Avalonia.Controls.UnitTests
var desc = datePicker.GetVisualDescendants(); var desc = datePicker.GetVisualDescendants();
Assert.True(desc.Count() > 1);//Should be layoutroot grid & button Assert.True(desc.Count() > 1);//Should be layoutroot grid & button
TextBlock monthText = null; TextBlock? monthText = null;
Grid container = null;
Assert.True(desc.ElementAt(1) is Button);
container = (desc.ElementAt(1) as Button).Content as Grid; var button = Assert.IsAssignableFrom<Button>(desc.ElementAt(1));
Assert.True(container != null); var container = Assert.IsAssignableFrom<Grid>(button.Content);
for (int i = 0; i < container.Children.Count; i++) for (int i = 0; i < container.Children.Count; i++)
{ {
@ -105,9 +99,9 @@ namespace Avalonia.Controls.UnitTests
} }
} }
Assert.True(monthText != null); Assert.NotNull(monthText);
Assert.True(!monthText.IsVisible); Assert.False(monthText.IsVisible);
Assert.True(container.ColumnDefinitions.Count == 3); Assert.Equal(3, container.ColumnDefinitions.Count);
} }
} }
@ -126,13 +120,10 @@ namespace Avalonia.Controls.UnitTests
var desc = datePicker.GetVisualDescendants(); var desc = datePicker.GetVisualDescendants();
Assert.True(desc.Count() > 1);//Should be layoutroot grid & button Assert.True(desc.Count() > 1);//Should be layoutroot grid & button
TextBlock yearText = null; TextBlock? yearText = null;
Grid container = null;
Assert.True(desc.ElementAt(1) is Button);
container = (desc.ElementAt(1) as Button).Content as Grid; var button = Assert.IsAssignableFrom<Button>(desc.ElementAt(1));
Assert.True(container != null); var container = Assert.IsAssignableFrom<Grid>(button.Content);
for (int i = 0; i < container.Children.Count; i++) for (int i = 0; i < container.Children.Count; i++)
{ {
@ -143,9 +134,9 @@ namespace Avalonia.Controls.UnitTests
} }
} }
Assert.True(yearText != null); Assert.NotNull(yearText);
Assert.True(!yearText.IsVisible); Assert.False(yearText.IsVisible);
Assert.True(container.ColumnDefinitions.Count == 3); Assert.Equal(3, container.ColumnDefinitions.Count);
} }
} }
@ -164,15 +155,12 @@ namespace Avalonia.Controls.UnitTests
var desc = datePicker.GetVisualDescendants(); var desc = datePicker.GetVisualDescendants();
Assert.True(desc.Count() > 1);//Should be layoutroot grid & button Assert.True(desc.Count() > 1);//Should be layoutroot grid & button
TextBlock yearText = null; TextBlock? yearText = null;
TextBlock monthText = null; TextBlock? monthText = null;
TextBlock dayText = null; TextBlock? dayText = null;
Grid container = null;
Assert.True(desc.ElementAt(1) is Button); var button = Assert.IsAssignableFrom<Button>(desc.ElementAt(1));
var container = Assert.IsAssignableFrom<Grid>(button.Content);
container = (desc.ElementAt(1) as Button).Content as Grid;
Assert.True(container != null);
for (int i = 0; i < container.Children.Count; i++) for (int i = 0; i < container.Children.Count; i++)
{ {
@ -190,6 +178,10 @@ namespace Avalonia.Controls.UnitTests
} }
} }
Assert.NotNull(dayText);
Assert.NotNull(monthText);
Assert.NotNull(yearText);
DateTimeOffset value = new DateTimeOffset(2000, 10, 10, 0, 0, 0, TimeSpan.Zero); DateTimeOffset value = new DateTimeOffset(2000, 10, 10, 0, 0, 0, TimeSpan.Zero);
datePicker.SelectedDate = value; datePicker.SelectedDate = value;

4
tests/Avalonia.Controls.UnitTests/DesktopStyleApplicationLifetimeTests.cs

@ -317,7 +317,7 @@ namespace Avalonia.Controls.UnitTests
window.Show(); window.Show();
Assert.Equal(1, lifetime.Windows.Count); Assert.Equal(1, lifetime.Windows.Count);
windowImpl.Object.Closed(); windowImpl.Object.Closed!();
Assert.Empty(lifetime.Windows); Assert.Empty(lifetime.Windows);
} }
@ -443,7 +443,7 @@ namespace Avalonia.Controls.UnitTests
lifetime.Exit += (_, _) => Assert.Fail("lifetime.Exit was called."); lifetime.Exit += (_, _) => Assert.Fail("lifetime.Exit was called.");
Dispatcher.UIThread.ShutdownStarted += UiThreadOnShutdownStarted; Dispatcher.UIThread.ShutdownStarted += UiThreadOnShutdownStarted;
static void UiThreadOnShutdownStarted(object sender, EventArgs e) static void UiThreadOnShutdownStarted(object? sender, EventArgs e)
{ {
Assert.Fail("Dispatcher.UIThread.ShutdownStarted was called."); Assert.Fail("Dispatcher.UIThread.ShutdownStarted was called.");
} }

18
tests/Avalonia.Controls.UnitTests/FlyoutTests.cs

@ -185,6 +185,7 @@ namespace Avalonia.Controls.UnitTests
var e = CreatePointerPressedEventArgs(window, new Point(90, 90)); var e = CreatePointerPressedEventArgs(window, new Point(90, 90));
var overlay = LightDismissOverlayLayer.GetLightDismissOverlayLayer(window); var overlay = LightDismissOverlayLayer.GetLightDismissOverlayLayer(window);
Assert.NotNull(overlay);
overlay.RaiseEvent(e); overlay.RaiseEvent(e);
Assert.Equal(1, tracker); Assert.Equal(1, tracker);
@ -218,6 +219,7 @@ namespace Avalonia.Controls.UnitTests
var e = CreatePointerPressedEventArgs(window, new Point(90, 90)); var e = CreatePointerPressedEventArgs(window, new Point(90, 90));
var overlay = LightDismissOverlayLayer.GetLightDismissOverlayLayer(window); var overlay = LightDismissOverlayLayer.GetLightDismissOverlayLayer(window);
Assert.NotNull(overlay);
overlay.RaiseEvent(e); overlay.RaiseEvent(e);
Assert.False(f.IsOpen); Assert.False(f.IsOpen);
@ -259,6 +261,7 @@ namespace Avalonia.Controls.UnitTests
var e = CreatePointerPressedEventArgs(window, new Point(90, 90)); var e = CreatePointerPressedEventArgs(window, new Point(90, 90));
var overlay = LightDismissOverlayLayer.GetLightDismissOverlayLayer(window); var overlay = LightDismissOverlayLayer.GetLightDismissOverlayLayer(window);
Assert.NotNull(overlay);
overlay.RaiseEvent(e); overlay.RaiseEvent(e);
Assert.False(f.IsOpen); Assert.False(f.IsOpen);
@ -301,6 +304,7 @@ namespace Avalonia.Controls.UnitTests
var e = CreatePointerPressedEventArgs(window, new Point(90, 90)); var e = CreatePointerPressedEventArgs(window, new Point(90, 90));
var overlay = LightDismissOverlayLayer.GetLightDismissOverlayLayer(window); var overlay = LightDismissOverlayLayer.GetLightDismissOverlayLayer(window);
Assert.NotNull(overlay);
overlay.RaiseEvent(e); overlay.RaiseEvent(e);
Assert.False(f.IsOpen); Assert.False(f.IsOpen);
@ -410,9 +414,9 @@ namespace Avalonia.Controls.UnitTests
window.Show(); window.Show();
button.Focus(); button.Focus();
Assert.True(window.FocusManager.GetFocusedElement() == button); Assert.Same(button, window.FocusManager?.GetFocusedElement());
button.Flyout.ShowAt(button); button.Flyout.ShowAt(button);
Assert.True(window.FocusManager.GetFocusedElement() == button); Assert.Same(button, window.FocusManager?.GetFocusedElement());
} }
} }
@ -586,8 +590,8 @@ namespace Avalonia.Controls.UnitTests
</Window>"; </Window>";
var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
var target1 = window.Find<TextBlock>("target1"); var target1 = window.Get<TextBlock>("target1");
var target2 = window.Find<TextBlock>("target2"); var target2 = window.Get<TextBlock>("target2");
var mouse = new MouseTestHelper(); var mouse = new MouseTestHelper();
Assert.NotNull(target1.ContextFlyout); Assert.NotNull(target1.ContextFlyout);
@ -632,13 +636,13 @@ namespace Avalonia.Controls.UnitTests
window.Content = button; window.Content = button;
window.Show(); window.Show();
(button.Flyout as Flyout).FlyoutPresenterClasses.Add("TestClass"); ((Flyout)button.Flyout).FlyoutPresenterClasses.Add("TestClass");
button.Flyout.ShowAt(button); button.Flyout.ShowAt(button);
var presenter = flyoutPanel.GetVisualAncestors().OfType<FlyoutPresenter>().FirstOrDefault(); var presenter = flyoutPanel.GetVisualAncestors().OfType<FlyoutPresenter>().FirstOrDefault();
Assert.NotNull(presenter); Assert.NotNull(presenter);
Assert.True((presenter.Background as ISolidColorBrush).Color == Colors.Red); Assert.Equal(Colors.Red, (presenter.Background as ISolidColorBrush)?.Color);
} }
} }
@ -650,7 +654,7 @@ namespace Avalonia.Controls.UnitTests
keyboardDevice: () => new KeyboardDevice())); keyboardDevice: () => new KeyboardDevice()));
} }
private static Window PreparedWindow(object content = null) private static Window PreparedWindow(object? content = null)
{ {
var platform = AvaloniaLocator.Current.GetRequiredService<IWindowingPlatform>(); var platform = AvaloniaLocator.Current.GetRequiredService<IWindowingPlatform>();
var windowImpl = Mock.Get(platform.CreateWindow()); var windowImpl = Mock.Get(platform.CreateWindow());

6
tests/Avalonia.Controls.UnitTests/GridTests.cs

@ -16,19 +16,19 @@ namespace Avalonia.Controls.UnitTests
this.output = output; this.output = output;
} }
private static Grid CreateGrid(params (string name, GridLength width)[] columns) private static Grid CreateGrid(params (string? name, GridLength width)[] columns)
{ {
return CreateGrid(columns.Select(c => return CreateGrid(columns.Select(c =>
(c.name, c.width, ColumnDefinition.MinWidthProperty.GetDefaultValue(typeof(ColumnDefinition)))).ToArray()); (c.name, c.width, ColumnDefinition.MinWidthProperty.GetDefaultValue(typeof(ColumnDefinition)))).ToArray());
} }
private static Grid CreateGrid(params (string name, GridLength width, double minWidth)[] columns) private static Grid CreateGrid(params (string? name, GridLength width, double minWidth)[] columns)
{ {
return CreateGrid(columns.Select(c => return CreateGrid(columns.Select(c =>
(c.name, c.width, c.minWidth, ColumnDefinition.MaxWidthProperty.GetDefaultValue(typeof(ColumnDefinition)))).ToArray()); (c.name, c.width, c.minWidth, ColumnDefinition.MaxWidthProperty.GetDefaultValue(typeof(ColumnDefinition)))).ToArray());
} }
private static Grid CreateGrid(params (string name, GridLength width, double minWidth, double maxWidth)[] columns) private static Grid CreateGrid(params (string? name, GridLength width, double minWidth, double maxWidth)[] columns)
{ {
var grid = new Grid(); var grid = new Grid();
foreach (var k in columns.Select(c => new ColumnDefinition foreach (var k in columns.Select(c => new ColumnDefinition

2
tests/Avalonia.Controls.UnitTests/HeaderedItemsControlTests .cs

@ -35,7 +35,7 @@ namespace Avalonia.Controls.UnitTests
target.Header = "Foo"; target.Header = "Foo";
target.ApplyTemplate(); target.ApplyTemplate();
target.HeaderPresenter.UpdateChild(); target.HeaderPresenter!.UpdateChild();
var child = target.HeaderPresenter.Child; var child = target.HeaderPresenter.Child;

16
tests/Avalonia.Controls.UnitTests/HotKeyedControlsTests.cs

@ -16,17 +16,17 @@ namespace Avalonia.Controls.UnitTests
{ {
private readonly Action _action; private readonly Action _action;
public DelegateCommand(Action action) => _action = action; public DelegateCommand(Action action) => _action = action;
public event EventHandler CanExecuteChanged { add { } remove { } } public event EventHandler? CanExecuteChanged { add { } remove { } }
public bool CanExecute(object parameter) => true; public bool CanExecute(object? parameter) => true;
public void Execute(object parameter) => _action(); public void Execute(object? parameter) => _action();
} }
public static readonly StyledProperty<KeyGesture> HotKeyProperty = public static readonly StyledProperty<KeyGesture?> HotKeyProperty =
HotKeyManager.HotKeyProperty.AddOwner<HotKeyedTextBox>(); HotKeyManager.HotKeyProperty.AddOwner<HotKeyedTextBox>();
private KeyGesture _hotkey; private KeyGesture? _hotkey;
public KeyGesture HotKey public KeyGesture? HotKey
{ {
get => GetValue(HotKeyProperty); get => GetValue(HotKeyProperty);
set => SetValue(HotKeyProperty, value); set => SetValue(HotKeyProperty, value);
@ -61,7 +61,7 @@ namespace Avalonia.Controls.UnitTests
public ICommand Command => _command; public ICommand Command => _command;
public object CommandParameter => null; public object? CommandParameter => null;
private readonly DelegateCommand _command; private readonly DelegateCommand _command;
@ -73,7 +73,7 @@ namespace Avalonia.Controls.UnitTests
public class HotKeyedControlsTests : ScopedTestBase public class HotKeyedControlsTests : ScopedTestBase
{ {
private static Window PreparedWindow(object content = null) private static Window PreparedWindow(object? content = null)
{ {
var platform = AvaloniaLocator.Current.GetRequiredService<IWindowingPlatform>(); var platform = AvaloniaLocator.Current.GetRequiredService<IWindowingPlatform>();
var windowImpl = Mock.Get(platform.CreateWindow()); var windowImpl = Mock.Get(platform.CreateWindow());

4
tests/Avalonia.Controls.UnitTests/InlineTests.cs

@ -22,6 +22,7 @@ namespace Avalonia.Controls.UnitTests
bold.BuildTextRun(textRuns, default); bold.BuildTextRun(textRuns, default);
var runProperties = textRuns[0].Properties; var runProperties = textRuns[0].Properties;
Assert.NotNull(runProperties);
Assert.Equal(FontWeight.Bold, runProperties.Typeface.Weight); Assert.Equal(FontWeight.Bold, runProperties.Typeface.Weight);
} }
@ -38,6 +39,7 @@ namespace Avalonia.Controls.UnitTests
italic.BuildTextRun(textRuns, default); italic.BuildTextRun(textRuns, default);
var runProperties = textRuns[0].Properties; var runProperties = textRuns[0].Properties;
Assert.NotNull(runProperties);
Assert.Equal(FontStyle.Italic, runProperties.Typeface.Style); Assert.Equal(FontStyle.Italic, runProperties.Typeface.Style);
} }
@ -55,6 +57,7 @@ namespace Avalonia.Controls.UnitTests
span.BuildTextRun(textRuns, default); span.BuildTextRun(textRuns, default);
var runProperties = textRuns[0].Properties; var runProperties = textRuns[0].Properties;
Assert.NotNull(runProperties);
Assert.Equal(FontStretch.Condensed, runProperties.Typeface.Stretch); Assert.Equal(FontStretch.Condensed, runProperties.Typeface.Stretch);
} }
@ -74,6 +77,7 @@ namespace Avalonia.Controls.UnitTests
span.BuildTextRun(textRuns, default); span.BuildTextRun(textRuns, default);
var runProperties = textRuns[0].Properties; var runProperties = textRuns[0].Properties;
Assert.NotNull(runProperties);
Assert.Equal(backgroundBrush, runProperties.BackgroundBrush); Assert.Equal(backgroundBrush, runProperties.BackgroundBrush);
} }
} }

17
tests/Avalonia.Controls.UnitTests/ItemsSourceViewTests.cs

@ -21,11 +21,12 @@ namespace Avalonia.Controls.UnitTests
Assert.Null(debug.GetCollectionChangedSubscribers()); Assert.Null(debug.GetCollectionChangedSubscribers());
void Handler(object sender, NotifyCollectionChangedEventArgs e) { } void Handler(object? sender, NotifyCollectionChangedEventArgs e) { }
target.CollectionChanged += Handler; target.CollectionChanged += Handler;
Assert.NotNull(debug.GetCollectionChangedSubscribers()); var subscribers = debug.GetCollectionChangedSubscribers();
Assert.Equal(1, debug.GetCollectionChangedSubscribers().Length); Assert.NotNull(subscribers);
Assert.Equal(1, subscribers.Length);
target.CollectionChanged -= Handler; target.CollectionChanged -= Handler;
@ -48,7 +49,9 @@ namespace Avalonia.Controls.UnitTests
target.CollectionChanged += (s, e) => { }; target.CollectionChanged += (s, e) => { };
Assert.Equal(1, debug.GetCollectionChangedSubscribers().Length); var subscribers = debug.GetCollectionChangedSubscribers();
Assert.NotNull(subscribers);
Assert.Equal(1, subscribers.Length);
target.SetSource(new string[0]); target.SetSource(new string[0]);
@ -65,12 +68,14 @@ namespace Avalonia.Controls.UnitTests
target.CollectionChanged += (s, e) => { }; target.CollectionChanged += (s, e) => { };
target.SetSource(source); target.SetSource(source);
Assert.Equal(1, debug.GetCollectionChangedSubscribers().Length); var subscribers = debug.GetCollectionChangedSubscribers();
Assert.NotNull(subscribers);
Assert.Equal(1, subscribers.Length);
} }
private class InvalidCollection : INotifyCollectionChanged, IEnumerable<string> private class InvalidCollection : INotifyCollectionChanged, IEnumerable<string>
{ {
public event NotifyCollectionChangedEventHandler CollectionChanged { add { } remove { } } public event NotifyCollectionChangedEventHandler? CollectionChanged { add { } remove { } }
public IEnumerator<string> GetEnumerator() public IEnumerator<string> GetEnumerator()
{ {

8
tests/Avalonia.Controls.UnitTests/LayoutTransformControlTests.cs

@ -198,6 +198,7 @@ namespace Avalonia.Controls.UnitTests
25, 25,
new RotateTransform() { Angle = 90 }); new RotateTransform() { Angle = 90 });
Assert.NotNull(lt.TransformRoot);
Assert.NotNull(lt.TransformRoot.RenderTransform); Assert.NotNull(lt.TransformRoot.RenderTransform);
Matrix m = lt.TransformRoot.RenderTransform.Value; Matrix m = lt.TransformRoot.RenderTransform.Value;
@ -222,6 +223,7 @@ namespace Avalonia.Controls.UnitTests
25, 25,
new RotateTransform() { Angle = -90 }); new RotateTransform() { Angle = -90 });
Assert.NotNull(lt.TransformRoot);
Assert.NotNull(lt.TransformRoot.RenderTransform); Assert.NotNull(lt.TransformRoot.RenderTransform);
var m = lt.TransformRoot.RenderTransform.Value; var m = lt.TransformRoot.RenderTransform.Value;
@ -246,6 +248,7 @@ namespace Avalonia.Controls.UnitTests
50, 50,
new ScaleTransform() { ScaleX = 2, ScaleY = 2 }); new ScaleTransform() { ScaleX = 2, ScaleY = 2 });
Assert.NotNull(lt.TransformRoot);
Assert.NotNull(lt.TransformRoot.RenderTransform); Assert.NotNull(lt.TransformRoot.RenderTransform);
Matrix m = lt.TransformRoot.RenderTransform.Value; Matrix m = lt.TransformRoot.RenderTransform.Value;
@ -269,6 +272,7 @@ namespace Avalonia.Controls.UnitTests
100, 100,
new SkewTransform() { AngleX = 45, AngleY = 45 }); new SkewTransform() { AngleX = 45, AngleY = 45 });
Assert.NotNull(lt.TransformRoot);
Assert.NotNull(lt.TransformRoot.RenderTransform); Assert.NotNull(lt.TransformRoot.RenderTransform);
Matrix m = lt.TransformRoot.RenderTransform.Value; Matrix m = lt.TransformRoot.RenderTransform.Value;
@ -293,6 +297,7 @@ namespace Avalonia.Controls.UnitTests
100, 100,
new SkewTransform() { AngleX = -45, AngleY = -45 }); new SkewTransform() { AngleX = -45, AngleY = -45 });
Assert.NotNull(lt.TransformRoot);
Assert.NotNull(lt.TransformRoot.RenderTransform); Assert.NotNull(lt.TransformRoot.RenderTransform);
Matrix m = lt.TransformRoot.RenderTransform.Value; Matrix m = lt.TransformRoot.RenderTransform.Value;
@ -325,6 +330,8 @@ namespace Avalonia.Controls.UnitTests
var window = new Window { Content = lt }; var window = new Window { Content = lt };
window.Show(); window.Show();
Assert.NotNull(lt.TransformRoot);
Assert.NotNull(lt.TransformRoot.RenderTransform);
Matrix actual = lt.TransformRoot.RenderTransform.Value; Matrix actual = lt.TransformRoot.RenderTransform.Value;
Matrix expected = Matrix.CreateSkew(Matrix.ToRadians(45), Matrix.ToRadians(45)); Matrix expected = Matrix.CreateSkew(Matrix.ToRadians(45), Matrix.ToRadians(45));
Assert.Equal(expected.M11, actual.M11, 3); Assert.Equal(expected.M11, actual.M11, 3);
@ -357,6 +364,7 @@ namespace Avalonia.Controls.UnitTests
LayoutTransformControl lt = CreateWithChildAndMeasureAndTransform(size.Width, size.Height, transform); LayoutTransformControl lt = CreateWithChildAndMeasureAndTransform(size.Width, size.Height, transform);
Assert.NotNull(lt.TransformRoot);
Rect outBounds = lt.TransformRoot.Bounds; Rect outBounds = lt.TransformRoot.Bounds;
Assert.Equal(outBounds.X, expectedBounds.X); Assert.Equal(outBounds.X, expectedBounds.X);

93
tests/Avalonia.Controls.UnitTests/ListBoxTests.cs

@ -37,8 +37,8 @@ namespace Avalonia.Controls.UnitTests
Prepare(target); Prepare(target);
var container = (ListBoxItem)target.Presenter.Panel.Children[0]; var container = (ListBoxItem)target.Presenter!.Panel!.Children[0];
Assert.IsType<Canvas>(container.Presenter.Child); Assert.IsType<Canvas>(container.Presenter!.Child);
} }
[Fact] [Fact]
@ -62,7 +62,7 @@ namespace Avalonia.Controls.UnitTests
Template = ListBoxTemplate(), Template = ListBoxTemplate(),
}; };
ScrollViewer viewer = null; ScrollViewer? viewer = null;
target.TemplateApplied += (sender, e) => target.TemplateApplied += (sender, e) =>
{ {
@ -88,9 +88,9 @@ namespace Avalonia.Controls.UnitTests
Prepare(target); Prepare(target);
var text = target.Presenter.Panel.Children var text = target.Presenter!.Panel!.Children
.OfType<ListBoxItem>() .OfType<ListBoxItem>()
.Select(x => x.Presenter.Child) .Select(x => x.Presenter!.Child)
.OfType<TextBlock>() .OfType<TextBlock>()
.Select(x => x.Text) .Select(x => x.Text)
.ToList(); .ToList();
@ -115,7 +115,7 @@ namespace Avalonia.Controls.UnitTests
Prepare(target); Prepare(target);
var container = (ListBoxItem)target.Presenter.Panel.Children[0]; var container = (ListBoxItem)target.Presenter!.Panel!.Children[0];
Assert.Same(container.Theme, theme); Assert.Same(container.Theme, theme);
} }
@ -136,7 +136,7 @@ namespace Avalonia.Controls.UnitTests
Prepare(target); Prepare(target);
var container = (ListBoxItem)target.Presenter.Panel.Children[0]; var container = (ListBoxItem)target.Presenter!.Panel!.Children[0];
Assert.Same(container.Theme, theme); Assert.Same(container.Theme, theme);
} }
@ -187,7 +187,7 @@ namespace Avalonia.Controls.UnitTests
Prepare(target); Prepare(target);
var dataContexts = target.Presenter.Panel.Children var dataContexts = target.Presenter!.Panel!.Children
.Cast<Control>() .Cast<Control>()
.Select(x => x.DataContext) .Select(x => x.DataContext)
.ToList(); .ToList();
@ -214,14 +214,14 @@ namespace Avalonia.Controls.UnitTests
Prepare(target); Prepare(target);
// Make sure we're virtualized and first item is selected. // Make sure we're virtualized and first item is selected.
Assert.Equal(10, target.Presenter.Panel.Children.Count); Assert.Equal(10, target.Presenter!.Panel!.Children.Count);
Assert.True(((ListBoxItem)target.Presenter.Panel.Children[0]).IsSelected); Assert.True(((ListBoxItem)target.Presenter.Panel.Children[0]).IsSelected);
// The selected item must not be the anchor, otherwise it won't get recycled. // The selected item must not be the anchor, otherwise it won't get recycled.
target.Selection.AnchorIndex = -1; target.Selection.AnchorIndex = -1;
// Scroll down a page. // Scroll down a page.
target.Scroll.Offset = new Vector(0, 10); target.Scroll!.Offset = new Vector(0, 10);
Layout(target); Layout(target);
// Make sure recycled item isn't now selected. // Make sure recycled item isn't now selected.
@ -244,7 +244,7 @@ namespace Avalonia.Controls.UnitTests
Prepare(target); Prepare(target);
Assert.Equal(new Size(100, 200), target.Scroll.Extent); Assert.Equal(new Size(100, 200), target.Scroll!.Extent);
Assert.Equal(new Size(100, 100), target.Scroll.Viewport); Assert.Equal(new Size(100, 100), target.Scroll.Viewport);
} }
} }
@ -273,7 +273,7 @@ namespace Avalonia.Controls.UnitTests
items.Remove("Item 2"); items.Remove("Item 2");
Layout(target); Layout(target);
var actual = target.GetRealizedContainers().Cast<ListBoxItem>().Select(x => (string)x.Content).ToList(); var actual = target.GetRealizedContainers().Cast<ListBoxItem>().Select(x => (string?)x.Content).ToList();
Assert.Equal(items.OrderBy(x => x), actual.OrderBy(x => x)); Assert.Equal(items.OrderBy(x => x), actual.OrderBy(x => x));
} }
} }
@ -324,7 +324,7 @@ namespace Avalonia.Controls.UnitTests
}; };
Prepare(target); Prepare(target);
target.Scroll.Offset = new Vector(0, 1); target.Scroll!.Offset = new Vector(0, 1);
items.RemoveRange(0, 11); items.RemoveRange(0, 11);
} }
@ -393,10 +393,12 @@ namespace Avalonia.Controls.UnitTests
lm.ExecuteLayoutPass(); lm.ExecuteLayoutPass();
var flags = System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic; var flags = System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic;
var toMeasure = lm.GetType().GetField("_toMeasure", flags).GetValue(lm) as System.Collections.Generic.IEnumerable<Layout.Layoutable>; var toMeasure = lm.GetType().GetField("_toMeasure", flags)!.GetValue(lm) as IEnumerable<Layoutable>;
var toArrange = lm.GetType().GetField("_toArrange", flags).GetValue(lm) as System.Collections.Generic.IEnumerable<Layout.Layoutable>; var toArrange = lm.GetType().GetField("_toArrange", flags)!.GetValue(lm) as IEnumerable<Layoutable>;
Assert.NotNull(toMeasure);
Assert.Equal(0, toMeasure.Count()); Assert.Equal(0, toMeasure.Count());
Assert.NotNull(toArrange);
Assert.Equal(0, toArrange.Count()); Assert.Equal(0, toArrange.Count());
} }
} }
@ -435,11 +437,11 @@ namespace Avalonia.Controls.UnitTests
Threading.Dispatcher.UIThread.RunJobs(); Threading.Dispatcher.UIThread.RunJobs();
Assert.Equal("30", target.ContainerFromIndex(items.Count - 1).DataContext); Assert.Equal("30", target.ContainerFromIndex(items.Count - 1)!.DataContext);
Assert.Equal("29", target.ContainerFromIndex(items.Count - 2).DataContext); Assert.Equal("29", target.ContainerFromIndex(items.Count - 2)!.DataContext);
Assert.Equal("28", target.ContainerFromIndex(items.Count - 3).DataContext); Assert.Equal("28", target.ContainerFromIndex(items.Count - 3)!.DataContext);
Assert.Equal("27", target.ContainerFromIndex(items.Count - 4).DataContext); Assert.Equal("27", target.ContainerFromIndex(items.Count - 4)!.DataContext);
Assert.Equal("26", target.ContainerFromIndex(items.Count - 5).DataContext); Assert.Equal("26", target.ContainerFromIndex(items.Count - 5)!.DataContext);
} }
} }
@ -463,7 +465,7 @@ namespace Avalonia.Controls.UnitTests
Threading.Dispatcher.UIThread.RunJobs(); Threading.Dispatcher.UIThread.RunJobs();
// First an item that is not index 0 must be selected. // First an item that is not index 0 must be selected.
_mouse.Click(target.Presenter.Panel.Children[1]); _mouse.Click(target.Presenter!.Panel!.Children[1]);
Threading.Dispatcher.UIThread.RunJobs(); Threading.Dispatcher.UIThread.RunJobs();
@ -516,7 +518,7 @@ namespace Avalonia.Controls.UnitTests
lm.ExecuteInitialLayoutPass(); lm.ExecuteInitialLayoutPass();
var panel = target.Presenter.Panel; var panel = target.Presenter!.Panel!;
items.Add("Item 1"); items.Add("Item 1");
target.Selection.Select(0); target.Selection.Select(0);
@ -640,7 +642,7 @@ namespace Avalonia.Controls.UnitTests
private static void Layout(Control c) private static void Layout(Control c)
{ {
((ILayoutRoot)c.GetVisualRoot()).LayoutManager.ExecuteLayoutPass(); ((ILayoutRoot)c.GetVisualRoot()!).LayoutManager.ExecuteLayoutPass();
} }
private class Item private class Item
@ -671,7 +673,7 @@ namespace Avalonia.Controls.UnitTests
target.Bind(ComboBox.SelectedItemProperty, textObservable); target.Bind(ComboBox.SelectedItemProperty, textObservable);
Assert.True(DataValidationErrors.GetHasErrors(target)); Assert.True(DataValidationErrors.GetHasErrors(target));
Assert.True(DataValidationErrors.GetErrors(target).SequenceEqual(new[] { exception })); Assert.Equal([exception], DataValidationErrors.GetErrors(target));
} }
[Fact] [Fact]
@ -689,7 +691,7 @@ namespace Avalonia.Controls.UnitTests
var realized = target.GetRealizedContainers() var realized = target.GetRealizedContainers()
.Cast<ListBoxItem>() .Cast<ListBoxItem>()
.Select(x => (string)x.DataContext) .Select(x => (string?)x.DataContext)
.ToList(); .ToList();
Assert.Equal(Enumerable.Range(0, 10).Select(x => $"Item{x}"), realized); Assert.Equal(Enumerable.Range(0, 10).Select(x => $"Item{x}"), realized);
@ -699,7 +701,7 @@ namespace Avalonia.Controls.UnitTests
realized = target.GetRealizedContainers() realized = target.GetRealizedContainers()
.Cast<ListBoxItem>() .Cast<ListBoxItem>()
.Select(x => (string)x.DataContext) .Select(x => (string?)x.DataContext)
.ToList(); .ToList();
Assert.Equal(Enumerable.Range(0, 10).Select(x => $"Item{99 - x}"), realized); Assert.Equal(Enumerable.Range(0, 10).Select(x => $"Item{99 - x}"), realized);
@ -722,7 +724,7 @@ namespace Avalonia.Controls.UnitTests
var realized = target.GetRealizedContainers() var realized = target.GetRealizedContainers()
.Cast<ListBoxItem>() .Cast<ListBoxItem>()
.Select(x => (string)x.DataContext) .Select(x => (string?)x.DataContext)
.ToList(); .ToList();
Assert.Equal(Enumerable.Range(0, 10).Select(x => $"Item{x}"), realized); Assert.Equal(Enumerable.Range(0, 10).Select(x => $"Item{x}"), realized);
@ -734,7 +736,7 @@ namespace Avalonia.Controls.UnitTests
realized = target.GetRealizedContainers() realized = target.GetRealizedContainers()
.Cast<ListBoxItem>() .Cast<ListBoxItem>()
.Select(x => (string)x.DataContext) .Select(x => (string?)x.DataContext)
.ToList(); .ToList();
// "Item1" should remain selected, and now be at the bottom of the viewport. // "Item1" should remain selected, and now be at the bottom of the viewport.
@ -775,7 +777,7 @@ namespace Avalonia.Controls.UnitTests
{ {
Template = ListBoxTemplate(), Template = ListBoxTemplate(),
ItemsSource = items, ItemsSource = items,
ItemsPanel = new FuncTemplate<Panel>(() => new VirtualizingStackPanel ItemsPanel = new FuncTemplate<Panel?>(() => new VirtualizingStackPanel
{ {
Orientation = Orientation.Horizontal Orientation = Orientation.Horizontal
}), }),
@ -811,13 +813,13 @@ namespace Avalonia.Controls.UnitTests
Prepare(target); Prepare(target);
RaiseKeyEvent(target, Key.Down); RaiseKeyEvent(target, Key.Down);
Assert.True(target.ContainerFromIndex(1).IsFocused); Assert.True(target.ContainerFromIndex(1)!.IsFocused);
RaiseKeyEvent(target, Key.Down); RaiseKeyEvent(target, Key.Down);
Assert.True(target.ContainerFromIndex(2).IsFocused); Assert.True(target.ContainerFromIndex(2)!.IsFocused);
RaiseKeyEvent(target, Key.Up); RaiseKeyEvent(target, Key.Up);
Assert.True(target.ContainerFromIndex(1).IsFocused); Assert.True(target.ContainerFromIndex(1)!.IsFocused);
} }
[Fact] [Fact]
@ -878,7 +880,7 @@ namespace Avalonia.Controls.UnitTests
RaiseKeyEvent(target, Key.Down, KeyModifiers.Control); RaiseKeyEvent(target, Key.Down, KeyModifiers.Control);
Assert.Equal(0, target.SelectedIndex); Assert.Equal(0, target.SelectedIndex);
Assert.True(target.ContainerFromIndex(1).IsFocused); Assert.True(target.ContainerFromIndex(1)!.IsFocused);
} }
[Fact] [Fact]
@ -899,16 +901,16 @@ namespace Avalonia.Controls.UnitTests
Prepare(target); Prepare(target);
target.ContainerFromIndex(0)!.Focus(); target.ContainerFromIndex(0)!.Focus();
target.Scroll.Offset = new Vector(0, 100); target.Scroll!.Offset = new Vector(0, 100);
Layout(target); Layout(target);
var panel = (VirtualizingStackPanel)target.ItemsPanelRoot; var panel = (VirtualizingStackPanel)target.ItemsPanelRoot!;
Assert.Equal(10, panel.FirstRealizedIndex); Assert.Equal(10, panel.FirstRealizedIndex);
RaiseKeyEvent(target, Key.Down); RaiseKeyEvent(target, Key.Down);
Assert.Equal(1, target.SelectedIndex); Assert.Equal(1, target.SelectedIndex);
Assert.True(target.ContainerFromIndex(1).IsFocused); Assert.True(target.ContainerFromIndex(1)!.IsFocused);
Assert.Equal(new Vector(0, 10), target.Scroll.Offset); Assert.Equal(new Vector(0, 10), target.Scroll.Offset);
} }
@ -1184,6 +1186,7 @@ namespace Avalonia.Controls.UnitTests
RaiseKeyEvent(button, Key.Tab); RaiseKeyEvent(button, Key.Tab);
var item = target.ContainerFromIndex(1); var item = target.ContainerFromIndex(1);
Assert.NotNull(item);
Assert.Same(item, root.FocusManager.GetFocusedElement()); Assert.Same(item, root.FocusManager.GetFocusedElement());
RaiseKeyEvent(item, Key.Tab); RaiseKeyEvent(item, Key.Tab);
@ -1340,33 +1343,33 @@ namespace Avalonia.Controls.UnitTests
new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
} }
public event NotifyCollectionChangedEventHandler CollectionChanged; public event NotifyCollectionChangedEventHandler? CollectionChanged;
} }
private class DataVirtualizingList : IList private class DataVirtualizingList : IList
{ {
private readonly List<string> _inner = new(Enumerable.Repeat<string>(null, 100)); private readonly List<string?> _inner = new(Enumerable.Repeat<string?>(null, 100));
public object this[int index] public object? this[int index]
{ {
get => _inner[index] = $"Item{index}"; get => _inner[index] = $"Item{index}";
set => throw new NotSupportedException(); set => throw new NotSupportedException();
} }
public IEnumerable<string> GetRealizedItems() => _inner.Where(x => x is not null); public IEnumerable<string> GetRealizedItems() => _inner.Where(x => x is not null)!;
public bool IsFixedSize => true; public bool IsFixedSize => true;
public bool IsReadOnly => true; public bool IsReadOnly => true;
public int Count => _inner.Count; public int Count => _inner.Count;
public bool IsSynchronized => false; public bool IsSynchronized => false;
public object SyncRoot => this; public object SyncRoot => this;
public int Add(object value) => throw new NotSupportedException(); public int Add(object? value) => throw new NotSupportedException();
public void Clear() => throw new NotSupportedException(); public void Clear() => throw new NotSupportedException();
public bool Contains(object value) => throw new NotImplementedException(); public bool Contains(object? value) => throw new NotImplementedException();
public void CopyTo(Array array, int index) => throw new NotImplementedException(); public void CopyTo(Array array, int index) => throw new NotImplementedException();
public IEnumerator GetEnumerator() => _inner.GetEnumerator(); public IEnumerator GetEnumerator() => _inner.GetEnumerator();
public int IndexOf(object value) => throw new NotImplementedException(); public int IndexOf(object? value) => throw new NotImplementedException();
public void Insert(int index, object value) => throw new NotSupportedException(); public void Insert(int index, object? value) => throw new NotSupportedException();
public void Remove(object value) => throw new NotSupportedException(); public void Remove(object? value) => throw new NotSupportedException();
public void RemoveAt(int index) => throw new NotSupportedException(); public void RemoveAt(int index) => throw new NotSupportedException();
} }
} }

122
tests/Avalonia.Controls.UnitTests/ListBoxTests_Multiple.cs

@ -36,7 +36,7 @@ namespace Avalonia.Controls.UnitTests
root.LayoutManager.ExecuteInitialLayoutPass(); root.LayoutManager.ExecuteInitialLayoutPass();
AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration()); AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration());
_helper.Click(target.Presenter.Panel.Children[2], modifiers: KeyModifiers.Shift); _helper.Click(target.Presenter!.Panel!.Children[2], modifiers: KeyModifiers.Shift);
Assert.Equal(new[] { "Foo", "Bar", "Baz" }, target.SelectedItems); Assert.Equal(new[] { "Foo", "Bar", "Baz" }, target.SelectedItems);
Assert.Equal(new[] { 0, 1, 2 }, SelectedContainers(target)); Assert.Equal(new[] { 0, 1, 2 }, SelectedContainers(target));
@ -63,7 +63,7 @@ namespace Avalonia.Controls.UnitTests
AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration()); AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration());
SelectionChangedEventArgs receivedArgs = null; SelectionChangedEventArgs? receivedArgs = null;
target.SelectionChanged += (_, args) => receivedArgs = args; target.SelectionChanged += (_, args) => receivedArgs = args;
@ -81,22 +81,23 @@ namespace Avalonia.Controls.UnitTests
Assert.Empty(receivedArgs.AddedItems); Assert.Empty(receivedArgs.AddedItems);
} }
_helper.Click(target.Presenter.Panel.Children[1]); var panel = target.Presenter!.Panel!;
_helper.Click(panel.Children[1]);
VerifyAdded("Bar"); VerifyAdded("Bar");
receivedArgs = null; receivedArgs = null;
_helper.Click(target.Presenter.Panel.Children[2], modifiers: KeyModifiers.Control); _helper.Click(panel.Children[2], modifiers: KeyModifiers.Control);
VerifyAdded("Baz"); VerifyAdded("Baz");
receivedArgs = null; receivedArgs = null;
_helper.Click(target.Presenter.Panel.Children[3], modifiers: KeyModifiers.Control); _helper.Click(panel.Children[3], modifiers: KeyModifiers.Control);
VerifyAdded("Qux"); VerifyAdded("Qux");
receivedArgs = null; receivedArgs = null;
_helper.Click(target.Presenter.Panel.Children[1], modifiers: KeyModifiers.Control); _helper.Click(panel.Children[1], modifiers: KeyModifiers.Control);
VerifyRemoved("Bar"); VerifyRemoved("Bar");
} }
@ -120,15 +121,16 @@ namespace Avalonia.Controls.UnitTests
root.LayoutManager.ExecuteInitialLayoutPass(); root.LayoutManager.ExecuteInitialLayoutPass();
AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration()); AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration());
_helper.Click(target.Presenter.Panel.Children[1]); var panel = target.Presenter!.Panel!;
_helper.Click(target.Presenter.Panel.Children[2], modifiers: KeyModifiers.Control); _helper.Click(panel.Children[1]);
_helper.Click(target.Presenter.Panel.Children[3], modifiers: KeyModifiers.Control); _helper.Click(panel.Children[2], modifiers: KeyModifiers.Control);
_helper.Click(panel.Children[3], modifiers: KeyModifiers.Control);
Assert.Equal(1, target.SelectedIndex); Assert.Equal(1, target.SelectedIndex);
Assert.Equal("Bar", target.SelectedItem); Assert.Equal("Bar", target.SelectedItem);
Assert.Equal(new[] { "Bar", "Baz", "Qux" }, target.SelectedItems); Assert.Equal(new[] { "Bar", "Baz", "Qux" }, target.SelectedItems);
_helper.Click(target.Presenter.Panel.Children[1], modifiers: KeyModifiers.Control); _helper.Click(panel.Children[1], modifiers: KeyModifiers.Control);
Assert.Equal(2, target.SelectedIndex); Assert.Equal(2, target.SelectedIndex);
Assert.Equal("Baz", target.SelectedItem); Assert.Equal("Baz", target.SelectedItem);
@ -154,13 +156,14 @@ namespace Avalonia.Controls.UnitTests
root.LayoutManager.ExecuteInitialLayoutPass(); root.LayoutManager.ExecuteInitialLayoutPass();
AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration()); AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration());
_helper.Click(target.Presenter.Panel.Children[1]); var panel = target.Presenter!.Panel!;
_helper.Click(target.Presenter.Panel.Children[2], modifiers: KeyModifiers.Control); _helper.Click(panel.Children[1]);
_helper.Click(panel.Children[2], modifiers: KeyModifiers.Control);
Assert.Equal(1, target.SelectedIndex); Assert.Equal(1, target.SelectedIndex);
Assert.Equal("Bar", target.SelectedItem); Assert.Equal("Bar", target.SelectedItem);
_helper.Click(target.Presenter.Panel.Children[2], modifiers: KeyModifiers.Control); _helper.Click(panel.Children[2], modifiers: KeyModifiers.Control);
Assert.Equal(1, target.SelectedIndex); Assert.Equal(1, target.SelectedIndex);
Assert.Equal("Bar", target.SelectedItem); Assert.Equal("Bar", target.SelectedItem);
@ -185,13 +188,14 @@ namespace Avalonia.Controls.UnitTests
root.LayoutManager.ExecuteInitialLayoutPass(); root.LayoutManager.ExecuteInitialLayoutPass();
AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration()); AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration());
var panel = target.Presenter!.Panel!;
// Select first range // Select first range
_helper.Click(target.Presenter.Panel.Children[0]); _helper.Click(panel.Children[0]);
_helper.Click(target.Presenter.Panel.Children[2], modifiers: KeyModifiers.Shift); _helper.Click(panel.Children[2], modifiers: KeyModifiers.Shift);
// Select second range // Select second range
_helper.Click(target.Presenter.Panel.Children[4], modifiers: KeyModifiers.Control); _helper.Click(panel.Children[4], modifiers: KeyModifiers.Control);
_helper.Click(target.Presenter.Panel.Children[6], modifiers: KeyModifiers.Control | KeyModifiers.Shift); _helper.Click(panel.Children[6], modifiers: KeyModifiers.Control | KeyModifiers.Shift);
Assert.Equal(new[] { "Foo", "Bar", "Baz", "Boo", "Far", "Faz" }, target.SelectedItems); Assert.Equal(new[] { "Foo", "Bar", "Baz", "Boo", "Far", "Faz" }, target.SelectedItems);
} }
@ -215,10 +219,9 @@ namespace Avalonia.Controls.UnitTests
root.LayoutManager.ExecuteInitialLayoutPass(); root.LayoutManager.ExecuteInitialLayoutPass();
AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration()); AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration());
_helper.Click(target.Presenter.Panel.Children[3]); var panel = target.Presenter!.Panel!;
_helper.Click(target.Presenter.Panel.Children[4], modifiers: KeyModifiers.Control); _helper.Click(panel.Children[3]);
_helper.Click(panel.Children[4], modifiers: KeyModifiers.Control);
var panel = target.Presenter.Panel;
Assert.Equal(new[] { "Foo", "Bar" }, target.SelectedItems); Assert.Equal(new[] { "Foo", "Bar" }, target.SelectedItems);
Assert.Equal(new[] { 3, 4 }, SelectedContainers(target)); Assert.Equal(new[] { 3, 4 }, SelectedContainers(target));
@ -243,10 +246,9 @@ namespace Avalonia.Controls.UnitTests
root.LayoutManager.ExecuteInitialLayoutPass(); root.LayoutManager.ExecuteInitialLayoutPass();
AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration()); AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration());
_helper.Click(target.Presenter.Panel.Children[3]); var panel = target.Presenter!.Panel!;
_helper.Click(target.Presenter.Panel.Children[5], modifiers: KeyModifiers.Shift); _helper.Click(panel.Children[3]);
_helper.Click(panel.Children[5], modifiers: KeyModifiers.Shift);
var panel = target.Presenter.Panel;
Assert.Equal(new[] { "Foo", "Bar", "Baz" }, target.SelectedItems); Assert.Equal(new[] { "Foo", "Bar", "Baz" }, target.SelectedItems);
Assert.Equal(new[] { 3, 4, 5 }, SelectedContainers(target)); Assert.Equal(new[] { 3, 4, 5 }, SelectedContainers(target));
@ -271,10 +273,9 @@ namespace Avalonia.Controls.UnitTests
root.LayoutManager.ExecuteInitialLayoutPass(); root.LayoutManager.ExecuteInitialLayoutPass();
AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration()); AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration());
_helper.Click(target.Presenter.Panel.Children[0]); var panel = target.Presenter!.Panel!;
_helper.Click(target.Presenter.Panel.Children[5], modifiers: KeyModifiers.Shift); _helper.Click(panel.Children[0]);
_helper.Click(panel.Children[5], modifiers: KeyModifiers.Shift);
var panel = target.Presenter.Panel;
Assert.Equal(new[] { "Foo", "Bar", "Baz", "Foo", "Bar", "Baz" }, target.SelectedItems); Assert.Equal(new[] { "Foo", "Bar", "Baz", "Foo", "Bar", "Baz" }, target.SelectedItems);
Assert.Equal(new[] { 0, 1, 2, 3, 4, 5 }, SelectedContainers(target)); Assert.Equal(new[] { 0, 1, 2, 3, 4, 5 }, SelectedContainers(target));
@ -299,7 +300,7 @@ namespace Avalonia.Controls.UnitTests
AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration()); AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration());
SelectionChangedEventArgs receivedArgs = null; SelectionChangedEventArgs? receivedArgs = null;
target.SelectionChanged += (_, args) => receivedArgs = args; target.SelectionChanged += (_, args) => receivedArgs = args;
@ -317,17 +318,18 @@ namespace Avalonia.Controls.UnitTests
Assert.Empty(receivedArgs.AddedItems); Assert.Empty(receivedArgs.AddedItems);
} }
_helper.Click(target.Presenter.Panel.Children[1]); var panel = target.Presenter!.Panel!;
_helper.Click(panel.Children[1]);
VerifyAdded("Bar"); VerifyAdded("Bar");
receivedArgs = null; receivedArgs = null;
_helper.Click(target.Presenter.Panel.Children[3], modifiers: KeyModifiers.Shift); _helper.Click(panel.Children[3], modifiers: KeyModifiers.Shift);
VerifyAdded("Baz", "Qux"); VerifyAdded("Baz", "Qux");
receivedArgs = null; receivedArgs = null;
_helper.Click(target.Presenter.Panel.Children[2], modifiers: KeyModifiers.Shift); _helper.Click(panel.Children[2], modifiers: KeyModifiers.Shift);
VerifyRemoved("Qux"); VerifyRemoved("Qux");
} }
@ -351,19 +353,20 @@ namespace Avalonia.Controls.UnitTests
root.LayoutManager.ExecuteInitialLayoutPass(); root.LayoutManager.ExecuteInitialLayoutPass();
AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration()); AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration());
_helper.Click(target.Presenter.Panel.Children[0]); var panel = target.Presenter!.Panel!;
_helper.Click(panel.Children[0]);
Assert.Equal(new[] { "Foo" }, target.SelectedItems); Assert.Equal(new[] { "Foo" }, target.SelectedItems);
_helper.Click(target.Presenter.Panel.Children[4], modifiers: KeyModifiers.Control); _helper.Click(panel.Children[4], modifiers: KeyModifiers.Control);
Assert.Equal(new[] { "Foo", "Bar" }, target.SelectedItems); Assert.Equal(new[] { "Foo", "Bar" }, target.SelectedItems);
_helper.Click(target.Presenter.Panel.Children[3], modifiers: KeyModifiers.Control); _helper.Click(panel.Children[3], modifiers: KeyModifiers.Control);
Assert.Equal(new[] { "Foo", "Bar", "Foo" }, target.SelectedItems); Assert.Equal(new[] { "Foo", "Bar", "Foo" }, target.SelectedItems);
_helper.Click(target.Presenter.Panel.Children[1], modifiers: KeyModifiers.Control); _helper.Click(panel.Children[1], modifiers: KeyModifiers.Control);
Assert.Equal(new[] { "Foo", "Bar", "Foo", "Bar" }, target.SelectedItems); Assert.Equal(new[] { "Foo", "Bar", "Foo", "Bar" }, target.SelectedItems);
} }
@ -389,9 +392,9 @@ namespace Avalonia.Controls.UnitTests
target.SelectAll(); target.SelectAll();
Assert.Equal(3, target.SelectedItems.Count); Assert.Equal(3, target.SelectedItems!.Count);
_helper.Click(target.Presenter.Panel.Children[0]); _helper.Click(target.Presenter!.Panel!.Children[0]);
Assert.Equal(1, target.SelectedItems.Count); Assert.Equal(1, target.SelectedItems.Count);
Assert.Equal(new[] { "Foo", }, target.SelectedItems); Assert.Equal(new[] { "Foo", }, target.SelectedItems);
@ -419,9 +422,9 @@ namespace Avalonia.Controls.UnitTests
target.SelectAll(); target.SelectAll();
Assert.Equal(3, target.SelectedItems.Count); Assert.Equal(3, target.SelectedItems!.Count);
_helper.Click(target.Presenter.Panel.Children[0], MouseButton.Right); _helper.Click(target.Presenter!.Panel!.Children[0], MouseButton.Right);
Assert.Equal(3, target.SelectedItems.Count); Assert.Equal(3, target.SelectedItems.Count);
} }
@ -446,13 +449,16 @@ namespace Avalonia.Controls.UnitTests
root.LayoutManager.ExecuteInitialLayoutPass(); root.LayoutManager.ExecuteInitialLayoutPass();
AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration()); AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration());
_helper.Click(target.Presenter.Panel.Children[0]); var panel = target.Presenter!.Panel!;
_helper.Click(target.Presenter.Panel.Children[1], modifiers: KeyModifiers.Shift); _helper.Click(panel.Children[0]);
_helper.Click(panel.Children[1], modifiers: KeyModifiers.Shift);
Assert.NotNull(target.SelectedItems);
Assert.Equal(2, target.SelectedItems.Count); Assert.Equal(2, target.SelectedItems.Count);
_helper.Click(target.Presenter.Panel.Children[2], MouseButton.Right); _helper.Click(panel.Children[2], MouseButton.Right);
Assert.NotNull(target.SelectedItems);
Assert.Equal(1, target.SelectedItems.Count); Assert.Equal(1, target.SelectedItems.Count);
} }
} }
@ -477,9 +483,11 @@ namespace Avalonia.Controls.UnitTests
AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration()); AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration());
_helper.Click(target.Presenter.Panel.Children[0]); var panel = target.Presenter!.Panel!;
_helper.Click(target.Presenter.Panel.Children[2], MouseButton.Right, modifiers: KeyModifiers.Shift); _helper.Click(panel.Children[0]);
_helper.Click(panel.Children[2], MouseButton.Right, modifiers: KeyModifiers.Shift);
Assert.NotNull(target.SelectedItems);
Assert.Equal(1, target.SelectedItems.Count); Assert.Equal(1, target.SelectedItems.Count);
} }
} }
@ -504,9 +512,11 @@ namespace Avalonia.Controls.UnitTests
AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration()); AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration());
_helper.Click(target.Presenter.Panel.Children[0]); var panel = target.Presenter!.Panel!;
_helper.Click(target.Presenter.Panel.Children[2], MouseButton.Right, modifiers: KeyModifiers.Control); _helper.Click(panel.Children[0]);
_helper.Click(panel.Children[2], MouseButton.Right, modifiers: KeyModifiers.Control);
Assert.NotNull(target.SelectedItems);
Assert.Equal(1, target.SelectedItems.Count); Assert.Equal(1, target.SelectedItems.Count);
} }
} }
@ -532,19 +542,19 @@ namespace Avalonia.Controls.UnitTests
Assert.Equal(new[] { "Foo", "Bar", }, target.SelectedItems); Assert.Equal(new[] { "Foo", "Bar", }, target.SelectedItems);
Assert.Equal(new[] { 0, 1 }, SelectedContainers(target)); Assert.Equal(new[] { 0, 1 }, SelectedContainers(target));
Assert.True(target.ContainerFromIndex(1).IsFocused); Assert.True(target.ContainerFromIndex(1)!.IsFocused);
RaiseKeyEvent(target, Key.Down, KeyModifiers.Shift); RaiseKeyEvent(target, Key.Down, KeyModifiers.Shift);
Assert.Equal(new[] { "Foo", "Bar", "Baz", }, target.SelectedItems); Assert.Equal(new[] { "Foo", "Bar", "Baz", }, target.SelectedItems);
Assert.Equal(new[] { 0, 1, 2 }, SelectedContainers(target)); Assert.Equal(new[] { 0, 1, 2 }, SelectedContainers(target));
Assert.True(target.ContainerFromIndex(2).IsFocused); Assert.True(target.ContainerFromIndex(2)!.IsFocused);
RaiseKeyEvent(target, Key.Up, KeyModifiers.Shift); RaiseKeyEvent(target, Key.Up, KeyModifiers.Shift);
Assert.Equal(new[] { "Foo", "Bar", }, target.SelectedItems); Assert.Equal(new[] { "Foo", "Bar", }, target.SelectedItems);
Assert.Equal(new[] { 0, 1 }, SelectedContainers(target)); Assert.Equal(new[] { 0, 1 }, SelectedContainers(target));
Assert.True(target.ContainerFromIndex(1).IsFocused); Assert.True(target.ContainerFromIndex(1)!.IsFocused);
} }
[Fact] [Fact]
@ -569,7 +579,7 @@ namespace Avalonia.Controls.UnitTests
Assert.Equal(new[] { "Foo", "Bar", "Baz" }, target.SelectedItems); Assert.Equal(new[] { "Foo", "Bar", "Baz" }, target.SelectedItems);
Assert.Equal(new[] { 0, 1, 2 }, SelectedContainers(target)); Assert.Equal(new[] { 0, 1, 2 }, SelectedContainers(target));
Assert.True(target.ContainerFromIndex(2).IsFocused); Assert.True(target.ContainerFromIndex(2)!.IsFocused);
} }
[Fact] [Fact]
@ -593,19 +603,19 @@ namespace Avalonia.Controls.UnitTests
Assert.Equal(new[] { "Foo", "Bar" }, target.SelectedItems); Assert.Equal(new[] { "Foo", "Bar" }, target.SelectedItems);
Assert.Equal(new[] { 0, 1 }, SelectedContainers(target)); Assert.Equal(new[] { 0, 1 }, SelectedContainers(target));
Assert.True(target.ContainerFromIndex(1).IsFocused); Assert.True(target.ContainerFromIndex(1)!.IsFocused);
RaiseKeyEvent(target, Key.Down, KeyModifiers.Control); RaiseKeyEvent(target, Key.Down, KeyModifiers.Control);
Assert.Equal(new[] { "Foo", "Bar" }, target.SelectedItems); Assert.Equal(new[] { "Foo", "Bar" }, target.SelectedItems);
Assert.Equal(new[] { 0, 1 }, SelectedContainers(target)); Assert.Equal(new[] { 0, 1 }, SelectedContainers(target));
Assert.True(target.ContainerFromIndex(2).IsFocused); Assert.True(target.ContainerFromIndex(2)!.IsFocused);
RaiseKeyEvent(target, Key.Down, KeyModifiers.Shift); RaiseKeyEvent(target, Key.Down, KeyModifiers.Shift);
Assert.Equal(new[] { "Foo", "Bar", "Baz", "Qux" }, target.SelectedItems); Assert.Equal(new[] { "Foo", "Bar", "Baz", "Qux" }, target.SelectedItems);
Assert.Equal(new[] { 0, 1, 2, 3 }, SelectedContainers(target)); Assert.Equal(new[] { 0, 1, 2, 3 }, SelectedContainers(target));
Assert.True(target.ContainerFromIndex(3).IsFocused); Assert.True(target.ContainerFromIndex(3)!.IsFocused);
} }
[Fact] [Fact]
@ -700,7 +710,7 @@ namespace Avalonia.Controls.UnitTests
private static IEnumerable<int> SelectedContainers(SelectingItemsControl target) private static IEnumerable<int> SelectedContainers(SelectingItemsControl target)
{ {
return target.Presenter.Panel.Children return target.Presenter!.Panel!.Children
.Select(x => x.Classes.Contains(":selected") ? target.IndexFromContainer(x) : -1) .Select(x => x.Classes.Contains(":selected") ? target.IndexFromContainer(x) : -1)
.Where(x => x != -1); .Where(x => x != -1);
} }

32
tests/Avalonia.Controls.UnitTests/ListBoxTests_Single.cs

@ -35,7 +35,7 @@ namespace Avalonia.Controls.UnitTests
Prepare(target); Prepare(target);
target.Presenter.Panel.Children[0].RaiseEvent(new GotFocusEventArgs target.Presenter!.Panel!.Children[0].RaiseEvent(new GotFocusEventArgs
{ {
NavigationMethod = NavigationMethod.Tab, NavigationMethod = NavigationMethod.Tab,
}); });
@ -57,7 +57,7 @@ namespace Avalonia.Controls.UnitTests
AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration()); AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration());
Prepare(target); Prepare(target);
target.Presenter.Panel.Children[0].RaiseEvent(new GotFocusEventArgs target.Presenter!.Panel!.Children[0].RaiseEvent(new GotFocusEventArgs
{ {
NavigationMethod = NavigationMethod.Directional, NavigationMethod = NavigationMethod.Directional,
KeyModifiers = KeyModifiers.Control KeyModifiers = KeyModifiers.Control
@ -86,7 +86,7 @@ namespace Avalonia.Controls.UnitTests
}; };
AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration()); AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration());
Prepare(target); Prepare(target);
_mouse.Click(target.Presenter.Panel.Children[0]); _mouse.Click(target.Presenter!.Panel!.Children[0]);
Assert.Equal(0, target.SelectedIndex); Assert.Equal(0, target.SelectedIndex);
} }
@ -104,7 +104,7 @@ namespace Avalonia.Controls.UnitTests
ItemsSource = new[] { "Foo", "Bar", "Baz " } ItemsSource = new[] { "Foo", "Bar", "Baz " }
}; };
Prepare(target); Prepare(target);
_pen.Down(target.Presenter.Panel.Children[0], MouseButton.Right); _pen.Down(target.Presenter!.Panel!.Children[0], MouseButton.Right);
Assert.Equal(0, target.SelectedIndex); Assert.Equal(0, target.SelectedIndex);
} }
@ -122,7 +122,7 @@ namespace Avalonia.Controls.UnitTests
ItemsSource = new[] { "Foo", "Bar", "Baz " } ItemsSource = new[] { "Foo", "Bar", "Baz " }
}; };
Prepare(target); Prepare(target);
_pen.Down(target.Presenter.Panel.Children[0]); _pen.Down(target.Presenter!.Panel!.Children[0]);
Assert.Equal(-1, target.SelectedIndex); Assert.Equal(-1, target.SelectedIndex);
} }
@ -156,7 +156,7 @@ namespace Avalonia.Controls.UnitTests
}); });
var pointer = type == PointerType.Mouse ? _mouse : _pen; var pointer = type == PointerType.Mouse ? _mouse : _pen;
pointer.Click(target.Presenter.Panel.Children[0], MouseButton.Right, position: new Point(5, 5)); pointer.Click(target.Presenter!.Panel!.Children[0], MouseButton.Right, position: new Point(5, 5));
Assert.True(contextRaised); Assert.True(contextRaised);
Assert.Equal(0, target.SelectedIndex); Assert.Equal(0, target.SelectedIndex);
@ -177,7 +177,7 @@ namespace Avalonia.Controls.UnitTests
Prepare(target); Prepare(target);
target.SelectedIndex = 0; target.SelectedIndex = 0;
_mouse.Click(target.Presenter.Panel.Children[0]); _mouse.Click(target.Presenter!.Panel!.Children[0]);
Assert.Equal(0, target.SelectedIndex); Assert.Equal(0, target.SelectedIndex);
} }
@ -197,7 +197,7 @@ namespace Avalonia.Controls.UnitTests
AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration()); AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration());
Prepare(target); Prepare(target);
_mouse.Click(target.Presenter.Panel.Children[0]); _mouse.Click(target.Presenter!.Panel!.Children[0]);
Assert.Equal(0, target.SelectedIndex); Assert.Equal(0, target.SelectedIndex);
} }
@ -219,7 +219,7 @@ namespace Avalonia.Controls.UnitTests
Prepare(target); Prepare(target);
target.SelectedIndex = 0; target.SelectedIndex = 0;
_mouse.Click(target.Presenter.Panel.Children[0]); _mouse.Click(target.Presenter!.Panel!.Children[0]);
Assert.Equal(-1, target.SelectedIndex); Assert.Equal(-1, target.SelectedIndex);
} }
@ -240,7 +240,7 @@ namespace Avalonia.Controls.UnitTests
Prepare(target); Prepare(target);
target.SelectedIndex = 0; target.SelectedIndex = 0;
_mouse.Click(target.Presenter.Panel.Children[0]); _mouse.Click(target.Presenter!.Panel!.Children[0]);
Assert.Equal(0, target.SelectedIndex); Assert.Equal(0, target.SelectedIndex);
} }
@ -261,7 +261,7 @@ namespace Avalonia.Controls.UnitTests
Prepare(target); Prepare(target);
target.SelectedIndex = 1; target.SelectedIndex = 1;
_mouse.Click(target.Presenter.Panel.Children[0]); _mouse.Click(target.Presenter!.Panel!.Children[0]);
Assert.Equal(0, target.SelectedIndex); Assert.Equal(0, target.SelectedIndex);
} }
@ -292,7 +292,7 @@ namespace Avalonia.Controls.UnitTests
{ {
using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface)) using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface))
{ {
var viewModel = new TestStackOverflowViewModel() { Items = new List<string> { "foo", "bar", "baz" } }; var viewModel = new TestStackOverflowViewModel() { Items = ["foo", "bar", "baz"] };
var target = new ListBox var target = new ListBox
{ {
@ -316,17 +316,17 @@ namespace Avalonia.Controls.UnitTests
private class TestStackOverflowViewModel : INotifyPropertyChanged private class TestStackOverflowViewModel : INotifyPropertyChanged
{ {
public List<string> Items { get; set; } public List<string?> Items { get; set; } = [];
public int SetterInvokedCount { get; private set; } public int SetterInvokedCount { get; private set; }
public const int MaxInvokedCount = 1000; public const int MaxInvokedCount = 1000;
private string _selectedItem; private string? _selectedItem;
public event PropertyChangedEventHandler PropertyChanged; public event PropertyChangedEventHandler? PropertyChanged;
public string SelectedItem public string? SelectedItem
{ {
get { return _selectedItem; } get { return _selectedItem; }
set set

8
tests/Avalonia.Controls.UnitTests/MaskedTextBoxTests.cs

@ -977,7 +977,7 @@ namespace Avalonia.Controls.UnitTests
}); });
} }
private static IDisposable Start(TestServices services = null) private static IDisposable Start(TestServices? services = null)
{ {
CultureInfo.CurrentCulture = CultureInfo.CurrentUICulture = CultureInfo.GetCultureInfo("en-US"); CultureInfo.CurrentCulture = CultureInfo.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
return UnitTestApplication.Start((services ?? Services).With(assetLoader: new StandardAssetLoader())); return UnitTestApplication.Start((services ?? Services).With(assetLoader: new StandardAssetLoader()));
@ -986,7 +986,7 @@ namespace Avalonia.Controls.UnitTests
private class Class1 : NotifyingBase private class Class1 : NotifyingBase
{ {
private int _foo; private int _foo;
private string _bar; private string? _bar;
public int Foo public int Foo
{ {
@ -994,7 +994,7 @@ namespace Avalonia.Controls.UnitTests
set { _foo = value; RaisePropertyChanged(); } set { _foo = value; RaisePropertyChanged(); }
} }
public string Bar public string? Bar
{ {
get { return _bar; } get { return _bar; }
set { _bar = value; RaisePropertyChanged(); } set { _bar = value; RaisePropertyChanged(); }
@ -1005,7 +1005,7 @@ namespace Avalonia.Controls.UnitTests
{ {
private readonly ILayoutManager _layoutManager; private readonly ILayoutManager _layoutManager;
public TestTopLevel(ITopLevelImpl impl, ILayoutManager layoutManager = null) public TestTopLevel(ITopLevelImpl impl, ILayoutManager? layoutManager = null)
: base(impl) : base(impl)
{ {
_layoutManager = layoutManager ?? new LayoutManager(this); _layoutManager = layoutManager ?? new LayoutManager(this);

22
tests/Avalonia.Controls.UnitTests/MenuItemTests.cs

@ -17,7 +17,7 @@ namespace Avalonia.Controls.UnitTests
{ {
public class MenuItemTests : ScopedTestBase public class MenuItemTests : ScopedTestBase
{ {
private Mock<IPopupImpl> popupImpl; private Mock<IPopupImpl>? _popupImpl;
[Fact] [Fact]
public void Header_Of_Minus_Should_Apply_Separator_Pseudoclass() public void Header_Of_Minus_Should_Apply_Separator_Pseudoclass()
@ -238,7 +238,7 @@ namespace Avalonia.Controls.UnitTests
var window = new Window { Content = new Panel { ContextMenu = contextMenu } }; var window = new Window { Content = new Panel { ContextMenu = contextMenu } };
window.ApplyStyling(); window.ApplyStyling();
window.ApplyTemplate(); window.ApplyTemplate();
window.Presenter.ApplyTemplate(); window.Presenter!.ApplyTemplate();
Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded);
Assert.True(target.IsEffectivelyEnabled); Assert.True(target.IsEffectivelyEnabled);
@ -280,7 +280,7 @@ namespace Avalonia.Controls.UnitTests
var window = new Window { Content = button }; var window = new Window { Content = button };
window.ApplyStyling(); window.ApplyStyling();
window.ApplyTemplate(); window.ApplyTemplate();
window.Presenter.ApplyTemplate(); window.Presenter!.ApplyTemplate();
Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded);
Assert.True(target.IsEffectivelyEnabled); Assert.True(target.IsEffectivelyEnabled);
target.Command = command; target.Command = command;
@ -321,7 +321,7 @@ namespace Avalonia.Controls.UnitTests
var window = new Window { Content = new Panel { ContextMenu = contextMenu } }; var window = new Window { Content = new Panel { ContextMenu = contextMenu } };
window.ApplyStyling(); window.ApplyStyling();
window.ApplyTemplate(); window.ApplyTemplate();
window.Presenter.ApplyTemplate(); window.Presenter!.ApplyTemplate();
contextMenu.Open(); contextMenu.Open();
Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded);
@ -421,7 +421,7 @@ namespace Avalonia.Controls.UnitTests
window.Show(); window.Show();
window.LayoutManager.ExecuteInitialLayoutPass(); window.LayoutManager.ExecuteInitialLayoutPass();
var panel = Assert.IsType<StackPanel>(menu.Presenter.Panel); var panel = Assert.IsType<StackPanel>(menu.Presenter!.Panel);
Assert.Equal(2, panel.Children.Count); Assert.Equal(2, panel.Children.Count);
for (var i = 0; i < panel.Children.Count; i++) for (var i = 0; i < panel.Children.Count; i++)
@ -819,7 +819,7 @@ namespace Avalonia.Controls.UnitTests
public void MenuItem_CommandParameter_Does_Not_Change_While_Execution() public void MenuItem_CommandParameter_Does_Not_Change_While_Execution()
{ {
var target = new MenuItem(); var target = new MenuItem();
object lastParamenter = "A"; object? lastParamenter = "A";
var generator = new Random(); var generator = new Random();
var onlyOnce = false; var onlyOnce = false;
var command = new TestCommand(parameter => var command = new TestCommand(parameter =>
@ -851,16 +851,16 @@ namespace Avalonia.Controls.UnitTests
screenImpl.Setup(X => X.AllScreens).Returns(new[] { new Screen(1, screen, screen, true) }); screenImpl.Setup(X => X.AllScreens).Returns(new[] { new Screen(1, screen, screen, true) });
var windowImpl = MockWindowingPlatform.CreateWindowMock(); var windowImpl = MockWindowingPlatform.CreateWindowMock();
popupImpl = MockWindowingPlatform.CreatePopupMock(windowImpl.Object); _popupImpl = MockWindowingPlatform.CreatePopupMock(windowImpl.Object);
popupImpl.SetupGet(x => x.RenderScaling).Returns(1); _popupImpl.SetupGet(x => x.RenderScaling).Returns(1);
windowImpl.Setup(x => x.CreatePopup()).Returns(popupImpl.Object); windowImpl.Setup(x => x.CreatePopup()).Returns(_popupImpl.Object);
windowImpl.Setup(x => x.TryGetFeature(It.Is<Type>(t => t == typeof(IScreenImpl)))).Returns(screenImpl.Object); windowImpl.Setup(x => x.TryGetFeature(It.Is<Type>(t => t == typeof(IScreenImpl)))).Returns(screenImpl.Object);
var services = TestServices.StyledWindow.With( var services = TestServices.StyledWindow.With(
inputManager: new InputManager(), inputManager: new InputManager(),
windowImpl: windowImpl.Object, windowImpl: windowImpl.Object,
windowingPlatform: new MockWindowingPlatform(() => windowImpl.Object, x => popupImpl.Object)); windowingPlatform: new MockWindowingPlatform(() => windowImpl.Object, x => _popupImpl.Object));
return UnitTestApplication.Start(services); return UnitTestApplication.Start(services);
} }
@ -868,7 +868,7 @@ namespace Avalonia.Controls.UnitTests
private record MenuViewModel(string Header) private record MenuViewModel(string Header)
{ {
public IList<MenuViewModel> Children { get; set; } public IList<MenuViewModel> Children { get; set; } = [];
} }
} }
} }

3
tests/Avalonia.Controls.UnitTests/NameScopeTests.cs

@ -56,7 +56,8 @@ namespace Avalonia.Controls.UnitTests
that the object graph is completely ready to use after it's built that the object graph is completely ready to use after it's built
rather than have pending continuations queued by SynchronizationContext. rather than have pending continuations queued by SynchronizationContext.
*/ */
object _found = null; private object? _found;
async void FindAsync(INameScope scope, string name) async void FindAsync(INameScope scope, string name)
{ {
_found = await scope.FindAsync(name); _found = await scope.FindAsync(name);

21
tests/Avalonia.Controls.UnitTests/NumericUpDownTests.cs

@ -5,7 +5,6 @@ using System.Linq;
using System.Reactive.Subjects; using System.Reactive.Subjects;
using Avalonia.Controls.Templates; using Avalonia.Controls.Templates;
using Avalonia.Data; using Avalonia.Data;
using Avalonia.Interactivity;
using Avalonia.Threading; using Avalonia.Threading;
using Avalonia.UnitTests; using Avalonia.UnitTests;
using Xunit; using Xunit;
@ -27,7 +26,7 @@ namespace Avalonia.Controls.UnitTests
Dispatcher.UIThread.RunJobs(); Dispatcher.UIThread.RunJobs();
Assert.True(DataValidationErrors.GetHasErrors(control)); Assert.True(DataValidationErrors.GetHasErrors(control));
Assert.True(DataValidationErrors.GetErrors(control).SequenceEqual(new[] { exception })); Assert.Equal([exception], DataValidationErrors.GetErrors(control));
}); });
} }
@ -42,7 +41,7 @@ namespace Avalonia.Controls.UnitTests
Dispatcher.UIThread.RunJobs(); Dispatcher.UIThread.RunJobs();
Assert.True(DataValidationErrors.GetHasErrors(control)); Assert.True(DataValidationErrors.GetHasErrors(control));
Assert.True(DataValidationErrors.GetErrors(control).SequenceEqual(new[] { exception })); Assert.Equal([exception], DataValidationErrors.GetErrors(control));
}); });
} }
@ -101,19 +100,19 @@ namespace Avalonia.Controls.UnitTests
}); });
} }
public static IEnumerable<object[]> Increment_Decrement_TestData() public static IEnumerable<object?[]> Increment_Decrement_TestData()
{ {
// if min and max are not defined and value was null, 0 should be ne new value after spin // if min and max are not defined and value was null, 0 should be ne new value after spin
yield return new object[] { decimal.MinValue, decimal.MaxValue, null, SpinDirection.Decrease, 0m }; yield return [decimal.MinValue, decimal.MaxValue, null, SpinDirection.Decrease, 0m];
yield return new object[] { decimal.MinValue, decimal.MaxValue, null, SpinDirection.Increase, 0m }; yield return [decimal.MinValue, decimal.MaxValue, null, SpinDirection.Increase, 0m];
// if no value was defined, but Min or Max are defined, use these as the new value // if no value was defined, but Min or Max are defined, use these as the new value
yield return new object[] { -400m, -200m, null, SpinDirection.Decrease, -200m }; yield return [-400m, -200m, null, SpinDirection.Decrease, -200m];
yield return new object[] { 200m, 400m, null, SpinDirection.Increase, 200m }; yield return [200m, 400m, null, SpinDirection.Increase, 200m];
// Value should be clamped to Min / Max after spinning // Value should be clamped to Min / Max after spinning
yield return new object[] { 200m, 400m, 5m, SpinDirection.Increase, 200m }; yield return [200m, 400m, 5m, SpinDirection.Increase, 200m];
yield return new object[] { 200m, 400m, 200m, SpinDirection.Decrease, 200m }; yield return [200m, 400m, 200m, SpinDirection.Decrease, 200m];
} }
private void RunTest(Action<NumericUpDown, TextBox> test) private void RunTest(Action<NumericUpDown, TextBox> test)
@ -125,7 +124,7 @@ namespace Avalonia.Controls.UnitTests
var window = new Window { Content = control }; var window = new Window { Content = control };
window.ApplyStyling(); window.ApplyStyling();
window.ApplyTemplate(); window.ApplyTemplate();
window.Presenter.ApplyTemplate(); window.Presenter!.ApplyTemplate();
Dispatcher.UIThread.RunJobs(); Dispatcher.UIThread.RunJobs();
test.Invoke(control, textBox); test.Invoke(control, textBox);
} }

17
tests/Avalonia.Controls.UnitTests/Platform/DefaultMenuInteractionHandlerTests.cs

@ -2,10 +2,8 @@
using Avalonia.Controls.Platform; using Avalonia.Controls.Platform;
using Avalonia.Controls.Primitives; using Avalonia.Controls.Primitives;
using Avalonia.Input; using Avalonia.Input;
using Avalonia.Input.GestureRecognizers;
using Avalonia.Interactivity; using Avalonia.Interactivity;
using Avalonia.UnitTests; using Avalonia.UnitTests;
using Avalonia.VisualTree;
using Moq; using Moq;
using Xunit; using Xunit;
@ -575,7 +573,7 @@ namespace Avalonia.Controls.UnitTests.Platform
bool isTopLevel = false, bool isTopLevel = false,
bool hasSubMenu = false, bool hasSubMenu = false,
bool isSubMenuOpen = false, bool isSubMenuOpen = false,
IMenuElement parent = null) IMenuElement? parent = null)
{ {
var mock = new Mock<Control>(); var mock = new Mock<Control>();
var item = mock.As<IMenuItem>(); var item = mock.As<IMenuItem>();
@ -589,17 +587,18 @@ namespace Avalonia.Controls.UnitTests.Platform
private class TestTimer private class TestTimer
{ {
private Action _action; private Action? _action;
public bool ActionIsQueued => _action != null; public bool ActionIsQueued => _action != null;
public void Pulse() public void Pulse()
{ {
Assert.NotNull(_action);
_action(); _action();
_action = null; _action = null;
} }
public void RunOnce(Action action, TimeSpan timeSpan) public void RunOnce(Action? action, TimeSpan timeSpan)
{ {
if (_action != null) if (_action != null)
{ {
@ -614,14 +613,14 @@ namespace Avalonia.Controls.UnitTests.Platform
{ {
public int Id { get; } = Pointer.GetNextFreeId(); public int Id { get; } = Pointer.GetNextFreeId();
public void Capture(IInputElement control) public void Capture(IInputElement? control)
{ {
Captured = control; Captured = control;
} }
public IInputElement Captured { get; set; } public IInputElement? Captured { get; set; }
public PointerType Type { get; } public PointerType Type => PointerType.Mouse;
public bool IsPrimary { get; } = true; public bool IsPrimary => true;
} }
} }
} }

16
tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_InTemplate.cs

@ -85,6 +85,7 @@ namespace Avalonia.Controls.UnitTests.Presenters
target.Content = "Foo"; target.Content = "Foo";
var child = target.Child; var child = target.Child;
Assert.NotNull(child);
Assert.Equal(parent, child.GetLogicalParent()); Assert.Equal(parent, child.GetLogicalParent());
Assert.Equal(new[] { child }, parent.GetLogicalChildren()); Assert.Equal(new[] { child }, parent.GetLogicalChildren());
} }
@ -97,6 +98,7 @@ namespace Avalonia.Controls.UnitTests.Presenters
target.Content = "Foo"; target.Content = "Foo";
var child = target.Child; var child = target.Child;
Assert.NotNull(child);
Assert.Equal(target, child.GetVisualParent()); Assert.Equal(target, child.GetVisualParent());
Assert.Equal(new[] { child }, target.GetVisualChildren()); Assert.Equal(new[] { child }, target.GetVisualChildren());
} }
@ -289,7 +291,7 @@ namespace Avalonia.Controls.UnitTests.Presenters
var canvas = new Canvas(); var canvas = new Canvas();
var (target, host) = CreateTarget(); var (target, host) = CreateTarget();
var viewModel = new TestViewModel { Content = "foo" }; var viewModel = new TestViewModel { Content = "foo" };
var dataContexts = new List<object>(); var dataContexts = new List<object?>();
target.Bind(ContentPresenter.ContentProperty, (IBinding)new TemplateBinding(ContentControl.ContentProperty)); target.Bind(ContentPresenter.ContentProperty, (IBinding)new TemplateBinding(ContentControl.ContentProperty));
canvas.GetObservable(ContentPresenter.DataContextProperty).Subscribe(x => dataContexts.Add(x)); canvas.GetObservable(ContentPresenter.DataContextProperty).Subscribe(x => dataContexts.Add(x));
@ -302,7 +304,7 @@ namespace Avalonia.Controls.UnitTests.Presenters
viewModel.Content = 42; viewModel.Content = 42;
Assert.Equal(new object[] Assert.Equal(new object?[]
{ {
null, null,
"foo", "foo",
@ -391,19 +393,19 @@ namespace Avalonia.Controls.UnitTests.Presenters
templatedParent.ApplyTemplate(); templatedParent.ApplyTemplate();
return (templatedParent.Presenter, templatedParent); return (templatedParent.Presenter!, templatedParent);
} }
private class TestContentControl : ContentControl, IContentPresenterHost private class TestContentControl : ContentControl, IContentPresenterHost
{ {
public Control Child { get; set; } public Control? Child { get; set; }
} }
private class TestViewModel : INotifyPropertyChanged private class TestViewModel : INotifyPropertyChanged
{ {
private object _content; private object? _content;
public object Content public object? Content
{ {
get => _content; get => _content;
set set
@ -416,7 +418,7 @@ namespace Avalonia.Controls.UnitTests.Presenters
} }
} }
public event PropertyChangedEventHandler PropertyChanged; public event PropertyChangedEventHandler? PropertyChanged;
} }
} }
} }

7
tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Standalone.cs

@ -109,7 +109,8 @@ namespace Avalonia.Controls.UnitTests.Presenters
(contentControl as ISetLogicalParent).SetParent(parentMock.Object); (contentControl as ISetLogicalParent).SetParent(parentMock.Object);
contentControl.ApplyTemplate(); contentControl.ApplyTemplate();
var target = contentControl.Presenter as ContentPresenter; var target = contentControl.Presenter;
Assert.NotNull(target);
contentControl.Content = "foo"; contentControl.Content = "foo";
@ -199,8 +200,8 @@ namespace Avalonia.Controls.UnitTests.Presenters
logicalChildren = target.GetLogicalChildren(); logicalChildren = target.GetLogicalChildren();
Assert.Single(logicalChildren); var logicalChild = Assert.Single(logicalChildren);
Assert.NotEqual(foo, logicalChildren.First()); Assert.NotEqual(foo, logicalChild);
} }
[Fact] [Fact]

6
tests/Avalonia.Controls.UnitTests/Presenters/ScrollContentPresenterTests.cs

@ -446,7 +446,7 @@ namespace Avalonia.Controls.UnitTests.Presenters
target.Arrange(new Rect(0, 0, 100, 100)); target.Arrange(new Rect(0, 0, 100, 100));
// Border20 is at position 0,600 with bottom at Y=620 // Border20 is at position 0,600 with bottom at Y=620
var border20 = target.FindControl<Border>("Border20"); var border20 = target.GetControl<Border>("Border20");
target.BringDescendantIntoView(border20, new Rect(border20.Bounds.Size)); target.BringDescendantIntoView(border20, new Rect(border20.Bounds.Size));
// With viewport Height of 100, border becomes fully visible when alligned from the bottom at Offset Y=520, i.e. 620-100 // With viewport Height of 100, border becomes fully visible when alligned from the bottom at Offset Y=520, i.e. 620-100
@ -458,7 +458,7 @@ namespace Avalonia.Controls.UnitTests.Presenters
target.Arrange(new Rect(0, 0, 100, 100)); target.Arrange(new Rect(0, 0, 100, 100));
// Border20 is at position 0,800 with bottom at Y=820 // Border20 is at position 0,800 with bottom at Y=820
var border40 = target.FindControl<Border>("Border40"); var border40 = target.GetControl<Border>("Border40");
target.BringDescendantIntoView(border40, new Rect(border40.Bounds.Size)); target.BringDescendantIntoView(border40, new Rect(border40.Bounds.Size));
// With viewport Height of 100, border becomes fully visible when alligned from the bottom at Offset Y=720, i.e. 820-100 // With viewport Height of 100, border becomes fully visible when alligned from the bottom at Offset Y=720, i.e. 820-100
@ -502,7 +502,7 @@ namespace Avalonia.Controls.UnitTests.Presenters
target.UpdateChild(); target.UpdateChild();
target.Measure(Size.Infinity); target.Measure(Size.Infinity);
target.Arrange(new Rect(0, 0, 100, 100)); target.Arrange(new Rect(0, 0, 100, 100));
var border3 = target.FindControl<Border>("Border3"); var border3 = target.GetControl<Border>("Border3");
target.BringDescendantIntoView(border3, new Rect(border3.Bounds.Size)); target.BringDescendantIntoView(border3, new Rect(border3.Bounds.Size));
// Border3 is still in view, offset hasn't changed // Border3 is still in view, offset hasn't changed

6
tests/Avalonia.Controls.UnitTests/Presenters/ScrollContentPresenterTests_ILogicalScrollable.cs

@ -323,7 +323,7 @@ namespace Avalonia.Controls.UnitTests
private Size _extent; private Size _extent;
private Vector _offset; private Vector _offset;
private Size _viewport; private Size _viewport;
private EventHandler _scrollInvalidated; private EventHandler? _scrollInvalidated;
public bool CanHorizontallyScroll { get; set; } public bool CanHorizontallyScroll { get; set; }
public bool CanVerticallyScroll { get; set; } public bool CanVerticallyScroll { get; set; }
@ -332,7 +332,7 @@ namespace Avalonia.Controls.UnitTests
public bool HasScrollInvalidatedSubscriber => _scrollInvalidated != null; public bool HasScrollInvalidatedSubscriber => _scrollInvalidated != null;
public event EventHandler ScrollInvalidated public event EventHandler? ScrollInvalidated
{ {
add => _scrollInvalidated += value; add => _scrollInvalidated += value;
remove => _scrollInvalidated -= value; remove => _scrollInvalidated -= value;
@ -400,7 +400,7 @@ namespace Avalonia.Controls.UnitTests
return new Size(150, 150); return new Size(150, 150);
} }
public Control GetControlInDirection(NavigationDirection direction, Control from) public Control GetControlInDirection(NavigationDirection direction, Control? from)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }

2
tests/Avalonia.Controls.UnitTests/Presenters/TextPresenter_Tests.cs

@ -72,7 +72,7 @@ namespace Avalonia.Controls.UnitTests.Presenters
Assert.Equal(1, presenter.TextLayout.TextLines.Count); Assert.Equal(1, presenter.TextLayout.TextLines.Count);
Assert.Equal(1, presenter.TextLayout.TextLines[0].TextRuns.Count); Assert.Equal(1, presenter.TextLayout.TextLines[0].TextRuns.Count);
Assert.NotNull(presenter.TextLayout.TextLines[0].TextRuns[0].Properties); Assert.NotNull(presenter.TextLayout.TextLines[0].TextRuns[0].Properties);
Assert.Equal(fontStretch, presenter.TextLayout.TextLines[0].TextRuns[0].Properties.Typeface.Stretch); Assert.Equal(fontStretch, presenter.TextLayout.TextLines[0].TextRuns[0].Properties!.Typeface.Stretch);
} }
} }
} }

47
tests/Avalonia.Controls.UnitTests/Primitives/PopupRootTests.cs

@ -35,7 +35,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
{ {
var target = CreateTarget(new Window()); var target = CreateTarget(new Window());
Assert.True(((ILogical)target.Presenter).IsAttachedToLogicalTree); Assert.True(((ILogical)target.Presenter!).IsAttachedToLogicalTree);
} }
} }
@ -53,11 +53,11 @@ namespace Avalonia.Controls.UnitTests.Primitives
window.ApplyStyling(); window.ApplyStyling();
window.ApplyTemplate(); window.ApplyTemplate();
window.Presenter.ApplyTemplate(); window.Presenter!.ApplyTemplate();
target.ApplyTemplate(); target.ApplyTemplate();
target.Popup.Open(); target.Popup!.Open();
Assert.Equal(target.Popup, ((IStyleHost)target.Popup.Host).StylingParent); Assert.Equal(target.Popup, ((IStyleHost)target.Popup.Host!).StylingParent);
} }
} }
@ -74,10 +74,11 @@ namespace Avalonia.Controls.UnitTests.Primitives
window.ApplyTemplate(); window.ApplyTemplate();
target.Open(); target.Open();
Assert.Single(((Visual)target.Host).GetVisualChildren());
var templatedChild = ((Visual)target.Host).GetVisualChildren().Single(); var host = Assert.IsAssignableFrom<Visual>(target.Host);
Assert.Single(host.GetVisualChildren());
var templatedChild = host.GetVisualChildren().Single();
Assert.IsType<LayoutTransformControl>(templatedChild); Assert.IsType<LayoutTransformControl>(templatedChild);
@ -93,8 +94,8 @@ namespace Avalonia.Controls.UnitTests.Primitives
Assert.IsType<ContentPresenter>(contentPresenter); Assert.IsType<ContentPresenter>(contentPresenter);
Assert.Equal((PopupRoot)target.Host, ((Control)templatedChild).TemplatedParent); Assert.Equal((PopupRoot)host, ((Control)templatedChild).TemplatedParent);
Assert.Equal((PopupRoot)target.Host, ((Control)contentPresenter).TemplatedParent); Assert.Equal((PopupRoot)host, ((Control)contentPresenter).TemplatedParent);
} }
} }
@ -107,7 +108,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
target.Open(); target.Open();
Assert.Null(((Visual)target.Host).GetVisualParent()); Assert.Null(((Visual)target.Host!).GetVisualParent());
} }
} }
@ -180,9 +181,9 @@ namespace Avalonia.Controls.UnitTests.Primitives
window.ApplyStyling(); window.ApplyStyling();
window.ApplyTemplate(); window.ApplyTemplate();
window.Presenter.ApplyTemplate(); window.Presenter!.ApplyTemplate();
target.ApplyTemplate(); target.ApplyTemplate();
target.Popup.Open(); target.Popup!.Open();
target.PopupContent = null; target.PopupContent = null;
} }
} }
@ -194,7 +195,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
{ {
var child = new ChildControl(); var child = new ChildControl();
var window = new Window(); var window = new Window();
var popupImpl = MockWindowingPlatform.CreatePopupMock(window.PlatformImpl); var popupImpl = MockWindowingPlatform.CreatePopupMock(window.PlatformImpl!);
popupImpl.Setup(x => x.MaxAutoSizeHint).Returns(new Size(1200, 1000)); popupImpl.Setup(x => x.MaxAutoSizeHint).Returns(new Size(1200, 1000));
var target = CreateTarget(window, popupImpl.Object); var target = CreateTarget(window, popupImpl.Object);
@ -251,7 +252,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
using (UnitTestApplication.Start(TestServices.StyledWindow)) using (UnitTestApplication.Start(TestServices.StyledWindow))
{ {
var window = new Window(); var window = new Window();
var popupImpl = MockWindowingPlatform.CreatePopupMock(window.PlatformImpl); var popupImpl = MockWindowingPlatform.CreatePopupMock(window.PlatformImpl!);
var child = new Canvas var child = new Canvas
{ {
@ -280,7 +281,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
using (UnitTestApplication.Start(TestServices.StyledWindow)) using (UnitTestApplication.Start(TestServices.StyledWindow))
{ {
var window = new Window(); var window = new Window();
var popupImpl = MockWindowingPlatform.CreatePopupMock(window.PlatformImpl); var popupImpl = MockWindowingPlatform.CreatePopupMock(window.PlatformImpl!);
var target = CreateTarget(window, popupImpl.Object); var target = CreateTarget(window, popupImpl.Object);
target.MinWidth = 400; target.MinWidth = 400;
@ -296,7 +297,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
Assert.Equal(new Rect(0, 0, 400, 800), target.Bounds); Assert.Equal(new Rect(0, 0, 400, 800), target.Bounds);
Assert.Equal(new Size(400, 800), target.ClientSize); Assert.Equal(new Size(400, 800), target.ClientSize);
Assert.Equal(new Size(400, 800), target.PlatformImpl.ClientSize); Assert.Equal(new Size(400, 800), target.PlatformImpl!.ClientSize);
} }
} }
@ -307,7 +308,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
using (UnitTestApplication.Start(TestServices.StyledWindow)) using (UnitTestApplication.Start(TestServices.StyledWindow))
{ {
var window = new Window(); var window = new Window();
var popupImpl = MockWindowingPlatform.CreatePopupMock(window.PlatformImpl); var popupImpl = MockWindowingPlatform.CreatePopupMock(window.PlatformImpl!);
var positioner = new Mock<IPopupPositioner>(); var positioner = new Mock<IPopupPositioner>();
popupImpl.Setup(x => x.PopupPositioner).Returns(positioner.Object); popupImpl.Setup(x => x.PopupPositioner).Returns(positioner.Object);
@ -330,9 +331,9 @@ namespace Avalonia.Controls.UnitTests.Primitives
} }
} }
private static PopupRoot CreateTarget(TopLevel popupParent, IPopupImpl impl = null) private static PopupRoot CreateTarget(TopLevel popupParent, IPopupImpl? impl = null)
{ {
impl ??= popupParent.PlatformImpl.CreatePopup(); impl ??= popupParent.PlatformImpl!.CreatePopup()!;
var result = new PopupRoot(popupParent, impl) var result = new PopupRoot(popupParent, impl)
{ {
@ -351,8 +352,8 @@ namespace Avalonia.Controls.UnitTests.Primitives
private class TemplatedControlWithPopup : Avalonia.Controls.Primitives.TemplatedControl private class TemplatedControlWithPopup : Avalonia.Controls.Primitives.TemplatedControl
{ {
public static readonly StyledProperty<Control> PopupContentProperty = public static readonly StyledProperty<Control?> PopupContentProperty =
AvaloniaProperty.Register<TemplatedControlWithPopup, Control>(nameof(PopupContent)); AvaloniaProperty.Register<TemplatedControlWithPopup, Control?>(nameof(PopupContent));
public TemplatedControlWithPopup() public TemplatedControlWithPopup()
{ {
@ -364,9 +365,9 @@ namespace Avalonia.Controls.UnitTests.Primitives
}); });
} }
public Popup Popup { get; private set; } public Popup? Popup { get; private set; }
public Control PopupContent public Control? PopupContent
{ {
get => GetValue(PopupContentProperty); get => GetValue(PopupContentProperty);
set => SetValue(PopupContentProperty, value); set => SetValue(PopupContentProperty, value);

36
tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs

@ -185,7 +185,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
{ {
var target = new Popup(); var target = new Popup();
Assert.Null(((Visual)target.Host)); Assert.Null((Visual)target.Host!);
} }
} }
@ -198,7 +198,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
target.Open(); target.Open();
Assert.Equal(target, ((Visual)target.Host).Parent); Assert.Equal(target, ((Visual)target.Host!).Parent);
Assert.Equal(target, ((Visual)target.Host).GetLogicalParent()); Assert.Equal(target, ((Visual)target.Host).GetLogicalParent());
} }
} }
@ -213,7 +213,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
target.Open(); target.Open();
var popupRoot = (ILogical)((Visual)target.Host); var popupRoot = (ILogical)(Visual)target.Host!;
Assert.True(popupRoot.IsAttachedToLogicalTree); Assert.True(popupRoot.IsAttachedToLogicalTree);
root.Content = null; root.Content = null;
@ -332,7 +332,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
var popup = (Popup)target.GetTemplateChildren().First(x => x.Name == "popup"); var popup = (Popup)target.GetTemplateChildren().First(x => x.Name == "popup");
popup.Open(); popup.Open();
var popupRoot = (Control)popup.Host; var popupRoot = (Control)popup.Host!;
popupRoot.Measure(Size.Infinity); popupRoot.Measure(Size.Infinity);
popupRoot.Arrange(new Rect(popupRoot.DesiredSize)); popupRoot.Arrange(new Rect(popupRoot.DesiredSize));
@ -375,7 +375,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
if (UsePopupHost) if (UsePopupHost)
{ {
Assert.Equal( Assert.Equal(
new object[] new object?[]
{ {
popupRoot, popupRoot,
popupRoot, popupRoot,
@ -388,7 +388,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
else else
{ {
Assert.Equal( Assert.Equal(
new object[] new object?[]
{ {
popupRoot, popupRoot,
popupRoot, popupRoot,
@ -423,7 +423,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
var popup = (Popup)target.GetTemplateChildren().First(x => x.Name == "popup"); var popup = (Popup)target.GetTemplateChildren().First(x => x.Name == "popup");
popup.Open(); popup.Open();
var popupRoot = (Control)popup.Host; var popupRoot = (Control)popup.Host!;
popupRoot.Measure(Size.Infinity); popupRoot.Measure(Size.Infinity);
popupRoot.Arrange(new Rect(popupRoot.DesiredSize)); popupRoot.Arrange(new Rect(popupRoot.DesiredSize));
@ -468,7 +468,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
if (UsePopupHost) if (UsePopupHost)
{ {
Assert.Equal( Assert.Equal(
new object[] new object?[]
{ {
popupRoot, popupRoot,
popupRoot, popupRoot,
@ -482,7 +482,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
else else
{ {
Assert.Equal( Assert.Equal(
new object[] new object?[]
{ {
popupRoot, popupRoot,
popupRoot, popupRoot,
@ -518,7 +518,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
var popup = (Popup)target.GetTemplateChildren().First(x => x.Name == "popup"); var popup = (Popup)target.GetTemplateChildren().First(x => x.Name == "popup");
popup.Open(); popup.Open();
var popupRoot = (Control)popup.Host; var popupRoot = (Control)popup.Host!;
popupRoot.Measure(Size.Infinity); popupRoot.Measure(Size.Infinity);
popupRoot.Arrange(new Rect(popupRoot.DesiredSize)); popupRoot.Arrange(new Rect(popupRoot.DesiredSize));
@ -621,6 +621,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
var e = CreatePointerPressedEventArgs(window, new Point(10, 15)); var e = CreatePointerPressedEventArgs(window, new Point(10, 15));
var overlay = LightDismissOverlayLayer.GetLightDismissOverlayLayer(window); var overlay = LightDismissOverlayLayer.GetLightDismissOverlayLayer(window);
Assert.NotNull(overlay);
overlay.RaiseEvent(e); overlay.RaiseEvent(e);
Assert.Equal(1, raised); Assert.Equal(1, raised);
@ -747,6 +748,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
p.Close(); p.Close();
var focusManager = window.FocusManager; var focusManager = window.FocusManager;
Assert.NotNull(focusManager);
var focus = focusManager.GetFocusedElement(); var focus = focusManager.GetFocusedElement();
Assert.Same(window, focus); Assert.Same(window, focus);
} }
@ -787,6 +789,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
windowTB.Focus(); windowTB.Focus();
var focusManager = window.FocusManager; var focusManager = window.FocusManager;
Assert.NotNull(focusManager);
var focus = focusManager.GetFocusedElement(); var focus = focusManager.GetFocusedElement();
Assert.True(focus == windowTB); Assert.True(focus == windowTB);
@ -1167,7 +1170,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
var ev = new PointerPressedEventArgs( var ev = new PointerPressedEventArgs(
popupContent, popupContent,
pointer, pointer,
popupContent.VisualRoot as PopupRoot, (PopupRoot)popupContent.VisualRoot!,
new Point(50 , 50), new Point(50 , 50),
0, 0,
new PointerPointProperties(RawInputModifiers.None, PointerUpdateKind.LeftButtonPressed), new PointerPointProperties(RawInputModifiers.None, PointerUpdateKind.LeftButtonPressed),
@ -1231,6 +1234,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
var root = PreparedWindow(windowContent); var root = PreparedWindow(windowContent);
var adornerLayer = AdornerLayer.GetAdornerLayer(adorned); var adornerLayer = AdornerLayer.GetAdornerLayer(adorned);
Assert.NotNull(adornerLayer);
adornerLayer.Children.Add(adorner); adornerLayer.Children.Add(adorner);
AdornerLayer.SetAdornedElement(adorner, adorned); AdornerLayer.SetAdornedElement(adorner, adorned);
@ -1286,9 +1290,9 @@ namespace Avalonia.Controls.UnitTests.Primitives
} }
} }
private static PopupRoot CreateRoot(TopLevel popupParent, IPopupImpl impl = null) private static PopupRoot CreateRoot(TopLevel popupParent, IPopupImpl? impl = null)
{ {
impl ??= popupParent.PlatformImpl.CreatePopup(); impl ??= popupParent.PlatformImpl!.CreatePopup()!;
var result = new PopupRoot(popupParent, impl) var result = new PopupRoot(popupParent, impl)
{ {
@ -1382,7 +1386,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
}, null); }, null);
} }
private static Window PreparedWindow(object content = null) private static Window PreparedWindow(object? content = null)
{ {
var w = new Window { Content = content }; var w = new Window { Content = content };
w.Show(); w.Show();
@ -1424,9 +1428,9 @@ namespace Avalonia.Controls.UnitTests.Primitives
private class TestControl : Decorator private class TestControl : Decorator
{ {
public event EventHandler DataContextBeginUpdate; public event EventHandler? DataContextBeginUpdate;
public new AvaloniaObject InheritanceParent => base.InheritanceParent; public new AvaloniaObject? InheritanceParent => base.InheritanceParent;
protected override void OnDataContextBeginUpdate() protected override void OnDataContextBeginUpdate()
{ {

6
tests/Avalonia.Controls.UnitTests/Primitives/RangeBaseTests.cs

@ -116,7 +116,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
Value = 50 Value = 50
}; };
Track track = null; Track? track = null;
var target = new TestRange() var target = new TestRange()
{ {
@ -157,7 +157,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
target.Bind(TestRange.ValueProperty, new Binding("Value") { Mode = BindingMode.TwoWay }); target.Bind(TestRange.ValueProperty, new Binding("Value") { Mode = BindingMode.TwoWay });
target.ApplyTemplate(); target.ApplyTemplate();
track.Measure(new Size(100, 0)); track!.Measure(new Size(100, 0));
track.Arrange(new Rect(0, 0, 100, 0)); track.Arrange(new Rect(0, 0, 100, 0));
Assert.Equal(1, viewModel.SetterInvokedCount); Assert.Equal(1, viewModel.SetterInvokedCount);
@ -218,7 +218,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
private double _value; private double _value;
public event PropertyChangedEventHandler PropertyChanged; public event PropertyChangedEventHandler? PropertyChanged;
public double Value public double Value
{ {

4
tests/Avalonia.Controls.UnitTests/Primitives/ScrollBarTests.cs

@ -81,7 +81,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
Vector = new Vector(0, 0) Vector = new Vector(0, 0)
}; };
track.Thumb.RaiseEvent(ev); track.Thumb!.RaiseEvent(ev);
}); });
Assert.Equal(ScrollEventType.ThumbTrack, raisedEvent.Arguments.ScrollEventType); Assert.Equal(ScrollEventType.ThumbTrack, raisedEvent.Arguments.ScrollEventType);
@ -110,7 +110,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
Vector = new Vector(0, 0) Vector = new Vector(0, 0)
}; };
track.Thumb.RaiseEvent(ev); track.Thumb!.RaiseEvent(ev);
}); });
Assert.Equal(ScrollEventType.EndScroll, raisedEvent.Arguments.ScrollEventType); Assert.Equal(ScrollEventType.EndScroll, raisedEvent.Arguments.ScrollEventType);

66
tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs

@ -266,7 +266,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
foreach (var v in selected) foreach (var v in selected)
{ {
listBox.SelectedItems.Add(v); listBox.SelectedItems!.Add(v);
} }
listBox.BeginInit(); listBox.BeginInit();
@ -289,7 +289,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
foreach (var v in new[] { "bar", "baz" }) foreach (var v in new[] { "bar", "baz" })
{ {
listBox.SelectedItems.Add(v); listBox.SelectedItems!.Add(v);
} }
listBox.BeginInit(); listBox.BeginInit();
@ -629,7 +629,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
Assert.Equal(items[1], target.SelectedItem); Assert.Equal(items[1], target.SelectedItem);
Assert.Equal(1, target.SelectedIndex); Assert.Equal(1, target.SelectedIndex);
SelectionChangedEventArgs receivedArgs = null; SelectionChangedEventArgs? receivedArgs = null;
target.SelectionChanged += (_, args) => receivedArgs = args; target.SelectionChanged += (_, args) => receivedArgs = args;
@ -669,7 +669,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
Assert.Equal(items[1], target.SelectedItem); Assert.Equal(items[1], target.SelectedItem);
Assert.Equal(1, target.SelectedIndex); Assert.Equal(1, target.SelectedIndex);
SelectionChangedEventArgs receivedArgs = null; SelectionChangedEventArgs? receivedArgs = null;
target.SelectionChanged += (_, args) => receivedArgs = args; target.SelectionChanged += (_, args) => receivedArgs = args;
@ -704,7 +704,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
Assert.Equal(items[0], target.SelectedItem); Assert.Equal(items[0], target.SelectedItem);
Assert.Equal(0, target.SelectedIndex); Assert.Equal(0, target.SelectedIndex);
SelectionChangedEventArgs receivedArgs = null; SelectionChangedEventArgs? receivedArgs = null;
target.SelectionChanged += (_, args) => receivedArgs = args; target.SelectionChanged += (_, args) => receivedArgs = args;
@ -741,7 +741,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
Assert.Equal(items[1], target.SelectedItem); Assert.Equal(items[1], target.SelectedItem);
Assert.Equal(1, target.SelectedIndex); Assert.Equal(1, target.SelectedIndex);
SelectionChangedEventArgs receivedArgs = null; SelectionChangedEventArgs? receivedArgs = null;
target.SelectionChanged += (_, args) => receivedArgs = args; target.SelectionChanged += (_, args) => receivedArgs = args;
@ -773,7 +773,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
Assert.Equal(items[1], target.SelectedItem); Assert.Equal(items[1], target.SelectedItem);
Assert.Equal(1, target.SelectedIndex); Assert.Equal(1, target.SelectedIndex);
SelectionChangedEventArgs receivedArgs = null; SelectionChangedEventArgs? receivedArgs = null;
target.SelectionChanged += (_, args) => receivedArgs = args; target.SelectionChanged += (_, args) => receivedArgs = args;
@ -1295,9 +1295,9 @@ namespace Avalonia.Controls.UnitTests.Primitives
}; };
root.ApplyTemplate(); root.ApplyTemplate();
root.Presenter.ApplyTemplate(); root.Presenter!.ApplyTemplate();
nested.ApplyTemplate(); nested.ApplyTemplate();
nested.Presenter.ApplyTemplate(); nested.Presenter!.ApplyTemplate();
Assert.Equal(0, root.SelectedIndex); Assert.Equal(0, root.SelectedIndex);
Assert.Equal(1, nested.SelectedIndex); Assert.Equal(1, nested.SelectedIndex);
@ -1342,7 +1342,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
var container = target.ContainerFromIndex(1)!; var container = target.ContainerFromIndex(1)!;
_helper.Down(container); _helper.Down(container);
var panel = target.Presenter.Panel; var panel = target.Presenter!.Panel;
Assert.Same(container, KeyboardNavigation.GetTabOnceActiveElement(target)); Assert.Same(container, KeyboardNavigation.GetTabOnceActiveElement(target));
} }
@ -1363,12 +1363,11 @@ namespace Avalonia.Controls.UnitTests.Primitives
AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration()); AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration());
Prepare(target); Prepare(target);
_helper.Down(target.Presenter.Panel.Children[1]); var panel = target.Presenter!.Panel!;
_helper.Down(panel.Children[1]);
items.RemoveAt(1); items.RemoveAt(1);
var panel = target.Presenter.Panel;
Assert.Null(KeyboardNavigation.GetTabOnceActiveElement((InputElement)panel)); Assert.Null(KeyboardNavigation.GetTabOnceActiveElement((InputElement)panel));
} }
} }
@ -1459,7 +1458,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
}; };
AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration()); AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration());
Prepare(target); Prepare(target);
_helper.Down((Interactive)target.Presenter.Panel.Children[3]); _helper.Down((Interactive)target.Presenter!.Panel!.Children[3]);
Assert.Equal(3, target.SelectedIndex); Assert.Equal(3, target.SelectedIndex);
} }
@ -1477,7 +1476,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
}; };
AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration()); AvaloniaLocator.CurrentMutable.Bind<PlatformHotkeyConfiguration>().ToConstant(new PlatformHotkeyConfiguration());
Prepare(target); Prepare(target);
_helper.Down((Interactive)target.Presenter.Panel.Children[3]); _helper.Down((Interactive)target.Presenter!.Panel!.Children[3]);
Assert.Equal(new[] { ":pressed", ":selected" }, target.Presenter.Panel.Children[3].Classes); Assert.Equal(new[] { ":pressed", ":selected" }, target.Presenter.Panel.Children[3].Classes);
} }
@ -1592,7 +1591,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
Prepare(target); Prepare(target);
other.ApplyTemplate(); other.ApplyTemplate();
other.Presenter.ApplyTemplate(); other.Presenter!.ApplyTemplate();
items.Add("Foo"); items.Add("Foo");
@ -1706,8 +1705,9 @@ namespace Avalonia.Controls.UnitTests.Primitives
root.Measure(new Size(100, 100)); root.Measure(new Size(100, 100));
root.Arrange(new Rect(0, 0, 100, 100)); root.Arrange(new Rect(0, 0, 100, 100));
Assert.True(target.Presenter.Panel.Children.Count > 0); var panel = target.Presenter!.Panel!;
Assert.True(target.Presenter.Panel.Children.Count < 100); Assert.True(panel.Children.Count > 0);
Assert.True(panel.Children.Count < 100);
target.SelectedItem = "Item99"; target.SelectedItem = "Item99";
@ -1716,7 +1716,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
Layout(target); Layout(target);
Assert.Equal(0, target.SelectedIndex); Assert.Equal(0, target.SelectedIndex);
Assert.Equal(1, target.Presenter.Panel.Children.Where(x => x.IsVisible).Count()); Assert.Equal(1, panel.Children.Count(x => x.IsVisible));
} }
} }
@ -1743,7 +1743,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
Prepare(target); Prepare(target);
var root = (TestRoot)target.Parent; var root = (TestRoot)target.Parent!;
target.AddHandler(Control.RequestBringIntoViewEvent, (s, e) => raised = true); target.AddHandler(Control.RequestBringIntoViewEvent, (s, e) => raised = true);
@ -1777,7 +1777,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
Prepare(target); Prepare(target);
var root = (TestRoot)target.Parent; var root = (TestRoot)target.Parent!;
target.AddHandler(Control.RequestBringIntoViewEvent, (s, e) => raised = true); target.AddHandler(Control.RequestBringIntoViewEvent, (s, e) => raised = true);
@ -2555,7 +2555,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
private static void Layout(Control c) private static void Layout(Control c)
{ {
((ILayoutRoot)c.GetVisualRoot()).LayoutManager.ExecuteLayoutPass(); ((ILayoutRoot)c.GetVisualRoot()!).LayoutManager.ExecuteLayoutPass();
} }
private static FuncControlTemplate Template() private static FuncControlTemplate Template()
@ -2573,7 +2573,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
private class Item : Control, ISelectable private class Item : Control, ISelectable
{ {
public string Value { get; set; } public string? Value { get; set; }
public bool IsSelected public bool IsSelected
{ {
@ -2584,9 +2584,9 @@ namespace Avalonia.Controls.UnitTests.Primitives
private class MasterViewModel : NotifyingBase private class MasterViewModel : NotifyingBase
{ {
private ChildViewModel _child; private ChildViewModel? _child;
public ChildViewModel Child public ChildViewModel? Child
{ {
get { return _child; } get { return _child; }
set set
@ -2599,15 +2599,15 @@ namespace Avalonia.Controls.UnitTests.Primitives
private class ChildViewModel : NotifyingBase private class ChildViewModel : NotifyingBase
{ {
public IList<Item> Items { get; set; } public IList<Item> Items { get; set; } = [];
public Item SelectedItem { get; set; } public Item? SelectedItem { get; set; }
public int SelectedIndex { get; set; } public int SelectedIndex { get; set; }
} }
private class SelectionViewModel : NotifyingBase private class SelectionViewModel : NotifyingBase
{ {
private int _selectedIndex = -1; private int _selectedIndex = -1;
private object _selectedItem; private object? _selectedItem;
public SelectionViewModel() public SelectionViewModel()
{ {
@ -2625,7 +2625,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
} }
} }
public object SelectedItem public object? SelectedItem
{ {
get => _selectedItem; get => _selectedItem;
set set
@ -2647,7 +2647,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
private class TestSelector : SelectingItemsControl private class TestSelector : SelectingItemsControl
{ {
public new static readonly DirectProperty<SelectingItemsControl, IList> SelectedItemsProperty = public new static readonly DirectProperty<SelectingItemsControl, IList?> SelectedItemsProperty =
SelectingItemsControl.SelectedItemsProperty; SelectingItemsControl.SelectedItemsProperty;
public TestSelector() public TestSelector()
@ -2666,7 +2666,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
set => base.Selection = value; set => base.Selection = value;
} }
public new IList SelectedItems public new IList? SelectedItems
{ {
get => base.SelectedItems; get => base.SelectedItems;
set => base.SelectedItems = value; set => base.SelectedItems = value;
@ -2700,11 +2700,9 @@ namespace Avalonia.Controls.UnitTests.Primitives
new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
} }
public event NotifyCollectionChangedEventHandler CollectionChanged; public event NotifyCollectionChangedEventHandler? CollectionChanged;
} }
#nullable enable
private sealed class FullSelectionViewModel : NotifyingBase private sealed class FullSelectionViewModel : NotifyingBase
{ {
private ItemModel? _selectedItem; private ItemModel? _selectedItem;

4
tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests_AutoSelect.cs

@ -111,7 +111,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
}; };
target.ApplyTemplate(); target.ApplyTemplate();
target.Presenter.ApplyTemplate(); target.Presenter!.ApplyTemplate();
items.RemoveAt(0); items.RemoveAt(0);
Assert.Equal(0, target.SelectedIndex); Assert.Equal(0, target.SelectedIndex);
@ -138,7 +138,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
private class ResetOnAdd : List<string>, INotifyCollectionChanged private class ResetOnAdd : List<string>, INotifyCollectionChanged
{ {
public event NotifyCollectionChangedEventHandler CollectionChanged; public event NotifyCollectionChangedEventHandler? CollectionChanged;
public new void Add(string item) public new void Add(string item)
{ {

8
tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests_SelectedValue.cs

@ -319,7 +319,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
public void Handles_Null_SelectedItem_When_SelectedValueBinding_Assigned() public void Handles_Null_SelectedItem_When_SelectedValueBinding_Assigned()
{ {
// Issue #11220 // Issue #11220
var items = new object[] { null }; var items = new object?[] { null };
var sic = new SelectingItemsControl var sic = new SelectingItemsControl
{ {
ItemsSource = items, ItemsSource = items,
@ -366,15 +366,15 @@ namespace Avalonia.Controls.UnitTests.Primitives
internal class TestClass internal class TestClass
{ {
public TestClass(string name, string alt) public TestClass(string? name, string? alt)
{ {
Name = name; Name = name;
AltProperty = alt; AltProperty = alt;
} }
public string Name { get; set; } public string? Name { get; set; }
public string AltProperty { get; set; } public string? AltProperty { get; set; }
public static List<TestClass> GetItems() public static List<TestClass> GetItems()
{ {

2
tests/Avalonia.Controls.UnitTests/Primitives/TabStripTests.cs

@ -93,7 +93,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
Assert.Equal(0, target.SelectedIndex); Assert.Equal(0, target.SelectedIndex);
Assert.Same(target.Items[0], target.SelectedItem); Assert.Same(target.Items[0], target.SelectedItem);
Assert.Same("first", ((TabItem)target.SelectedItem).Name); Assert.Same("first", ((TabItem)target.SelectedItem!).Name);
} }
private Control CreateTabStripTemplate(TabStrip parent, INameScope scope) private Control CreateTabStripTemplate(TabStrip parent, INameScope scope)

6
tests/Avalonia.Controls.UnitTests/Primitives/TemplatedControlTests.cs

@ -242,8 +242,8 @@ namespace Avalonia.Controls.UnitTests.Primitives
var border = contentControl.GetTemplateChildren().OfType<Border>().Single(); var border = contentControl.GetTemplateChildren().OfType<Border>().Single();
var presenter = contentControl.GetTemplateChildren().OfType<ContentPresenter>().Single(); var presenter = contentControl.GetTemplateChildren().OfType<ContentPresenter>().Single();
var decorator = (Decorator)presenter.Content; var decorator = (Decorator)presenter.Content!;
var textBlock = (TextBlock)decorator.Child; var textBlock = (TextBlock)decorator.Child!;
Assert.Equal(target, contentControl.TemplatedParent); Assert.Equal(target, contentControl.TemplatedParent);
Assert.Equal(contentControl, border.TemplatedParent); Assert.Equal(contentControl, border.TemplatedParent);
@ -289,7 +289,7 @@ namespace Avalonia.Controls.UnitTests.Primitives
target.ApplyTemplate(); target.ApplyTemplate();
var decorator = (Decorator)target.GetVisualChildren().Single(); var decorator = (Decorator)target.GetVisualChildren().Single();
var border = (Border)decorator.Child; var border = (Border)decorator.Child!;
Assert.Equal(target, decorator.TemplatedParent); Assert.Equal(target, decorator.TemplatedParent);
Assert.Equal(target, border.TemplatedParent); Assert.Equal(target, border.TemplatedParent);

8
tests/Avalonia.Controls.UnitTests/ScrollViewerTests.cs

@ -28,7 +28,7 @@ namespace Avalonia.Controls.UnitTests
InitializeScrollViewer(target); InitializeScrollViewer(target);
Assert.IsType<TextBlock>(target.Presenter.Child); Assert.IsType<TextBlock>(target.Presenter!.Child);
} }
[Fact] [Fact]
@ -473,7 +473,7 @@ namespace Avalonia.Controls.UnitTests
public void MenuScrollBar_Should_Be_Visible_When_Specified_Visible() public void MenuScrollBar_Should_Be_Visible_When_Specified_Visible()
{ {
Converters.MenuScrollingVisibilityConverter converter = Converters.MenuScrollingVisibilityConverter.Instance; Converters.MenuScrollingVisibilityConverter converter = Converters.MenuScrollingVisibilityConverter.Instance;
IList<object> args = new List<object> {ScrollBarVisibility.Visible,400d,1800d,500d}; var args = new List<object?> {ScrollBarVisibility.Visible,400d,1800d,500d};
var result = converter.Convert(args, typeof(ScrollBarVisibility), "0", System.Globalization.CultureInfo.CurrentCulture); var result = converter.Convert(args, typeof(ScrollBarVisibility), "0", System.Globalization.CultureInfo.CurrentCulture);
Assert.Equal(true, result); Assert.Equal(true, result);
} }
@ -590,7 +590,7 @@ namespace Avalonia.Controls.UnitTests
[!!Track.ValueProperty] = scrollBar[!!RangeBase.ValueProperty], [!!Track.ValueProperty] = scrollBar[!!RangeBase.ValueProperty],
[!Track.ViewportSizeProperty] = scrollBar[!ScrollBar.ViewportSizeProperty], [!Track.ViewportSizeProperty] = scrollBar[!ScrollBar.ViewportSizeProperty],
[!Track.OrientationProperty] = scrollBar[!ScrollBar.OrientationProperty], [!Track.OrientationProperty] = scrollBar[!ScrollBar.OrientationProperty],
[!Track.DeferThumbDragProperty] = scrollBar.TemplatedParent[!ScrollViewer.IsDeferredScrollingEnabledProperty], [!Track.DeferThumbDragProperty] = scrollBar.TemplatedParent![!ScrollViewer.IsDeferredScrollingEnabledProperty],
Thumb = new Thumb Thumb = new Thumb
{ {
Template = new FuncControlTemplate<Thumb>(CreateThumbTemplate), Template = new FuncControlTemplate<Thumb>(CreateThumbTemplate),
@ -620,7 +620,7 @@ namespace Avalonia.Controls.UnitTests
{ {
target.ApplyTemplate(); target.ApplyTemplate();
var presenter = (ScrollContentPresenter)target.Presenter; var presenter = (ScrollContentPresenter)target.Presenter!;
presenter.AttachToScrollViewer(); presenter.AttachToScrollViewer();
presenter.UpdateChild(); presenter.UpdateChild();
} }

4
tests/Avalonia.Controls.UnitTests/SelectableTextBlockTests.cs

@ -26,12 +26,12 @@ namespace Avalonia.Controls.UnitTests
FontSize = 20 FontSize = 20
}; };
target.Inlines.Add(run); target.Inlines!.Add(run);
target.Measure(Size.Infinity); target.Measure(Size.Infinity);
target.SelectionStart = 0; target.SelectionStart = 0;
target.SelectionEnd = run.Text.Length; target.SelectionEnd = run.Text!.Length;
target.Measure(Size.Infinity); target.Measure(Size.Infinity);

14
tests/Avalonia.Controls.UnitTests/Selection/InternalSelectionModelTests.cs

@ -147,7 +147,7 @@ namespace Avalonia.Controls.UnitTests.Selection
var target = CreateTarget(nullSource: true); var target = CreateTarget(nullSource: true);
target.SelectRange(1, 2); target.SelectRange(1, 2);
Assert.Equal(new object[] { null, null }, target.WritableSelectedItems); Assert.Equal(new object?[] { null, null }, target.WritableSelectedItems);
} }
[Fact] [Fact]
@ -156,7 +156,7 @@ namespace Avalonia.Controls.UnitTests.Selection
var target = CreateTarget(nullSource: true); var target = CreateTarget(nullSource: true);
target.SelectRange(1, 2); target.SelectRange(1, 2);
Assert.Equal(new object[] { null, null }, target.WritableSelectedItems); Assert.Equal(new object?[] { null, null }, target.WritableSelectedItems);
target.Source = new[] { "foo", "bar", "baz" }; target.Source = new[] { "foo", "bar", "baz" };
Assert.Equal(new[] { "bar", "baz" }, target.WritableSelectedItems); Assert.Equal(new[] { "bar", "baz" }, target.WritableSelectedItems);
@ -171,7 +171,7 @@ namespace Avalonia.Controls.UnitTests.Selection
Assert.Equal(new[] { "bar", "baz" }, target.WritableSelectedItems); Assert.Equal(new[] { "bar", "baz" }, target.WritableSelectedItems);
target.Source = null; target.Source = null;
Assert.Equal(new object[] { null, null }, target.WritableSelectedItems); Assert.Equal(new object?[] { null, null }, target.WritableSelectedItems);
} }
[Fact] [Fact]
@ -218,7 +218,7 @@ namespace Avalonia.Controls.UnitTests.Selection
target.SelectedIndex = 1; target.SelectedIndex = 1;
var changed = new List<string>(); var changed = new List<string?>();
target.PropertyChanged += (s, e) => changed.Add(e.PropertyName); target.PropertyChanged += (s, e) => changed.Add(e.PropertyName);
@ -248,7 +248,7 @@ namespace Avalonia.Controls.UnitTests.Selection
Assert.Equal(0, target.SelectedIndex); Assert.Equal(0, target.SelectedIndex);
items.Reset(new string[] { "baz", "foo", "bar" }); items.Reset(["baz", "foo", "bar"]);
Assert.Equal("foo", target.SelectedItem); Assert.Equal("foo", target.SelectedItem);
Assert.Equal(1, target.SelectedIndex); Assert.Equal(1, target.SelectedIndex);
@ -269,7 +269,7 @@ namespace Avalonia.Controls.UnitTests.Selection
private static InternalSelectionModel CreateTarget( private static InternalSelectionModel CreateTarget(
bool singleSelect = false, bool singleSelect = false,
IList source = null, IList? source = null,
bool nullSource = false) bool nullSource = false)
{ {
source ??= !nullSource ? new[] { "foo", "bar", "baz" } : null; source ??= !nullSource ? new[] { "foo", "bar", "baz" } : null;
@ -299,7 +299,7 @@ namespace Avalonia.Controls.UnitTests.Selection
new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
} }
public event NotifyCollectionChangedEventHandler CollectionChanged; public event NotifyCollectionChangedEventHandler? CollectionChanged;
} }
} }
} }

10
tests/Avalonia.Controls.UnitTests/Shapes/PathTests.cs

@ -88,6 +88,7 @@ namespace Avalonia.Controls.UnitTests.Shapes
target.Measure(new Size(500, 500)); target.Measure(new Size(500, 500));
Assert.NotNull(target.RenderedGeometry);
Assert.Null(target.RenderedGeometry.Transform); Assert.Null(target.RenderedGeometry.Transform);
} }
@ -109,12 +110,15 @@ namespace Avalonia.Controls.UnitTests.Shapes
target.Measure(new Size(500, 500)); target.Measure(new Size(500, 500));
target.Arrange(new Rect(0, 0, 500, 500)); target.Arrange(new Rect(0, 0, 500, 500));
Assert.NotNull(target.RenderedGeometry);
if (expectedScaleX == 1 && expectedScaleY == 1) if (expectedScaleX == 1 && expectedScaleY == 1)
{ {
Assert.Null(target.RenderedGeometry.Transform); Assert.Null(target.RenderedGeometry.Transform);
} }
else else
{ {
Assert.NotNull(target.RenderedGeometry.Transform);
Assert.Equal(Matrix.CreateScale(expectedScaleX, expectedScaleY), target.RenderedGeometry.Transform.Value); Assert.Equal(Matrix.CreateScale(expectedScaleX, expectedScaleY), target.RenderedGeometry.Transform.Value);
} }
} }
@ -135,6 +139,8 @@ namespace Avalonia.Controls.UnitTests.Shapes
target.Arrange(new Rect(0, 0, 400, 400)); target.Arrange(new Rect(0, 0, 400, 400));
Assert.Equal(new Rect(0, 0, 100, 200), geometry.Rect); Assert.Equal(new Rect(0, 0, 100, 200), geometry.Rect);
Assert.NotNull(target.RenderedGeometry);
Assert.NotNull(target.RenderedGeometry.Transform);
Assert.Equal(Matrix.CreateScale(2, 2), target.RenderedGeometry.Transform.Value); Assert.Equal(Matrix.CreateScale(2, 2), target.RenderedGeometry.Transform.Value);
Assert.Equal(new Rect(0, 0, 400, 400), target.Bounds); Assert.Equal(new Rect(0, 0, 400, 400), target.Bounds);
} }
@ -153,6 +159,8 @@ namespace Avalonia.Controls.UnitTests.Shapes
target.Measure(new Size(200, 200)); target.Measure(new Size(200, 200));
target.Arrange(new Rect(0, 0, 200, 200)); target.Arrange(new Rect(0, 0, 200, 200));
Assert.NotNull(target.RenderedGeometry);
Assert.NotNull(target.RenderedGeometry.Transform);
Assert.Equal(Matrix.CreateScale(2, 2), target.RenderedGeometry.Transform.Value); Assert.Equal(Matrix.CreateScale(2, 2), target.RenderedGeometry.Transform.Value);
target.Measure(new Size(300, 300)); target.Measure(new Size(300, 300));
@ -173,6 +181,8 @@ namespace Avalonia.Controls.UnitTests.Shapes
target.Measure(new Size(200, 200)); target.Measure(new Size(200, 200));
target.Arrange(new Rect(0, 0, 200, 200)); target.Arrange(new Rect(0, 0, 200, 200));
Assert.NotNull(target.RenderedGeometry);
Assert.NotNull(target.RenderedGeometry.Transform);
Assert.Equal(Matrix.CreateScale(2, 2), target.RenderedGeometry.Transform.Value); Assert.Equal(Matrix.CreateScale(2, 2), target.RenderedGeometry.Transform.Value);
target.Arrange(new Rect(0, 0, 300, 300)); target.Arrange(new Rect(0, 0, 300, 300));

6
tests/Avalonia.Controls.UnitTests/SplitButtonTests.cs

@ -13,7 +13,7 @@ public class SplitButtonTests : ScopedTestBase
public void SplitButton_CommandParameter_Does_Not_Change_While_Execution() public void SplitButton_CommandParameter_Does_Not_Change_While_Execution()
{ {
var target = new SplitButton(); var target = new SplitButton();
object lastParamenter = "A"; object? lastParamenter = "A";
var generator = new Random(); var generator = new Random();
var command = new TestCommand(parameter => var command = new TestCommand(parameter =>
{ {
@ -56,12 +56,12 @@ public class SplitButtonTests : ScopedTestBase
} }
} }
private static KeyEventArgs CreateKeyDownEvent(Key key, Interactive source = null) private static KeyEventArgs CreateKeyDownEvent(Key key, Interactive? source = null)
{ {
return new KeyEventArgs { RoutedEvent = InputElement.KeyDownEvent, Key = key, Source = source }; return new KeyEventArgs { RoutedEvent = InputElement.KeyDownEvent, Key = key, Source = source };
} }
private static KeyEventArgs CreateKeyUpEvent(Key key, Interactive source = null) private static KeyEventArgs CreateKeyUpEvent(Key key, Interactive? source = null)
{ {
return new KeyEventArgs { RoutedEvent = InputElement.KeyUpEvent, Key = key, Source = source }; return new KeyEventArgs { RoutedEvent = InputElement.KeyUpEvent, Key = key, Source = source };
} }

10
tests/Avalonia.Controls.UnitTests/SplitViewTests.cs

@ -160,7 +160,7 @@ namespace Avalonia.Controls.UnitTests
splitView.IsPaneOpen = true; splitView.IsPaneOpen = true;
splitView.RaiseEvent(new PointerReleasedEventArgs(splitView, splitView.RaiseEvent(new PointerReleasedEventArgs(splitView,
null, wnd, new Point(1270, 30), 0, null!, wnd, new Point(1270, 30), 0,
new PointerPointProperties(), new PointerPointProperties(),
KeyModifiers.None, KeyModifiers.None,
MouseButton.Left)); MouseButton.Left));
@ -172,7 +172,7 @@ namespace Avalonia.Controls.UnitTests
splitView.IsPaneOpen = true; splitView.IsPaneOpen = true;
splitView.RaiseEvent(new PointerReleasedEventArgs(splitView, splitView.RaiseEvent(new PointerReleasedEventArgs(splitView,
null, wnd, new Point(1270, 30), 0, null!, wnd, new Point(1270, 30), 0,
new PointerPointProperties(), new PointerPointProperties(),
KeyModifiers.None, KeyModifiers.None,
MouseButton.Left)); MouseButton.Left));
@ -207,7 +207,7 @@ namespace Avalonia.Controls.UnitTests
splitView.IsPaneOpen = true; splitView.IsPaneOpen = true;
clickBorder.RaiseEvent(new PointerReleasedEventArgs(splitView, clickBorder.RaiseEvent(new PointerReleasedEventArgs(splitView,
null, wnd, new Point(5, 5), 0, null!, wnd, new Point(5, 5), 0,
new PointerPointProperties(), new PointerPointProperties(),
KeyModifiers.None, KeyModifiers.None,
MouseButton.Left)); MouseButton.Left));
@ -322,7 +322,7 @@ namespace Avalonia.Controls.UnitTests
splitView.IsPaneOpen = true; splitView.IsPaneOpen = true;
splitView.RaiseEvent(new PointerReleasedEventArgs(splitView, splitView.RaiseEvent(new PointerReleasedEventArgs(splitView,
null, wnd, new Point(1270, 30), 0, null!, wnd, new Point(1270, 30), 0,
new PointerPointProperties(), new PointerPointProperties(),
KeyModifiers.None, KeyModifiers.None,
MouseButton.Left)); MouseButton.Left));
@ -336,7 +336,7 @@ namespace Avalonia.Controls.UnitTests
splitView.DisplayMode = SplitViewDisplayMode.Inline; splitView.DisplayMode = SplitViewDisplayMode.Inline;
splitView.RaiseEvent(new PointerReleasedEventArgs(splitView, splitView.RaiseEvent(new PointerReleasedEventArgs(splitView,
null, wnd, new Point(1270, 30), 0, null!, wnd, new Point(1270, 30), 0,
new PointerPointProperties(), new PointerPointProperties(),
KeyModifiers.None, KeyModifiers.None,
MouseButton.Left)); MouseButton.Left));

27
tests/Avalonia.Controls.UnitTests/TabControlTests.cs

@ -281,8 +281,8 @@ namespace Avalonia.Controls.UnitTests
ApplyTemplate(target); ApplyTemplate(target);
target.ContentPart.UpdateChild(); target.ContentPart!.UpdateChild();
var dataContext = ((TextBlock)target.ContentPart.Child).DataContext; var dataContext = ((TextBlock)target.ContentPart.Child!).DataContext;
Assert.Equal(items[0], dataContext); Assert.Equal(items[0], dataContext);
target.SelectedIndex = 1; target.SelectedIndex = 1;
@ -337,7 +337,7 @@ namespace Avalonia.Controls.UnitTests
.Select(x => x.Header) .Select(x => x.Header)
.ToList(); .ToList();
Assert.Equal(new object[] { null, null }, result); Assert.Equal(new object?[] { null, null }, result);
} }
[Fact] [Fact]
@ -358,7 +358,7 @@ namespace Avalonia.Controls.UnitTests
target.SelectedIndex = 2; target.SelectedIndex = 2;
var page = (TabItem)target.SelectedItem; var page = Assert.IsType<TabItem>(target.SelectedItem);
Assert.Null(page.Content); Assert.Null(page.Content);
} }
@ -376,7 +376,7 @@ namespace Avalonia.Controls.UnitTests
var root = new TestRoot(target); var root = new TestRoot(target);
ApplyTemplate(target); ApplyTemplate(target);
target.ContentPart.UpdateChild(); target.ContentPart!.UpdateChild();
var content = Assert.IsType<TextBlock>(target.ContentPart.Child); var content = Assert.IsType<TextBlock>(target.ContentPart.Child);
Assert.Equal("bar", content.Tag); Assert.Equal("bar", content.Tag);
@ -395,7 +395,7 @@ namespace Avalonia.Controls.UnitTests
var root = new TestRoot(target); var root = new TestRoot(target);
ApplyTemplate(target); ApplyTemplate(target);
((ContentPresenter)target.ContentPart).UpdateChild(); target.ContentPart!.UpdateChild();
Assert.Equal(null, Assert.IsType<TextBlock>(target.ContentPart.Child).Tag); Assert.Equal(null, Assert.IsType<TextBlock>(target.ContentPart.Child).Tag);
@ -473,7 +473,7 @@ namespace Avalonia.Controls.UnitTests
<TabControl Name='tabs' ItemsSource='{Binding Tabs}'/> <TabControl Name='tabs' ItemsSource='{Binding Tabs}'/>
</Window>"; </Window>";
var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
var tabControl = window.FindControl<TabControl>("tabs"); var tabControl = window.GetControl<TabControl>("tabs");
tabControl.DataContext = new { Tabs = new List<string>() }; tabControl.DataContext = new { Tabs = new List<string>() };
window.ApplyTemplate(); window.ApplyTemplate();
@ -601,6 +601,7 @@ namespace Avalonia.Controls.UnitTests
RaiseKeyEvent(button, Key.Tab); RaiseKeyEvent(button, Key.Tab);
var item = target.ContainerFromIndex(1); var item = target.ContainerFromIndex(1);
Assert.NotNull(item);
Assert.Same(item, root.FocusManager.GetFocusedElement()); Assert.Same(item, root.FocusManager.GetFocusedElement());
RaiseKeyEvent(item, Key.Tab); RaiseKeyEvent(item, Key.Tab);
@ -747,7 +748,7 @@ namespace Avalonia.Controls.UnitTests
new TabItem { Header = "_Disabled", IsEnabled = false }, new TabItem { Header = "_Disabled", IsEnabled = false },
} }
}; };
kd.SetFocusedElement((TabItem)tabControl.Items[selectedTabIndex], NavigationMethod.Unspecified, KeyModifiers.None); kd.SetFocusedElement((TabItem?)tabControl.Items[selectedTabIndex], NavigationMethod.Unspecified, KeyModifiers.None);
var root = new TestTopLevel(impl.Object) var root = new TestTopLevel(impl.Object)
{ {
@ -756,7 +757,7 @@ namespace Avalonia.Controls.UnitTests
}; };
root.ApplyTemplate(); root.ApplyTemplate();
root.Presenter.UpdateChild(); root.Presenter!.UpdateChild();
ApplyTemplate(tabControl); ApplyTemplate(tabControl);
KeyDown(root, Key.LeftAlt); KeyDown(root, Key.LeftAlt);
@ -847,7 +848,7 @@ namespace Avalonia.Controls.UnitTests
private readonly ILayoutManager _layoutManager; private readonly ILayoutManager _layoutManager;
public bool IsClosed { get; private set; } public bool IsClosed { get; private set; }
public TestTopLevel(ITopLevelImpl impl, ILayoutManager layoutManager = null) public TestTopLevel(ITopLevelImpl impl, ILayoutManager? layoutManager = null)
: base(impl) : base(impl)
{ {
_layoutManager = layoutManager ?? new LayoutManager(this); _layoutManager = layoutManager ?? new LayoutManager(this);
@ -877,7 +878,7 @@ namespace Avalonia.Controls.UnitTests
{ {
target.ApplyTemplate(); target.ApplyTemplate();
target.Presenter.ApplyTemplate(); target.Presenter!.ApplyTemplate();
foreach (var tabItem in target.GetLogicalChildren().OfType<TabItem>()) foreach (var tabItem in target.GetLogicalChildren().OfType<TabItem>())
{ {
@ -885,10 +886,10 @@ namespace Avalonia.Controls.UnitTests
tabItem.ApplyTemplate(); tabItem.ApplyTemplate();
tabItem.Presenter.UpdateChild(); tabItem.Presenter!.UpdateChild();
} }
target.ContentPart.ApplyTemplate(); target.ContentPart!.ApplyTemplate();
} }
private class Item private class Item

20
tests/Avalonia.Controls.UnitTests/TextBlockTests.cs

@ -141,7 +141,7 @@ namespace Avalonia.Controls.UnitTests
Assert.True(target.IsMeasureValid); Assert.True(target.IsMeasureValid);
target.Inlines.Add(new Run("Hello")); target.Inlines!.Add(new Run("Hello"));
Assert.False(target.IsMeasureValid); Assert.False(target.IsMeasureValid);
@ -177,7 +177,7 @@ namespace Avalonia.Controls.UnitTests
{ {
var target = new TextBlock(); var target = new TextBlock();
target.Inlines.Add(new TextBox { Text = "Hello"}); target.Inlines!.Add(new TextBox { Text = "Hello"});
target.Measure(Size.Infinity); target.Measure(Size.Infinity);
@ -201,7 +201,7 @@ namespace Avalonia.Controls.UnitTests
var textBox = new TextBox { Text = "Hello", Template = TextBoxTests.CreateTemplate() }; var textBox = new TextBox { Text = "Hello", Template = TextBoxTests.CreateTemplate() };
target.Inlines.Add(textBox); target.Inlines!.Add(textBox);
target.Measure(Size.Infinity); target.Measure(Size.Infinity);
@ -228,7 +228,7 @@ namespace Avalonia.Controls.UnitTests
var inline = new Run("Hello"); var inline = new Run("Hello");
target.Inlines.Add(inline); target.Inlines!.Add(inline);
target.Measure(Size.Infinity); target.Measure(Size.Infinity);
@ -268,7 +268,7 @@ namespace Avalonia.Controls.UnitTests
var run = new Run("Hello"); var run = new Run("Hello");
target.Inlines.Add(run); target.Inlines!.Add(run);
target.Measure(Size.Infinity); target.Measure(Size.Infinity);
@ -308,7 +308,7 @@ namespace Avalonia.Controls.UnitTests
{ {
var target = new TextBlock(); var target = new TextBlock();
target.Inlines.Add(new Border()); target.Inlines!.Add(new Border());
target.Measure(Size.Infinity); target.Measure(Size.Infinity);
@ -331,7 +331,7 @@ namespace Avalonia.Controls.UnitTests
var run = new InlineUIContainer(control); var run = new InlineUIContainer(control);
target.Inlines.Add(run); target.Inlines!.Add(run);
target.Measure(Size.Infinity); target.Measure(Size.Infinity);
@ -402,7 +402,7 @@ namespace Avalonia.Controls.UnitTests
Image imageControl = new Image { Source = image }; Image imageControl = new Image { Source = image };
InlineUIContainer container = new InlineUIContainer(imageControl); InlineUIContainer container = new InlineUIContainer(imageControl);
target.Inlines.Add(new Run("The child should not be limited by position on line.")); target.Inlines!.Add(new Run("The child should not be limited by position on line."));
target.Inlines.Add(container); target.Inlines.Add(container);
target.Measure(new Size(100, 100)); target.Measure(new Size(100, 100));
@ -420,7 +420,7 @@ namespace Avalonia.Controls.UnitTests
{ {
var target = new TextBlock(); var target = new TextBlock();
target.Inlines.Add(new Run("Hello World")); target.Inlines!.Add(new Run("Hello World"));
Assert.Equal(null, target.Text); Assert.Equal(null, target.Text);
@ -441,7 +441,7 @@ namespace Avalonia.Controls.UnitTests
{ {
var target = new TextBlock(); var target = new TextBlock();
target.Inlines.Add(new Run("Hello World")); target.Inlines!.Add(new Run("Hello World"));
Assert.Equal(1, target.Inlines.Count); Assert.Equal(1, target.Inlines.Count);

25
tests/Avalonia.Controls.UnitTests/TextBoxTests_DataValidation.cs

@ -59,9 +59,10 @@ namespace Avalonia.Controls.UnitTests
Assert.Null(DataValidationErrors.GetErrors(target)); Assert.Null(DataValidationErrors.GetErrors(target));
target.Text = "20"; target.Text = "20";
IEnumerable<object> errors = DataValidationErrors.GetErrors(target); var errors = DataValidationErrors.GetErrors(target);
Assert.Single(errors); Assert.NotNull(errors);
Assert.IsType<InvalidOperationException>(errors.Single()); var error = Assert.Single(errors);
Assert.IsType<InvalidOperationException>(error);
target.Text = "1"; target.Text = "1";
Assert.Null(DataValidationErrors.GetErrors(target)); Assert.Null(DataValidationErrors.GetErrors(target));
} }
@ -84,9 +85,9 @@ namespace Avalonia.Controls.UnitTests
target.Text = "20"; target.Text = "20";
IEnumerable<object> errors = DataValidationErrors.GetErrors(target); var errors = DataValidationErrors.GetErrors(target);
Assert.Single(errors); Assert.NotNull(errors);
var error = Assert.IsType<string>(errors.Single()); var error = Assert.IsType<string>(Assert.Single(errors));
Assert.StartsWith("Error: ", error); Assert.StartsWith("Error: ", error);
} }
} }
@ -121,7 +122,7 @@ namespace Avalonia.Controls.UnitTests
new ClrPropertyInfo( new ClrPropertyInfo(
nameof(ExceptionTest.LessThan10), nameof(ExceptionTest.LessThan10),
target => ((ExceptionTest)target).LessThan10, target => ((ExceptionTest)target).LessThan10,
(target, value) => ((ExceptionTest)target).LessThan10 = (int)value, (target, value) => ((ExceptionTest)target).LessThan10 = (int)value!,
typeof(int)), typeof(int)),
PropertyInfoAccessorFactory.CreateInpcPropertyAccessor) PropertyInfoAccessorFactory.CreateInpcPropertyAccessor)
.Build(); .Build();
@ -215,13 +216,13 @@ namespace Avalonia.Controls.UnitTests
public bool HasErrors => _lessThan10 >= 10; public bool HasErrors => _lessThan10 >= 10;
public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged; public event EventHandler<DataErrorsChangedEventArgs>? ErrorsChanged;
public IEnumerable GetErrors(string propertyName) public IEnumerable GetErrors(string? propertyName)
{ {
IList<string> result; if (propertyName is not null && _errors.TryGetValue(propertyName, out var result))
_errors.TryGetValue(propertyName, out result); return result;
return result; return Array.Empty<string?>();
} }
} }
} }

58
tests/Avalonia.Controls.UnitTests/TimePickerTests.cs

@ -49,15 +49,11 @@ namespace Avalonia.Controls.UnitTests
var desc = timePicker.GetVisualDescendants(); var desc = timePicker.GetVisualDescendants();
Assert.True(desc.Count() > 1);//Should be layoutroot grid & button Assert.True(desc.Count() > 1);//Should be layoutroot grid & button
Grid container = null;
Assert.True(desc.ElementAt(1) is Button); var button = Assert.IsAssignableFrom<Button>(desc.ElementAt(1));
var container = Assert.IsAssignableFrom<Grid>(button.Content);
container = (desc.ElementAt(1) as Button).Content as Grid;
Assert.True(container != null);
var periodTextHost = container.Children[6] as Border; var periodTextHost = Assert.IsAssignableFrom<Border>(container.Children[6]);
Assert.True(periodTextHost != null);
Assert.True(periodTextHost.IsVisible); Assert.True(periodTextHost.IsVisible);
timePicker.ClockIdentifier = "24HourClock"; timePicker.ClockIdentifier = "24HourClock";
@ -79,15 +75,11 @@ namespace Avalonia.Controls.UnitTests
var desc = timePicker.GetVisualDescendants(); var desc = timePicker.GetVisualDescendants();
Assert.True(desc.Count() > 1);//Should be layoutroot grid & button Assert.True(desc.Count() > 1);//Should be layoutroot grid & button
Grid container = null;
Assert.True(desc.ElementAt(1) is Button); var button = Assert.IsAssignableFrom<Button>(desc.ElementAt(1));
var container = Assert.IsAssignableFrom<Grid>(button.Content);
container = (desc.ElementAt(1) as Button).Content as Grid; var periodTextHost = Assert.IsAssignableFrom<Border>(container.Children[4]);
Assert.True(container != null);
var periodTextHost = container.Children[4] as Border;
Assert.True(periodTextHost != null);
Assert.True(periodTextHost.IsVisible); Assert.True(periodTextHost.IsVisible);
timePicker.UseSeconds = false; timePicker.UseSeconds = false;
@ -117,9 +109,7 @@ namespace Avalonia.Controls.UnitTests
Assert.True(desc.ElementAt(2) is Popup); Assert.True(desc.ElementAt(2) is Popup);
var popup = (Popup)desc.ElementAt(2); var popup = (Popup)desc.ElementAt(2);
Assert.True(popup.Child is TimePickerPresenter); var timePickerPresenter = Assert.IsAssignableFrom<TimePickerPresenter>(popup.Child);
var timePickerPresenter = (TimePickerPresenter)popup.Child;
var panel = (Panel)timePickerPresenter.VisualChildren[0]; var panel = (Panel)timePickerPresenter.VisualChildren[0];
var acceptBtn = (Button)panel.VisualChildren[0]; var acceptBtn = (Button)panel.VisualChildren[0];
@ -169,22 +159,16 @@ namespace Avalonia.Controls.UnitTests
var desc = timePicker.GetVisualDescendants(); var desc = timePicker.GetVisualDescendants();
Assert.True(desc.Count() > 1);//Should be layoutroot grid & button Assert.True(desc.Count() > 1);//Should be layoutroot grid & button
Grid container = null;
Assert.True(desc.ElementAt(1) is Button); var button = Assert.IsAssignableFrom<Button>(desc.ElementAt(1));
var container = Assert.IsAssignableFrom<Grid>(button.Content);
container = (desc.ElementAt(1) as Button).Content as Grid;
Assert.True(container != null);
var hourTextHost = container.Children[0] as Border; var hourTextHost = Assert.IsAssignableFrom<Border>(container.Children[0]);
Assert.True(hourTextHost != null); var hourText = Assert.IsAssignableFrom<TextBlock>(hourTextHost.Child);
var hourText = hourTextHost.Child as TextBlock; var minuteTextHost = Assert.IsAssignableFrom<Border>(container.Children[2]);
var minuteTextHost = container.Children[2] as Border; var minuteText = Assert.IsAssignableFrom<TextBlock>(minuteTextHost.Child);
Assert.True(minuteTextHost != null); var secondTextHost = Assert.IsAssignableFrom<Border>(container.Children[4]);
var minuteText = minuteTextHost.Child as TextBlock; var secondText = Assert.IsAssignableFrom<TextBlock>(secondTextHost.Child);
var secondTextHost = container.Children[4] as Border;
Assert.True(secondTextHost != null);
var secondText = secondTextHost.Child as TextBlock;
TimeSpan ts = TimeSpan.FromHours(10); TimeSpan ts = TimeSpan.FromHours(10);
timePicker.SelectedTime = ts; timePicker.SelectedTime = ts;
@ -214,15 +198,11 @@ namespace Avalonia.Controls.UnitTests
var desc = timePicker.GetVisualDescendants(); var desc = timePicker.GetVisualDescendants();
Assert.True(desc.Count() > 1); //Should be layoutroot grid & button Assert.True(desc.Count() > 1); //Should be layoutroot grid & button
Assert.True(desc.ElementAt(1) is Button); var button = Assert.IsAssignableFrom<Button>(desc.ElementAt(1));
var container = Assert.IsAssignableFrom<Grid>(button.Content);
var container = (desc.ElementAt(1) as Button).Content as Grid;
Assert.True(container != null);
var periodTextHost = container.Children[6] as Border; var periodTextHost = Assert.IsAssignableFrom<Border>(container.Children[6]);
Assert.NotNull(periodTextHost); var periodText = Assert.IsAssignableFrom<TextBlock>(periodTextHost.Child);
var periodText = periodTextHost.Child as TextBlock;
Assert.NotNull(periodTextHost);
TimeSpan ts = TimeSpan.FromHours(10); TimeSpan ts = TimeSpan.FromHours(10);
timePicker.SelectedTime = ts; timePicker.SelectedTime = ts;

34
tests/Avalonia.Controls.UnitTests/ToolTipTests.cs

@ -24,6 +24,7 @@ namespace Avalonia.Controls.UnitTests
protected override void VerifyToolTipType(Control control) protected override void VerifyToolTipType(Control control)
{ {
var toolTip = control.GetValue(ToolTip.ToolTipProperty); var toolTip = control.GetValue(ToolTip.ToolTipProperty);
Assert.NotNull(toolTip);
Assert.IsType<PopupRoot>(toolTip.PopupHost); Assert.IsType<PopupRoot>(toolTip.PopupHost);
Assert.Same(toolTip.VisualRoot, toolTip.PopupHost); Assert.Same(toolTip.VisualRoot, toolTip.PopupHost);
} }
@ -38,7 +39,7 @@ namespace Avalonia.Controls.UnitTests
_toolTipOpenSubscription = ToolTip.IsOpenProperty.Changed.Subscribe(new AnonymousObserver<AvaloniaPropertyChangedEventArgs<bool>>(e => _toolTipOpenSubscription = ToolTip.IsOpenProperty.Changed.Subscribe(new AnonymousObserver<AvaloniaPropertyChangedEventArgs<bool>>(e =>
{ {
if (e.Sender is Visual { VisualRoot: {} root } visual) if (e.Sender is Visual { VisualRoot: {} root } visual)
OverlayLayer.GetOverlayLayer(visual).Measure(root.ClientSize); OverlayLayer.GetOverlayLayer(visual)!.Measure(root.ClientSize);
})); }));
} }
@ -59,6 +60,7 @@ namespace Avalonia.Controls.UnitTests
protected override void VerifyToolTipType(Control control) protected override void VerifyToolTipType(Control control)
{ {
var toolTip = control.GetValue(ToolTip.ToolTipProperty); var toolTip = control.GetValue(ToolTip.ToolTipProperty);
Assert.NotNull(toolTip);
Assert.IsType<OverlayPopupHost>(toolTip.PopupHost); Assert.IsType<OverlayPopupHost>(toolTip.PopupHost);
Assert.Same(toolTip.VisualRoot, control.VisualRoot); Assert.Same(toolTip.VisualRoot, control.VisualRoot);
} }
@ -164,10 +166,10 @@ namespace Avalonia.Controls.UnitTests
SetupWindowAndActivateToolTip(target); SetupWindowAndActivateToolTip(target);
AssertToolTipOpen(target); AssertToolTipOpen(target);
Assert.Equal("Tip", target.GetValue(ToolTip.ToolTipProperty).Content); Assert.Equal("Tip", target.GetValue(ToolTip.ToolTipProperty)?.Content);
ToolTip.SetTip(target, "Tip1"); ToolTip.SetTip(target, "Tip1");
Assert.Equal("Tip1", target.GetValue(ToolTip.ToolTipProperty).Content); Assert.Equal("Tip1", target.GetValue(ToolTip.ToolTipProperty)?.Content);
} }
} }
@ -211,7 +213,7 @@ namespace Avalonia.Controls.UnitTests
window.ApplyStyling(); window.ApplyStyling();
window.ApplyTemplate(); window.ApplyTemplate();
window.Presenter.ApplyTemplate(); window.Presenter!.ApplyTemplate();
Assert.Empty(toolTip.Classes); Assert.Empty(toolTip.Classes);
} }
@ -234,7 +236,7 @@ namespace Avalonia.Controls.UnitTests
window.ApplyStyling(); window.ApplyStyling();
window.ApplyTemplate(); window.ApplyTemplate();
window.Presenter.ApplyTemplate(); window.Presenter!.ApplyTemplate();
ToolTip.SetIsOpen(decorator, true); ToolTip.SetIsOpen(decorator, true);
@ -263,7 +265,7 @@ namespace Avalonia.Controls.UnitTests
window.ApplyStyling(); window.ApplyStyling();
window.ApplyTemplate(); window.ApplyTemplate();
window.Presenter.ApplyTemplate(); window.Presenter!.ApplyTemplate();
ToolTip.SetIsOpen(decorator, true); ToolTip.SetIsOpen(decorator, true);
AssertToolTipOpen(decorator); AssertToolTipOpen(decorator);
@ -436,7 +438,7 @@ namespace Avalonia.Controls.UnitTests
[ToolTip.ShowDelayProperty] = 0 [ToolTip.ShowDelayProperty] = 0
}; };
var eventsOrder = new List<(string eventName, object sender, object source)>(); var eventsOrder = new List<(string eventName, object? sender, object? source)>();
ToolTip.AddToolTipOpeningHandler(target, ToolTip.AddToolTipOpeningHandler(target,
(sender, args) => eventsOrder.Add(("Opening", sender, args.Source))); (sender, args) => eventsOrder.Add(("Opening", sender, args.Source)));
@ -454,7 +456,7 @@ namespace Avalonia.Controls.UnitTests
Assert.Equal( Assert.Equal(
new[] new[]
{ {
("Opening", (object)target, (object)target), ("Opening", (object?)target, (object?)target),
("Closing", target, target) ("Closing", target, target)
}, },
eventsOrder); eventsOrder);
@ -522,14 +524,14 @@ namespace Avalonia.Controls.UnitTests
AssertToolTipOpen(target); AssertToolTipOpen(target);
var topLevel = TopLevel.GetTopLevel(target); var topLevel = TopLevel.GetTopLevel(target);
topLevel.PlatformImpl.Input(new RawPointerEventArgs(s_mouseDevice, (ulong)DateTime.Now.Ticks, topLevel, topLevel!.PlatformImpl!.Input!(new RawPointerEventArgs(s_mouseDevice, (ulong)DateTime.Now.Ticks, topLevel,
RawPointerEventType.LeaveWindow, default(RawPointerPoint), RawInputModifiers.None)); RawPointerEventType.LeaveWindow, default(RawPointerPoint), RawInputModifiers.None));
Assert.False(ToolTip.GetIsOpen(target)); Assert.False(ToolTip.GetIsOpen(target));
} }
} }
private Action<Control> SetupWindowAndGetMouseEnterAction(Control windowContent, [CallerMemberName] string testName = null) private Action<Control?> SetupWindowAndGetMouseEnterAction(Control windowContent, [CallerMemberName] string? testName = null)
{ {
var windowImpl = MockWindowingPlatform.CreateWindowMock(); var windowImpl = MockWindowingPlatform.CreateWindowMock();
SetupWindowMock(windowImpl); SetupWindowMock(windowImpl);
@ -545,7 +547,7 @@ namespace Avalonia.Controls.UnitTests
window.ApplyStyling(); window.ApplyStyling();
window.ApplyTemplate(); window.ApplyTemplate();
window.Presenter.ApplyTemplate(); window.Presenter!.ApplyTemplate();
window.Show(); window.Show();
Assert.True(windowContent.IsAttachedToVisualTree); Assert.True(windowContent.IsAttachedToVisualTree);
@ -553,7 +555,7 @@ namespace Avalonia.Controls.UnitTests
Assert.True(windowContent.IsVisible); Assert.True(windowContent.IsVisible);
var controlIds = new Dictionary<Control, int>(); var controlIds = new Dictionary<Control, int>();
IInputRoot lastRoot = null; IInputRoot? lastRoot = null;
return control => return control =>
{ {
@ -575,15 +577,15 @@ namespace Avalonia.Controls.UnitTests
hitTesterMock.Setup(m => m.HitTestFirst(point, window, It.IsAny<Func<Visual, bool>>())) hitTesterMock.Setup(m => m.HitTestFirst(point, window, It.IsAny<Func<Visual, bool>>()))
.Returns(control); .Returns(control);
var root = (IInputRoot)control?.VisualRoot ?? window; var root = (IInputRoot?)control?.VisualRoot ?? window;
var timestamp = (ulong)DateTime.Now.Ticks; var timestamp = (ulong)DateTime.Now.Ticks;
windowImpl.Object.Input(new RawPointerEventArgs(s_mouseDevice, timestamp, root, windowImpl.Object.Input!(new RawPointerEventArgs(s_mouseDevice, timestamp, root,
RawPointerEventType.Move, point, RawInputModifiers.None)); RawPointerEventType.Move, point, RawInputModifiers.None));
if (lastRoot != null && lastRoot != root) if (lastRoot != null && lastRoot != root)
{ {
((TopLevel)lastRoot).PlatformImpl?.Input(new RawPointerEventArgs(s_mouseDevice, timestamp, ((TopLevel)lastRoot).PlatformImpl?.Input!(new RawPointerEventArgs(s_mouseDevice, timestamp,
lastRoot, RawPointerEventType.LeaveWindow, new Point(-1,-1), RawInputModifiers.None)); lastRoot, RawPointerEventType.LeaveWindow, new Point(-1,-1), RawInputModifiers.None));
} }
@ -593,7 +595,7 @@ namespace Avalonia.Controls.UnitTests
}; };
} }
private void SetupWindowAndActivateToolTip(Control windowContent, Control targetOverride = null, [CallerMemberName] string testName = null) => private void SetupWindowAndActivateToolTip(Control windowContent, Control? targetOverride = null, [CallerMemberName] string? testName = null) =>
SetupWindowAndGetMouseEnterAction(windowContent, testName)(targetOverride ?? windowContent); SetupWindowAndGetMouseEnterAction(windowContent, testName)(targetOverride ?? windowContent);
} }

21
tests/Avalonia.Controls.UnitTests/TopLevelTests.cs

@ -142,7 +142,7 @@ namespace Avalonia.Controls.UnitTests
// The user has resized the window, so we can no longer auto-size. // The user has resized the window, so we can no longer auto-size.
var target = new TestTopLevel(impl.Object); var target = new TestTopLevel(impl.Object);
impl.Object.Resized(new Size(100, 200), WindowResizeReason.Unspecified); impl.Object.Resized!(new Size(100, 200), WindowResizeReason.Unspecified);
Assert.Equal(100, target.Width); Assert.Equal(100, target.Width);
Assert.Equal(200, target.Height); Assert.Equal(200, target.Height);
@ -160,7 +160,7 @@ namespace Avalonia.Controls.UnitTests
var target = new TestTopLevel(impl.Object); var target = new TestTopLevel(impl.Object);
target.Closed += (s, e) => raised = true; target.Closed += (s, e) => raised = true;
impl.Object.Closed(); impl.Object.Closed!();
Assert.True(raised); Assert.True(raised);
} }
@ -184,7 +184,7 @@ namespace Avalonia.Controls.UnitTests
++raised; ++raised;
}; };
impl.Object.Closed(); impl.Object.Closed!();
Assert.Equal(1, raised); Assert.Equal(1, raised);
} }
@ -215,7 +215,7 @@ namespace Avalonia.Controls.UnitTests
PhysicalKey.A, PhysicalKey.A,
"a"); "a");
impl.Object.Input(input); impl.Object.Input!(input);
inputManagerMock.Verify(x => x.ProcessInput(input)); inputManagerMock.Verify(x => x.ProcessInput(input));
} }
@ -234,7 +234,7 @@ namespace Avalonia.Controls.UnitTests
target.Content = child; target.Content = child;
target.ApplyTemplate(); target.ApplyTemplate();
Assert.Throws<InvalidOperationException>(() => target.Presenter.ApplyTemplate()); Assert.Throws<InvalidOperationException>(() => target.Presenter!.ApplyTemplate());
} }
} }
@ -248,7 +248,7 @@ namespace Avalonia.Controls.UnitTests
var raised = false; var raised = false;
target.ResourcesChanged += (_, __) => raised = true; target.ResourcesChanged += (_, __) => raised = true;
Application.Current.Resources.Add("foo", "bar"); Application.Current!.Resources.Add("foo", "bar");
Assert.True(raised); Assert.True(raised);
} }
@ -264,7 +264,7 @@ namespace Avalonia.Controls.UnitTests
var layoutManager = new Mock<ILayoutManager>(); var layoutManager = new Mock<ILayoutManager>();
var target = new TestTopLevel(impl.Object, layoutManager.Object); var target = new TestTopLevel(impl.Object, layoutManager.Object);
impl.Object.Closed(); impl.Object.Closed!();
layoutManager.Verify(x => x.Dispose()); layoutManager.Verify(x => x.Dispose());
} }
@ -297,12 +297,13 @@ namespace Avalonia.Controls.UnitTests
} }
}; };
Application.Current.Styles.Add(style); var application = Application.Current!;
application.Styles.Add(style);
target.LayoutManager.ExecuteInitialLayoutPass(); target.LayoutManager.ExecuteInitialLayoutPass();
Assert.Equal(new Thickness(2), child.BorderThickness); Assert.Equal(new Thickness(2), child.BorderThickness);
Application.Current.Styles.Remove(style); application.Styles.Remove(style);
Assert.Equal(new Thickness(0), child.BorderThickness); Assert.Equal(new Thickness(0), child.BorderThickness);
} }
@ -333,7 +334,7 @@ namespace Avalonia.Controls.UnitTests
private readonly ILayoutManager _layoutManager; private readonly ILayoutManager _layoutManager;
public bool IsClosed { get; private set; } public bool IsClosed { get; private set; }
public TestTopLevel(ITopLevelImpl impl, ILayoutManager layoutManager = null) public TestTopLevel(ITopLevelImpl impl, ILayoutManager? layoutManager = null)
: base(impl) : base(impl)
{ {
_layoutManager = layoutManager ?? new LayoutManager(this); _layoutManager = layoutManager ?? new LayoutManager(this);

7
tests/Avalonia.Controls.UnitTests/Utils/AncestorFinderTests.cs

@ -1,11 +1,6 @@
using System; using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Avalonia.Controls.Utils; using Avalonia.Controls.Utils;
using Avalonia.UnitTests; using Avalonia.UnitTests;
using Avalonia.VisualTree;
using Xunit; using Xunit;
namespace Avalonia.Controls.UnitTests.Utils namespace Avalonia.Controls.UnitTests.Utils
@ -20,7 +15,7 @@ namespace Avalonia.Controls.UnitTests.Utils
var grandParent = new Border(); var grandParent = new Border();
var grandParent2 = new Border(); var grandParent2 = new Border();
StyledElement currentParent = null; StyledElement? currentParent = null;
var subscription = AncestorFinder.Create(child, typeof (Border)).Subscribe(s => currentParent = s); var subscription = AncestorFinder.Create(child, typeof (Border)).Subscribe(s => currentParent = s);
Assert.Null(currentParent); Assert.Null(currentParent);

2
tests/Avalonia.Controls.UnitTests/Utils/CollectionChangedEventManagerTests.cs

@ -80,7 +80,7 @@ namespace Avalonia.Controls.UnitTests.Utils
public void Add(string s) => _inner.Add(s); public void Add(string s) => _inner.Add(s);
public event NotifyCollectionChangedEventHandler CollectionChanged public event NotifyCollectionChangedEventHandler? CollectionChanged
{ {
add => _inner.CollectionChanged += value; add => _inner.CollectionChanged += value;
remove => _inner.CollectionChanged -= value; remove => _inner.CollectionChanged -= value;

49
tests/Avalonia.Controls.UnitTests/Utils/HotKeyManagerTests.cs

@ -6,7 +6,7 @@ using Avalonia.Input.Raw;
using Avalonia.Platform; using Avalonia.Platform;
using Avalonia.UnitTests; using Avalonia.UnitTests;
using Xunit; using Xunit;
using Factory = System.Func<int, System.Action<object>, Avalonia.Controls.Window, Avalonia.AvaloniaObject>; using Factory = System.Func<int, System.Action<object?>?, Avalonia.Controls.Window, Avalonia.AvaloniaObject>;
namespace Avalonia.Controls.UnitTests.Utils namespace Avalonia.Controls.UnitTests.Utils
{ {
@ -28,7 +28,7 @@ namespace Avalonia.Controls.UnitTests.Utils
tl.Content = button; tl.Content = button;
tl.Template = CreateWindowTemplate(); tl.Template = CreateWindowTemplate();
tl.ApplyTemplate(); tl.ApplyTemplate();
tl.Presenter.ApplyTemplate(); tl.Presenter!.ApplyTemplate();
HotKeyManager.SetHotKey(button, gesture1); HotKeyManager.SetHotKey(button, gesture1);
@ -66,7 +66,7 @@ namespace Avalonia.Controls.UnitTests.Utils
var gesture = new KeyGesture(Key.A, KeyModifiers.Control); var gesture = new KeyGesture(Key.A, KeyModifiers.Control);
var action = new Action<object>(parameter => var action = new Action<object?>(parameter =>
{ {
if (parameter is int value) if (parameter is int value)
{ {
@ -79,7 +79,7 @@ namespace Avalonia.Controls.UnitTests.Utils
root.Template = CreateWindowTemplate(); root.Template = CreateWindowTemplate();
root.ApplyTemplate(); root.ApplyTemplate();
root.Presenter.ApplyTemplate(); root.Presenter!.ApplyTemplate();
HotKeyManager.SetHotKey(element, gesture); HotKeyManager.SetHotKey(element, gesture);
@ -110,19 +110,20 @@ namespace Avalonia.Controls.UnitTests.Utils
var gesture = new KeyGesture(Key.A, KeyModifiers.Control); var gesture = new KeyGesture(Key.A, KeyModifiers.Control);
var action = new Action<object>(parameter => var action = new Action<object?>(parameter =>
{ {
isExecuted = true; isExecuted = true;
}); });
var root = new Window(); var root = new Window();
var element = factory(0, action, root) as InputElement; var element = (InputElement)factory(0, action, root);
Assert.NotNull(element);
element.IsEnabled = false; element.IsEnabled = false;
root.Template = CreateWindowTemplate(); root.Template = CreateWindowTemplate();
root.ApplyTemplate(); root.ApplyTemplate();
root.Presenter.ApplyTemplate(); root.Presenter!.ApplyTemplate();
HotKeyManager.SetHotKey(element, gesture); HotKeyManager.SetHotKey(element, gesture);
@ -152,13 +153,13 @@ namespace Avalonia.Controls.UnitTests.Utils
var gesture = new KeyGesture(Key.A, KeyModifiers.Control); var gesture = new KeyGesture(Key.A, KeyModifiers.Control);
void Clickable_Click(object sender, Interactivity.RoutedEventArgs e) void Clickable_Click(object? sender, Interactivity.RoutedEventArgs e)
{ {
clickExecutedCount++; clickExecutedCount++;
} }
var root = new Window(); var root = new Window();
var element = factory(0, default, root) as InputElement; var element = (InputElement)factory(0, null, root);
if (element is IClickableControl clickable) if (element is IClickableControl clickable)
{ {
clickable.Click += Clickable_Click; clickable.Click += Clickable_Click;
@ -166,7 +167,7 @@ namespace Avalonia.Controls.UnitTests.Utils
root.Template = CreateWindowTemplate(); root.Template = CreateWindowTemplate();
root.ApplyTemplate(); root.ApplyTemplate();
root.Presenter.ApplyTemplate(); root.Presenter!.ApplyTemplate();
HotKeyManager.SetHotKey(element, gesture); HotKeyManager.SetHotKey(element, gesture);
@ -209,18 +210,18 @@ namespace Avalonia.Controls.UnitTests.Utils
var gesture = new KeyGesture(Key.A, KeyModifiers.Control); var gesture = new KeyGesture(Key.A, KeyModifiers.Control);
void DoExecute(object parameter) void DoExecute(object? parameter)
{ {
commandExecutedCount++; commandExecutedCount++;
} }
void Clickable_Click(object sender, Interactivity.RoutedEventArgs e) void Clickable_Click(object? sender, Interactivity.RoutedEventArgs e)
{ {
clickExecutedCount++; clickExecutedCount++;
} }
var root = new Window(); var root = new Window();
var element = factory(0, DoExecute, root) as InputElement; var element = (InputElement)factory(0, DoExecute, root);
if (element is IClickableControl clickable) if (element is IClickableControl clickable)
{ {
clickable.Click += Clickable_Click; clickable.Click += Clickable_Click;
@ -228,7 +229,7 @@ namespace Avalonia.Controls.UnitTests.Utils
root.Template = CreateWindowTemplate(); root.Template = CreateWindowTemplate();
root.ApplyTemplate(); root.ApplyTemplate();
root.Presenter.ApplyTemplate(); root.Presenter!.ApplyTemplate();
HotKeyManager.SetHotKey(element, gesture); HotKeyManager.SetHotKey(element, gesture);
@ -266,7 +267,7 @@ namespace Avalonia.Controls.UnitTests.Utils
{nameof(MenuItem),withCommand ? MakeMenu : MakeMenuWithoutCommand}, {nameof(MenuItem),withCommand ? MakeMenu : MakeMenuWithoutCommand},
}; };
private static AvaloniaObject MakeMenu(int expectedParameter, Action<object> action, Window root) private static AvaloniaObject MakeMenu(int expectedParameter, Action<object?>? action, Window root)
{ {
var menuitem = new MenuItem() var menuitem = new MenuItem()
{ {
@ -281,7 +282,7 @@ namespace Avalonia.Controls.UnitTests.Utils
return menuitem; return menuitem;
} }
private static AvaloniaObject MakeButton(int expectedParameter, Action<object> action, Window root) private static AvaloniaObject MakeButton(int expectedParameter, Action<object?>? action, Window root)
{ {
var button = new Button() var button = new Button()
{ {
@ -293,7 +294,7 @@ namespace Avalonia.Controls.UnitTests.Utils
return button; return button;
} }
private static AvaloniaObject MakeMenuWithoutCommand(int expectedParameter, Action<object> action, Window root) private static AvaloniaObject MakeMenuWithoutCommand(int expectedParameter, Action<object?>? action, Window root)
{ {
var menuitem = new MenuItem() var menuitem = new MenuItem()
{ {
@ -306,7 +307,7 @@ namespace Avalonia.Controls.UnitTests.Utils
return menuitem; return menuitem;
} }
private static AvaloniaObject MakeButtonWithoutCommand(int expectedParameter, Action<object> action, Window root) private static AvaloniaObject MakeButtonWithoutCommand(int expectedParameter, Action<object?>? action, Window root)
{ {
var button = new Button() var button = new Button()
{ {
@ -330,19 +331,19 @@ namespace Avalonia.Controls.UnitTests.Utils
class Command : System.Windows.Input.ICommand class Command : System.Windows.Input.ICommand
{ {
private readonly Action<object> _execeute; private readonly Action<object?>? _execute;
#pragma warning disable 67 // Event not used #pragma warning disable 67 // Event not used
public event EventHandler CanExecuteChanged; public event EventHandler? CanExecuteChanged;
#pragma warning restore 67 // Event not used #pragma warning restore 67 // Event not used
public Command(Action<object> execeute) public Command(Action<object?>? execute)
{ {
_execeute = execeute; _execute = execute;
} }
public bool CanExecute(object parameter) => true; public bool CanExecute(object? parameter) => true;
public void Execute(object parameter) => _execeute?.Invoke(parameter); public void Execute(object? parameter) => _execute?.Invoke(parameter);
} }
} }
} }

14
tests/Avalonia.Controls.UnitTests/Utils/TestCommand.cs

@ -5,9 +5,9 @@ namespace Avalonia.Controls.UnitTests.Utils;
internal class TestCommand : ICommand internal class TestCommand : ICommand
{ {
private readonly Func<object, bool> _canExecute; private readonly Func<object?, bool> _canExecute;
private readonly Action<object> _execute; private readonly Action<object?> _execute;
private EventHandler _canExecuteChanged; private EventHandler? _canExecuteChanged;
private bool _enabled = true; private bool _enabled = true;
public TestCommand(bool enabled = true) public TestCommand(bool enabled = true)
@ -17,7 +17,7 @@ internal class TestCommand : ICommand
_execute = _ => { }; _execute = _ => { };
} }
public TestCommand(Func<object, bool> canExecute, Action<object> execute = null) public TestCommand(Func<object?, bool> canExecute, Action<object?>? execute = null)
{ {
_canExecute = canExecute; _canExecute = canExecute;
_execute = execute ?? (_ => { }); _execute = execute ?? (_ => { });
@ -38,15 +38,15 @@ internal class TestCommand : ICommand
public int SubscriptionCount { get; private set; } public int SubscriptionCount { get; private set; }
public event EventHandler CanExecuteChanged public event EventHandler? CanExecuteChanged
{ {
add { _canExecuteChanged += value; ++SubscriptionCount; } add { _canExecuteChanged += value; ++SubscriptionCount; }
remove { _canExecuteChanged -= value; --SubscriptionCount; } remove { _canExecuteChanged -= value; --SubscriptionCount; }
} }
public bool CanExecute(object parameter) => _canExecute(parameter); public bool CanExecute(object? parameter) => _canExecute(parameter);
public void Execute(object parameter) => _execute(parameter); public void Execute(object? parameter) => _execute(parameter);
public void RaiseCanExecuteChanged() => _canExecuteChanged?.Invoke(this, EventArgs.Empty); public void RaiseCanExecuteChanged() => _canExecuteChanged?.Invoke(this, EventArgs.Empty);
} }

16
tests/Avalonia.Controls.UnitTests/WindowBaseTests.cs

@ -1,17 +1,9 @@
using System;
using System.Reactive;
using System.Reactive.Subjects;
using Moq; using Moq;
using Avalonia.Controls.Presenters; using Avalonia.Controls.Presenters;
using Avalonia.Controls.Templates; using Avalonia.Controls.Templates;
using Avalonia.Input;
using Avalonia.Input.Raw;
using Avalonia.Layout;
using Avalonia.Media; using Avalonia.Media;
using Avalonia.Platform; using Avalonia.Platform;
using Avalonia.Rendering;
using Avalonia.Rendering.Composition; using Avalonia.Rendering.Composition;
using Avalonia.Styling;
using Avalonia.UnitTests; using Avalonia.UnitTests;
using Xunit; using Xunit;
@ -44,7 +36,7 @@ namespace Avalonia.Controls.UnitTests
var target = new TestWindowBase(impl.Object); var target = new TestWindowBase(impl.Object);
target.Activated += (s, e) => raised = true; target.Activated += (s, e) => raised = true;
impl.Object.Activated(); impl.Object.Activated!();
Assert.True(raised); Assert.True(raised);
} }
@ -62,7 +54,7 @@ namespace Avalonia.Controls.UnitTests
var target = new TestWindowBase(impl.Object); var target = new TestWindowBase(impl.Object);
target.Deactivated += (s, e) => raised = true; target.Deactivated += (s, e) => raised = true;
impl.Object.Deactivated(); impl.Object.Deactivated!();
Assert.True(raised); Assert.True(raised);
} }
@ -120,7 +112,7 @@ namespace Avalonia.Controls.UnitTests
var target = new TestWindowBase(windowImpl.Object); var target = new TestWindowBase(windowImpl.Object);
target.Show(); target.Show();
windowImpl.Object.Closed(); windowImpl.Object.Closed!();
Assert.False(target.IsVisible); Assert.False(target.IsVisible);
} }
@ -219,7 +211,7 @@ namespace Avalonia.Controls.UnitTests
var target = new TestWindowBase(windowImpl.Object); var target = new TestWindowBase(windowImpl.Object);
target.Show(); target.Show();
windowImpl.Object.Closed(); windowImpl.Object.Closed!();
Assert.True(((CompositingRenderer)target.Renderer).IsDisposed); Assert.True(((CompositingRenderer)target.Renderer).IsDisposed);
} }
} }

22
tests/Avalonia.Controls.UnitTests/WindowTests.cs

@ -116,7 +116,7 @@ namespace Avalonia.Controls.UnitTests
window.Show(); window.Show();
Assert.True(window.IsVisible); Assert.True(window.IsVisible);
windowImpl.Object.Closed(); windowImpl.Object.Closed!();
Assert.False(window.IsVisible); Assert.False(window.IsVisible);
} }
@ -196,7 +196,7 @@ namespace Avalonia.Controls.UnitTests
} }
else else
{ {
var cancel = window.PlatformImpl.Closing(WindowCloseReason.WindowClosing); var cancel = window.PlatformImpl!.Closing!(WindowCloseReason.WindowClosing);
Assert.Equal(false, cancel); Assert.Equal(false, cancel);
} }
@ -258,7 +258,7 @@ namespace Avalonia.Controls.UnitTests
} }
else else
{ {
var cancel = window.PlatformImpl.Closing(WindowCloseReason.WindowClosing); var cancel = window.PlatformImpl!.Closing!(WindowCloseReason.WindowClosing);
Assert.Equal(true, cancel); Assert.Equal(true, cancel);
} }
@ -344,7 +344,7 @@ namespace Avalonia.Controls.UnitTests
var target = new Window(windowImpl.Object); var target = new Window(windowImpl.Object);
var task = target.ShowDialog<bool>(parent); var task = target.ShowDialog<bool>(parent);
windowImpl.Object.Closed(); windowImpl.Object.Closed!();
var result = await task; var result = await task;
Assert.False(result); Assert.False(result);
@ -387,7 +387,7 @@ namespace Avalonia.Controls.UnitTests
var target = new Window(windowImpl.Object); var target = new Window(windowImpl.Object);
var task = target.ShowDialog<bool>(parent); var task = target.ShowDialog<bool>(parent);
windowImpl.Object.Closed(); windowImpl.Object.Closed!();
await task; await task;
var openedRaised = false; var openedRaised = false;
@ -927,8 +927,8 @@ namespace Avalonia.Controls.UnitTests
// Size before and after DPI change is a real-world example, with size after DPI // Size before and after DPI change is a real-world example, with size after DPI
// change coming from Win32 WM_DPICHANGED. // change coming from Win32 WM_DPICHANGED.
target.PlatformImpl.ScalingChanged(1.5); target.PlatformImpl!.ScalingChanged!(1.5);
target.PlatformImpl.Resized( target.PlatformImpl!.Resized!(
new Size(210.66666666666666, 118.66666666666667), new Size(210.66666666666666, 118.66666666666667),
WindowResizeReason.DpiChange); WindowResizeReason.DpiChange);
@ -987,7 +987,7 @@ namespace Avalonia.Controls.UnitTests
target.Width = 410; target.Width = 410;
target.LayoutManager.ExecuteLayoutPass(); target.LayoutManager.ExecuteLayoutPass();
var windowImpl = Mock.Get(target.PlatformImpl); var windowImpl = Mock.Get(target.PlatformImpl!);
windowImpl.Verify(x => x.Resize(new Size(410, 800), WindowResizeReason.Application)); windowImpl.Verify(x => x.Resize(new Size(410, 800), WindowResizeReason.Application));
Assert.Equal(410, target.Width); Assert.Equal(410, target.Width);
} }
@ -1013,7 +1013,7 @@ namespace Avalonia.Controls.UnitTests
Assert.Equal(400, target.Width); Assert.Equal(400, target.Width);
Assert.Equal(800, target.Height); Assert.Equal(800, target.Height);
target.PlatformImpl.Resized(new Size(410, 800), WindowResizeReason.User); target.PlatformImpl!.Resized!(new Size(410, 800), WindowResizeReason.User);
Assert.Equal(410, target.Width); Assert.Equal(410, target.Width);
Assert.Equal(800, target.Height); Assert.Equal(800, target.Height);
@ -1040,7 +1040,7 @@ namespace Avalonia.Controls.UnitTests
Assert.Equal(400, target.Width); Assert.Equal(400, target.Width);
Assert.Equal(800, target.Height); Assert.Equal(800, target.Height);
target.PlatformImpl.Resized(new Size(400, 810), WindowResizeReason.User); target.PlatformImpl!.Resized!(new Size(400, 810), WindowResizeReason.User);
Assert.Equal(400, target.Width); Assert.Equal(400, target.Width);
Assert.Equal(810, target.Height); Assert.Equal(810, target.Height);
@ -1068,7 +1068,7 @@ namespace Avalonia.Controls.UnitTests
Assert.Equal(400, target.Width); Assert.Equal(400, target.Width);
Assert.Equal(800, target.Height); Assert.Equal(800, target.Height);
target.PlatformImpl.Resized(new Size(410, 810), WindowResizeReason.Unspecified); target.PlatformImpl!.Resized!(new Size(410, 810), WindowResizeReason.Unspecified);
Assert.Equal(400, target.Width); Assert.Equal(400, target.Width);
Assert.Equal(800, target.Height); Assert.Equal(800, target.Height);

4
tests/Avalonia.UnitTests/MockWindowingPlatform.cs

@ -12,11 +12,11 @@ namespace Avalonia.UnitTests
{ {
private static readonly Size s_screenSize = new Size(1280, 1024); private static readonly Size s_screenSize = new Size(1280, 1024);
private readonly Func<IWindowImpl>? _windowImpl; private readonly Func<IWindowImpl>? _windowImpl;
private readonly Func<IWindowBaseImpl, IPopupImpl>? _popupImpl; private readonly Func<IWindowBaseImpl, IPopupImpl?>? _popupImpl;
public MockWindowingPlatform( public MockWindowingPlatform(
Func<IWindowImpl>? windowImpl = null, Func<IWindowImpl>? windowImpl = null,
Func<IWindowBaseImpl, IPopupImpl>? popupImpl = null ) Func<IWindowBaseImpl, IPopupImpl?>? popupImpl = null )
{ {
_windowImpl = windowImpl; _windowImpl = windowImpl;
_popupImpl = popupImpl; _popupImpl = popupImpl;

Loading…
Cancel
Save