diff --git a/Fake.sln b/Fake.sln
index 2679c107c88..3741c25e656 100644
--- a/Fake.sln
+++ b/Fake.sln
@@ -164,6 +164,8 @@ Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Fake.DotNet.Testing.VSTest"
EndProject
Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Fake.Tools.Rsync", "src\app\Fake.Tools.Rsync\Fake.Tools.Rsync.fsproj", "{26367457-80C0-44C9-9020-56F4013C13E1}"
EndProject
+Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Fake.DotNet.Testing.DotCover", "src\app\Fake.DotNet.Testing.DotCover\Fake.DotNet.Testing.DotCover.fsproj", "{E656E3E2-18D2-4D8E-935C-200DB00E1F19}"
+EndProject
Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Fake.Tools.Octo", "src\app\Fake.Tools.Octo\Fake.Tools.Octo.fsproj", "{F1641150-B89D-40B7-A3BE-9DC357410FDA}"
EndProject
Global
@@ -1016,6 +1018,18 @@ Global
{26367457-80C0-44C9-9020-56F4013C13E1}.Release|x64.Build.0 = Release|Any CPU
{26367457-80C0-44C9-9020-56F4013C13E1}.Release|x86.ActiveCfg = Release|Any CPU
{26367457-80C0-44C9-9020-56F4013C13E1}.Release|x86.Build.0 = Release|Any CPU
+ {E656E3E2-18D2-4D8E-935C-200DB00E1F19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E656E3E2-18D2-4D8E-935C-200DB00E1F19}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E656E3E2-18D2-4D8E-935C-200DB00E1F19}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {E656E3E2-18D2-4D8E-935C-200DB00E1F19}.Debug|x64.Build.0 = Debug|Any CPU
+ {E656E3E2-18D2-4D8E-935C-200DB00E1F19}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E656E3E2-18D2-4D8E-935C-200DB00E1F19}.Debug|x86.Build.0 = Debug|Any CPU
+ {E656E3E2-18D2-4D8E-935C-200DB00E1F19}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E656E3E2-18D2-4D8E-935C-200DB00E1F19}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E656E3E2-18D2-4D8E-935C-200DB00E1F19}.Release|x64.ActiveCfg = Release|Any CPU
+ {E656E3E2-18D2-4D8E-935C-200DB00E1F19}.Release|x64.Build.0 = Release|Any CPU
+ {E656E3E2-18D2-4D8E-935C-200DB00E1F19}.Release|x86.ActiveCfg = Release|Any CPU
+ {E656E3E2-18D2-4D8E-935C-200DB00E1F19}.Release|x86.Build.0 = Release|Any CPU
{F1641150-B89D-40B7-A3BE-9DC357410FDA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F1641150-B89D-40B7-A3BE-9DC357410FDA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{F1641150-B89D-40B7-A3BE-9DC357410FDA}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -1105,6 +1119,7 @@ Global
{3B0A5EE3-6696-4EBA-BCF9-8136C7F17040} = {7BFFAE76-DEE9-417A-A79B-6A6644C4553A}
{C4C9D7EE-6A52-42F1-9E04-7C44F0EA8922} = {7BFFAE76-DEE9-417A-A79B-6A6644C4553A}
{26367457-80C0-44C9-9020-56F4013C13E1} = {901F162F-8925-4390-89C5-9EE2C343F744}
+ {E656E3E2-18D2-4D8E-935C-200DB00E1F19} = {7BFFAE76-DEE9-417A-A79B-6A6644C4553A}
{F1641150-B89D-40B7-A3BE-9DC357410FDA} = {7BFFAE76-DEE9-417A-A79B-6A6644C4553A}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
diff --git a/build.fsx b/build.fsx
index f6fc2898f35..837b61fb5ee 100644
--- a/build.fsx
+++ b/build.fsx
@@ -259,6 +259,7 @@ let dotnetAssemblyInfos =
"Fake.DotNet.Testing.VSTest", "Running vstest test runner"
"Fake.DotNet.Testing.NUnit", "Running nunit test runner"
"Fake.DotNet.Testing.OpenCover", "Code coverage with OpenCover"
+ "Fake.DotNet.Testing.DotCover", "Code coverage with DotCover"
"Fake.DotNet.Testing.SpecFlow", "BDD with Gherkin and SpecFlow"
"Fake.DotNet.Testing.XUnit2", "Running xunit test runner"
"Fake.DotNet.Xamarin", "Running Xamarin builds"
diff --git a/help/templates/template.cshtml b/help/templates/template.cshtml
index c26b6c47fec..0c9217d962a 100644
--- a/help/templates/template.cshtml
+++ b/help/templates/template.cshtml
@@ -139,6 +139,7 @@
Testing - VSTest
Testing - SpecFlow
Testing - OpenCover
+ Testing - DotCover
NuGet
Mage
Paket
diff --git a/src/app/Fake.DotNet.Testing.DotCover/AssemblyInfo.fs b/src/app/Fake.DotNet.Testing.DotCover/AssemblyInfo.fs
new file mode 100644
index 00000000000..3f852cd9fd5
--- /dev/null
+++ b/src/app/Fake.DotNet.Testing.DotCover/AssemblyInfo.fs
@@ -0,0 +1,17 @@
+// Auto-Generated by FAKE; do not edit
+namespace System
+open System.Reflection
+
+[]
+[]
+[]
+[]
+[]
+do ()
+
+module internal AssemblyVersionInformation =
+ let [] AssemblyTitle = "FAKE - F# Make Code coverage with DotCover"
+ let [] AssemblyProduct = "FAKE - F# Make"
+ let [] AssemblyVersion = "5.0.0"
+ let [] AssemblyInformationalVersion = "5.0.0-beta025"
+ let [] AssemblyFileVersion = "5.0.0"
diff --git a/src/app/Fake.DotNet.Testing.DotCover/DotCover.fs b/src/app/Fake.DotNet.Testing.DotCover/DotCover.fs
new file mode 100644
index 00000000000..7e370fdd519
--- /dev/null
+++ b/src/app/Fake.DotNet.Testing.DotCover/DotCover.fs
@@ -0,0 +1,331 @@
+/// Contains a task which can be used to run [DotCover](http://www.jetbrains.com/dotcover/) on .NET assemblies.
+[]
+module Fake.DotNet.Testing.DotCover
+
+open System
+open System.IO
+open System.Text
+open Fake
+open Fake.Core
+open Fake.IO.FileSystemOperators
+open Fake.IO.Globbing
+open Fake.Testing.Common
+open Fake.DotNet.Testing.MSTest
+open Fake.DotNet.Testing.MSpec
+open Fake.DotNet.Testing.NUnit3
+open Fake.DotNet.Testing.XUnit2
+
+type ReportType =
+ | Html = 0
+ | Json = 1
+ | Xml = 2
+ | NDependXml = 3
+
+/// The dotCover parameter type for running coverage
+type Params =
+ { ToolPath: string
+ WorkingDir: string
+ TargetExecutable: string
+ TargetArguments: string
+ TargetWorkingDir: string
+ Output: string
+ Filters: string
+ ErrorLevel: TestRunnerErrorLevel
+ AttributeFilters: string
+ CustomParameters: string }
+
+/// The dotCover default parameters
+let internal Defaults =
+ { ToolPath = Fake.IO.Globbing.Tools.findToolInSubPath "dotCover.exe" ((Path.GetFullPath ".") @@ "tools" @@ "DotCover")
+ WorkingDir = ""
+ TargetExecutable = ""
+ TargetArguments = ""
+ TargetWorkingDir = ""
+ Filters = ""
+ AttributeFilters = ""
+ Output = "dotCoverSnapshot.dcvr"
+ CustomParameters = ""
+ ErrorLevel = ErrorLevel.Error}
+
+type MergeParams =
+ { ToolPath: string
+ WorkingDir: string
+ Source: string list
+ Output: string
+ TempDir: string
+ CustomParameters: string }
+
+let internal MergeDefaults =
+ { ToolPath = Fake.IO.Globbing.Tools.findToolInSubPath "dotCover.exe" ((Path.GetFullPath ".") @@ "tools" @@ "DotCover")
+ WorkingDir = ""
+ Source = []
+ Output = "dotCoverSnapshot.dcvr"
+ TempDir = ""
+ CustomParameters = "" }
+
+type ReportParams =
+ { ToolPath: string
+ WorkingDir: string
+ Source: string
+ Output: string
+ ReportType: ReportType
+ CustomParameters: string }
+
+let internal ReportDefaults : ReportParams =
+ { ToolPath = Fake.IO.Globbing.Tools.findToolInSubPath "dotCover.exe" ((Path.GetFullPath ".") @@ "tools" @@ "DotCover")
+ WorkingDir = ""
+ Source = ""
+ Output = "dotCoverReport.xml"
+ ReportType = ReportType.Xml
+ CustomParameters = "" }
+
+let internal buildArgs parameters =
+ new StringBuilder()
+ |> StringBuilder.append "cover"
+ |> StringBuilder.appendIfNotNullOrEmpty parameters.TargetExecutable "/TargetExecutable="
+ |> StringBuilder.appendIfNotNullOrEmpty (parameters.TargetArguments.Trim()) "/TargetArguments="
+ |> StringBuilder.appendIfNotNullOrEmpty parameters.TargetWorkingDir "/TargetWorkingDir="
+ |> StringBuilder.appendIfNotNullOrEmpty parameters.Filters "/Filters="
+ |> StringBuilder.appendIfNotNullOrEmpty parameters.AttributeFilters "/AttributeFilters="
+ |> StringBuilder.appendIfNotNullOrEmpty parameters.Output "/Output="
+ |> StringBuilder.appendWithoutQuotes parameters.CustomParameters
+ |> StringBuilder.toText
+
+let internal buildMergeArgs (parameters:MergeParams) =
+ new StringBuilder()
+ |> StringBuilder.append "merge"
+ |> StringBuilder.appendIfNotNullOrEmpty (parameters.Source |> String.concat ";") "/Source="
+ |> StringBuilder.appendIfNotNullOrEmpty parameters.Output "/Output="
+ |> StringBuilder.appendIfNotNullOrEmpty parameters.TempDir "/TempDir="
+ |> StringBuilder.appendWithoutQuotes parameters.CustomParameters
+ |> StringBuilder.toText
+
+let internal buildReportArgs parameters =
+ new StringBuilder()
+ |> StringBuilder.append "report"
+ |> StringBuilder.appendIfNotNullOrEmpty parameters.Source "/Source="
+ |> StringBuilder.appendIfNotNullOrEmpty parameters.Output "/Output="
+ |> StringBuilder.appendIfNotNullOrEmpty (parameters.ReportType.ToString()) "/ReportType="
+ |> StringBuilder.appendWithoutQuotes parameters.CustomParameters
+ |> StringBuilder.toText
+
+
+let internal getWorkingDir workingDir =
+ Seq.find String.isNotNullOrEmpty [workingDir; Fake.Core.Environment.environVar("teamcity.build.workingDir"); "."]
+ |> Path.GetFullPath
+
+let internal buildParamsAndExecute parameters buildArguments toolPath workingDir failBuild =
+ let args = buildArguments parameters
+ Trace.trace (toolPath + " " + args)
+ let result = Fake.Core.Process.execSimple (fun info ->
+ {info with
+ FileName = toolPath
+ WorkingDirectory = getWorkingDir workingDir
+ Arguments = args
+ })
+ TimeSpan.MaxValue
+ let ExitCodeForFailedTests = -3
+ if (result = ExitCodeForFailedTests && not failBuild) then
+ Trace.trace (sprintf "DotCover %s exited with errorcode %d" toolPath result)
+ else if (result = ExitCodeForFailedTests && failBuild) then
+ failwithf "Failing tests, use ErrorLevel.DontFailBuild to ignore failing tests. Exited %s with errorcode %d" toolPath result
+ else if (result <> 0) then
+ failwithf "Error running %s with exitcode %d" toolPath result
+ else
+ Trace.trace (sprintf "DotCover exited successfully")
+
+/// Runs the dotCover "cover" command, using a target executable (such as NUnit or MSpec) and generates a snapshot file.
+///
+/// ## Parameters
+///
+/// - `setParams` - Function used to overwrite the dotCover default parameters.
+let run (setParams: Params -> Params) =
+ let parameters = (Defaults |> setParams)
+ buildParamsAndExecute parameters buildArgs parameters.ToolPath parameters.WorkingDir (parameters.ErrorLevel <> ErrorLevel.DontFailBuild)
+
+/// Runs the dotCover "merge" command. This combines dotCover snaphots into a single
+/// snapshot, enabling you to merge test coverage from multiple test running frameworks
+/// ## Parameters
+///
+/// - `setParams` - Function used to overwrite the dotCover merge default parameters.
+///
+/// ## Sample
+///
+/// merge (fun p -> { p with
+/// Source = [artifactsDir @@ "NUnitDotCoverSnapshot.dcvr"
+/// artifactsDir @@ "MSpecDotCoverSnapshot.dcvr"]
+/// Output = artifactsDir @@ "dotCoverSnapshot.dcvr" })
+let merge (setParams: MergeParams -> MergeParams) =
+ let parameters = (MergeDefaults |> setParams)
+ buildParamsAndExecute parameters buildMergeArgs parameters.ToolPath parameters.WorkingDir false
+
+/// Runs the dotCover "report" command. This generates a report from a dotCover snapshot
+/// ## Parameters
+///
+/// - `setParams` - Function used to overwrite the dotCover report default parameters.
+///
+/// ## Sample
+///
+/// report (fun p -> { p with
+/// Source = artifactsDir @@ "dotCoverSnapshot.dcvr"
+/// Output = artifactsDir @@ "dotCoverReport.xml"
+/// ReportType = ReportType.Xml })
+let report (setParams: ReportParams -> ReportParams) =
+ let parameters = (ReportDefaults |> setParams)
+ buildParamsAndExecute parameters buildReportArgs parameters.ToolPath parameters.WorkingDir
+
+/// Runs the dotCover "cover" command against the NUnit test runner.
+/// ## Parameters
+///
+/// - `setDotCoverParams` - Function used to overwrite the dotCover report default parameters.
+/// - `setNUnitParams` - Function used to overwrite the NUnit default parameters.
+///
+/// ## Sample
+///
+/// !! (buildDir @@ buildMode @@ "/*.Unit.Tests.dll")
+/// |> runNUnit
+/// (fun dotCoverOptions -> { dotCoverOptions with
+/// Output = artifactsDir @@ "NUnitDotCoverSnapshot.dcvr" })
+/// (fun nUnitOptions -> { nUnitOptions with
+/// DisableShadowCopy = true })
+let runNUnit (setDotCoverParams: Params -> Params) (setNUnitParams: NUnit.Common.NUnitParams -> NUnit.Common.NUnitParams) (assemblies: string seq) =
+ let assemblies = assemblies |> Seq.toArray
+ let details = assemblies |> String.separated ", "
+ use __ = Trace.traceTask "DotCoverNUnit" details
+
+ let parameters = NUnit.Common.NUnitDefaults |> setNUnitParams
+ let args = NUnit.Common.buildArgs parameters assemblies
+
+ run (fun p ->
+ {p with
+ TargetExecutable = parameters.ToolPath @@ parameters.ToolName
+ TargetArguments = args
+ } |> setDotCoverParams)
+
+/// Runs the dotCover "cover" command against the NUnit test runner.
+/// ## Parameters
+///
+/// - `setDotCoverParams` - Function used to overwrite the dotCover report default parameters.
+/// - `setNUnitParams` - Function used to overwrite the NUnit default parameters.
+///
+/// ## Sample
+///
+/// !! (buildDir @@ buildMode @@ "/*.Unit.Tests.dll")
+/// |> runNUnit3
+/// (fun dotCoverOptions -> { dotCoverOptions with
+/// Output = artifactsDir @@ "NUnit3DotCoverSnapshot.dcvr" })
+/// (fun nUnit3Options -> { nUnit3Options with
+/// DisableShadowCopy = true })
+let runNUnit3 (setDotCoverParams: Params -> Params) (setNUnitParams: NUnit3Params -> NUnit3Params) (assemblies: string seq) =
+ let assemblies = assemblies |> Seq.toArray
+ let details = assemblies |> String.separated ", "
+ use __ = Trace.traceTask "DotCoverNUnit3" details
+
+ let parameters = NUnit3Defaults |> setNUnitParams
+ let args = NUnit3.buildArgs parameters assemblies
+
+ run (fun p ->
+ {p with
+ TargetExecutable = parameters.ToolPath
+ TargetArguments = args
+ } |> setDotCoverParams)
+
+/// Runs the dotCover "cover" command against the XUnit2 test runner.
+/// ## Parameters
+///
+/// - `setDotCoverParams` - Function used to overwrite the dotCover report default parameters.
+/// - `setXUnit2Params` - Function used to overwrite the XUnit2 default parameters.
+///
+/// ## Sample
+///
+/// !! (buildDir @@ buildMode @@ "/*.Unit.Tests.dll")
+/// |> runXUnit2
+/// (fun -> dotCoverOptions )
+/// (fun nUnitOptions -> nUnitOptions)
+let runXUnit2 (setDotCoverParams: Params -> Params) (setXUnit2Params: XUnit2.XUnit2Params -> XUnit2.XUnit2Params) (assemblies: string seq) =
+ let assemblies = assemblies |> Seq.toArray
+ let details = assemblies |> String.separated ", "
+ use __ = Trace.traceTask "DotCoverXUnit2" details
+
+ let parameters = XUnit2.XUnit2Defaults |> setXUnit2Params
+ let args = XUnit2.buildArgs parameters assemblies
+
+ run (fun p ->
+ {p with
+ TargetExecutable = parameters.ToolPath
+ TargetArguments = args
+ } |> setDotCoverParams)
+
+/// Builds the command line arguments from the given parameter record and the given assemblies.
+/// Runs all test assemblies in the same run for easier coverage management.
+/// [omit]
+let internal buildMSTestArgsForDotCover parameters assemblies =
+ let testcontainers = assemblies |> Array.map (fun a -> "/testcontainer:" + a) |> String.concat " "
+
+ let testResultsFile =
+ if parameters.ResultsDir <> null then
+ sprintf @"%s\%s.trx" parameters.ResultsDir (DateTime.Now.ToString("yyyyMMdd-HHmmss.ff"))
+ else null
+ new StringBuilder()
+ |> StringBuilder.appendWithoutQuotesIfNotNull testcontainers ""
+ |> StringBuilder.appendWithoutQuotesIfNotNull parameters.Category "/category:"
+ |> StringBuilder.appendWithoutQuotesIfNotNull parameters.TestMetadataPath "/testmetadata:"
+ |> StringBuilder.appendWithoutQuotesIfNotNull parameters.TestSettingsPath "/testsettings:"
+ |> StringBuilder.appendWithoutQuotesIfNotNull testResultsFile "/resultsfile:"
+ |> StringBuilder.appendIfTrueWithoutQuotes parameters.NoIsolation "/noisolation"
+ |> StringBuilder.toText
+
+/// Runs the dotCover "cover" command against the MSTest test runner.
+/// ## Parameters
+///
+/// - `setDotCoverParams` - Function used to overwrite the dotCover report default parameters.
+/// - `setMSTestParams` - Function used to overwrite the MSTest default parameters.
+///
+/// ## Sample
+///
+/// !! (buildDir @@ buildMode @@ "/*.Unit.Tests.dll")
+/// |> runMSTest
+/// (fun -> dotCoverOptions )
+/// (fun MSTestOptions -> MSTestOptions)
+let runMSTest (setDotCoverParams: Params -> Params) (setMSTestParams: MSTestParams -> MSTestParams) (assemblies: string seq) =
+ let assemblies = assemblies |> Seq.toArray
+ let details = assemblies |> String.separated ", "
+ use __ = Trace.traceTask "DotCoverMSTest " details
+
+ let parameters = MSTestDefaults |> setMSTestParams
+ let args = buildMSTestArgsForDotCover parameters assemblies
+
+ run (fun p ->
+ {p with
+ TargetExecutable = parameters.ToolPath
+ TargetArguments = args
+ } |> setDotCoverParams)
+
+/// Runs the dotCover "cover" command against the MSpec test runner.
+/// ## Parameters
+///
+/// - `setDotCoverParams` - Function used to overwrite the dotCover report default parameters.
+/// - `setMSpecParams` - Function used to overwrite the MSpec default parameters.
+///
+/// ## Sample
+///
+/// !! (buildDir @@ buildMode @@ "/*.Unit.Tests.dll")
+/// |> runMSpec
+/// (fun dotCoverOptions -> { dotCoverOptions with
+/// Output = artifactsDir @@ "MSpecDotCoverSnapshot.dcvr" })
+/// (fun mSpecOptions -> { mSpecOptions with
+/// Silent = true })
+let runMSpec (setDotCoverParams: Params -> Params) (setMSpecParams: MSpecParams -> MSpecParams) (assemblies: string seq) =
+ let assemblies = assemblies |> Seq.toArray
+ let details = assemblies |> String.separated ", "
+ use __ = Trace.traceTask "DotCoverMSpec" details
+
+ let parameters = MSpecDefaults |> setMSpecParams
+
+ let args = MSpec.buildArgs parameters assemblies
+
+ run (fun p ->
+ {p with
+ TargetExecutable = parameters.ToolPath
+ TargetArguments = args
+ } |> setDotCoverParams)
diff --git a/src/app/Fake.DotNet.Testing.DotCover/Fake.DotNet.Testing.DotCover.fsproj b/src/app/Fake.DotNet.Testing.DotCover/Fake.DotNet.Testing.DotCover.fsproj
new file mode 100644
index 00000000000..c4c0a8cf2ef
--- /dev/null
+++ b/src/app/Fake.DotNet.Testing.DotCover/Fake.DotNet.Testing.DotCover.fsproj
@@ -0,0 +1,26 @@
+
+
+ net46;netstandard1.6;netstandard2.0
+ $(DefineConstants);NO_DOTNETCORE_BOOTSTRAP
+ Fake.DotNet.Testing.DotCover
+ Library
+
+
+ $(DefineConstants);NETSTANDARD;USE_HTTPCLIENT
+
+
+ $(DefineConstants);RELEASE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/app/Fake.DotNet.Testing.DotCover/paket.references b/src/app/Fake.DotNet.Testing.DotCover/paket.references
new file mode 100644
index 00000000000..2c8a7ddfd73
--- /dev/null
+++ b/src/app/Fake.DotNet.Testing.DotCover/paket.references
@@ -0,0 +1,4 @@
+group netcore
+
+FSharp.Core
+NETStandard.Library
\ No newline at end of file
diff --git a/src/app/Fake.DotNet.Testing.MSTest/MSTest.fs b/src/app/Fake.DotNet.Testing.MSTest/MSTest.fs
index 5ad9e26ed1d..daf252c162d 100644
--- a/src/app/Fake.DotNet.Testing.MSTest/MSTest.fs
+++ b/src/app/Fake.DotNet.Testing.MSTest/MSTest.fs
@@ -69,8 +69,7 @@ let MSTestDefaults =
NoIsolation = true }
/// Builds the command line arguments from the given parameter record and the given assemblies.
-/// [omit]
-let internal buildMSTestArgs parameters assembly =
+let buildArgs (parameters:MSTestParams) (assembly: string) =
let testResultsFile =
if parameters.ResultsDir <> null then
sprintf @"%s\%s.trx" parameters.ResultsDir (DateTime.Now.ToString("yyyyMMdd-HHmmss.ff"))
@@ -111,7 +110,7 @@ let exec (setParams : MSTestParams -> MSTestParams) (assemblies : string seq) =
Trace.traceError message
failwith message
for assembly in assemblies do
- let args = buildMSTestArgs parameters assembly
+ let args = buildArgs parameters assembly
Process.execSimple ((fun info ->
{ info with
FileName = parameters.ToolPath
diff --git a/src/app/Fake.DotNet.Testing.MSpec/MSpec.fs b/src/app/Fake.DotNet.Testing.MSpec/MSpec.fs
index 5c00575c67c..4a907e18feb 100644
--- a/src/app/Fake.DotNet.Testing.MSpec/MSpec.fs
+++ b/src/app/Fake.DotNet.Testing.MSpec/MSpec.fs
@@ -43,8 +43,7 @@ let MSpecDefaults =
ErrorLevel = Error }
/// Builds the command line arguments from the given parameter record and the given assemblies.
-/// [omit]
-let internal buildMSpecArgs parameters assemblies =
+let buildArgs (parameters:MSpecParams) (assemblies: string seq) =
let html, htmlText =
if String.isNotNullOrEmpty parameters.HtmlOutputDir then
true, sprintf "--html\" \"%s" <| parameters.HtmlOutputDir.TrimEnd Path.DirectorySeparatorChar
@@ -87,7 +86,7 @@ let exec setParams assemblies =
let details = String.separated ", " assemblies
use __ = Trace.traceTask "MSpec" details
let parameters = setParams MSpecDefaults
- let args = buildMSpecArgs parameters assemblies
+ let args = buildArgs parameters assemblies
Trace.trace (parameters.ToolPath + " " + args)
if 0 <> Process.execSimple ((fun info ->
{ info with
diff --git a/src/app/Fake.DotNet.Testing.NUnit/Common.fs b/src/app/Fake.DotNet.Testing.NUnit/Common.fs
index 70e2fff7da4..4b78544f03c 100644
--- a/src/app/Fake.DotNet.Testing.NUnit/Common.fs
+++ b/src/app/Fake.DotNet.Testing.NUnit/Common.fs
@@ -156,8 +156,7 @@ let NUnitDefaults =
Fixture = ""}
/// Builds the command line arguments from the given parameter record and the given assemblies.
-/// [omit]
-let internal buildNUnitdArgs parameters assemblies =
+let buildArgs (parameters: NUnitParams) (assemblies: string seq) =
new StringBuilder()
|> StringBuilder.append "-nologo"
|> StringBuilder.appendIfTrue parameters.DisableShadowCopy "-noshadow"
diff --git a/src/app/Fake.DotNet.Testing.NUnit/NUnit3.fs b/src/app/Fake.DotNet.Testing.NUnit/NUnit3.fs
index 5d331eeb330..393cb78030b 100644
--- a/src/app/Fake.DotNet.Testing.NUnit/NUnit3.fs
+++ b/src/app/Fake.DotNet.Testing.NUnit/NUnit3.fs
@@ -273,7 +273,8 @@ let getWorkingDir parameters =
"." ]
|> Path.GetFullPath
-let internal buildNUnit3Args parameters assemblies =
+/// Builds the command line arguments from the given parameter record and the given assemblies.
+let buildArgs (parameters:NUnit3Params) (assemblies: string seq) =
let appendResultString results sb =
match results, sb with
| [], sb -> StringBuilder.append "--noresult" sb
@@ -315,7 +316,7 @@ let run (setParams : NUnit3Params -> NUnit3Params) (assemblies : string seq) =
let assemblies = assemblies |> Seq.toArray
if Array.isEmpty assemblies then failwith "NUnit: cannot run tests (the assembly list is empty)."
let tool = parameters.ToolPath
- let args = buildNUnit3Args parameters assemblies
+ let args = buildArgs parameters assemblies
Trace.trace (tool + " " + args)
let processTimeout = TimeSpan.MaxValue // Don't set a process timeout. The timeout is per test.
let result =
diff --git a/src/app/Fake.DotNet.Testing.NUnit/Parallel.fs b/src/app/Fake.DotNet.Testing.NUnit/Parallel.fs
index 4b6e37cfaa7..0d43888bd30 100644
--- a/src/app/Fake.DotNet.Testing.NUnit/Parallel.fs
+++ b/src/app/Fake.DotNet.Testing.NUnit/Parallel.fs
@@ -48,7 +48,7 @@ let run (setParams : NUnitParams -> NUnitParams) (assemblies : string seq) =
let tool = parameters.ToolPath @@ parameters.ToolName
let runSingleAssembly parameters name outputFile =
- let args = buildNUnitdArgs { parameters with OutputFile = outputFile } [ name ]
+ let args = buildArgs { parameters with OutputFile = outputFile } [ name ]
let errout = StringBuilder()
let stdout = StringBuilder()
Trace.tracefn "Run NUnit tests from %s." name
diff --git a/src/app/Fake.DotNet.Testing.NUnit/Sequential.fs b/src/app/Fake.DotNet.Testing.NUnit/Sequential.fs
index 0782ac3bb6e..5911deb907b 100644
--- a/src/app/Fake.DotNet.Testing.NUnit/Sequential.fs
+++ b/src/app/Fake.DotNet.Testing.NUnit/Sequential.fs
@@ -33,7 +33,7 @@ let run (setParams : NUnitParams -> NUnitParams) (assemblies : string seq) =
let assemblies = assemblies |> Seq.toArray
if Array.isEmpty assemblies then failwith "NUnit: cannot run tests (the assembly list is empty)."
let tool = parameters.ToolPath @@ parameters.ToolName
- let args = buildNUnitdArgs parameters assemblies
+ let args = buildArgs parameters assemblies
Trace.trace (tool + " " + args)
let result =
Process.execSimple ((fun info ->
diff --git a/src/app/Fake.DotNet.Testing.VSTest/VSTest.fs b/src/app/Fake.DotNet.Testing.VSTest/VSTest.fs
index f1e6620a4f1..5eba8133af2 100644
--- a/src/app/Fake.DotNet.Testing.VSTest/VSTest.fs
+++ b/src/app/Fake.DotNet.Testing.VSTest/VSTest.fs
@@ -91,8 +91,7 @@ let private VSTestDefaults =
TestAdapterPath = null }
/// Builds the command line arguments from the given parameter record and the given assemblies.
-/// [omit]
-let private buildVSTestArgs (parameters : VSTestParams) assembly =
+let buildArgs (parameters : VSTestParams) (assembly: string) =
let testsToRun =
if not (Seq.isEmpty parameters.Tests) then
sprintf @"/Tests:%s" (parameters.Tests |> String.separated ",")
@@ -141,7 +140,7 @@ let run (setParams : VSTestParams -> VSTestParams) (assemblies : string seq) =
Trace.traceError message
failwith message
for assembly in assemblies do
- let args = buildVSTestArgs parameters assembly
+ let args = buildArgs parameters assembly
Process.execSimple (fun info ->
{ info with
FileName = parameters.ToolPath
diff --git a/src/app/Fake.DotNet.Testing.XUnit2/XUnit2.fs b/src/app/Fake.DotNet.Testing.XUnit2/XUnit2.fs
index eedb93a5d5a..3075f315f2d 100644
--- a/src/app/Fake.DotNet.Testing.XUnit2/XUnit2.fs
+++ b/src/app/Fake.DotNet.Testing.XUnit2/XUnit2.fs
@@ -190,7 +190,8 @@ let XUnit2Defaults =
Class = None
Method = None }
-let internal buildXUnit2Args assemblies parameters =
+/// Builds the command line arguments from the given parameter record and the given assemblies.
+let buildArgs (parameters:XUnit2Params) (assemblies: string seq)=
let formatTrait traitFlag (name, value) =
sprintf @"%s ""%s=%s""" traitFlag name value
let appendTraits traitsList traitFlag sb =
@@ -279,7 +280,7 @@ let run setParams assemblies =
{ info with
FileName = parameters.ToolPath
WorkingDirectory = defaultArg parameters.WorkingDir "."
- Arguments = parameters |> buildXUnit2Args assemblies}) >> Process.withFramework) parameters.TimeOut
+ Arguments = buildArgs parameters assemblies}) >> Process.withFramework) parameters.TimeOut
ResultHandling.failBuildIfXUnitReportedError parameters.ErrorLevel result
__.MarkSuccess()
diff --git a/src/legacy/FakeLib/DotCover.fs b/src/legacy/FakeLib/DotCover.fs
index d2cff314318..9e55488074c 100644
--- a/src/legacy/FakeLib/DotCover.fs
+++ b/src/legacy/FakeLib/DotCover.fs
@@ -1,5 +1,5 @@
/// Contains a task which can be used to run [DotCover](http://www.jetbrains.com/dotcover/) on .NET assemblies.
-[]
+[]
module Fake.DotCover
open Fake
@@ -9,7 +9,7 @@ open System.Text
open Fake.Testing.XUnit2
open Fake.Testing.NUnit3
open Fake.MSTest
-[]
+[]
type DotCoverReportType =
| Html = 0
@@ -19,7 +19,7 @@ type DotCoverReportType =
/// The dotCover parameter type for running coverage
[]
-[]
+[]
type DotCoverParams =
{ ToolPath: string
WorkingDir: string
@@ -33,7 +33,7 @@ type DotCoverParams =
CustomParameters: string }
/// The dotCover default parameters
-[]
+[]
let DotCoverDefaults =
{ ToolPath = findToolInSubPath "dotCover.exe" (currentDirectory @@ "tools" @@ "DotCover")
WorkingDir = ""
@@ -47,7 +47,7 @@ let DotCoverDefaults =
ErrorLevel = ErrorLevel.Error}
[]
-[]
+[]
type DotCoverMergeParams =
{ ToolPath: string
WorkingDir: string
@@ -56,7 +56,7 @@ type DotCoverMergeParams =
TempDir: string
CustomParameters: string }
-[]
+[]
let DotCoverMergeDefaults =
{ ToolPath = findToolInSubPath "dotCover.exe" (currentDirectory @@ "tools" @@ "DotCover")
WorkingDir = ""
@@ -66,7 +66,7 @@ let DotCoverMergeDefaults =
CustomParameters = "" }
[]
-[]
+[]
type DotCoverReportParams =
{ ToolPath: string
WorkingDir: string
@@ -75,7 +75,7 @@ type DotCoverReportParams =
ReportType: DotCoverReportType
CustomParameters: string }
-[]
+[]
let DotCoverReportDefaults : DotCoverReportParams =
{ ToolPath = findToolInSubPath "dotCover.exe" (currentDirectory @@ "tools" @@ "DotCover")
WorkingDir = ""
@@ -84,7 +84,7 @@ let DotCoverReportDefaults : DotCoverReportParams =
ReportType = DotCoverReportType.Xml
CustomParameters = "" }
-[]
+[]
let buildDotCoverArgs parameters =
new StringBuilder()
|> append "cover"
@@ -97,7 +97,7 @@ let buildDotCoverArgs parameters =
|> appendWithoutQuotes parameters.CustomParameters
|> toText
-[]
+[]
let buildDotCoverMergeArgs (parameters:DotCoverMergeParams) =
new StringBuilder()
|> append "merge"
@@ -107,7 +107,7 @@ let buildDotCoverMergeArgs (parameters:DotCoverMergeParams) =
|> appendWithoutQuotes parameters.CustomParameters
|> toText
-[]
+[]
let buildDotCoverReportArgs parameters =
new StringBuilder()
|> append "report"
@@ -118,12 +118,12 @@ let buildDotCoverReportArgs parameters =
|> toText
-[]
+[]
let getWorkingDir workingDir =
Seq.find isNotNullOrEmpty [workingDir; environVar("teamcity.build.workingDir"); "."]
|> Path.GetFullPath
-[]
+[]
let buildParamsAndExecute parameters buildArguments toolPath workingDir failBuild =
let args = buildArguments parameters
trace (toolPath + " " + args)
@@ -146,7 +146,7 @@ let buildParamsAndExecute parameters buildArguments toolPath workingDir failBuil
/// ## Parameters
///
/// - `setParams` - Function used to overwrite the dotCover default parameters.
-[]
+[]
let DotCover (setParams: DotCoverParams -> DotCoverParams) =
let parameters = (DotCoverDefaults |> setParams)
buildParamsAndExecute parameters buildDotCoverArgs parameters.ToolPath parameters.WorkingDir (parameters.ErrorLevel <> ErrorLevel.DontFailBuild)
@@ -163,7 +163,7 @@ let DotCover (setParams: DotCoverParams -> DotCoverParams) =
/// Source = [artifactsDir @@ "NUnitDotCoverSnapshot.dcvr"
/// artifactsDir @@ "MSpecDotCoverSnapshot.dcvr"]
/// Output = artifactsDir @@ "dotCoverSnapshot.dcvr" })
-[]
+[]
let DotCoverMerge (setParams: DotCoverMergeParams -> DotCoverMergeParams) =
let parameters = (DotCoverMergeDefaults |> setParams)
buildParamsAndExecute parameters buildDotCoverMergeArgs parameters.ToolPath parameters.WorkingDir false
@@ -179,7 +179,7 @@ let DotCoverMerge (setParams: DotCoverMergeParams -> DotCoverMergeParams) =
/// Source = artifactsDir @@ "dotCoverSnapshot.dcvr"
/// Output = artifactsDir @@ "dotCoverReport.xml"
/// ReportType = DotCoverReportType.Xml })
-[]
+[]
let DotCoverReport (setParams: DotCoverReportParams -> DotCoverReportParams) =
let parameters = (DotCoverReportDefaults |> setParams)
buildParamsAndExecute parameters buildDotCoverReportArgs parameters.ToolPath parameters.WorkingDir
@@ -198,7 +198,7 @@ let DotCoverReport (setParams: DotCoverReportParams -> DotCoverReportParams) =
/// Output = artifactsDir @@ "NUnitDotCoverSnapshot.dcvr" })
/// (fun nUnitOptions -> { nUnitOptions with
/// DisableShadowCopy = true })
-[]
+[]
let DotCoverNUnit (setDotCoverParams: DotCoverParams -> DotCoverParams) (setNUnitParams: NUnitParams -> NUnitParams) (assemblies: string seq) =
let assemblies = assemblies |> Seq.toArray
let details = assemblies |> separated ", "
@@ -227,7 +227,7 @@ let DotCoverNUnit (setDotCoverParams: DotCoverParams -> DotCoverParams) (setNUni
/// Output = artifactsDir @@ "NUnitDotCoverSnapshot.dcvr" })
/// (fun nUnitOptions -> { nUnitOptions with
/// DisableShadowCopy = true })
-[]
+[]
let DotCoverNUnit3 (setDotCoverParams: DotCoverParams -> DotCoverParams) (setNUnitParams: NUnit3Params -> NUnit3Params) (assemblies: string seq) =
let assemblies = assemblies |> Seq.toArray
let details = assemblies |> separated ", "
@@ -254,7 +254,7 @@ let DotCoverNUnit3 (setDotCoverParams: DotCoverParams -> DotCoverParams) (setNUn
/// |> DotCoverXUnit2
/// (fun -> dotCoverOptions )
/// (fun nUnitOptions -> nUnitOptions)
-[]
+[]
let DotCoverXUnit2 (setDotCoverParams: DotCoverParams -> DotCoverParams) (setXUnit2Params: XUnit2Params -> XUnit2Params) (assemblies: string seq) =
let assemblies = assemblies |> Seq.toArray
let details = assemblies |> separated ", "
@@ -300,7 +300,7 @@ let internal buildMSTestArgsForDotCover parameters assemblies =
/// |> MSTest
/// (fun -> dotCoverOptions )
/// (fun MSTestOptions -> MSTestOptions)
-[]
+[]
let DotCoverMSTest (setDotCoverParams: DotCoverParams -> DotCoverParams) (setMSTestParams: MSTestParams -> MSTestParams) (assemblies: string seq) =
let assemblies = assemblies |> Seq.toArray
let details = assemblies |> separated ", "
@@ -329,7 +329,7 @@ let DotCoverMSTest (setDotCoverParams: DotCoverParams -> DotCoverParams) (setMST
/// Output = artifactsDir @@ "MSpecDotCoverSnapshot.dcvr" })
/// (fun mSpecOptions -> { mSpecOptions with
/// Silent = true })
-[]
+[]
let DotCoverMSpec (setDotCoverParams: DotCoverParams -> DotCoverParams) (setMSpecParams: MSpecParams -> MSpecParams) (assemblies: string seq) =
let assemblies = assemblies |> Seq.toArray
let details = assemblies |> separated ", "
diff --git a/src/legacy/FakeLib/FakeLib.fsproj b/src/legacy/FakeLib/FakeLib.fsproj
index c44eb3c2bae..bb683e6533f 100644
--- a/src/legacy/FakeLib/FakeLib.fsproj
+++ b/src/legacy/FakeLib/FakeLib.fsproj
@@ -428,6 +428,9 @@
Fake.DotNet.Fsi\Fsi.fs
+
+ Fake.DotNet.Testing.DotCover/DotCover.fs
+