From dfd8ed824b956e31ba1ce5c33ab812d99aca7ab8 Mon Sep 17 00:00:00 2001 From: Brandon Minnick <13558917+brminnick@users.noreply.github.com> Date: Fri, 13 Sep 2024 12:39:52 -0700 Subject: [PATCH] [Housekeeping] Fix `The active test run was aborted. Reason: Test host process crashed` (#2206) --- azure-pipelines.yml | 4 + .../AppShell.xaml.cs | 11 +-- .../StringToListConverterPage.xaml.cs | 2 +- .../ItemTappedEventArgsConverterViewModel.cs | 6 +- .../ListToStringConverterViewModel.cs | 6 +- ...SelectedItemEventArgsConverterViewModel.cs | 8 +- .../GravatarImageSourceViewModel.cs | 6 +- ...ewInitializationAnalyzerCodeFixProvider.cs | 2 +- ...nityToolkitCameraInitializationAnalyzer.cs | 2 +- .../Views/DrawingView/DrawingLine.shared.cs | 2 +- .../AndroidMediaPermissions.android.cs | 2 +- .../BaseHandlerTest.cs | 8 +- .../Behaviors/MaskedBehaviorTests.cs | 8 +- .../Converters/StringToListConverterTests.cs | 13 +-- .../Mocks/MockCameraProvider.cs | 11 ++- .../Mocks/MockDrawingViewHandler.cs | 45 +++++----- .../Views/DrawingView/DrawingLineTests.cs | 4 +- .../Views/DrawingView/DrawingViewTests.cs | 84 +++++++++++++++---- .../SemanticOrderViewTests.cs | 4 +- .../MathExpressionConverter.shared.cs | 2 +- 20 files changed, 140 insertions(+), 90 deletions(-) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 97447c5c9..a45eee7a9 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -267,6 +267,8 @@ jobs: - task: CmdLine@2 displayName: 'Run CommunityToolkit.Maui.Analyzers.UnitTests' + env: + VSTEST_TESTHOST_SHUTDOWN_TIMEOUT: 1100 # Fixes "The active test run was aborted. Reason: Test host process crashed" https://dev.azure.com/dotnet/CommunityToolkit/_build/results?buildId=109660&view=logs&j=3f96dcf5-6e1e-5485-3200-c557d5216be3&t=12286b69-c788-55db-0a8c-ef899858fbe6&l=76 (source: https://github.com/microsoft/vstest/issues/2952#issuecomment-2234253765): $(sauceUsername) inputs: script: 'dotnet test $(PathToCommunityToolkitAnalyzersUnitTestCsproj) -c Release' @@ -297,6 +299,8 @@ jobs: - task: CmdLine@2 displayName: 'Run CommunityToolkit.Maui.UnitTests' + env: + VSTEST_TESTHOST_SHUTDOWN_TIMEOUT: 1100 # Fixes "The active test run was aborted. Reason: Test host process crashed" https://dev.azure.com/dotnet/CommunityToolkit/_build/results?buildId=109660&view=logs&j=3f96dcf5-6e1e-5485-3200-c557d5216be3&t=12286b69-c788-55db-0a8c-ef899858fbe6&l=76 (source: https://github.com/microsoft/vstest/issues/2952#issuecomment-2234253765): $(sauceUsername) inputs: script: 'dotnet test $(PathToCommunityToolkitUnitTestCsproj) -c Release --settings ".runsettings" --collect "XPlat code coverage" --logger trx --results-directory $(Agent.TempDirectory)' diff --git a/samples/CommunityToolkit.Maui.Sample/AppShell.xaml.cs b/samples/CommunityToolkit.Maui.Sample/AppShell.xaml.cs index 61e4beaad..0c1f5c717 100644 --- a/samples/CommunityToolkit.Maui.Sample/AppShell.xaml.cs +++ b/samples/CommunityToolkit.Maui.Sample/AppShell.xaml.cs @@ -1,4 +1,5 @@ -using CommunityToolkit.Maui.Sample.Pages; +using System.Collections.ObjectModel; +using CommunityToolkit.Maui.Sample.Pages; using CommunityToolkit.Maui.Sample.Pages.Alerts; using CommunityToolkit.Maui.Sample.Pages.Behaviors; using CommunityToolkit.Maui.Sample.Pages.Converters; @@ -24,8 +25,8 @@ namespace CommunityToolkit.Maui.Sample; public partial class AppShell : Shell { - static readonly IReadOnlyDictionary viewModelMappings = new Dictionary(new[] - { + static readonly ReadOnlyDictionary viewModelMappings = new Dictionary( + [ // Add Alerts View Models CreateViewModelMapping(), CreateViewModelMapping(), @@ -137,8 +138,8 @@ public partial class AppShell : Shell CreateViewModelMapping(), // Add PlatformSpecific View Models - CreateViewModelMapping(), - }); + CreateViewModelMapping() + ]).AsReadOnly(); public AppShell() { diff --git a/samples/CommunityToolkit.Maui.Sample/Pages/Converters/StringToListConverterPage.xaml.cs b/samples/CommunityToolkit.Maui.Sample/Pages/Converters/StringToListConverterPage.xaml.cs index 4121e9b37..d10c9cf11 100644 --- a/samples/CommunityToolkit.Maui.Sample/Pages/Converters/StringToListConverterPage.xaml.cs +++ b/samples/CommunityToolkit.Maui.Sample/Pages/Converters/StringToListConverterPage.xaml.cs @@ -11,7 +11,7 @@ public StringToListConverterPage(StringToListConverterViewModel stringToListConv Resources.Add(nameof(StringToListConverter), new StringToListConverter { SplitOptions = StringSplitOptions.RemoveEmptyEntries, - Separators = new[] { ",", ".", ";" } + Separators = [",", ".", ";"] }); InitializeComponent(); diff --git a/samples/CommunityToolkit.Maui.Sample/ViewModels/Converters/ItemTappedEventArgsConverterViewModel.cs b/samples/CommunityToolkit.Maui.Sample/ViewModels/Converters/ItemTappedEventArgsConverterViewModel.cs index 3fa8b55bd..8b3b98dbc 100644 --- a/samples/CommunityToolkit.Maui.Sample/ViewModels/Converters/ItemTappedEventArgsConverterViewModel.cs +++ b/samples/CommunityToolkit.Maui.Sample/ViewModels/Converters/ItemTappedEventArgsConverterViewModel.cs @@ -9,12 +9,12 @@ public partial class ItemTappedEventArgsConverterViewModel : BaseViewModel [ObservableProperty] Person? itemSelected = null; - public IReadOnlyList Items { get; } = new[] - { + public IReadOnlyList Items { get; } = + [ new Person(1, "John Doe"), new Person(2, "Jane Doe"), new Person(3, "Joe Doe") - }; + ]; [RelayCommand] Task ItemTapped(Person? person, CancellationToken token) diff --git a/samples/CommunityToolkit.Maui.Sample/ViewModels/Converters/ListToStringConverterViewModel.cs b/samples/CommunityToolkit.Maui.Sample/ViewModels/Converters/ListToStringConverterViewModel.cs index d8b160335..2a0fa8fe3 100644 --- a/samples/CommunityToolkit.Maui.Sample/ViewModels/Converters/ListToStringConverterViewModel.cs +++ b/samples/CommunityToolkit.Maui.Sample/ViewModels/Converters/ListToStringConverterViewModel.cs @@ -3,11 +3,11 @@ namespace CommunityToolkit.Maui.Sample.ViewModels.Converters; public class ListToStringConverterViewModel : BaseViewModel { - public IReadOnlyList ItemSource { get; } = new[] - { + public IReadOnlyList ItemSource { get; } = + [ "This", "Is", "The", "ListToStringConverter" - }; + ]; } \ No newline at end of file diff --git a/samples/CommunityToolkit.Maui.Sample/ViewModels/Converters/SelectedItemEventArgsConverterViewModel.cs b/samples/CommunityToolkit.Maui.Sample/ViewModels/Converters/SelectedItemEventArgsConverterViewModel.cs index 994f544c4..2f9dfad9d 100644 --- a/samples/CommunityToolkit.Maui.Sample/ViewModels/Converters/SelectedItemEventArgsConverterViewModel.cs +++ b/samples/CommunityToolkit.Maui.Sample/ViewModels/Converters/SelectedItemEventArgsConverterViewModel.cs @@ -11,15 +11,15 @@ public partial class SelectedItemEventArgsConverterViewModel : BaseViewModel [ObservableProperty] string labelText = "This label will display the selected item"; - public IReadOnlyList StringItemSource { get; } = new[] - { + public IReadOnlyList StringItemSource { get; } = + [ "Item 0", "Item 1", "Item 2", "Item 3", "Item 4", - "Item 5", - }; + "Item 5" + ]; [RelayCommand] void HandleItemSelected(string text) diff --git a/samples/CommunityToolkit.Maui.Sample/ViewModels/ImageSources/GravatarImageSourceViewModel.cs b/samples/CommunityToolkit.Maui.Sample/ViewModels/ImageSources/GravatarImageSourceViewModel.cs index 1fa00fe03..414bcbb78 100644 --- a/samples/CommunityToolkit.Maui.Sample/ViewModels/ImageSources/GravatarImageSourceViewModel.cs +++ b/samples/CommunityToolkit.Maui.Sample/ViewModels/ImageSources/GravatarImageSourceViewModel.cs @@ -20,8 +20,8 @@ public partial class GravatarImageSourceViewModel : BaseViewModel public TimeSpan CacheValidityTimespan => TimeSpan.FromDays(CacheValidityInDays); - public IReadOnlyList DefaultGravatarItems { get; } = new[] - { + public IReadOnlyList DefaultGravatarItems { get; } = + [ DefaultImage.MysteryPerson, DefaultImage.FileNotFound, DefaultImage.Identicon, @@ -30,5 +30,5 @@ public partial class GravatarImageSourceViewModel : BaseViewModel DefaultImage.Robohash, DefaultImage.Wavatar, DefaultImage.Blank - }; + ]; } \ No newline at end of file diff --git a/src/CommunityToolkit.Maui.Camera.Analyzers.CodeFixes/UseCommunityToolkitCameraViewInitializationAnalyzerCodeFixProvider.cs b/src/CommunityToolkit.Maui.Camera.Analyzers.CodeFixes/UseCommunityToolkitCameraViewInitializationAnalyzerCodeFixProvider.cs index b4d600d12..5cd86b260 100644 --- a/src/CommunityToolkit.Maui.Camera.Analyzers.CodeFixes/UseCommunityToolkitCameraViewInitializationAnalyzerCodeFixProvider.cs +++ b/src/CommunityToolkit.Maui.Camera.Analyzers.CodeFixes/UseCommunityToolkitCameraViewInitializationAnalyzerCodeFixProvider.cs @@ -13,7 +13,7 @@ namespace CommunityToolkit.Maui.Camera.Analyzers; [ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(UseCommunityToolkitCameraInitializationAnalyzerCodeFixProvider)), Shared] public class UseCommunityToolkitCameraInitializationAnalyzerCodeFixProvider : CodeFixProvider { - public sealed override ImmutableArray FixableDiagnosticIds { get; } = ImmutableArray.Create(UseCommunityToolkitCameraInitializationAnalyzer.DiagnosticId); + public sealed override ImmutableArray FixableDiagnosticIds { get; } = [UseCommunityToolkitCameraInitializationAnalyzer.DiagnosticId]; public sealed override FixAllProvider GetFixAllProvider() => WellKnownFixAllProviders.BatchFixer; diff --git a/src/CommunityToolkit.Maui.Camera.Analyzers/UseCommunityToolkitCameraInitializationAnalyzer.cs b/src/CommunityToolkit.Maui.Camera.Analyzers/UseCommunityToolkitCameraInitializationAnalyzer.cs index 4314d7034..c410db472 100644 --- a/src/CommunityToolkit.Maui.Camera.Analyzers/UseCommunityToolkitCameraInitializationAnalyzer.cs +++ b/src/CommunityToolkit.Maui.Camera.Analyzers/UseCommunityToolkitCameraInitializationAnalyzer.cs @@ -19,7 +19,7 @@ public class UseCommunityToolkitCameraInitializationAnalyzer : DiagnosticAnalyze static readonly DiagnosticDescriptor rule = new(DiagnosticId, title, messageFormat, category, DiagnosticSeverity.Error, isEnabledByDefault: true, description: description); - public override ImmutableArray SupportedDiagnostics { get; } = ImmutableArray.Create(rule); + public override ImmutableArray SupportedDiagnostics { get; } = [rule]; public override void Initialize(AnalysisContext context) { diff --git a/src/CommunityToolkit.Maui.Core/Views/DrawingView/DrawingLine.shared.cs b/src/CommunityToolkit.Maui.Core/Views/DrawingView/DrawingLine.shared.cs index bd4c0670f..e1387164b 100644 --- a/src/CommunityToolkit.Maui.Core/Views/DrawingView/DrawingLine.shared.cs +++ b/src/CommunityToolkit.Maui.Core/Views/DrawingView/DrawingLine.shared.cs @@ -68,6 +68,6 @@ public static ValueTask GetImageStream(IEnumerable points, /// containing the data of the requested image with data that's currently on the . public ValueTask GetImageStream(double imageSizeWidth, double imageSizeHeight, Paint background, CancellationToken token = default) { - return DrawingViewService.GetImageStream(Points.ToList(), new Size(imageSizeWidth, imageSizeHeight), LineWidth, LineColor, background, token); + return DrawingViewService.GetImageStream([.. Points], new Size(imageSizeWidth, imageSizeHeight), LineWidth, LineColor, background, token); } } \ No newline at end of file diff --git a/src/CommunityToolkit.Maui.MediaElement/Primitives/AndroidMediaPermissions.android.cs b/src/CommunityToolkit.Maui.MediaElement/Primitives/AndroidMediaPermissions.android.cs index d8688d07c..6385ce68b 100644 --- a/src/CommunityToolkit.Maui.MediaElement/Primitives/AndroidMediaPermissions.android.cs +++ b/src/CommunityToolkit.Maui.MediaElement/Primitives/AndroidMediaPermissions.android.cs @@ -10,7 +10,7 @@ sealed class AndroidMediaPermissions : BasePlatformPermission static (string androidPermission, bool isRuntime)[] CreatePermissions() { - List<(string androidPermission, bool isRuntime)> requiredPermissionsList = new(); + List<(string androidPermission, bool isRuntime)> requiredPermissionsList = []; if (OperatingSystem.IsAndroidVersionAtLeast(28)) { diff --git a/src/CommunityToolkit.Maui.UnitTests/BaseHandlerTest.cs b/src/CommunityToolkit.Maui.UnitTests/BaseHandlerTest.cs index 270dc5a87..ff71a2556 100644 --- a/src/CommunityToolkit.Maui.UnitTests/BaseHandlerTest.cs +++ b/src/CommunityToolkit.Maui.UnitTests/BaseHandlerTest.cs @@ -13,13 +13,13 @@ protected BaseHandlerTest() protected IServiceProvider ServiceProvider { get; } - protected static TElementHandler CreateElementHandler(IElement view, bool hasMauiContext = true) + protected static TElementHandler CreateElementHandler(IElement view, bool doesRequireMauiContext = true) where TElementHandler : IElementHandler, new() { var mockElementHandler = new TElementHandler(); mockElementHandler.SetVirtualView(view); - if (hasMauiContext) + if (doesRequireMauiContext) { mockElementHandler.SetMauiContext(Application.Current?.Handler?.MauiContext ?? throw new NullReferenceException()); } @@ -27,13 +27,13 @@ protected static TElementHandler CreateElementHandler(IElement return mockElementHandler; } - protected static TViewHandler CreateViewHandler(IView view, bool hasMauiContext = true) + protected static TViewHandler CreateViewHandler(IView view, bool doesRequireMauiContext = true) where TViewHandler : IViewHandler, new() { var mockViewHandler = new TViewHandler(); mockViewHandler.SetVirtualView(view); - if (hasMauiContext) + if (doesRequireMauiContext) { mockViewHandler.SetMauiContext(Application.Current?.Handler?.MauiContext ?? throw new NullReferenceException()); } diff --git a/src/CommunityToolkit.Maui.UnitTests/Behaviors/MaskedBehaviorTests.cs b/src/CommunityToolkit.Maui.UnitTests/Behaviors/MaskedBehaviorTests.cs index bab843d1e..2bbb594f5 100644 --- a/src/CommunityToolkit.Maui.UnitTests/Behaviors/MaskedBehaviorTests.cs +++ b/src/CommunityToolkit.Maui.UnitTests/Behaviors/MaskedBehaviorTests.cs @@ -60,15 +60,15 @@ public void ValidMaskWithUniqueUnmaskedCharacterTests(string? mask, char unmaske [Fact] public void AttachedToInvalidElementTest() { - IReadOnlyList invalidVisualElements = new[] - { + IReadOnlyList invalidVisualElements = + [ new Button(), new Frame(), new Label(), new ProgressBar(), new VisualElement(), - new View(), - }; + new View() + ]; foreach (var invalidVisualElement in invalidVisualElements) { diff --git a/src/CommunityToolkit.Maui.UnitTests/Converters/StringToListConverterTests.cs b/src/CommunityToolkit.Maui.UnitTests/Converters/StringToListConverterTests.cs index 6de8c1056..6f16b7e82 100644 --- a/src/CommunityToolkit.Maui.UnitTests/Converters/StringToListConverterTests.cs +++ b/src/CommunityToolkit.Maui.UnitTests/Converters/StringToListConverterTests.cs @@ -24,7 +24,7 @@ public void StringToListConverterConverterParameterTest(string? value, object? p var stringToListConverter = new StringToListConverter { Separator = "~", - Separators = new[] { "@", "*" } + Separators = ["@", "*"] }; var convertFromResult = stringToListConverter.ConvertFrom(value, parameter); @@ -37,13 +37,16 @@ public void StringToListConverterConverterParameterTest(string? value, object? p [Fact] public void StringToListConverter_EnsureParameterDoesNotOverrideProperty() { - var converter = new StringToListConverter { Separators = new[] { ",", " " } }; + var converter = new StringToListConverter + { + Separators = [",", " "] + }; var parameterResult = converter.ConvertFrom("maui/toolkit tests", new[] { "/", " " }); - Assert.Equal(new[] { "maui", "toolkit", "tests" }, parameterResult); + Assert.Equal(["maui", "toolkit", "tests"], parameterResult); var propertyResult = converter.ConvertFrom("maui,toolkit tests"); - Assert.Equal(new[] { "maui", "toolkit", "tests" }, propertyResult); + Assert.Equal(["maui", "toolkit", "tests"], propertyResult); } [Fact] @@ -55,7 +58,7 @@ public void StringToListConverterSeparatorsTest() var stringToListConverter = new StringToListConverter { Separator = "~", - Separators = new[] { "@", "*" } + Separators = ["@", "*"] }; var convertFromResult = stringToListConverter.ConvertFrom(valueToConvert); diff --git a/src/CommunityToolkit.Maui.UnitTests/Mocks/MockCameraProvider.cs b/src/CommunityToolkit.Maui.UnitTests/Mocks/MockCameraProvider.cs index 9d8cf99f7..aa42ebeab 100644 --- a/src/CommunityToolkit.Maui.UnitTests/Mocks/MockCameraProvider.cs +++ b/src/CommunityToolkit.Maui.UnitTests/Mocks/MockCameraProvider.cs @@ -9,19 +9,18 @@ public class MockCameraProvider : ICameraProvider public ValueTask RefreshAvailableCameras(CancellationToken token) { - AvailableCameras = new[] - { + AvailableCameras = + [ new CameraInfo("Test Camera", Guid.NewGuid().ToString(), CameraPosition.Front, false, 1.0f, 5.0f, - new[] - { + [ new Size(1920, 1080) - }) - }; + ]) + ]; return ValueTask.CompletedTask; } diff --git a/src/CommunityToolkit.Maui.UnitTests/Mocks/MockDrawingViewHandler.cs b/src/CommunityToolkit.Maui.UnitTests/Mocks/MockDrawingViewHandler.cs index 94405fdea..2f45b3392 100644 --- a/src/CommunityToolkit.Maui.UnitTests/Mocks/MockDrawingViewHandler.cs +++ b/src/CommunityToolkit.Maui.UnitTests/Mocks/MockDrawingViewHandler.cs @@ -3,15 +3,16 @@ using CommunityToolkit.Maui.Core.Extensions; using CommunityToolkit.Maui.Core.Handlers; using CommunityToolkit.Maui.Core.Views; +using CommunityToolkit.Maui.Views; using Microsoft.Maui.Handlers; namespace CommunityToolkit.Maui.UnitTests.Mocks; -public class MockDrawingViewHandler : ViewHandler, IDrawingViewHandler +public sealed class MockDrawingViewHandler(IPropertyMapper mapper) : ViewHandler(mapper), IDrawingViewHandler { IDrawingLineAdapter adapter = new DrawingLineAdapter(); - public static readonly PropertyMapper DrawingViewPropertyMapper = new(ViewMapper) + public static readonly PropertyMapper DrawingViewPropertyMapper = new() { [nameof(IDrawingView.LineWidth)] = MapLineWidth, [nameof(IDrawingView.LineColor)] = MapLineColor, @@ -24,32 +25,36 @@ public MockDrawingViewHandler() : this(DrawingViewPropertyMapper) { } - public MockDrawingViewHandler(IPropertyMapper mapper) : base(mapper) - { + public List Lines { get; } = []; + public int MapLineWidthCount { get; private set; } + public int MapLineColorCount { get; private set; } + public int MapShouldSmoothPathWhenDrawnCount { get; private set; } + public int MapIsMultiLineModeEnabledCount { get; private set; } + public int MapDrawCount { get; private set; } + /// + public void SetDrawingLineAdapter(IDrawingLineAdapter drawingLineAdapter) + { + adapter = drawingLineAdapter; } /// - protected override void ConnectHandler(object platformView) + protected override DrawingView CreatePlatformView() => new(); + + /// + protected override void ConnectHandler(DrawingView platformView) { base.ConnectHandler(platformView); VirtualView.Lines.CollectionChanged += Lines_CollectionChanged; } /// - protected override void DisconnectHandler(object platformView) + protected override void DisconnectHandler(DrawingView platformView) { base.DisconnectHandler(platformView); VirtualView.Lines.CollectionChanged -= Lines_CollectionChanged; } - public int MapLineWidthCount { get; private set; } - public int MapLineColorCount { get; private set; } - public int MapShouldSmoothPathWhenDrawnCount { get; private set; } - public int MapIsMultiLineModeEnabledCount { get; private set; } - public int MapDrawCount { get; private set; } - public List Lines { get; } = []; - static void MapLineWidth(MockDrawingViewHandler arg1, IDrawingView arg2) { arg1.MapLineWidthCount++; @@ -75,11 +80,6 @@ static void MapDrawAction(MockDrawingViewHandler arg1, IDrawingView arg2) arg1.MapDrawCount++; } - protected override object CreatePlatformView() - { - return new object(); - } - void Lines_CollectionChanged(object? sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { Lines.Clear(); @@ -101,14 +101,9 @@ void Lines_CollectionChanged(object? sender, System.Collections.Specialized.Noti VirtualView.OnDrawingLineCompleted(drawingLine); } } - - public void SetDrawingLineAdapter(IDrawingLineAdapter drawingLineAdapter) - { - adapter = drawingLineAdapter; - } } -class MockDrawingLineAdapter : IDrawingLineAdapter +sealed class MockDrawingLineAdapter : IDrawingLineAdapter { public IDrawingLine ConvertMauiDrawingLine(MauiDrawingLine mauiDrawingLine) { @@ -123,7 +118,7 @@ public IDrawingLine ConvertMauiDrawingLine(MauiDrawingLine mauiDrawingLine) } } -class MockDrawingLine : IDrawingLine +sealed class MockDrawingLine : IDrawingLine { public int Granularity { get; set; } public Color LineColor { get; set; } = Colors.Blue; diff --git a/src/CommunityToolkit.Maui.UnitTests/Views/DrawingView/DrawingLineTests.cs b/src/CommunityToolkit.Maui.UnitTests/Views/DrawingView/DrawingLineTests.cs index ba6401b0f..d9c1cf84e 100644 --- a/src/CommunityToolkit.Maui.UnitTests/Views/DrawingView/DrawingLineTests.cs +++ b/src/CommunityToolkit.Maui.UnitTests/Views/DrawingView/DrawingLineTests.cs @@ -70,13 +70,13 @@ public void GranularityCheckRange(int value, int expectedValue) drawingLine.Granularity.Should().Be(expectedValue); } - [Fact(Timeout = (int)TestDuration.Short)] + [Fact(Timeout = (int)TestDuration.Medium)] public async Task GetImageStream_CancellationTokenExpired() { var cts = new CancellationTokenSource(TimeSpan.FromMilliseconds(1)); // Ensure CancellationToken Expired - await Task.Delay(100, CancellationToken.None); + await Task.Delay(TimeSpan.FromSeconds(1), CancellationToken.None); await Assert.ThrowsAsync(async () => await drawingLine.GetImageStream(10, 10, Colors.Blue.AsPaint(), cts.Token)); } diff --git a/src/CommunityToolkit.Maui.UnitTests/Views/DrawingView/DrawingViewTests.cs b/src/CommunityToolkit.Maui.UnitTests/Views/DrawingView/DrawingViewTests.cs index e947083b1..b473743b4 100644 --- a/src/CommunityToolkit.Maui.UnitTests/Views/DrawingView/DrawingViewTests.cs +++ b/src/CommunityToolkit.Maui.UnitTests/Views/DrawingView/DrawingViewTests.cs @@ -3,26 +3,20 @@ using CommunityToolkit.Maui.Core.Handlers; using CommunityToolkit.Maui.Core.Views; using CommunityToolkit.Maui.UnitTests.Mocks; +using CommunityToolkit.Maui.Views; using FluentAssertions; using Xunit; using Xunit.Abstractions; namespace CommunityToolkit.Maui.UnitTests.Views; -public class DrawingViewTests : BaseHandlerTest +[Collection(nameof(DrawingViewTests)), CollectionDefinition(nameof(DrawingViewTests), DisableParallelization = true)] +public class DrawingViewTests(ITestOutputHelper testOutputHelper) : BaseHandlerTest { - readonly ITestOutputHelper testOutputHelper; - readonly Maui.Views.DrawingView drawingView = new(); - - public DrawingViewTests(ITestOutputHelper testOutputHelper) - { - this.testOutputHelper = testOutputHelper; - } - [Fact] public void DrawingViewShouldBeAssignedToIDrawingView() { - new Maui.Views.DrawingView().Should().BeAssignableTo(); + new DrawingView().Should().BeAssignableTo(); } [Fact] @@ -40,12 +34,14 @@ public void GetRequiredServiceThrowsOnNoContext() [Fact] public void DefaultLinesShouldNotBeShared() { - new Maui.Views.DrawingView().Lines.Should().NotBeSameAs(new Maui.Views.DrawingView().Lines); + new DrawingView().Lines.Should().NotBeSameAs(new DrawingView().Lines); } [Fact] public void OnLinesCollectionChangedHandlerIsCalled() { + var drawingView = new DrawingView(); + var drawingViewHandler = CreateViewHandler(drawingView); drawingView.Handler.Should().NotBeNull(); @@ -59,6 +55,8 @@ public void OnLinesCollectionChangedHandlerIsCalled() [Fact] public void LineWidthMapperIsCalled() { + var drawingView = new DrawingView(); + var drawingViewHandler = CreateViewHandler(drawingView); drawingView.Handler.Should().NotBeNull(); @@ -71,6 +69,8 @@ public void LineWidthMapperIsCalled() [Fact] public void ClearOnFinishMapperIsCalled() { + var drawingView = new DrawingView(); + var drawingViewHandler = CreateViewHandler(drawingView); drawingView.Handler.Should().NotBeNull(); @@ -83,6 +83,8 @@ public void ClearOnFinishMapperIsCalled() [Fact] public void LineColorMapperIsCalled() { + var drawingView = new DrawingView(); + var drawingViewHandler = CreateViewHandler(drawingView); drawingView.Handler.Should().NotBeNull(); @@ -95,6 +97,8 @@ public void LineColorMapperIsCalled() [Fact] public void MultiLineModeMapperIsCalled() { + var drawingView = new DrawingView(); + var drawingViewHandler = CreateViewHandler(drawingView); drawingView.Handler.Should().NotBeNull(); @@ -108,6 +112,8 @@ public void MultiLineModeMapperIsCalled() [Fact] public void DrawMapperIsCalled() { + var drawingView = new DrawingView(); + var drawingViewHandler = CreateViewHandler(drawingView); drawingView.Handler.Should().NotBeNull(); @@ -120,7 +126,9 @@ public void DrawMapperIsCalled() [Fact] public void CheckDefaultValues() { - var expectedDefaultValue = new Maui.Views.DrawingView + var drawingView = new DrawingView(); + + var expectedDefaultValue = new DrawingView { LineColor = DrawingViewDefaults.LineColor, LineWidth = DrawingViewDefaults.LineWidth, @@ -137,7 +145,11 @@ public void CheckDefaultValues() [Fact] public void ClearShouldClearLines() { - drawingView.Lines = [new DrawingLine()]; + var drawingView = new DrawingView + { + Lines = [new DrawingLine()] + }; + drawingView.Lines.Should().HaveCount(1); drawingView.Clear(); @@ -153,7 +165,7 @@ public async Task GetImageStream_CancellationTokenExpired() // Ensure CancellationToken Expired await Task.Delay(100, CancellationToken.None); - await Assert.ThrowsAsync(async () => await Maui.Views.DrawingView.GetImageStream(new[] { new DrawingLine() }, Size.Zero, Colors.Blue, cts.Token)); + await Assert.ThrowsAsync(async () => await DrawingView.GetImageStream([new DrawingLine()], Size.Zero, Colors.Blue, cts.Token)); } [Fact(Timeout = (int)TestDuration.Short)] @@ -164,12 +176,16 @@ public async Task GetImageStream_CancellationTokenCanceled() // Ensure CancellationToken Expired await cts.CancelAsync(); - await Assert.ThrowsAsync(async () => await Maui.Views.DrawingView.GetImageStream(new[] { new DrawingLine() }, Size.Zero, Colors.Blue, cts.Token)); + await Assert.ThrowsAsync(async () => await DrawingView.GetImageStream([ + new DrawingLine() + ], Size.Zero, Colors.Blue, cts.Token)); } [Fact(Timeout = (int)TestDuration.Short)] public async Task GetImageStreamReturnsNullStream() { + var drawingView = new DrawingView(); + var stream = await drawingView.GetImageStream(10, 10, CancellationToken.None); stream.Should().BeSameAs(Stream.Null); } @@ -177,13 +193,17 @@ public async Task GetImageStreamReturnsNullStream() [Fact(Timeout = (int)TestDuration.Short)] public async Task GetImageStreamStaticReturnsNullStream() { - var stream = await Maui.Views.DrawingView.GetImageStream(new[] { new DrawingLine() }, Size.Zero, Colors.Blue, CancellationToken.None); + var stream = await DrawingView.GetImageStream([ + new DrawingLine() + ], Size.Zero, Colors.Blue, CancellationToken.None); stream.Should().BeSameAs(Stream.Null); } [Fact] public void DefaultDrawingLineAdapter_IDrawingLineIsDrawingLine() { + var drawingView = new DrawingView(); + CreateViewHandler(drawingView); IDrawingLine? currentLine = null; var action = new EventHandler((_, e) => currentLine = e.LastDrawingLine); @@ -204,6 +224,8 @@ public void DefaultDrawingLineAdapter_IDrawingLineIsDrawingLine() [Fact] public void SetDefaultDrawingLineAdapter_IDrawingLineIsDrawingLine() { + var drawingView = new DrawingView(); + var drawingViewHandler = CreateViewHandler(drawingView); drawingViewHandler.SetDrawingLineAdapter(new DrawingLineAdapter()); @@ -227,6 +249,8 @@ public void SetDefaultDrawingLineAdapter_IDrawingLineIsDrawingLine() [Fact] public void SetDrawingLineAdapter_IDrawingLineIsMockDrawingLine() { + var drawingView = new DrawingView(); + var drawingViewHandler = CreateViewHandler(drawingView); drawingViewHandler.SetDrawingLineAdapter(new MockDrawingLineAdapter()); @@ -250,6 +274,8 @@ public void SetDrawingLineAdapter_IDrawingLineIsMockDrawingLine() [Fact] public void OnDrawingStartedLastPointPassedWithCommand() { + var drawingView = new DrawingView(); + var expectedPoint = new PointF(10, 10); PointF? point = null; @@ -262,6 +288,8 @@ public void OnDrawingStartedLastPointPassedWithCommand() [Fact] public void OnDrawingLastPointPassedWithCommand() { + var drawingView = new DrawingView(); + var expectedPoint = new PointF(10, 10); PointF? point = null; @@ -275,13 +303,15 @@ public void OnDrawingLastPointPassedWithCommand() [Obsolete] public void OnDrawingLineCompletedLastDrawingLinePassedWithCommand() { + var drawingView = new DrawingView(); + var expectedDrawingLine = new DrawingLine { LineColor = Colors.Grey, LineWidth = 11f, ShouldSmoothPathWhenDrawn = false, Granularity = 21, - Points = new ObservableCollection(new[] { new PointF(10, 10) }) + Points = [new PointF(10, 10)] }; IDrawingLine? currentLine = null; @@ -295,6 +325,8 @@ public void OnDrawingLineCompletedLastDrawingLinePassedWithCommand() [Obsolete] public void OnDrawingLineCompleted_CommandIsNull_LastDrawingLineNotPassed() { + var drawingView = new DrawingView(); + IDrawingLine? currentLine = null; drawingView.DrawingLineCompletedCommand = null; ((IDrawingView)drawingView).OnDrawingLineCompleted(new DrawingLine()); @@ -305,6 +337,8 @@ public void OnDrawingLineCompleted_CommandIsNull_LastDrawingLineNotPassed() [Fact] public void OnDrawingStarted_CommandIsNull_LastDrawingPointNotPassed() { + var drawingView = new DrawingView(); + PointF? currentPoint = null; drawingView.DrawingLineStartedCommand = null; ((IDrawingView)drawingView).OnDrawingLineStarted(new PointF()); @@ -315,6 +349,8 @@ public void OnDrawingStarted_CommandIsNull_LastDrawingPointNotPassed() [Fact] public void OnDrawing_CommandIsNull_LastDrawingPointNotPassed() { + var drawingView = new DrawingView(); + PointF? currentPoint = null; drawingView.PointDrawnCommand = null; ((IDrawingView)drawingView).OnPointDrawn(new PointF()); @@ -326,6 +362,8 @@ public void OnDrawing_CommandIsNull_LastDrawingPointNotPassed() [Obsolete] public void OnDrawingLineCompleted_CommandIsNotAllowedExecute_LastDrawingLineNotPassed() { + var drawingView = new DrawingView(); + IDrawingLine? currentLine = null; drawingView.DrawingLineCompletedCommand = new Command(line => currentLine = line, _ => false); ((IDrawingView)drawingView).OnDrawingLineCompleted(new DrawingLine()); @@ -336,6 +374,8 @@ public void OnDrawingLineCompleted_CommandIsNotAllowedExecute_LastDrawingLineNot [Fact] public void OnDrawingStarted_CommandIsNotAllowedExecute_LastDrawingPointNotPassed() { + var drawingView = new DrawingView(); + PointF? currentPoint = null; drawingView.DrawingLineStartedCommand = new Command(p => currentPoint = p, _ => false); ((IDrawingView)drawingView).OnDrawingLineStarted(new PointF()); @@ -346,6 +386,8 @@ public void OnDrawingStarted_CommandIsNotAllowedExecute_LastDrawingPointNotPasse [Fact] public void OnDrawing_CommandIsNotAllowedExecute_LastDrawingPointNotPassed() { + var drawingView = new DrawingView(); + PointF? currentPoint = null; drawingView.PointDrawnCommand = new Command(p => currentPoint = p, _ => false); ((IDrawingView)drawingView).OnPointDrawn(new PointF()); @@ -357,13 +399,15 @@ public void OnDrawing_CommandIsNotAllowedExecute_LastDrawingPointNotPassed() [Obsolete] public void OnDrawingLineCompletedLastDrawingLinePassedWithEvent() { + var drawingView = new DrawingView(); + var expectedDrawingLine = new DrawingLine { LineColor = Colors.GreenYellow, LineWidth = 15f, ShouldSmoothPathWhenDrawn = false, Granularity = 55, - Points = new ObservableCollection(new[] { new PointF(10, 10) }) + Points = [new PointF(10, 10)] }; IDrawingLine? currentLine = null; @@ -378,6 +422,8 @@ public void OnDrawingLineCompletedLastDrawingLinePassedWithEvent() [Fact] public void OnDrawingStartedLastDrawingPointPassedWithEvent() { + var drawingView = new DrawingView(); + var expectedPoint = new PointF(10, 10); PointF? currentPoint = null; @@ -392,6 +438,8 @@ public void OnDrawingStartedLastDrawingPointPassedWithEvent() [Fact] public void OnDrawingLastDrawingPointPassedWithEvent() { + var drawingView = new DrawingView(); + var expectedPoint = new PointF(10, 10); PointF? currentPoint = null; diff --git a/src/CommunityToolkit.Maui.UnitTests/Views/SemanticOrderView/SemanticOrderViewTests.cs b/src/CommunityToolkit.Maui.UnitTests/Views/SemanticOrderView/SemanticOrderViewTests.cs index 75ecf1f58..4d86dd65f 100644 --- a/src/CommunityToolkit.Maui.UnitTests/Views/SemanticOrderView/SemanticOrderViewTests.cs +++ b/src/CommunityToolkit.Maui.UnitTests/Views/SemanticOrderView/SemanticOrderViewTests.cs @@ -27,7 +27,7 @@ public void OnViewOrderIsCalled() var semanticOrderViewHandler = CreateViewHandler(semanticOrderView); Assert.NotNull(semanticOrderView.Handler); Assert.Equal(1, semanticOrderViewHandler.OnViewOrderCount); - ((MockSemanticOrderView)semanticOrderView).ViewOrder = new[] { new Button() }; + ((MockSemanticOrderView)semanticOrderView).ViewOrder = [new Button()]; Assert.Equal(2, semanticOrderViewHandler.OnViewOrderCount); } @@ -39,7 +39,7 @@ public void ISemanticOrderViewViewOrderReturnsCorrectViews() var button = new Button(); var entry = new Entry(); - ((MockSemanticOrderView)semanticOrderView).ViewOrder = new IView[] { button, entry }; + ((MockSemanticOrderView)semanticOrderView).ViewOrder = [button, entry]; Assert.Equal(2, semanticOrderView.ViewOrder.Count()); Assert.Equal(button, semanticOrderView.ViewOrder.First()); diff --git a/src/CommunityToolkit.Maui/Converters/MathExpressionConverter/MathExpressionConverter.shared.cs b/src/CommunityToolkit.Maui/Converters/MathExpressionConverter/MathExpressionConverter.shared.cs index defe12120..ceaefd5c6 100644 --- a/src/CommunityToolkit.Maui/Converters/MathExpressionConverter/MathExpressionConverter.shared.cs +++ b/src/CommunityToolkit.Maui/Converters/MathExpressionConverter/MathExpressionConverter.shared.cs @@ -21,7 +21,7 @@ public override double ConvertFrom(double value, string parameter, CultureInfo? { ArgumentNullException.ThrowIfNull(parameter); - var mathExpression = new MathExpression(parameter, new[] { value }); + var mathExpression = new MathExpression(parameter, [value]); return mathExpression.Calculate(); } } \ No newline at end of file