Browse Source

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
pull/20372/head
Julien Lebosquain 9 months ago
committed by GitHub
parent
commit
c68111294f
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 3
      src/Avalonia.Base/Media/IGlyphTypeface.cs
  2. 4
      src/Avalonia.Base/Utilities/StringSplitter.cs
  3. 8
      src/Markup/Avalonia.Markup/Markup/Parsers/ExpressionNodeFactory.cs
  4. 4
      src/Markup/Avalonia.Markup/Markup/Parsers/SelectorParser.cs
  5. 2
      src/Skia/Avalonia.Skia/GlyphTypefaceImpl.cs
  6. 8
      tests/Avalonia.Base.UnitTests/Animation/AnimatableTests.cs
  7. 6
      tests/Avalonia.Base.UnitTests/Animation/KeySplineTests.cs
  8. 4
      tests/Avalonia.Base.UnitTests/Animation/SpringTests.cs
  9. 2
      tests/Avalonia.Base.UnitTests/Animation/TestClock.cs
  10. 1
      tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj
  11. 70
      tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Direct.cs
  12. 4
      tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_GetValue.cs
  13. 28
      tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Inheritance.cs
  14. 22
      tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Metadata.cs
  15. 18
      tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_MultiBinding.cs
  16. 4
      tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_SetCurrentValue.cs
  17. 19
      tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_SetValue.cs
  18. 10
      tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Threading.cs
  19. 19
      tests/Avalonia.Base.UnitTests/AvaloniaPropertyTests.cs
  20. 7
      tests/Avalonia.Base.UnitTests/Collections/AvaloniaDictionaryTests.cs
  21. 21
      tests/Avalonia.Base.UnitTests/Collections/AvaloniaListTests.cs
  22. 4
      tests/Avalonia.Base.UnitTests/Collections/CollectionChangedTracker.cs
  23. 7
      tests/Avalonia.Base.UnitTests/Collections/PropertyChangedTracker.cs
  24. 4
      tests/Avalonia.Base.UnitTests/Composition/BatchStreamTests.cs
  25. 2
      tests/Avalonia.Base.UnitTests/Composition/CompositionAnimationTests.cs
  26. 17
      tests/Avalonia.Base.UnitTests/Data/Core/BindingExpressionTests.DataValidation.cs
  27. 2
      tests/Avalonia.Base.UnitTests/Data/Core/BindingExpressionTests.Observable.cs
  28. 6
      tests/Avalonia.Base.UnitTests/Data/Core/IndeiBase.cs
  29. 26
      tests/Avalonia.Base.UnitTests/Data/Core/Plugins/DataAnnotationsValidationPluginTests.cs
  30. 7
      tests/Avalonia.Base.UnitTests/Data/Core/Plugins/ExceptionValidationPluginTests.cs
  31. 18
      tests/Avalonia.Base.UnitTests/Data/Core/Plugins/IndeiValidationPluginTests.cs
  32. 20
      tests/Avalonia.Base.UnitTests/Data/DefaultValueConverterTests.cs
  33. 4
      tests/Avalonia.Base.UnitTests/Data/ReflectionClrPropertyInfoTests.cs
  34. 4
      tests/Avalonia.Base.UnitTests/Data/StringConvertersTests.cs
  35. 12
      tests/Avalonia.Base.UnitTests/DirectPropertyTests.cs
  36. 8
      tests/Avalonia.Base.UnitTests/DispatcherTests.cs
  37. 15
      tests/Avalonia.Base.UnitTests/Input/InputElement_Focus.cs
  38. 4
      tests/Avalonia.Base.UnitTests/Input/KeyboardNavigationTests_Custom.cs
  39. 6
      tests/Avalonia.Base.UnitTests/Input/KeyboardNavigationTests_Tab.cs
  40. 2
      tests/Avalonia.Base.UnitTests/Input/MouseDeviceTests.cs
  41. 2
      tests/Avalonia.Base.UnitTests/Input/PointerTests.cs
  42. 37
      tests/Avalonia.Base.UnitTests/Input/TouchDeviceTests.cs
  43. 60
      tests/Avalonia.Base.UnitTests/Interactivity/InteractiveTests.cs
  44. 4
      tests/Avalonia.Base.UnitTests/Layout/LayoutTestControl.cs
  45. 4
      tests/Avalonia.Base.UnitTests/Layout/LayoutTestRoot.cs
  46. 4
      tests/Avalonia.Base.UnitTests/Layout/LayoutableTests.cs
  47. 6
      tests/Avalonia.Base.UnitTests/Layout/LayoutableTests_EffectiveViewportChanged.cs
  48. 8
      tests/Avalonia.Base.UnitTests/Logging/LoggingTests.cs
  49. 4
      tests/Avalonia.Base.UnitTests/Media/ColorTests.cs
  50. 6
      tests/Avalonia.Base.UnitTests/Media/FontFamilyTests.cs
  51. 8
      tests/Avalonia.Base.UnitTests/Media/FontManagerTests.cs
  52. 2
      tests/Avalonia.Base.UnitTests/Media/Fonts/FamilyNameCollectionTests.cs
  53. 2
      tests/Avalonia.Base.UnitTests/Media/Fonts/FontFamilyKeyTests.cs
  54. 13
      tests/Avalonia.Base.UnitTests/Media/PathMarkupParserTests.cs
  55. 4
      tests/Avalonia.Base.UnitTests/Media/TextFormatting/BiDiTestDataGenerator.cs
  56. 5
      tests/Avalonia.Base.UnitTests/Media/TextFormatting/FormattedTextSourceTests.cs
  57. 10
      tests/Avalonia.Base.UnitTests/Media/TextFormatting/UnicodeDataGenerator.cs
  58. 4
      tests/Avalonia.Base.UnitTests/Media/TextFormatting/UnicodeEnumsGenerator.cs
  59. 1
      tests/Avalonia.Base.UnitTests/Media/UnicodeRangeTests.cs
  60. 44
      tests/Avalonia.Base.UnitTests/PixelSizeTests.cs
  61. 3
      tests/Avalonia.Base.UnitTests/Rendering/SceneGraph/DrawOperationTests.cs
  62. 2
      tests/Avalonia.Base.UnitTests/Styling/ResourceDictionaryTests.cs
  63. 4
      tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Child.cs
  64. 32
      tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Class.cs
  65. 18
      tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Descendent.cs
  66. 4
      tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Multiple.cs
  67. 26
      tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Nesting.cs
  68. 3
      tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Not.cs
  69. 53
      tests/Avalonia.Base.UnitTests/Styling/SelectorTests_PropertyEquals.cs
  70. 3
      tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Template.cs
  71. 38
      tests/Avalonia.Base.UnitTests/Styling/StyledElementTests.cs
  72. 4
      tests/Avalonia.Base.UnitTests/Styling/TestObserver.cs
  73. 4
      tests/Avalonia.Base.UnitTests/TestVisual.cs
  74. 12
      tests/Avalonia.Base.UnitTests/Utilities/DelegateCommand.cs
  75. 6
      tests/Avalonia.Base.UnitTests/VisualTests.cs
  76. 12
      tests/Avalonia.Base.UnitTests/WeakEventHandlerManagerTests.cs
  77. 14
      tests/Avalonia.Base.UnitTests/WeakEventTests.cs
  78. 1
      tests/Avalonia.Markup.UnitTests/Avalonia.Markup.UnitTests.csproj
  79. 38
      tests/Avalonia.Markup.UnitTests/Data/BindingTests.cs
  80. 6
      tests/Avalonia.Markup.UnitTests/Data/BindingTests_Converters.cs
  81. 8
      tests/Avalonia.Markup.UnitTests/Data/BindingTests_ElementName.cs
  82. 5
      tests/Avalonia.Markup.UnitTests/Data/BindingTests_Logging.cs
  83. 6
      tests/Avalonia.Markup.UnitTests/Data/BindingTests_Source.cs
  84. 38
      tests/Avalonia.Markup.UnitTests/Data/DynamicReflectableType.cs
  85. 2
      tests/Avalonia.Markup.UnitTests/Data/MultiBindingTests_Converters.cs
  86. 12
      tests/Avalonia.Markup.UnitTests/Data/TemplateBindingTests.cs
  87. 15
      tests/Avalonia.Markup.UnitTests/Parsers/ExpressionNodeFactoryTests.cs
  88. 16
      tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_AttachedProperty.cs
  89. 2
      tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_AvaloniaProperty.cs
  90. 16
      tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_Indexer.cs
  91. 4
      tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_Method.cs
  92. 22
      tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_Negation.cs
  93. 1
      tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj
  94. 8
      tests/Avalonia.Markup.Xaml.UnitTests/Converters/AvaloniaPropertyConverterTest.cs
  95. 3
      tests/Avalonia.Markup.Xaml.UnitTests/Converters/ConverterTests.cs
  96. 4
      tests/Avalonia.Markup.Xaml.UnitTests/Converters/GeometryTypeConverterTests.cs
  97. 4
      tests/Avalonia.Markup.Xaml.UnitTests/Converters/MultiValueConverterTests.cs
  98. 2
      tests/Avalonia.Markup.Xaml.UnitTests/Converters/PointsListTypeConverterTests.cs
  99. 6
      tests/Avalonia.Markup.Xaml.UnitTests/Converters/ValueConverterTests.cs
  100. 10
      tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests.cs

3
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
/// <param name="tag">The table tag to get the data for.</param>
/// <param name="table">The contents of the table data for the specified tag.</param>
/// <returns>Returns <c>true</c> if the content exists, otherwise <c>false</c>.</returns>
bool TryGetTable(uint tag, out byte[] table);
bool TryGetTable(uint tag, [NotNullWhen(true)] out byte[]? table);
}
}

4
src/Avalonia.Base/Utilities/StringSplitter.cs

@ -21,7 +21,7 @@ internal static class StringSplitter
/// <param name="closingBracket">The character that closes a bracketed section. <c>)</c> by default.</param>
/// <param name="options">Options for trimming entries and removing empty entries.</param>
/// <returns>An array of split segments. Returns an empty array if the input is null or only whitespace.</returns>
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
/// <param name="closingBracket">The character that closes a bracketed section. <c>)</c> by default.</param>
/// <param name="options">Options for trimming entries and removing empty entries.</param>
/// <returns>An array of split segments. Returns an empty array if the input is null or only whitespace.</returns>
public static string[] SplitRespectingBrackets(string s, ReadOnlySpan<char> separators,
public static string[] SplitRespectingBrackets(string? s, ReadOnlySpan<char> separators,
char openingBracket = DefaultOpeningParenthesis, char closingBracket = DefaultClosingParenthesis,
StringSplitOptions options = StringSplitOptions.None)
{

8
src/Markup/Avalonia.Markup/Markup/Parsers/ExpressionNodeFactory.cs

@ -20,7 +20,7 @@ namespace Avalonia.Markup.Parsers
#endif
public static List<ExpressionNode>? CreateFromAst(
List<BindingExpressionGrammar.INode> astNodes,
Func<string?, string, Type>? typeResolver,
Func<string?, string, Type?>? typeResolver,
INameScope? nameScope,
out bool isRooted)
{
@ -111,7 +111,7 @@ namespace Avalonia.Markup.Parsers
}
private static AvaloniaPropertyAccessorNode AttachedPropertyNode(
Func<string?, string, Type>? typeResolver,
Func<string?, string, Type?>? 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<string?, string, Type>? typeResolver,
Func<string?, string, Type?>? typeResolver,
BindingExpressionGrammar.AncestorNode ancestor)
{
Type? type = null;
@ -135,7 +135,7 @@ namespace Avalonia.Markup.Parsers
}
private static Type LookupType(
Func<string?, string, Type>? typeResolver,
Func<string?, string, Type?>? typeResolver,
string? @namespace,
string? name)
{

4
src/Markup/Avalonia.Markup/Markup/Parsers/SelectorParser.cs

@ -13,7 +13,7 @@ namespace Avalonia.Markup.Parsers
/// </summary>
internal class SelectorParser
{
private readonly Func<string, string, Type> _typeResolver;
private readonly Func<string, string, Type?> _typeResolver;
/// <summary>
/// Initializes a new instance of the <see cref="SelectorParser"/> 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.
/// </param>
public SelectorParser(Func<string, string, Type> typeResolver)
public SelectorParser(Func<string, string, Type?> typeResolver)
{
_typeResolver = typeResolver;
}

2
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);
}

8
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;

6
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<KeySpline>(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<Exception>(() => (KeySpline)conv.ConvertFrom(input));
Assert.ThrowsAny<Exception>(() => (KeySpline?)conv.ConvertFrom(input));
}
[Theory]

4
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<Spring>(conv.ConvertFrom(input));
Assert.NotNull(spring);
Assert.Equal(1, spring.Mass);
@ -32,7 +32,7 @@ public class SpringTests
{
var conv = new SpringTypeConverter();
Assert.ThrowsAny<Exception>(() => (Spring)conv.ConvertFrom(input));
Assert.ThrowsAny<Exception>(() => (Spring?)conv.ConvertFrom(input));
}
[Fact]

2
tests/Avalonia.Base.UnitTests/Animation/TestClock.cs

@ -7,7 +7,7 @@ namespace Avalonia.Base.UnitTests.Animation
{
private TimeSpan _curTime;
private IObserver<TimeSpan> _observer;
private IObserver<TimeSpan>? _observer;
public PlayState PlayState { get; set; } = PlayState.Run;

1
tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj

@ -12,6 +12,7 @@
<Import Project="..\..\build\Rx.props" />
<Import Project="..\..\build\Microsoft.Reactive.Testing.props" />
<Import Project="..\..\build\SharedVersion.props" />
<Import Project="..\..\build\NullableEnable.props" />
<ItemGroup>
<EmbeddedResource Include="..\Avalonia.RenderTests\**\*.ttf" />
<EmbeddedResource Remove="..\Avalonia.RenderTests\Assets\NotoColorEmoji.ttf" />

70
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<BindingValue<string>>();
var source = new Subject<BindingValue<string?>>();
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<BindingValue<string>>();
var source = new Subject<BindingValue<string?>>();
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<string> values = new List<string>();
var values = new List<string?>();
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<BindingValue<string>>();
var source = new Subject<BindingValue<string?>>();
target.Bind(Class1.FooProperty, source);
source.OnNext("initial");
source.OnNext(BindingValue<string>.BindingError(new InvalidOperationException("Foo")));
source.OnNext(BindingValue<string?>.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<BindingValue<string>>();
var source = new Subject<BindingValue<string?>>();
target.Bind(Class1.FooProperty, source);
source.OnNext("initial");
source.OnNext(BindingValue<string>.BindingError(new InvalidOperationException("Foo"), "bar"));
source.OnNext(BindingValue<string?>.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<BindingValue<string>>();
var source = new Subject<BindingValue<string?>>();
target.Bind(Class1.FooProperty, source);
source.OnNext("initial");
source.OnNext(BindingValue<string>.DataValidationError(new InvalidOperationException("Foo")));
source.OnNext(BindingValue<string?>.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<BindingValue<string>>();
var source = new Subject<BindingValue<string?>>();
target.Bind(Class1.FooProperty, source);
source.OnNext("initial");
source.OnNext(BindingValue<string>.DataValidationError(new InvalidOperationException("Foo"), "bar"));
source.OnNext(BindingValue<string?>.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<BindingValue<string>>();
var source = new Subject<BindingValue<string?>>();
target.Bind(Class1.FooProperty, source);
source.OnNext("initial");
source.OnNext(BindingValue<string>.BindingError(new InvalidOperationException("Foo"), "fallback"));
source.OnNext(BindingValue<string?>.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<Class1, string> FooProperty =
AvaloniaProperty.RegisterDirect<Class1, string>(
public static readonly DirectProperty<Class1, string?> FooProperty =
AvaloniaProperty.RegisterDirect<Class1, string?>(
nameof(Foo),
o => o.Foo,
(o, v) => o.Foo = v,
unsetValue: "unset");
public static readonly DirectProperty<Class1, string> BarProperty =
AvaloniaProperty.RegisterDirect<Class1, string>(nameof(Bar), o => o.Bar);
public static readonly DirectProperty<Class1, string?> BarProperty =
AvaloniaProperty.RegisterDirect<Class1, string?>(nameof(Bar), o => o.Bar);
public static readonly DirectProperty<Class1, int> BazProperty =
AvaloniaProperty.RegisterDirect<Class1, int>(
@ -612,26 +612,26 @@ namespace Avalonia.Base.UnitTests
o => o.DoubleValue,
(o, v) => o.DoubleValue = v);
public static readonly DirectProperty<Class1, object> FrankProperty =
AvaloniaProperty.RegisterDirect<Class1, object>(
public static readonly DirectProperty<Class1, object?> FrankProperty =
AvaloniaProperty.RegisterDirect<Class1, object?>(
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<Class2, string> FooProperty =
public static readonly DirectProperty<Class2, string?> FooProperty =
Class1.FooProperty.AddOwner<Class2>(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
{

4
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; }
}
}

28
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; }
}
}

22
tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Metadata.cs

@ -61,15 +61,15 @@ namespace Avalonia.Base.UnitTests
private class Class1 : AvaloniaObject
{
public static readonly StyledProperty<string> StyledProperty =
AvaloniaProperty.Register<Class1, string>("Styled", "foo");
public static readonly StyledProperty<string?> StyledProperty =
AvaloniaProperty.Register<Class1, string?>("Styled", "foo");
public static readonly DirectProperty<Class1, string> DirectProperty =
AvaloniaProperty.RegisterDirect<Class1, string>("Styled", o => o.Direct, unsetValue: "foo");
public static readonly DirectProperty<Class1, string?> DirectProperty =
AvaloniaProperty.RegisterDirect<Class1, string?>("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<Class2>("bar");
DirectProperty.OverrideMetadata<Class2>(new DirectPropertyMetadata<string>("bar"));
DirectProperty.OverrideMetadata<Class2>(new DirectPropertyMetadata<string?>("bar"));
}
}
private class Class3 : AvaloniaObject
{
public static readonly StyledProperty<string> StyledProperty =
public static readonly StyledProperty<string?> StyledProperty =
Class1.StyledProperty.AddOwner<Class3>();
public static readonly DirectProperty<Class3, string> DirectProperty =
public static readonly DirectProperty<Class3, string?> DirectProperty =
Class1.DirectProperty.AddOwner<Class3>(o => o.Direct, unsetValue: "baz");
private string _direct = default;
private string? _direct = null;
static Class3()
{
StyledProperty.OverrideDefaultValue<Class3>("baz");
}
public string Direct
public string? Direct
{
get => _direct;
}

18
tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_MultiBinding.cs

@ -76,7 +76,7 @@ namespace Avalonia.Base.UnitTests
{
var target = new Class1();
var b = new Subject<object>();
var b = new Subject<object?>();
var mb = new MultiBinding()
{
@ -104,7 +104,7 @@ namespace Avalonia.Base.UnitTests
{
var target = new Class1();
var b = new Subject<object>();
var b = new Subject<object?>();
var mb = new MultiBinding()
{
@ -128,7 +128,7 @@ namespace Avalonia.Base.UnitTests
{
var target = new FuncMultiValueConverter<string, string>(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<StringValueTypeWrapper, string>(v => string.Join(",", v.ToArray()));
IList<object> create(string[] values) =>
values.Select(v => (object)(v != null ? new StringValueTypeWrapper() { Value = v } : default)).ToList();
IList<object?> 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<string, string>(v => v[0]);
var target = new FuncMultiValueConverter<string, string?>(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);

4
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

19
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<double?> FredProperty =
AvaloniaProperty.Register<Class2, double?>("Fred");
public Class1 Parent
public Class1? Parent
{
get { return (Class1)InheritanceParent; }
get { return (Class1?)InheritanceParent; }
set { InheritanceParent = value; }
}
}

10
tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Threading.cs

@ -143,8 +143,8 @@ namespace Avalonia.Base.UnitTests
public static readonly StyledProperty<string> StyledProperty =
AvaloniaProperty.Register<Class1, string>("Foo", "foodefault");
public static readonly DirectProperty<Class1, string> DirectProperty =
AvaloniaProperty.RegisterDirect<Class1, string>("Qux", _ => null, (o, v) => { });
public static readonly DirectProperty<Class1, string?> DirectProperty =
AvaloniaProperty.RegisterDirect<Class1, string?>("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
}

19
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<AvaloniaObject, bool>)((a, b) => { });
var overridden = new TestMetadata();
var target = new TestProperty<string>("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<string>();
var result = new List<string?>();
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<AvaloniaObject> OwnerSpecificAction { get; }
public Action<AvaloniaObject>? OwnerSpecificAction { get; }
public TestMetadata(BindingMode defaultBindingMode = BindingMode.Default,
bool? enableDataValidation = null,
Action<AvaloniaObject> ownerSpecificAction = null)
Action<AvaloniaObject>? ownerSpecificAction = null)
: base(defaultBindingMode, enableDataValidation)
{
OwnerSpecificAction = ownerSpecificAction;
@ -178,7 +177,7 @@ namespace Avalonia.Base.UnitTests
private class TestProperty<TValue> : AvaloniaProperty<TValue>
{
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<object> source,
IObservable<object?> 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();
}

7
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<string, string>("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<string, string>("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<string, string>("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<string, string>("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<string, string>("foo", "bar"), tracker.Args.OldItems[0]);
}
@ -164,7 +169,7 @@ namespace Avalonia.Base.UnitTests.Collections
{
Assert.Throws<ArgumentNullException>(() =>
{
var target = new AvaloniaDictionary<string, string>(null, null);
var target = new AvaloniaDictionary<string, string>(null!, null);
});
}

21
tests/Avalonia.Base.UnitTests/Collections/AvaloniaListTests.cs

@ -25,7 +25,7 @@ namespace Avalonia.Base.UnitTests.Collections
{
var target = new AvaloniaList<int>();
Assert.Throws<ArgumentNullException>(() => target.AddRange(null));
Assert.Throws<ArgumentNullException>(() => target.AddRange(null!));
}
[Fact]
@ -33,7 +33,7 @@ namespace Avalonia.Base.UnitTests.Collections
{
var target = new AvaloniaList<int>();
Assert.Throws<ArgumentNullException>(() => target.RemoveAll(null));
Assert.Throws<ArgumentNullException>(() => target.RemoveAll(null!));
}
[Fact]
@ -41,7 +41,7 @@ namespace Avalonia.Base.UnitTests.Collections
{
var target = new AvaloniaList<int>();
Assert.Throws<ArgumentNullException>(() => target.InsertRange(1, null));
Assert.Throws<ArgumentNullException>(() => 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<int>());
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<int>());
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<object>());
};
@ -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<int>());
Assert.NotNull(e.NewItems);
Assert.Equal(new[] { 3 }, e.NewItems.Cast<int>());
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<int>());
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<int>());
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<int>());
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<int>());
Assert.NotNull(e.NewItems);
Assert.Equal(new[] { 3 }, e.NewItems.Cast<int>());
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<int>());
Assert.NotNull(e.NewItems);
Assert.Equal(new[] { 2, 3 }, e.NewItems.Cast<int>());
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<int>());
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(() =>
{

4
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)
{

7
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<string>();
Names = [];
obj.PropertyChanged += PropertyChanged;
}
public List<string> Names { get; }
public List<string?> 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);
}

4
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<object>(false, 10, _ => { });
var objPool = new BatchStreamObjectPool<object?>(false, 10, _ => { });
var guids = new List<Guid>();
var objects = new List<object>();
@ -42,4 +42,4 @@ public class BatchStreamTests
}
}
}

2
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);

17
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<string>? result;
_errors.TryGetValue(propertyName, out result);
return result;
if (propertyName is not null && _errors.TryGetValue(propertyName, out var result))
return result;
return Array.Empty<string>();
}
}
@ -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<string>();
}
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<string>();
}
}

2
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<ViewModel>(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);

6
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<DataErrorsChangedEventArgs> _errorsChanged;
private EventHandler<DataErrorsChangedEventArgs>? _errorsChanged;
public abstract bool HasErrors { get; }
public int ErrorsChangedSubscriptionCount { get; private set; }
public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged
public event EventHandler<DataErrorsChangedEventArgs>? 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 = "")
{

26
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<object>(data), nameof(Data.Between5And10)));
Assert.True(target.Match(new WeakReference<object?>(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<object>(data), nameof(Data.PhoneNumber)));
Assert.True(target.Match(new WeakReference<object?>(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<object>(data), nameof(Data.Unvalidated)));
Assert.False(target.Match(new WeakReference<object?>(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<object>(data), nameof(data.Between5And10));
var validator = validatorPlugin.Start(new WeakReference<object>(data), nameof(data.Between5And10), accessor);
var result = new List<object>();
var accessor = inpcAccessorPlugin.Start(new WeakReference<object?>(data), nameof(data.Between5And10));
Assert.NotNull(accessor);
var validator = validatorPlugin.Start(new WeakReference<object?>(data), nameof(data.Between5And10), accessor);
var result = new List<object?>();
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<object>(data), nameof(data.PhoneNumber));
var validator = validatorPlugin.Start(new WeakReference<object>(data), nameof(data.PhoneNumber), accessor);
var result = new List<object>();
var accessor = inpcAccessorPlugin.Start(new WeakReference<object?>(data), nameof(data.PhoneNumber));
Assert.NotNull(accessor);
var validator = validatorPlugin.Start(new WeakReference<object?>(data), nameof(data.PhoneNumber), accessor);
var result = new List<object?>();
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<BindingNotification>(result[2]);
Assert.Equal(BindingErrorType.DataValidationError, errorResult.ErrorType);
Assert.Equal("abcdefghijklm", errorResult.Value);
var exceptions = ((AggregateException)(errorResult.Error)).InnerExceptions;
var exceptions = Assert.IsAssignableFrom<AggregateException>(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; }
}
}
}

7
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<object>(data), nameof(data.MustBePositive));
var validator = validatorPlugin.Start(new WeakReference<object>(data), nameof(data.MustBePositive), accessor);
var result = new List<object>();
var accessor = inpcAccessorPlugin.Start(new WeakReference<object?>(data), nameof(data.MustBePositive));
Assert.NotNull(accessor);
var validator = validatorPlugin.Start(new WeakReference<object?>(data), nameof(data.MustBePositive), accessor);
var result = new List<object?>();
validator.Subscribe(x => result.Add(x));
validator.SetValue(5, BindingPriority.LocalValue);

18
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<object>(data), nameof(data.Value));
var validator = validatorPlugin.Start(new WeakReference<object>(data), nameof(data.Value), accessor);
var result = new List<object>();
var accessor = inpcAccessorPlugin.Start(new WeakReference<object?>(data), nameof(data.Value));
Assert.NotNull(accessor);
var validator = validatorPlugin.Start(new WeakReference<object?>(data), nameof(data.Value), accessor);
var result = new List<object?>();
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<object>(data), nameof(data.Value));
var validator = validatorPlugin.Start(new WeakReference<object>(data), nameof(data.Value), accessor);
var accessor = inpcAccessorPlugin.Start(new WeakReference<object?>(data), nameof(data.Value));
Assert.NotNull(accessor);
var validator = validatorPlugin.Start(new WeakReference<object?>(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<string?>();
}
private void UpdateError()

20
tests/Avalonia.Base.UnitTests/Data/DefaultValueConverterTests.cs

@ -190,9 +190,9 @@ namespace Avalonia.Base.UnitTests.Data
null,
CultureInfo.InvariantCulture);
Assert.IsAssignableFrom<ICommand>(result);
var command = Assert.IsAssignableFrom<ICommand>(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<ICommand>(result);
var command = Assert.IsAssignableFrom<ICommand>(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);
}

4
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));
}
}

4
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);

12
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<Class1, string>(
var target = new DirectProperty<Class1, string?>(
"test",
o => null,
null,
new DirectPropertyMetadata<string>());
new DirectPropertyMetadata<string?>());
Assert.True(target.IsDirect);
}
@ -68,12 +68,12 @@ namespace Avalonia.Base.UnitTests
private class Class1 : AvaloniaObject
{
public static readonly DirectProperty<Class1, string> FooProperty =
AvaloniaProperty.RegisterDirect<Class1, string>(nameof(Foo), o => o.Foo, (o, v) => o.Foo = v);
public static readonly DirectProperty<Class1, string?> FooProperty =
AvaloniaProperty.RegisterDirect<Class1, string?>(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); }

8
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<string?> AsyncLocalField { get; set; } = new AsyncLocal<string?>();
@ -776,6 +775,5 @@ public partial class DispatcherTests
Assert.NotEqual("sux-Shaw-UM", oldCulture.Name);
}
}
#nullable restore
}

15
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<FocusManager>(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<FocusManager>(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();

4
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);
}

6
tests/Avalonia.Base.UnitTests/Input/KeyboardNavigationTests_Tab.cs

@ -1169,7 +1169,7 @@ namespace Avalonia.Base.UnitTests.Input
}
};
var result = new List<string>();
var result = new List<string?>();
var current = (IInputElement)start;
do
@ -1215,14 +1215,14 @@ namespace Avalonia.Base.UnitTests.Input
}
};
var result = new List<string>();
var result = new List<string?>();
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[]
{

2
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;

2
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<object>();
var receivers = new List<object?>();
var root = new TestRoot(el);
foreach (InputElement d in root.GetSelfAndVisualDescendants())
d.PointerCaptureLost += (s, e) => receivers.Add(s);

37
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);

60
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<string>();
EventHandler<RoutedEventArgs> handler = (s, e) => invoked.Add(((TestInteractive)s).Name);
var invoked = new List<string?>();
EventHandler<RoutedEventArgs> 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<string>();
EventHandler<RoutedEventArgs> handler = (s, e) => invoked.Add(((TestInteractive)s).Name);
var invoked = new List<string?>();
EventHandler<RoutedEventArgs> 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<string>();
EventHandler<RoutedEventArgs> handler = (s, e) => invoked.Add(((TestInteractive)s).Name);
var invoked = new List<string?>();
EventHandler<RoutedEventArgs> 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<string>();
EventHandler<RoutedEventArgs> handler = (s, e) => invoked.Add(((TestInteractive)s).Name);
var invoked = new List<string?>();
EventHandler<RoutedEventArgs> 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<string>();
var invoked = new List<string?>();
EventHandler<RoutedEventArgs> 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<string>();
var invoked = new List<string?>();
EventHandler<RoutedEventArgs> 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<string>();
var invoked = new List<string?>();
EventHandler<RoutedEventArgs> 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<string>();
EventHandler<RoutedEventArgs> handler = (s, e) => invoked.Add(((TestInteractive)s).Name);
var invoked = new List<string?>();
EventHandler<RoutedEventArgs> 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<string>();
EventHandler<RoutedEventArgs> handler = (s, e) => invoked.Add(((TestInteractive)s).Name);
var invoked = new List<string?>();
EventHandler<RoutedEventArgs> 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<string>();
EventHandler<RoutedEventArgs> handler = (s, e) => invoked.Add(((TestInteractive)s).Name);
var invoked = new List<string?>();
EventHandler<RoutedEventArgs> 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<TestInteractive>().ClassHandlerInvoked);
var interactive = target.GetVisualParent<TestInteractive>();
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<TestInteractive>().ClassHandlerInvoked);
var interactive = target.GetVisualParent<TestInteractive>();
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<string>();
EventHandler<RoutedEventArgs> handler = (s, e) => invoked.Add(((TestInteractive)s).Name);
var invoked = new List<string?>();
EventHandler<RoutedEventArgs> 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<RoutedEventArgs> handler,
EventHandler<RoutedEventArgs>? 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<Visual> Children
{
get
{
return ((Visual)this).VisualChildren.AsEnumerable();
return VisualChildren.AsEnumerable();
}
set
{
VisualChildren.Clear();
VisualChildren.AddRange(value.Cast<Visual>());
VisualChildren.AddRange(value);
}
}

4
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<Layoutable, Size, Size> DoMeasureOverride { get; set; }
public Func<Layoutable, Size, Size> DoArrangeOverride { get; set; }
public Func<Layoutable, Size, Size>? DoMeasureOverride { get; set; }
public Func<Layoutable, Size, Size>? DoArrangeOverride { get; set; }
public bool CallBaseMeasure { get; set; }
public bool CallBaseArrange { get; set; }

4
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<Layoutable, Size, Size> DoMeasureOverride { get; set; }
public Func<Layoutable, Size, Size> DoArrangeOverride { get; set; }
public Func<Layoutable, Size, Size>? DoMeasureOverride { get; set; }
public Func<Layoutable, Size, Size>? DoArrangeOverride { get; set; }
protected override Size MeasureOverride(Size availableSize)
{

4
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;

6
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<object, EffectiveViewportChangedEventArgs> handler)
Action<object?, EffectiveViewportChangedEventArgs> handler)
{
void ViewportChanged(object sender, EffectiveViewportChangedEventArgs e)
void ViewportChanged(object? sender, EffectiveViewportChangedEventArgs e)
{
handler(sender, e);
}

8
tests/Avalonia.Base.UnitTests/Logging/LoggingTests.cs

@ -31,10 +31,10 @@ namespace Avalonia.Base.UnitTests.Logging
calledTimes++;
}
});
var panel = window.FindControl<Panel>("panel");
var rect = window.FindControl<Rectangle>("rect");
var panel = window.GetControl<Panel>("panel");
var rect = window.GetControl<Rectangle>("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);
}
}

4
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<ArgumentNullException>(() => Color.Parse((string)null));
Assert.Throws<ArgumentNullException>(() => 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 _));
}

6
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);
}
}

8
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<InvalidOperationException>(() => 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);
}

2
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<ArgumentNullException>(() => new FamilyNameCollection(null));
Assert.Throws<ArgumentNullException>(() => new FamilyNameCollection(null!));
}
[Fact]

2
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<ArgumentNullException>(() => new FontFamilyKey(null));
Assert.Throws<ArgumentNullException>(() => new FontFamilyKey(null!));
}
[Fact]

13
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<LineSegment>(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<LineSegment>(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<LineSegment>(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];

4
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;

5
tests/Avalonia.Base.UnitTests/Media/TextFormatting/FormattedTextSourceTests.cs

@ -22,9 +22,10 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting
new ValueSpan<TextRunProperties>(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());
}

10
tests/Avalonia.Base.UnitTests/Media/TextFormatting/UnicodeDataGenerator.cs

@ -468,15 +468,15 @@ namespace Avalonia.Base.UnitTests.Media.TextFormatting
internal class UnicodeDataEntries
{
public IReadOnlyList<DataEntry> Scripts { get; set; }
public IReadOnlyList<DataEntry> GeneralCategories{ get; set; }
public IReadOnlyList<DataEntry> LineBreakClasses{ get; set; }
public IReadOnlyList<DataEntry> Scripts { get; set; } = [];
public IReadOnlyList<DataEntry> GeneralCategories { get; set; } = [];
public IReadOnlyList<DataEntry> LineBreakClasses { get; set; } = [];
}
internal class BiDiDataEntries
{
public IReadOnlyList<DataEntry> PairedBracketTypes { get; set; }
public IReadOnlyList<DataEntry> BiDiClasses{ get; set; }
public IReadOnlyList<DataEntry> PairedBracketTypes { get; set; } = [];
public IReadOnlyList<DataEntry> BiDiClasses { get; set; } = [];
}
internal readonly struct CodepointRange

4
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');

1
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));
}
}

44
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<object[]> ParseArguments()
public static IEnumerable<object?[]> 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<object[]> TryParseArguments()
public static IEnumerable<object?[]> 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
];
}
}

3
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)]

2
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<ArgumentNullException>(() => target.Add(null, "null"));
Assert.Throws<ArgumentNullException>(() => target.Add(null!, "null"));
}
[Fact]

4
tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Child.cs

@ -47,8 +47,8 @@ namespace Avalonia.Base.UnitTests.Styling
var selector = default(Selector).OfType<TestLogical1>().Class("foo").Child().OfType<TestLogical2>();
var activator = selector.Match(child).Activator;
var result = new List<bool>();
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);

32
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<bool>();
using (activator.Subscribe(x => result.Add(x)))

18
tests/Avalonia.Base.UnitTests/Styling/SelectorTests_Descendent.cs

@ -51,6 +51,7 @@ namespace Avalonia.Base.UnitTests.Styling
var selector = default(Selector).OfType<TestLogical1>().Class("foo").Descendant().OfType<TestLogical3>();
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<TestLogical1>().Class("foo").Descendant().OfType<TestLogical3>();
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<TestLogical1>().Class("foo").Descendant().OfType<TestLogical3>();
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);

4
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));

26
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<Control1>());
Assert.Throws<InvalidOperationException>(() => style.Selector.Match(control, null));
Assert.Throws<InvalidOperationException>(() => style.Selector!.Match(control, null));
}
[Fact]
@ -217,7 +220,7 @@ namespace Avalonia.Base.UnitTests.Styling
}
};
Assert.Throws<InvalidOperationException>(() => nested.Selector.Match(control, parent));
Assert.Throws<InvalidOperationException>(() => 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);

3
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));
}

53
tests/Avalonia.Base.UnitTests/Styling/SelectorTests_PropertyEquals.cs

@ -17,13 +17,13 @@ namespace Avalonia.Base.UnitTests.Styling
class Auth
{
public readonly static AttachedProperty<string> NameProperty =
AvaloniaProperty.RegisterAttached<Auth, AvaloniaObject, string>("Name");
public readonly static AttachedProperty<string?> NameProperty =
AvaloniaProperty.RegisterAttached<Auth, AvaloniaObject, string?>("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]

3
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<Border>();
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<Border>();
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<Border>();
var activator = selector.Match(border).Activator;
Assert.NotNull(activator);
using (activator.Subscribe(_ => { }))
{

38
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<string>();
void Record(object sender, EventArgs e) => called.Add(((StyledElement)sender).Name);
var called = new List<string?>();
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<string>();
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()
{

4
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()
{

4
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

12
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<object, bool> _canExecute;
public DelegateCommand(Action action, Func<object, bool> canExecute = default)
private readonly Func<object?, bool> _canExecute;
public DelegateCommand(Action action, Func<object?, bool>? 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();
}

6
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<Visual>();
var parents = new List<Visual?>();
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]

12
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<EventArgs> Event;
public event EventHandler<EventArgs>? 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();
}

14
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<EventSource, EventArgs> WeakEv = WeakEvent.Register<EventSource>(
@ -26,14 +22,14 @@ namespace Avalonia.Base.UnitTests
class Subscriber : IWeakEventSubscriber<EventArgs>
{
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();
}

1
tests/Avalonia.Markup.UnitTests/Avalonia.Markup.UnitTests.csproj

@ -11,6 +11,7 @@
<Import Project="..\..\build\Rx.props" />
<Import Project="..\..\build\Microsoft.Reactive.Testing.props" />
<Import Project="..\..\build\SharedVersion.props" />
<Import Project="..\..\build\NullableEnable.props" />
<ItemGroup>
<ProjectReference Include="..\..\src\Markup\Avalonia.Markup\Avalonia.Markup.csproj" />
<ProjectReference Include="..\..\src\Avalonia.Base\Avalonia.Base.csproj" />

38
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<object>();
var values = new List<object?>();
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<object> _foo;
private WeakReference<object?>? _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<object>(value);
_foo = new WeakReference<object?>(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<TestControl, object> ValueProperty =
AvaloniaProperty.RegisterDirect<TestControl, object>(
public static readonly DirectProperty<TestControl, object?> ValueProperty =
AvaloniaProperty.RegisterDirect<TestControl, object?>(
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);

6
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<BindingExpression>(instancedBinding.Expression);
Assert.Same(StringConverters.IsNullOrEmpty, expressionObserver.Converter);
}

8
tests/Avalonia.Markup.UnitTests/Data/BindingTests_ElementName.cs

@ -38,7 +38,7 @@ namespace Avalonia.Markup.UnitTests.Data
{
ElementName = "source",
Path = "Text",
NameScope = new WeakReference<INameScope>(NameScope.GetNameScope(root))
NameScope = new WeakReference<INameScope?>(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<INameScope>(NameScope.GetNameScope(root))
NameScope = new WeakReference<INameScope?>(NameScope.GetNameScope(root))
};
target.Bind(ContentControl.ContentProperty, binding);
@ -108,7 +108,7 @@ namespace Avalonia.Markup.UnitTests.Data
{
ElementName = "source",
Path = "Text",
NameScope = new WeakReference<INameScope>(NameScope.GetNameScope(root))
NameScope = new WeakReference<INameScope?>(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<INameScope>(NameScope.GetNameScope(root))
NameScope = new WeakReference<INameScope?>(NameScope.GetNameScope(root))
};
target.Bind(ContentControl.ContentProperty, binding);

5
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);
}
}

6
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 = "")
{

38
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<KeyValuePair<string, object>> 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<PropertyInfo>();
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
}
}
}

2
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<object> values, Type targetType, object parameter, CultureInfo culture)
public object Convert(IList<object?> values, Type targetType, object? parameter, CultureInfo culture)
{
return values.OfType<double>().Sum();
}

12
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<object> Values { get; } = new();
public List<object?> Values { get; } = new();
public object Convert(IList<object> values, Type targetType, object parameter, CultureInfo culture)
public object? Convert(IList<object?> values, Type targetType, object? parameter, CultureInfo culture)
{
Values.AddRange(values);
return values.FirstOrDefault();

15
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<DynamicPluginStreamNode>(result[1]);
}
@ -166,7 +179,7 @@ namespace Avalonia.Markup.UnitTests.Parsers
Assert.Equal(e.Arguments.Cast<string>().ToArray(), args);
}
private static List<ExpressionNode> Parse(string path)
private static List<ExpressionNode>? Parse(string path)
{
var reader = new CharacterReader(path.AsSpan());
var (astNodes, sourceMode) = BindingExpressionGrammar.Parse(ref reader);

16
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<string, string, Type> _typeResolver;
private readonly Func<string?, string, Type?> _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<object>();
var result = new List<object?>();
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<object>();
var result = new List<object?>();
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<Tuple<IObservable<object>, 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<ExpressionParseException>(() => Build(data, "(Owner.Foo.Bar)", typeResolver: _typeResolver));
}
private static IObservable<object> Build(object source, string path, Func<string, string, Type> typeResolver)
private static IObservable<object?> Build(object source, string path, Func<string?, string, Type?> typeResolver)
{
var r = new CharacterReader(path);
var grammar = BindingExpressionGrammar.Parse(ref r).Nodes;

2
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<object>();
var result = new List<object?>();
var sub = target.ToObservable().Subscribe(x => result.Add(x));
data.SetValue(Class1.FooProperty, "bar");

16
tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_Indexer.cs

@ -159,7 +159,7 @@ namespace Avalonia.Markup.UnitTests.Parsers
{
var data = new { Foo = new AvaloniaList<string> { "foo", "bar" } };
var target = BuildAsObservable(data, "Foo[2]");
var result = new List<object>();
var result = new List<object?>();
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<string> { "foo", "bar" } };
var target = BuildAsObservable(data, "Foo[0]");
var result = new List<object>();
var result = new List<object?>();
using (var sub = target.Subscribe(x => result.Add(x)))
{
@ -201,7 +201,7 @@ namespace Avalonia.Markup.UnitTests.Parsers
{
var data = new { Foo = new AvaloniaList<string> { "foo", "bar" } };
var target = BuildAsObservable(data, "Foo[1]");
var result = new List<object>();
var result = new List<object?>();
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<string> { "foo", "bar" } };
var target = BuildAsObservable(data, "Foo[1]");
var result = new List<object>();
var result = new List<object?>();
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<string> { "foo", "bar" } };
var target = BuildAsObservable(data, "Foo[1]");
var result = new List<object>();
var result = new List<object?>();
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<object>();
var result = new List<object?>();
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<string, string, Type> typeResolver = null)
private static BindingExpression Build(object source, string path, Func<string?, string, Type>? 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<object> BuildAsObservable(object source, string path, Func<string, string, Type> typeResolver = null)
private static IObservable<object?> BuildAsObservable(object source, string path, Func<string?, string, Type>? typeResolver = null)
{
return Build(source, path, typeResolver).ToObservable();
}

4
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<object, int>)result;
var callback = (Func<object, int>)result!;
Assert.Equal(1, callback(1));
@ -70,7 +70,7 @@ namespace Avalonia.Markup.UnitTests.Parsers
}
private static IObservable<object> Build(object source, string path)
private static IObservable<object?> Build(object source, string path)
{
var r = new CharacterReader(path);
var grammar = BindingExpressionGrammar.Parse(ref r).Nodes;

22
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<object> BuildAsObservable(object source, string path, bool enableDataValidation = false)
private static IObservable<object?> 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<DataErrorsChangedEventArgs> ErrorsChanged;
public event EventHandler<DataErrorsChangedEventArgs>? 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 } : [];
}
}
}

1
tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj

@ -11,6 +11,7 @@
<Import Project="..\..\build\Rx.props" />
<Import Project="..\..\build\Microsoft.Reactive.Testing.props" />
<Import Project="..\..\build\SharedVersion.props" />
<Import Project="..\..\build\NullableEnable.props" />
<ItemGroup>
<ProjectReference Include="..\..\src\Markup\Avalonia.Markup.Xaml.Loader\Avalonia.Markup.Xaml.Loader.csproj" />
<ProjectReference Include="..\..\src\Markup\Avalonia.Markup.Xaml\Avalonia.Markup.Xaml.csproj" />

8
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<ITypeDescriptorContext>();
var tr = new Mock<IXamlTypeResolver>();
@ -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)))

3
tests/Avalonia.Markup.Xaml.UnitTests/Converters/ConverterTests.cs

@ -12,12 +12,13 @@ namespace Avalonia.Markup.Xaml.UnitTests.Converters
var parsed = AvaloniaRuntimeXamlLoader.Parse<TestClassWithUri>(
$"<{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; }
}
}

4
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
<Path Name='path' Data='{Binding PathData}' Height='10' Width='10'/>
</Window>";
var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
var path = window.FindControl<Path>("path");
var path = window.GetControl<Path>("path");
window.DataContext = vm;
Assert.Equal(nullData, path.Data is null);
}

4
tests/Avalonia.Markup.Xaml.UnitTests/Converters/MultiValueConverterTests.cs

@ -30,7 +30,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Converters
</TextBlock>
</Window>";
var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
var textBlock = window.FindControl<TextBlock>("textBlock");
var textBlock = window.GetControl<TextBlock>("textBlock");
window.ApplyTemplate();
@ -50,7 +50,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Converters
{
public static readonly TestMultiValueConverter Instance = new TestMultiValueConverter();
public object Convert(IList<object> values, Type targetType, object parameter, CultureInfo culture)
public object Convert(IList<object?> values, Type targetType, object? parameter, CultureInfo culture)
{
if (values[0] is int i && values[1] is int j)
{

2
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<Point>)conv.ConvertFrom(input);
var points = (IList<Point>)conv.ConvertFrom(input)!;
Assert.Equal(2, points.Count);
Assert.Equal(new Point(1, 2), points[0]);

6
tests/Avalonia.Markup.Xaml.UnitTests/Converters/ValueConverterTests.cs

@ -22,7 +22,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Converters
<TextBlock Name='textBlock' Text='{Binding Converter={x:Static c:TestConverter.Instance}, FallbackValue=bar}'/>
</Window>";
var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
var textBlock = window.FindControl<TextBlock>("textBlock");
var textBlock = window.GetControl<TextBlock>("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();
}

10
tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests.cs

@ -27,7 +27,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Data
<TextBlock Name='textBlock' Text='{Binding}'/>
</Window>";
var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
var textBlock = window.FindControl<TextBlock>("textBlock");
var textBlock = window.GetControl<TextBlock>("textBlock");
window.DataContext = "foo";
window.ApplyTemplate();
@ -47,7 +47,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Data
<TextBlock Name='textBlock' Text='{Binding}'/>
</Window>";
var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
var textBlock = window.FindControl<TextBlock>("textBlock");
var textBlock = window.GetControl<TextBlock>("textBlock");
window.ApplyTemplate();
@ -87,7 +87,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Data
</TextBox>
</Window>";
var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
var textBox = window.FindControl<TextBox>("textBox");
var textBox = window.GetControl<TextBox>("textBox");
window.ApplyTemplate();
textBox.ApplyTemplate();
@ -109,7 +109,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Data
<Border Background='{Binding HexString}'/>
</Window>";
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<object> values, Type targetType, object parameter, CultureInfo culture)
public object Convert(IList<object?> values, Type targetType, object? parameter, CultureInfo culture)
{
return string.Join(",", values);
}

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save