diff --git a/appveyor.yml b/appveyor.yml
index 2909da65b7..db7d129dd1 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -20,6 +20,11 @@ build_script:
- ps: .\build.ps1 -Target "AppVeyor" -Platform "$env:platform" -Configuration "$env:configuration"
after_build:
- .\packages\JetBrains.dotMemoryUnit.2.1.20150828.125449\tools\dotMemoryUnit.exe -targetExecutable="%xunit20%\xunit.console.x86.exe" -returnTargetExitCode --"tests\Avalonia.LeakTests\bin\Release\Avalonia.LeakTests.dll"
+
+- "SET PATH=C:\\Python34;C:\\Python34\\Scripts;%PATH%"
+- pip install codecov
+- codecov -f "./artifacts/coverage.xml"
+
test: off
artifacts:
- path: artifacts\nuget\*.nupkg
diff --git a/build.cake b/build.cake
index d97d17218c..82fa0b83f3 100644
--- a/build.cake
+++ b/build.cake
@@ -10,6 +10,7 @@
///////////////////////////////////////////////////////////////////////////////
#tool "nuget:?package=xunit.runner.console&version=2.1.0"
+#tool "nuget:?package=OpenCover"
///////////////////////////////////////////////////////////////////////////////
// USINGS
@@ -92,6 +93,7 @@ var artifactsDir = (DirectoryPath)Directory("./artifacts");
var nugetRoot = artifactsDir.Combine("nuget");
var zipRoot = artifactsDir.Combine("zip");
var binRoot = artifactsDir.Combine("bin");
+var testsRoot = artifactsDir.Combine("tests");
var dirSuffix = configuration;
var dirSuffixSkia = (isPlatformAnyCPU ? "x86" : platform) + "/" + configuration;
@@ -585,6 +587,7 @@ Task("Clean")
CleanDirectory(nugetRoot);
CleanDirectory(zipRoot);
CleanDirectory(binRoot);
+ CleanDirectory(testsRoot);
});
Task("Restore-NuGet-Packages")
@@ -670,18 +673,35 @@ Task("Run-Unit-Tests")
"./tools/xunit.runner.console/tools/xunit.console.x86.exe" :
"./tools/xunit.runner.console/tools/xunit.console.exe";
- var settings = new XUnit2Settings
+ var xUnitSettings = new XUnit2Settings
{
ToolPath = toolPath,
- Parallelism = ParallelismOption.None
+ Parallelism = ParallelismOption.None,
+ ShadowCopy = false
};
- settings.NoAppDomain = !isRunningOnWindows;
+ xUnitSettings.NoAppDomain = !isRunningOnWindows;
- foreach (var file in unitTests)
+ var openCoverOutput = artifactsDir.GetFilePath(new FilePath("./coverage.xml"));
+ var openCoverSettings = new OpenCoverSettings()
+ .WithFilter("+[Avalonia.*]* -[*Test*]* -[ControlCatalog*]*")
+ .WithFilter("-[Avalonia.*]OmniXaml.* -[Avalonia.*]Glass.*")
+ .WithFilter("-[Avalonia.HtmlRenderer]TheArtOfDev.HtmlRenderer.* +[Avalonia.HtmlRenderer]TheArtOfDev.HtmlRenderer.Avalonia.* -[Avalonia.ReactiveUI]*");
+
+ foreach(var test in unitTests)
{
- Information("Running test " + file.GetFilenameWithoutExtension());
- XUnit2(file.FullPath, settings);
+ CopyDirectory(test.GetDirectory(), testsRoot);
+ }
+
+ if(isRunningOnWindows)
+ {
+ OpenCover(context => {
+ context.XUnit2(unitTests.Select(test => testsRoot.GetFilePath(test).FullPath), xUnitSettings);
+ }, openCoverOutput, openCoverSettings);
+ }
+ else
+ {
+ XUnit2(unitTests.Select(test => test.FullPath), xUnitSettings);
}
});
diff --git a/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj b/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj
index 9aef304beb..7fed908927 100644
--- a/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj
+++ b/tests/Avalonia.LeakTests/Avalonia.LeakTests.csproj
@@ -99,6 +99,7 @@
+
diff --git a/tests/Avalonia.LeakTests/MemberSelectorTests.cs b/tests/Avalonia.LeakTests/MemberSelectorTests.cs
new file mode 100644
index 0000000000..d794e788fd
--- /dev/null
+++ b/tests/Avalonia.LeakTests/MemberSelectorTests.cs
@@ -0,0 +1,47 @@
+using Avalonia.Markup.Xaml.Templates;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Xunit;
+
+namespace Avalonia.LeakTests
+{
+ public class MemberSelectorTests
+ {
+ [Fact]
+ public void Should_Not_Hold_Reference_To_Object()
+ {
+ WeakReference dataRef = null;
+
+ var selector = new MemberSelector() { MemberName = "Child.StringValue" };
+
+ Action run = () =>
+ {
+ var data = new Item()
+ {
+ Child = new Item() { StringValue = "Value1" }
+ };
+
+ Assert.Same("Value1", selector.Select(data));
+
+ dataRef = new WeakReference(data);
+ };
+
+ run();
+
+ GC.Collect();
+
+ Assert.False(dataRef.IsAlive);
+ }
+
+ private class Item
+ {
+ public Item Child { get; set; }
+ public int IntValue { get; set; }
+
+ public string StringValue { get; set; }
+ }
+ }
+}
diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Templates/MemberSelectorTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Templates/MemberSelectorTests.cs
index 7082863c0d..49a88e8fae 100644
--- a/tests/Avalonia.Markup.Xaml.UnitTests/Templates/MemberSelectorTests.cs
+++ b/tests/Avalonia.Markup.Xaml.UnitTests/Templates/MemberSelectorTests.cs
@@ -9,32 +9,6 @@ namespace Avalonia.Markup.Xaml.UnitTests.Templates
{
public class MemberSelectorTests
{
- [Fact]
- public void Should_Not_Hold_Reference_To_Object()
- {
- WeakReference dataRef = null;
-
- var selector = new MemberSelector() { MemberName = "Child.StringValue" };
-
- Action run = () =>
- {
- var data = new Item()
- {
- Child = new Item() { StringValue = "Value1" }
- };
-
- Assert.Same("Value1", selector.Select(data));
-
- dataRef = new WeakReference(data);
- };
-
- run();
-
- GC.Collect();
-
- Assert.False(dataRef.IsAlive);
- }
-
[Fact]
public void Should_Select_Child_Property_Value()
{