Skip to content

Commit bce7a33

Browse files
authored
Merge pull request #208 from tonyhallett/adjacent-fcc-build-output-directory
Adjacent fcc build output directory
2 parents 58f8acd + 53c5327 commit bce7a33

File tree

8 files changed

+53
-17
lines changed

8 files changed

+53
-17
lines changed

FineCodeCoverageTests/CoverageToolOutput_Tests/CoverageToolOutputManager_Tests.cs

+7-5
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class CoverageToolOutputManager_Tests
1717
private Mock<ICoverageProject> mockProject2;
1818
private List<ICoverageProject> coverageProjects;
1919
private List<int> callOrder;
20+
private const string DefaultCoverageFolder = "defaultFolder";
2021

2122
[SetUp]
2223
public void SetUp()
@@ -26,9 +27,11 @@ public void SetUp()
2627
mockProject1.Setup(p => p.FCCOutputFolder).Returns("p1output");
2728
mockProject1.Setup(p => p.ProjectName).Returns("project1");
2829
mockProject1.SetupProperty(p => p.CoverageOutputFolder);
30+
mockProject1.Setup(p => p.DefaultCoverageOutputFolder).Returns(DefaultCoverageFolder);
2931
mockProject2 = new Mock<ICoverageProject>();
3032
mockProject2.Setup(p => p.FCCOutputFolder).Returns("p2output");
3133
mockProject2.Setup(p => p.ProjectName).Returns("project2");
34+
mockProject2.Setup(p => p.DefaultCoverageOutputFolder).Returns(DefaultCoverageFolder);
3235
coverageProjects = new List<ICoverageProject> { mockProject1.Object, mockProject2.Object };
3336
}
3437

@@ -105,16 +108,15 @@ public void Should_Set_CoverageOutputFolder_To_ProjectName_Sub_Folder_Of_Provide
105108
}
106109

107110
[Test]
108-
public void Should_Set_CoverageOutputFolder_To_Sub_Folder_Of_CoverageProject_FCCOutputFolder_For_All_When_Not_Provided()
111+
public void Should_Set_CoverageOutputFolder_To_Default_For_All_When_Not_Provided()
109112
{
110113
SetUpProviders(true, null, null);
111114
var coverageToolOutputManager = mocker.Create<CoverageToolOutputManager>();
112115
coverageToolOutputManager.SetProjectCoverageOutputFolder(coverageProjects);
113116

114-
var expectedProject1OutputFolder = Path.Combine(mockProject1.Object.FCCOutputFolder, "coverage-tool-output");
115-
var expectedProject2OutputFolder = Path.Combine(mockProject2.Object.FCCOutputFolder, "coverage-tool-output");
116-
mockProject1.VerifySet(p => p.CoverageOutputFolder = expectedProject1OutputFolder);
117-
mockProject2.VerifySet(p => p.CoverageOutputFolder = expectedProject2OutputFolder);
117+
118+
mockProject1.VerifySet(p => p.CoverageOutputFolder = DefaultCoverageFolder);
119+
mockProject2.VerifySet(p => p.CoverageOutputFolder = DefaultCoverageFolder);
118120
}
119121

120122
[Test]

README.md

+3-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ or download from [releases](https://github.com/FortuneN/FineCodeCoverage/release
99
Prerequisites
1010

1111
Only that the test adapters are nuget packages. For instance, the NUnit Test Adapter extension is not sufficient.
12-
FCC will copy your test dll and dependencies to a sub folder this may affect your tests.
12+
FCC will copy your test dll and dependencies to a sub folder this may affect your tests. The alternative is to set the option AdjacentBuildOutput to true.
1313
---------------------------------------
1414

1515
Introduction
@@ -139,7 +139,8 @@ CoverletConsoleLocal Specify true to use your own dotnet tools local instal
139139
CoverletConsoleCustomPath Specify path to coverlet console exe if you need functionality that the FCC version does not provide.
140140
CoverletConsoleGlobal Specify true to use your own dotnet tools global install of coverlet console.
141141
142-
FCCSolutionOutputDirectoryName To have fcc output visible in a sub folder of your solution provide this name
142+
FCCSolutionOutputDirectoryName To have fcc output visible in a sub folder of your solution provide this name
143+
AdjacentBuildOutput If your tests are dependent upon their path set this to true.
143144
144145
The "CoverletConsole" settings have precedence Local / CustomPath / Global.
145146

SharedProject/Core/CoverageToolOutput/CoverageToolOutputManager.cs

+3-4
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ internal class CoverageToolOutputManager : ICoverageToolOutputManager
1313
{
1414
private readonly ILogger logger;
1515
private readonly IFileUtil fileUtil;
16-
private const string projectCoverageToolOutputFolderName = "coverage-tool-output";
1716
private string outputFolderForAllProjects;
1817
private List<ICoverageProject> coverageProjects;
1918
private readonly IOrderedEnumerable<Lazy<ICoverageToolOutputFolderProvider, IOrderMetadata>> outputFolderProviders;
@@ -29,12 +28,12 @@ public CoverageToolOutputManager(IFileUtil fileUtil, ILogger logger,[ImportMany]
2928
public void SetProjectCoverageOutputFolder(List<ICoverageProject> coverageProjects)
3029
{
3130
this.coverageProjects = coverageProjects;
32-
DetermineOutputFolder();
31+
DetermineOutputFolderForAllProjects();
3332
if (outputFolderForAllProjects == null)
3433
{
3534
foreach(var coverageProject in coverageProjects)
3635
{
37-
coverageProject.CoverageOutputFolder = Path.Combine(coverageProject.FCCOutputFolder, projectCoverageToolOutputFolderName);
36+
coverageProject.CoverageOutputFolder = coverageProject.DefaultCoverageOutputFolder;
3837
}
3938
}
4039
else
@@ -49,7 +48,7 @@ public void SetProjectCoverageOutputFolder(List<ICoverageProject> coverageProjec
4948

5049

5150

52-
private void DetermineOutputFolder()
51+
private void DetermineOutputFolderForAllProjects()
5352
{
5453
outputFolderForAllProjects = outputFolderProviders.SelectFirstNonNull(p => p.Value.Provide(coverageProjects));
5554
if(outputFolderForAllProjects != null)

SharedProject/Core/Model/CoverageProject.cs

+29-4
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,32 @@ internal class CoverageProject : ICoverageProject
2626
private IAppOptions settings;
2727
private readonly string fccFolderName = "fine-code-coverage";
2828
private readonly string buildOutputFolderName = "build-output";
29-
private string BuildOutputPath => Path.Combine(FCCOutputFolder, buildOutputFolderName);
29+
private string buildOutputPath;
30+
private string BuildOutputPath
31+
{
32+
get
33+
{
34+
if(buildOutputPath == null)
35+
{
36+
var adjacentBuildOutput = appOptionsProvider.Get().AdjacentBuildOutput;
37+
if (adjacentBuildOutput)
38+
{
39+
// Net framework - Debug | Debug-NET45
40+
// SDK style - Debug/netcoreapp3.1 etc
41+
var projectOutputDirectory = new DirectoryInfo(ProjectOutputFolder);
42+
var projectOutputDirectoryName = projectOutputDirectory.Name;
43+
var containingDirectoryPath = projectOutputDirectory.Parent.FullName;
44+
buildOutputPath = Path.Combine(containingDirectoryPath, $"{fccFolderName}-{projectOutputDirectoryName}");
45+
}
46+
else
47+
{
48+
buildOutputPath = Path.Combine(FCCOutputFolder, buildOutputFolderName);
49+
}
50+
}
51+
return buildOutputPath;
52+
53+
}
54+
}
3055
private readonly string coverageToolOutputFolderName = "coverage-tool-output";
3156

3257
public CoverageProject(IAppOptionsProvider appOptionsProvider, IFileSynchronizationUtil fileSynchronizationUtil, ILogger logger, DTE dte, bool canUseMsBuildWorkspace)
@@ -311,7 +336,7 @@ Process PropertyGroup settings
311336
}
312337
}
313338
public string CoverageOutputFolder { get; set; }
314-
339+
public string DefaultCoverageOutputFolder => Path.Combine(FCCOutputFolder, coverageToolOutputFolderName);
315340

316341
public XElement ProjectFileXElement
317342
{
@@ -357,7 +382,7 @@ public async System.Threading.Tasks.Task StepAsync(string stepName, Func<ICovera
357382
public async System.Threading.Tasks.Task PrepareForCoverageAsync()
358383
{
359384
EnsureDirectories();
360-
CleanDirectory();
385+
CleanFCCDirectory();
361386
SynchronizeBuildOutput();
362387
await SetExcludedReferencedProjectsAsync();
363388
}
@@ -535,7 +560,7 @@ private void EnsureEmptyOutputFolder()
535560
Directory.CreateDirectory(CoverageOutputFolder);
536561
}
537562
}
538-
private void CleanDirectory()
563+
private void CleanFCCDirectory()
539564
{
540565
var exclusions = new List<string> { buildOutputFolderName, coverageToolOutputFolderName };
541566
var fccDirectory = new DirectoryInfo(FCCOutputFolder);

SharedProject/Core/Model/ICoverageProject.cs

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ internal interface ICoverageProject
1111
string FCCOutputFolder { get; }
1212
string CoverageOutputFile { get; }
1313
string CoverageOutputFolder { get; set; }
14+
string DefaultCoverageOutputFolder { get; }
1415
List<string> ExcludedReferencedProjects { get; }
1516
string FailureDescription { get; set; }
1617
string FailureStage { get; set; }

SharedProject/Core/ReportGenerator/ReportGeneratorUtil.cs

+5-2
Original file line numberDiff line numberDiff line change
@@ -825,8 +825,11 @@ private string HackGroupingToAllowAll(int groupingLevel)
825825
{
826826
return $@"
827827
var customizeBox = document.getElementsByClassName('customizebox')[0];
828-
var groupingInput = customizeBox.querySelector('input');
829-
groupingInput.max = {groupingLevel};
828+
if(customizeBox){{
829+
var groupingInput = customizeBox.querySelector('input');
830+
groupingInput.max = {groupingLevel};
831+
}}
832+
830833
";
831834
832835
}

SharedProject/Options/AppOptions.cs

+4
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,10 @@ You can also ignore additional attributes by adding to this list (short name or
139139
[Category(outputCategory)]
140140
public string FCCSolutionOutputDirectoryName { get; set; }
141141

142+
[Description("If your tests are dependent upon their path set this to true.")]
143+
[Category(outputCategory)]
144+
public bool AdjacentBuildOutput { get; set; }
145+
142146
[Category(reportCategory)]
143147
[Description("When cyclomatic complexity exceeds this value for a method then the method will be present in the risk hotspots tab.")]
144148
public int ThresholdForCyclomaticComplexity { get; set; } = 30;

SharedProject/Options/IAppOptions.cs

+1
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,6 @@ public interface IAppOptions
2525
bool StickyCoverageTable { get; }
2626
bool NamespacedClasses { get; }
2727
bool HideFullyCovered { get; }
28+
bool AdjacentBuildOutput { get; }
2829
}
2930
}

0 commit comments

Comments
 (0)