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..c8d35cd877 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;
@@ -92,16 +93,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 +133,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 +152,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 +162,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/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj b/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj
index 373b3f7196..6e885f33be 100644
--- a/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj
+++ b/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj
@@ -1,9 +1,11 @@
- netcoreapp2.0
+ netcoreapp2.0;net47
Library
+ true
+
diff --git a/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/DataAnnotationsValidationPluginTests.cs b/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/DataAnnotationsValidationPluginTests.cs
index 2bffb7b84a..378c225e23 100644
--- a/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/DataAnnotationsValidationPluginTests.cs
+++ b/tests/Avalonia.Base.UnitTests/Data/Core/Plugins/DataAnnotationsValidationPluginTests.cs
@@ -4,6 +4,7 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
+using System.Linq;
using Avalonia.Data;
using Avalonia.Data.Core.Plugins;
using Avalonia.UnitTests;
@@ -86,17 +87,18 @@ namespace Avalonia.Markup.UnitTests.Data.Plugins
validator.SetValue("123456", BindingPriority.LocalValue);
validator.SetValue("abcdefghijklm", BindingPriority.LocalValue);
- Assert.Equal(new[]
- {
- new BindingNotification(null),
- new BindingNotification("123456"),
- new BindingNotification(
- new AggregateException(
- new ValidationException("The PhoneNumber field is not a valid phone number."),
- new ValidationException("The field PhoneNumber must be a string or array type with a maximum length of '10'.")),
- BindingErrorType.DataValidationError,
- "abcdefghijklm"),
- }, result);
+ Assert.Equal(3, result.Count);
+ Assert.Equal(new BindingNotification(null), result[0]);
+ Assert.Equal(new BindingNotification("123456"), result[1]);
+ var errorResult = (BindingNotification)result[2];
+ Assert.Equal(BindingErrorType.DataValidationError, errorResult.ErrorType);
+ Assert.Equal("abcdefghijklm", errorResult.Value);
+ var exceptions = ((AggregateException)(errorResult.Error)).InnerExceptions;
+ Assert.True(exceptions.Any(ex =>
+ ex.Message.Contains("The PhoneNumber field is not a valid phone number.")));
+ Assert.True(exceptions.Any(ex =>
+ ex.Message.Contains("The field PhoneNumber must be a string or array type with a maximum length of '10'.")));
+
}
private class Data