Skip to content

Commit c71f6de

Browse files
committed
solution based
1 parent 6bef01c commit c71f6de

32 files changed

+856
-73
lines changed
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using System;
2+
using System.ComponentModel.Composition;
3+
using System.IO;
4+
using FineCodeCoverage.Core.Utilities;
5+
using FineCodeCoverage.Options;
6+
7+
namespace FineCodeCoverage.Engine
8+
{
9+
[Order(1, typeof(ICoverageToolOutputFolderSolutionProvider))]
10+
class AppOptionsCoverageToolOutputFolderSolutionProvider : ICoverageToolOutputFolderSolutionProvider
11+
{
12+
private readonly IAppOptionsProvider appOptionsProvider;
13+
14+
[ImportingConstructor]
15+
public AppOptionsCoverageToolOutputFolderSolutionProvider(IAppOptionsProvider appOptionsProvider)
16+
{
17+
this.appOptionsProvider = appOptionsProvider;
18+
}
19+
public string Provide(Func<string> solutionFolderProvider)
20+
{
21+
var appOptions = appOptionsProvider.Get();
22+
if (!String.IsNullOrEmpty(appOptions.FCCSolutionOutputDirectoryName))
23+
{
24+
var solutionFolder = solutionFolderProvider();
25+
if(solutionFolder != null)
26+
{
27+
return Path.Combine(solutionFolder, appOptions.FCCSolutionOutputDirectoryName);
28+
}
29+
}
30+
return null;
31+
}
32+
}
33+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.ComponentModel.Composition;
4+
using System.Linq;
5+
using FineCodeCoverage.Core.Utilities;
6+
using FineCodeCoverage.Engine.Model;
7+
8+
namespace FineCodeCoverage.Engine
9+
{
10+
[Order(1, typeof(ICoverageToolOutputFolderProvider))]
11+
class CoverageToolOutputFolderFromSolutionProvider : ICoverageToolOutputFolderProvider
12+
{
13+
private readonly ISolutionFolderProvider solutionFolderProvider;
14+
private readonly IOrderedEnumerable<Lazy<ICoverageToolOutputFolderSolutionProvider, IOrderMetadata>> solutionFolderProviders;
15+
16+
[ImportingConstructor]
17+
public CoverageToolOutputFolderFromSolutionProvider(ISolutionFolderProvider solutionFolderProvider, [ImportMany] IEnumerable<Lazy<ICoverageToolOutputFolderSolutionProvider, IOrderMetadata>> solutionFolderProviders)
18+
{
19+
this.solutionFolderProvider = solutionFolderProvider;
20+
this.solutionFolderProviders = solutionFolderProviders.OrderBy(p => p.Metadata.Order);
21+
}
22+
23+
public string Provide(List<ICoverageProject> coverageProjects)
24+
{
25+
var provided = false;
26+
string providedDirectory = null;
27+
return solutionFolderProviders.SelectFirstNonNull(p => p.Value.Provide(() =>
28+
{
29+
if(!provided)
30+
{
31+
providedDirectory = solutionFolderProvider.Provide(coverageProjects[0].ProjectFile);
32+
provided = true;
33+
}
34+
return providedDirectory;
35+
}));
36+
37+
}
38+
}
39+
}

FineCodeCoverage/Core/CoverageToolOutputManager.cs renamed to FineCodeCoverage/Core/CoverageToolOutput/CoverageToolOutputManager.cs

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Collections.Generic;
1+
using System;
2+
using System.Collections.Generic;
23
using System.ComponentModel.Composition;
34
using System.IO;
45
using System.Linq;
@@ -18,19 +19,21 @@ internal class CoverageToolOutputManager : ICoverageToolOutputManager
1819
private const string projectCoverageToolOutputFolderName = "coverage-tool-output";
1920
private string outputFolderForAllProjects;
2021
private List<ICoverageProject> coverageProjects;
22+
private readonly IOrderedEnumerable<Lazy<ICoverageToolOutputFolderProvider, IOrderMetadata>> outputFolderProviders;
2123

2224
[ImportingConstructor]
23-
public CoverageToolOutputManager(IFileUtil fileUtil, ILogger logger)
25+
public CoverageToolOutputManager(IFileUtil fileUtil, ILogger logger,[ImportMany] IEnumerable<Lazy<ICoverageToolOutputFolderProvider, IOrderMetadata>> outputFolderProviders)
2426
{
2527
this.logger = logger;
2628
this.fileUtil = fileUtil;
29+
this.outputFolderProviders = outputFolderProviders.OrderBy(p => p.Metadata.Order);
2730
}
2831

2932
public void SetProjectCoverageOutputFolder(List<ICoverageProject> coverageProjects)
3033
{
3134
this.coverageProjects = coverageProjects;
32-
DetermineOutputFolderForAllProjects();
33-
if(outputFolderForAllProjects == null)
35+
DetermineOutputFolder();
36+
if (outputFolderForAllProjects == null)
3437
{
3538
foreach(var coverageProject in coverageProjects)
3639
{
@@ -47,7 +50,7 @@ public void SetProjectCoverageOutputFolder(List<ICoverageProject> coverageProjec
4750
}
4851
}
4952

50-
public void SetReportOutput(string unifiedHtml, string processedReport, string unifiedXml)
53+
public void OutputReports(string unifiedHtml, string processedReport, string unifiedXml)
5154
{
5255
var outputFolder = outputFolderForAllProjects ?? coverageProjects[0].CoverageOutputFolder;
5356

@@ -56,25 +59,13 @@ public void SetReportOutput(string unifiedHtml, string processedReport, string u
5659
fileUtil.WriteAllText(Path.Combine(outputFolder, unifiedXmlFileName), unifiedXml);
5760
}
5861

59-
private void DetermineOutputFolderForAllProjects()
62+
private void DetermineOutputFolder()
6063
{
61-
outputFolderForAllProjects = null;
62-
var coverageProjectWithAllProjectsCoverageOutputFolder = coverageProjects.FirstOrDefault(cp => cp.AllProjectsCoverageOutputFolder != null);
63-
if(coverageProjectWithAllProjectsCoverageOutputFolder != null)
64+
outputFolderForAllProjects = outputFolderProviders.SelectFirstNonNull(p => p.Value.Provide(coverageProjects));
65+
if(outputFolderForAllProjects != null)
6466
{
65-
var allProjectsCoverageOutputFolder = fileUtil.EnsureAbsolute(
66-
coverageProjectWithAllProjectsCoverageOutputFolder.AllProjectsCoverageOutputFolder,
67-
fileUtil.ParentDirectoryPath(coverageProjectWithAllProjectsCoverageOutputFolder.ProjectFile)
68-
);
69-
70-
outputFolderForAllProjects = allProjectsCoverageOutputFolder;
71-
logger.Log($"Outputting coverage files to - {outputFolderForAllProjects}");
72-
return;
67+
logger.Log($"FCC output in {outputFolderForAllProjects}");
7368
}
74-
75-
76-
logger.Log($"Outputting coverage files in project output folder");
77-
7869
}
7970
}
8071
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
using System;
2+
using System.ComponentModel.Composition;
3+
using System.IO;
4+
using FineCodeCoverage.Core.Utilities;
5+
6+
namespace FineCodeCoverage.Engine
7+
{
8+
[Order(2,typeof(ICoverageToolOutputFolderSolutionProvider))]
9+
class FccOutputExistenceCoverageToolOutputFolderSolutionProvider : ICoverageToolOutputFolderSolutionProvider
10+
{
11+
private const string fccOutputFolderName = "fcc-output";
12+
private readonly IFileUtil fileUtil;
13+
14+
[ImportingConstructor]
15+
public FccOutputExistenceCoverageToolOutputFolderSolutionProvider(IFileUtil fileUtil)
16+
{
17+
this.fileUtil = fileUtil;
18+
}
19+
20+
public string Provide(Func<string> solutionFolderProvider)
21+
{
22+
var solutionFolder = solutionFolderProvider();
23+
if (solutionFolder != null)
24+
{
25+
var provided = Path.Combine(solutionFolder, fccOutputFolderName);
26+
if (fileUtil.DirectoryExists(provided))
27+
{
28+
return provided;
29+
}
30+
}
31+
return null;
32+
}
33+
}
34+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using System.Collections.Generic;
2+
using FineCodeCoverage.Engine.Model;
3+
4+
namespace FineCodeCoverage.Engine
5+
{
6+
internal interface ICoverageToolOutputFolderProvider
7+
{
8+
string Provide(List<ICoverageProject> coverageProjects);
9+
}
10+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using System;
2+
3+
namespace FineCodeCoverage.Engine
4+
{
5+
interface ICoverageToolOutputFolderSolutionProvider
6+
{
7+
string Provide(Func<string> solutionFolderProvider);
8+
}
9+
}
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
1-
using System;
2-
using System.Collections.Generic;
3-
using System.Linq;
4-
using System.Text;
5-
using System.Threading.Tasks;
1+
using System.Collections.Generic;
62
using FineCodeCoverage.Engine.Model;
73

84
namespace FineCodeCoverage.Engine
95
{
106
internal interface ICoverageToolOutputManager
117
{
128
void SetProjectCoverageOutputFolder(List<ICoverageProject> coverageProjects);
13-
void SetReportOutput(string unifiedHtml, string processedReport, string unifiedXml);
9+
void OutputReports(string unifiedHtml, string processedReport, string unifiedXml);
1410
}
1511
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace FineCodeCoverage.Engine
2+
{
3+
interface ISolutionFolderProvider
4+
{
5+
string Provide(string projectFile);
6+
}
7+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using System.ComponentModel.Composition;
2+
using System.IO;
3+
using System.Linq;
4+
5+
namespace FineCodeCoverage.Engine
6+
{
7+
[Export(typeof(ISolutionFolderProvider))]
8+
class SolutionFolderProvider : ISolutionFolderProvider
9+
{
10+
public string Provide(string projectFile)
11+
{
12+
string provided = null;
13+
var directory = new FileInfo(projectFile).Directory;
14+
while(directory != null)
15+
{
16+
var isSolutionDirectory = directory.EnumerateFiles().Any(f => f.Name.EndsWith(".sln"));
17+
if (isSolutionDirectory)
18+
{
19+
provided = directory.FullName;
20+
break;
21+
}
22+
directory = directory.Parent;
23+
}
24+
return provided;
25+
}
26+
}
27+
}

FineCodeCoverage/Core/FCCEngine.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System;
22
using System.Collections.Generic;
33
using System.ComponentModel.Composition;
4-
using System.IO;
54
using System.Linq;
65
using System.Threading;
76
using FineCodeCoverage.Core.Utilities;
@@ -173,7 +172,7 @@ private void UpdateUI(List<CoverageLine> coverageLines, string reportHtml)
173172
coverageLines = coberturaUtil.CoverageLines;
174173

175174
processedReport = reportGeneratorUtil.ProcessUnifiedHtml(result.UnifiedHtml, darkMode);
176-
coverageOutputManager.SetReportOutput(result.UnifiedHtml, processedReport, result.UnifiedXml);
175+
coverageOutputManager.OutputReports(result.UnifiedHtml, processedReport, result.UnifiedXml);
177176
}
178177
return (coverageLines, processedReport);
179178
}

0 commit comments

Comments
 (0)