@@ -18,47 +18,78 @@ internal interface ICoverletExeArgumentsProvider
1818 [ Export ( typeof ( ICoverletExeArgumentsProvider ) ) ]
1919 internal class CoverletExeArgumentsProvider : ICoverletExeArgumentsProvider
2020 {
21- private IEnumerable < string > SanitizeExcludesOrIncludes ( string [ ] excludesOrIncludes )
21+ private static IEnumerable < string > SanitizeExcludesByAttribute ( string [ ] excludes )
2222 {
23- return ( excludesOrIncludes ?? new string [ 0 ] )
23+ return ( excludes ?? new string [ 0 ] )
2424 . Where ( x => x != null )
2525 . Select ( x => x . Trim ( ' ' , '\' ' , '\" ' ) )
2626 . Where ( x => ! string . IsNullOrWhiteSpace ( x ) ) ;
2727 }
28- public List < string > GetArguments ( ICoverageProject project )
29- {
30- var coverletSettings = new List < string > ( ) ;
31-
32- coverletSettings . Add ( $@ """{ project . TestDllFile } """);
33-
34- coverletSettings.Add($@" -- format ""cobertura""");
3528
36- foreach (var value in (project.Settings.Exclude ?? new string[0]).Where(x => !string.IsNullOrWhiteSpace(x)))
29+ private static IEnumerable < string > SantitizeExcludeInclude ( string [ ] excludesOrIncludes )
30+ {
31+ return ( excludesOrIncludes ?? new string [ 0 ] ) . Where ( x => ! string . IsNullOrWhiteSpace ( x ) ) . Select ( value =>
3732 {
38- coverletSettings.Add($@"--exclude ""{value.Replace("\"", "\\\"").Trim(' ', '\'')}""" ) ;
39- }
33+ return value . Replace ( "\" " , "\\ \" " ) . Trim ( ' ' , '\' ' ) ;
34+ } ) ;
35+ }
4036
41- foreach ( var referencedProjectExcludedFromCodeCoverage in project . ExcludedReferencedProjects . Select ( rp => rp . AssemblyName ) )
37+ private static void AddExcludesOrIncludes ( List < string > coverletSettings , IEnumerable < string > excludesOrIncludes , bool isInclude )
38+ {
39+ foreach ( var value in excludesOrIncludes )
4240 {
43- coverletSettings . Add ( $@ "--exclude ""[ { referencedProjectExcludedFromCodeCoverage } ]* """) ;
41+ coverletSettings . Add ( $@ "--{ ( isInclude ? "include" : " exclude" ) } ""{ value } """);
4442 }
43+ }
4544
46- foreach ( var value in ( project . Settings . Include ? ? new string [ 0 ] ) . Where( x => ! string . IsNullOrWhiteSpace( x) ) )
45+ private static IEnumerable<string> AddTestAssemblyIfNecessary(
46+ IEnumerable<string> projectIncludes,
47+ IEnumerable<string> includes,
48+ string projectName)
49+ {
50+ var hasIncludes = projectIncludes. Any( ) || includes . Any ( ) ;
51+ if ( ! hasIncludes )
4752 {
48- coverletSettings . Add ( $@ "--include "" { value . Replace ( " \" " , " \\ \" " ) . Trim ( ' ' , ' \' ' ) } """) ;
53+ return projectIncludes ;
4954 }
55+ return projectIncludes . Concat ( new string [ ] { projectName } ) ;
56+ }
5057
51- foreach (var includedReferencedProject in project.IncludedReferencedProjects.Select(rp => rp.AssemblyName))
58+ private static void AddProjectExcludesOrIncludes ( List < string > coverletSettings , IEnumerable < string > excludesOrIncludes , bool isInclude )
59+ {
60+ AddExcludesOrIncludes ( coverletSettings , excludesOrIncludes . Select ( excludeOrInclude => $ "[{ excludeOrInclude } ]*") , isInclude) ;
61+ }
62+
63+ private static void AddExcludesIncludes ( List < string > coverletSettings , ICoverageProject project )
64+ {
65+ AddExcludesOrIncludes ( coverletSettings , SantitizeExcludeInclude ( project . Settings . Exclude ) , false ) ;
66+ AddProjectExcludesOrIncludes( coverletSettings , project . ExcludedReferencedProjects . Select ( rp => rp . AssemblyName ) , false ) ;
67+ var includes = SantitizeExcludeInclude( project . Settings . Include ) ;
68+ AddExcludesOrIncludes( coverletSettings , includes , true ) ;
69+ var projectIncludes = project. IncludedReferencedProjects . Select ( rp => rp . AssemblyName ) ;
70+ if ( project . Settings . IncludeTestAssembly )
5271 {
53- coverletSettings . Add ( $@ "--include ""[ { includedReferencedProject } ]*""" ) ;
72+ projectIncludes = AddTestAssemblyIfNecessary ( projectIncludes , includes , project . ProjectName ) ;
5473 }
74+ AddProjectExcludesOrIncludes( coverletSettings , projectIncludes , true ) ;
75+ }
76+
77+ public List< string > GetArguments ( ICoverageProject project )
78+ {
79+ var coverletSettings = new List < string > ( ) ;
80+
81+ coverletSettings . Add ( $@ """{ project . TestDllFile } """);
82+
83+ coverletSettings.Add($@" -- format ""cobertura""");
84+
85+ AddExcludesIncludes(coverletSettings, project);
5586
5687 foreach (var value in (project.Settings.ExcludeByFile ?? new string[0]).Where(x => !string.IsNullOrWhiteSpace(x)))
5788 {
5889 coverletSettings.Add($@"--exclude-by-file ""{value.Replace("\"", "\\\"").Trim(' ', '\'')}""" ) ;
5990 }
6091
61- foreach (var value in SanitizeExcludesOrIncludes (project.Settings.ExcludeByAttribute).Select(EnsureAttributeTypeUnqualified))
92+ foreach ( var value in SanitizeExcludesByAttribute ( project . Settings . ExcludeByAttribute ) . Select ( EnsureAttributeTypeUnqualified ) )
6293 {
6394 var withoutAttributeBrackets = value. Trim ( '[' , ']' ) ;
6495 coverletSettings. Add ( $@ "--exclude-by-attribute { value } ") ;
0 commit comments