From c68111294f225826f5058e9ffb34e88742be3448 Mon Sep 17 00:00:00 2001 From: Julien Lebosquain Date: Mon, 29 Dec 2025 10:24:49 +0100 Subject: [PATCH] Enable nullability in Base/Markup/Markup.Xaml unit tests (#20346) * Enable nullability in UnitTests * Enable nullability in Base.UnitTests * Enable nullability in Markup.UnitTests * Enable nullability in Markup.Xaml.UnitTests --- src/Avalonia.Base/Media/IGlyphTypeface.cs | 3 +- src/Avalonia.Base/Utilities/StringSplitter.cs | 4 +- .../Markup/Parsers/ExpressionNodeFactory.cs | 8 +- .../Markup/Parsers/SelectorParser.cs | 4 +- src/Skia/Avalonia.Skia/GlyphTypefaceImpl.cs | 2 +- .../Animation/AnimatableTests.cs | 8 +- .../Animation/KeySplineTests.cs | 6 +- .../Animation/SpringTests.cs | 4 +- .../Animation/TestClock.cs | 2 +- .../Avalonia.Base.UnitTests.csproj | 1 + .../AvaloniaObjectTests_Direct.cs | 70 ++++----- .../AvaloniaObjectTests_GetValue.cs | 4 +- .../AvaloniaObjectTests_Inheritance.cs | 28 ++-- .../AvaloniaObjectTests_Metadata.cs | 22 +-- .../AvaloniaObjectTests_MultiBinding.cs | 18 +-- .../AvaloniaObjectTests_SetCurrentValue.cs | 4 +- .../AvaloniaObjectTests_SetValue.cs | 19 ++- .../AvaloniaObjectTests_Threading.cs | 10 +- .../AvaloniaPropertyTests.cs | 19 ++- .../Collections/AvaloniaDictionaryTests.cs | 7 +- .../Collections/AvaloniaListTests.cs | 21 ++- .../Collections/CollectionChangedTracker.cs | 4 +- .../Collections/PropertyChangedTracker.cs | 7 +- .../Composition/BatchStreamTests.cs | 4 +- .../Composition/CompositionAnimationTests.cs | 2 +- .../BindingExpressionTests.DataValidation.cs | 17 +-- .../Core/BindingExpressionTests.Observable.cs | 2 +- .../Data/Core/IndeiBase.cs | 6 +- .../DataAnnotationsValidationPluginTests.cs | 26 ++-- .../Plugins/ExceptionValidationPluginTests.cs | 7 +- .../Plugins/IndeiValidationPluginTests.cs | 18 ++- .../Data/DefaultValueConverterTests.cs | 20 +-- .../Data/ReflectionClrPropertyInfoTests.cs | 4 +- .../Data/StringConvertersTests.cs | 4 +- .../DirectPropertyTests.cs | 12 +- .../DispatcherTests.cs | 8 +- .../Input/InputElement_Focus.cs | 15 +- .../Input/KeyboardNavigationTests_Custom.cs | 4 +- .../Input/KeyboardNavigationTests_Tab.cs | 6 +- .../Input/MouseDeviceTests.cs | 2 +- .../Input/PointerTests.cs | 2 +- .../Input/TouchDeviceTests.cs | 37 +++-- .../Interactivity/InteractiveTests.cs | 60 ++++---- .../Layout/LayoutTestControl.cs | 4 +- .../Layout/LayoutTestRoot.cs | 4 +- .../Layout/LayoutableTests.cs | 4 +- ...ayoutableTests_EffectiveViewportChanged.cs | 6 +- .../Logging/LoggingTests.cs | 8 +- .../Media/ColorTests.cs | 4 +- .../Media/FontFamilyTests.cs | 6 +- .../Media/FontManagerTests.cs | 8 +- .../Media/Fonts/FamilyNameCollectionTests.cs | 2 +- .../Media/Fonts/FontFamilyKeyTests.cs | 2 +- .../Media/PathMarkupParserTests.cs | 13 ++ .../TextFormatting/BiDiTestDataGenerator.cs | 4 +- .../FormattedTextSourceTests.cs | 5 +- .../TextFormatting/UnicodeDataGenerator.cs | 10 +- .../TextFormatting/UnicodeEnumsGenerator.cs | 4 +- .../Media/UnicodeRangeTests.cs | 1 + .../Avalonia.Base.UnitTests/PixelSizeTests.cs | 44 +++--- .../SceneGraph/DrawOperationTests.cs | 3 +- .../Styling/ResourceDictionaryTests.cs | 2 +- .../Styling/SelectorTests_Child.cs | 4 +- .../Styling/SelectorTests_Class.cs | 32 ++-- .../Styling/SelectorTests_Descendent.cs | 18 ++- .../Styling/SelectorTests_Multiple.cs | 4 + .../Styling/SelectorTests_Nesting.cs | 26 ++-- .../Styling/SelectorTests_Not.cs | 3 + .../Styling/SelectorTests_PropertyEquals.cs | 53 ++++--- .../Styling/SelectorTests_Template.cs | 3 + .../Styling/StyledElementTests.cs | 38 ++--- .../Styling/TestObserver.cs | 4 +- tests/Avalonia.Base.UnitTests/TestVisual.cs | 4 +- .../Utilities/DelegateCommand.cs | 12 +- tests/Avalonia.Base.UnitTests/VisualTests.cs | 6 +- .../WeakEventHandlerManagerTests.cs | 12 +- .../Avalonia.Base.UnitTests/WeakEventTests.cs | 14 +- .../Avalonia.Markup.UnitTests.csproj | 1 + .../Data/BindingTests.cs | 38 ++--- .../Data/BindingTests_Converters.cs | 6 +- .../Data/BindingTests_ElementName.cs | 8 +- .../Data/BindingTests_Logging.cs | 5 +- .../Data/BindingTests_Source.cs | 6 +- .../Data/DynamicReflectableType.cs | 38 ++--- .../Data/MultiBindingTests_Converters.cs | 2 +- .../Data/TemplateBindingTests.cs | 12 +- .../Parsers/ExpressionNodeFactoryTests.cs | 15 +- ...onObserverBuilderTests_AttachedProperty.cs | 16 +- ...onObserverBuilderTests_AvaloniaProperty.cs | 2 +- .../ExpressionObserverBuilderTests_Indexer.cs | 16 +- .../ExpressionObserverBuilderTests_Method.cs | 4 +- ...ExpressionObserverBuilderTests_Negation.cs | 22 +-- .../Avalonia.Markup.Xaml.UnitTests.csproj | 1 + .../AvaloniaPropertyConverterTest.cs | 8 +- .../Converters/ConverterTests.cs | 3 +- .../Converters/GeometryTypeConverterTests.cs | 4 +- .../Converters/MultiValueConverterTests.cs | 4 +- .../PointsListTypeConverterTests.cs | 2 +- .../Converters/ValueConverterTests.cs | 6 +- .../Data/BindingTests.cs | 10 +- .../Data/BindingTests_Method.cs | 26 ++-- .../Data/BindingTests_TemplatedParent.cs | 4 +- .../MarkupExtensions/BindingExtensionTests.cs | 12 +- .../DynamicResourceExtensionTests.cs | 117 +++++++-------- .../OptionsMarkupExtensionTests.cs | 42 +++--- .../StaticResourceExtensionTests.cs | 72 ++++----- .../MarkupExtensions/TestValueConverter.cs | 8 +- .../SetterTests.cs | 2 + .../StyleTests.cs | 2 +- .../TestViewModel.cs | 8 +- .../Xaml/AvaloniaIntrinsicsTests.cs | 12 +- .../Xaml/BasicTests.cs | 67 +++++---- .../Xaml/BindingTests.cs | 88 +++++------ .../Xaml/BindingTests_RelativeSource.cs | 38 ++--- .../Xaml/ControlBindingTests.cs | 12 +- .../Xaml/ControlTemplateTests.cs | 34 +++-- .../Xaml/DataTemplateTests.cs | 34 ++--- .../Xaml/DesignModeTests.cs | 2 +- .../Xaml/EventTests.cs | 4 +- .../Xaml/GenericTemplateTests.cs | 8 +- .../Xaml/IgnoredDirectivesTests.cs | 2 +- .../Xaml/RelativePanelTests.cs | 4 +- .../Xaml/ResourceDictionaryTests.cs | 6 +- .../Xaml/StyleIncludeTests.cs | 13 +- .../Xaml/StyleTests.cs | 71 ++++----- .../Xaml/StyleWithServiceProvider.xaml.cs | 4 +- .../Xaml/ThemeDictionariesTests.cs | 50 +++---- .../Xaml/XamlIlTests.cs | 42 +++--- tests/Avalonia.Skia.UnitTests/HitTesting.cs | 8 +- .../Avalonia.UnitTests.csproj | 1 + .../CompositorTestServices.cs | 42 +++--- .../HarfBuzzGlyphTypefaceImpl.cs | 3 +- .../HarfBuzzTextShaperImpl.cs | 3 +- tests/Avalonia.UnitTests/MockAssetLoader.cs | 13 +- .../MockWindowingPlatform.cs | 14 +- tests/Avalonia.UnitTests/ModuleInitializer.cs | 4 +- tests/Avalonia.UnitTests/MouseTestHelper.cs | 4 +- tests/Avalonia.UnitTests/TestLogSink.cs | 10 +- tests/Avalonia.UnitTests/TestServices.cs | 137 +++++++----------- tests/Avalonia.UnitTests/TouchTestHelper.cs | 3 +- .../Avalonia.UnitTests/UnitTestApplication.cs | 38 ++--- .../UnitTestSynchronizationContext.cs | 15 +- 142 files changed, 1145 insertions(+), 1061 deletions(-) diff --git a/src/Avalonia.Base/Media/IGlyphTypeface.cs b/src/Avalonia.Base/Media/IGlyphTypeface.cs index 09740aac81..ab3080e7c8 100644 --- a/src/Avalonia.Base/Media/IGlyphTypeface.cs +++ b/src/Avalonia.Base/Media/IGlyphTypeface.cs @@ -1,4 +1,5 @@ using System; +using System.Diagnostics.CodeAnalysis; using Avalonia.Metadata; namespace Avalonia.Media @@ -109,6 +110,6 @@ namespace Avalonia.Media /// The table tag to get the data for. /// The contents of the table data for the specified tag. /// Returns true if the content exists, otherwise false. - bool TryGetTable(uint tag, out byte[] table); + bool TryGetTable(uint tag, [NotNullWhen(true)] out byte[]? table); } } diff --git a/src/Avalonia.Base/Utilities/StringSplitter.cs b/src/Avalonia.Base/Utilities/StringSplitter.cs index 95e1049f8f..09dd483ff2 100644 --- a/src/Avalonia.Base/Utilities/StringSplitter.cs +++ b/src/Avalonia.Base/Utilities/StringSplitter.cs @@ -21,7 +21,7 @@ internal static class StringSplitter /// The character that closes a bracketed section. ) by default. /// Options for trimming entries and removing empty entries. /// An array of split segments. Returns an empty array if the input is null or only whitespace. - public static string[] SplitRespectingBrackets(string s, char separator, + public static string[] SplitRespectingBrackets(string? s, char separator, char openingBracket = DefaultOpeningParenthesis, char closingBracket = DefaultClosingParenthesis, StringSplitOptions options = StringSplitOptions.None) => SplitRespectingBrackets(s, [separator], openingBracket, closingBracket, options); @@ -36,7 +36,7 @@ internal static class StringSplitter /// The character that closes a bracketed section. ) by default. /// Options for trimming entries and removing empty entries. /// An array of split segments. Returns an empty array if the input is null or only whitespace. - public static string[] SplitRespectingBrackets(string s, ReadOnlySpan separators, + public static string[] SplitRespectingBrackets(string? s, ReadOnlySpan separators, char openingBracket = DefaultOpeningParenthesis, char closingBracket = DefaultClosingParenthesis, StringSplitOptions options = StringSplitOptions.None) { diff --git a/src/Markup/Avalonia.Markup/Markup/Parsers/ExpressionNodeFactory.cs b/src/Markup/Avalonia.Markup/Markup/Parsers/ExpressionNodeFactory.cs index 59794ceb92..682e1a7067 100644 --- a/src/Markup/Avalonia.Markup/Markup/Parsers/ExpressionNodeFactory.cs +++ b/src/Markup/Avalonia.Markup/Markup/Parsers/ExpressionNodeFactory.cs @@ -20,7 +20,7 @@ namespace Avalonia.Markup.Parsers #endif public static List? CreateFromAst( List astNodes, - Func? typeResolver, + Func? typeResolver, INameScope? nameScope, out bool isRooted) { @@ -111,7 +111,7 @@ namespace Avalonia.Markup.Parsers } private static AvaloniaPropertyAccessorNode AttachedPropertyNode( - Func? typeResolver, + Func? typeResolver, BindingExpressionGrammar.AttachedPropertyNameNode attached) { var type = LookupType(typeResolver, attached.Namespace, attached.TypeName); @@ -121,7 +121,7 @@ namespace Avalonia.Markup.Parsers } private static LogicalAncestorElementNode LogicalAncestorNode( - Func? typeResolver, + Func? typeResolver, BindingExpressionGrammar.AncestorNode ancestor) { Type? type = null; @@ -135,7 +135,7 @@ namespace Avalonia.Markup.Parsers } private static Type LookupType( - Func? typeResolver, + Func? typeResolver, string? @namespace, string? name) { diff --git a/src/Markup/Avalonia.Markup/Markup/Parsers/SelectorParser.cs b/src/Markup/Avalonia.Markup/Markup/Parsers/SelectorParser.cs index 350b07742f..acdfd2f744 100644 --- a/src/Markup/Avalonia.Markup/Markup/Parsers/SelectorParser.cs +++ b/src/Markup/Avalonia.Markup/Markup/Parsers/SelectorParser.cs @@ -13,7 +13,7 @@ namespace Avalonia.Markup.Parsers /// internal class SelectorParser { - private readonly Func _typeResolver; + private readonly Func _typeResolver; /// /// Initializes a new instance of the class. @@ -23,7 +23,7 @@ namespace Avalonia.Markup.Parsers /// a type name and a XML namespace prefix and a type name, and should return the resolved /// type or throw an exception. /// - public SelectorParser(Func typeResolver) + public SelectorParser(Func typeResolver) { _typeResolver = typeResolver; } diff --git a/src/Skia/Avalonia.Skia/GlyphTypefaceImpl.cs b/src/Skia/Avalonia.Skia/GlyphTypefaceImpl.cs index 3dd4bbd7c1..9629f5e462 100644 --- a/src/Skia/Avalonia.Skia/GlyphTypefaceImpl.cs +++ b/src/Skia/Avalonia.Skia/GlyphTypefaceImpl.cs @@ -355,7 +355,7 @@ namespace Avalonia.Skia GC.SuppressFinalize(this); } - public bool TryGetTable(uint tag, out byte[] table) + public bool TryGetTable(uint tag, [NotNullWhen(true)] out byte[]? table) { return SKTypeface.TryGetTableData(tag, out table); } diff --git a/tests/Avalonia.Base.UnitTests/Animation/AnimatableTests.cs b/tests/Avalonia.Base.UnitTests/Animation/AnimatableTests.cs index a76b5a9c3f..fd68687c4c 100644 --- a/tests/Avalonia.Base.UnitTests/Animation/AnimatableTests.cs +++ b/tests/Avalonia.Base.UnitTests/Animation/AnimatableTests.cs @@ -98,7 +98,7 @@ namespace Avalonia.Base.UnitTests.Animation [Theory] [InlineData(null)] //null value [InlineData("stringValue")] //string value - public void Invalid_Values_In_Animation_Should_Not_Crash_Animations(object invalidValue) + public void Invalid_Values_In_Animation_Should_Not_Crash_Animations(object? invalidValue) { var keyframe1 = new KeyFrame() { @@ -226,7 +226,7 @@ namespace Avalonia.Base.UnitTests.Animation 0.5)); target.Invocations.Clear(); - var root = (TestRoot)control.Parent; + var root = (TestRoot?)control.Parent; Assert.NotNull(root); root.Child = null; control.Opacity = 0.8; @@ -675,8 +675,8 @@ namespace Avalonia.Base.UnitTests.Animation } private static Control CreateStyledControl( - ITransition transition1 = null, - ITransition transition2 = null) + ITransition? transition1 = null, + ITransition? transition2 = null) { transition1 = transition1 ?? CreateTarget().Object; transition2 = transition2 ?? CreateTransition(Layoutable.WidthProperty).Object; diff --git a/tests/Avalonia.Base.UnitTests/Animation/KeySplineTests.cs b/tests/Avalonia.Base.UnitTests/Animation/KeySplineTests.cs index 8af1f7ec02..51feb9dcd0 100644 --- a/tests/Avalonia.Base.UnitTests/Animation/KeySplineTests.cs +++ b/tests/Avalonia.Base.UnitTests/Animation/KeySplineTests.cs @@ -19,9 +19,7 @@ namespace Avalonia.Base.UnitTests.Animation { var conv = new KeySplineTypeConverter(); - var keySpline = (KeySpline)conv.ConvertFrom(input); - - Assert.NotNull(keySpline); + var keySpline = Assert.IsAssignableFrom(conv.ConvertFrom(input)); Assert.Equal(1, keySpline.ControlPointX1); Assert.Equal(2, keySpline.ControlPointY1); @@ -36,7 +34,7 @@ namespace Avalonia.Base.UnitTests.Animation { var conv = new KeySplineTypeConverter(); - Assert.ThrowsAny(() => (KeySpline)conv.ConvertFrom(input)); + Assert.ThrowsAny(() => (KeySpline?)conv.ConvertFrom(input)); } [Theory] diff --git a/tests/Avalonia.Base.UnitTests/Animation/SpringTests.cs b/tests/Avalonia.Base.UnitTests/Animation/SpringTests.cs index cb1a3487be..43e01dc37b 100644 --- a/tests/Avalonia.Base.UnitTests/Animation/SpringTests.cs +++ b/tests/Avalonia.Base.UnitTests/Animation/SpringTests.cs @@ -16,7 +16,7 @@ public class SpringTests { var conv = new SpringTypeConverter(); - var spring = (Spring)conv.ConvertFrom(input); + var spring = Assert.IsAssignableFrom(conv.ConvertFrom(input)); Assert.NotNull(spring); Assert.Equal(1, spring.Mass); @@ -32,7 +32,7 @@ public class SpringTests { var conv = new SpringTypeConverter(); - Assert.ThrowsAny(() => (Spring)conv.ConvertFrom(input)); + Assert.ThrowsAny(() => (Spring?)conv.ConvertFrom(input)); } [Fact] diff --git a/tests/Avalonia.Base.UnitTests/Animation/TestClock.cs b/tests/Avalonia.Base.UnitTests/Animation/TestClock.cs index 6604bd29a4..8934dc8c19 100644 --- a/tests/Avalonia.Base.UnitTests/Animation/TestClock.cs +++ b/tests/Avalonia.Base.UnitTests/Animation/TestClock.cs @@ -7,7 +7,7 @@ namespace Avalonia.Base.UnitTests.Animation { private TimeSpan _curTime; - private IObserver _observer; + private IObserver? _observer; public PlayState PlayState { get; set; } = PlayState.Run; diff --git a/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj b/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj index 0f71dac8f2..d82f42ec07 100644 --- a/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj +++ b/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj @@ -12,6 +12,7 @@ + diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Direct.cs b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Direct.cs index a7f00fe943..baa44c6770 100644 --- a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Direct.cs +++ b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Direct.cs @@ -79,8 +79,8 @@ namespace Avalonia.Base.UnitTests target.PropertyChanged += (s, e) => raised = e.Property == Class1.FooProperty && - (string)e.OldValue == "initial" && - (string)e.NewValue == "newvalue" && + (string?)e.OldValue == "initial" && + (string?)e.NewValue == "newvalue" && e.Priority == BindingPriority.LocalValue; target.SetValue(Class1.FooProperty, "newvalue"); @@ -131,13 +131,13 @@ namespace Avalonia.Base.UnitTests public void Bind_Raises_PropertyChanged() { var target = new Class1(); - var source = new Subject>(); + var source = new Subject>(); bool raised = false; target.PropertyChanged += (s, e) => raised = e.Property == Class1.FooProperty && - (string)e.OldValue == "initial" && - (string)e.NewValue == "newvalue" && + (string?)e.OldValue == "initial" && + (string?)e.NewValue == "newvalue" && e.Priority == BindingPriority.LocalValue; target.Bind(Class1.FooProperty, source); @@ -150,7 +150,7 @@ namespace Avalonia.Base.UnitTests public void PropertyChanged_Not_Raised_When_Value_Unchanged() { var target = new Class1(); - var source = new Subject>(); + var source = new Subject>(); var raised = 0; target.PropertyChanged += (s, e) => ++raised; @@ -189,8 +189,8 @@ namespace Avalonia.Base.UnitTests Assert.Same(target, s); Assert.Equal(BindingPriority.LocalValue, e.Priority); Assert.Equal(Class1.FooProperty, e.Property); - Assert.Equal("newvalue", (string)e.OldValue); - Assert.Equal("unset", (string)e.NewValue); + Assert.Equal("newvalue", (string?)e.OldValue); + Assert.Equal("unset", (string?)e.NewValue); ++raised; }; @@ -203,7 +203,7 @@ namespace Avalonia.Base.UnitTests public void GetObservable_Returns_Values() { var target = new Class1(); - List values = new List(); + var values = new List(); target.GetObservable(Class1.FooProperty).Subscribe(x => values.Add(x)); target.Foo = "newvalue"; @@ -428,11 +428,11 @@ namespace Avalonia.Base.UnitTests public void Binding_Error_Reverts_To_Default_Value() { var target = new Class1(); - var source = new Subject>(); + var source = new Subject>(); target.Bind(Class1.FooProperty, source); source.OnNext("initial"); - source.OnNext(BindingValue.BindingError(new InvalidOperationException("Foo"))); + source.OnNext(BindingValue.BindingError(new InvalidOperationException("Foo"))); Assert.Equal("unset", target.GetValue(Class1.FooProperty)); } @@ -441,11 +441,11 @@ namespace Avalonia.Base.UnitTests public void Binding_Error_With_FallbackValue_Causes_Target_Update() { var target = new Class1(); - var source = new Subject>(); + var source = new Subject>(); target.Bind(Class1.FooProperty, source); source.OnNext("initial"); - source.OnNext(BindingValue.BindingError(new InvalidOperationException("Foo"), "bar")); + source.OnNext(BindingValue.BindingError(new InvalidOperationException("Foo"), "bar")); Assert.Equal("bar", target.GetValue(Class1.FooProperty)); } @@ -454,11 +454,11 @@ namespace Avalonia.Base.UnitTests public void DataValidationError_Does_Not_Cause_Target_Update() { var target = new Class1(); - var source = new Subject>(); + var source = new Subject>(); target.Bind(Class1.FooProperty, source); source.OnNext("initial"); - source.OnNext(BindingValue.DataValidationError(new InvalidOperationException("Foo"))); + source.OnNext(BindingValue.DataValidationError(new InvalidOperationException("Foo"))); Assert.Equal("initial", target.GetValue(Class1.FooProperty)); } @@ -467,11 +467,11 @@ namespace Avalonia.Base.UnitTests public void DataValidationError_With_FallbackValue_Causes_Target_Update() { var target = new Class1(); - var source = new Subject>(); + var source = new Subject>(); target.Bind(Class1.FooProperty, source); source.OnNext("initial"); - source.OnNext(BindingValue.DataValidationError(new InvalidOperationException("Foo"), "bar")); + source.OnNext(BindingValue.DataValidationError(new InvalidOperationException("Foo"), "bar")); Assert.Equal("bar", target.GetValue(Class1.FooProperty)); } @@ -480,11 +480,11 @@ namespace Avalonia.Base.UnitTests public void BindingError_With_FallbackValue_Causes_Target_Update() { var target = new Class1(); - var source = new Subject>(); + var source = new Subject>(); target.Bind(Class1.FooProperty, source); source.OnNext("initial"); - source.OnNext(BindingValue.BindingError(new InvalidOperationException("Foo"), "fallback")); + source.OnNext(BindingValue.BindingError(new InvalidOperationException("Foo"), "fallback")); Assert.Equal("fallback", target.GetValue(Class1.FooProperty)); } @@ -589,15 +589,15 @@ namespace Avalonia.Base.UnitTests private class Class1 : AvaloniaObject { - public static readonly DirectProperty FooProperty = - AvaloniaProperty.RegisterDirect( + public static readonly DirectProperty FooProperty = + AvaloniaProperty.RegisterDirect( nameof(Foo), o => o.Foo, (o, v) => o.Foo = v, unsetValue: "unset"); - public static readonly DirectProperty BarProperty = - AvaloniaProperty.RegisterDirect(nameof(Bar), o => o.Bar); + public static readonly DirectProperty BarProperty = + AvaloniaProperty.RegisterDirect(nameof(Bar), o => o.Bar); public static readonly DirectProperty BazProperty = AvaloniaProperty.RegisterDirect( @@ -612,26 +612,26 @@ namespace Avalonia.Base.UnitTests o => o.DoubleValue, (o, v) => o.DoubleValue = v); - public static readonly DirectProperty FrankProperty = - AvaloniaProperty.RegisterDirect( + public static readonly DirectProperty FrankProperty = + AvaloniaProperty.RegisterDirect( nameof(Frank), o => o.Frank, (o, v) => o.Frank = v, unsetValue: "Kups"); - private string _foo = "initial"; - private readonly string _bar = "bar"; + private string? _foo = "initial"; + private readonly string? _bar = "bar"; private int _baz = 5; private double _doubleValue; - private object _frank; + private object? _frank; - public string Foo + public string? Foo { get { return _foo; } set { SetAndRaise(FooProperty, ref _foo, value); } } - public string Bar + public string? Bar { get { return _bar; } } @@ -648,7 +648,7 @@ namespace Avalonia.Base.UnitTests set { SetAndRaise(DoubleValueProperty, ref _doubleValue, value); } } - public object Frank + public object? Frank { get { return _frank; } set { SetAndRaise(FrankProperty, ref _frank, value); } @@ -657,16 +657,16 @@ namespace Avalonia.Base.UnitTests private class Class2 : AvaloniaObject { - public static readonly DirectProperty FooProperty = + public static readonly DirectProperty FooProperty = Class1.FooProperty.AddOwner(o => o.Foo, (o, v) => o.Foo = v); - private string _foo = "initial2"; + private string? _foo = "initial2"; static Class2() { } - public string Foo + public string? Foo { get { return _foo; } set { SetAndRaise(FooProperty, ref _foo, value); } @@ -681,7 +681,7 @@ namespace Avalonia.Base.UnitTests private double _value; - public event PropertyChangedEventHandler PropertyChanged; + public event PropertyChangedEventHandler? PropertyChanged; public double Value { diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_GetValue.cs b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_GetValue.cs index c20b75443c..657bf72408 100644 --- a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_GetValue.cs +++ b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_GetValue.cs @@ -119,9 +119,9 @@ namespace Avalonia.Base.UnitTests FooProperty.OverrideDefaultValue(typeof(Class2), "foooverride"); } - public Class1 Parent + public Class1? Parent { - get { return (Class1)InheritanceParent; } + get { return (Class1?)InheritanceParent; } set { InheritanceParent = value; } } } diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Inheritance.cs b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Inheritance.cs index 707e1d4470..3d10903ff8 100644 --- a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Inheritance.cs +++ b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Inheritance.cs @@ -132,8 +132,8 @@ namespace Avalonia.Base.UnitTests child.PropertyChanged += (s, e) => raised = s == child && e.Property == Class1.BazProperty && - (string)e.OldValue == "bazdefault" && - (string)e.NewValue == "changed" && + (string?)e.OldValue == "bazdefault" && + (string?)e.NewValue == "changed" && e.Priority == BindingPriority.Inherited; child.Parent = parent; @@ -156,8 +156,8 @@ namespace Avalonia.Base.UnitTests child.PropertyChanged += (s, e) => raised = s == child && e.Property == Class1.BazProperty && - (string)e.OldValue == "bazdefault" && - (string)e.NewValue == "changed2" && + (string?)e.OldValue == "bazdefault" && + (string?)e.NewValue == "changed2" && e.Priority == BindingPriority.Inherited; child.Parent = parent; @@ -178,8 +178,8 @@ namespace Avalonia.Base.UnitTests child.PropertyChanged += (s, e) => raised = s == child && e.Property == AttachedOwner.AttachedProperty && - (string)e.OldValue == null && - (string)e.NewValue == "changed"; + (string?)e.OldValue == null && + (string?)e.NewValue == "changed"; child.Parent = parent; @@ -216,8 +216,8 @@ namespace Avalonia.Base.UnitTests child.PropertyChanged += (s, e) => raised = s == child && e.Property == Class1.BazProperty && - (string)e.OldValue == "bazdefault" && - (string)e.NewValue == "changed"; + (string?)e.OldValue == "bazdefault" && + (string?)e.NewValue == "changed"; child.Parent = parent; parent.SetValue(Class1.BazProperty, "changed"); @@ -237,8 +237,8 @@ namespace Avalonia.Base.UnitTests child.PropertyChanged += (s, e) => raised = s == child && e.Property == AttachedOwner.AttachedProperty && - (string)e.OldValue == null && - (string)e.NewValue == "changed"; + (string?)e.OldValue == null && + (string?)e.NewValue == "changed"; child.Parent = parent; parent.SetValue(AttachedOwner.AttachedProperty, "changed"); @@ -260,8 +260,8 @@ namespace Avalonia.Base.UnitTests child.PropertyChanged += (s, e) => raised = s == child && e.Property == Class1.BazProperty && - (string)e.OldValue == "changed" && - (string)e.NewValue == "bazdefault"; + (string?)e.OldValue == "changed" && + (string?)e.NewValue == "bazdefault"; parent.ClearValue(Class1.BazProperty); @@ -379,9 +379,9 @@ namespace Avalonia.Base.UnitTests FooProperty.OverrideDefaultValue(typeof(Class2), "foooverride"); } - public Class1 Parent + public Class1? Parent { - get { return (Class1)InheritanceParent; } + get { return (Class1?)InheritanceParent; } set { InheritanceParent = value; } } } diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Metadata.cs b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Metadata.cs index 2edb3deff0..12f60add00 100644 --- a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Metadata.cs +++ b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Metadata.cs @@ -61,15 +61,15 @@ namespace Avalonia.Base.UnitTests private class Class1 : AvaloniaObject { - public static readonly StyledProperty StyledProperty = - AvaloniaProperty.Register("Styled", "foo"); + public static readonly StyledProperty StyledProperty = + AvaloniaProperty.Register("Styled", "foo"); - public static readonly DirectProperty DirectProperty = - AvaloniaProperty.RegisterDirect("Styled", o => o.Direct, unsetValue: "foo"); + public static readonly DirectProperty DirectProperty = + AvaloniaProperty.RegisterDirect("Styled", o => o.Direct, unsetValue: "foo"); - private string _direct = default; + private string? _direct = null; - public string Direct + public string? Direct { get => _direct; } @@ -80,26 +80,26 @@ namespace Avalonia.Base.UnitTests static Class2() { StyledProperty.OverrideDefaultValue("bar"); - DirectProperty.OverrideMetadata(new DirectPropertyMetadata("bar")); + DirectProperty.OverrideMetadata(new DirectPropertyMetadata("bar")); } } private class Class3 : AvaloniaObject { - public static readonly StyledProperty StyledProperty = + public static readonly StyledProperty StyledProperty = Class1.StyledProperty.AddOwner(); - public static readonly DirectProperty DirectProperty = + public static readonly DirectProperty DirectProperty = Class1.DirectProperty.AddOwner(o => o.Direct, unsetValue: "baz"); - private string _direct = default; + private string? _direct = null; static Class3() { StyledProperty.OverrideDefaultValue("baz"); } - public string Direct + public string? Direct { get => _direct; } diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_MultiBinding.cs b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_MultiBinding.cs index f3cf36998c..ce65e37cb7 100644 --- a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_MultiBinding.cs +++ b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_MultiBinding.cs @@ -76,7 +76,7 @@ namespace Avalonia.Base.UnitTests { var target = new Class1(); - var b = new Subject(); + var b = new Subject(); var mb = new MultiBinding() { @@ -104,7 +104,7 @@ namespace Avalonia.Base.UnitTests { var target = new Class1(); - var b = new Subject(); + var b = new Subject(); var mb = new MultiBinding() { @@ -128,7 +128,7 @@ namespace Avalonia.Base.UnitTests { var target = new FuncMultiValueConverter(v => string.Join(",", v.ToArray())); - object value = target.Convert(new[] { "Foo", "Bar", "Baz" }, typeof(string), null, CultureInfo.InvariantCulture); + object? value = target.Convert(new[] { "Foo", "Bar", "Baz" }, typeof(string), null, CultureInfo.InvariantCulture); Assert.Equal("Foo,Bar,Baz", value); @@ -142,14 +142,14 @@ namespace Avalonia.Base.UnitTests { var target = new FuncMultiValueConverter(v => string.Join(",", v.ToArray())); - IList create(string[] values) => - values.Select(v => (object)(v != null ? new StringValueTypeWrapper() { Value = v } : default)).ToList(); + IList Create(string?[] values) => + values.Select(v => (object?)(v != null ? new StringValueTypeWrapper() { Value = v } : default)).ToList(); - object value = target.Convert(create(new[] { "Foo", "Bar", "Baz" }), typeof(string), null, CultureInfo.InvariantCulture); + var value = target.Convert(Create(new[] { "Foo", "Bar", "Baz" }), typeof(string), null, CultureInfo.InvariantCulture); Assert.Equal("Foo,Bar,Baz", value); - value = target.Convert(create(new[] { null, "Bar", "Baz" }), typeof(string), null, CultureInfo.InvariantCulture); + value = target.Convert(Create(new[] { null, "Bar", "Baz" }), typeof(string), null, CultureInfo.InvariantCulture); Assert.Equal(",Bar,Baz", value); } @@ -157,9 +157,9 @@ namespace Avalonia.Base.UnitTests [Fact] public void MultiValueConverter_Supports_Indexing_The_Parameters() { - var target = new FuncMultiValueConverter(v => v[0]); + var target = new FuncMultiValueConverter(v => v[0]); - object value = target.Convert(new[] { "Foo", "Bar", "Baz" }, typeof(string), null, CultureInfo.InvariantCulture); + var value = target.Convert(new[] { "Foo", "Bar", "Baz" }, typeof(string), null, CultureInfo.InvariantCulture); Assert.Equal("Foo", value); diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_SetCurrentValue.cs b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_SetCurrentValue.cs index ad3f395e4f..6668e02979 100644 --- a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_SetCurrentValue.cs +++ b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_SetCurrentValue.cs @@ -516,9 +516,9 @@ namespace Avalonia.Base.UnitTests private class ViewModel : NotifyingBase { - private string _value; + private string? _value; - public string Value + public string? Value { get => _value; set diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_SetValue.cs b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_SetValue.cs index 99c4ac3d86..a8f521ea5f 100644 --- a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_SetValue.cs +++ b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_SetValue.cs @@ -44,8 +44,8 @@ namespace Avalonia.Base.UnitTests Assert.Same(target, s); Assert.Equal(BindingPriority.Unset, e.Priority); Assert.Equal(Class1.FooProperty, e.Property); - Assert.Equal("newvalue", (string)e.OldValue); - Assert.Equal("foodefault", (string)e.NewValue); + Assert.Equal("newvalue", (string?)e.OldValue); + Assert.Equal("foodefault", (string?)e.NewValue); ++raised; }; @@ -113,8 +113,8 @@ namespace Avalonia.Base.UnitTests { raised = s == target && e.Property == Class1.FooProperty && - (string)e.OldValue == "foodefault" && - (string)e.NewValue == "newvalue"; + (string?)e.OldValue == "foodefault" && + (string?)e.NewValue == "newvalue"; }; target.SetValue(Class1.FooProperty, "newvalue"); @@ -132,8 +132,8 @@ namespace Avalonia.Base.UnitTests { raised = s == target && e.Property == Class1.FooProperty && - (string)e.OldValue == "foodefault" && - (string)e.NewValue == "newvalue"; + (string?)e.OldValue == "foodefault" && + (string?)e.NewValue == "newvalue"; }; target.SetValue(Class1.FooProperty, "newvalue", BindingPriority.Style); @@ -331,6 +331,7 @@ namespace Avalonia.Base.UnitTests Class1 target = new Class1(); var d = target.SetValue(Class1.FooProperty, "foo", BindingPriority.Style); + Assert.NotNull(d); d.Dispose(); Assert.Equal("foodefault", target.GetValue(Class1.FooProperty)); @@ -343,6 +344,7 @@ namespace Avalonia.Base.UnitTests target.SetValue(Class1.FooProperty, "foo", BindingPriority.Style); var d = target.SetValue(Class1.FooProperty, "bar", BindingPriority.Style); + Assert.NotNull(d); d.Dispose(); Assert.Equal("foo", target.GetValue(Class1.FooProperty)); @@ -355,6 +357,7 @@ namespace Avalonia.Base.UnitTests target.SetValue(Class1.FooProperty, "foo", BindingPriority.LocalValue); var d = target.SetValue(Class1.FooProperty, "bar", BindingPriority.Animation); + Assert.NotNull(d); d.Dispose(); Assert.Equal("foo", target.GetValue(Class1.FooProperty)); @@ -380,9 +383,9 @@ namespace Avalonia.Base.UnitTests public static readonly StyledProperty FredProperty = AvaloniaProperty.Register("Fred"); - public Class1 Parent + public Class1? Parent { - get { return (Class1)InheritanceParent; } + get { return (Class1?)InheritanceParent; } set { InheritanceParent = value; } } } diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Threading.cs b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Threading.cs index 7f1251f73e..5c8dd2d476 100644 --- a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Threading.cs +++ b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Threading.cs @@ -143,8 +143,8 @@ namespace Avalonia.Base.UnitTests public static readonly StyledProperty StyledProperty = AvaloniaProperty.Register("Foo", "foodefault"); - public static readonly DirectProperty DirectProperty = - AvaloniaProperty.RegisterDirect("Qux", _ => null, (o, v) => { }); + public static readonly DirectProperty DirectProperty = + AvaloniaProperty.RegisterDirect("Qux", _ => null, (o, v) => { }); } private class TestDipatcherImpl : IDispatcherImpl @@ -157,16 +157,14 @@ namespace Avalonia.Base.UnitTests public bool CurrentThreadIsLoopThread { get; set; } -#pragma warning disable 67 - public event Action Signaled; - public event Action Timer; + public event Action? Signaled { add { } remove { } } + public event Action? Timer { add { } remove { } } public long Now => 0; public void UpdateTimer(long? dueTimeInMs) { throw new NotImplementedException(); } public void Signal() => throw new NotImplementedException(); -#pragma warning restore 67 } diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaPropertyTests.cs b/tests/Avalonia.Base.UnitTests/AvaloniaPropertyTests.cs index 041cbfff85..1fcad0a5e0 100644 --- a/tests/Avalonia.Base.UnitTests/AvaloniaPropertyTests.cs +++ b/tests/Avalonia.Base.UnitTests/AvaloniaPropertyTests.cs @@ -72,7 +72,6 @@ namespace Avalonia.Base.UnitTests public void OverrideMetadata_Should_Merge_Values() { var metadata = new TestMetadata(BindingMode.TwoWay); - var notify = (Action)((a, b) => { }); var overridden = new TestMetadata(); var target = new TestProperty("test", typeof(Class1), metadata); @@ -107,7 +106,7 @@ namespace Avalonia.Base.UnitTests public void Changed_Observable_Fired() { var target = new Class1(); - string value = null; + string? value = null; Class1.FooProperty.Changed.Subscribe(x => value = x.NewValue.GetValueOrDefault()); target.SetValue(Class1.FooProperty, "newvalue"); @@ -119,7 +118,7 @@ namespace Avalonia.Base.UnitTests public void Changed_Observable_Fired_Only_On_Effective_Value_Change() { var target = new Class1(); - var result = new List(); + var result = new List(); Class1.FooProperty.Changed.Subscribe(x => result.Add(x.NewValue.GetValueOrDefault())); target.SetValue(Class1.FooProperty, "animated", BindingPriority.Animation); @@ -149,7 +148,7 @@ namespace Avalonia.Base.UnitTests Assert.False(p1 == null); Assert.False(null == p1); Assert.False(p1.Equals(null)); - Assert.True((AvaloniaProperty)null == (AvaloniaProperty)null); + Assert.True((AvaloniaProperty?)null == (AvaloniaProperty?)null); } [Fact] @@ -162,11 +161,11 @@ namespace Avalonia.Base.UnitTests private class TestMetadata : AvaloniaPropertyMetadata { - public Action OwnerSpecificAction { get; } + public Action? OwnerSpecificAction { get; } public TestMetadata(BindingMode defaultBindingMode = BindingMode.Default, bool? enableDataValidation = null, - Action ownerSpecificAction = null) + Action? ownerSpecificAction = null) : base(defaultBindingMode, enableDataValidation) { OwnerSpecificAction = ownerSpecificAction; @@ -178,7 +177,7 @@ namespace Avalonia.Base.UnitTests private class TestProperty : AvaloniaProperty { - public TestProperty(string name, Type ownerType, TestMetadata metadata = null) + public TestProperty(string name, Type ownerType, TestMetadata? metadata = null) : base(name, ownerType, ownerType, metadata ?? new TestMetadata()) { } @@ -190,7 +189,7 @@ namespace Avalonia.Base.UnitTests internal override IDisposable RouteBind( AvaloniaObject o, - IObservable source, + IObservable source, BindingPriority priority) { throw new NotImplementedException(); @@ -218,13 +217,13 @@ namespace Avalonia.Base.UnitTests internal override IDisposable RouteSetValue( AvaloniaObject o, - object value, + object? value, BindingPriority priority) { throw new NotImplementedException(); } - internal override void RouteSetCurrentValue(AvaloniaObject o, object value) + internal override void RouteSetCurrentValue(AvaloniaObject o, object? value) { throw new NotImplementedException(); } diff --git a/tests/Avalonia.Base.UnitTests/Collections/AvaloniaDictionaryTests.cs b/tests/Avalonia.Base.UnitTests/Collections/AvaloniaDictionaryTests.cs index 35fd946670..ebcb799741 100644 --- a/tests/Avalonia.Base.UnitTests/Collections/AvaloniaDictionaryTests.cs +++ b/tests/Avalonia.Base.UnitTests/Collections/AvaloniaDictionaryTests.cs @@ -22,6 +22,7 @@ namespace Avalonia.Base.UnitTests.Collections Assert.NotNull(tracker.Args); Assert.Equal(NotifyCollectionChangedAction.Add, tracker.Args.Action); Assert.Equal(-1, tracker.Args.NewStartingIndex); + Assert.NotNull(tracker.Args.NewItems); Assert.Equal(1, tracker.Args.NewItems.Count); Assert.Equal(new KeyValuePair("foo", "bar"), tracker.Args.NewItems[0]); } @@ -48,6 +49,7 @@ namespace Avalonia.Base.UnitTests.Collections Assert.NotNull(tracker.Args); Assert.Equal(NotifyCollectionChangedAction.Add, tracker.Args.Action); Assert.Equal(-1, tracker.Args.NewStartingIndex); + Assert.NotNull(tracker.Args.NewItems); Assert.Equal(1, tracker.Args.NewItems.Count); Assert.Equal(new KeyValuePair("foo", "bar"), tracker.Args.NewItems[0]); } @@ -64,6 +66,7 @@ namespace Avalonia.Base.UnitTests.Collections Assert.NotNull(tracker.Args); Assert.Equal(NotifyCollectionChangedAction.Replace, tracker.Args.Action); Assert.Equal(-1, tracker.Args.NewStartingIndex); + Assert.NotNull(tracker.Args.NewItems); Assert.Equal(1, tracker.Args.NewItems.Count); Assert.Equal(new KeyValuePair("foo", "bar"), tracker.Args.NewItems[0]); } @@ -103,6 +106,7 @@ namespace Avalonia.Base.UnitTests.Collections Assert.NotNull(tracker.Args); Assert.Equal(NotifyCollectionChangedAction.Remove, tracker.Args.Action); Assert.Equal(-1, tracker.Args.OldStartingIndex); + Assert.NotNull(tracker.Args.OldItems); Assert.Equal(1, tracker.Args.OldItems.Count); Assert.Equal(new KeyValuePair("foo", "bar"), tracker.Args.OldItems[0]); } @@ -142,6 +146,7 @@ namespace Avalonia.Base.UnitTests.Collections Assert.NotNull(tracker.Args); Assert.Equal(NotifyCollectionChangedAction.Remove, tracker.Args.Action); Assert.Equal(-1, tracker.Args.OldStartingIndex); + Assert.NotNull(tracker.Args.OldItems); Assert.Equal(2, tracker.Args.OldItems.Count); Assert.Equal(new KeyValuePair("foo", "bar"), tracker.Args.OldItems[0]); } @@ -164,7 +169,7 @@ namespace Avalonia.Base.UnitTests.Collections { Assert.Throws(() => { - var target = new AvaloniaDictionary(null, null); + var target = new AvaloniaDictionary(null!, null); }); } diff --git a/tests/Avalonia.Base.UnitTests/Collections/AvaloniaListTests.cs b/tests/Avalonia.Base.UnitTests/Collections/AvaloniaListTests.cs index 82c7a0eac8..e30eca2dd1 100644 --- a/tests/Avalonia.Base.UnitTests/Collections/AvaloniaListTests.cs +++ b/tests/Avalonia.Base.UnitTests/Collections/AvaloniaListTests.cs @@ -25,7 +25,7 @@ namespace Avalonia.Base.UnitTests.Collections { var target = new AvaloniaList(); - Assert.Throws(() => target.AddRange(null)); + Assert.Throws(() => target.AddRange(null!)); } [Fact] @@ -33,7 +33,7 @@ namespace Avalonia.Base.UnitTests.Collections { var target = new AvaloniaList(); - Assert.Throws(() => target.RemoveAll(null)); + Assert.Throws(() => target.RemoveAll(null!)); } [Fact] @@ -41,7 +41,7 @@ namespace Avalonia.Base.UnitTests.Collections { var target = new AvaloniaList(); - Assert.Throws(() => target.InsertRange(1, null)); + Assert.Throws(() => target.InsertRange(1, null!)); } [Fact] @@ -140,6 +140,7 @@ namespace Avalonia.Base.UnitTests.Collections { Assert.Equal(target, s); Assert.Equal(NotifyCollectionChangedAction.Add, e.Action); + Assert.NotNull(e.NewItems); Assert.Equal(new[] { 3 }, e.NewItems.Cast()); Assert.Equal(2, e.NewStartingIndex); @@ -161,6 +162,7 @@ namespace Avalonia.Base.UnitTests.Collections { Assert.Equal(target, s); Assert.Equal(NotifyCollectionChangedAction.Add, e.Action); + Assert.NotNull(e.NewItems); Assert.Equal(new[] { 3, 4 }, e.NewItems.Cast()); Assert.Equal(2, e.NewStartingIndex); @@ -198,6 +200,7 @@ namespace Avalonia.Base.UnitTests.Collections target.CollectionChanged += (sender, args) => { + Assert.NotNull(args.NewItems); eventItems.AddRange(args.NewItems.Cast()); }; @@ -216,7 +219,9 @@ namespace Avalonia.Base.UnitTests.Collections { Assert.Equal(target, s); Assert.Equal(NotifyCollectionChangedAction.Replace, e.Action); + Assert.NotNull(e.OldItems); Assert.Equal(new[] { 2 }, e.OldItems.Cast()); + Assert.NotNull(e.NewItems); Assert.Equal(new[] { 3 }, e.NewItems.Cast()); Assert.Equal(1, e.OldStartingIndex); Assert.Equal(1, e.NewStartingIndex); @@ -239,6 +244,7 @@ namespace Avalonia.Base.UnitTests.Collections { Assert.Equal(target, s); Assert.Equal(NotifyCollectionChangedAction.Add, e.Action); + Assert.NotNull(e.NewItems); Assert.Equal(new[] { 3 }, e.NewItems.Cast()); Assert.Equal(1, e.NewStartingIndex); @@ -260,6 +266,7 @@ namespace Avalonia.Base.UnitTests.Collections { Assert.Equal(target, s); Assert.Equal(NotifyCollectionChangedAction.Add, e.Action); + Assert.NotNull(e.NewItems); Assert.Equal(new[] { 3, 4 }, e.NewItems.Cast()); Assert.Equal(1, e.NewStartingIndex); @@ -281,6 +288,7 @@ namespace Avalonia.Base.UnitTests.Collections { Assert.Equal(target, s); Assert.Equal(NotifyCollectionChangedAction.Remove, e.Action); + Assert.NotNull(e.OldItems); Assert.Equal(new[] { 3 }, e.OldItems.Cast()); Assert.Equal(2, e.OldStartingIndex); @@ -302,7 +310,9 @@ namespace Avalonia.Base.UnitTests.Collections { Assert.Equal(target, s); Assert.Equal(NotifyCollectionChangedAction.Move, e.Action); + Assert.NotNull(e.OldItems); Assert.Equal(new[] { 3 }, e.OldItems.Cast()); + Assert.NotNull(e.NewItems); Assert.Equal(new[] { 3 }, e.NewItems.Cast()); Assert.Equal(2, e.OldStartingIndex); Assert.Equal(0, e.NewStartingIndex); @@ -325,7 +335,9 @@ namespace Avalonia.Base.UnitTests.Collections { Assert.Equal(target, s); Assert.Equal(NotifyCollectionChangedAction.Move, e.Action); + Assert.NotNull(e.OldItems); Assert.Equal(new[] { 2, 3 }, e.OldItems.Cast()); + Assert.NotNull(e.NewItems); Assert.Equal(new[] { 2, 3 }, e.NewItems.Cast()); Assert.Equal(1, e.OldStartingIndex); Assert.Equal(0, e.NewStartingIndex); @@ -368,6 +380,7 @@ namespace Avalonia.Base.UnitTests.Collections { Assert.Equal(target, s); Assert.Equal(NotifyCollectionChangedAction.Remove, e.Action); + Assert.NotNull(e.OldItems); Assert.Equal(new[] { 1, 2, 3 }, e.OldItems.Cast()); Assert.Equal(0, e.OldStartingIndex); @@ -580,7 +593,7 @@ namespace Avalonia.Base.UnitTests.Collections return; - void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs actualEvent) + void OnCollectionChanged(object? sender, NotifyCollectionChangedEventArgs actualEvent) { Assert.Multiple(() => { diff --git a/tests/Avalonia.Base.UnitTests/Collections/CollectionChangedTracker.cs b/tests/Avalonia.Base.UnitTests/Collections/CollectionChangedTracker.cs index eb43aafa02..bf030669bd 100644 --- a/tests/Avalonia.Base.UnitTests/Collections/CollectionChangedTracker.cs +++ b/tests/Avalonia.Base.UnitTests/Collections/CollectionChangedTracker.cs @@ -10,14 +10,14 @@ namespace Avalonia.Base.UnitTests.Collections collection.CollectionChanged += CollectionChanged; } - public NotifyCollectionChangedEventArgs Args { get; private set; } + public NotifyCollectionChangedEventArgs? Args { get; private set; } public void Reset() { Args = null; } - private void CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) + private void CollectionChanged(object? sender, NotifyCollectionChangedEventArgs e) { if (Args != null) { diff --git a/tests/Avalonia.Base.UnitTests/Collections/PropertyChangedTracker.cs b/tests/Avalonia.Base.UnitTests/Collections/PropertyChangedTracker.cs index cb4e2fc2de..bd3c28317a 100644 --- a/tests/Avalonia.Base.UnitTests/Collections/PropertyChangedTracker.cs +++ b/tests/Avalonia.Base.UnitTests/Collections/PropertyChangedTracker.cs @@ -1,4 +1,3 @@ -using System; using System.Collections.Generic; using System.ComponentModel; @@ -8,18 +7,18 @@ namespace Avalonia.Base.UnitTests.Collections { public PropertyChangedTracker(INotifyPropertyChanged obj) { - Names = new List(); + Names = []; obj.PropertyChanged += PropertyChanged; } - public List Names { get; } + public List Names { get; } public void Reset() { Names.Clear(); } - private void PropertyChanged(object sender, PropertyChangedEventArgs e) + private void PropertyChanged(object? sender, PropertyChangedEventArgs e) { Names.Add(e.PropertyName); } diff --git a/tests/Avalonia.Base.UnitTests/Composition/BatchStreamTests.cs b/tests/Avalonia.Base.UnitTests/Composition/BatchStreamTests.cs index 5118ac7f71..c8c69d0fa6 100644 --- a/tests/Avalonia.Base.UnitTests/Composition/BatchStreamTests.cs +++ b/tests/Avalonia.Base.UnitTests/Composition/BatchStreamTests.cs @@ -13,7 +13,7 @@ public class BatchStreamTests { var data = new BatchStreamData(); var memPool = new BatchStreamMemoryPool(false, 100, _ => { }); - var objPool = new BatchStreamObjectPool(false, 10, _ => { }); + var objPool = new BatchStreamObjectPool(false, 10, _ => { }); var guids = new List(); var objects = new List(); @@ -42,4 +42,4 @@ public class BatchStreamTests } -} \ No newline at end of file +} diff --git a/tests/Avalonia.Base.UnitTests/Composition/CompositionAnimationTests.cs b/tests/Avalonia.Base.UnitTests/Composition/CompositionAnimationTests.cs index 646e33a841..85f791fe7d 100644 --- a/tests/Avalonia.Base.UnitTests/Composition/CompositionAnimationTests.cs +++ b/tests/Avalonia.Base.UnitTests/Composition/CompositionAnimationTests.cs @@ -82,7 +82,7 @@ public class CompositionAnimationTests : ScopedTestBase var compositor = new Compositor(new RenderLoop(new CompositorTestServices.ManualRenderTimer()), null); var target = compositor.CreateSolidColorVisual(); - var ani = new ScalarKeyFrameAnimation(null); + var ani = new ScalarKeyFrameAnimation(compositor); foreach (var frame in data.Frames) ani.InsertKeyFrame(frame.key, frame.value, new LinearEasing()); ani.Duration = TimeSpan.FromSeconds(1); diff --git a/tests/Avalonia.Base.UnitTests/Data/Core/BindingExpressionTests.DataValidation.cs b/tests/Avalonia.Base.UnitTests/Data/Core/BindingExpressionTests.DataValidation.cs index 2a57026576..8dd75fedf0 100644 --- a/tests/Avalonia.Base.UnitTests/Data/Core/BindingExpressionTests.DataValidation.cs +++ b/tests/Avalonia.Base.UnitTests/Data/Core/BindingExpressionTests.DataValidation.cs @@ -6,8 +6,6 @@ using Avalonia.Data; using Avalonia.UnitTests; using Xunit; -#nullable enable - namespace Avalonia.Base.UnitTests.Data.Core; public partial class BindingExpressionTests @@ -373,11 +371,12 @@ public partial class BindingExpressionTests public override bool HasErrors => _mustBePositive >= 0; - public override IEnumerable? GetErrors(string propertyName) + public override IEnumerable GetErrors(string? propertyName) { - IList? result; - _errors.TryGetValue(propertyName, out result); - return result; + if (propertyName is not null && _errors.TryGetValue(propertyName, out var result)) + return result; + + return Array.Empty(); } } @@ -392,7 +391,7 @@ public partial class BindingExpressionTests } public override bool HasErrors => false; - public override IEnumerable? GetErrors(string propertyName) => null; + public override IEnumerable GetErrors(string? propertyName) => Array.Empty(); } private class DataAnnotationsViewModel : NotifyingBase @@ -420,14 +419,14 @@ public partial class BindingExpressionTests public override bool HasErrors => RequiredString is null; - public override IEnumerable? GetErrors(string propertyName) + public override IEnumerable GetErrors(string? propertyName) { if (propertyName == nameof(RequiredString) && RequiredString is null) { return new[] { "String is required!" }; } - return null; + return Array.Empty(); } } diff --git a/tests/Avalonia.Base.UnitTests/Data/Core/BindingExpressionTests.Observable.cs b/tests/Avalonia.Base.UnitTests/Data/Core/BindingExpressionTests.Observable.cs index 5665553aab..37b9c81203 100644 --- a/tests/Avalonia.Base.UnitTests/Data/Core/BindingExpressionTests.Observable.cs +++ b/tests/Avalonia.Base.UnitTests/Data/Core/BindingExpressionTests.Observable.cs @@ -43,7 +43,7 @@ public partial class BindingExpressionTests using var sync = UnitTestSynchronizationContext.Begin(); var source = new BehaviorSubject(new() { StringValue = "foo" }); var data = new ViewModel { NextObservable = source }; - var target = CreateTargetWithSource(data, o => o.NextObservable.StreamBinding().StringValue); + var target = CreateTargetWithSource(data, o => o.NextObservable!.StreamBinding().StringValue); Assert.Equal("foo", target.String); diff --git a/tests/Avalonia.Base.UnitTests/Data/Core/IndeiBase.cs b/tests/Avalonia.Base.UnitTests/Data/Core/IndeiBase.cs index 84054e009d..82e71e4c3f 100644 --- a/tests/Avalonia.Base.UnitTests/Data/Core/IndeiBase.cs +++ b/tests/Avalonia.Base.UnitTests/Data/Core/IndeiBase.cs @@ -8,18 +8,18 @@ namespace Avalonia.Base.UnitTests.Data.Core { internal abstract class IndeiBase : NotifyingBase, INotifyDataErrorInfo { - private EventHandler _errorsChanged; + private EventHandler? _errorsChanged; public abstract bool HasErrors { get; } public int ErrorsChangedSubscriptionCount { get; private set; } - public event EventHandler ErrorsChanged + public event EventHandler? ErrorsChanged { add { _errorsChanged += value; ++ErrorsChangedSubscriptionCount; } remove { _errorsChanged -= value; --ErrorsChangedSubscriptionCount; } } - public abstract IEnumerable GetErrors(string propertyName); + public abstract IEnumerable GetErrors(string? propertyName); protected void RaiseErrorsChanged([CallerMemberName] string propertyName = "") { diff --git a/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/DataAnnotationsValidationPluginTests.cs b/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/DataAnnotationsValidationPluginTests.cs index 7570fe9539..95e709c1cd 100644 --- a/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/DataAnnotationsValidationPluginTests.cs +++ b/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/DataAnnotationsValidationPluginTests.cs @@ -18,7 +18,7 @@ namespace Avalonia.Base.UnitTests.Data.Core.Plugins var target = new DataAnnotationsValidationPlugin(); var data = new Data(); - Assert.True(target.Match(new WeakReference(data), nameof(Data.Between5And10))); + Assert.True(target.Match(new WeakReference(data), nameof(Data.Between5And10))); } [Fact] @@ -27,7 +27,7 @@ namespace Avalonia.Base.UnitTests.Data.Core.Plugins var target = new DataAnnotationsValidationPlugin(); var data = new Data(); - Assert.True(target.Match(new WeakReference(data), nameof(Data.PhoneNumber))); + Assert.True(target.Match(new WeakReference(data), nameof(Data.PhoneNumber))); } [Fact] @@ -36,7 +36,7 @@ namespace Avalonia.Base.UnitTests.Data.Core.Plugins var target = new DataAnnotationsValidationPlugin(); var data = new Data(); - Assert.False(target.Match(new WeakReference(data), nameof(Data.Unvalidated))); + Assert.False(target.Match(new WeakReference(data), nameof(Data.Unvalidated))); } [Fact] @@ -45,9 +45,10 @@ namespace Avalonia.Base.UnitTests.Data.Core.Plugins var inpcAccessorPlugin = new InpcPropertyAccessorPlugin(); var validatorPlugin = new DataAnnotationsValidationPlugin(); var data = new Data(); - var accessor = inpcAccessorPlugin.Start(new WeakReference(data), nameof(data.Between5And10)); - var validator = validatorPlugin.Start(new WeakReference(data), nameof(data.Between5And10), accessor); - var result = new List(); + var accessor = inpcAccessorPlugin.Start(new WeakReference(data), nameof(data.Between5And10)); + Assert.NotNull(accessor); + var validator = validatorPlugin.Start(new WeakReference(data), nameof(data.Between5And10), accessor); + var result = new List(); var errmsg = new RangeAttribute(5, 10).FormatErrorMessage(nameof(Data.Between5And10)); @@ -77,9 +78,10 @@ namespace Avalonia.Base.UnitTests.Data.Core.Plugins var inpcAccessorPlugin = new InpcPropertyAccessorPlugin(); var validatorPlugin = new DataAnnotationsValidationPlugin(); var data = new Data(); - var accessor = inpcAccessorPlugin.Start(new WeakReference(data), nameof(data.PhoneNumber)); - var validator = validatorPlugin.Start(new WeakReference(data), nameof(data.PhoneNumber), accessor); - var result = new List(); + var accessor = inpcAccessorPlugin.Start(new WeakReference(data), nameof(data.PhoneNumber)); + Assert.NotNull(accessor); + var validator = validatorPlugin.Start(new WeakReference(data), nameof(data.PhoneNumber), accessor); + var result = new List(); validator.Subscribe(x => result.Add(x)); validator.SetValue("123456", BindingPriority.LocalValue); @@ -88,10 +90,10 @@ namespace Avalonia.Base.UnitTests.Data.Core.Plugins Assert.Equal(3, result.Count); Assert.Equal(new BindingNotification(null), result[0]); Assert.Equal(new BindingNotification("123456"), result[1]); - var errorResult = (BindingNotification)result[2]; + var errorResult = Assert.IsAssignableFrom(result[2]); Assert.Equal(BindingErrorType.DataValidationError, errorResult.ErrorType); Assert.Equal("abcdefghijklm", errorResult.Value); - var exceptions = ((AggregateException)(errorResult.Error)).InnerExceptions; + var exceptions = Assert.IsAssignableFrom(errorResult.Error).InnerExceptions; Assert.True(exceptions.Any(ex => ex.Message.Contains("The PhoneNumber field is not a valid phone number."))); Assert.True(exceptions.Any(ex => @@ -108,7 +110,7 @@ namespace Avalonia.Base.UnitTests.Data.Core.Plugins [Phone] [MaxLength(10)] - public string PhoneNumber { get; set; } + public string? PhoneNumber { get; set; } } } } diff --git a/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/ExceptionValidationPluginTests.cs b/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/ExceptionValidationPluginTests.cs index 73bb9ba2ff..a348b2992d 100644 --- a/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/ExceptionValidationPluginTests.cs +++ b/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/ExceptionValidationPluginTests.cs @@ -15,9 +15,10 @@ namespace Avalonia.Base.UnitTests.Data.Core.Plugins var inpcAccessorPlugin = new InpcPropertyAccessorPlugin(); var validatorPlugin = new ExceptionValidationPlugin(); var data = new Data(); - var accessor = inpcAccessorPlugin.Start(new WeakReference(data), nameof(data.MustBePositive)); - var validator = validatorPlugin.Start(new WeakReference(data), nameof(data.MustBePositive), accessor); - var result = new List(); + var accessor = inpcAccessorPlugin.Start(new WeakReference(data), nameof(data.MustBePositive)); + Assert.NotNull(accessor); + var validator = validatorPlugin.Start(new WeakReference(data), nameof(data.MustBePositive), accessor); + var result = new List(); validator.Subscribe(x => result.Add(x)); validator.SetValue(5, BindingPriority.LocalValue); diff --git a/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/IndeiValidationPluginTests.cs b/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/IndeiValidationPluginTests.cs index e8f1f38b90..c16675954e 100644 --- a/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/IndeiValidationPluginTests.cs +++ b/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/IndeiValidationPluginTests.cs @@ -16,9 +16,10 @@ namespace Avalonia.Base.UnitTests.Data.Core.Plugins var inpcAccessorPlugin = new InpcPropertyAccessorPlugin(); var validatorPlugin = new IndeiValidationPlugin(); var data = new Data { Maximum = 5 }; - var accessor = inpcAccessorPlugin.Start(new WeakReference(data), nameof(data.Value)); - var validator = validatorPlugin.Start(new WeakReference(data), nameof(data.Value), accessor); - var result = new List(); + var accessor = inpcAccessorPlugin.Start(new WeakReference(data), nameof(data.Value)); + Assert.NotNull(accessor); + var validator = validatorPlugin.Start(new WeakReference(data), nameof(data.Value), accessor); + var result = new List(); validator.Subscribe(x => result.Add(x)); validator.SetValue(5, BindingPriority.LocalValue); @@ -51,8 +52,9 @@ namespace Avalonia.Base.UnitTests.Data.Core.Plugins var inpcAccessorPlugin = new InpcPropertyAccessorPlugin(); var validatorPlugin = new IndeiValidationPlugin(); var data = new Data { Maximum = 5 }; - var accessor = inpcAccessorPlugin.Start(new WeakReference(data), nameof(data.Value)); - var validator = validatorPlugin.Start(new WeakReference(data), nameof(data.Value), accessor); + var accessor = inpcAccessorPlugin.Start(new WeakReference(data), nameof(data.Value)); + Assert.NotNull(accessor); + var validator = validatorPlugin.Start(new WeakReference(data), nameof(data.Value), accessor); Assert.Equal(0, data.ErrorsChangedSubscriptionCount); validator.Subscribe(_ => { }); @@ -67,7 +69,7 @@ namespace Avalonia.Base.UnitTests.Data.Core.Plugins { private int _value; private int _maximum; - private string _error; + private string? _error; public override bool HasErrors => _error != null; @@ -92,14 +94,14 @@ namespace Avalonia.Base.UnitTests.Data.Core.Plugins } } - public override IEnumerable GetErrors(string propertyName) + public override IEnumerable GetErrors(string? propertyName) { if (propertyName == nameof(Value) && _error != null) { return new[] { _error }; } - return null; + return Array.Empty(); } private void UpdateError() diff --git a/tests/Avalonia.Base.UnitTests/Data/DefaultValueConverterTests.cs b/tests/Avalonia.Base.UnitTests/Data/DefaultValueConverterTests.cs index 7cf84d767a..8371d75ed9 100644 --- a/tests/Avalonia.Base.UnitTests/Data/DefaultValueConverterTests.cs +++ b/tests/Avalonia.Base.UnitTests/Data/DefaultValueConverterTests.cs @@ -190,9 +190,9 @@ namespace Avalonia.Base.UnitTests.Data null, CultureInfo.InvariantCulture); - Assert.IsAssignableFrom(result); + var command = Assert.IsAssignableFrom(result); - (result as ICommand).Execute(5); + command.Execute(5); Assert.Equal(5, commandResult); } @@ -208,9 +208,9 @@ namespace Avalonia.Base.UnitTests.Data null, CultureInfo.InvariantCulture); - Assert.IsAssignableFrom(result); + var command = Assert.IsAssignableFrom(result); - (result as ICommand).Execute(null); + command.Execute(null); Assert.Equal(1, commandResult); } @@ -246,7 +246,7 @@ namespace Avalonia.Base.UnitTests.Data Value = value; } - public override bool Equals(object obj) + public override bool Equals(object? obj) { return obj is CustomType other && this.Value == other.Value; } @@ -259,22 +259,22 @@ namespace Avalonia.Base.UnitTests.Data private class CustomTypeConverter : TypeConverter { - public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) + public override bool CanConvertTo(ITypeDescriptorContext? context, Type? destinationType) { return destinationType == typeof(int); } - public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) + public override bool CanConvertFrom(ITypeDescriptorContext? context, Type sourceType) { return sourceType == typeof(int); } - public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) + public override object ConvertTo(ITypeDescriptorContext? context, CultureInfo? culture, object? value, Type destinationType) { - return ((CustomType)value).Value; + return ((CustomType)value!).Value; } - public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) + public override object ConvertFrom(ITypeDescriptorContext? context, CultureInfo? culture, object value) { return new CustomType((int)value); } diff --git a/tests/Avalonia.Base.UnitTests/Data/ReflectionClrPropertyInfoTests.cs b/tests/Avalonia.Base.UnitTests/Data/ReflectionClrPropertyInfoTests.cs index 5c51dd0c06..3f4d73c828 100644 --- a/tests/Avalonia.Base.UnitTests/Data/ReflectionClrPropertyInfoTests.cs +++ b/tests/Avalonia.Base.UnitTests/Data/ReflectionClrPropertyInfoTests.cs @@ -7,7 +7,7 @@ public class ReflectionClrPropertyInfoTests { public class TestClass { - public string Test { get; set; } + public string? Test { get; set; } } [Fact] @@ -19,6 +19,6 @@ public class ReflectionClrPropertyInfoTests const string result = "qwerty"; propertyInfo.Set(target, result); Assert.Equal(result, target.Test); - Assert.Equal(result, (string)propertyInfo.Get(target)); + Assert.Equal(result, (string?)propertyInfo.Get(target)); } } diff --git a/tests/Avalonia.Base.UnitTests/Data/StringConvertersTests.cs b/tests/Avalonia.Base.UnitTests/Data/StringConvertersTests.cs index b9ae0ac750..6235f7ee73 100644 --- a/tests/Avalonia.Base.UnitTests/Data/StringConvertersTests.cs +++ b/tests/Avalonia.Base.UnitTests/Data/StringConvertersTests.cs @@ -10,7 +10,7 @@ public class StringConvertersTests [InlineData("hello", false)] [InlineData("", true)] [InlineData(null, true)] - public void StringConverters_IsNullOrEmpty_Works(string input, bool expected) + public void StringConverters_IsNullOrEmpty_Works(string? input, bool expected) { var converter = StringConverters.IsNullOrEmpty; var result = converter.Convert(input, typeof(bool), null, CultureInfo.CurrentCulture); @@ -21,7 +21,7 @@ public class StringConvertersTests [InlineData("hello", true)] [InlineData("", false)] [InlineData(null, false)] - public void StringConverters_IsNotNullOrEmpty_Works(string input, bool expected) + public void StringConverters_IsNotNullOrEmpty_Works(string? input, bool expected) { var converter = StringConverters.IsNotNullOrEmpty; var result = converter.Convert(input, typeof(bool), null, CultureInfo.CurrentCulture); diff --git a/tests/Avalonia.Base.UnitTests/DirectPropertyTests.cs b/tests/Avalonia.Base.UnitTests/DirectPropertyTests.cs index 3e41117788..62fc9f5965 100644 --- a/tests/Avalonia.Base.UnitTests/DirectPropertyTests.cs +++ b/tests/Avalonia.Base.UnitTests/DirectPropertyTests.cs @@ -8,11 +8,11 @@ namespace Avalonia.Base.UnitTests [Fact] public void IsDirect_Property_Returns_True() { - var target = new DirectProperty( + var target = new DirectProperty( "test", o => null, null, - new DirectPropertyMetadata()); + new DirectPropertyMetadata()); Assert.True(target.IsDirect); } @@ -68,12 +68,12 @@ namespace Avalonia.Base.UnitTests private class Class1 : AvaloniaObject { - public static readonly DirectProperty FooProperty = - AvaloniaProperty.RegisterDirect(nameof(Foo), o => o.Foo, (o, v) => o.Foo = v); + public static readonly DirectProperty FooProperty = + AvaloniaProperty.RegisterDirect(nameof(Foo), o => o.Foo, (o, v) => o.Foo = v); - private string _foo = "foo"; + private string? _foo = "foo"; - public string Foo + public string? Foo { get { return _foo; } set { SetAndRaise(FooProperty, ref _foo, value); } diff --git a/tests/Avalonia.Base.UnitTests/DispatcherTests.cs b/tests/Avalonia.Base.UnitTests/DispatcherTests.cs index 92871db682..801f93438a 100644 --- a/tests/Avalonia.Base.UnitTests/DispatcherTests.cs +++ b/tests/Avalonia.Base.UnitTests/DispatcherTests.cs @@ -25,8 +25,8 @@ public partial class DispatcherTests AskedForSignal = true; } - public event Action Signaled; - public event Action Timer; + public event Action? Signaled; + public event Action? Timer; public long? NextTimer { get; private set; } public bool AskedForSignal { get; private set; } @@ -64,7 +64,7 @@ public partial class DispatcherTests class SimpleDispatcherWithBackgroundProcessingImpl : SimpleDispatcherImpl, IDispatcherImplWithExplicitBackgroundProcessing { public bool AskedForBackgroundProcessing { get; private set; } - public event Action ReadyForBackgroundProcessing; + public event Action? ReadyForBackgroundProcessing; public void RequestBackgroundProcessing() { if (!CurrentThreadIsLoopThread) @@ -607,7 +607,6 @@ public partial class DispatcherTests Dispatcher.UIThread.MainLoop(tokenSource.Token); } -#nullable enable private class AsyncLocalTestClass { public AsyncLocal AsyncLocalField { get; set; } = new AsyncLocal(); @@ -776,6 +775,5 @@ public partial class DispatcherTests Assert.NotEqual("sux-Shaw-UM", oldCulture.Name); } } -#nullable restore } diff --git a/tests/Avalonia.Base.UnitTests/Input/InputElement_Focus.cs b/tests/Avalonia.Base.UnitTests/Input/InputElement_Focus.cs index 9a08be7d37..7755eb80cf 100644 --- a/tests/Avalonia.Base.UnitTests/Input/InputElement_Focus.cs +++ b/tests/Avalonia.Base.UnitTests/Input/InputElement_Focus.cs @@ -485,11 +485,12 @@ namespace Avalonia.Base.UnitTests.Input Assert.True(root.Classes.Contains(":focus-within")); Assert.True(root.IsKeyboardFocusWithin); - Assert.Equal(KeyboardDevice.Instance.FocusedElement, target1); + var keyboardDevice = KeyboardDevice.Instance!; + Assert.Equal(keyboardDevice.FocusedElement, target1); root.Child = null; - Assert.Null(KeyboardDevice.Instance.FocusedElement); + Assert.Null(keyboardDevice.FocusedElement); Assert.False(target1.IsFocused); Assert.False(target1.Classes.Contains(":focus-within")); @@ -541,7 +542,7 @@ namespace Avalonia.Base.UnitTests.Input Assert.True(root1.Classes.Contains(":focus-within")); Assert.True(root1.IsKeyboardFocusWithin); - Assert.Equal(KeyboardDevice.Instance.FocusedElement, target1); + Assert.Equal(KeyboardDevice.Instance!.FocusedElement, target1); target2.Focus(); @@ -622,7 +623,7 @@ namespace Avalonia.Base.UnitTests.Input innerButton.Focus(); // Remove the focused control from the tree. - ((Panel)innerButton.Parent).Children.Remove(innerButton); + ((Panel)innerButton.Parent!).Children.Remove(innerButton); var focusManager = Assert.IsType(root.FocusManager); Assert.Same(outerButton, focusManager.GetFocusedElement()); @@ -658,7 +659,7 @@ namespace Avalonia.Base.UnitTests.Input innerButton.Focus(); // Remove the inner focus scope. - ((Panel)innerScope.Parent).Children.Remove(innerScope); + ((Panel)innerScope.Parent!).Children.Remove(innerScope); var focusManager = Assert.IsType(root.FocusManager); Assert.Same(outerButton, focusManager.GetFocusedElement()); @@ -795,6 +796,7 @@ namespace Avalonia.Base.UnitTests.Input }; var focusManager = FocusManager.GetFocusManager(container); + Assert.NotNull(focusManager); target1.Focus(); var next = focusManager.FindNextElement(NavigationDirection.Next); @@ -841,6 +843,7 @@ namespace Avalonia.Base.UnitTests.Input root.ExecuteInitialLayoutPass(); var focusManager = FocusManager.GetFocusManager(container); + Assert.NotNull(focusManager); target1.Focus(); var options = new FindNextElementOptions() @@ -892,6 +895,7 @@ namespace Avalonia.Base.UnitTests.Input }; var focusManager = FocusManager.GetFocusManager(container); + Assert.NotNull(focusManager); var hasMoved = focusManager.TryMoveFocus(NavigationDirection.Next); @@ -939,6 +943,7 @@ namespace Avalonia.Base.UnitTests.Input }; var focusManager = FocusManager.GetFocusManager(container); + Assert.NotNull(focusManager); center.Focus(); diff --git a/tests/Avalonia.Base.UnitTests/Input/KeyboardNavigationTests_Custom.cs b/tests/Avalonia.Base.UnitTests/Input/KeyboardNavigationTests_Custom.cs index 830f7223ec..ffcdbdd0e1 100644 --- a/tests/Avalonia.Base.UnitTests/Input/KeyboardNavigationTests_Custom.cs +++ b/tests/Avalonia.Base.UnitTests/Input/KeyboardNavigationTests_Custom.cs @@ -203,9 +203,9 @@ namespace Avalonia.Base.UnitTests.Input private class CustomNavigatingStackPanel : StackPanel, ICustomKeyboardNavigation { public bool CustomNavigates { get; set; } = true; - public IInputElement NextControl { get; set; } + public IInputElement? NextControl { get; set; } - public (bool handled, IInputElement next) GetNext(IInputElement element, NavigationDirection direction) + public (bool handled, IInputElement? next) GetNext(IInputElement element, NavigationDirection direction) { return (CustomNavigates, NextControl); } diff --git a/tests/Avalonia.Base.UnitTests/Input/KeyboardNavigationTests_Tab.cs b/tests/Avalonia.Base.UnitTests/Input/KeyboardNavigationTests_Tab.cs index 1cdbd9f028..e5b1d3c1d5 100644 --- a/tests/Avalonia.Base.UnitTests/Input/KeyboardNavigationTests_Tab.cs +++ b/tests/Avalonia.Base.UnitTests/Input/KeyboardNavigationTests_Tab.cs @@ -1169,7 +1169,7 @@ namespace Avalonia.Base.UnitTests.Input } }; - var result = new List(); + var result = new List(); var current = (IInputElement)start; do @@ -1215,14 +1215,14 @@ namespace Avalonia.Base.UnitTests.Input } }; - var result = new List(); + var result = new List(); var current = (IInputElement)start; do { result.Add(((Control)current).Name); current = KeyboardNavigationHandler.GetNext(current, NavigationDirection.Previous); - } while (current is object && current != start); + } while (current is not null && current != start); Assert.Equal(new[] { diff --git a/tests/Avalonia.Base.UnitTests/Input/MouseDeviceTests.cs b/tests/Avalonia.Base.UnitTests/Input/MouseDeviceTests.cs index 8aabd22b08..b81c8aefd6 100644 --- a/tests/Avalonia.Base.UnitTests/Input/MouseDeviceTests.cs +++ b/tests/Avalonia.Base.UnitTests/Input/MouseDeviceTests.cs @@ -80,7 +80,7 @@ namespace Avalonia.Base.UnitTests.Input }, renderer.Object); // Synthesize event to receive a pointer. - IPointer result = null; + IPointer? result = null; root.PointerMoved += (_, a) => { result = a.Pointer; diff --git a/tests/Avalonia.Base.UnitTests/Input/PointerTests.cs b/tests/Avalonia.Base.UnitTests/Input/PointerTests.cs index 912ce5b6a6..1f95c755ce 100644 --- a/tests/Avalonia.Base.UnitTests/Input/PointerTests.cs +++ b/tests/Avalonia.Base.UnitTests/Input/PointerTests.cs @@ -22,7 +22,7 @@ namespace Avalonia.Base.UnitTests.Input (newParent = new Border { Child = newCapture = new Border() }) } }; - var receivers = new List(); + var receivers = new List(); var root = new TestRoot(el); foreach (InputElement d in root.GetSelfAndVisualDescendants()) d.PointerCaptureLost += (s, e) => receivers.Add(s); diff --git a/tests/Avalonia.Base.UnitTests/Input/TouchDeviceTests.cs b/tests/Avalonia.Base.UnitTests/Input/TouchDeviceTests.cs index 0653d49191..a83122099e 100644 --- a/tests/Avalonia.Base.UnitTests/Input/TouchDeviceTests.cs +++ b/tests/Avalonia.Base.UnitTests/Input/TouchDeviceTests.cs @@ -24,7 +24,7 @@ namespace Avalonia.Input.UnitTests isTapped = true; executedTimes++; }; - TapOnce(InputManager.Instance, touchDevice, root); + TapOnce(InputManager.Instance!, touchDevice, root); Assert.True(isTapped); Assert.Equal(1, executedTimes); @@ -49,8 +49,9 @@ namespace Avalonia.Input.UnitTests { tappedExecutedTimes++; }; - TapOnce(InputManager.Instance, touchDevice, root); - TapOnce(InputManager.Instance, touchDevice, root, touchPointId: 1); + var inputManager = InputManager.Instance!; + TapOnce(inputManager, touchDevice, root); + TapOnce(inputManager, touchDevice, root, touchPointId: 1); Assert.Equal(1, tappedExecutedTimes); Assert.True(isDoubleTapped); Assert.Equal(1, doubleTappedExecutedTimes); @@ -75,9 +76,10 @@ namespace Avalonia.Input.UnitTests pointerPressedClicks = e.ClickCount; pointerPressedExecutedTimes++; }; + var inputManager = InputManager.Instance!; for (int i = 0; i < clickCount; i++) { - TapOnce(InputManager.Instance, touchDevice, root, touchPointId: i); + TapOnce(inputManager, touchDevice, root, touchPointId: i); } Assert.Equal(clickCount, pointerPressedExecutedTimes); @@ -103,8 +105,9 @@ namespace Avalonia.Input.UnitTests { tappedExecutedTimes++; }; - TapOnce(InputManager.Instance, touchDevice, root); - TapOnce(InputManager.Instance, touchDevice, root, 21, 1); + var inputManager = InputManager.Instance!; + TapOnce(inputManager, touchDevice, root); + TapOnce(inputManager, touchDevice, root, 21, 1); Assert.Equal(2, tappedExecutedTimes); Assert.False(isDoubleTapped); Assert.Equal(0, doubleTappedExecutedTimes); @@ -130,8 +133,9 @@ namespace Avalonia.Input.UnitTests { tappedExecutedTimes++; }; - SendXTouchContactsWithIds(InputManager.Instance, touchDevice, root, RawPointerEventType.TouchBegin, 0, 1); - SendXTouchContactsWithIds(InputManager.Instance, touchDevice, root, RawPointerEventType.TouchEnd, 0, 1); + var inputManager = InputManager.Instance!; + SendXTouchContactsWithIds(inputManager, touchDevice, root, RawPointerEventType.TouchBegin, 0, 1); + SendXTouchContactsWithIds(inputManager, touchDevice, root, RawPointerEventType.TouchEnd, 0, 1); Assert.Equal(2, tappedExecutedTimes); Assert.False(isDoubleTapped); Assert.Equal(0, doubleTappedExecutedTimes); @@ -191,14 +195,15 @@ namespace Avalonia.Input.UnitTests { tappedExecutedTimes++; }; - SendXTouchContactsWithIds(InputManager.Instance, touchDevice, root, RawPointerEventType.TouchBegin, 0, 1); - SendXTouchContactsWithIds(InputManager.Instance, touchDevice, root, RawPointerEventType.TouchEnd, 0, 1); - TapOnce(InputManager.Instance, touchDevice, root, touchPointId: 2); - TapOnce(InputManager.Instance, touchDevice, root, touchPointId: 3); - TapOnce(InputManager.Instance, touchDevice, root, touchPointId: 4); - SendXTouchContactsWithIds(InputManager.Instance, touchDevice, root, RawPointerEventType.TouchBegin, 5, 6, 7); - SendXTouchContactsWithIds(InputManager.Instance, touchDevice, root, RawPointerEventType.TouchEnd, 5, 6, 7); - TapOnce(InputManager.Instance, touchDevice, root, touchPointId: 8); + var inputManager = InputManager.Instance!; + SendXTouchContactsWithIds(inputManager, touchDevice, root, RawPointerEventType.TouchBegin, 0, 1); + SendXTouchContactsWithIds(inputManager, touchDevice, root, RawPointerEventType.TouchEnd, 0, 1); + TapOnce(inputManager, touchDevice, root, touchPointId: 2); + TapOnce(inputManager, touchDevice, root, touchPointId: 3); + TapOnce(inputManager, touchDevice, root, touchPointId: 4); + SendXTouchContactsWithIds(inputManager, touchDevice, root, RawPointerEventType.TouchBegin, 5, 6, 7); + SendXTouchContactsWithIds(inputManager, touchDevice, root, RawPointerEventType.TouchEnd, 5, 6, 7); + TapOnce(inputManager, touchDevice, root, touchPointId: 8); Assert.Equal(6, tappedExecutedTimes); Assert.Equal(9, pointerPressedExecutedTimes); Assert.True(isDoubleTapped); diff --git a/tests/Avalonia.Base.UnitTests/Interactivity/InteractiveTests.cs b/tests/Avalonia.Base.UnitTests/Interactivity/InteractiveTests.cs index 49119c3830..9ffbbe181d 100644 --- a/tests/Avalonia.Base.UnitTests/Interactivity/InteractiveTests.cs +++ b/tests/Avalonia.Base.UnitTests/Interactivity/InteractiveTests.cs @@ -13,8 +13,8 @@ namespace Avalonia.Base.UnitTests.Interactivity public void Direct_Event_Should_Go_Straight_To_Source() { var ev = new RoutedEvent("test", RoutingStrategies.Direct, typeof(RoutedEventArgs), typeof(TestInteractive)); - var invoked = new List(); - EventHandler handler = (s, e) => invoked.Add(((TestInteractive)s).Name); + var invoked = new List(); + EventHandler handler = (s, e) => invoked.Add(((TestInteractive)s!).Name); var target = CreateTree(ev, handler, RoutingStrategies.Direct); var args = new RoutedEventArgs(ev, target); @@ -47,8 +47,8 @@ namespace Avalonia.Base.UnitTests.Interactivity public void Bubbling_Event_Should_Bubble_Up() { var ev = new RoutedEvent("test", RoutingStrategies.Bubble, typeof(RoutedEventArgs), typeof(TestInteractive)); - var invoked = new List(); - EventHandler handler = (s, e) => invoked.Add(((TestInteractive)s).Name); + var invoked = new List(); + EventHandler handler = (s, e) => invoked.Add(((TestInteractive)s!).Name); var target = CreateTree(ev, handler, RoutingStrategies.Bubble | RoutingStrategies.Tunnel); var args = new RoutedEventArgs(ev, target); @@ -61,8 +61,8 @@ namespace Avalonia.Base.UnitTests.Interactivity public void Tunneling_Event_Should_Tunnel() { var ev = new RoutedEvent("test", RoutingStrategies.Tunnel, typeof(RoutedEventArgs), typeof(TestInteractive)); - var invoked = new List(); - EventHandler handler = (s, e) => invoked.Add(((TestInteractive)s).Name); + var invoked = new List(); + EventHandler handler = (s, e) => invoked.Add(((TestInteractive)s!).Name); var target = CreateTree(ev, handler, RoutingStrategies.Bubble | RoutingStrategies.Tunnel); var args = new RoutedEventArgs(ev, target); @@ -79,8 +79,8 @@ namespace Avalonia.Base.UnitTests.Interactivity RoutingStrategies.Bubble | RoutingStrategies.Tunnel, typeof(RoutedEventArgs), typeof(TestInteractive)); - var invoked = new List(); - EventHandler handler = (s, e) => invoked.Add(((TestInteractive)s).Name); + var invoked = new List(); + EventHandler handler = (s, e) => invoked.Add(((TestInteractive)s!).Name); var target = CreateTree(ev, handler, RoutingStrategies.Bubble | RoutingStrategies.Tunnel); var args = new RoutedEventArgs(ev, target); @@ -118,11 +118,11 @@ namespace Avalonia.Base.UnitTests.Interactivity public void Handled_Bubbled_Event_Should_Not_Propogate_Further() { var ev = new RoutedEvent("test", RoutingStrategies.Bubble, typeof(RoutedEventArgs), typeof(TestInteractive)); - var invoked = new List(); + var invoked = new List(); EventHandler handler = (s, e) => { - var t = (TestInteractive)s; + var t = (TestInteractive)s!; invoked.Add(t.Name); e.Handled = t.Name == "2b"; }; @@ -143,11 +143,11 @@ namespace Avalonia.Base.UnitTests.Interactivity RoutingStrategies.Bubble | RoutingStrategies.Tunnel, typeof(RoutedEventArgs), typeof(TestInteractive)); - var invoked = new List(); + var invoked = new List(); EventHandler handler = (s, e) => { - var t = (TestInteractive)s; + var t = (TestInteractive)s!; invoked.Add(t.Name); e.Handled = t.Name == "2b"; }; @@ -239,11 +239,11 @@ namespace Avalonia.Base.UnitTests.Interactivity RoutingStrategies.Bubble | RoutingStrategies.Tunnel, typeof(RoutedEventArgs), typeof(TestInteractive)); - var invoked = new List(); + var invoked = new List(); EventHandler handler = (s, e) => { - invoked.Add(((TestInteractive)s).Name); + invoked.Add(((TestInteractive)s!).Name); e.Handled = true; }; @@ -263,8 +263,8 @@ namespace Avalonia.Base.UnitTests.Interactivity RoutingStrategies.Direct, typeof(RoutedEventArgs), typeof(TestInteractive)); - var invoked = new List(); - EventHandler handler = (s, e) => invoked.Add(((TestInteractive)s).Name); + var invoked = new List(); + EventHandler handler = (s, e) => invoked.Add(((TestInteractive)s!).Name); var target = CreateTree(ev, null, 0); @@ -284,8 +284,8 @@ namespace Avalonia.Base.UnitTests.Interactivity RoutingStrategies.Bubble | RoutingStrategies.Tunnel, typeof(RoutedEventArgs), typeof(TestInteractive)); - var invoked = new List(); - EventHandler handler = (s, e) => invoked.Add(((TestInteractive)s).Name); + var invoked = new List(); + EventHandler handler = (s, e) => invoked.Add(((TestInteractive)s!).Name); var target = CreateTree(ev, null, 0); @@ -305,8 +305,8 @@ namespace Avalonia.Base.UnitTests.Interactivity RoutingStrategies.Bubble | RoutingStrategies.Tunnel, typeof(RoutedEventArgs), typeof(TestInteractive)); - var invoked = new List(); - EventHandler handler = (s, e) => invoked.Add(((TestInteractive)s).Name); + var invoked = new List(); + EventHandler handler = (s, e) => invoked.Add(((TestInteractive)s!).Name); var target = CreateTree(ev, null, 0); @@ -334,7 +334,9 @@ namespace Avalonia.Base.UnitTests.Interactivity target.RaiseEvent(args); Assert.True(target.ClassHandlerInvoked); - Assert.True(target.GetVisualParent().ClassHandlerInvoked); + var interactive = target.GetVisualParent(); + Assert.NotNull(interactive); + Assert.True(interactive.ClassHandlerInvoked); } [Fact] @@ -355,7 +357,9 @@ namespace Avalonia.Base.UnitTests.Interactivity Assert.True(args.Handled); Assert.True(target.ClassHandlerInvoked); - Assert.True(target.GetVisualParent().ClassHandlerInvoked); + var interactive = target.GetVisualParent(); + Assert.NotNull(interactive); + Assert.True(interactive.ClassHandlerInvoked); } [Fact] @@ -381,8 +385,8 @@ namespace Avalonia.Base.UnitTests.Interactivity { // Issue #3176 var ev = new RoutedEvent("test", RoutingStrategies.Bubble, typeof(RoutedEventArgs), typeof(TestInteractive)); - var invoked = new List(); - EventHandler handler = (s, e) => invoked.Add(((TestInteractive)s).Name); + var invoked = new List(); + EventHandler handler = (s, e) => invoked.Add(((TestInteractive)s!).Name); var parent = CreateTree(ev, handler, RoutingStrategies.Bubble | RoutingStrategies.Tunnel); var target = (Interactive)parent.GetVisualChildren().Single(); @@ -401,7 +405,7 @@ namespace Avalonia.Base.UnitTests.Interactivity private static TestInteractive CreateTree( RoutedEvent ev, - EventHandler handler, + EventHandler? handler, RoutingStrategies handlerRoutes, bool handledEventsToo = false) { @@ -444,19 +448,19 @@ namespace Avalonia.Base.UnitTests.Interactivity private class TestInteractive : Interactive { public bool ClassHandlerInvoked { get; private set; } - public new string Name { get; set; } + public new string? Name { get; set; } public IEnumerable Children { get { - return ((Visual)this).VisualChildren.AsEnumerable(); + return VisualChildren.AsEnumerable(); } set { VisualChildren.Clear(); - VisualChildren.AddRange(value.Cast()); + VisualChildren.AddRange(value); } } diff --git a/tests/Avalonia.Base.UnitTests/Layout/LayoutTestControl.cs b/tests/Avalonia.Base.UnitTests/Layout/LayoutTestControl.cs index d85c7ed9bc..8988613db5 100644 --- a/tests/Avalonia.Base.UnitTests/Layout/LayoutTestControl.cs +++ b/tests/Avalonia.Base.UnitTests/Layout/LayoutTestControl.cs @@ -8,8 +8,8 @@ namespace Avalonia.Base.UnitTests.Layout { public bool Measured { get; set; } public bool Arranged { get; set; } - public Func DoMeasureOverride { get; set; } - public Func DoArrangeOverride { get; set; } + public Func? DoMeasureOverride { get; set; } + public Func? DoArrangeOverride { get; set; } public bool CallBaseMeasure { get; set; } public bool CallBaseArrange { get; set; } diff --git a/tests/Avalonia.Base.UnitTests/Layout/LayoutTestRoot.cs b/tests/Avalonia.Base.UnitTests/Layout/LayoutTestRoot.cs index c8fe0eb89f..b69d1c7162 100644 --- a/tests/Avalonia.Base.UnitTests/Layout/LayoutTestRoot.cs +++ b/tests/Avalonia.Base.UnitTests/Layout/LayoutTestRoot.cs @@ -8,8 +8,8 @@ namespace Avalonia.Base.UnitTests.Layout { public bool Measured { get; set; } public bool Arranged { get; set; } - public Func DoMeasureOverride { get; set; } - public Func DoArrangeOverride { get; set; } + public Func? DoMeasureOverride { get; set; } + public Func? DoArrangeOverride { get; set; } protected override Size MeasureOverride(Size availableSize) { diff --git a/tests/Avalonia.Base.UnitTests/Layout/LayoutableTests.cs b/tests/Avalonia.Base.UnitTests/Layout/LayoutableTests.cs index 5784c46964..900caf0340 100644 --- a/tests/Avalonia.Base.UnitTests/Layout/LayoutableTests.cs +++ b/tests/Avalonia.Base.UnitTests/Layout/LayoutableTests.cs @@ -188,7 +188,7 @@ namespace Avalonia.Base.UnitTests.Layout }; var raised = 0; - void ValidateBounds(object sender, EventArgs e) + void ValidateBounds(object? sender, EventArgs e) { Assert.Equal(new Rect(0, 0, 100, 100), border1.Bounds); Assert.Equal(new Rect(0, 0, 100, 100), border2.Bounds); @@ -225,7 +225,7 @@ namespace Avalonia.Base.UnitTests.Layout LayoutManager = layoutManager.Object, }; - void Handler(object sender, EventArgs e) {} + void Handler(object? sender, EventArgs e) {} layoutManager.Invocations.Clear(); target.LayoutUpdated += Handler; diff --git a/tests/Avalonia.Base.UnitTests/Layout/LayoutableTests_EffectiveViewportChanged.cs b/tests/Avalonia.Base.UnitTests/Layout/LayoutableTests_EffectiveViewportChanged.cs index 8ec87484f0..551c988b9e 100644 --- a/tests/Avalonia.Base.UnitTests/Layout/LayoutableTests_EffectiveViewportChanged.cs +++ b/tests/Avalonia.Base.UnitTests/Layout/LayoutableTests_EffectiveViewportChanged.cs @@ -401,7 +401,7 @@ namespace Avalonia.Base.UnitTests.Layout var target = new Canvas(); var raised = 0; - void OnTargetOnEffectiveViewportChanged(object s, EffectiveViewportChangedEventArgs e) + void OnTargetOnEffectiveViewportChanged(object? s, EffectiveViewportChangedEventArgs e) { target.EffectiveViewportChanged -= OnTargetOnEffectiveViewportChanged; ++raised; @@ -460,9 +460,9 @@ namespace Avalonia.Base.UnitTests.Layout TestRoot root, ScrollViewer scroller, Control target, - Action handler) + Action handler) { - void ViewportChanged(object sender, EffectiveViewportChangedEventArgs e) + void ViewportChanged(object? sender, EffectiveViewportChangedEventArgs e) { handler(sender, e); } diff --git a/tests/Avalonia.Base.UnitTests/Logging/LoggingTests.cs b/tests/Avalonia.Base.UnitTests/Logging/LoggingTests.cs index d70f269b38..4da8ad61b0 100644 --- a/tests/Avalonia.Base.UnitTests/Logging/LoggingTests.cs +++ b/tests/Avalonia.Base.UnitTests/Logging/LoggingTests.cs @@ -31,10 +31,10 @@ namespace Avalonia.Base.UnitTests.Logging calledTimes++; } }); - var panel = window.FindControl("panel"); - var rect = window.FindControl("rect"); + var panel = window.GetControl("panel"); + var rect = window.GetControl("rect"); window.ApplyTemplate(); - ((Control)window.Presenter).ApplyTemplate(); + window.Presenter!.ApplyTemplate(); panel.Children.Remove(rect); Assert.Equal(0, calledTimes); } @@ -63,7 +63,7 @@ namespace Avalonia.Base.UnitTests.Logging }); var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); window.ApplyTemplate(); - ((Control)window.Presenter).ApplyTemplate(); + window.Presenter!.ApplyTemplate(); Assert.Equal(1, calledTimes); } } diff --git a/tests/Avalonia.Base.UnitTests/Media/ColorTests.cs b/tests/Avalonia.Base.UnitTests/Media/ColorTests.cs index 1ed3ea50b9..52680eb59b 100644 --- a/tests/Avalonia.Base.UnitTests/Media/ColorTests.cs +++ b/tests/Avalonia.Base.UnitTests/Media/ColorTests.cs @@ -183,7 +183,7 @@ namespace Avalonia.Base.UnitTests.Media [Fact] public void Parse_Throws_ArgumentNullException_For_Null_Input() { - Assert.Throws(() => Color.Parse((string)null)); + Assert.Throws(() => Color.Parse(null!)); } [Fact] @@ -195,7 +195,7 @@ namespace Avalonia.Base.UnitTests.Media [Theory] [InlineData("")] [InlineData(null)] - public void TryParse_Returns_False_For_Invalid_Input(string input) + public void TryParse_Returns_False_For_Invalid_Input(string? input) { Assert.False(Color.TryParse(input, out _)); } diff --git a/tests/Avalonia.Base.UnitTests/Media/FontFamilyTests.cs b/tests/Avalonia.Base.UnitTests/Media/FontFamilyTests.cs index 745aa438bc..d35388c443 100644 --- a/tests/Avalonia.Base.UnitTests/Media/FontFamilyTests.cs +++ b/tests/Avalonia.Base.UnitTests/Media/FontFamilyTests.cs @@ -130,7 +130,7 @@ namespace Avalonia.Base.UnitTests.Media [InlineData(null, "resm:Avalonia.Visuals.UnitTests.Assets.Fonts#MyFont")] [InlineData("avares://Avalonia.Visuals.UnitTests/Assets/Fonts", "/#MyFont")] [InlineData("avares://Avalonia.Visuals.UnitTests", "/Assets/Fonts#MyFont")] - public void Should_Create_FontFamily_From_Uri_With_Base_Uri(string @base, string name) + public void Should_Create_FontFamily_From_Uri_With_Base_Uri(string? @base, string name) { var baseUri = @base != null ? new Uri(@base) : null; @@ -147,7 +147,7 @@ namespace Avalonia.Base.UnitTests.Media [InlineData("avares://Avalonia.Fonts.Inter", "/Assets#Inter", "Inter", "avares://Avalonia.Fonts.Inter/Assets")] [InlineData("avares://ControlCatalog/MainWindow.xaml", "avares://Avalonia.Fonts.Inter/Assets#Inter", "Inter", "avares://Avalonia.Fonts.Inter/Assets")] [Theory] - public void Should_Parse_FontFamily_With_BaseUri(string baseUri, string s, string expectedName, string expectedUri) + public void Should_Parse_FontFamily_With_BaseUri(string? baseUri, string s, string expectedName, string? expectedUri) { var b = baseUri is not null ? new Uri(baseUri) : null; @@ -184,10 +184,12 @@ namespace Avalonia.Base.UnitTests.Media } else { + Assert.NotNull(fontUri); fontUri = new Uri(fontUri, sourceUri); } } + Assert.NotNull(fontUri); Assert.Equal(expectedUri, fontUri.AbsoluteUri); } } diff --git a/tests/Avalonia.Base.UnitTests/Media/FontManagerTests.cs b/tests/Avalonia.Base.UnitTests/Media/FontManagerTests.cs index fe72a9dfd1..9bca3b5de4 100644 --- a/tests/Avalonia.Base.UnitTests/Media/FontManagerTests.cs +++ b/tests/Avalonia.Base.UnitTests/Media/FontManagerTests.cs @@ -30,8 +30,8 @@ namespace Avalonia.Base.UnitTests.Media { using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface .With(fontManagerImpl: new HeadlessFontManagerWithMultipleSystemFontsStub( - installedFontFamilyNames: new string[] { }, - defaultFamilyName: null)))) + installedFontFamilyNames: [], + defaultFamilyName: null!)))) { Assert.Throws(() => FontManager.Current); } @@ -82,8 +82,8 @@ namespace Avalonia.Base.UnitTests.Media { using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface .With(fontManagerImpl: new HeadlessFontManagerWithMultipleSystemFontsStub( - installedFontFamilyNames: new[] { "DejaVu", "Verdana" }, - defaultFamilyName: null)))) + installedFontFamilyNames: ["DejaVu", "Verdana"], + defaultFamilyName: null!)))) { Assert.Equal("DejaVu", FontManager.Current.DefaultFontFamily.Name); } diff --git a/tests/Avalonia.Base.UnitTests/Media/Fonts/FamilyNameCollectionTests.cs b/tests/Avalonia.Base.UnitTests/Media/Fonts/FamilyNameCollectionTests.cs index 07415ac2d6..eed4416ec3 100644 --- a/tests/Avalonia.Base.UnitTests/Media/Fonts/FamilyNameCollectionTests.cs +++ b/tests/Avalonia.Base.UnitTests/Media/Fonts/FamilyNameCollectionTests.cs @@ -9,7 +9,7 @@ namespace Avalonia.Base.UnitTests.Media.Fonts [Fact] public void Exception_Should_Be_Thrown_If_Names_Is_Null() { - Assert.Throws(() => new FamilyNameCollection(null)); + Assert.Throws(() => new FamilyNameCollection(null!)); } [Fact] diff --git a/tests/Avalonia.Base.UnitTests/Media/Fonts/FontFamilyKeyTests.cs b/tests/Avalonia.Base.UnitTests/Media/Fonts/FontFamilyKeyTests.cs index 0cb70ea016..96b5963dc8 100644 --- a/tests/Avalonia.Base.UnitTests/Media/Fonts/FontFamilyKeyTests.cs +++ b/tests/Avalonia.Base.UnitTests/Media/Fonts/FontFamilyKeyTests.cs @@ -9,7 +9,7 @@ namespace Avalonia.Base.UnitTests.Media.Fonts [Fact] public void Exception_Should_Be_Thrown_If_Source_Is_Null() { - Assert.Throws(() => new FontFamilyKey(null)); + Assert.Throws(() => new FontFamilyKey(null!)); } [Fact] diff --git a/tests/Avalonia.Base.UnitTests/Media/PathMarkupParserTests.cs b/tests/Avalonia.Base.UnitTests/Media/PathMarkupParserTests.cs index 755ab7ff25..bba5ce514d 100644 --- a/tests/Avalonia.Base.UnitTests/Media/PathMarkupParserTests.cs +++ b/tests/Avalonia.Base.UnitTests/Media/PathMarkupParserTests.cs @@ -19,6 +19,7 @@ namespace Avalonia.Base.UnitTests.Media { parser.Parse("M10 10"); + Assert.NotNull(pathGeometry.Figures); var figure = pathGeometry.Figures[0]; Assert.Equal(new Point(10, 10), figure.StartPoint); @@ -34,8 +35,10 @@ namespace Avalonia.Base.UnitTests.Media { parser.Parse("M0 0L10 10"); + Assert.NotNull(pathGeometry.Figures); var figure = pathGeometry.Figures[0]; + Assert.NotNull(figure.Segments); var segment = figure.Segments[0]; Assert.IsType(segment); @@ -55,6 +58,7 @@ namespace Avalonia.Base.UnitTests.Media { parser.Parse("M0 0L10 10z"); + Assert.NotNull(pathGeometry.Figures); var figure = pathGeometry.Figures[0]; Assert.True(figure.IsClosed); @@ -86,8 +90,10 @@ namespace Avalonia.Base.UnitTests.Media { parser.Parse(pathData); + Assert.NotNull(pathGeometry.Figures); var figure = pathGeometry.Figures[0]; + Assert.NotNull(figure.Segments); var segment = figure.Segments[0]; Assert.IsType(segment); @@ -118,8 +124,10 @@ namespace Avalonia.Base.UnitTests.Media { parser.Parse(pathData); + Assert.NotNull(pathGeometry.Figures); var figure = pathGeometry.Figures[0]; + Assert.NotNull(figure.Segments); var segment = figure.Segments[0]; Assert.IsType(segment); @@ -147,6 +155,7 @@ namespace Avalonia.Base.UnitTests.Media { parser.Parse("M -1.01725E-005 -1.01725e-005"); + Assert.NotNull(pathGeometry.Figures); var figure = pathGeometry.Figures[0]; Assert.Equal( @@ -281,6 +290,7 @@ namespace Avalonia.Base.UnitTests.Media { parser.Parse("M10,10L100,100Z m10,10"); + Assert.NotNull(pathGeometry.Figures); Assert.Equal(2, pathGeometry.Figures.Count); var figure = pathGeometry.Figures[0]; @@ -289,6 +299,7 @@ namespace Avalonia.Base.UnitTests.Media Assert.Equal(true, figure.IsClosed); + Assert.NotNull(figure.Segments); Assert.Equal(new Point(100, 100), ((LineSegment)figure.Segments[0]).Point); figure = pathGeometry.Figures[1]; @@ -306,6 +317,7 @@ namespace Avalonia.Base.UnitTests.Media { parser.Parse("a.898.898 0 01.27.188"); + Assert.NotNull(pathGeometry.Figures); var figure = pathGeometry.Figures[0]; var segments = figure.Segments; @@ -328,6 +340,7 @@ namespace Avalonia.Base.UnitTests.Media using var parser = new PathMarkupParser(context); parser.Parse("M50,50z l -5,-5"); + Assert.NotNull(pathGeometry.Figures); Assert.Equal(2, pathGeometry.Figures.Count); var firstFigure = pathGeometry.Figures[0]; diff --git a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/BiDiTestDataGenerator.cs b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/BiDiTestDataGenerator.cs index bdaa8274ed..51ea13a2a9 100644 --- a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/BiDiTestDataGenerator.cs +++ b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/BiDiTestDataGenerator.cs @@ -42,7 +42,7 @@ namespace Avalonia.Visuals.UnitTests.Media.TextFormatting var lineNumber = 0; // Process each line - int[] levels = null; + int[]? levels = null; while (!reader.EndOfStream) { @@ -121,7 +121,7 @@ namespace Avalonia.Visuals.UnitTests.Media.TextFormatting lineNumber, directions, paragraphEmbeddingLevel, - levels + levels! ]); break; diff --git a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/FormattedTextSourceTests.cs b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/FormattedTextSourceTests.cs index d6eb4c98d9..06912e9c3d 100644 --- a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/FormattedTextSourceTests.cs +++ b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/FormattedTextSourceTests.cs @@ -22,9 +22,10 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting new ValueSpan(13, 2, new GenericTextRunProperties(typeface, backgroundBrush: Brushes.Aqua)), }; - FormattedTextSource textSource = new FormattedTextSource(text, defaultTextRunProperties, textStyleOverrides); - TextRun textRun = textSource.GetTextRun(0); + var textSource = new FormattedTextSource(text, defaultTextRunProperties, textStyleOverrides); + var textRun = textSource.GetTextRun(0); + Assert.NotNull(textRun); Assert.Equal(2, textRun.Length); Assert.Equal("He", textRun.Text.ToString()); } diff --git a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/UnicodeDataGenerator.cs b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/UnicodeDataGenerator.cs index 3b558e600b..5af956d43f 100644 --- a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/UnicodeDataGenerator.cs +++ b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/UnicodeDataGenerator.cs @@ -468,15 +468,15 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting internal class UnicodeDataEntries { - public IReadOnlyList Scripts { get; set; } - public IReadOnlyList GeneralCategories{ get; set; } - public IReadOnlyList LineBreakClasses{ get; set; } + public IReadOnlyList Scripts { get; set; } = []; + public IReadOnlyList GeneralCategories { get; set; } = []; + public IReadOnlyList LineBreakClasses { get; set; } = []; } internal class BiDiDataEntries { - public IReadOnlyList PairedBracketTypes { get; set; } - public IReadOnlyList BiDiClasses{ get; set; } + public IReadOnlyList PairedBracketTypes { get; set; } = []; + public IReadOnlyList BiDiClasses { get; set; } = []; } internal readonly struct CodepointRange diff --git a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/UnicodeEnumsGenerator.cs b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/UnicodeEnumsGenerator.cs index 74fe709788..26f4779077 100644 --- a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/UnicodeEnumsGenerator.cs +++ b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/UnicodeEnumsGenerator.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Net.Http; +using Xunit; namespace Avalonia.Base.UnitTests.Media.TextFormatting { @@ -129,12 +130,13 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting using (var stream = typeof(UnicodeEnumsGenerator).Assembly.GetManifestResourceStream( - "Avalonia.Base.UnitTests.Media.TextFormatting.BreakPairTable.txt")) + "Avalonia.Base.UnitTests.Media.TextFormatting.BreakPairTable.txt")!) using (var reader = new StreamReader(stream)) { while (!reader.EndOfStream) { var line = reader.ReadLine(); + Assert.NotNull(line); var columns = line.Split('\t'); diff --git a/tests/Avalonia.Base.UnitTests/Media/UnicodeRangeTests.cs b/tests/Avalonia.Base.UnitTests/Media/UnicodeRangeTests.cs index 5edbd613eb..b7dcf67e50 100644 --- a/tests/Avalonia.Base.UnitTests/Media/UnicodeRangeTests.cs +++ b/tests/Avalonia.Base.UnitTests/Media/UnicodeRangeTests.cs @@ -11,6 +11,7 @@ namespace Avalonia.Visuals.UnitTests.Media { var range = UnicodeRange.Parse("U+0, U+1, U+2, U+3"); + Assert.NotNull(range.Segments); Assert.Equal(new[] { 0, 1, 2, 3 }, range.Segments.Select(x => x.Start)); } } diff --git a/tests/Avalonia.Base.UnitTests/PixelSizeTests.cs b/tests/Avalonia.Base.UnitTests/PixelSizeTests.cs index d04237d53d..b0c002b5d7 100644 --- a/tests/Avalonia.Base.UnitTests/PixelSizeTests.cs +++ b/tests/Avalonia.Base.UnitTests/PixelSizeTests.cs @@ -8,9 +8,9 @@ public class PixelSizeTests { [Theory] [MemberData(nameof(ParseArguments))] - public void Parse(string source, PixelSize expected, Exception exception) + public void Parse(string source, PixelSize expected, Exception? exception) { - Exception error = null; + Exception? error = null; PixelSize result = default; try { @@ -26,9 +26,9 @@ public class PixelSizeTests [Theory] [MemberData(nameof(TryParseArguments))] - public void TryParse(string source, PixelSize? expected, Exception exception) + public void TryParse(string source, PixelSize? expected, Exception? exception) { - Exception error = null; + Exception? error = null; PixelSize result = PixelSize.Empty; try { @@ -43,35 +43,35 @@ public class PixelSizeTests Assert.Equal(expected, result); } - public static IEnumerable ParseArguments() + public static IEnumerable ParseArguments() { - yield return new object[] - { + yield return + [ "1024,768", new PixelSize(1024, 768), - null, - }; - yield return new object[] - { + null + ]; + yield return + [ "1024x768", default(PixelSize), - new FormatException("Invalid PixelSize."), - }; + new FormatException("Invalid PixelSize.") + ]; } - public static IEnumerable TryParseArguments() + public static IEnumerable TryParseArguments() { - yield return new object[] - { + yield return + [ "1024,768", new PixelSize(1024, 768), - null, - }; - yield return new object[] - { + null + ]; + yield return + [ "1024x768", PixelSize.Empty, - null, - }; + null + ]; } } diff --git a/tests/Avalonia.Base.UnitTests/Rendering/SceneGraph/DrawOperationTests.cs b/tests/Avalonia.Base.UnitTests/Rendering/SceneGraph/DrawOperationTests.cs index e9a1cc382d..5b088eb66c 100644 --- a/tests/Avalonia.Base.UnitTests/Rendering/SceneGraph/DrawOperationTests.cs +++ b/tests/Avalonia.Base.UnitTests/Rendering/SceneGraph/DrawOperationTests.cs @@ -81,7 +81,8 @@ namespace Avalonia.Base.UnitTests.Rendering.SceneGraph using (ctx.Context.PushTransform(Matrix.CreateScale(scaleX, scaleY))) ctx.Context.DrawRectangle(null, new ImmutablePen(Brushes.Black, penThickness), new Rect(x, y, width, height)); - Assert.Equal(new Rect(expectedX, expectedY, expectedWidth, expectedHeight), ctx.GetBounds().Value); + var bounds = Assert.NotNull(ctx.GetBounds()); + Assert.Equal(new Rect(expectedX, expectedY, expectedWidth, expectedHeight), bounds); } [Theory, InlineData(false), InlineData(true)] diff --git a/tests/Avalonia.Base.UnitTests/Styling/ResourceDictionaryTests.cs b/tests/Avalonia.Base.UnitTests/Styling/ResourceDictionaryTests.cs index 5527eda6ee..f229bf4b06 100644 --- a/tests/Avalonia.Base.UnitTests/Styling/ResourceDictionaryTests.cs +++ b/tests/Avalonia.Base.UnitTests/Styling/ResourceDictionaryTests.cs @@ -11,7 +11,7 @@ namespace Avalonia.Base.UnitTests.Styling public void Cannot_Add_Null_Key() { var target = new ResourceDictionary(); - Assert.Throws(() => target.Add(null, "null")); + Assert.Throws(() => target.Add(null!, "null")); } [Fact] diff --git a/tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Child.cs b/tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Child.cs index 66efe2cc7b..1a7defe39a 100644 --- a/tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Child.cs +++ b/tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Child.cs @@ -47,8 +47,8 @@ namespace Avalonia.Base.UnitTests.Styling var selector = default(Selector).OfType().Class("foo").Child().OfType(); var activator = selector.Match(child).Activator; - var result = new List(); + Assert.NotNull(activator); Assert.False(await activator.Take(1)); parent.Classes.Add("foo"); Assert.True(await activator.Take(1)); @@ -75,7 +75,7 @@ namespace Avalonia.Base.UnitTests.Styling public abstract class TestLogical : Control { - public ILogical LogicalParent + public ILogical? LogicalParent { get => Parent; set => ((ISetLogicalParent)this).SetParent(value); diff --git a/tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Class.cs b/tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Class.cs index 841798d39d..aa03c329d0 100644 --- a/tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Class.cs +++ b/tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Class.cs @@ -38,6 +38,7 @@ namespace Avalonia.Base.UnitTests.Styling var match = target.Match(control); Assert.Equal(SelectorMatchResult.Sometimes, match.Result); + Assert.NotNull(match.Activator); Assert.True(await match.Activator.Take(1)); } @@ -53,6 +54,7 @@ namespace Avalonia.Base.UnitTests.Styling var match = target.Match(control); Assert.Equal(SelectorMatchResult.Sometimes, match.Result); + Assert.NotNull(match.Activator); Assert.False(await match.Activator.Take(1)); } @@ -69,6 +71,7 @@ namespace Avalonia.Base.UnitTests.Styling var match = target.Match(control); Assert.Equal(SelectorMatchResult.Sometimes, match.Result); + Assert.NotNull(match.Activator); Assert.True(await match.Activator.Take(1)); } @@ -78,11 +81,13 @@ namespace Avalonia.Base.UnitTests.Styling var control = new Control1(); var target = default(Selector).Class("foo"); - var activator = target.Match(control).Activator.ToObservable(); + var activator = target.Match(control).Activator; + Assert.NotNull(activator); + var observable = activator.ToObservable(); - Assert.False(await activator.Take(1)); + Assert.False(await observable.Take(1)); control.Classes.Add("foo"); - Assert.True(await activator.Take(1)); + Assert.True(await observable.Take(1)); } [Fact] @@ -94,11 +99,13 @@ namespace Avalonia.Base.UnitTests.Styling }; var target = default(Selector).Class("foo"); - var activator = target.Match(control).Activator.ToObservable(); + var activator = target.Match(control).Activator; + Assert.NotNull(activator); + var observable = activator.ToObservable(); - Assert.True(await activator.Take(1)); + Assert.True(await observable.Take(1)); control.Classes.Remove("foo"); - Assert.False(await activator.Take(1)); + Assert.False(await observable.Take(1)); } [Fact] @@ -106,15 +113,17 @@ namespace Avalonia.Base.UnitTests.Styling { var control = new Control1(); var target = default(Selector).Class("foo").Class("bar"); - var activator = target.Match(control).Activator.ToObservable(); + var activator = target.Match(control).Activator; + Assert.NotNull(activator); + var observable = activator.ToObservable(); - Assert.False(await activator.Take(1)); + Assert.False(await observable.Take(1)); control.Classes.Add("foo"); - Assert.False(await activator.Take(1)); + Assert.False(await observable.Take(1)); control.Classes.Add("bar"); - Assert.True(await activator.Take(1)); + Assert.True(await observable.Take(1)); control.Classes.Remove("bar"); - Assert.False(await activator.Take(1)); + Assert.False(await observable.Take(1)); } [Fact] @@ -128,6 +137,7 @@ namespace Avalonia.Base.UnitTests.Styling var target = default(Selector).Class("foo"); var activator = target.Match(control).Activator; + Assert.NotNull(activator); var result = new List(); using (activator.Subscribe(x => result.Add(x))) diff --git a/tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Descendent.cs b/tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Descendent.cs index 6b52936ec5..8db41182bb 100644 --- a/tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Descendent.cs +++ b/tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Descendent.cs @@ -51,6 +51,7 @@ namespace Avalonia.Base.UnitTests.Styling var selector = default(Selector).OfType().Class("foo").Descendant().OfType(); var activator = selector.Match(child).Activator; + Assert.NotNull(activator); Assert.True(await activator.Take(1)); } @@ -69,6 +70,7 @@ namespace Avalonia.Base.UnitTests.Styling var selector = default(Selector).OfType().Class("foo").Descendant().OfType(); var activator = selector.Match(child).Activator; + Assert.NotNull(activator); Assert.False(await activator.Take(1)); } @@ -83,17 +85,19 @@ namespace Avalonia.Base.UnitTests.Styling child.LogicalParent = parent; var selector = default(Selector).OfType().Class("foo").Descendant().OfType(); - var activator = selector.Match(child).Activator.ToObservable(); + var activator = selector.Match(child).Activator; + Assert.NotNull(activator); + var observable = activator.ToObservable(); - Assert.False(await activator.Take(1)); + Assert.False(await observable.Take(1)); parent.Classes.Add("foo"); - Assert.True(await activator.Take(1)); + Assert.True(await observable.Take(1)); grandparent.Classes.Add("foo"); - Assert.True(await activator.Take(1)); + Assert.True(await observable.Take(1)); parent.Classes.Remove("foo"); - Assert.True(await activator.Take(1)); + Assert.True(await observable.Take(1)); grandparent.Classes.Remove("foo"); - Assert.False(await activator.Take(1)); + Assert.False(await observable.Take(1)); } [Fact] @@ -106,7 +110,7 @@ namespace Avalonia.Base.UnitTests.Styling public abstract class TestLogical : Control { - public ILogical LogicalParent + public ILogical? LogicalParent { get => Parent; set => ((ISetLogicalParent)this).SetParent(value); diff --git a/tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Multiple.cs b/tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Multiple.cs index 393caf1627..b6df8d45f8 100644 --- a/tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Multiple.cs +++ b/tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Multiple.cs @@ -41,6 +41,7 @@ namespace Avalonia.Base.UnitTests.Styling var match = selector.Match(border); Assert.Equal(SelectorMatchResult.Sometimes, match.Result); + Assert.NotNull(match.Activator); match.Activator.Subscribe(x => values.Add(x)); Assert.Equal(new[] { false }, values); @@ -103,6 +104,7 @@ namespace Avalonia.Base.UnitTests.Styling var match = selector.Match(textBlock); Assert.Equal(SelectorMatchResult.Sometimes, match.Result); + Assert.NotNull(match.Activator); match.Activator.Subscribe(x => values.Add(x)); Assert.Equal(new[] { false }, values); @@ -141,6 +143,7 @@ namespace Avalonia.Base.UnitTests.Styling var match = selector.Match(border); Assert.Equal(SelectorMatchResult.Sometimes, match.Result); + Assert.NotNull(match.Activator); match.Activator.Subscribe(x => values.Add(x)); Assert.Equal(new[] { false }, values); @@ -168,6 +171,7 @@ namespace Avalonia.Base.UnitTests.Styling var activator = match.Activator; + Assert.NotNull(activator); Assert.False(await activator.Take(1)); control.Tag = "bar"; Assert.False(await activator.Take(1)); diff --git a/tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Nesting.cs b/tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Nesting.cs index 72df072ea6..e68c902d5d 100644 --- a/tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Nesting.cs +++ b/tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Nesting.cs @@ -22,7 +22,7 @@ namespace Avalonia.Base.UnitTests.Styling } }; - var match = nested.Selector.Match(control, parent); + var match = nested.Selector!.Match(control, parent); Assert.Equal(SelectorMatchResult.NeverThisType, match.Result); } @@ -41,7 +41,7 @@ namespace Avalonia.Base.UnitTests.Styling } }; - var match = nested.Selector.Match(control, parent); + var match = nested.Selector!.Match(control, parent); Assert.Equal(SelectorMatchResult.NeverThisType, match.Result); } @@ -61,7 +61,7 @@ namespace Avalonia.Base.UnitTests.Styling } }; - var match = nested.Selector.Match(control, parent); + var match = nested.Selector!.Match(control, parent); Assert.Equal(SelectorMatchResult.NeverThisInstance, match.Result); } @@ -89,7 +89,7 @@ namespace Avalonia.Base.UnitTests.Styling } }; - var match = nested.Selector.Match(control, parent); + var match = nested.Selector!.Match(control, parent); Assert.Equal(SelectorMatchResult.NeverThisType, match.Result); } @@ -106,8 +106,9 @@ namespace Avalonia.Base.UnitTests.Styling } }; - var match = nested.Selector.Match(control, parent); + var match = nested.Selector!.Match(control, parent); Assert.Equal(SelectorMatchResult.Sometimes, match.Result); + Assert.NotNull(match.Activator); var sink = new ActivatorSink(match.Activator); @@ -140,8 +141,9 @@ namespace Avalonia.Base.UnitTests.Styling } }; - var match = nested.Selector.Match(control, parent); + var match = nested.Selector!.Match(control, parent); Assert.Equal(SelectorMatchResult.Sometimes, match.Result); + Assert.NotNull(match.Activator); var sink = new ActivatorSink(match.Activator); @@ -165,8 +167,9 @@ namespace Avalonia.Base.UnitTests.Styling } }; - var match = nested.Selector.Match(control, parent); + var match = nested.Selector!.Match(control, parent); Assert.Equal(SelectorMatchResult.Sometimes, match.Result); + Assert.NotNull(match.Activator); var sink = new ActivatorSink(match.Activator); @@ -191,7 +194,7 @@ namespace Avalonia.Base.UnitTests.Styling } }; - var match = nested.Selector.Match(control, parent); + var match = nested.Selector!.Match(control, parent); Assert.Equal(SelectorMatchResult.AlwaysThisInstance, match.Result); } @@ -201,7 +204,7 @@ namespace Avalonia.Base.UnitTests.Styling var control = new Control1(); var style = new Style(x => x.Nesting().OfType()); - Assert.Throws(() => style.Selector.Match(control, null)); + Assert.Throws(() => style.Selector!.Match(control, null)); } [Fact] @@ -217,7 +220,7 @@ namespace Avalonia.Base.UnitTests.Styling } }; - Assert.Throws(() => nested.Selector.Match(control, parent)); + Assert.Throws(() => nested.Selector!.Match(control, parent)); } [Fact] @@ -272,8 +275,9 @@ namespace Avalonia.Base.UnitTests.Styling } }; - var match = nested.Selector.Match(control, parent); + var match = nested.Selector!.Match(control, parent); Assert.Equal(SelectorMatchResult.Sometimes, match.Result); + Assert.NotNull(match.Activator); var sink = new ActivatorSink(match.Activator); diff --git a/tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Not.cs b/tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Not.cs index fd1385ac47..be83f56144 100644 --- a/tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Not.cs +++ b/tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Not.cs @@ -45,6 +45,7 @@ namespace Avalonia.Base.UnitTests.Styling var match = target.Match(control); Assert.Equal(SelectorMatchResult.Sometimes, match.Result); + Assert.NotNull(match.Activator); Assert.False(await match.Activator.Take(1)); } @@ -60,6 +61,7 @@ namespace Avalonia.Base.UnitTests.Styling var match = target.Match(control); Assert.Equal(SelectorMatchResult.Sometimes, match.Result); + Assert.NotNull(match.Activator); Assert.True(await match.Activator.Take(1)); } @@ -75,6 +77,7 @@ namespace Avalonia.Base.UnitTests.Styling var match = target.Match(control); Assert.Equal(SelectorMatchResult.Sometimes, match.Result); + Assert.NotNull(match.Activator); Assert.True(await match.Activator.Take(1)); } diff --git a/tests/Avalonia.Base.UnitTests/Styling/SelectorTests_PropertyEquals.cs b/tests/Avalonia.Base.UnitTests/Styling/SelectorTests_PropertyEquals.cs index ee1b654ba8..0e87126f40 100644 --- a/tests/Avalonia.Base.UnitTests/Styling/SelectorTests_PropertyEquals.cs +++ b/tests/Avalonia.Base.UnitTests/Styling/SelectorTests_PropertyEquals.cs @@ -17,13 +17,13 @@ namespace Avalonia.Base.UnitTests.Styling class Auth { - public readonly static AttachedProperty NameProperty = - AvaloniaProperty.RegisterAttached("Name"); + public readonly static AttachedProperty NameProperty = + AvaloniaProperty.RegisterAttached("Name"); - public static string GetName(AvaloniaObject avaloniaObject) => + public static string? GetName(AvaloniaObject avaloniaObject) => avaloniaObject.GetValue(NameProperty); - public static void SetName(AvaloniaObject avaloniaObject, string value) => + public static void SetName(AvaloniaObject avaloniaObject, string? value) => avaloniaObject.SetValue(NameProperty, value); } @@ -39,16 +39,19 @@ namespace Avalonia.Base.UnitTests.Styling _ => null }; }).Parse("TextBlock[(Grid.Column)=1]"); - + + Assert.NotNull(target); var control = new TextBlock(); - var activator = target.Match(control).Activator.ToObservable(); + var activator = target.Match(control).Activator; + Assert.NotNull(activator); + var observable = activator.ToObservable(); - Assert.False(await activator.Take(1)); + Assert.False(await observable.Take(1)); Grid.SetColumn(control, 1); - Assert.True(await activator.Take(1)); + Assert.True(await observable.Take(1)); Grid.SetColumn(control, 0); - Assert.False(await activator.Take(1)); + Assert.False(await observable.Take(1)); } [Fact] @@ -64,15 +67,19 @@ namespace Avalonia.Base.UnitTests.Styling }; }).Parse("TextBlock[(l|Auth.Name)=Admin]"); + Assert.NotNull(target); + var control = new TextBlock(); - var activator = target.Match(control).Activator.ToObservable(); + var activator = target.Match(control).Activator; + Assert.NotNull(activator); + var observable = activator.ToObservable(); - Assert.False(await activator.Take(1)); + Assert.False(await observable.Take(1)); Auth.SetName(control, "Admin"); - Assert.True(await activator.Take(1)); + Assert.True(await observable.Take(1)); Auth.SetName(control, null); - Assert.False(await activator.Take(1)); + Assert.False(await observable.Take(1)); } [Fact] @@ -80,13 +87,15 @@ namespace Avalonia.Base.UnitTests.Styling { var control = new TextBlock(); var target = default(Selector).PropertyEquals(TextBlock.TextProperty, "foo"); - var activator = target.Match(control).Activator.ToObservable(); + var activator = target.Match(control).Activator; + Assert.NotNull(activator); + var observable = activator.ToObservable(); - Assert.False(await activator.Take(1)); + Assert.False(await observable.Take(1)); control.Text = "foo"; - Assert.True(await activator.Take(1)); + Assert.True(await observable.Take(1)); control.Text = null; - Assert.False(await activator.Take(1)); + Assert.False(await observable.Take(1)); } [Theory] @@ -97,13 +106,15 @@ namespace Avalonia.Base.UnitTests.Styling { var control = new TextBlock(); var target = default(Selector).PropertyEquals(TextBlock.TagProperty, literal); - var activator = target.Match(control).Activator.ToObservable(); + var activator = target.Match(control).Activator; + Assert.NotNull(activator); + var observable = activator.ToObservable(); - Assert.False(await activator.Take(1)); + Assert.False(await observable.Take(1)); control.Tag = value; - Assert.True(await activator.Take(1)); + Assert.True(await observable.Take(1)); control.Tag = null; - Assert.False(await activator.Take(1)); + Assert.False(await observable.Take(1)); } [Fact] diff --git a/tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Template.cs b/tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Template.cs index 7528815510..7fbab77f82 100644 --- a/tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Template.cs +++ b/tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Template.cs @@ -87,6 +87,7 @@ namespace Avalonia.Base.UnitTests.Styling var selector = default(Selector).OfType(styleKey).Class("foo").Template().OfType(); var activator = selector.Match(border).Activator; + Assert.NotNull(activator); Assert.True(await activator.Take(1)); } @@ -99,6 +100,7 @@ namespace Avalonia.Base.UnitTests.Styling var selector = default(Selector).OfType(typeof(TestTemplatedControl)).Class("foo").Template().OfType(); var activator = selector.Match(border).Activator; + Assert.NotNull(activator); Assert.False(await activator.Take(1)); } @@ -109,6 +111,7 @@ namespace Avalonia.Base.UnitTests.Styling var border = (Border)target.VisualChildren.Single(); var selector = default(Selector).OfType(typeof(TestTemplatedControl)).Class("foo").Template().OfType(); var activator = selector.Match(border).Activator; + Assert.NotNull(activator); using (activator.Subscribe(_ => { })) { diff --git a/tests/Avalonia.Base.UnitTests/Styling/StyledElementTests.cs b/tests/Avalonia.Base.UnitTests/Styling/StyledElementTests.cs index 197dde5cc0..68644e10aa 100644 --- a/tests/Avalonia.Base.UnitTests/Styling/StyledElementTests.cs +++ b/tests/Avalonia.Base.UnitTests/Styling/StyledElementTests.cs @@ -147,7 +147,7 @@ namespace Avalonia.Base.UnitTests.Styling var border = new Border { Child = canvas }; var raised = 0; - void Attached(object sender, LogicalTreeAttachmentEventArgs e) + void Attached(object? sender, LogicalTreeAttachmentEventArgs e) { Assert.Same(border, e.Source); ++raised; @@ -169,7 +169,7 @@ namespace Avalonia.Base.UnitTests.Styling var border = new Border { Child = canvas }; var raised = 0; - void Attached(object sender, LogicalTreeAttachmentEventArgs e) + void Attached(object? sender, LogicalTreeAttachmentEventArgs e) { Assert.Same(root, e.Parent); ++raised; @@ -406,8 +406,8 @@ namespace Avalonia.Base.UnitTests.Styling } }; - var called = new List(); - void Record(object sender, EventArgs e) => called.Add(((StyledElement)sender).Name); + var called = new List(); + void Record(object? sender, EventArgs e) => called.Add(((StyledElement)sender!).Name); root.DataContextChanged += Record; @@ -449,9 +449,9 @@ namespace Avalonia.Base.UnitTests.Styling foreach (IDataContextEvents c in root.GetSelfAndLogicalDescendants()) { - c.DataContextBeginUpdate += (s, e) => called.Add("begin " + ((StyledElement)s).Name); - c.DataContextChanged += (s, e) => called.Add("changed " + ((StyledElement)s).Name); - c.DataContextEndUpdate += (s, e) => called.Add("end " + ((StyledElement)s).Name); + c.DataContextBeginUpdate += (s, e) => called.Add("begin " + ((StyledElement)s!).Name); + c.DataContextChanged += (s, e) => called.Add("changed " + ((StyledElement)s!).Name); + c.DataContextEndUpdate += (s, e) => called.Add("end " + ((StyledElement)s!).Name); } root.DataContext = "foo"; @@ -501,11 +501,11 @@ namespace Avalonia.Base.UnitTests.Styling var called = new List(); - foreach (IDataContextEvents c in new[] { children[0], children[0].Child, children[1] }) + foreach (var c in new[] { children[0], (IDataContextEvents)children[0].Child!, children[1] }) { - c.DataContextBeginUpdate += (s, e) => called.Add("begin " + ((StyledElement)s).Name); - c.DataContextChanged += (s, e) => called.Add("changed " + ((StyledElement)s).Name); - c.DataContextEndUpdate += (s, e) => called.Add("end " + ((StyledElement)s).Name); + c.DataContextBeginUpdate += (s, e) => called.Add("begin " + ((StyledElement)s!).Name); + c.DataContextChanged += (s, e) => called.Add("changed " + ((StyledElement)s!).Name); + c.DataContextEndUpdate += (s, e) => called.Add("end " + ((StyledElement)s!).Name); } root.Children.AddRange(children); @@ -624,17 +624,17 @@ namespace Avalonia.Base.UnitTests.Styling private interface IDataContextEvents { - event EventHandler DataContextBeginUpdate; - event EventHandler DataContextChanged; - event EventHandler DataContextEndUpdate; + event EventHandler? DataContextBeginUpdate; + event EventHandler? DataContextChanged; + event EventHandler? DataContextEndUpdate; } private class TestControl : Decorator, IDataContextEvents { - public event EventHandler DataContextBeginUpdate; - public event EventHandler DataContextEndUpdate; + public event EventHandler? DataContextBeginUpdate; + public event EventHandler? DataContextEndUpdate; - public new AvaloniaObject InheritanceParent => base.InheritanceParent; + public new AvaloniaObject? InheritanceParent => base.InheritanceParent; protected override void OnDataContextBeginUpdate() { @@ -651,8 +651,8 @@ namespace Avalonia.Base.UnitTests.Styling private class TestStackPanel : StackPanel, IDataContextEvents { - public event EventHandler DataContextBeginUpdate; - public event EventHandler DataContextEndUpdate; + public event EventHandler? DataContextBeginUpdate; + public event EventHandler? DataContextEndUpdate; protected override void OnDataContextBeginUpdate() { diff --git a/tests/Avalonia.Base.UnitTests/Styling/TestObserver.cs b/tests/Avalonia.Base.UnitTests/Styling/TestObserver.cs index 46f26804f1..8d0643ffc9 100644 --- a/tests/Avalonia.Base.UnitTests/Styling/TestObserver.cs +++ b/tests/Avalonia.Base.UnitTests/Styling/TestObserver.cs @@ -6,11 +6,11 @@ namespace Avalonia.Base.UnitTests.Styling { private bool _hasValue; - private T _value; + private T _value = default!; public bool Completed { get; private set; } - public Exception Error { get; private set; } + public Exception? Error { get; private set; } public T GetValue() { diff --git a/tests/Avalonia.Base.UnitTests/TestVisual.cs b/tests/Avalonia.Base.UnitTests/TestVisual.cs index ae694420bc..7ac8c6d18a 100644 --- a/tests/Avalonia.Base.UnitTests/TestVisual.cs +++ b/tests/Avalonia.Base.UnitTests/TestVisual.cs @@ -17,11 +17,11 @@ namespace Avalonia.Base.UnitTests public class TestVisual : Visual { - public Visual Child + public Visual? Child { get { - return ((Visual)this).VisualChildren.FirstOrDefault(); + return VisualChildren.FirstOrDefault(); } set diff --git a/tests/Avalonia.Base.UnitTests/Utilities/DelegateCommand.cs b/tests/Avalonia.Base.UnitTests/Utilities/DelegateCommand.cs index 0f9c3a0545..6fbbcb32c5 100644 --- a/tests/Avalonia.Base.UnitTests/Utilities/DelegateCommand.cs +++ b/tests/Avalonia.Base.UnitTests/Utilities/DelegateCommand.cs @@ -6,14 +6,14 @@ namespace Avalonia.Base.UnitTests.Utilities; internal class DelegateCommand : ICommand { private readonly Action _action; - private readonly Func _canExecute; - public DelegateCommand(Action action, Func canExecute = default) + private readonly Func _canExecute; + public DelegateCommand(Action action, Func? canExecute = null) { _action = action; - _canExecute = canExecute ?? new(_ => true); + _canExecute = canExecute ?? (_ => true); } - public event EventHandler CanExecuteChanged { add { } remove { } } - public bool CanExecute(object parameter) => _canExecute(parameter); - public void Execute(object parameter) => _action(); + public event EventHandler? CanExecuteChanged { add { } remove { } } + public bool CanExecute(object? parameter) => _canExecute(parameter); + public void Execute(object? parameter) => _action(); } diff --git a/tests/Avalonia.Base.UnitTests/VisualTests.cs b/tests/Avalonia.Base.UnitTests/VisualTests.cs index aaf6b9992f..1a196f950a 100644 --- a/tests/Avalonia.Base.UnitTests/VisualTests.cs +++ b/tests/Avalonia.Base.UnitTests/VisualTests.cs @@ -30,13 +30,13 @@ namespace Avalonia.Base.UnitTests { var target = new TestVisual(); var child = new TestVisual(); - var parents = new List(); + var parents = new List(); child.GetObservable(Visual.VisualParentProperty).Subscribe(x => parents.Add(x)); target.AddChild(child); target.RemoveChild(child); - Assert.Equal(new Visual[] { null, target, null }, parents); + Assert.Equal([null, target, null], parents); } [Fact] @@ -62,7 +62,7 @@ namespace Avalonia.Base.UnitTests var result = children.Select(x => x.GetVisualParent()).ToList(); - Assert.Equal(new Visual[] { null, null }, result); + Assert.Equal([null, null], result); } [Fact] diff --git a/tests/Avalonia.Base.UnitTests/WeakEventHandlerManagerTests.cs b/tests/Avalonia.Base.UnitTests/WeakEventHandlerManagerTests.cs index 9274724c8c..3e8f0804e3 100644 --- a/tests/Avalonia.Base.UnitTests/WeakEventHandlerManagerTests.cs +++ b/tests/Avalonia.Base.UnitTests/WeakEventHandlerManagerTests.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using Avalonia.Utilities; using Xunit; @@ -12,24 +8,24 @@ namespace Avalonia.Base.UnitTests { class EventSource { - public event EventHandler Event; + public event EventHandler? Event; public void Fire() { - Event?.Invoke(this, new EventArgs()); + Event?.Invoke(this, EventArgs.Empty); } } class Subscriber { - private readonly Action _onEvent; + private readonly Action? _onEvent; public Subscriber(Action onEvent) { _onEvent = onEvent; } - public void OnEvent(object sender, EventArgs ev) + public void OnEvent(object? sender, EventArgs ev) { _onEvent?.Invoke(); } diff --git a/tests/Avalonia.Base.UnitTests/WeakEventTests.cs b/tests/Avalonia.Base.UnitTests/WeakEventTests.cs index 4c9798ef09..0433edc217 100644 --- a/tests/Avalonia.Base.UnitTests/WeakEventTests.cs +++ b/tests/Avalonia.Base.UnitTests/WeakEventTests.cs @@ -1,8 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using Avalonia.Utilities; using Xunit; @@ -12,11 +8,11 @@ namespace Avalonia.Base.UnitTests { class EventSource { - public event EventHandler Event; + public event EventHandler? Event; public void Fire() { - Event?.Invoke(this, new EventArgs()); + Event?.Invoke(this, EventArgs.Empty); } public static readonly WeakEvent WeakEv = WeakEvent.Register( @@ -26,14 +22,14 @@ namespace Avalonia.Base.UnitTests class Subscriber : IWeakEventSubscriber { - private readonly Action _onEvent; + private readonly Action? _onEvent; - public Subscriber(Action onEvent) + public Subscriber(Action? onEvent) { _onEvent = onEvent; } - public void OnEvent(object sender, WeakEvent ev, EventArgs args) + public void OnEvent(object? sender, WeakEvent ev, EventArgs args) { _onEvent?.Invoke(); } diff --git a/tests/Avalonia.Markup.UnitTests/Avalonia.Markup.UnitTests.csproj b/tests/Avalonia.Markup.UnitTests/Avalonia.Markup.UnitTests.csproj index 832e258788..9cf5ebe224 100644 --- a/tests/Avalonia.Markup.UnitTests/Avalonia.Markup.UnitTests.csproj +++ b/tests/Avalonia.Markup.UnitTests/Avalonia.Markup.UnitTests.csproj @@ -11,6 +11,7 @@ + diff --git a/tests/Avalonia.Markup.UnitTests/Data/BindingTests.cs b/tests/Avalonia.Markup.UnitTests/Data/BindingTests.cs index 0c91e0a6bc..e60f15ef95 100644 --- a/tests/Avalonia.Markup.UnitTests/Data/BindingTests.cs +++ b/tests/Avalonia.Markup.UnitTests/Data/BindingTests.cs @@ -88,9 +88,9 @@ namespace Avalonia.Markup.UnitTests.Data private class DummyObject : ICloneable { - private readonly string _val; + private readonly string? _val; - public DummyObject(string val) + public DummyObject(string? val) { _val = val; } @@ -105,7 +105,7 @@ namespace Avalonia.Markup.UnitTests.Data return string.Equals(_val, other._val); } - public override bool Equals(object obj) + public override bool Equals(object? obj) { if (ReferenceEquals(null, obj)) return false; @@ -294,7 +294,7 @@ namespace Avalonia.Markup.UnitTests.Data }; var child = new Control(); - var values = new List(); + var values = new List(); child.GetObservable(Control.DataContextProperty).Subscribe(x => values.Add(x)); child.Bind(Control.DataContextProperty, new Binding("Foo")); @@ -717,7 +717,7 @@ namespace Avalonia.Markup.UnitTests.Data private class NullableValuesViewModel : INotifyPropertyChanged { - public event PropertyChangedEventHandler PropertyChanged; + public event PropertyChangedEventHandler? PropertyChanged; private double? _nullableDouble; public double? NullableDouble @@ -739,7 +739,7 @@ namespace Avalonia.Markup.UnitTests.Data private bool _boolValue; private double _value; - public event PropertyChangedEventHandler PropertyChanged; + public event PropertyChangedEventHandler? PropertyChanged; public bool BoolValue { @@ -815,10 +815,10 @@ namespace Avalonia.Markup.UnitTests.Data public class Source : INotifyPropertyChanged { - private PropertyChangedEventHandler _propertyChanged; - private string _foo; + private PropertyChangedEventHandler? _propertyChanged; + private string? _foo; - public string Foo + public string? Foo { get => _foo; set @@ -834,7 +834,7 @@ namespace Avalonia.Markup.UnitTests.Data public int SubscriberCount { get; private set; } - public event PropertyChangedEventHandler PropertyChanged + public event PropertyChangedEventHandler? PropertyChanged { add { _propertyChanged += value; ++SubscriberCount; } remove { _propertyChanged += value; --SubscriberCount; } @@ -848,9 +848,9 @@ namespace Avalonia.Markup.UnitTests.Data public class WeakRefSource : INotifyPropertyChanged { - private WeakReference _foo; + private WeakReference? _foo; - public object Foo + public object? Foo { get { @@ -859,7 +859,7 @@ namespace Avalonia.Markup.UnitTests.Data return null; } - if (_foo.TryGetTarget(out object target)) + if (_foo.TryGetTarget(out var target)) { if (target is ICloneable cloneable) { @@ -873,13 +873,13 @@ namespace Avalonia.Markup.UnitTests.Data } set { - _foo = new WeakReference(value); + _foo = new WeakReference(value); RaisePropertyChanged(); } } - public event PropertyChangedEventHandler PropertyChanged; + public event PropertyChangedEventHandler? PropertyChanged; private void RaisePropertyChanged([CallerMemberName] string prop = "") { @@ -895,15 +895,15 @@ namespace Avalonia.Markup.UnitTests.Data private class TestControl : Control { - public static readonly DirectProperty ValueProperty = - AvaloniaProperty.RegisterDirect( + public static readonly DirectProperty ValueProperty = + AvaloniaProperty.RegisterDirect( nameof(Value), o => o.Value, (o, v) => o.Value = v); - private object _value; + private object? _value; - public object Value + public object? Value { get => _value; set => SetAndRaise(ValueProperty, ref _value, value); diff --git a/tests/Avalonia.Markup.UnitTests/Data/BindingTests_Converters.cs b/tests/Avalonia.Markup.UnitTests/Data/BindingTests_Converters.cs index 9a001b9ad9..a7ad06533b 100644 --- a/tests/Avalonia.Markup.UnitTests/Data/BindingTests_Converters.cs +++ b/tests/Avalonia.Markup.UnitTests/Data/BindingTests_Converters.cs @@ -25,9 +25,9 @@ namespace Avalonia.Markup.UnitTests.Data Converter = StringConverters.IsNullOrEmpty, }; - var expressionObserver = (BindingExpression)target.Initiate( - textBlock, - TextBlock.TextProperty).Expression; + var instancedBinding = target.Initiate(textBlock, TextBlock.TextProperty); + Assert.NotNull(instancedBinding); + var expressionObserver = Assert.IsType(instancedBinding.Expression); Assert.Same(StringConverters.IsNullOrEmpty, expressionObserver.Converter); } diff --git a/tests/Avalonia.Markup.UnitTests/Data/BindingTests_ElementName.cs b/tests/Avalonia.Markup.UnitTests/Data/BindingTests_ElementName.cs index 2091c9977a..de372f26da 100644 --- a/tests/Avalonia.Markup.UnitTests/Data/BindingTests_ElementName.cs +++ b/tests/Avalonia.Markup.UnitTests/Data/BindingTests_ElementName.cs @@ -38,7 +38,7 @@ namespace Avalonia.Markup.UnitTests.Data { ElementName = "source", Path = "Text", - NameScope = new WeakReference(NameScope.GetNameScope(root)) + NameScope = new WeakReference(NameScope.GetNameScope(root)) }; target.Bind(TextBox.TextProperty, binding); @@ -75,7 +75,7 @@ namespace Avalonia.Markup.UnitTests.Data var binding = new Binding { ElementName = "source", - NameScope = new WeakReference(NameScope.GetNameScope(root)) + NameScope = new WeakReference(NameScope.GetNameScope(root)) }; target.Bind(ContentControl.ContentProperty, binding); @@ -108,7 +108,7 @@ namespace Avalonia.Markup.UnitTests.Data { ElementName = "source", Path = "Text", - NameScope = new WeakReference(NameScope.GetNameScope(root)) + NameScope = new WeakReference(NameScope.GetNameScope(root)) }; target.Bind(TextBox.TextProperty, binding); @@ -146,7 +146,7 @@ namespace Avalonia.Markup.UnitTests.Data var binding = new Binding { ElementName = "source", - NameScope = new WeakReference(NameScope.GetNameScope(root)) + NameScope = new WeakReference(NameScope.GetNameScope(root)) }; target.Bind(ContentControl.ContentProperty, binding); diff --git a/tests/Avalonia.Markup.UnitTests/Data/BindingTests_Logging.cs b/tests/Avalonia.Markup.UnitTests/Data/BindingTests_Logging.cs index ba5ff6c488..0b8a480abb 100644 --- a/tests/Avalonia.Markup.UnitTests/Data/BindingTests_Logging.cs +++ b/tests/Avalonia.Markup.UnitTests/Data/BindingTests_Logging.cs @@ -2,14 +2,11 @@ using System; using System.Collections.Generic; using System.Globalization; using Avalonia.Controls; -using Avalonia.Controls.Converters; using Avalonia.Data; using Avalonia.Data.Converters; using Avalonia.Data.Core; -using Avalonia.Data.Core.Plugins; using Avalonia.Input; using Avalonia.Logging; -using Avalonia.LogicalTree; using Avalonia.Markup.Xaml.MarkupExtensions; using Avalonia.Markup.Xaml.MarkupExtensions.CompiledBindings; using Avalonia.Reactive; @@ -485,6 +482,6 @@ namespace Avalonia.Markup.UnitTests.Data } } - private record LogMessage(LogEventLevel level, string area, object source, string messageTemplate, params object[] propertyValues); + private record LogMessage(LogEventLevel level, string area, object? source, string messageTemplate, params object?[] propertyValues); } } diff --git a/tests/Avalonia.Markup.UnitTests/Data/BindingTests_Source.cs b/tests/Avalonia.Markup.UnitTests/Data/BindingTests_Source.cs index fc82253342..2d9606b6da 100644 --- a/tests/Avalonia.Markup.UnitTests/Data/BindingTests_Source.cs +++ b/tests/Avalonia.Markup.UnitTests/Data/BindingTests_Source.cs @@ -25,9 +25,9 @@ namespace Avalonia.Markup.UnitTests.Data public class Source : INotifyPropertyChanged { - private string _foo; + private string? _foo; - public string Foo + public string? Foo { get => _foo; set @@ -37,7 +37,7 @@ namespace Avalonia.Markup.UnitTests.Data } } - public event PropertyChangedEventHandler PropertyChanged; + public event PropertyChangedEventHandler? PropertyChanged; private void RaisePropertyChanged([CallerMemberName] string prop = "") { diff --git a/tests/Avalonia.Markup.UnitTests/Data/DynamicReflectableType.cs b/tests/Avalonia.Markup.UnitTests/Data/DynamicReflectableType.cs index 3c57bd38cf..0414ec913f 100644 --- a/tests/Avalonia.Markup.UnitTests/Data/DynamicReflectableType.cs +++ b/tests/Avalonia.Markup.UnitTests/Data/DynamicReflectableType.cs @@ -34,7 +34,7 @@ class DynamicReflectableType : IReflectableType, INotifyPropertyChanged, IEnumer } } - public event PropertyChangedEventHandler PropertyChanged; + public event PropertyChangedEventHandler? PropertyChanged; public IEnumerator> GetEnumerator() { return _dic.GetEnumerator(); @@ -48,8 +48,8 @@ class DynamicReflectableType : IReflectableType, INotifyPropertyChanged, IEnumer class FakeTypeInfo : TypeInfo { - protected override PropertyInfo GetPropertyImpl(string name, BindingFlags bindingAttr, Binder binder, Type returnType, Type[] types, - ParameterModifier[] modifiers) + protected override PropertyInfo GetPropertyImpl(string name, BindingFlags bindingAttr, Binder? binder, Type? returnType, Type[]? types, + ParameterModifier[]? modifiers) { var propInfo = new Mock(); propInfo.SetupGet(x => x.Name).Returns(name); @@ -83,16 +83,16 @@ class DynamicReflectableType : IReflectableType, INotifyPropertyChanged, IEnumer throw new NotSupportedException(); } - public override Module Module { get; } - public override string Namespace { get; } - public override string Name { get; } + public override Module Module => throw new NotSupportedException(); + public override string? Namespace => null; + public override string Name => ""; protected override TypeAttributes GetAttributeFlagsImpl() { throw new NotSupportedException(); } - protected override ConstructorInfo GetConstructorImpl(BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, - Type[] types, ParameterModifier[] modifiers) + protected override ConstructorInfo GetConstructorImpl(BindingFlags bindingAttr, Binder? binder, CallingConventions callConvention, + Type[] types, ParameterModifier[]? modifiers) { throw new NotSupportedException(); } @@ -132,8 +132,8 @@ class DynamicReflectableType : IReflectableType, INotifyPropertyChanged, IEnumer throw new NotSupportedException(); } - protected override MethodInfo GetMethodImpl(string name, BindingFlags bindingAttr, Binder binder, CallingConventions callConvention, - Type[] types, ParameterModifier[] modifiers) + protected override MethodInfo GetMethodImpl(string name, BindingFlags bindingAttr, Binder? binder, CallingConventions callConvention, + Type[]? types, ParameterModifier[]? modifiers) { throw new NotSupportedException(); } @@ -148,13 +148,13 @@ class DynamicReflectableType : IReflectableType, INotifyPropertyChanged, IEnumer throw new NotSupportedException(); } - public override object InvokeMember(string name, BindingFlags invokeAttr, Binder binder, object target, object[] args, - ParameterModifier[] modifiers, CultureInfo culture, string[] namedParameters) + public override object InvokeMember(string name, BindingFlags invokeAttr, Binder? binder, object? target, object?[]? args, + ParameterModifier[]? modifiers, CultureInfo? culture, string[]? namedParameters) { throw new NotSupportedException(); } - public override Type UnderlyingSystemType { get; } + public override Type UnderlyingSystemType => throw new NotSupportedException(); protected override bool IsArrayImpl() { @@ -181,11 +181,11 @@ class DynamicReflectableType : IReflectableType, INotifyPropertyChanged, IEnumer throw new NotSupportedException(); } - public override Assembly Assembly { get; } - public override string AssemblyQualifiedName { get; } - public override Type BaseType { get; } - public override string FullName { get; } - public override Guid GUID { get; } + public override Assembly Assembly => throw new NotSupportedException(); + public override string? AssemblyQualifiedName => null; + public override Type? BaseType => null; + public override string? FullName => null; + public override Guid GUID => Guid.Empty; @@ -218,4 +218,4 @@ class DynamicReflectableType : IReflectableType, INotifyPropertyChanged, IEnumer #endregion } -} \ No newline at end of file +} diff --git a/tests/Avalonia.Markup.UnitTests/Data/MultiBindingTests_Converters.cs b/tests/Avalonia.Markup.UnitTests/Data/MultiBindingTests_Converters.cs index 5527ee8d4e..c5e50d4b21 100644 --- a/tests/Avalonia.Markup.UnitTests/Data/MultiBindingTests_Converters.cs +++ b/tests/Avalonia.Markup.UnitTests/Data/MultiBindingTests_Converters.cs @@ -87,7 +87,7 @@ namespace Avalonia.Markup.UnitTests.Data private class SumOfDoublesConverter : IMultiValueConverter { - public object Convert(IList values, Type targetType, object parameter, CultureInfo culture) + public object Convert(IList values, Type targetType, object? parameter, CultureInfo culture) { return values.OfType().Sum(); } diff --git a/tests/Avalonia.Markup.UnitTests/Data/TemplateBindingTests.cs b/tests/Avalonia.Markup.UnitTests/Data/TemplateBindingTests.cs index 685ff2cdc0..a76d54440b 100644 --- a/tests/Avalonia.Markup.UnitTests/Data/TemplateBindingTests.cs +++ b/tests/Avalonia.Markup.UnitTests/Data/TemplateBindingTests.cs @@ -303,7 +303,7 @@ namespace Avalonia.Markup.UnitTests.Data private class PrefixConverter : IValueConverter { - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) { if (value != null && parameter != null) { @@ -313,12 +313,12 @@ namespace Avalonia.Markup.UnitTests.Data return null; } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) { if (value != null && parameter != null) { - var s = value.ToString(); - var prefix = parameter.ToString(); + var s = value.ToString() ?? string.Empty; + var prefix = parameter.ToString() ?? string.Empty; if (s.StartsWith(prefix) == true) { @@ -334,9 +334,9 @@ namespace Avalonia.Markup.UnitTests.Data private class MultiConverter : IMultiValueConverter { - public List Values { get; } = new(); + public List Values { get; } = new(); - public object Convert(IList values, Type targetType, object parameter, CultureInfo culture) + public object? Convert(IList values, Type targetType, object? parameter, CultureInfo culture) { Values.AddRange(values); return values.FirstOrDefault(); diff --git a/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionNodeFactoryTests.cs b/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionNodeFactoryTests.cs index 21884f7ddc..70d4a197c9 100644 --- a/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionNodeFactoryTests.cs +++ b/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionNodeFactoryTests.cs @@ -17,6 +17,7 @@ namespace Avalonia.Markup.UnitTests.Parsers { var result = Parse("Foo"); + Assert.NotNull(result); AssertIsProperty(result[0], "Foo"); } @@ -25,6 +26,7 @@ namespace Avalonia.Markup.UnitTests.Parsers { var result = Parse("_Foo"); + Assert.NotNull(result); AssertIsProperty(result[0], "_Foo"); } @@ -33,6 +35,7 @@ namespace Avalonia.Markup.UnitTests.Parsers { var result = Parse("F0o"); + Assert.NotNull(result); AssertIsProperty(result[0], "F0o"); } @@ -49,6 +52,7 @@ namespace Avalonia.Markup.UnitTests.Parsers { var result = Parse("Foo.Bar.Baz"); + Assert.NotNull(result); Assert.Equal(3, result.Count); AssertIsProperty(result[0], "Foo"); AssertIsProperty(result[1], "Bar"); @@ -60,6 +64,7 @@ namespace Avalonia.Markup.UnitTests.Parsers { var result = Parse("!Foo.Bar.Baz"); + Assert.NotNull(result); Assert.Equal(4, result.Count); AssertIsProperty(result[0], "Foo"); AssertIsProperty(result[1], "Bar"); @@ -72,6 +77,7 @@ namespace Avalonia.Markup.UnitTests.Parsers { var result = Parse("!!Foo.Bar.Baz"); + Assert.NotNull(result); Assert.Equal(5, result.Count); AssertIsProperty(result[0], "Foo"); AssertIsProperty(result[1], "Bar"); @@ -85,6 +91,7 @@ namespace Avalonia.Markup.UnitTests.Parsers { var result = Parse("Foo[15]"); + Assert.NotNull(result); Assert.Equal(2, result.Count); AssertIsProperty(result[0], "Foo"); AssertIsIndexer(result[1], "15"); @@ -96,6 +103,7 @@ namespace Avalonia.Markup.UnitTests.Parsers { var result = Parse("Foo[Key]"); + Assert.NotNull(result); Assert.Equal(2, result.Count); AssertIsProperty(result[0], "Foo"); AssertIsIndexer(result[1], "Key"); @@ -107,6 +115,7 @@ namespace Avalonia.Markup.UnitTests.Parsers { var result = Parse("Foo[15,6]"); + Assert.NotNull(result); Assert.Equal(2, result.Count); AssertIsProperty(result[0], "Foo"); AssertIsIndexer(result[1], "15", "6"); @@ -117,6 +126,7 @@ namespace Avalonia.Markup.UnitTests.Parsers { var result = Parse("Foo[5, 16]"); + Assert.NotNull(result); Assert.Equal(2, result.Count); AssertIsProperty(result[0], "Foo"); AssertIsIndexer(result[1], "5", "16"); @@ -127,6 +137,7 @@ namespace Avalonia.Markup.UnitTests.Parsers { var result = Parse("Foo[15][16]"); + Assert.NotNull(result); Assert.Equal(3, result.Count); AssertIsProperty(result[0], "Foo"); AssertIsIndexer(result[1], "15"); @@ -138,6 +149,7 @@ namespace Avalonia.Markup.UnitTests.Parsers { var result = Parse("Foo.Bar[5, 6].Baz"); + Assert.NotNull(result); Assert.Equal(4, result.Count); AssertIsProperty(result[0], "Foo"); AssertIsProperty(result[1], "Bar"); @@ -150,6 +162,7 @@ namespace Avalonia.Markup.UnitTests.Parsers { var result = Parse("Foo^"); + Assert.NotNull(result); Assert.Equal(2, result.Count); Assert.IsType(result[1]); } @@ -166,7 +179,7 @@ namespace Avalonia.Markup.UnitTests.Parsers Assert.Equal(e.Arguments.Cast().ToArray(), args); } - private static List Parse(string path) + private static List? Parse(string path) { var reader = new CharacterReader(path.AsSpan()); var (astNodes, sourceMode) = BindingExpressionGrammar.Parse(ref reader); diff --git a/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_AttachedProperty.cs b/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_AttachedProperty.cs index 9af7997c32..bac18e60a7 100644 --- a/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_AttachedProperty.cs +++ b/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_AttachedProperty.cs @@ -14,7 +14,7 @@ namespace Avalonia.Markup.UnitTests.Parsers { public class ExpressionObserverBuilderTests_AttachedProperty : ScopedTestBase { - private readonly Func _typeResolver; + private readonly Func _typeResolver; public ExpressionObserverBuilderTests_AttachedProperty() { @@ -87,7 +87,7 @@ namespace Avalonia.Markup.UnitTests.Parsers { var data = new Class1(); var target = Build(data, "(Owner.Foo)", typeResolver: _typeResolver); - var result = new List(); + var result = new List(); var sub = target.Subscribe(x => result.Add(x)); data.SetValue(Owner.FooProperty, "bar"); @@ -111,7 +111,7 @@ namespace Avalonia.Markup.UnitTests.Parsers }; var target = Build(data, "Next.(Owner.Foo)", typeResolver: _typeResolver); - var result = new List(); + var result = new List(); var sub = target.Subscribe(x => result.Add(x)); data.Next.SetValue(Owner.FooProperty, "bar"); @@ -126,15 +126,15 @@ namespace Avalonia.Markup.UnitTests.Parsers [Fact] public void Should_Not_Keep_Source_Alive() { - Func, WeakReference>> run = () => + var run = () => { var source = new Class1(); var target = Build(source, "(Owner.Foo)", typeResolver: _typeResolver); - return Tuple.Create(target, new WeakReference(source)); + return (target, source: new WeakReference(source)); }; var result = run(); - result.Item1.Subscribe(x => { }); + result.target.Subscribe(x => { }); // Mono trickery GC.Collect(2); @@ -142,7 +142,7 @@ namespace Avalonia.Markup.UnitTests.Parsers GC.WaitForPendingFinalizers(); GC.Collect(2); - Assert.Null(result.Item2.Target); + Assert.Null(result.source.Target); } [Fact] @@ -161,7 +161,7 @@ namespace Avalonia.Markup.UnitTests.Parsers Assert.Throws(() => Build(data, "(Owner.Foo.Bar)", typeResolver: _typeResolver)); } - private static IObservable Build(object source, string path, Func typeResolver) + private static IObservable Build(object source, string path, Func typeResolver) { var r = new CharacterReader(path); var grammar = BindingExpressionGrammar.Parse(ref r).Nodes; diff --git a/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_AvaloniaProperty.cs b/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_AvaloniaProperty.cs index 0578689dbc..7c02d6a6e0 100644 --- a/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_AvaloniaProperty.cs +++ b/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_AvaloniaProperty.cs @@ -36,7 +36,7 @@ namespace Avalonia.Markup.UnitTests.Parsers { var data = new Class1(); var target = Build(data, "Foo"); - var result = new List(); + var result = new List(); var sub = target.ToObservable().Subscribe(x => result.Add(x)); data.SetValue(Class1.FooProperty, "bar"); diff --git a/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_Indexer.cs b/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_Indexer.cs index 2469fdaa15..f69f333f10 100644 --- a/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_Indexer.cs +++ b/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_Indexer.cs @@ -159,7 +159,7 @@ namespace Avalonia.Markup.UnitTests.Parsers { var data = new { Foo = new AvaloniaList { "foo", "bar" } }; var target = BuildAsObservable(data, "Foo[2]"); - var result = new List(); + var result = new List(); using (var sub = target.Subscribe(x => result.Add(BindingNotification.ExtractValue(x)))) { @@ -180,7 +180,7 @@ namespace Avalonia.Markup.UnitTests.Parsers { var data = new { Foo = new AvaloniaList { "foo", "bar" } }; var target = BuildAsObservable(data, "Foo[0]"); - var result = new List(); + var result = new List(); using (var sub = target.Subscribe(x => result.Add(x))) { @@ -201,7 +201,7 @@ namespace Avalonia.Markup.UnitTests.Parsers { var data = new { Foo = new AvaloniaList { "foo", "bar" } }; var target = BuildAsObservable(data, "Foo[1]"); - var result = new List(); + var result = new List(); using (var sub = target.Subscribe(x => result.Add(x))) { @@ -225,7 +225,7 @@ namespace Avalonia.Markup.UnitTests.Parsers // as AvaloniaList as it implements PropertyChanged as an explicit interface event. var data = new { Foo = new ObservableCollection { "foo", "bar" } }; var target = BuildAsObservable(data, "Foo[1]"); - var result = new List(); + var result = new List(); var sub = target.Subscribe(x => result.Add(x)); data.Foo.Move(0, 1); @@ -241,7 +241,7 @@ namespace Avalonia.Markup.UnitTests.Parsers { var data = new { Foo = new AvaloniaList { "foo", "bar" } }; var target = BuildAsObservable(data, "Foo[1]"); - var result = new List(); + var result = new List(); var sub = target.Subscribe(x => result.Add(BindingNotification.ExtractValue(x))); data.Foo.Clear(); @@ -260,7 +260,7 @@ namespace Avalonia.Markup.UnitTests.Parsers data.Foo["baz"] = "qux"; var target = BuildAsObservable(data, "Foo[foo]"); - var result = new List(); + var result = new List(); using (var sub = target.Subscribe(x => result.Add(x))) { @@ -368,7 +368,7 @@ namespace Avalonia.Markup.UnitTests.Parsers Assert.Equal(data[1], value); } - private static BindingExpression Build(object source, string path, Func typeResolver = null) + private static BindingExpression Build(object source, string path, Func? typeResolver = null) { var r = new CharacterReader(path); var grammar = BindingExpressionGrammar.Parse(ref r).Nodes; @@ -376,7 +376,7 @@ namespace Avalonia.Markup.UnitTests.Parsers return new BindingExpression(source, nodes, AvaloniaProperty.UnsetValue); } - private static IObservable BuildAsObservable(object source, string path, Func typeResolver = null) + private static IObservable BuildAsObservable(object source, string path, Func? typeResolver = null) { return Build(source, path, typeResolver).ToObservable(); } diff --git a/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_Method.cs b/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_Method.cs index 30e0314844..f8aa960f93 100644 --- a/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_Method.cs +++ b/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_Method.cs @@ -62,7 +62,7 @@ namespace Avalonia.Markup.UnitTests.Parsers var observer = Build(data, nameof(TestObject.MethodWithReturnAndParameter)); var result = await observer.Take(1); - var callback = (Func)result; + var callback = (Func)result!; Assert.Equal(1, callback(1)); @@ -70,7 +70,7 @@ namespace Avalonia.Markup.UnitTests.Parsers } - private static IObservable Build(object source, string path) + private static IObservable Build(object source, string path) { var r = new CharacterReader(path); var grammar = BindingExpressionGrammar.Parse(ref r).Nodes; diff --git a/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_Negation.cs b/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_Negation.cs index 5a516e3da0..51698d76e3 100644 --- a/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_Negation.cs +++ b/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_Negation.cs @@ -23,7 +23,7 @@ namespace Avalonia.Markup.UnitTests.Parsers var target = BuildAsObservable(data, "!Foo"); var result = await target.Take(1); - Assert.True((bool)result); + Assert.True((bool)result!); GC.KeepAlive(data); } @@ -35,7 +35,7 @@ namespace Avalonia.Markup.UnitTests.Parsers var target = BuildAsObservable(data, "!Foo"); var result = await target.Take(1); - Assert.False((bool)result); + Assert.False((bool)result!); GC.KeepAlive(data); } @@ -47,7 +47,7 @@ namespace Avalonia.Markup.UnitTests.Parsers var target = BuildAsObservable(data, "!Foo"); var result = await target.Take(1); - Assert.True((bool)result); + Assert.True((bool)result!); GC.KeepAlive(data); } @@ -59,7 +59,7 @@ namespace Avalonia.Markup.UnitTests.Parsers var target = BuildAsObservable(data, "!Foo"); var result = await target.Take(1); - Assert.False((bool)result); + Assert.False((bool)result!); GC.KeepAlive(data); } @@ -165,19 +165,19 @@ namespace Avalonia.Markup.UnitTests.Parsers enableDataValidation: enableDataValidation); } - private static IObservable BuildAsObservable(object source, string path, bool enableDataValidation = false) + private static IObservable BuildAsObservable(object source, string path, bool enableDataValidation = false) { return Build(source, path, enableDataValidation).ToObservable(); } private class Test : INotifyDataErrorInfo { - private string _dataValidationError; + private string? _dataValidationError; public bool Foo { get; set; } - public object Bar { get; set; } + public object? Bar { get; set; } - public string DataValidationError + public string? DataValidationError { get => _dataValidationError; set @@ -191,11 +191,11 @@ namespace Avalonia.Markup.UnitTests.Parsers } public bool HasErrors => !string.IsNullOrWhiteSpace(DataValidationError); - public event EventHandler ErrorsChanged; + public event EventHandler? ErrorsChanged; - public IEnumerable GetErrors(string propertyName) + public IEnumerable GetErrors(string? propertyName) { - return DataValidationError is object ? new[] { DataValidationError } : null; + return DataValidationError is not null ? new[] { DataValidationError } : []; } } } diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj b/tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj index 343de03cb7..b7fd1ba2a1 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj @@ -11,6 +11,7 @@ + diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Converters/AvaloniaPropertyConverterTest.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Converters/AvaloniaPropertyConverterTest.cs index 414b9be512..945b137e60 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Converters/AvaloniaPropertyConverterTest.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Converters/AvaloniaPropertyConverterTest.cs @@ -85,8 +85,8 @@ namespace Avalonia.Markup.Xaml.UnitTests.Converters } - - private ITypeDescriptorContext CreateContext(Style style = null) + + private ITypeDescriptorContext CreateContext(Style? style = null) { var tdMock = new Mock(); var tr = new Mock(); @@ -99,8 +99,8 @@ namespace Avalonia.Markup.Xaml.UnitTests.Converters .Returns(ps.Object); ps.SetupGet(v => v.Parents) - .Returns(new object[] {style}); - + .Returns(style is null? [] : [style]); + tr.Setup(v => v.Resolve(nameof(Class1))) .Returns(typeof(Class1)); tr.Setup(v => v.Resolve(nameof(AttachedOwner))) diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Converters/ConverterTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Converters/ConverterTests.cs index c9420f1696..0a3a3309b6 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Converters/ConverterTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Converters/ConverterTests.cs @@ -12,12 +12,13 @@ namespace Avalonia.Markup.Xaml.UnitTests.Converters var parsed = AvaloniaRuntimeXamlLoader.Parse( $"<{testClass.Name} xmlns='clr-namespace:{testClass.Namespace}' Uri='/test'/>", testClass.Assembly); + Assert.NotNull(parsed.Uri); Assert.False(parsed.Uri.IsAbsoluteUri); } } public class TestClassWithUri { - public Uri Uri { get; set; } + public Uri? Uri { get; set; } } } diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Converters/GeometryTypeConverterTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Converters/GeometryTypeConverterTests.cs index 329a14afa6..a64de74c21 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Converters/GeometryTypeConverterTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Converters/GeometryTypeConverterTests.cs @@ -15,7 +15,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Converters { public class StringDataViewModel { - public string PathData { get; set; } + public string? PathData { get; set; } } public class IntDataViewModel @@ -37,7 +37,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Converters "; var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); - var path = window.FindControl("path"); + var path = window.GetControl("path"); window.DataContext = vm; Assert.Equal(nullData, path.Data is null); } diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Converters/MultiValueConverterTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Converters/MultiValueConverterTests.cs index d4300a111a..ca2f809a27 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Converters/MultiValueConverterTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Converters/MultiValueConverterTests.cs @@ -30,7 +30,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Converters "; var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); - var textBlock = window.FindControl("textBlock"); + var textBlock = window.GetControl("textBlock"); window.ApplyTemplate(); @@ -50,7 +50,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Converters { public static readonly TestMultiValueConverter Instance = new TestMultiValueConverter(); - public object Convert(IList values, Type targetType, object parameter, CultureInfo culture) + public object Convert(IList values, Type targetType, object? parameter, CultureInfo culture) { if (values[0] is int i && values[1] is int j) { diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Converters/PointsListTypeConverterTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Converters/PointsListTypeConverterTests.cs index 6664c374bc..dd83e0da5a 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Converters/PointsListTypeConverterTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Converters/PointsListTypeConverterTests.cs @@ -23,7 +23,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Converters { var conv = new PointsListTypeConverter(); - var points = (IList)conv.ConvertFrom(input); + var points = (IList)conv.ConvertFrom(input)!; Assert.Equal(2, points.Count); Assert.Equal(new Point(1, 2), points[0]); diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Converters/ValueConverterTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Converters/ValueConverterTests.cs index 4d5983e276..05372862c2 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Converters/ValueConverterTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Converters/ValueConverterTests.cs @@ -22,7 +22,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Converters "; var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); - var textBlock = window.FindControl("textBlock"); + var textBlock = window.GetControl("textBlock"); window.ApplyTemplate(); @@ -42,7 +42,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Converters { public static readonly TestConverter Instance = new TestConverter(); - public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture) { if (value is int i) { @@ -62,7 +62,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Converters return "(default)"; } - public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + public object ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) { throw new NotImplementedException(); } diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests.cs index f724bf5f1c..0cb587f849 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests.cs @@ -27,7 +27,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Data "; var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); - var textBlock = window.FindControl("textBlock"); + var textBlock = window.GetControl("textBlock"); window.DataContext = "foo"; window.ApplyTemplate(); @@ -47,7 +47,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Data "; var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); - var textBlock = window.FindControl("textBlock"); + var textBlock = window.GetControl("textBlock"); window.ApplyTemplate(); @@ -87,7 +87,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Data "; var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); - var textBox = window.FindControl("textBox"); + var textBox = window.GetControl("textBox"); window.ApplyTemplate(); textBox.ApplyTemplate(); @@ -109,7 +109,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Data "; var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); - var border = (Border)window.Content; + var border = (Border)window.Content!; window.DataContext = new { HexString = "#ff0000" }; window.ApplyTemplate(); @@ -124,7 +124,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Data { public static ConcatConverter Instance { get; } = new ConcatConverter(); - public object Convert(IList values, Type targetType, object parameter, CultureInfo culture) + public object Convert(IList values, Type targetType, object? parameter, CultureInfo culture) { return string.Join(",", values); } diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_Method.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_Method.cs index 02cb94e6d1..3310aa6008 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_Method.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_Method.cs @@ -21,7 +21,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Data "; var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); - var button = window.FindControl "; var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml); - var button = window.FindControl