From f0e016c5867a938a6342a7d96e71d4346d6bbe46 Mon Sep 17 00:00:00 2001 From: Richard Kirby Date: Mon, 7 Sep 2015 15:53:43 +0100 Subject: [PATCH 01/17] Added badges report type for ReportGenerator Helper. --- src/app/FakeLib/ReportGeneratorHelper.fs | 25 ++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/app/FakeLib/ReportGeneratorHelper.fs b/src/app/FakeLib/ReportGeneratorHelper.fs index 85d97c5f5be..c905edbefe9 100644 --- a/src/app/FakeLib/ReportGeneratorHelper.fs +++ b/src/app/FakeLib/ReportGeneratorHelper.fs @@ -5,21 +5,22 @@ module Fake.ReportGeneratorHelper open System open System.Text -type ReportGeneratorReportType = +type ReportGeneratorReportType = | Html = 0 | HtmlSummary = 1 | Xml = 2 | XmlSummary = 3 | Latex = 4 | LatexSummary = 5 + | Badges = 6 -type ReportGeneratorLogVerbosity = +type ReportGeneratorLogVerbosity = | Verbose = 0 | Info = 1 | Error = 2 /// ReportGenerator parameters, for more details see: https://reportgenerator.codeplex.com. -type ReportGeneratorParams = +type ReportGeneratorParams = { /// (Required) Path to the ReportGenerator exe file. ExePath : string /// (Required) The directory where the generated report should be saved. @@ -29,7 +30,7 @@ type ReportGeneratorParams = /// Optional directories which contain the corresponding source code. SourceDirs : string list /// Optional list of assemblies that should be included or excluded - /// in the report. Exclusion filters take precedence over inclusion + /// in the report. Exclusion filters take precedence over inclusion /// filters. Wildcards are allowed. Filters : string list /// The verbosity level of the log messages. @@ -40,7 +41,7 @@ type ReportGeneratorParams = TimeOut : TimeSpan } /// ReportGenerator default parameters -let ReportGeneratorDefaultParams = +let ReportGeneratorDefaultParams = { ExePath = "./tools/ReportGenerator/bin/ReportGenerator.exe" TargetDir = currentDirectory ReportTypes = [ ReportGeneratorReportType.Html ] @@ -59,13 +60,13 @@ let ReportGeneratorDefaultParams = /// ## Sample /// /// ReportGenerator (fun p -> { p with TargetDir = "c:/reports/" }) [ "c:/opencover.xml" ] -let ReportGenerator setParams (reports : string list) = +let ReportGenerator setParams (reports : string list) = let taskName = "ReportGenerator" let description = "Generating reports" traceStartTask taskName description let param = setParams ReportGeneratorDefaultParams - - let processArgs = + + let processArgs = let args = ref (new StringBuilder()) let append (s : string) = args := (!args).Append(s) append "\"-reports:" @@ -74,11 +75,11 @@ let ReportGenerator setParams (reports : string list) = append param.TargetDir append "\" -reporttypes:" append (String.Join(";", param.ReportTypes |> List.map (fun rt -> rt.ToString()))) - if param.SourceDirs.Length > 0 then + if param.SourceDirs.Length > 0 then append " \"-sourcedirs:" append (String.Join(";", param.SourceDirs)) append "\"" - if param.Filters.Length > 0 then + if param.Filters.Length > 0 then append " \"-filters:" append (String.Join(";", param.Filters)) append "\"" @@ -86,8 +87,8 @@ let ReportGenerator setParams (reports : string list) = append (param.LogVerbosity.ToString()) (!args).ToString() tracefn "ReportGenerator command\n%s %s" param.ExePath processArgs - let ok = - execProcess (fun info -> + let ok = + execProcess (fun info -> info.FileName <- param.ExePath if param.WorkingDir <> String.Empty then info.WorkingDirectory <- param.WorkingDir info.Arguments <- processArgs) param.TimeOut From 91f0bbdfb01da09d54c18feaf26ceb5e259ff50d Mon Sep 17 00:00:00 2001 From: Richard Kirby Date: Mon, 7 Sep 2015 19:20:20 +0100 Subject: [PATCH 02/17] Added separate function to build ReportGenerator arguemtns. This will assist in spec testing the Helper. --- src/app/FakeLib/ReportGeneratorHelper.fs | 10 ++++++++++ src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs | 11 +++++++++++ src/test/Test.FAKECore/Test.FAKECore.csproj | 1 + 3 files changed, 22 insertions(+) create mode 100644 src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs diff --git a/src/app/FakeLib/ReportGeneratorHelper.fs b/src/app/FakeLib/ReportGeneratorHelper.fs index c905edbefe9..3df233690d0 100644 --- a/src/app/FakeLib/ReportGeneratorHelper.fs +++ b/src/app/FakeLib/ReportGeneratorHelper.fs @@ -51,6 +51,16 @@ let ReportGeneratorDefaultParams = WorkingDir = currentDirectory TimeOut = TimeSpan.FromMinutes 5. } +let buildReportGeneratorArgs parameters (reports : string list) = + new StringBuilder() + |> append (sprintf "\"-reports:%s" (String.Join(";", reports))) + |> append (sprintf "\" \"-targetDir:%s" parameters.TargetDir) + |> append (String.Join(";", parameters.ReportTypes |> List.map (fun rt -> rt.ToString()))) + |> appendIfTrue (parameters.SourceDirs.Length > 0) (sprintf " \"-sourcedirs:%s\"" (String.Join(";", parameters.SourceDirs))) + |> appendIfTrue (parameters.Filters.Length > 0) (sprintf " \"-filters:%s\"" (String.Join(";", parameters.Filters))) + |> append (sprintf "-verbosity:%s" (parameters.LogVerbosity.ToString())) + |> toText + /// Runs ReportGenerator on one or more coverage reports. /// ## Parameters /// diff --git a/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs b/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs new file mode 100644 index 00000000000..50d50d8a064 --- /dev/null +++ b/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs @@ -0,0 +1,11 @@ +using Fake; +using Machine.Specifications; +using Microsoft.FSharp.Collections; + +namespace Test.FAKECore +{ + class when_executing_with_default_arguments + { + //It should_have_default_arguments = () => ReportGeneratorHelper.ReportGeneratorDefaultParams.ShouldBeLike(ExpectedDefaults); + } +} diff --git a/src/test/Test.FAKECore/Test.FAKECore.csproj b/src/test/Test.FAKECore/Test.FAKECore.csproj index 1949789c6b2..271c751e0af 100644 --- a/src/test/Test.FAKECore/Test.FAKECore.csproj +++ b/src/test/Test.FAKECore/Test.FAKECore.csproj @@ -88,6 +88,7 @@ + From bfa9487991b2c6a1b9c6612c5396e45b598e1ba6 Mon Sep 17 00:00:00 2001 From: Richard Kirby Date: Mon, 7 Sep 2015 20:16:11 +0100 Subject: [PATCH 03/17] Fixed build args function. --- src/app/FakeLib/ReportGeneratorHelper.fs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/app/FakeLib/ReportGeneratorHelper.fs b/src/app/FakeLib/ReportGeneratorHelper.fs index 3df233690d0..60d52a73480 100644 --- a/src/app/FakeLib/ReportGeneratorHelper.fs +++ b/src/app/FakeLib/ReportGeneratorHelper.fs @@ -53,11 +53,11 @@ let ReportGeneratorDefaultParams = let buildReportGeneratorArgs parameters (reports : string list) = new StringBuilder() - |> append (sprintf "\"-reports:%s" (String.Join(";", reports))) - |> append (sprintf "\" \"-targetDir:%s" parameters.TargetDir) - |> append (String.Join(";", parameters.ReportTypes |> List.map (fun rt -> rt.ToString()))) - |> appendIfTrue (parameters.SourceDirs.Length > 0) (sprintf " \"-sourcedirs:%s\"" (String.Join(";", parameters.SourceDirs))) - |> appendIfTrue (parameters.Filters.Length > 0) (sprintf " \"-filters:%s\"" (String.Join(";", parameters.Filters))) + |> append (sprintf "-reports:%s" (String.Join(";", reports))) + |> append (sprintf "-targetDir:%s" parameters.TargetDir) + |> append (sprintf "-reporttypes:%s" (String.Join(";", parameters.ReportTypes |> List.map (fun rt -> rt.ToString())))) + |> appendIfTrue (parameters.SourceDirs.Length > 0) (sprintf "-sourcedirs:%s" (String.Join(";", parameters.SourceDirs))) + |> appendIfTrue (parameters.Filters.Length > 0) (sprintf "-filters:%s" (String.Join(";", parameters.Filters))) |> append (sprintf "-verbosity:%s" (parameters.LogVerbosity.ToString())) |> toText @@ -96,6 +96,9 @@ let ReportGenerator setParams (reports : string list) = append " -verbosity:" append (param.LogVerbosity.ToString()) (!args).ToString() + + let processArgs = buildReportGeneratorArgs param reports + tracefn "ReportGenerator command\n%s %s" param.ExePath processArgs let ok = execProcess (fun info -> From c8508dcc0155b8fdde62cf5dc7623e6e837cb4d8 Mon Sep 17 00:00:00 2001 From: Richard Kirby Date: Mon, 7 Sep 2015 20:46:43 +0100 Subject: [PATCH 04/17] Calculate strings outside of append to reduce Line Length. Not sure about this, now we are building strings that could potentially not be used. --- src/app/FakeLib/ReportGeneratorHelper.fs | 33 ++++++------------------ 1 file changed, 8 insertions(+), 25 deletions(-) diff --git a/src/app/FakeLib/ReportGeneratorHelper.fs b/src/app/FakeLib/ReportGeneratorHelper.fs index 60d52a73480..0f6734f70fd 100644 --- a/src/app/FakeLib/ReportGeneratorHelper.fs +++ b/src/app/FakeLib/ReportGeneratorHelper.fs @@ -52,13 +52,17 @@ let ReportGeneratorDefaultParams = TimeOut = TimeSpan.FromMinutes 5. } let buildReportGeneratorArgs parameters (reports : string list) = + let reportTypes = parameters.ReportTypes |> List.map (fun rt -> rt.ToString()) + let sourceDirs = sprintf "-sourcedirs:%s" (String.Join(";", parameters.SourceDirs)) + let filters = sprintf "-filters:%s" (String.Join(";", parameters.Filters)) + new StringBuilder() |> append (sprintf "-reports:%s" (String.Join(";", reports))) |> append (sprintf "-targetDir:%s" parameters.TargetDir) - |> append (sprintf "-reporttypes:%s" (String.Join(";", parameters.ReportTypes |> List.map (fun rt -> rt.ToString())))) - |> appendIfTrue (parameters.SourceDirs.Length > 0) (sprintf "-sourcedirs:%s" (String.Join(";", parameters.SourceDirs))) - |> appendIfTrue (parameters.Filters.Length > 0) (sprintf "-filters:%s" (String.Join(";", parameters.Filters))) - |> append (sprintf "-verbosity:%s" (parameters.LogVerbosity.ToString())) + |> appendWithoutQuotes (sprintf "-reporttypes:%s" (String.Join(";", reportTypes))) + |> appendIfTrueWithoutQuotes (parameters.SourceDirs.Length > 0) sourceDirs + |> appendIfTrue (parameters.Filters.Length > 0) filters + |> appendWithoutQuotes (sprintf "-verbosity:%s" (parameters.LogVerbosity.ToString())) |> toText /// Runs ReportGenerator on one or more coverage reports. @@ -76,27 +80,6 @@ let ReportGenerator setParams (reports : string list) = traceStartTask taskName description let param = setParams ReportGeneratorDefaultParams - let processArgs = - let args = ref (new StringBuilder()) - let append (s : string) = args := (!args).Append(s) - append "\"-reports:" - append (String.Join(";", reports)) - append "\" \"-targetdir:" - append param.TargetDir - append "\" -reporttypes:" - append (String.Join(";", param.ReportTypes |> List.map (fun rt -> rt.ToString()))) - if param.SourceDirs.Length > 0 then - append " \"-sourcedirs:" - append (String.Join(";", param.SourceDirs)) - append "\"" - if param.Filters.Length > 0 then - append " \"-filters:" - append (String.Join(";", param.Filters)) - append "\"" - append " -verbosity:" - append (param.LogVerbosity.ToString()) - (!args).ToString() - let processArgs = buildReportGeneratorArgs param reports tracefn "ReportGenerator command\n%s %s" param.ExePath processArgs From ba243671a6dbcf3df09f0d6259a2ea745ac3aec7 Mon Sep 17 00:00:00 2001 From: Richard Kirby Date: Mon, 7 Sep 2015 21:01:03 +0100 Subject: [PATCH 05/17] Adding Report Generator Helper spec tests. --- .../ReportGeneratorHelperSpecs.cs | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs b/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs index 50d50d8a064..42983768be8 100644 --- a/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs +++ b/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs @@ -4,8 +4,26 @@ namespace Test.FAKECore { - class when_executing_with_default_arguments + internal abstract class BuildReportArgumentsSpecs { - //It should_have_default_arguments = () => ReportGeneratorHelper.ReportGeneratorDefaultParams.ShouldBeLike(ExpectedDefaults); + protected static ReportGeneratorHelper.ReportGeneratorParams Parameters; + protected static FSharpList Reports; + protected static string Arguments; + + Establish context = () => + { + Parameters = ReportGeneratorHelper.ReportGeneratorDefaultParams; + Reports = FSharpList.Empty; + }; + + Because of = () => + { + Arguments = ReportGeneratorHelper.buildReportGeneratorArgs(Parameters, Reports); + }; + } + + internal class when_executing_with_default_arguments : BuildReportArgumentsSpecs + { + } } From 5f86055314950b92849733924079958278dc4222 Mon Sep 17 00:00:00 2001 From: Richard Kirby Date: Mon, 7 Sep 2015 21:10:49 +0100 Subject: [PATCH 06/17] Ensure target directory is current directory by default. --- src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs b/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs index 42983768be8..493e23cf743 100644 --- a/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs +++ b/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs @@ -1,6 +1,7 @@ using Fake; using Machine.Specifications; using Microsoft.FSharp.Collections; +using System.IO; namespace Test.FAKECore { @@ -24,6 +25,7 @@ internal abstract class BuildReportArgumentsSpecs internal class when_executing_with_default_arguments : BuildReportArgumentsSpecs { - + It should_use_current_directory_as_target_directory = + () => Arguments.ShouldContain(Directory.GetCurrentDirectory()); } } From 7bd350f80d6b2901209a7a684dd8bb6b8e2ad925 Mon Sep 17 00:00:00 2001 From: Richard Kirby Date: Mon, 7 Sep 2015 21:35:18 +0100 Subject: [PATCH 07/17] Additional tests added to ensure default correctness. --- .../ReportGeneratorHelperSpecs.cs | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs b/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs index 493e23cf743..64cace916c9 100644 --- a/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs +++ b/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs @@ -1,7 +1,9 @@ using Fake; using Machine.Specifications; using Microsoft.FSharp.Collections; +using System.Collections.Generic; using System.IO; +using System.Linq; namespace Test.FAKECore { @@ -21,11 +23,35 @@ internal abstract class BuildReportArgumentsSpecs { Arguments = ReportGeneratorHelper.buildReportGeneratorArgs(Parameters, Reports); }; + + protected static readonly IEnumerable SupportedReportTypes = new List + { + "Html", + "HtmlSummary", + "Xml", + "XmlSummary", + "Latex", + "LatexSummary", + "Badges" + }; } internal class when_executing_with_default_arguments : BuildReportArgumentsSpecs { It should_use_current_directory_as_target_directory = () => Arguments.ShouldContain(Directory.GetCurrentDirectory()); + It should_only_use_html_report_type = + () => + { + Arguments.ShouldContain("-reporttypes:Html"); + foreach (string reportType in SupportedReportTypes.Except(new List { "Html" })) + { + Arguments.ShouldNotContain(reportType); + } + }; + It should_not_append_source_dirs = + () => Arguments.ShouldNotContain("-sourcedirs:"); + It should_not_append_filters = + () => Arguments.ShouldNotContain("-filters:"); } } From aefc9446a0cc2245fcda4ea54649087f96fc24cb Mon Sep 17 00:00:00 2001 From: Richard Kirby Date: Mon, 7 Sep 2015 21:42:14 +0100 Subject: [PATCH 08/17] Default expectations in place. --- src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs b/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs index 64cace916c9..c041c589409 100644 --- a/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs +++ b/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs @@ -39,7 +39,7 @@ internal abstract class BuildReportArgumentsSpecs internal class when_executing_with_default_arguments : BuildReportArgumentsSpecs { It should_use_current_directory_as_target_directory = - () => Arguments.ShouldContain(Directory.GetCurrentDirectory()); + () => Arguments.ShouldContain("-targetdir:" + Directory.GetCurrentDirectory()); It should_only_use_html_report_type = () => { @@ -49,9 +49,8 @@ internal class when_executing_with_default_arguments : BuildReportArgumentsSpecs Arguments.ShouldNotContain(reportType); } }; - It should_not_append_source_dirs = - () => Arguments.ShouldNotContain("-sourcedirs:"); - It should_not_append_filters = - () => Arguments.ShouldNotContain("-filters:"); + It should_not_append_source_dirs = () => Arguments.ShouldNotContain("-sourcedirs:"); + It should_not_append_filters = () => Arguments.ShouldNotContain("-filters:"); + It should_have_a_log_verbosity_of_verbose = () => Arguments.ShouldContain("-verbosity:Verbose"); } } From 435b46837c79c5a18818f960608db49bf07a1cf9 Mon Sep 17 00:00:00 2001 From: Richard Kirby Date: Tue, 8 Sep 2015 09:11:13 +0100 Subject: [PATCH 09/17] Fixed incorrect paramter name in ReportGeneratorHelper. Test in place to ensure validity. --- src/app/FakeLib/ReportGeneratorHelper.fs | 2 +- .../ReportGeneratorHelperSpecs.cs | 25 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/app/FakeLib/ReportGeneratorHelper.fs b/src/app/FakeLib/ReportGeneratorHelper.fs index 0f6734f70fd..363e3f5fa9a 100644 --- a/src/app/FakeLib/ReportGeneratorHelper.fs +++ b/src/app/FakeLib/ReportGeneratorHelper.fs @@ -58,7 +58,7 @@ let buildReportGeneratorArgs parameters (reports : string list) = new StringBuilder() |> append (sprintf "-reports:%s" (String.Join(";", reports))) - |> append (sprintf "-targetDir:%s" parameters.TargetDir) + |> append (sprintf "-targetdir:%s" parameters.TargetDir) |> appendWithoutQuotes (sprintf "-reporttypes:%s" (String.Join(";", reportTypes))) |> appendIfTrueWithoutQuotes (parameters.SourceDirs.Length > 0) sourceDirs |> appendIfTrue (parameters.Filters.Length > 0) filters diff --git a/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs b/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs index c041c589409..bec19b07636 100644 --- a/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs +++ b/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs @@ -1,12 +1,16 @@ using Fake; using Machine.Specifications; using Microsoft.FSharp.Collections; +using System; using System.Collections.Generic; using System.IO; using System.Linq; +using FSharp.Testing; + namespace Test.FAKECore { + [Subject(typeof(ReportGeneratorHelper), "report generator argument construction")] internal abstract class BuildReportArgumentsSpecs { protected static ReportGeneratorHelper.ReportGeneratorParams Parameters; @@ -34,6 +38,18 @@ internal abstract class BuildReportArgumentsSpecs "LatexSummary", "Badges" }; + + protected static readonly IEnumerable testR + = new List + { + ReportGeneratorHelper.ReportGeneratorReportType.Html, + ReportGeneratorHelper.ReportGeneratorReportType.HtmlSummary, + ReportGeneratorHelper.ReportGeneratorReportType.Xml, + ReportGeneratorHelper.ReportGeneratorReportType.XmlSummary, + ReportGeneratorHelper.ReportGeneratorReportType.Latex, + ReportGeneratorHelper.ReportGeneratorReportType.LatexSummary, + ReportGeneratorHelper.ReportGeneratorReportType.Badges + }; } internal class when_executing_with_default_arguments : BuildReportArgumentsSpecs @@ -53,4 +69,13 @@ internal class when_executing_with_default_arguments : BuildReportArgumentsSpecs It should_not_append_filters = () => Arguments.ShouldNotContain("-filters:"); It should_have_a_log_verbosity_of_verbose = () => Arguments.ShouldContain("-verbosity:Verbose"); } + + internal class when_given_multiple_report_types : BuildReportArgumentsSpecs + { + Establish context = + () => Parameters = Parameters.With(p => p.ReportTypes, testR.ToFSharpList()); + + It should_delimit_report_types_with_semi_colon = + () => Arguments.ShouldContain("-reporttypes:" + string.Join(";", SupportedReportTypes)); + } } From 3b1dbb243bab52fa3ec4406c01adcf8d05a96879 Mon Sep 17 00:00:00 2001 From: Richard Kirby Date: Tue, 8 Sep 2015 09:37:00 +0100 Subject: [PATCH 10/17] Expose ReportGenerator build args as a sequence rather than list. Additional tests in place. --- src/app/FakeLib/ReportGeneratorHelper.fs | 2 +- .../Test.FAKECore/ReportGeneratorHelperSpecs.cs | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/app/FakeLib/ReportGeneratorHelper.fs b/src/app/FakeLib/ReportGeneratorHelper.fs index 363e3f5fa9a..8c2b55e3e78 100644 --- a/src/app/FakeLib/ReportGeneratorHelper.fs +++ b/src/app/FakeLib/ReportGeneratorHelper.fs @@ -51,7 +51,7 @@ let ReportGeneratorDefaultParams = WorkingDir = currentDirectory TimeOut = TimeSpan.FromMinutes 5. } -let buildReportGeneratorArgs parameters (reports : string list) = +let buildReportGeneratorArgs parameters (reports : string seq) = let reportTypes = parameters.ReportTypes |> List.map (fun rt -> rt.ToString()) let sourceDirs = sprintf "-sourcedirs:%s" (String.Join(";", parameters.SourceDirs)) let filters = sprintf "-filters:%s" (String.Join(";", parameters.Filters)) diff --git a/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs b/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs index bec19b07636..1a508b27099 100644 --- a/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs +++ b/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs @@ -14,13 +14,13 @@ namespace Test.FAKECore internal abstract class BuildReportArgumentsSpecs { protected static ReportGeneratorHelper.ReportGeneratorParams Parameters; - protected static FSharpList Reports; + protected static IEnumerable Reports; protected static string Arguments; Establish context = () => { Parameters = ReportGeneratorHelper.ReportGeneratorDefaultParams; - Reports = FSharpList.Empty; + Reports = Enumerable.Empty(); }; Because of = () => @@ -78,4 +78,13 @@ internal class when_given_multiple_report_types : BuildReportArgumentsSpecs It should_delimit_report_types_with_semi_colon = () => Arguments.ShouldContain("-reporttypes:" + string.Join(";", SupportedReportTypes)); } + + internal class when_given_multiple_reports : BuildReportArgumentsSpecs + { + Establish context = + () => Reports = new List { "report.xml", "other-report.xml" }; + + It should_delimit_reports_with_semi_colon = + () => Arguments.ShouldContain("-reports:" + string.Join(";", Reports)); + } } From 9daebaae16d9e8e4111830a83d60aeda91d78a95 Mon Sep 17 00:00:00 2001 From: Richard Kirby Date: Tue, 8 Sep 2015 15:53:21 +0100 Subject: [PATCH 11/17] Added tests to ensure correct arguments are surrounded with quotes. --- .../ReportGeneratorHelperSpecs.cs | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs b/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs index 1a508b27099..d8ba1d84297 100644 --- a/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs +++ b/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Text.RegularExpressions; using FSharp.Testing; @@ -87,4 +88,23 @@ internal class when_given_multiple_reports : BuildReportArgumentsSpecs It should_delimit_reports_with_semi_colon = () => Arguments.ShouldContain("-reports:" + string.Join(";", Reports)); } + + internal class when_appending_arguments : BuildReportArgumentsSpecs + { + static string ArgumentsWithQuotes = string.Join("", from Match match in Regex.Matches(Arguments, "\"([^\"]*)\"") + select match.ToString()); + + It should_surround_reports_with_quotes = () => ArgumentsWithQuotes.ShouldContain("-reports:"); + It should_surround_target_directory_with_quotes = () => ArgumentsWithQuotes.ShouldContain("-targetdir:"); + It should_not_surround_report_types_with_quotes = () => ArgumentsWithQuotes.ShouldNotContain("-reporttypes:"); + It should_not_surround_verbosity_with_quotes = () => ArgumentsWithQuotes.ShouldNotContain("-verbosity:"); + } + + internal class when_given_one_or_more_source_directories : BuildReportArgumentsSpecs + { + Establish context = + () => Parameters = Parameters.With(p => p.SourceDirs, new List { "mydirectory" }.ToFSharpList()); + + It should_append_source_directory_argument = () => Arguments.ShouldContain("-sourcedirs:mydirectory"); + } } From c93d8129ef37a85edb26cfbe394586ed5e3ffa8d Mon Sep 17 00:00:00 2001 From: Richard Kirby Date: Tue, 8 Sep 2015 16:44:52 +0100 Subject: [PATCH 12/17] Cleaned up test code for ReportGeneratorHelper. --- .../ReportGeneratorHelperSpecs.cs | 66 +++++++++---------- 1 file changed, 32 insertions(+), 34 deletions(-) diff --git a/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs b/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs index d8ba1d84297..02810ca5cc0 100644 --- a/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs +++ b/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs @@ -29,28 +29,11 @@ internal abstract class BuildReportArgumentsSpecs Arguments = ReportGeneratorHelper.buildReportGeneratorArgs(Parameters, Reports); }; - protected static readonly IEnumerable SupportedReportTypes = new List - { - "Html", - "HtmlSummary", - "Xml", - "XmlSummary", - "Latex", - "LatexSummary", - "Badges" - }; + protected static readonly IEnumerable ReportTypes + = Enum.GetValues(typeof(ReportGeneratorHelper.ReportGeneratorReportType)) + .Cast(); - protected static readonly IEnumerable testR - = new List - { - ReportGeneratorHelper.ReportGeneratorReportType.Html, - ReportGeneratorHelper.ReportGeneratorReportType.HtmlSummary, - ReportGeneratorHelper.ReportGeneratorReportType.Xml, - ReportGeneratorHelper.ReportGeneratorReportType.XmlSummary, - ReportGeneratorHelper.ReportGeneratorReportType.Latex, - ReportGeneratorHelper.ReportGeneratorReportType.LatexSummary, - ReportGeneratorHelper.ReportGeneratorReportType.Badges - }; + protected static readonly IEnumerable ReportTypesAsText = ReportTypes.Select(rt => rt.ToString()); } internal class when_executing_with_default_arguments : BuildReportArgumentsSpecs @@ -61,7 +44,7 @@ internal class when_executing_with_default_arguments : BuildReportArgumentsSpecs () => { Arguments.ShouldContain("-reporttypes:Html"); - foreach (string reportType in SupportedReportTypes.Except(new List { "Html" })) + foreach (string reportType in ReportTypesAsText.Except(new List { "Html" })) { Arguments.ShouldNotContain(reportType); } @@ -71,13 +54,31 @@ internal class when_executing_with_default_arguments : BuildReportArgumentsSpecs It should_have_a_log_verbosity_of_verbose = () => Arguments.ShouldContain("-verbosity:Verbose"); } + internal class when_appending_arguments : BuildReportArgumentsSpecs + { + It should_surround_reports_with_quotes = () => ArgumentsWithQuotes.ShouldContain("-reports:"); + It should_surround_target_directory_with_quotes = () => ArgumentsWithQuotes.ShouldContain("-targetdir:"); + It should_not_surround_report_types_with_quotes = () => ArgumentsWithQuotes.ShouldNotContain("-reporttypes:"); + It should_not_surround_verbosity_with_quotes = () => ArgumentsWithQuotes.ShouldNotContain("-verbosity:"); + + private static string ArgumentsWithQuotes = GetArgumentsWithQuotes(); + + private static string GetArgumentsWithQuotes() + { + var argumentsInQuotes = from Match match in Regex.Matches(Arguments, "\"([^\"]*)\"") + select match.ToString(); + + return string.Join("", argumentsInQuotes); + } + } + internal class when_given_multiple_report_types : BuildReportArgumentsSpecs { Establish context = - () => Parameters = Parameters.With(p => p.ReportTypes, testR.ToFSharpList()); + () => Parameters = Parameters.With(p => p.ReportTypes, ReportTypes.ToFSharpList()); It should_delimit_report_types_with_semi_colon = - () => Arguments.ShouldContain("-reporttypes:" + string.Join(";", SupportedReportTypes)); + () => Arguments.ShouldContain("-reporttypes:" + string.Join(";", ReportTypesAsText)); } internal class when_given_multiple_reports : BuildReportArgumentsSpecs @@ -89,22 +90,19 @@ internal class when_given_multiple_reports : BuildReportArgumentsSpecs () => Arguments.ShouldContain("-reports:" + string.Join(";", Reports)); } - internal class when_appending_arguments : BuildReportArgumentsSpecs + internal class when_given_one_or_more_source_directories : BuildReportArgumentsSpecs { - static string ArgumentsWithQuotes = string.Join("", from Match match in Regex.Matches(Arguments, "\"([^\"]*)\"") - select match.ToString()); + Establish context = + () => Parameters = Parameters.With(p => p.SourceDirs, new List { "mydirectory" }.ToFSharpList()); - It should_surround_reports_with_quotes = () => ArgumentsWithQuotes.ShouldContain("-reports:"); - It should_surround_target_directory_with_quotes = () => ArgumentsWithQuotes.ShouldContain("-targetdir:"); - It should_not_surround_report_types_with_quotes = () => ArgumentsWithQuotes.ShouldNotContain("-reporttypes:"); - It should_not_surround_verbosity_with_quotes = () => ArgumentsWithQuotes.ShouldNotContain("-verbosity:"); + It should_append_source_directory_argument = () => Arguments.ShouldContain("-sourcedirs:mydirectory"); } - internal class when_given_one_or_more_source_directories : BuildReportArgumentsSpecs + internal class when_given_one_or_more_filters : BuildReportArgumentsSpecs { Establish context = - () => Parameters = Parameters.With(p => p.SourceDirs, new List { "mydirectory" }.ToFSharpList()); + () => Parameters = Parameters.With(p => p.Filters, new List { "+Included", "-Excluded" }.ToFSharpList()); - It should_append_source_directory_argument = () => Arguments.ShouldContain("-sourcedirs:mydirectory"); + It should_append_filters_with_quotes = () => Arguments.ShouldContain("\"-filters:+Included;-Excluded\""); } } From 7d4703f442da52a808d56c10b5301955998262ff Mon Sep 17 00:00:00 2001 From: Richard Kirby Date: Tue, 8 Sep 2015 16:45:39 +0100 Subject: [PATCH 13/17] Removed unused import. --- src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs b/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs index 02810ca5cc0..ca655e729d9 100644 --- a/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs +++ b/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs @@ -1,14 +1,12 @@ using Fake; +using FSharp.Testing; using Machine.Specifications; -using Microsoft.FSharp.Collections; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text.RegularExpressions; -using FSharp.Testing; - namespace Test.FAKECore { [Subject(typeof(ReportGeneratorHelper), "report generator argument construction")] From 37b8667c0555232cf87eb8cb168fa828dd6147ca Mon Sep 17 00:00:00 2001 From: Richard Kirby Date: Tue, 8 Sep 2015 17:11:36 +0100 Subject: [PATCH 14/17] Added doc string to `buildReportGeneratorArgs`. --- src/app/FakeLib/ReportGeneratorHelper.fs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/app/FakeLib/ReportGeneratorHelper.fs b/src/app/FakeLib/ReportGeneratorHelper.fs index 8c2b55e3e78..b0685ac275b 100644 --- a/src/app/FakeLib/ReportGeneratorHelper.fs +++ b/src/app/FakeLib/ReportGeneratorHelper.fs @@ -51,6 +51,8 @@ let ReportGeneratorDefaultParams = WorkingDir = currentDirectory TimeOut = TimeSpan.FromMinutes 5. } +/// Builds the report generator command line arguments from the given parameters and reports +/// [omit] let buildReportGeneratorArgs parameters (reports : string seq) = let reportTypes = parameters.ReportTypes |> List.map (fun rt -> rt.ToString()) let sourceDirs = sprintf "-sourcedirs:%s" (String.Join(";", parameters.SourceDirs)) From e4495bfd8d0ab15f8492e566639e7b59575a23a4 Mon Sep 17 00:00:00 2001 From: Richard Kirby Date: Tue, 8 Sep 2015 17:13:23 +0100 Subject: [PATCH 15/17] Fixed broken link. Now points to github rather than broken codeplex link. --- src/app/FakeLib/ReportGeneratorHelper.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/FakeLib/ReportGeneratorHelper.fs b/src/app/FakeLib/ReportGeneratorHelper.fs index b0685ac275b..5d07e9ed879 100644 --- a/src/app/FakeLib/ReportGeneratorHelper.fs +++ b/src/app/FakeLib/ReportGeneratorHelper.fs @@ -19,7 +19,7 @@ type ReportGeneratorLogVerbosity = | Info = 1 | Error = 2 -/// ReportGenerator parameters, for more details see: https://reportgenerator.codeplex.com. +/// ReportGenerator parameters, for more details see: https://github.com/danielpalme/ReportGenerator. type ReportGeneratorParams = { /// (Required) Path to the ReportGenerator exe file. ExePath : string From 5930f518b8dae420c50a023c9aadb326578b297c Mon Sep 17 00:00:00 2001 From: Richard Kirby Date: Tue, 8 Sep 2015 17:16:01 +0100 Subject: [PATCH 16/17] Removed newline. --- src/app/FakeLib/ReportGeneratorHelper.fs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/app/FakeLib/ReportGeneratorHelper.fs b/src/app/FakeLib/ReportGeneratorHelper.fs index 5d07e9ed879..b07ad61bb8b 100644 --- a/src/app/FakeLib/ReportGeneratorHelper.fs +++ b/src/app/FakeLib/ReportGeneratorHelper.fs @@ -83,7 +83,6 @@ let ReportGenerator setParams (reports : string list) = let param = setParams ReportGeneratorDefaultParams let processArgs = buildReportGeneratorArgs param reports - tracefn "ReportGenerator command\n%s %s" param.ExePath processArgs let ok = execProcess (fun info -> From 2276005d5e5b50a468d75dd37ba635813fd62785 Mon Sep 17 00:00:00 2001 From: Richard Kirby Date: Tue, 8 Sep 2015 17:37:57 +0100 Subject: [PATCH 17/17] Fixed sourcedirs parameter to be surrounded with quotes as illustrated in the report generator docs. --- src/app/FakeLib/ReportGeneratorHelper.fs | 2 +- src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/app/FakeLib/ReportGeneratorHelper.fs b/src/app/FakeLib/ReportGeneratorHelper.fs index b07ad61bb8b..22c8720263f 100644 --- a/src/app/FakeLib/ReportGeneratorHelper.fs +++ b/src/app/FakeLib/ReportGeneratorHelper.fs @@ -62,7 +62,7 @@ let buildReportGeneratorArgs parameters (reports : string seq) = |> append (sprintf "-reports:%s" (String.Join(";", reports))) |> append (sprintf "-targetdir:%s" parameters.TargetDir) |> appendWithoutQuotes (sprintf "-reporttypes:%s" (String.Join(";", reportTypes))) - |> appendIfTrueWithoutQuotes (parameters.SourceDirs.Length > 0) sourceDirs + |> appendIfTrue (parameters.SourceDirs.Length > 0) sourceDirs |> appendIfTrue (parameters.Filters.Length > 0) filters |> appendWithoutQuotes (sprintf "-verbosity:%s" (parameters.LogVerbosity.ToString())) |> toText diff --git a/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs b/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs index ca655e729d9..c5b867730df 100644 --- a/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs +++ b/src/test/Test.FAKECore/ReportGeneratorHelperSpecs.cs @@ -93,7 +93,8 @@ internal class when_given_one_or_more_source_directories : BuildReportArgumentsS Establish context = () => Parameters = Parameters.With(p => p.SourceDirs, new List { "mydirectory" }.ToFSharpList()); - It should_append_source_directory_argument = () => Arguments.ShouldContain("-sourcedirs:mydirectory"); + It should_append_source_directories_with_quotes = + () => Arguments.ShouldContain("\"-sourcedirs:mydirectory\""); } internal class when_given_one_or_more_filters : BuildReportArgumentsSpecs