diff --git a/azure-pipelines-integrationtests.yml b/azure-pipelines-integrationtests.yml index e1e037ed3e..8a91e8fd68 100644 --- a/azure-pipelines-integrationtests.yml +++ b/azure-pipelines-integrationtests.yml @@ -43,7 +43,7 @@ jobs: inputs: command: 'test' projects: 'tests/Avalonia.IntegrationTests.Appium/Avalonia.IntegrationTests.Appium.csproj' - arguments: '-l "console;verbosity=detailed"' + arguments: '--no-progress' - script: | pkill IntegrationTestApp @@ -94,6 +94,7 @@ jobs: inputs: command: 'run' projects: 'tests/Avalonia.IntegrationTests.Win32/Avalonia.IntegrationTests.Win32.csproj' + arguments: '--no-progress' - task: VSTest@2 displayName: 'Run Appium Integration Tests' diff --git a/build/XUnit.props b/build/XUnit.props index a5579ed761..c2ccb1fa2c 100644 --- a/build/XUnit.props +++ b/build/XUnit.props @@ -1,14 +1,10 @@  - + + + + - - - - - - - - + $(MSBuildThisFileDirectory)\avalonia.snk diff --git a/global.json b/global.json index 18b3e3be29..3773c7d736 100644 --- a/global.json +++ b/global.json @@ -3,6 +3,9 @@ "version": "10.0.101", "rollForward": "latestFeature" }, + "test": { + "runner": "Microsoft.Testing.Platform" + }, "msbuild-sdks": { "Microsoft.Build.Traversal": "4.1.0" } diff --git a/nukebuild/Build.cs b/nukebuild/Build.cs index 4792aa0445..41c5cbe0cf 100644 --- a/nukebuild/Build.cs +++ b/nukebuild/Build.cs @@ -111,6 +111,9 @@ partial class Build : NukeBuild DotNetTestSettings ApplySetting(DotNetTestSettings c, Configure configurator = null) => ApplySettingCore(c).Test.Apply(configurator); + DotNetRunSettings ApplySetting(DotNetRunSettings c, Configure configurator = null) => + ApplySettingCore(c).Run.Apply(configurator); + Target Clean => _ => _.Executes(() => { foreach (var buildDir in Parameters.BuildDirs) @@ -182,7 +185,10 @@ partial class Build : NukeBuild { RunCoreTest(projectName, (project, tfm) => { - DotNetTest(c => ApplySetting(c, project,tfm)); + // NOTE: Nuke DotNetTest doesn't support Microsoft.Testing.Platform yet. + // Issue: https://github.com/nuke-build/nuke/issues/1584. + // However, we can easily use DotNetRun instead since MTP projects are executables. + DotNetRun(c => ApplySetting(c, project, tfm)); }); } @@ -236,15 +242,17 @@ partial class Build : NukeBuild } } - DotNetTestSettings ApplySetting(DotNetTestSettings settings, string project, string tfm) => + DotNetRunSettings ApplySetting(DotNetRunSettings settings, string project, string tfm) => ApplySetting(settings) .SetProjectFile(project) .SetFramework(tfm) .EnableNoBuild() .EnableNoRestore() + // Disable progress output (works like terminal logger which isn't so nice in CI). + // See https://github.com/microsoft/testfx/issues/7056 + .AddApplicationArguments("--no-progress") .When(_ => Parameters.PublishTestResults, _ => _ - .SetLoggers("trx") - .SetResultsDirectory(Parameters.TestResultsRoot)); + .AddApplicationArguments("--report-trx", "--results-directory", Parameters.TestResultsRoot)); Target RunHtmlPreviewerTests => _ => _ .OnlyWhenStatic(() => !(Parameters.SkipTests)) diff --git a/nukebuild/DotNetConfigHelper.cs b/nukebuild/DotNetConfigHelper.cs index 9d43261616..b5315b3f5a 100644 --- a/nukebuild/DotNetConfigHelper.cs +++ b/nukebuild/DotNetConfigHelper.cs @@ -7,6 +7,7 @@ public class DotNetConfigHelper public DotNetBuildSettings Build; public DotNetPackSettings Pack; public DotNetTestSettings Test; + public DotNetRunSettings Run; public DotNetConfigHelper(DotNetBuildSettings s) { @@ -23,6 +24,11 @@ public class DotNetConfigHelper Test = s; } + public DotNetConfigHelper(DotNetRunSettings s) + { + Run = s; + } + public DotNetConfigHelper AddProperty(string key, bool value) => AddProperty(key, value.ToString(CultureInfo.InvariantCulture).ToLowerInvariant()); public DotNetConfigHelper AddProperty(string key, string value) @@ -30,6 +36,7 @@ public class DotNetConfigHelper Build = Build?.AddProperty(key, value); Pack = Pack?.AddProperty(key, value); Test = Test?.AddProperty(key, value); + Run = Run?.AddProperty(key, value); return this; } @@ -39,6 +46,7 @@ public class DotNetConfigHelper Build = Build?.SetConfiguration(configuration); Pack = Pack?.SetConfiguration(configuration); Test = Test?.SetConfiguration(configuration); + Run = Run?.SetConfiguration(configuration); return this; } @@ -47,10 +55,12 @@ public class DotNetConfigHelper Build = Build?.SetVerbosity(verbosity); Pack = Pack?.SetVerbosity(verbosity); Test = Test?.SetVerbosity(verbosity); + Run = Run?.SetVerbosity(verbosity); return this; } public static implicit operator DotNetConfigHelper(DotNetBuildSettings s) => new DotNetConfigHelper(s); public static implicit operator DotNetConfigHelper(DotNetPackSettings s) => new DotNetConfigHelper(s); public static implicit operator DotNetConfigHelper(DotNetTestSettings s) => new DotNetConfigHelper(s); + public static implicit operator DotNetConfigHelper(DotNetRunSettings s) => new DotNetConfigHelper(s); } diff --git a/tests/Avalonia.Base.UnitTests/Animation/AnimatableTests.cs b/tests/Avalonia.Base.UnitTests/Animation/AnimatableTests.cs index fd68687c4c..339eff1302 100644 --- a/tests/Avalonia.Base.UnitTests/Animation/AnimatableTests.cs +++ b/tests/Avalonia.Base.UnitTests/Animation/AnimatableTests.cs @@ -127,7 +127,7 @@ namespace Avalonia.Base.UnitTests.Animation var rect = new Rectangle() { Width = 11, }; var clock = new TestClock(); - animation.RunAsync(rect, clock); + animation.RunAsync(rect, clock, TestContext.Current.CancellationToken); clock.Step(TimeSpan.Zero); Assert.Equal(1, rect.Width); diff --git a/tests/Avalonia.Base.UnitTests/Animation/AnimationIterationTests.cs b/tests/Avalonia.Base.UnitTests/Animation/AnimationIterationTests.cs index 942ac148c8..28beb4f4e8 100644 --- a/tests/Avalonia.Base.UnitTests/Animation/AnimationIterationTests.cs +++ b/tests/Avalonia.Base.UnitTests/Animation/AnimationIterationTests.cs @@ -34,7 +34,7 @@ namespace Avalonia.Base.UnitTests.Animation var clock = new TestClock(); - animation.RunAsync(border, clock); + animation.RunAsync(border, clock, TestContext.Current.CancellationToken); clock.Step(TimeSpan.Zero); Assert.Equal(border.Width, 0d); @@ -69,7 +69,7 @@ namespace Avalonia.Base.UnitTests.Animation var border = new Border() { Height = 100d, Width = 100d }; var clock = new TestClock(); - var animationRun = animation.RunAsync(border, clock); + var animationRun = animation.RunAsync(border, clock, TestContext.Current.CancellationToken); border.Measure(Size.Infinity); border.Arrange(new Rect(border.DesiredSize)); @@ -118,7 +118,7 @@ namespace Avalonia.Base.UnitTests.Animation var clock = new TestClock(); - animation.RunAsync(border, clock); + animation.RunAsync(border, clock, TestContext.Current.CancellationToken); clock.Step(TimeSpan.FromSeconds(0d)); Assert.Equal(border.Width, 0d); @@ -167,7 +167,7 @@ namespace Avalonia.Base.UnitTests.Animation var clock = new TestClock(); - animation.RunAsync(border, clock); + animation.RunAsync(border, clock, TestContext.Current.CancellationToken); clock.Step(TimeSpan.Zero); @@ -211,7 +211,7 @@ namespace Avalonia.Base.UnitTests.Animation var clock = new TestClock(); - animation.RunAsync(border, clock); + animation.RunAsync(border, clock, TestContext.Current.CancellationToken); clock.Step(TimeSpan.FromSeconds(0)); clock.Step(TimeSpan.FromSeconds(20)); @@ -495,7 +495,7 @@ namespace Avalonia.Base.UnitTests.Animation }; var clock = new TestClock(); - var animationRun = animation.RunAsync(border, clock); + var animationRun = animation.RunAsync(border, clock, TestContext.Current.CancellationToken); clock.Step(TimeSpan.Zero); Assert.Equal(1, animator.CallCount); @@ -556,7 +556,7 @@ namespace Avalonia.Base.UnitTests.Animation }; var clock = new TestClock(); - animation.RunAsync(border, clock); + animation.RunAsync(border, clock, TestContext.Current.CancellationToken); clock.Step(TimeSpan.Zero); Assert.Equal(100.0, border.Width); @@ -597,7 +597,7 @@ namespace Avalonia.Base.UnitTests.Animation }; var clock = new TestClock(); - animation.RunAsync(border, clock); + animation.RunAsync(border, clock, TestContext.Current.CancellationToken); clock.Step(TimeSpan.Zero); clock.Step(TimeSpan.FromSeconds(cue)); diff --git a/tests/Avalonia.Base.UnitTests/Animation/KeySplineTests.cs b/tests/Avalonia.Base.UnitTests/Animation/KeySplineTests.cs index 51feb9dcd0..4402c893ce 100644 --- a/tests/Avalonia.Base.UnitTests/Animation/KeySplineTests.cs +++ b/tests/Avalonia.Base.UnitTests/Animation/KeySplineTests.cs @@ -130,7 +130,7 @@ namespace Avalonia.Base.UnitTests.Animation var clock = new TestClock(); - animation.RunAsync(rect, clock); + animation.RunAsync(rect, clock, TestContext.Current.CancellationToken); // position is what you'd expect at end and beginning clock.Step(TimeSpan.Zero); @@ -185,7 +185,7 @@ namespace Avalonia.Base.UnitTests.Animation var clock = new TestClock(); - animation.RunAsync(rect, clock); + animation.RunAsync(rect, clock, TestContext.Current.CancellationToken); // position is what you'd expect at end and beginning clock.Step(TimeSpan.Zero); @@ -250,7 +250,7 @@ namespace Avalonia.Base.UnitTests.Animation var clock = new TestClock(); - animation.RunAsync(rect, clock); + animation.RunAsync(rect, clock, TestContext.Current.CancellationToken); clock.Step(TimeSpan.Zero); Assert.Equal(10.0, transform.Y, 0.0001); @@ -299,7 +299,7 @@ namespace Avalonia.Base.UnitTests.Animation var clock = new TestClock(); - animation.RunAsync(rect, clock); + animation.RunAsync(rect, clock, TestContext.Current.CancellationToken); clock.Step(TimeSpan.Zero); Assert.Equal(50.0, transform.Y, 0.0001); diff --git a/tests/Avalonia.Base.UnitTests/Animation/SpringTests.cs b/tests/Avalonia.Base.UnitTests/Animation/SpringTests.cs index 43e01dc37b..489a2737c7 100644 --- a/tests/Avalonia.Base.UnitTests/Animation/SpringTests.cs +++ b/tests/Avalonia.Base.UnitTests/Animation/SpringTests.cs @@ -77,7 +77,7 @@ public class SpringTests var rect = new Rectangle() { RenderTransform = rotateTransform }; var clock = new TestClock(); - animation.RunAsync(rect, clock); + animation.RunAsync(rect, clock, TestContext.Current.CancellationToken); clock.Step(TimeSpan.Zero); Assert.Equal(-2.5, rotateTransform.Angle); diff --git a/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj b/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj index d82f42ec07..c7cb21798c 100644 --- a/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj +++ b/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj @@ -1,7 +1,7 @@  $(AvsCurrentTargetFramework) - Library + Exe true true diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Binding.cs b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Binding.cs index 07aa864976..19ede2bbb3 100644 --- a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Binding.cs +++ b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Binding.cs @@ -985,7 +985,7 @@ namespace Avalonia.Base.UnitTests { target.Bind(Class1.QuxProperty, source); - await Task.Run(() => source.OnNext(6.7)); + await Task.Run(() => source.OnNext(6.7), TestContext.Current.CancellationToken); } } diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaPropertyRegistryTests.cs b/tests/Avalonia.Base.UnitTests/AvaloniaPropertyRegistryTests.cs index 23e21c1645..696587377e 100644 --- a/tests/Avalonia.Base.UnitTests/AvaloniaPropertyRegistryTests.cs +++ b/tests/Avalonia.Base.UnitTests/AvaloniaPropertyRegistryTests.cs @@ -2,7 +2,6 @@ using System; using System.Linq; using System.Reactive.Linq; using Xunit; -using Xunit.Abstractions; namespace Avalonia.Base.UnitTests { diff --git a/tests/Avalonia.Base.UnitTests/Composition/CompositionAnimationTests.cs b/tests/Avalonia.Base.UnitTests/Composition/CompositionAnimationTests.cs index 85f791fe7d..cf6d7a8aee 100644 --- a/tests/Avalonia.Base.UnitTests/Composition/CompositionAnimationTests.cs +++ b/tests/Avalonia.Base.UnitTests/Composition/CompositionAnimationTests.cs @@ -2,6 +2,7 @@ using System; using System.Collections; using System.Collections.Generic; using System.Reflection; +using System.Threading.Tasks; using Avalonia.Animation.Easings; using Avalonia.Base.UnitTests.Rendering; using Avalonia.Rendering; @@ -12,6 +13,7 @@ using Avalonia.Threading; using Avalonia.UnitTests; using Xunit; using Xunit.Sdk; +using Xunit.v3; namespace Avalonia.Base.UnitTests.Composition; @@ -54,13 +56,19 @@ public class CompositionAnimationTests : ScopedTestBase } }; - public override IEnumerable GetData(MethodInfo testMethod) + public override ValueTask> GetData(MethodInfo testMethod, DisposalTracker disposalTracker) { + var list = new List(); foreach (var ani in Generate()) { - yield return new Object[] { ani }; + list.Add(new TheoryDataRow(ani)); } + + return ValueTask.FromResult>(list); } + + public override bool SupportsDiscoveryEnumeration() + => true; } class DummyDispatcher : IDispatcher diff --git a/tests/Avalonia.Base.UnitTests/Data/Core/BindingExpressionTests.Indexer.cs b/tests/Avalonia.Base.UnitTests/Data/Core/BindingExpressionTests.Indexer.cs index ef64e546b6..80b78b36bc 100644 --- a/tests/Avalonia.Base.UnitTests/Data/Core/BindingExpressionTests.Indexer.cs +++ b/tests/Avalonia.Base.UnitTests/Data/Core/BindingExpressionTests.Indexer.cs @@ -182,7 +182,7 @@ public partial class BindingExpressionTests data.Foo["foo"] = "bar2"; // Forces WeakEvent compact - Dispatcher.UIThread.RunJobs(); + Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); Assert.Equal("bar2", target.String); diff --git a/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/IndeiValidationPluginTests.cs b/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/IndeiValidationPluginTests.cs index c16675954e..9ef33b3fe4 100644 --- a/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/IndeiValidationPluginTests.cs +++ b/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/IndeiValidationPluginTests.cs @@ -61,7 +61,7 @@ namespace Avalonia.Base.UnitTests.Data.Core.Plugins Assert.Equal(1, data.ErrorsChangedSubscriptionCount); validator.Unsubscribe(); // Forces WeakEvent compact - Dispatcher.UIThread.RunJobs(); + Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); Assert.Equal(0, data.ErrorsChangedSubscriptionCount); } diff --git a/tests/Avalonia.Base.UnitTests/DispatcherTests.Exception.cs b/tests/Avalonia.Base.UnitTests/DispatcherTests.Exception.cs index 45ca7d290b..5cde720bc2 100644 --- a/tests/Avalonia.Base.UnitTests/DispatcherTests.Exception.cs +++ b/tests/Avalonia.Base.UnitTests/DispatcherTests.Exception.cs @@ -37,7 +37,7 @@ public partial class DispatcherTests disp.Post(() => ThrowAnException()); disp.Post(() => executed = true); - disp.RunJobs(); + disp.RunJobs(null, TestContext.Current.CancellationToken); Assert.True(handled); Assert.True(executed); @@ -62,7 +62,7 @@ public partial class DispatcherTests syncContext.Post(_ => ThrowAnException(), null); syncContext.Post(_ => executed = true, null); - disp.RunJobs(); + disp.RunJobs(null, TestContext.Current.CancellationToken); Assert.True(handled); Assert.True(executed); @@ -88,7 +88,7 @@ public partial class DispatcherTests try { dispatcher.Post(ThrowAnException, DispatcherPriority.Normal); - dispatcher.RunJobs(); + dispatcher.RunJobs(null, TestContext.Current.CancellationToken); } catch (Exception e) { @@ -115,7 +115,7 @@ public partial class DispatcherTests try { dispatcher.Post(ThrowAnException, DispatcherPriority.Normal); - dispatcher.RunJobs(); + dispatcher.RunJobs(null, TestContext.Current.CancellationToken); } catch (Exception) { @@ -143,8 +143,8 @@ public partial class DispatcherTests try { // Since both Invoke and InvokeAsync can throw exception, there is no need to pass them to the UnhandledException. - dispatcher.Invoke(ThrowAnException, DispatcherPriority.Normal); - dispatcher.RunJobs(); + dispatcher.Invoke(ThrowAnException, DispatcherPriority.Normal, TestContext.Current.CancellationToken); + dispatcher.RunJobs(null, TestContext.Current.CancellationToken); } catch (Exception e) { @@ -172,9 +172,9 @@ public partial class DispatcherTests try { // Since both Invoke and InvokeAsync can throw exception, there is no need to pass them to the UnhandledException. - var op = dispatcher.InvokeAsync(ThrowAnException, DispatcherPriority.Normal); + var op = dispatcher.InvokeAsync(ThrowAnException, DispatcherPriority.Normal, TestContext.Current.CancellationToken); op.Wait(); - dispatcher.RunJobs(); + dispatcher.RunJobs(null, TestContext.Current.CancellationToken); } catch (Exception e) { @@ -202,7 +202,7 @@ public partial class DispatcherTests try { dispatcher.Post(ThrowAnException, DispatcherPriority.Normal); - dispatcher.RunJobs(); + dispatcher.RunJobs(null, TestContext.Current.CancellationToken); } catch (Exception e) { @@ -233,7 +233,7 @@ public partial class DispatcherTests try { dispatcher.Post(ThrowAnException, DispatcherPriority.Normal); - dispatcher.RunJobs(); + dispatcher.RunJobs(null, TestContext.Current.CancellationToken); } catch (Exception e) { @@ -263,7 +263,7 @@ public partial class DispatcherTests try { dispatcher.Post(ThrowAnException, DispatcherPriority.Normal); - dispatcher.RunJobs(); + dispatcher.RunJobs(null, TestContext.Current.CancellationToken); } catch (Exception) { @@ -291,7 +291,7 @@ public partial class DispatcherTests try { dispatcher.Post(ThrowAnException, DispatcherPriority.Normal); - dispatcher.RunJobs(); + dispatcher.RunJobs(null, TestContext.Current.CancellationToken); } catch (Exception e) { diff --git a/tests/Avalonia.Base.UnitTests/DispatcherTests.cs b/tests/Avalonia.Base.UnitTests/DispatcherTests.cs index 801f93438a..d6e5243abd 100644 --- a/tests/Avalonia.Base.UnitTests/DispatcherTests.cs +++ b/tests/Avalonia.Base.UnitTests/DispatcherTests.cs @@ -137,8 +137,8 @@ public partial class DispatcherTests var impl = new SimpleDispatcherImpl(); var disp = new Dispatcher(impl); var actions = new List(); - var toPromote = disp.InvokeAsync(()=>actions.Add("PromotedRender"), DispatcherPriority.Background); - var toPromote2 = disp.InvokeAsync(()=>actions.Add("PromotedRender2"), DispatcherPriority.Input); + var toPromote = disp.InvokeAsync(()=>actions.Add("PromotedRender"), DispatcherPriority.Background, TestContext.Current.CancellationToken); + var toPromote2 = disp.InvokeAsync(()=>actions.Add("PromotedRender2"), DispatcherPriority.Input, TestContext.Current.CancellationToken); disp.Post(() => actions.Add("Render"), DispatcherPriority.Render); toPromote.Priority = DispatcherPriority.Render; @@ -444,7 +444,7 @@ public partial class DispatcherTests }, DispatcherPriority.Background); disp.MainLoop(CancellationToken.None); - disp.Invoke(DumpCurrentPriority, DispatcherPriority.Send); + disp.Invoke(DumpCurrentPriority, DispatcherPriority.Send, TestContext.Current.CancellationToken); disp.Invoke(() => { DumpCurrentPriority(); @@ -500,7 +500,7 @@ public partial class DispatcherTests { var t = Test(); var cts = new CancellationTokenSource(); - Task.Delay(3000).ContinueWith(_ => cts.Cancel()); + Task.Delay(3000, TestContext.Current.CancellationToken).ContinueWith(_ => cts.Cancel(), TestContext.Current.CancellationToken); Dispatcher.UIThread.MainLoop(cts.Token); Assert.True(t.IsCompletedSuccessfully); t.GetAwaiter().GetResult(); @@ -657,7 +657,7 @@ public partial class DispatcherTests tokenSource.Cancel(); }); - }); + }, TestContext.Current.CancellationToken); Dispatcher.UIThread.MainLoop(tokenSource.Token); await Task.WhenAll(task); @@ -699,7 +699,7 @@ public partial class DispatcherTests { tokenSource.Cancel(); }); - }); + }, TestContext.Current.CancellationToken); Dispatcher.UIThread.MainLoop(tokenSource.Token); await Task.WhenAll(task); @@ -753,7 +753,7 @@ public partial class DispatcherTests await Task.WhenAll(task1); tokenSource.Cancel(); }); - }); + }, TestContext.Current.CancellationToken); try { diff --git a/tests/Avalonia.Base.UnitTests/Input/KeyboardNavigationTests_Tab.cs b/tests/Avalonia.Base.UnitTests/Input/KeyboardNavigationTests_Tab.cs index e5b1d3c1d5..7e8dbde0cb 100644 --- a/tests/Avalonia.Base.UnitTests/Input/KeyboardNavigationTests_Tab.cs +++ b/tests/Avalonia.Base.UnitTests/Input/KeyboardNavigationTests_Tab.cs @@ -1311,7 +1311,7 @@ namespace Avalonia.Base.UnitTests.Input top.ApplyTemplate(); - Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); + Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded, TestContext.Current.CancellationToken); var result = KeyboardNavigationHandler.GetNext(current, NavigationDirection.Next) as Button; diff --git a/tests/Avalonia.Base.UnitTests/Layout/LayoutManagerTests.cs b/tests/Avalonia.Base.UnitTests/Layout/LayoutManagerTests.cs index 0cdf177501..443f6cd206 100644 --- a/tests/Avalonia.Base.UnitTests/Layout/LayoutManagerTests.cs +++ b/tests/Avalonia.Base.UnitTests/Layout/LayoutManagerTests.cs @@ -474,7 +474,7 @@ namespace Avalonia.Base.UnitTests.Layout root.LayoutManager.InvalidateArrange(control); root.LayoutManager.ExecuteInitialLayoutPass(); - Dispatcher.UIThread.RunJobs(DispatcherPriority.Render); + Dispatcher.UIThread.RunJobs(DispatcherPriority.Render, TestContext.Current.CancellationToken); Assert.Equal(1, layoutCount); } diff --git a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/BiDiAlgorithmTests.cs b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/BiDiAlgorithmTests.cs index 372f65784f..e1b8da0796 100644 --- a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/BiDiAlgorithmTests.cs +++ b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/BiDiAlgorithmTests.cs @@ -1,7 +1,6 @@ using Avalonia.Media.TextFormatting.Unicode; using Avalonia.Utilities; using Xunit; -using Xunit.Abstractions; namespace Avalonia.Visuals.UnitTests.Media.TextFormatting { diff --git a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/BiDiClassTests.cs b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/BiDiClassTests.cs index 540797ee96..5fe0e10ac9 100644 --- a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/BiDiClassTests.cs +++ b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/BiDiClassTests.cs @@ -4,7 +4,6 @@ using System.Runtime.InteropServices; using System.Text; using Avalonia.Media.TextFormatting.Unicode; using Xunit; -using Xunit.Abstractions; namespace Avalonia.Visuals.UnitTests.Media.TextFormatting { diff --git a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/GraphemeBreakClassTrieGeneratorTests.cs b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/GraphemeBreakClassTrieGeneratorTests.cs index b866a2d81c..0030456239 100644 --- a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/GraphemeBreakClassTrieGeneratorTests.cs +++ b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/GraphemeBreakClassTrieGeneratorTests.cs @@ -2,7 +2,6 @@ using Avalonia.Media.TextFormatting.Unicode; using Avalonia.Visuals.UnitTests.Media.TextFormatting; using Xunit; -using Xunit.Abstractions; namespace Avalonia.Base.UnitTests.Media.TextFormatting { diff --git a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/LineBreakEnumeratorTests.cs b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/LineBreakEnumeratorTests.cs index 38df949d1a..4be9265694 100644 --- a/tests/Avalonia.Base.UnitTests/Media/TextFormatting/LineBreakEnumeratorTests.cs +++ b/tests/Avalonia.Base.UnitTests/Media/TextFormatting/LineBreakEnumeratorTests.cs @@ -6,7 +6,6 @@ using System.Linq; using System.Net.Http; using Avalonia.Media.TextFormatting.Unicode; using Xunit; -using Xunit.Abstractions; using static Avalonia.Media.TextFormatting.Unicode.LineBreakEnumerator; namespace Avalonia.Base.UnitTests.Media.TextFormatting diff --git a/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj b/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj index 235b5d8709..aae46782c9 100644 --- a/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj +++ b/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj @@ -3,6 +3,7 @@ $(AvsCurrentTargetFramework) Exe false + false diff --git a/tests/Avalonia.Build.Tasks.UnitTest/Avalonia.Build.Tasks.UnitTest.csproj b/tests/Avalonia.Build.Tasks.UnitTest/Avalonia.Build.Tasks.UnitTest.csproj index f136e275c1..f0c0c5b3aa 100644 --- a/tests/Avalonia.Build.Tasks.UnitTest/Avalonia.Build.Tasks.UnitTest.csproj +++ b/tests/Avalonia.Build.Tasks.UnitTest/Avalonia.Build.Tasks.UnitTest.csproj @@ -3,7 +3,7 @@ $(AvsCurrentTargetFramework);net481 false - Library + Exe false true Debug diff --git a/tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.csproj b/tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.csproj index 8344d6389d..30cfa68c7e 100644 --- a/tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.csproj +++ b/tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.csproj @@ -1,7 +1,7 @@  $(AvsCurrentTargetFramework) - Library + Exe true diff --git a/tests/Avalonia.Controls.UnitTests/ButtonTests.cs b/tests/Avalonia.Controls.UnitTests/ButtonTests.cs index 5309dc9f84..92bf013725 100644 --- a/tests/Avalonia.Controls.UnitTests/ButtonTests.cs +++ b/tests/Avalonia.Controls.UnitTests/ButtonTests.cs @@ -103,7 +103,7 @@ namespace Avalonia.Controls.UnitTests }; var root = new TestRoot { Child = target }; - Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); + Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded, TestContext.Current.CancellationToken); Assert.True(target.IsEnabled); Assert.False(target.IsEffectivelyEnabled); @@ -341,7 +341,7 @@ namespace Avalonia.Controls.UnitTests target.Presenter!.UpdateChild(); kd.SetFocusedElement(target, NavigationMethod.Unspecified, KeyModifiers.None); - Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); + Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded, TestContext.Current.CancellationToken); var accessKey = Key.A; target.CommandParameter = true; diff --git a/tests/Avalonia.Controls.UnitTests/CalendarDatePickerTests.cs b/tests/Avalonia.Controls.UnitTests/CalendarDatePickerTests.cs index 21ef53d04b..9124c317b8 100644 --- a/tests/Avalonia.Controls.UnitTests/CalendarDatePickerTests.cs +++ b/tests/Avalonia.Controls.UnitTests/CalendarDatePickerTests.cs @@ -33,7 +33,7 @@ namespace Avalonia.Controls.UnitTests }; DateTime value = new DateTime(2000, 10, 10); datePicker.SelectedDate = value; - Threading.Dispatcher.UIThread.RunJobs(); + Threading.Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); Assert.True(handled); } } diff --git a/tests/Avalonia.Controls.UnitTests/DatePickerTests.cs b/tests/Avalonia.Controls.UnitTests/DatePickerTests.cs index 3ec2a3a55d..e8a8e75e66 100644 --- a/tests/Avalonia.Controls.UnitTests/DatePickerTests.cs +++ b/tests/Avalonia.Controls.UnitTests/DatePickerTests.cs @@ -30,7 +30,7 @@ namespace Avalonia.Controls.UnitTests }; DateTimeOffset value = new DateTimeOffset(2000, 10, 10, 0, 0, 0, TimeSpan.Zero); datePicker.SelectedDate = value; - Threading.Dispatcher.UIThread.RunJobs(); + Threading.Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); Assert.True(handled); } } @@ -46,7 +46,7 @@ namespace Avalonia.Controls.UnitTests DayVisible = false }; datePicker.ApplyTemplate(); - Threading.Dispatcher.UIThread.RunJobs(); + Threading.Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); var desc = datePicker.GetVisualDescendants(); Assert.True(desc.Count() > 1);//Should be layoutroot grid & button @@ -81,7 +81,7 @@ namespace Avalonia.Controls.UnitTests MonthVisible = false }; datePicker.ApplyTemplate(); - Threading.Dispatcher.UIThread.RunJobs(); + Threading.Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); var desc = datePicker.GetVisualDescendants(); Assert.True(desc.Count() > 1);//Should be layoutroot grid & button @@ -116,7 +116,7 @@ namespace Avalonia.Controls.UnitTests YearVisible = false }; datePicker.ApplyTemplate(); - Threading.Dispatcher.UIThread.RunJobs(); + Threading.Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); var desc = datePicker.GetVisualDescendants(); Assert.True(desc.Count() > 1);//Should be layoutroot grid & button @@ -151,7 +151,7 @@ namespace Avalonia.Controls.UnitTests YearVisible = false }; datePicker.ApplyTemplate(); - Threading.Dispatcher.UIThread.RunJobs(); + Threading.Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); var desc = datePicker.GetVisualDescendants(); Assert.True(desc.Count() > 1);//Should be layoutroot grid & button @@ -232,7 +232,7 @@ namespace Avalonia.Controls.UnitTests Assert.True(DataValidationErrors.GetHasErrors(datePicker)); - Dispatcher.UIThread.RunJobs(); + Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); datePicker.SelectedDate = new DateTimeOffset(2005, 5, 10, 11, 12, 13, TimeSpan.Zero); Assert.True(handled); } diff --git a/tests/Avalonia.Controls.UnitTests/GridLengthTests.cs b/tests/Avalonia.Controls.UnitTests/GridLengthTests.cs index d05b67c4f2..80239abb25 100644 --- a/tests/Avalonia.Controls.UnitTests/GridLengthTests.cs +++ b/tests/Avalonia.Controls.UnitTests/GridLengthTests.cs @@ -118,7 +118,7 @@ namespace Avalonia.Controls.UnitTests { CultureInfo.CurrentCulture = culture; Assert.Equal(result, length.ToString()); - }); + }, TestContext.Current.CancellationToken); } } } diff --git a/tests/Avalonia.Controls.UnitTests/GridTests.cs b/tests/Avalonia.Controls.UnitTests/GridTests.cs index 84c0596a8b..a625634ac7 100644 --- a/tests/Avalonia.Controls.UnitTests/GridTests.cs +++ b/tests/Avalonia.Controls.UnitTests/GridTests.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Linq; using Avalonia.UnitTests; using Xunit; -using Xunit.Abstractions; namespace Avalonia.Controls.UnitTests { diff --git a/tests/Avalonia.Controls.UnitTests/ListBoxTests.cs b/tests/Avalonia.Controls.UnitTests/ListBoxTests.cs index 3d1bf85248..1a02f20057 100644 --- a/tests/Avalonia.Controls.UnitTests/ListBoxTests.cs +++ b/tests/Avalonia.Controls.UnitTests/ListBoxTests.cs @@ -435,7 +435,7 @@ namespace Avalonia.Controls.UnitTests items.Remove("1"); lm.ExecuteLayoutPass(); - Threading.Dispatcher.UIThread.RunJobs(); + Threading.Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); Assert.Equal("30", target.ContainerFromIndex(items.Count - 1)!.DataContext); Assert.Equal("29", target.ContainerFromIndex(items.Count - 2)!.DataContext); @@ -462,12 +462,12 @@ namespace Avalonia.Controls.UnitTests Prepare(target); - Threading.Dispatcher.UIThread.RunJobs(); + Threading.Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); // First an item that is not index 0 must be selected. _mouse.Click(target.Presenter!.Panel!.Children[1]); - Threading.Dispatcher.UIThread.RunJobs(); + Threading.Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); Assert.Equal(1, target.Selection.AnchorIndex); @@ -489,7 +489,7 @@ namespace Avalonia.Controls.UnitTests // Click item 9. _mouse.Click(item); - Threading.Dispatcher.UIThread.RunJobs(); + Threading.Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); Assert.Equal(1, raised); } @@ -732,7 +732,7 @@ namespace Avalonia.Controls.UnitTests items.Reverse(); Layout(target); - Threading.Dispatcher.UIThread.RunJobs(); + Threading.Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); realized = target.GetRealizedContainers() .Cast() diff --git a/tests/Avalonia.Controls.UnitTests/LoadedTests.cs b/tests/Avalonia.Controls.UnitTests/LoadedTests.cs index 8153a49a09..fd70a0ed63 100644 --- a/tests/Avalonia.Controls.UnitTests/LoadedTests.cs +++ b/tests/Avalonia.Controls.UnitTests/LoadedTests.cs @@ -25,7 +25,7 @@ public class LoadedTests : ScopedTestBase Assert.Equal(0, unloadedCount); target.Show(); - Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); + Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded, TestContext.Current.CancellationToken); Assert.True(target.IsLoaded); Assert.Equal(1, loadedCount); @@ -59,7 +59,7 @@ public class LoadedTests : ScopedTestBase Assert.Equal(0, unloadedCount); window.Content = target; - Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); + Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded, TestContext.Current.CancellationToken); Assert.True(target.IsLoaded); Assert.Equal(1, loadedCount); @@ -98,7 +98,7 @@ public class LoadedTests : ScopedTestBase // Attach to another logical parent (this can actually happen outside tests with overlay popups) ((ISetLogicalParent) target).SetParent(new Window()); - Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); + Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded, TestContext.Current.CancellationToken); // At this point, the control shouldn't have been loaded at all. Assert.Null(target.VisualParent); diff --git a/tests/Avalonia.Controls.UnitTests/MenuItemTests.cs b/tests/Avalonia.Controls.UnitTests/MenuItemTests.cs index 3d39d371f9..35bf427bc1 100644 --- a/tests/Avalonia.Controls.UnitTests/MenuItemTests.cs +++ b/tests/Avalonia.Controls.UnitTests/MenuItemTests.cs @@ -139,7 +139,7 @@ namespace Avalonia.Controls.UnitTests }; var root = new TestRoot { Child = target }; - Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); + Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded, TestContext.Current.CancellationToken); Assert.True(target.IsEnabled); Assert.False(target.IsEffectivelyEnabled); @@ -213,7 +213,7 @@ namespace Avalonia.Controls.UnitTests var target = new MenuItem { Command = command }; var root = new TestRoot { Child = target }; - Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); + Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded, TestContext.Current.CancellationToken); target.CommandParameter = true; Assert.True(target.IsEffectivelyEnabled); @@ -239,7 +239,7 @@ namespace Avalonia.Controls.UnitTests window.ApplyStyling(); window.ApplyTemplate(); window.Presenter!.ApplyTemplate(); - Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); + Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded, TestContext.Current.CancellationToken); Assert.True(target.IsEffectivelyEnabled); target.Command = command; @@ -252,7 +252,7 @@ namespace Avalonia.Controls.UnitTests Assert.Equal(0, canExecuteCallCount); contextMenu.Open(); - Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); + Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded, TestContext.Current.CancellationToken); Assert.Equal(3, canExecuteCallCount);// 3 because popup is changing logical child and moreover we need to invalidate again after the item is attached to the visual tree command.RaiseCanExecuteChanged(); @@ -281,7 +281,7 @@ namespace Avalonia.Controls.UnitTests window.ApplyStyling(); window.ApplyTemplate(); window.Presenter!.ApplyTemplate(); - Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); + Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded, TestContext.Current.CancellationToken); Assert.True(target.IsEffectivelyEnabled); target.Command = command; Assert.Equal(0, canExecuteCallCount); @@ -293,7 +293,7 @@ namespace Avalonia.Controls.UnitTests Assert.Equal(0, canExecuteCallCount); flyout.ShowAt(button); - Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); + Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded, TestContext.Current.CancellationToken); Assert.Equal(2, canExecuteCallCount); // 2 because we need to invalidate after the item is attached to the visual tree command.RaiseCanExecuteChanged(); @@ -324,7 +324,7 @@ namespace Avalonia.Controls.UnitTests window.Presenter!.ApplyTemplate(); contextMenu.Open(); - Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded); + Dispatcher.UIThread.RunJobs(DispatcherPriority.Loaded, TestContext.Current.CancellationToken); Assert.True(target.IsEffectivelyEnabled); target.Command = command; diff --git a/tests/Avalonia.Controls.UnitTests/Platform/ScreensTests.cs b/tests/Avalonia.Controls.UnitTests/Platform/ScreensTests.cs index 081b9e0611..bdb104a746 100644 --- a/tests/Avalonia.Controls.UnitTests/Platform/ScreensTests.cs +++ b/tests/Avalonia.Controls.UnitTests/Platform/ScreensTests.cs @@ -25,7 +25,7 @@ public class ScreensTests : ScopedTestBase // Push 2 screens. screens.PushNewScreens([1, 2]); - Dispatcher.UIThread.RunJobs(); + Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); Assert.Equal(2, screens.ScreenCount); totalScreens.Add(Assert.IsType(screens.GetScreen(1))); @@ -33,7 +33,7 @@ public class ScreensTests : ScopedTestBase // Push 3 screens, while removing one old. screens.PushNewScreens([2, 3, 4]); - Dispatcher.UIThread.RunJobs(); + Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); Assert.Equal(3, screens.ScreenCount); Assert.Null(screens.GetScreen(1)); @@ -64,7 +64,7 @@ public class ScreensTests : ScopedTestBase Assert.Empty(screens.AllScreens); screens.PushNewScreens([1]); - Dispatcher.UIThread.RunJobs(); + Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); var screen = screens.GetScreen(1); @@ -73,7 +73,7 @@ public class ScreensTests : ScopedTestBase Assert.Equal(new IntPtr(1), screen.TryGetPlatformHandle()!.Handle); screens.PushNewScreens([1]); - Dispatcher.UIThread.RunJobs(); + Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); Assert.Equal(2, screen.Generation); Assert.Equal(new IntPtr(1), screen.TryGetPlatformHandle()!.Handle); @@ -94,7 +94,7 @@ public class ScreensTests : ScopedTestBase screens.PushNewScreens([1, 2]); screens.PushNewScreens([1, 2]); // OnChanged can be triggered multiple times by different events - Dispatcher.UIThread.RunJobs(); + Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); Assert.Equal(2, screens.ScreenCount); Assert.NotEmpty(screens.AllScreens); @@ -118,7 +118,7 @@ public class ScreensTests : ScopedTestBase }; ThreadRunHelper.RunOnDedicatedThread(() => screens.PushNewScreens([1, 2])).GetAwaiter().GetResult(); - Dispatcher.UIThread.RunJobs(); + Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); Assert.Equal(1, hasChangedTimes); } @@ -131,7 +131,7 @@ public class ScreensTests : ScopedTestBase var screens = new TestScreens(); screens.PushNewScreens([1, 2]); - Dispatcher.UIThread.RunJobs(); + Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); var hasChangedTimes = 0; var screen = screens.GetScreen(2); @@ -144,7 +144,7 @@ public class ScreensTests : ScopedTestBase }; screens.PushNewScreens([1]); - Dispatcher.UIThread.RunJobs(); + Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); Assert.Equal(1, hasChangedTimes); } diff --git a/tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs b/tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs index 0957149927..134b1e9c5b 100644 --- a/tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs +++ b/tests/Avalonia.Controls.UnitTests/Primitives/PopupTests.cs @@ -814,7 +814,7 @@ namespace Avalonia.Controls.UnitTests.Primitives var window = PreparedWindow(popup); window.Show(); popup.Open(); - Dispatcher.UIThread.RunJobs(DispatcherPriority.AfterRender); + Dispatcher.UIThread.RunJobs(DispatcherPriority.AfterRender, TestContext.Current.CancellationToken); var raised = false; if (popup.Host is PopupRoot popupRoot) @@ -837,7 +837,7 @@ namespace Avalonia.Controls.UnitTests.Primitives }; } window.Position = new PixelPoint(10, 10); - Dispatcher.UIThread.RunJobs(DispatcherPriority.AfterRender); + Dispatcher.UIThread.RunJobs(DispatcherPriority.AfterRender, TestContext.Current.CancellationToken); Assert.False(raised); } } @@ -867,7 +867,7 @@ namespace Avalonia.Controls.UnitTests.Primitives var window = PreparedWindow(placementTarget); window.Show(); popup.Open(); - Dispatcher.UIThread.RunJobs(DispatcherPriority.AfterRender); + Dispatcher.UIThread.RunJobs(DispatcherPriority.AfterRender, TestContext.Current.CancellationToken); // The target's initial placement is (395,295) which is a 10x10 panel centered in a 800x600 window Assert.Equal(placementTarget.Bounds, new Rect(395D, 295D, 10, 10)); @@ -898,7 +898,7 @@ namespace Avalonia.Controls.UnitTests.Primitives }; } window.PlatformImpl?.Resize(new Size(700D, 500D), WindowResizeReason.Unspecified); - Dispatcher.UIThread.RunJobs(DispatcherPriority.AfterRender); + Dispatcher.UIThread.RunJobs(DispatcherPriority.AfterRender, TestContext.Current.CancellationToken); Assert.True(raised); } } @@ -928,7 +928,7 @@ namespace Avalonia.Controls.UnitTests.Primitives var window = PreparedWindow(placementTarget); window.Show(); popup.Open(); - Dispatcher.UIThread.RunJobs(DispatcherPriority.AfterRender); + Dispatcher.UIThread.RunJobs(DispatcherPriority.AfterRender, TestContext.Current.CancellationToken); // The target's initial placement is (395,295) which is a 10x10 panel centered in a 800x600 window Assert.Equal(placementTarget.Bounds, new Rect(395D, 295D, 10, 10)); @@ -954,7 +954,7 @@ namespace Avalonia.Controls.UnitTests.Primitives }; } window.PlatformImpl?.Resize(new Size(700D, 500D), WindowResizeReason.Unspecified); - Dispatcher.UIThread.RunJobs(DispatcherPriority.AfterRender); + Dispatcher.UIThread.RunJobs(DispatcherPriority.AfterRender, TestContext.Current.CancellationToken); Assert.False(raised); } } @@ -983,7 +983,7 @@ namespace Avalonia.Controls.UnitTests.Primitives var window = PreparedWindow(placementTarget); window.Show(); popup.Open(); - Dispatcher.UIThread.RunJobs(); + Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); // The target's initial placement is (395,295) which is a 10x10 panel centered in a 800x600 window Assert.Equal(placementTarget.Bounds, new Rect(395D, 295D, 10, 10)); @@ -1013,7 +1013,7 @@ namespace Avalonia.Controls.UnitTests.Primitives }; } placementTarget.Margin = new Thickness(10, 0, 0, 0); - Dispatcher.UIThread.RunJobs(); + Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); Assert.True(raised); } } @@ -1043,7 +1043,7 @@ namespace Avalonia.Controls.UnitTests.Primitives var window = PreparedWindow(placementTarget); window.Show(); popup.Open(); - Dispatcher.UIThread.RunJobs(); + Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); // The target's initial placement is (395,295) which is a 10x10 panel centered in a 800x600 window Assert.Equal(placementTarget.Bounds, new Rect(395D, 295D, 10, 10)); @@ -1069,7 +1069,7 @@ namespace Avalonia.Controls.UnitTests.Primitives }; } placementTarget.Margin = new Thickness(10, 0, 0, 0); - Dispatcher.UIThread.RunJobs(); + Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); Assert.False(raised); } } @@ -1240,7 +1240,7 @@ namespace Avalonia.Controls.UnitTests.Primitives root.LayoutManager.ExecuteInitialLayoutPass(); popup.Open(); - Dispatcher.UIThread.RunJobs(DispatcherPriority.AfterRender); + Dispatcher.UIThread.RunJobs(DispatcherPriority.AfterRender, TestContext.Current.CancellationToken); // X: Adorned Canvas.Left + Adorner Margin Left + Adorner Width // Y: Adorned Canvas.Top + Adorner Margin Top + Adorner Height diff --git a/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs b/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs index adaa76efb0..814bf00344 100644 --- a/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs +++ b/tests/Avalonia.Controls.UnitTests/Primitives/SelectingItemsControlTests.cs @@ -1649,7 +1649,7 @@ namespace Avalonia.Controls.UnitTests.Primitives Prepare(target); target.AddHandler(Control.RequestBringIntoViewEvent, (s, e) => raised = true); target.SelectedIndex = 2; - Threading.Dispatcher.UIThread.RunJobs(); + Threading.Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); Assert.True(raised); } @@ -1676,7 +1676,7 @@ namespace Avalonia.Controls.UnitTests.Primitives target.AddHandler(Control.RequestBringIntoViewEvent, (s, e) => raised = true); target.SelectedIndex = 2; Prepare(target); - Threading.Dispatcher.UIThread.RunJobs(); + Threading.Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); Assert.True(raised); } @@ -1750,7 +1750,7 @@ namespace Avalonia.Controls.UnitTests.Primitives root.Child = null; target.SelectedIndex = 1; root.Child = target; - Threading.Dispatcher.UIThread.RunJobs(); + Threading.Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); Assert.True(raised); } @@ -1811,11 +1811,11 @@ namespace Avalonia.Controls.UnitTests.Primitives var raised = false; target.AddHandler(Control.RequestBringIntoViewEvent, (s, e) => raised = true); target.SelectedIndex = 2; - Threading.Dispatcher.UIThread.RunJobs(); + Threading.Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); Assert.False(raised); target.AutoScrollToSelectedItem = true; - Threading.Dispatcher.UIThread.RunJobs(); + Threading.Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); Assert.True(raised); } diff --git a/tests/Avalonia.Controls.UnitTests/TimePickerTests.cs b/tests/Avalonia.Controls.UnitTests/TimePickerTests.cs index 5541994f51..5877b6edfc 100644 --- a/tests/Avalonia.Controls.UnitTests/TimePickerTests.cs +++ b/tests/Avalonia.Controls.UnitTests/TimePickerTests.cs @@ -30,7 +30,7 @@ namespace Avalonia.Controls.UnitTests }; TimeSpan value = TimeSpan.FromHours(10); timePicker.SelectedTime = value; - Threading.Dispatcher.UIThread.RunJobs(); + Threading.Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); Assert.True(handled); } } @@ -249,7 +249,7 @@ namespace Avalonia.Controls.UnitTests Assert.True(DataValidationErrors.GetHasErrors(timePicker)); - Dispatcher.UIThread.RunJobs(); + Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); timePicker.SelectedTime = new TimeSpan(11, 12, 13); Assert.True(handled); } diff --git a/tests/Avalonia.Controls.UnitTests/TransitioningContentControlTests.cs b/tests/Avalonia.Controls.UnitTests/TransitioningContentControlTests.cs index ad22824333..b604ad2cfc 100644 --- a/tests/Avalonia.Controls.UnitTests/TransitioningContentControlTests.cs +++ b/tests/Avalonia.Controls.UnitTests/TransitioningContentControlTests.cs @@ -9,6 +9,7 @@ using Avalonia.Controls.Templates; using Avalonia.Headless; using Avalonia.Layout; using Avalonia.Platform; +using Avalonia.Threading; using Avalonia.UnitTests; using Avalonia.VisualTree; using Xunit; diff --git a/tests/Avalonia.Controls.UnitTests/Utils/HotKeyManagerTests.cs b/tests/Avalonia.Controls.UnitTests/Utils/HotKeyManagerTests.cs index d2ed78afaf..3611e06e48 100644 --- a/tests/Avalonia.Controls.UnitTests/Utils/HotKeyManagerTests.cs +++ b/tests/Avalonia.Controls.UnitTests/Utils/HotKeyManagerTests.cs @@ -53,7 +53,7 @@ namespace Avalonia.Controls.UnitTests.Utils } [Theory] - [MemberData(nameof(ElementsFactory), parameters: true)] + [MemberData(nameof(ElementsFactory), arguments: true)] public void HotKeyManager_Should_Use_CommandParameter(string factoryName, Factory factory) { using (AvaloniaLocator.EnterScope()) @@ -98,7 +98,7 @@ namespace Avalonia.Controls.UnitTests.Utils [Theory] - [MemberData(nameof(ElementsFactory), parameters: true)] + [MemberData(nameof(ElementsFactory), arguments: true)] public void HotKeyManager_Should_Do_Not_Executed_When_IsEnabled_False(string factoryName, Factory factory) { using (AvaloniaLocator.EnterScope()) @@ -141,7 +141,7 @@ namespace Avalonia.Controls.UnitTests.Utils } [Theory] - [MemberData(nameof(ElementsFactory), parameters:false)] + [MemberData(nameof(ElementsFactory), arguments:false)] public void HotKeyManager_Should_Invoke_Event_Click_When_Command_Is_Null(string factoryName, Factory factory) { using (AvaloniaLocator.EnterScope()) @@ -197,7 +197,7 @@ namespace Avalonia.Controls.UnitTests.Utils } [Theory] - [MemberData(nameof(ElementsFactory), parameters: true)] + [MemberData(nameof(ElementsFactory), arguments: true)] public void HotKeyManager_Should_Not_Invoke_Event_Click_When_Command_Is_Not_Null(string factoryName, Factory factory) { using (AvaloniaLocator.EnterScope()) diff --git a/tests/Avalonia.Controls.UnitTests/WindowTests.cs b/tests/Avalonia.Controls.UnitTests/WindowTests.cs index 9bcd2e3b0c..2ec0b7f80d 100644 --- a/tests/Avalonia.Controls.UnitTests/WindowTests.cs +++ b/tests/Avalonia.Controls.UnitTests/WindowTests.cs @@ -718,7 +718,7 @@ namespace Avalonia.Controls.UnitTests target.Width = 120; target.Height = 70; - Dispatcher.UIThread.RunJobs(); + Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); Assert.Equal(1, child.MeasureSizes.Count); Assert.Equal(new Size(120, 70), child.MeasureSizes[0]); diff --git a/tests/Avalonia.DesignerSupport.Tests/Avalonia.DesignerSupport.Tests.csproj b/tests/Avalonia.DesignerSupport.Tests/Avalonia.DesignerSupport.Tests.csproj index 47d3de264f..4e7f7a641a 100644 --- a/tests/Avalonia.DesignerSupport.Tests/Avalonia.DesignerSupport.Tests.csproj +++ b/tests/Avalonia.DesignerSupport.Tests/Avalonia.DesignerSupport.Tests.csproj @@ -1,7 +1,7 @@  $(AvsCurrentTargetFramework) - Library + Exe $(MSBuildThisFileDirectory)Remote/HtmlTransport/webapp diff --git a/tests/Avalonia.DesignerSupport.Tests/DesignerSupportTests.cs b/tests/Avalonia.DesignerSupport.Tests/DesignerSupportTests.cs index cc9ec89c4a..ea4d1ed8e8 100644 --- a/tests/Avalonia.DesignerSupport.Tests/DesignerSupportTests.cs +++ b/tests/Avalonia.DesignerSupport.Tests/DesignerSupportTests.cs @@ -13,21 +13,20 @@ using Avalonia.Remote.Protocol; using Avalonia.Remote.Protocol.Designer; using Avalonia.Remote.Protocol.Viewport; using Xunit; -using Xunit.Extensions; namespace Avalonia.DesignerSupport.Tests { public class DesignerSupportTests { private const string DesignerAppPath = "../../../../../src/tools/Avalonia.Designer.HostApp/bin/$BUILD/$TFM/Avalonia.Designer.HostApp.dll"; - private readonly Xunit.Abstractions.ITestOutputHelper outputHelper; + private readonly ITestOutputHelper outputHelper; - public DesignerSupportTests(Xunit.Abstractions.ITestOutputHelper outputHelper) + public DesignerSupportTests(ITestOutputHelper outputHelper) { this.outputHelper = outputHelper; } - [SkippableTheory, + [Theory, InlineData( @"..\..\..\..\..\tests/Avalonia.DesignerSupport.TestApp/bin/$BUILD/$TFM/", "Avalonia.DesignerSupport.TestApp", @@ -63,7 +62,7 @@ namespace Avalonia.DesignerSupport.Tests xamlFile = Path.GetFullPath(xamlFile.Replace('\\', Path.DirectorySeparatorChar)); if (method == "win32") - Skip.IfNot(RuntimeInformation.IsOSPlatform(OSPlatform.Windows)); + Assert.SkipUnless(RuntimeInformation.IsOSPlatform(OSPlatform.Windows), "Windows-only"); var xaml = File.ReadAllText(xamlFile); string buildType; diff --git a/tests/Avalonia.DesignerSupport.Tests/RemoteProtocolTests.cs b/tests/Avalonia.DesignerSupport.Tests/RemoteProtocolTests.cs index 92920d3417..f1b9e3813a 100644 --- a/tests/Avalonia.DesignerSupport.Tests/RemoteProtocolTests.cs +++ b/tests/Avalonia.DesignerSupport.Tests/RemoteProtocolTests.cs @@ -139,7 +139,7 @@ namespace Avalonia.DesignerSupport.Tests foreach (var p in t.GetProperties()) p.SetValue(o, GetRandomValue(p.PropertyType, $"{t.FullName}.{p.Name}")); - _client.Send(o).Wait(TimeoutInMs); + _client.Send(o).Wait(TimeoutInMs, TestContext.Current.CancellationToken); var received = TakeServer(); Helpers.StructDiff(received, o); @@ -199,11 +199,11 @@ namespace Avalonia.DesignerSupport.Tests { exceptions.Add(ex); } - }); + }, TestContext.Current.CancellationToken); tasks.Add(task); } - Task.WaitAll(tasks.ToArray(), TimeoutInMs * messages.Length * 10); + Task.WaitAll(tasks.ToArray(), TimeoutInMs * messages.Length * 10, TestContext.Current.CancellationToken); // Verify no exceptions occurred Assert.Empty(exceptions); diff --git a/tests/Avalonia.Generators.Tests/InitializeComponent/InitializeComponentTests.cs b/tests/Avalonia.Generators.Tests/InitializeComponent/InitializeComponentTests.cs index 4e98f3c207..a15039b48e 100644 --- a/tests/Avalonia.Generators.Tests/InitializeComponent/InitializeComponentTests.cs +++ b/tests/Avalonia.Generators.Tests/InitializeComponent/InitializeComponentTests.cs @@ -61,7 +61,7 @@ public class InitializeComponentTests .Replace("\r", string.Empty) .Replace("$GeneratorVersion", generatorVersion); - CSharpSyntaxTree.ParseText(code); + CSharpSyntaxTree.ParseText(code, cancellationToken: TestContext.Current.CancellationToken); Assert.Equal(expected, code); } } diff --git a/tests/Avalonia.Generators.Tests/OnlyProperties/OnlyPropertiesTests.cs b/tests/Avalonia.Generators.Tests/OnlyProperties/OnlyPropertiesTests.cs index e0db63526b..1214ab75ca 100644 --- a/tests/Avalonia.Generators.Tests/OnlyProperties/OnlyPropertiesTests.cs +++ b/tests/Avalonia.Generators.Tests/OnlyProperties/OnlyPropertiesTests.cs @@ -55,7 +55,7 @@ public class OnlyPropertiesTests .Replace("\r", string.Empty) .Replace("$GeneratorVersion", generatorVersion); - CSharpSyntaxTree.ParseText(code); + CSharpSyntaxTree.ParseText(code, cancellationToken: TestContext.Current.CancellationToken); Assert.Equal(expected, code); } } diff --git a/tests/Avalonia.Headless.NUnit.PerAssembly.UnitTests/Avalonia.Headless.NUnit.PerAssembly.UnitTests.csproj b/tests/Avalonia.Headless.NUnit.PerAssembly.UnitTests/Avalonia.Headless.NUnit.PerAssembly.UnitTests.csproj index 2eec8e6e0c..8be738c356 100644 --- a/tests/Avalonia.Headless.NUnit.PerAssembly.UnitTests/Avalonia.Headless.NUnit.PerAssembly.UnitTests.csproj +++ b/tests/Avalonia.Headless.NUnit.PerAssembly.UnitTests/Avalonia.Headless.NUnit.PerAssembly.UnitTests.csproj @@ -3,6 +3,8 @@ $(AvsCurrentTargetFramework) true $(DefineConstants);NUNIT + true + Exe @@ -14,7 +16,6 @@ - diff --git a/tests/Avalonia.Headless.NUnit.PerTest.UnitTests/Avalonia.Headless.NUnit.PerTest.UnitTests.csproj b/tests/Avalonia.Headless.NUnit.PerTest.UnitTests/Avalonia.Headless.NUnit.PerTest.UnitTests.csproj index 2eec8e6e0c..8be738c356 100644 --- a/tests/Avalonia.Headless.NUnit.PerTest.UnitTests/Avalonia.Headless.NUnit.PerTest.UnitTests.csproj +++ b/tests/Avalonia.Headless.NUnit.PerTest.UnitTests/Avalonia.Headless.NUnit.PerTest.UnitTests.csproj @@ -3,6 +3,8 @@ $(AvsCurrentTargetFramework) true $(DefineConstants);NUNIT + true + Exe @@ -14,7 +16,6 @@ - diff --git a/tests/Avalonia.Headless.XUnit.PerAssembly.UnitTests/Avalonia.Headless.XUnit.PerAssembly.UnitTests.csproj b/tests/Avalonia.Headless.XUnit.PerAssembly.UnitTests/Avalonia.Headless.XUnit.PerAssembly.UnitTests.csproj index 322ce6bb3a..ed0dbe6273 100644 --- a/tests/Avalonia.Headless.XUnit.PerAssembly.UnitTests/Avalonia.Headless.XUnit.PerAssembly.UnitTests.csproj +++ b/tests/Avalonia.Headless.XUnit.PerAssembly.UnitTests/Avalonia.Headless.XUnit.PerAssembly.UnitTests.csproj @@ -1,8 +1,10 @@ $(AvsCurrentTargetFramework) + Exe true $(DefineConstants);XUNIT + true diff --git a/tests/Avalonia.Headless.XUnit.PerTest.UnitTests/Avalonia.Headless.XUnit.PerTest.UnitTests.csproj b/tests/Avalonia.Headless.XUnit.PerTest.UnitTests/Avalonia.Headless.XUnit.PerTest.UnitTests.csproj index 322ce6bb3a..ed0dbe6273 100644 --- a/tests/Avalonia.Headless.XUnit.PerTest.UnitTests/Avalonia.Headless.XUnit.PerTest.UnitTests.csproj +++ b/tests/Avalonia.Headless.XUnit.PerTest.UnitTests/Avalonia.Headless.XUnit.PerTest.UnitTests.csproj @@ -1,8 +1,10 @@ $(AvsCurrentTargetFramework) + Exe true $(DefineConstants);XUNIT + true diff --git a/tests/Avalonia.IntegrationTests.Appium/Avalonia.IntegrationTests.Appium.csproj b/tests/Avalonia.IntegrationTests.Appium/Avalonia.IntegrationTests.Appium.csproj index 4ef730e426..ade9f7a531 100644 --- a/tests/Avalonia.IntegrationTests.Appium/Avalonia.IntegrationTests.Appium.csproj +++ b/tests/Avalonia.IntegrationTests.Appium/Avalonia.IntegrationTests.Appium.csproj @@ -2,6 +2,7 @@ $(AvsCurrentTargetFramework) + Exe enable false @@ -29,6 +30,13 @@ + + + + + + + diff --git a/tests/Avalonia.IntegrationTests.Appium/PlatformFactAttribute.cs b/tests/Avalonia.IntegrationTests.Appium/PlatformFactAttribute.cs index 00408a83e4..cdec297218 100644 --- a/tests/Avalonia.IntegrationTests.Appium/PlatformFactAttribute.cs +++ b/tests/Avalonia.IntegrationTests.Appium/PlatformFactAttribute.cs @@ -1,5 +1,6 @@ #nullable enable using System; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using Xunit; @@ -16,31 +17,22 @@ namespace Avalonia internal class PlatformFactAttribute : FactAttribute { - private readonly string? _reason; - private string? _skip; - - public PlatformFactAttribute(TestPlatforms platforms, string? reason = null) + public PlatformFactAttribute( + TestPlatforms platforms, + string? reason = null, + [CallerFilePath] string? sourceFilePath = null, + [CallerLineNumber] int sourceLineNumber = -1) + : base(sourceFilePath, sourceLineNumber) { - _reason = reason; Platforms = platforms; + if (!IsSupported()) + Skip = $"Ignored on {RuntimeInformation.OSDescription}" + + (reason is not null ? $" reason: '{reason}'" : ""); + } public TestPlatforms Platforms { get; } - public override string? Skip - { - get - { - if (_skip is not null) - return _skip; - if (!IsSupported()) - return $"Ignored on {RuntimeInformation.OSDescription}" + - (_reason is not null ? $" reason: '{_reason}'" : ""); - return null; - } - set => _skip = value; - } - private bool IsSupported() { if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) diff --git a/tests/Avalonia.IntegrationTests.Appium/PlatformTheoryAttribute.cs b/tests/Avalonia.IntegrationTests.Appium/PlatformTheoryAttribute.cs index 011ffa90fd..d755679f79 100644 --- a/tests/Avalonia.IntegrationTests.Appium/PlatformTheoryAttribute.cs +++ b/tests/Avalonia.IntegrationTests.Appium/PlatformTheoryAttribute.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using Xunit; @@ -7,23 +8,20 @@ namespace Avalonia.IntegrationTests.Appium { internal class PlatformTheoryAttribute : TheoryAttribute { - private string? _skip; - - public PlatformTheoryAttribute(TestPlatforms platforms = TestPlatforms.All) => Platforms = platforms; - - public TestPlatforms Platforms { get; } - - public override string? Skip + public PlatformTheoryAttribute( + TestPlatforms platforms = TestPlatforms.All, + [CallerFilePath] string? sourceFilePath = null, + [CallerLineNumber] int sourceLineNumber = -1) : base(sourceFilePath, sourceLineNumber) { - get + Platforms = platforms; + if (!IsSupported()) { - if (_skip is not null) - return _skip; - return !IsSupported() ? $"Ignored on {RuntimeInformation.OSDescription}" : null; + Skip = $"Ignored on {RuntimeInformation.OSDescription}"; } - set => _skip = value; } + public TestPlatforms Platforms { get; } + private bool IsSupported() { if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) diff --git a/tests/Avalonia.IntegrationTests.Win32/Avalonia.IntegrationTests.Win32.csproj b/tests/Avalonia.IntegrationTests.Win32/Avalonia.IntegrationTests.Win32.csproj index d6ed47f393..a11ecc1fb4 100644 --- a/tests/Avalonia.IntegrationTests.Win32/Avalonia.IntegrationTests.Win32.csproj +++ b/tests/Avalonia.IntegrationTests.Win32/Avalonia.IntegrationTests.Win32.csproj @@ -14,8 +14,7 @@ - - + diff --git a/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj b/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj index 6692fad353..0826b4babf 100644 --- a/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj +++ b/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj @@ -1,6 +1,7 @@  $(AvsCurrentTargetFramework) + Exe diff --git a/tests/Avalonia.LeakTests/ReleaseFact.cs b/tests/Avalonia.LeakTests/ReleaseFact.cs index dcda045811..3be490925b 100644 --- a/tests/Avalonia.LeakTests/ReleaseFact.cs +++ b/tests/Avalonia.LeakTests/ReleaseFact.cs @@ -1,4 +1,5 @@ -using Xunit; +using System.Runtime.CompilerServices; +using Xunit; namespace Avalonia.LeakTests; @@ -7,7 +8,10 @@ namespace Avalonia.LeakTests; /// internal sealed class ReleaseFactAttribute : FactAttribute { - public ReleaseFactAttribute() + public ReleaseFactAttribute( + [CallerFilePath] string? sourceFilePath = null, + [CallerLineNumber] int sourceLineNumber = -1 + ) : base(sourceFilePath, sourceLineNumber) { #if DEBUG Skip = "Only runs in Release mode"; diff --git a/tests/Avalonia.Markup.UnitTests/Avalonia.Markup.UnitTests.csproj b/tests/Avalonia.Markup.UnitTests/Avalonia.Markup.UnitTests.csproj index 9cf5ebe224..0f97c22721 100644 --- a/tests/Avalonia.Markup.UnitTests/Avalonia.Markup.UnitTests.csproj +++ b/tests/Avalonia.Markup.UnitTests/Avalonia.Markup.UnitTests.csproj @@ -1,7 +1,7 @@  $(AvsCurrentTargetFramework) - Library + Exe true diff --git a/tests/Avalonia.Markup.UnitTests/Data/BindingTests.cs b/tests/Avalonia.Markup.UnitTests/Data/BindingTests.cs index e60f15ef95..42dc681f7c 100644 --- a/tests/Avalonia.Markup.UnitTests/Data/BindingTests.cs +++ b/tests/Avalonia.Markup.UnitTests/Data/BindingTests.cs @@ -551,7 +551,7 @@ namespace Avalonia.Markup.UnitTests.Data } // Forces WeakEvent compact - Dispatcher.UIThread.RunJobs(); + Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); Assert.Equal(0, source.SubscriberCount); } diff --git a/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_Indexer.cs b/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_Indexer.cs index ce056ad750..a547690631 100644 --- a/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_Indexer.cs +++ b/tests/Avalonia.Markup.UnitTests/Parsers/ExpressionObserverBuilderTests_Indexer.cs @@ -167,7 +167,7 @@ namespace Avalonia.Markup.UnitTests.Parsers } // Forces WeakEvent compact - Dispatcher.UIThread.RunJobs(); + Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); Assert.Equal(new[] { AvaloniaProperty.UnsetValue, "baz" }, result); Assert.Null(((INotifyCollectionChangedDebug)data.Foo).GetCollectionChangedSubscribers()); @@ -188,7 +188,7 @@ namespace Avalonia.Markup.UnitTests.Parsers } // Forces WeakEvent compact - Dispatcher.UIThread.RunJobs(); + Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); Assert.Equal(new[] { "foo", "bar" }, result); Assert.Null(((INotifyCollectionChangedDebug)data.Foo).GetCollectionChangedSubscribers()); @@ -209,7 +209,7 @@ namespace Avalonia.Markup.UnitTests.Parsers } // Forces WeakEvent compact - Dispatcher.UIThread.RunJobs(); + Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); Assert.Equal(new[] { "bar", "baz" }, result); Assert.Null(((INotifyCollectionChangedDebug)data.Foo).GetCollectionChangedSubscribers()); @@ -268,7 +268,7 @@ namespace Avalonia.Markup.UnitTests.Parsers } // Forces WeakEvent compact - Dispatcher.UIThread.RunJobs(); + Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); var expected = new[] { "bar", "bar2" }; Assert.Equal(expected, result); diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj b/tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj index b7fd1ba2a1..739da81465 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Avalonia.Markup.Xaml.UnitTests.csproj @@ -1,7 +1,7 @@  $(AvsCurrentTargetFramework) - Library + Exe true @@ -38,15 +38,5 @@ - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_Method.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_Method.cs index 3310aa6008..a1ab150366 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_Method.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Data/BindingTests_Method.cs @@ -135,7 +135,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Data Assert.Equal(button.IsEffectivelyEnabled, false); vm.Parameter = true; - Threading.Dispatcher.UIThread.RunJobs(); + Threading.Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); Assert.Equal(button.IsEffectivelyEnabled, true); } diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs index 91af22b952..051129e12c 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/MarkupExtensions/CompiledBindingExtensionTests.cs @@ -2012,7 +2012,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.MarkupExtensions Assert.Equal(button.IsEffectivelyEnabled, false); vm.Parameter = true; - Threading.Dispatcher.UIThread.RunJobs(); + Threading.Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); Assert.Equal(button.IsEffectivelyEnabled, true); } diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/XamlIlTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/XamlIlTests.cs index a5cdcb4ac4..9118378dbd 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/XamlIlTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/XamlIlTests.cs @@ -121,7 +121,7 @@ namespace Avalonia.Markup.Xaml.UnitTests w.ApplyTemplate(); w.Show(); - Dispatcher.UIThread.RunJobs(); + Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); var itemsPresenter = ((ItemsControl)w.Content!).GetVisualChildren().FirstOrDefault(); Assert.NotNull(itemsPresenter); diff --git a/tests/Avalonia.RenderTests.WpfCompare/Avalonia.RenderTests.WpfCompare.csproj b/tests/Avalonia.RenderTests.WpfCompare/Avalonia.RenderTests.WpfCompare.csproj index 79f5f9f102..637bdff482 100644 --- a/tests/Avalonia.RenderTests.WpfCompare/Avalonia.RenderTests.WpfCompare.csproj +++ b/tests/Avalonia.RenderTests.WpfCompare/Avalonia.RenderTests.WpfCompare.csproj @@ -1,6 +1,7 @@  $(AvsCurrentWindowsTargetFramework) + Exe true enable true @@ -15,7 +16,7 @@ - + diff --git a/tests/Avalonia.RenderTests.WpfCompare/CrossFact.cs b/tests/Avalonia.RenderTests.WpfCompare/CrossFact.cs index 8b002eb52e..d0e6e5f81a 100644 --- a/tests/Avalonia.RenderTests.WpfCompare/CrossFact.cs +++ b/tests/Avalonia.RenderTests.WpfCompare/CrossFact.cs @@ -1,13 +1,20 @@ -using Xunit; +using System.Runtime.CompilerServices; +using Xunit; namespace Avalonia.RenderTests.WpfCompare; public class CrossFactAttribute : StaFactAttribute { - + public CrossFactAttribute([CallerFilePath] string? sourceFilePath = null, [CallerLineNumber] int sourceLineNumber = -1) + : base(sourceFilePath, sourceLineNumber) + { + } } public class CrossTheoryAttribute : StaTheoryAttribute { - + public CrossTheoryAttribute([CallerFilePath] string? sourceFilePath = null, [CallerLineNumber] int sourceLineNumber = -1) + : base(sourceFilePath, sourceLineNumber) + { + } } diff --git a/tests/Avalonia.RenderTests/Composition/DirectFbCompositionTests.cs b/tests/Avalonia.RenderTests/Composition/DirectFbCompositionTests.cs index cdf213d7c8..1a8d7d9272 100644 --- a/tests/Avalonia.RenderTests/Composition/DirectFbCompositionTests.cs +++ b/tests/Avalonia.RenderTests/Composition/DirectFbCompositionTests.cs @@ -100,7 +100,7 @@ public class DirectFbCompositionTests : TestBase control.Measure(new Size(control.Width, control.Height)); control.Arrange(new Rect(control.DesiredSize)); renderer.Start(); - Dispatcher.UIThread.RunJobs(); + Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); timer.TriggerTick(); var image1 = $"{nameof(Should_Only_Update_Clipped_Rects_When_Retained_Fb_Is_Advertised)}_advertized-{advertised}_initial"; @@ -112,7 +112,7 @@ public class DirectFbCompositionTests : TestBase r1.Fill = Brushes.Red; r2.Fill = Brushes.Green; - Dispatcher.UIThread.RunJobs(); + Dispatcher.UIThread.RunJobs(null, TestContext.Current.CancellationToken); timer.TriggerTick(); var image2 = $"{nameof(Should_Only_Update_Clipped_Rects_When_Retained_Fb_Is_Advertised)}_advertized-{advertised}_updated"; diff --git a/tests/Avalonia.RenderTests/TestSkip.cs b/tests/Avalonia.RenderTests/TestSkip.cs index 88bb965f68..0381e200f9 100644 --- a/tests/Avalonia.RenderTests/TestSkip.cs +++ b/tests/Avalonia.RenderTests/TestSkip.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using Xunit; @@ -7,7 +8,11 @@ namespace Avalonia.Skia.RenderTests { public class Win32Fact : FactAttribute { - public Win32Fact(string message) + public Win32Fact( + string message, + [CallerFilePath] string? sourceFilePath = null, + [CallerLineNumber] int sourceLineNumber = -1) + : base(sourceFilePath, sourceLineNumber) { if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) Skip = message; @@ -16,7 +21,11 @@ namespace Avalonia.Skia.RenderTests public class Win32Theory : TheoryAttribute { - public Win32Theory(string message) + public Win32Theory( + string message, + [CallerFilePath] string? sourceFilePath = null, + [CallerLineNumber] int sourceLineNumber = -1) + : base(sourceFilePath, sourceLineNumber) { if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) Skip = message; diff --git a/tests/Avalonia.Skia.RenderTests/Avalonia.Skia.RenderTests.csproj b/tests/Avalonia.Skia.RenderTests/Avalonia.Skia.RenderTests.csproj index da29931a79..4ebb9bfba9 100644 --- a/tests/Avalonia.Skia.RenderTests/Avalonia.Skia.RenderTests.csproj +++ b/tests/Avalonia.Skia.RenderTests/Avalonia.Skia.RenderTests.csproj @@ -1,6 +1,7 @@  $(AvsCurrentTargetFramework) + Exe $(DefineConstants);AVALONIA_SKIA true true diff --git a/tests/Avalonia.Skia.RenderTests/CrossTestBase.cs b/tests/Avalonia.Skia.RenderTests/CrossTestBase.cs index bbb5f4aa22..4e33616b17 100644 --- a/tests/Avalonia.Skia.RenderTests/CrossTestBase.cs +++ b/tests/Avalonia.Skia.RenderTests/CrossTestBase.cs @@ -14,12 +14,22 @@ namespace Avalonia.Skia.RenderTests; class CrossFactAttribute : FactAttribute { - + public CrossFactAttribute( + [CallerFilePath] string? sourceFilePath = null, + [CallerLineNumber] int sourceLineNumber = -1 + ) : base(sourceFilePath, sourceLineNumber) + { + } } class CrossTheoryAttribute : TheoryAttribute { - + public CrossTheoryAttribute( + [CallerFilePath] string? sourceFilePath = null, + [CallerLineNumber] int sourceLineNumber = -1 + ) : base(sourceFilePath, sourceLineNumber) + { + } } public class CrossTestBase : IDisposable diff --git a/tests/Avalonia.Skia.UnitTests/Avalonia.Skia.UnitTests.csproj b/tests/Avalonia.Skia.UnitTests/Avalonia.Skia.UnitTests.csproj index 561b1131ac..184c825328 100644 --- a/tests/Avalonia.Skia.UnitTests/Avalonia.Skia.UnitTests.csproj +++ b/tests/Avalonia.Skia.UnitTests/Avalonia.Skia.UnitTests.csproj @@ -1,6 +1,7 @@  $(AvsCurrentTargetFramework) + Exe diff --git a/tests/Avalonia.Skia.UnitTests/Win32Fact.cs b/tests/Avalonia.Skia.UnitTests/Win32Fact.cs index 29f8a3cb74..532bfe3019 100644 --- a/tests/Avalonia.Skia.UnitTests/Win32Fact.cs +++ b/tests/Avalonia.Skia.UnitTests/Win32Fact.cs @@ -1,11 +1,16 @@ -using System.Runtime.InteropServices; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; using Xunit; namespace Avalonia.Skia.UnitTests { internal class Win32Fact : FactAttribute { - public Win32Fact(string message) + public Win32Fact( + string message, + [CallerFilePath] string? sourceFilePath = null, + [CallerLineNumber] int sourceLineNumber = -1) + : base(sourceFilePath, sourceLineNumber) { if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) Skip = message; diff --git a/tests/Avalonia.Skia.UnitTests/Win32Theory.cs b/tests/Avalonia.Skia.UnitTests/Win32Theory.cs index afab42e8ee..37638ec5c2 100644 --- a/tests/Avalonia.Skia.UnitTests/Win32Theory.cs +++ b/tests/Avalonia.Skia.UnitTests/Win32Theory.cs @@ -1,11 +1,15 @@ -using System.Runtime.InteropServices; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; using Xunit; namespace Avalonia.Skia.UnitTests { internal class Win32Theory: TheoryAttribute { - public Win32Theory(string message) + public Win32Theory( + string message, + [CallerFilePath] string? sourceFilePath = null, + [CallerLineNumber] int sourceLineNumber = -1) : base(sourceFilePath, sourceLineNumber) { if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) Skip = message; diff --git a/tests/Avalonia.UnitTests/Avalonia.UnitTests.csproj b/tests/Avalonia.UnitTests/Avalonia.UnitTests.csproj index 7a7aebbd9d..7076b1afc7 100644 --- a/tests/Avalonia.UnitTests/Avalonia.UnitTests.csproj +++ b/tests/Avalonia.UnitTests/Avalonia.UnitTests.csproj @@ -2,7 +2,7 @@ $(AvsCurrentTargetFramework) false - Library + Exe false true diff --git a/tests/Avalonia.UnitTests/InvariantCultureAttribute.cs b/tests/Avalonia.UnitTests/InvariantCultureAttribute.cs index d24acd23ec..4f4b2e7fb7 100644 --- a/tests/Avalonia.UnitTests/InvariantCultureAttribute.cs +++ b/tests/Avalonia.UnitTests/InvariantCultureAttribute.cs @@ -3,7 +3,7 @@ using System; using System.Globalization; using System.Reflection; -using Xunit.Sdk; +using Xunit.v3; namespace Avalonia.UnitTests; @@ -21,9 +21,9 @@ public sealed class InvariantCultureAttribute : BeforeAfterTestAttribute private CultureInfo? _previousCulture; private CultureInfo? _previousUICulture; - public override void Before(MethodInfo methodUnderTest) + public override void Before(MethodInfo methodUnderTest, IXunitTest test) { - base.Before(methodUnderTest); + base.Before(methodUnderTest, test); _previousCulture = CultureInfo.CurrentCulture; _previousUICulture = CultureInfo.CurrentUICulture; @@ -32,11 +32,11 @@ public sealed class InvariantCultureAttribute : BeforeAfterTestAttribute CultureInfo.CurrentUICulture = CultureInfo.InvariantCulture; } - public override void After(MethodInfo methodUnderTest) + public override void After(MethodInfo methodUnderTest, IXunitTest test) { CultureInfo.CurrentCulture = _previousCulture!; CultureInfo.CurrentUICulture = _previousUICulture!; - base.After(methodUnderTest); + base.After(methodUnderTest, test); } } diff --git a/tests/Avalonia.UnitTests/UnitTestApplication.cs b/tests/Avalonia.UnitTests/UnitTestApplication.cs index 319f69ca64..5c13b8d593 100644 --- a/tests/Avalonia.UnitTests/UnitTestApplication.cs +++ b/tests/Avalonia.UnitTests/UnitTestApplication.cs @@ -62,6 +62,15 @@ namespace Avalonia.UnitTests public override void RegisterServices() { + // Arrange (as part of layouting) calls TaskScheduler.FromCurrentSynchronizationContext, which needs a non-null context. + // If it's null, it will fail. So we need to ensure it's not null. + // Historically, this line wasn't needed because xunit itself used to always install its own SynchronizationContext. + // This was changed in xunit.v3. + if (SynchronizationContext.Current is null) + { + SynchronizationContext.SetSynchronizationContext(new SynchronizationContext()); + } + AvaloniaLocator.CurrentMutable .Bind().ToConstant(Services.AssetLoader) .Bind().ToConstant(Services.GlobalClock) diff --git a/tests/Avalonia.UnitTests/UseEmptyDesignatorCultureAttribute.cs b/tests/Avalonia.UnitTests/UseEmptyDesignatorCultureAttribute.cs index 1d10c584a1..252a6911dc 100644 --- a/tests/Avalonia.UnitTests/UseEmptyDesignatorCultureAttribute.cs +++ b/tests/Avalonia.UnitTests/UseEmptyDesignatorCultureAttribute.cs @@ -3,7 +3,7 @@ using System; using System.Globalization; using System.Reflection; -using Xunit.Sdk; +using Xunit.v3; namespace Avalonia.UnitTests; @@ -16,9 +16,9 @@ public sealed class UseEmptyDesignatorCultureAttribute : BeforeAfterTestAttribut private CultureInfo CultureInfo { get; } = new(string.Empty, false) { DateTimeFormat = { AMDesignator = string.Empty, PMDesignator = string.Empty } }; - public override void Before(MethodInfo methodUnderTest) + public override void Before(MethodInfo methodUnderTest, IXunitTest test) { - base.Before(methodUnderTest); + base.Before(methodUnderTest, test); _previousCulture = CultureInfo.CurrentCulture; _previousUICulture = CultureInfo.CurrentUICulture; @@ -27,11 +27,11 @@ public sealed class UseEmptyDesignatorCultureAttribute : BeforeAfterTestAttribut CultureInfo.CurrentUICulture = CultureInfo; } - public override void After(MethodInfo methodUnderTest) + public override void After(MethodInfo methodUnderTest, IXunitTest test) { CultureInfo.CurrentCulture = _previousCulture!; CultureInfo.CurrentUICulture = _previousUICulture!; - base.After(methodUnderTest); + base.After(methodUnderTest, test); } } diff --git a/tests/Avalonia.UnitTests/VerifyEmptyDispatcherAfterTestAttribute.cs b/tests/Avalonia.UnitTests/VerifyEmptyDispatcherAfterTestAttribute.cs index c4c0d299a5..4ccce3ab75 100644 --- a/tests/Avalonia.UnitTests/VerifyEmptyDispatcherAfterTestAttribute.cs +++ b/tests/Avalonia.UnitTests/VerifyEmptyDispatcherAfterTestAttribute.cs @@ -4,13 +4,13 @@ using System.Reflection; using Avalonia.Controls; using Avalonia.Threading; using Xunit; -using Xunit.Sdk; +using Xunit.v3; namespace Avalonia.UnitTests; public sealed class VerifyEmptyDispatcherAfterTestAttribute : BeforeAfterTestAttribute { - public override void After(MethodInfo methodUnderTest) + public override void After(MethodInfo methodUnderTest, IXunitTest test) { if (typeof(ScopedTestBase).IsAssignableFrom(methodUnderTest.DeclaringType)) return; diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index 5e8f5a6508..8d2d48bfb6 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -3,5 +3,10 @@ false false + true + + + +