diff --git a/azure-pipelines.yml b/azure-pipelines.yml index bcd0082c6f..fd40118888 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -38,6 +38,13 @@ jobs: inputs: version: '2.1.403' + - task: CmdLine@2 + displayName: 'Install Mono 5.18' + inputs: + script: | + curl -o ./mono.pkg https://download.mono-project.com/archive/5.18.0/macos-10-universal/MonoFramework-MDK-5.18.0.225.macos10.xamarin.universal.pkg + sudo installer -verbose -pkg ./mono.pkg -target / + - task: Xcode@5 inputs: actions: 'build' diff --git a/build/NetFX.props b/build/NetFX.props index d8b2daf13a..4d2841714b 100644 --- a/build/NetFX.props +++ b/build/NetFX.props @@ -3,4 +3,9 @@ /usr/lib/mono/4.6.1-api /Library/Frameworks/Mono.framework/Versions/Current/lib/mono/4.6.1-api + + /usr/lib/mono/4.7-api/ + /Library/Frameworks/Mono.framework/Versions/Current/lib/mono/4.7-api + + diff --git a/build/UnitTests.NetFX.props b/build/UnitTests.NetFX.props new file mode 100644 index 0000000000..e9a29d80fe --- /dev/null +++ b/build/UnitTests.NetFX.props @@ -0,0 +1,8 @@ + + + + + PreserveNewest + + + diff --git a/build/xunit.runner.mono.json b/build/xunit.runner.mono.json new file mode 100644 index 0000000000..4fb88b54c6 --- /dev/null +++ b/build/xunit.runner.mono.json @@ -0,0 +1 @@ +{ "appDomain": "denied" } diff --git a/nukebuild/Build.cs b/nukebuild/Build.cs index a14842cfd3..bb31034299 100644 --- a/nukebuild/Build.cs +++ b/nukebuild/Build.cs @@ -5,6 +5,7 @@ using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Threading; +using System.Xml.Linq; using Nuke.Common; using Nuke.Common.Git; using Nuke.Common.ProjectModel; @@ -56,6 +57,17 @@ partial class Build : NukeBuild Information("IsReleasable: " + Parameters.IsReleasable); Information("IsMyGetRelease: " + Parameters.IsMyGetRelease); Information("IsNuGetRelease: " + Parameters.IsNuGetRelease); + + void ExecWait(string preamble, string command, string args) + { + Console.WriteLine(preamble); + Process.Start(new ProcessStartInfo(command, args) {UseShellExecute = false}).WaitForExit(); + } + ExecWait("dotnet version:", "dotnet", "--version"); + if (Parameters.IsRunningOnUnix) + ExecWait("Mono version:", "mono", "--version"); + + } Target Clean => _ => _.Executes(() => @@ -92,16 +104,24 @@ partial class Build : NukeBuild ); }); - void RunCoreTest(string project, bool coreOnly = false) + void RunCoreTest(string project) { if(!project.EndsWith(".csproj")) project = System.IO.Path.Combine(project, System.IO.Path.GetFileName(project)+".csproj"); Information("Running tests from " + project); - var frameworks = new List(){"netcoreapp2.0"}; + XDocument xdoc; + using (var s = File.OpenRead(project)) + xdoc = XDocument.Load(s); + + List frameworks = null; + var targets = xdoc.Root.Descendants("TargetFrameworks").FirstOrDefault(); + if (targets != null) + frameworks = targets.Value.Split(';').Where(f => !string.IsNullOrWhiteSpace(f)).ToList(); + else + frameworks = new List {xdoc.Root.Descendants("TargetFramework").First().Value}; + foreach(var fw in frameworks) { - if(!fw.StartsWith("netcoreapp") && coreOnly) - continue; Information("Running for " + fw); DotNetTest(c => { @@ -124,18 +144,18 @@ partial class Build : NukeBuild .DependsOn(Compile) .Executes(() => { - RunCoreTest("./tests/Avalonia.Animation.UnitTests", false); - RunCoreTest("./tests/Avalonia.Base.UnitTests", false); - RunCoreTest("./tests/Avalonia.Controls.UnitTests", false); - RunCoreTest("./tests/Avalonia.Input.UnitTests", false); - RunCoreTest("./tests/Avalonia.Interactivity.UnitTests", false); - RunCoreTest("./tests/Avalonia.Layout.UnitTests", false); - RunCoreTest("./tests/Avalonia.Markup.UnitTests", false); - RunCoreTest("./tests/Avalonia.Markup.Xaml.UnitTests", false); - RunCoreTest("./tests/Avalonia.Styling.UnitTests", false); - RunCoreTest("./tests/Avalonia.Visuals.UnitTests", false); - RunCoreTest("./tests/Avalonia.Skia.UnitTests", false); - RunCoreTest("./tests/Avalonia.ReactiveUI.UnitTests", false); + RunCoreTest("./tests/Avalonia.Animation.UnitTests"); + RunCoreTest("./tests/Avalonia.Base.UnitTests"); + RunCoreTest("./tests/Avalonia.Controls.UnitTests"); + RunCoreTest("./tests/Avalonia.Input.UnitTests"); + RunCoreTest("./tests/Avalonia.Interactivity.UnitTests"); + RunCoreTest("./tests/Avalonia.Layout.UnitTests"); + RunCoreTest("./tests/Avalonia.Markup.UnitTests"); + RunCoreTest("./tests/Avalonia.Markup.Xaml.UnitTests"); + RunCoreTest("./tests/Avalonia.Styling.UnitTests"); + RunCoreTest("./tests/Avalonia.Visuals.UnitTests"); + RunCoreTest("./tests/Avalonia.Skia.UnitTests"); + RunCoreTest("./tests/Avalonia.ReactiveUI.UnitTests"); }); Target RunRenderTests => _ => _ @@ -143,9 +163,9 @@ partial class Build : NukeBuild .DependsOn(Compile) .Executes(() => { - RunCoreTest("./tests/Avalonia.Skia.RenderTests/Avalonia.Skia.RenderTests.csproj", true); + RunCoreTest("./tests/Avalonia.Skia.RenderTests/Avalonia.Skia.RenderTests.csproj"); if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - RunCoreTest("./tests/Avalonia.Direct2D1.RenderTests/Avalonia.Direct2D1.RenderTests.csproj", true); + RunCoreTest("./tests/Avalonia.Direct2D1.RenderTests/Avalonia.Direct2D1.RenderTests.csproj"); }); Target RunDesignerTests => _ => _ @@ -153,7 +173,7 @@ partial class Build : NukeBuild .DependsOn(Compile) .Executes(() => { - RunCoreTest("./tests/Avalonia.DesignerSupport.Tests", false); + RunCoreTest("./tests/Avalonia.DesignerSupport.Tests"); }); [PackageExecutable("JetBrains.dotMemoryUnit", "dotMemoryUnit.exe")] readonly Tool DotMemoryUnit; diff --git a/src/Avalonia.Animation/AnimatorKeyFrame.cs b/src/Avalonia.Animation/AnimatorKeyFrame.cs index 78a9a1e412..36d15e518e 100644 --- a/src/Avalonia.Animation/AnimatorKeyFrame.cs +++ b/src/Avalonia.Animation/AnimatorKeyFrame.cs @@ -1,5 +1,6 @@ using System; using System.ComponentModel; +using Avalonia.Animation.Animators; using Avalonia.Data; using Avalonia.Reactive; diff --git a/src/Avalonia.Animation/IterationCount.cs b/src/Avalonia.Animation/IterationCount.cs index eafc483868..e9cd0686d8 100644 --- a/src/Avalonia.Animation/IterationCount.cs +++ b/src/Avalonia.Animation/IterationCount.cs @@ -44,7 +44,7 @@ namespace Avalonia.Animation { if (type > IterationType.Infinite) { - throw new ArgumentException("Invalid value", "type"); + throw new ArgumentException("Invalid value", nameof(type)); } _type = type; diff --git a/src/Avalonia.Base/Collections/AvaloniaDictionary.cs b/src/Avalonia.Base/Collections/AvaloniaDictionary.cs index e8dc2a5ed7..4de4c540a0 100644 --- a/src/Avalonia.Base/Collections/AvaloniaDictionary.cs +++ b/src/Avalonia.Base/Collections/AvaloniaDictionary.cs @@ -148,7 +148,7 @@ namespace Avalonia.Collections { if (_inner.TryGetValue(key, out TValue value)) { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Count")); + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Count))); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs($"Item[{key}]")); if (CollectionChanged != null) @@ -209,7 +209,7 @@ namespace Avalonia.Collections private void NotifyAdd(TKey key, TValue value) { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Count")); + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Count))); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs($"Item[{key}]")); diff --git a/src/Avalonia.Base/Collections/AvaloniaList.cs b/src/Avalonia.Base/Collections/AvaloniaList.cs index d5a4e63003..4d4a561b08 100644 --- a/src/Avalonia.Base/Collections/AvaloniaList.cs +++ b/src/Avalonia.Base/Collections/AvaloniaList.cs @@ -511,7 +511,7 @@ namespace Avalonia.Collections /// private void NotifyCountChanged() { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Count")); + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Count))); } /// diff --git a/src/Avalonia.Base/Platform/IAssetLoader.cs b/src/Avalonia.Base/Platform/IAssetLoader.cs index 691fa2fc12..880ed62046 100644 --- a/src/Avalonia.Base/Platform/IAssetLoader.cs +++ b/src/Avalonia.Base/Platform/IAssetLoader.cs @@ -65,6 +65,7 @@ namespace Avalonia.Platform /// Gets all assets of a folder and subfolders that match specified uri. /// /// The URI. + /// The base URI. /// All matching assets as a tuple of the absolute path to the asset and the assembly containing the asset IEnumerable GetAssets(Uri uri, Uri baseUri); } diff --git a/src/Avalonia.Controls/Calendar/DatePicker.cs b/src/Avalonia.Controls/Calendar/DatePicker.cs index 2270598623..70de8bec16 100644 --- a/src/Avalonia.Controls/Calendar/DatePicker.cs +++ b/src/Avalonia.Controls/Calendar/DatePicker.cs @@ -954,7 +954,7 @@ namespace Avalonia.Controls } else { - var dateValidationError = new DatePickerDateValidationErrorEventArgs(new ArgumentOutOfRangeException("text", "SelectedDate value is not valid."), text); + var dateValidationError = new DatePickerDateValidationErrorEventArgs(new ArgumentOutOfRangeException(nameof(text), "SelectedDate value is not valid."), text); OnDateValidationError(dateValidationError); if (dateValidationError.ThrowException) diff --git a/src/Avalonia.Controls/GridLength.cs b/src/Avalonia.Controls/GridLength.cs index f6a608cd71..02be95b647 100644 --- a/src/Avalonia.Controls/GridLength.cs +++ b/src/Avalonia.Controls/GridLength.cs @@ -56,12 +56,12 @@ namespace Avalonia.Controls { if (value < 0 || double.IsNaN(value) || double.IsInfinity(value)) { - throw new ArgumentException("Invalid value", "value"); + throw new ArgumentException("Invalid value", nameof(value)); } if (type < GridUnitType.Auto || type > GridUnitType.Star) { - throw new ArgumentException("Invalid value", "type"); + throw new ArgumentException("Invalid value", nameof(type)); } _type = type; diff --git a/src/Avalonia.Controls/NumericUpDown/NumericUpDown.cs b/src/Avalonia.Controls/NumericUpDown/NumericUpDown.cs index de68eb0ab0..57db1e19bb 100644 --- a/src/Avalonia.Controls/NumericUpDown/NumericUpDown.cs +++ b/src/Avalonia.Controls/NumericUpDown/NumericUpDown.cs @@ -487,7 +487,7 @@ namespace Avalonia.Controls { if (e == null) { - throw new ArgumentNullException("e"); + throw new ArgumentNullException(nameof(e)); } var handler = Spinned; diff --git a/src/Avalonia.Styling/Styling/Setter.cs b/src/Avalonia.Styling/Styling/Setter.cs index 54d0a7d40f..cfe17a4291 100644 --- a/src/Avalonia.Styling/Styling/Setter.cs +++ b/src/Avalonia.Styling/Styling/Setter.cs @@ -69,7 +69,7 @@ namespace Avalonia.Styling { throw new ArgumentException( "Cannot assign a control to Setter.Value. Wrap the control in a