forked from FortuneN/FineCodeCoverage
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTemplatedRunSettingsService.cs
More file actions
168 lines (146 loc) · 7.39 KB
/
TemplatedRunSettingsService.cs
File metadata and controls
168 lines (146 loc) · 7.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
using FineCodeCoverage.Core.Utilities;
using FineCodeCoverage.Engine.Model;
using System;
using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
namespace FineCodeCoverage.Engine.MsTestPlatform.CodeCoverage
{
[Export(typeof(ITemplatedRunSettingsService))]
internal class TemplatedRunSettingsService : ITemplatedRunSettingsService
{
private readonly IRunSettingsTemplate runSettingsTemplate;
private readonly ICustomRunSettingsTemplateProvider customRunSettingsTemplateProvider;
private readonly IRunSettingsTemplateReplacementsFactory runSettingsTemplateReplacementsFactory;
private readonly IProjectRunSettingsGenerator projectRunSettingsGenerator;
private class ProjectRunSettingsFromTemplateResult : IProjectRunSettingsFromTemplateResult
{
private class ExceptionReasonImpl : IExceptionReason
{
public ExceptionReasonImpl(Exception exc, string reason)
{
Exception = exc;
Reason = reason;
}
public Exception Exception { get; }
public string Reason { get; }
}
public IExceptionReason ExceptionReason { get; set; }
public List<string> CustomTemplatePaths { get; set; }
public List<ICoverageProject> CoverageProjectsWithFCCMsTestAdapter { get; set; }
public static ProjectRunSettingsFromTemplateResult FromException(Exception exception, string reason)
{
return new ProjectRunSettingsFromTemplateResult
{
ExceptionReason = new ExceptionReasonImpl(exception, reason)
};
}
}
[ImportingConstructor]
public TemplatedRunSettingsService(
IRunSettingsTemplate runSettingsTemplate,
ICustomRunSettingsTemplateProvider customRunSettingsTemplateProvider,
IRunSettingsTemplateReplacementsFactory runSettingsTemplateReplacementsFactory,
IProjectRunSettingsGenerator projectRunSettingsGenerator
)
{
this.runSettingsTemplate = runSettingsTemplate;
this.customRunSettingsTemplateProvider = customRunSettingsTemplateProvider;
this.runSettingsTemplateReplacementsFactory = runSettingsTemplateReplacementsFactory;
this.projectRunSettingsGenerator = projectRunSettingsGenerator;
}
public async Task<IProjectRunSettingsFromTemplateResult> GenerateAsync(IEnumerable<ICoverageProject> coverageProjectsWithoutRunSettings, string solutionDirectory, string fccMsTestAdapterPath)
{
IEnumerable<TemplatedCoverageProjectRunSettingsResult> projectsRunSettings;
try
{
projectsRunSettings = CreateProjectsRunSettings(
coverageProjectsWithoutRunSettings, solutionDirectory, fccMsTestAdapterPath);
}
catch (Exception exc)
{
return ProjectRunSettingsFromTemplateResult.FromException(exc, "Exception generating runsettings from template");
}
try
{
await projectRunSettingsGenerator.WriteProjectsRunSettingsAsync(projectsRunSettings);
}
catch (Exception exc)
{
await Tryer.TryAsync(
() => projectRunSettingsGenerator.RemoveGeneratedProjectSettingsAsync(coverageProjectsWithoutRunSettings)
);
return ProjectRunSettingsFromTemplateResult.FromException(exc, "Exception writing templated runsettings");
}
return CreateSuccessResult(projectsRunSettings);
}
private IProjectRunSettingsFromTemplateResult CreateSuccessResult(IEnumerable<TemplatedCoverageProjectRunSettingsResult> templatedCoverageProjectsRunSettingsResult)
{
List<string> customTemplatePaths = new List<string>();
List<ICoverageProject> coverageProjectsWithFCCMsTestAdapter = new List<ICoverageProject>();
foreach (var templatedCoverageProjectRunSettingsResult in templatedCoverageProjectsRunSettingsResult)
{
if (templatedCoverageProjectRunSettingsResult.ReplacedTestAdapter)
{
coverageProjectsWithFCCMsTestAdapter.Add(templatedCoverageProjectRunSettingsResult.CoverageProject);
}
if (templatedCoverageProjectRunSettingsResult.CustomTemplatePath != null)
{
customTemplatePaths.Add(templatedCoverageProjectRunSettingsResult.CustomTemplatePath);
}
}
return new ProjectRunSettingsFromTemplateResult
{
CustomTemplatePaths = customTemplatePaths,
CoverageProjectsWithFCCMsTestAdapter = coverageProjectsWithFCCMsTestAdapter
};
}
public List<TemplatedCoverageProjectRunSettingsResult> CreateProjectsRunSettings(
IEnumerable<ICoverageProject> coverageProjects,
string solutionDirectory,
string fccMsTestAdapterPath
)
{
return coverageProjects.Select(coverageProject =>
{
var projectDirectory = Path.GetDirectoryName(coverageProject.ProjectFile);
var (replaceableTemplate, customTemplatePath) = GetRunSettingsTemplate(projectDirectory, solutionDirectory);
var templateReplaceResult = ReplaceTemplate(coverageProject, replaceableTemplate, fccMsTestAdapterPath);
return new TemplatedCoverageProjectRunSettingsResult
{
CoverageProject = coverageProject,
RunSettings = templateReplaceResult.Replaced,
CustomTemplatePath = customTemplatePath,
ReplacedTestAdapter = templateReplaceResult.ReplacedTestAdapter
};
}).ToList();
}
private (string ReplaceableTemplate, string CustomPath) GetRunSettingsTemplate(string projectDirectory, string solutionDirectory)
{
string customPath = null;
string replaceableTemplate;
var customRunSettingsTemplateDetails = customRunSettingsTemplateProvider.Provide(projectDirectory, solutionDirectory);
if (customRunSettingsTemplateDetails != null)
{
customPath = customRunSettingsTemplateDetails.Path;
replaceableTemplate = runSettingsTemplate.ConfigureCustom(customRunSettingsTemplateDetails.Template);
}
else
{
replaceableTemplate = runSettingsTemplate.Get();
}
return (replaceableTemplate, customPath);
}
private ITemplateReplacementResult ReplaceTemplate(ICoverageProject coverageProject, string replaceableTemplate, string fccMsTestAdapterPath)
{
var replacements = runSettingsTemplateReplacementsFactory.Create(coverageProject, fccMsTestAdapterPath);
return this.runSettingsTemplate.ReplaceTemplate(replaceableTemplate, replacements, coverageProject.IsDotNetFramework);
}
public Task CleanUpAsync(List<ICoverageProject> coverageProjects)
{
return projectRunSettingsGenerator.RemoveGeneratedProjectSettingsAsync(coverageProjects);
}
}
}