4
4
using System . Collections . Generic ;
5
5
using System . ComponentModel . Composition ;
6
6
using System . Linq ;
7
+ using System . Text . RegularExpressions ;
7
8
8
9
namespace FineCodeCoverage . Engine . OpenCover
9
10
{
@@ -22,16 +23,61 @@ public static string AddEscapeQuotes(string arg)
22
23
[ Export ( typeof ( IOpenCoverExeArgumentsProvider ) ) ]
23
24
internal class OpenCoverExeArgumentsProvider : IOpenCoverExeArgumentsProvider
24
25
{
26
+ private static readonly Regex AssemblyRegex = new Regex ( @"^\[(.*?)\]" , RegexOptions . Compiled ) ;
25
27
private enum Delimiter { Semicolon , Space }
28
+
29
+ private static bool IncludeTestAssemblyOnlyWhenNecessary (
30
+ List < IReferencedProject > includedReferencedProjects ,
31
+ IEnumerable < string > inclusions ,
32
+ List < string > exclusions ,
33
+ string testAssemblyName )
34
+ {
35
+ return HasInclusions ( inclusions , includedReferencedProjects ) && ! IsTestAssemblySpecificallyExcluded ( exclusions , testAssemblyName ) ;
36
+ }
37
+
38
+ private static string GetAssemblyFromFilter ( string input )
39
+ {
40
+ Match match = AssemblyRegex . Match ( input ) ;
41
+ return match . Success ? match . Groups [ 1 ] . Value : null ;
42
+ }
43
+
44
+ private static bool IsTestAssemblySpecificallyExcluded ( List < string > exclusions , string testAssemblyName )
45
+ {
46
+ // not interested in an exclude all
47
+
48
+ // note that it could also have been excluded with a wild card - for now for simplicity we are not checking that
49
+ foreach ( var exclusion in exclusions)
50
+ {
51
+ var assembly = GetAssemblyFromFilter ( exclusion ) ;
52
+ if ( assembly = = testAssemblyName )
53
+ {
54
+ return true;
55
+ }
56
+ }
57
+ return false;
58
+ }
59
+
60
+ private static bool HasInclusions ( IEnumerable < string > includes , List < IReferencedProject > includedReferencedProjects )
61
+ {
62
+ return includes . Any ( ) || includedReferencedProjects . Any ( ) ;
63
+ }
64
+
65
+
66
+
26
67
private void AddFilter ( ICoverageProject project , List < string > opencoverSettings )
27
68
{
69
+ var includes = SanitizeExcludesOrIncludes ( project . Settings . Include ) ;
70
+ var excludes = SanitizeExcludesOrIncludes ( project . Settings . Exclude ) . ToList ( ) ;
71
+
28
72
var includedModules = project . IncludedReferencedProjects . Select ( rp => rp . AssemblyName ) . ToList ( ) ;
29
- if ( project . Settings . IncludeTestAssembly )
73
+ if ( project . Settings . IncludeTestAssembly &&
74
+ IncludeTestAssemblyOnlyWhenNecessary ( project . IncludedReferencedProjects , includes , excludes , project . ProjectName ) )
30
75
{
31
76
includedModules. Add ( project . ProjectName ) ;
32
77
}
33
- var includeFilters = GetExcludesOrIncludes ( project . Settings . Include , includedModules , true ) ;
34
- var excludeFilters = GetExcludesOrIncludes( project . Settings . Exclude , project . ExcludedReferencedProjects . Select ( rp => rp . AssemblyName ) , false ) ;
78
+
79
+ var includeFilters = GetExcludesOrIncludes( includes , includedModules , true ) ;
80
+ var excludeFilters = GetExcludesOrIncludes( excludes , project . ExcludedReferencedProjects . Select ( rp => rp . AssemblyName ) , false ) ;
35
81
AddIncludeAllIfExcludingWithoutIncludes( ) ;
36
82
var filters = includeFilters. Concat ( excludeFilters ) . ToList ( ) ;
37
83
SafeAddToSettingsDelimitedIfAny( opencoverSettings , "filter" , filters , Delimiter . Space ) ;
@@ -49,9 +95,9 @@ List<string> GetExcludesOrIncludes(
49
95
{
50
96
var excludeOrIncludeFilters = new List < string > ( ) ;
51
97
var prefix = IncludeSymbol( isInclude ) ;
52
- var sanitizedExcludesOrIncludes = SanitizeExcludesOrIncludes ( excludesOrIncludes ) ;
98
+ // var sanitizedExcludesOrIncludes = SanitizeExcludesOrIncludes(excludesOrIncludes);
53
99
54
- foreach ( var value in sanitizedExcludesOrIncludes )
100
+ foreach ( var value in excludesOrIncludes )
55
101
{
56
102
excludeOrIncludeFilters . Add ( $@ "{ prefix } { value } ") ;
57
103
}
0 commit comments