Skip to content

Commit 4ff7e15

Browse files
committed
add custom register/target/targetargs
1 parent b8e606c commit 4ff7e15

File tree

8 files changed

+106
-10
lines changed

8 files changed

+106
-10
lines changed

FineCodeCoverageTests/AppOptionsProvider_Tests.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,10 @@ internal void Should_Use_Deseralized_String_From_Store_For_AppOption_Property(Fu
317317
{ nameof(IAppOptions.ShowToolWindowToolbar),true},
318318
{nameof(IAppOptions.ExcludeAssemblies),new string[]{ "Exclude"} },
319319
{nameof(IAppOptions.IncludeAssemblies),new string[]{ "Include"} },
320-
{nameof(IAppOptions.NamespaceQualification),NamespaceQualification.AlwaysUnqualified }
320+
{nameof(IAppOptions.NamespaceQualification),NamespaceQualification.AlwaysUnqualified },
321+
{nameof(IAppOptions.OpenCoverRegister),OpenCoverRegister.Default },
322+
{nameof(IAppOptions.OpenCoverTarget),"" },
323+
{nameof(IAppOptions.OpenCoverTargetArgs),"" }
321324
};
322325
var mockJsonConvertService = autoMocker.GetMock<IJsonConvertService>();
323326
mockJsonConvertService.Setup(

FineCodeCoverageTests/MsCodeCoverage/RunSettingsTemplateReplacementsFactory_Tests.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -702,5 +702,8 @@ internal class TestCoverageProjectOptions : IAppOptions
702702
public string[] IncludeAssemblies { get; set; }
703703
public bool DisabledNoCoverage { get; set; }
704704
public NamespaceQualification NamespaceQualification { get; set; }
705+
public OpenCoverRegister OpenCoverRegister { get; set; }
706+
public string OpenCoverTarget { get; set; }
707+
public string OpenCoverTargetArgs { get; set; }
705708
}
706709
}

FineCodeCoverageTests/OpenCoverExeArgumentsProvider_Tests.cs

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public void Should_HideSkippedAll()
3434

3535
[TestCase(true)]
3636
[TestCase(false)]
37-
public void Should_Register_Depending_Upon_Project_Is64Bit(bool is64Bit)
37+
public void Should_Register_Depending_Upon_Project_Is64Bit_When_Project_OpenCoverRegister_Is_Default(bool is64Bit)
3838
{
3939
var openCoverExeArgumentsProvider = new OpenCoverExeArgumentsProvider();
4040
var mockCoverageProject = SafeMockCoverageProject();
@@ -45,8 +45,23 @@ public void Should_Register_Depending_Upon_Project_Is64Bit(bool is64Bit)
4545
AssertHasSetting(arguments, is64Bit ? "-register:path64" : "-register:path32");
4646
}
4747

48+
[TestCase(OpenCoverRegister.User,":user")]
49+
[TestCase(OpenCoverRegister.Path32,":path32")]
50+
[TestCase(OpenCoverRegister.Path64,":path64")]
51+
[TestCase(OpenCoverRegister.NoArg,"")]
52+
public void Should_Register_Using_Project_OpenCoverRegister_When_Not_Default(OpenCoverRegister register, string expectedSuffix)
53+
{
54+
var openCoverExeArgumentsProvider = new OpenCoverExeArgumentsProvider();
55+
var mockCoverageProject = SafeMockCoverageProject();
56+
mockCoverageProject.SetupGet(coverageProject => coverageProject.Settings.OpenCoverRegister).Returns(register);
57+
58+
var arguments = openCoverExeArgumentsProvider.Provide(mockCoverageProject.Object, "");
59+
60+
AssertHasSetting(arguments, $"-register{expectedSuffix}");
61+
}
62+
4863
[Test]
49-
public void Should_Safely_Set_Target_To_MsTestPlatformExePath()
64+
public void Should_Safely_Set_Target_To_MsTestPlatformExePath_When_Not_Provided_In_Project_Settings()
5065
{
5166
var openCoverExeArgumentsProvider = new OpenCoverExeArgumentsProvider();
5267
var mockCoverageProject = SafeMockCoverageProject();
@@ -56,6 +71,17 @@ public void Should_Safely_Set_Target_To_MsTestPlatformExePath()
5671
AssertHasEscapedSetting(arguments, "-target:msTestPlatformExePath");
5772
}
5873

74+
[Test]
75+
public void Should_Safely_Set_Target_From_Project_Settings_When_Provided()
76+
{
77+
var openCoverExeArgumentsProvider = new OpenCoverExeArgumentsProvider();
78+
var mockCoverageProject = SafeMockCoverageProject();
79+
mockCoverageProject.Setup(coverageProject => coverageProject.Settings.OpenCoverTarget).Returns("openCoverTarget");
80+
var arguments = openCoverExeArgumentsProvider.Provide(mockCoverageProject.Object, "msTestPlatformExePath");
81+
82+
AssertHasEscapedSetting(arguments, "-target:openCoverTarget");
83+
}
84+
5985
[Test]
6086
public void Should_Safely_Include_The_TestDLLFile_In_The_TargetArgs()
6187
{
@@ -81,6 +107,18 @@ public void Should_Safely_Include_The_Project_RunSettingsFile_In_The_TargetArgs_
81107
AssertHasEscapedSetting(arguments, $"-targetargs:{CommandLineArguments.AddEscapeQuotes("testDllFile")} /Settings:{CommandLineArguments.AddEscapeQuotes("runSettingsFile")}");
82108
}
83109

110+
[Test]
111+
public void Should_Safely_Include_The_Project_OpenCoverTargetArgs_When_Present()
112+
{
113+
var openCoverExeArgumentsProvider = new OpenCoverExeArgumentsProvider();
114+
var mockCoverageProject = SafeMockCoverageProject();
115+
mockCoverageProject.SetupGet(coverageProject => coverageProject.TestDllFile).Returns("testDllFile");
116+
mockCoverageProject.SetupGet(coverageProject => coverageProject.Settings.OpenCoverTargetArgs).Returns("openCoverAdditionalTargetArgs");
117+
var arguments = openCoverExeArgumentsProvider.Provide(mockCoverageProject.Object, "");
118+
119+
AssertHasEscapedSetting(arguments, $"-targetargs:{CommandLineArguments.AddEscapeQuotes("testDllFile")} openCoverAdditionalTargetArgs");
120+
}
121+
84122
[Test]
85123
public void Should_Safely_Output_To_The_Project_CoverageOutputFile()
86124
{

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,9 @@ If you are using option 1) then project and global options will only be used whe
287287
|**The "CoverletConsole" settings have precedence Local / CustomPath / Global.**||
288288
|<br>||
289289
|**OpenCover**||
290+
|OpenCoverRegister|Change from Default if FCC determination of path32 or path64 is incorrect.|
291+
|OpenCoverTarget|Supply your own target if required.|
292+
|OpenCoverTargetArgs|If supplying your own target you can also supply additional arguments. FCC supplies the test dll path.|
290293
|OpenCoverCustomPath|Specify path to open cover exe if you need functionality that the FCC version does not provide.|
291294
|ThresholdForNPathComplexity|When [npath complexity](https://en.wikipedia.org/wiki/Cyclomatic_complexity) exceeds this value for a method then the method will be present in the risk hotspots tab.|
292295
|ThresholdForCrapScore|When [crap score](https://testing.googleblog.com/2011/02/this-code-is-crap.html) exceeds this value for a method then the method will be present in the risk hotspots tab.|

SharedProject/Core/OpenCover/OpenCoverExeArgumentsProvider.cs

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using FineCodeCoverage.Engine.Model;
2+
using FineCodeCoverage.Options;
23
using System;
34
using System.Collections.Generic;
45
using System.ComponentModel.Composition;
@@ -139,22 +140,45 @@ string GetAlternateName(string exclude)
139140
private string GetTargetArgs(ICoverageProject project)
140141
{
141142
var runSettings = !string.IsNullOrWhiteSpace(project.RunSettingsFile) ? $@" /Settings:{CommandLineArguments.AddEscapeQuotes(project.RunSettingsFile)}" : default;
142-
return $@"""-targetargs:{CommandLineArguments.AddEscapeQuotes(project.TestDllFile)}{runSettings}""";
143+
var openCoverTargetArgs = project.Settings.OpenCoverTargetArgs;
144+
var additionalTargetArgs = !string.IsNullOrWhiteSpace(openCoverTargetArgs) ? $" {openCoverTargetArgs}" : default;
145+
return $@"""-targetargs:{CommandLineArguments.AddEscapeQuotes(project.TestDllFile)}{runSettings}{additionalTargetArgs}""";
146+
}
147+
148+
private void AddTargetAndTargetArgs(ICoverageProject project, List<string> opencoverSettings, string msTestPlatformExePath)
149+
{
150+
var target = !string.IsNullOrWhiteSpace(project.Settings.OpenCoverTarget) ? project.Settings.OpenCoverTarget : msTestPlatformExePath;
151+
opencoverSettings.Add(CommandLineArguments.AddQuotes($"-target:{target}"));
152+
opencoverSettings.Add(GetTargetArgs(project));
153+
}
154+
155+
private string GetRegister(ICoverageProject project)
156+
{
157+
var openCoverRegister = project.Settings.OpenCoverRegister;
158+
if (openCoverRegister == OpenCoverRegister.Default)
159+
{
160+
return $":path{(project.Is64Bit ? "64" : "32")}";
161+
}
162+
if(openCoverRegister == OpenCoverRegister.NoArg)
163+
{
164+
return "";
165+
}
166+
return $":{project.Settings.OpenCoverRegister.ToString().ToLower()}";
143167
}
144168

145169
public List<string> Provide(ICoverageProject project,string msTestPlatformExePath)
146170
{
147171
var opencoverSettings = new List<string>();
148-
149-
opencoverSettings.Add(CommandLineArguments.AddQuotes($"-target:{msTestPlatformExePath}"));
150-
opencoverSettings.Add(GetTargetArgs(project));
172+
AddTargetAndTargetArgs(project, opencoverSettings, msTestPlatformExePath);
173+
//opencoverSettings.Add(CommandLineArguments.AddQuotes($"-target:{msTestPlatformExePath}"));
174+
//opencoverSettings.Add(GetTargetArgs(project));
151175

152176
opencoverSettings.Add(CommandLineArguments.AddQuotes($"-output:{project.CoverageOutputFile}"));
153177

154178
AddFilter(project, opencoverSettings);
155179
AddExcludeByFile(project, opencoverSettings);
156180
AddExcludeByAttribute(project, opencoverSettings);
157-
opencoverSettings.Add($"-register:path{(project.Is64Bit ? "64" : "32")}");
181+
opencoverSettings.Add($"-register{GetRegister(project)}");
158182
opencoverSettings.Add("-mergebyhash");
159183
opencoverSettings.Add("-hideskipped:all");
160184

SharedProject/Options/AppOptionsPage.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,18 @@ You can also ignore additional attributes by adding to this list (short name or
315315
[Description("Specify path to open cover exe if you need functionality that the FCC version does not provide.")]
316316
[Category(openCoverToolCategory)]
317317
public string OpenCoverCustomPath { get; set; }
318+
319+
[Description("Change from Default if FCC determination of path32 or path64 is incorrect.")]
320+
[Category(openCoverToolCategory)]
321+
public OpenCoverRegister OpenCoverRegister { get; set; }
322+
323+
[Category(openCoverToolCategory)]
324+
[Description("Supply your own target if required.")]
325+
public string OpenCoverTarget { get; set; }
326+
327+
[Category(openCoverToolCategory)]
328+
[Description("If supplying your own target you can also supply additional arguments. FCC supplies the test dll path.")]
329+
public string OpenCoverTargetArgs { get; set; }
318330
#endregion
319331

320332
public override void SaveSettingsToStorage()

SharedProject/Options/AppOptionsProvider.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,5 +210,8 @@ internal class AppOptions : IAppOptions
210210
public string[] ExcludeAssemblies { get; set; }
211211
public string[] IncludeAssemblies { get; set; }
212212
public NamespaceQualification NamespaceQualification { get; set; }
213+
public OpenCoverRegister OpenCoverRegister { get; set; }
214+
public string OpenCoverTarget { get; set; }
215+
public string OpenCoverTargetArgs { get; set; }
213216
}
214217
}

SharedProject/Options/IAppOptions.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,17 @@ internal interface IOpenCoverCoverletExcludeIncludeOptions
3636
string[] ExcludeByFile { get; set; }
3737
string[] Include { get; set; }
3838
}
39-
internal interface IAppOptions : IMsCodeCoverageOptions, IOpenCoverCoverletExcludeIncludeOptions, IFCCCommonOptions
39+
40+
internal enum OpenCoverRegister { Default,NoArg, User, Path32, Path64}
41+
42+
internal interface IOpenCoverOptions
43+
{
44+
string OpenCoverCustomPath { get; set; }
45+
OpenCoverRegister OpenCoverRegister { get; set; }
46+
string OpenCoverTarget { get; set; }
47+
string OpenCoverTargetArgs { get; set; }
48+
}
49+
internal interface IAppOptions : IMsCodeCoverageOptions, IOpenCoverCoverletExcludeIncludeOptions, IFCCCommonOptions, IOpenCoverOptions
4050
{
4151
bool RunInParallel { get; set; }
4252
int RunWhenTestsExceed { get; set; }
@@ -47,7 +57,7 @@ internal interface IAppOptions : IMsCodeCoverageOptions, IOpenCoverCoverletExclu
4757
string CoverletConsoleCustomPath { get; set; }
4858
bool CoverletConsoleLocal { get; set; }
4959
string CoverletCollectorDirectoryPath { get; set; }
50-
string OpenCoverCustomPath { get; set; }
60+
5161
string FCCSolutionOutputDirectoryName { get; set; }
5262
int ThresholdForCyclomaticComplexity { get; set; }
5363
int ThresholdForNPathComplexity { get; set; }

0 commit comments

Comments
 (0)