11using System ;
22using System . Collections . Generic ;
33using System . IO ;
4+ using System . Linq ;
45using System . Threading ;
6+ using System . Threading . Tasks ;
57using AutoMoq ;
68using FineCodeCoverage . Core . Utilities ;
79using FineCodeCoverage . Engine . Coverlet ;
810using FineCodeCoverage . Engine . Model ;
11+ using FineCodeCoverage . Engine . OpenCover ;
912using FineCodeCoverage . Options ;
1013using Moq ;
1114using NUnit . Framework ;
1215
1316namespace Test
1417{
15- public class CoverletConsoleUtil_Tests
18+
19+ public class CoverletExeArgumentsProvider_Tests
1620 {
17- private AutoMoqer mocker ;
18- private CoverletConsoleUtil coverletConsoleUtil ;
21+ [ Test ]
22+ public void Should_Have_ExcludeByAttribute_Setting_For_Each_ExcludeByAttribute ( )
23+ {
24+ var mockCoverageProject = SafeMockCoverageProject ( ) ;
25+ mockCoverageProject . SetupGet ( cp => cp . Settings . ExcludeByAttribute ) . Returns ( new [ ] { "ExcludeByAttribute1" , "ExcludeByAttribute2" } ) ;
1926
20- [ SetUp ]
21- public void SetUp ( )
27+ var coverletExeArgumentsProvider = new CoverletExeArgumentsProvider ( ) ;
28+ var coverletSettings = coverletExeArgumentsProvider . GetArguments ( mockCoverageProject . Object ) ;
29+
30+ AssertHasSetting ( coverletSettings , "--exclude-by-attribute ExcludeByAttribute1" ) ;
31+ AssertHasSetting ( coverletSettings , "--exclude-by-attribute ExcludeByAttribute2" ) ;
32+ }
33+
34+ [ Test ] //https://github.com/coverlet-coverage/coverlet/issues/1589
35+ public void Should_Unqualified_Qualified_ExcludeByAttribute ( )
2236 {
23- mocker = new AutoMoqer ( ) ;
24- coverletConsoleUtil = mocker . Create < CoverletConsoleUtil > ( ) ;
37+ var mockCoverageProject = SafeMockCoverageProject ( ) ;
38+ mockCoverageProject . SetupGet ( cp => cp . Settings . ExcludeByAttribute ) . Returns ( new [ ] { "Namespace.ExcludeByAttribute1" } ) ;
39+
40+ var coverletExeArgumentsProvider = new CoverletExeArgumentsProvider ( ) ;
41+ var coverletSettings = coverletExeArgumentsProvider . GetArguments ( mockCoverageProject . Object ) ;
42+
43+ AssertHasSetting ( coverletSettings , "--exclude-by-attribute ExcludeByAttribute1" ) ;
2544 }
26- [ Test ]
27- public void Should_Initilize_IFCCCoverletConsoleExeProvider ( )
45+
46+ private Mock < ICoverageProject > SafeMockCoverageProject ( )
2847 {
29- var ct = CancellationToken . None ;
30- coverletConsoleUtil . Initialize ( "appDataFolder" , ct ) ;
31- mocker . Verify < IFCCCoverletConsoleExecutor > ( fccExeProvider => fccExeProvider . Initialize ( "appDataFolder" , ct ) ) ;
48+ var mockCoverageProject = new Mock < ICoverageProject > ( ) ;
49+ mockCoverageProject . SetupGet ( coverageProject => coverageProject . IncludedReferencedProjects ) . Returns ( new List < string > ( ) ) ;
50+ mockCoverageProject . SetupGet ( coverageProject => coverageProject . ExcludedReferencedProjects ) . Returns ( new List < string > ( ) ) ;
51+ mockCoverageProject . SetupGet ( coverageProject => coverageProject . Settings ) . Returns ( new Mock < IAppOptions > ( ) . Object ) ;
52+ return mockCoverageProject ;
3253 }
3354
55+ private void AssertHasSetting ( List < string > coverletSettings , string setting )
56+ {
57+ Assert . IsTrue ( coverletSettings . Any ( coverletSetting => coverletSetting == setting ) ) ;
58+ }
59+
60+ private void AssertHasEscapedSetting ( List < string > coverletSettings , string setting )
61+ {
62+ AssertHasSetting ( coverletSettings , CommandLineArguments . AddQuotes ( setting ) ) ;
63+ }
64+ }
65+
66+ public class CoverletConsoleExecuteRequestProvider_Tests
67+ {
3468 [ TestCase ( 0 ) ]
3569 [ TestCase ( 1 ) ]
3670 [ TestCase ( 2 ) ]
@@ -50,7 +84,7 @@ public void Should_GetCoverletExePath_From_First_That_Returns_Non_Null(int provi
5084
5185 ExecuteRequest GetExecuteRequest ( int order )
5286 {
53- if ( order != providingExeProvider )
87+ if ( order != providingExeProvider )
5488 {
5589 return null ;
5690 }
@@ -74,13 +108,13 @@ ExecuteRequest GetExecuteRequest(int order)
74108 {
75109 var order = i ;
76110 var mockExeProvider = mockExecutors [ i ] ;
77- mockExeProvider . Setup ( p => p . GetRequest ( coverageProject , coverletSettings ) ) . Returns ( GetExecuteRequest ( i ) ) . Callback < ICoverageProject , string > ( ( _ , __ ) =>
111+ mockExeProvider . Setup ( p => p . GetRequest ( coverageProject , coverletSettings ) ) . Returns ( GetExecuteRequest ( i ) ) . Callback < ICoverageProject , string > ( ( _ , __ ) =>
78112 {
79113 callOrder . Add ( order ) ;
80114 } ) ;
81115 }
82116
83- var coverletConsoleUtil = new CoverletConsoleUtil ( null , null , mockGlobalExecutor . Object , mockCustomPathExecutor . Object , mockLocalExecutor . Object , mockFCCCoverletConsoleExecutor . Object ) ;
117+ var coverletConsoleUtil = new CoverletConsoleExecuteRequestProvider ( mockGlobalExecutor . Object , mockCustomPathExecutor . Object , mockLocalExecutor . Object , mockFCCCoverletConsoleExecutor . Object ) ;
84118
85119 var executeRequest = coverletConsoleUtil . GetExecuteRequest ( coverageProject , coverletSettings ) ;
86120
@@ -94,6 +128,123 @@ ExecuteRequest GetExecuteRequest(int order)
94128 }
95129
96130 }
131+ }
132+
133+ public class CoverletConsoleUtil_Tests
134+ {
135+ private AutoMoqer mocker ;
136+ private CoverletConsoleUtil coverletConsoleUtil ;
137+ private bool executed ;
138+ private readonly List < string > coverletSettings = new List < string > { "setting1" , "setting2" } ;
139+ private readonly ExecuteResponse successfulExecuteResponse = new ExecuteResponse { ExitCode = 3 , Output = "Successful output" } ;
140+
141+ [ SetUp ]
142+ public void SetUp ( )
143+ {
144+ executed = false ;
145+ mocker = new AutoMoqer ( ) ;
146+ coverletConsoleUtil = mocker . Create < CoverletConsoleUtil > ( ) ;
147+ }
148+ [ Test ]
149+ public void Should_Initilize_IFCCCoverletConsoleExeProvider ( )
150+ {
151+ var ct = CancellationToken . None ;
152+ coverletConsoleUtil . Initialize ( "appDataFolder" , ct ) ;
153+ mocker . Verify < IFCCCoverletConsoleExecutor > ( fccExeProvider => fccExeProvider . Initialize ( "appDataFolder" , ct ) ) ;
154+ }
155+
156+ [ Test ]
157+ public async Task Should_Execute_The_Request_From_The_Execute_Request_Provider_With_Space_Delimited_Settings ( )
158+ {
159+ await RunSuccessfullyAsync ( ) ;
160+
161+ mocker . GetMock < IProcessUtil > ( ) . Verify ( ) ;
162+ }
163+
164+ [ Test ]
165+ public async Task Should_Log_Settings_Before_Executing ( )
166+ {
167+ var mockLogger = mocker . GetMock < ILogger > ( ) ;
168+ mockLogger . Setup ( logger => logger . Log ( It . IsAny < IEnumerable < string > > ( ) ) ) . Callback < IEnumerable < string > > ( messages =>
169+ {
170+ var msgList = messages as List < string > ;
171+ Assert . Multiple ( ( ) =>
172+ {
173+ Assert . That ( msgList [ 0 ] , Is . EqualTo ( "Coverlet Run (TheProjectName) - Arguments" ) ) ;
174+ Assert . That ( msgList . Skip ( 1 ) , Is . EqualTo ( coverletSettings ) ) ;
175+ Assert . That ( executed , Is . False ) ;
176+ } ) ;
177+ } ) ;
178+
179+ await RunSuccessfullyAsync ( ) ;
180+
181+ mockLogger . Verify ( ) ;
182+ }
183+
184+ [ Test ]
185+ public void Should_Throw_With_ExecuteResponse_Output_When_ExitCode_Is_Greater_Than_3 ( )
186+ {
187+ var failureExecuteResponse = new ExecuteResponse { ExitCode = 4 , Output = "failure message" } ;
188+ var exception = Assert . ThrowsAsync < Exception > ( async ( ) => await RunAsync ( failureExecuteResponse ) ) ;
189+
190+ Assert . That ( exception . Message , Is . EqualTo ( "Error. Exit code: 4" ) ) ;
191+ }
192+
193+ [ Test ]
194+ public void Should_Log_With_ExecuteResponse_ExitCode_And_Output_When_ExitCode_Is_Greater_Than_3 ( )
195+ {
196+ var failureExecuteResponse = new ExecuteResponse { ExitCode = 4 , Output = "failure message" } ;
197+
198+ Assert . ThrowsAsync < Exception > ( ( ) => RunAsync ( failureExecuteResponse ) ) ;
199+
200+ var mockLogger = mocker . GetMock < ILogger > ( ) ;
201+ mockLogger . Verify ( logger => logger . Log ( "Coverlet Run (TheProjectName) Error. Exit code: 4" , "failure message" ) ) ;
202+ }
203+
204+ [ Test ]
205+ public async Task Should_Log_The_ExecuteResponse_Output_On_Success ( )
206+ {
207+ var mockLogger = mocker . GetMock < ILogger > ( ) ;
208+ mockLogger . Setup ( logger => logger . Log ( It . IsAny < string [ ] > ( ) ) ) . Callback < string [ ] > ( messages =>
209+ {
210+ Assert . Multiple ( ( ) =>
211+ {
212+ Assert . That ( messages , Is . EqualTo ( new string [ ] { "Coverlet Run (TheProjectName) - Output" , successfulExecuteResponse . Output } ) ) ;
213+ Assert . That ( executed , Is . True ) ;
214+ } ) ;
215+
216+ } ) ;
217+
218+ await RunSuccessfullyAsync ( ) ;
219+
220+ mockLogger . Verify ( ) ;
221+ }
222+
223+ private async Task RunSuccessfullyAsync ( )
224+ {
225+ await RunAsync ( successfulExecuteResponse ) ;
226+ }
227+
228+ private async Task RunAsync ( ExecuteResponse executeResponse )
229+ {
230+ var mockCoverageProject = new Mock < ICoverageProject > ( ) ;
231+ mockCoverageProject . SetupGet ( cp => cp . ProjectName ) . Returns ( "TheProjectName" ) ;
232+ var coverageProject = mockCoverageProject . Object ;
233+ var requestSettings = string . Join ( " " , coverletSettings ) ;
234+ var executeRequest = new ExecuteRequest { FilePath = "TheFilePath" , Arguments = "TheArguments" } ;
235+ var cancellationToken = CancellationToken . None ;
236+
237+ mocker . Setup < ICoverletExeArgumentsProvider , List < string > > ( coverletExeArgumentsProvider => coverletExeArgumentsProvider . GetArguments ( coverageProject ) ) . Returns ( coverletSettings ) ;
238+ mocker . Setup < ICoverletConsoleExecuteRequestProvider , ExecuteRequest > (
239+ coverletConsoleExecuteRequestProvider => coverletConsoleExecuteRequestProvider . GetExecuteRequest ( coverageProject , requestSettings )
240+ ) . Returns ( executeRequest ) ;
241+ var mockProcessUtil = mocker . GetMock < IProcessUtil > ( ) ;
242+ mockProcessUtil . Setup ( processUtil => processUtil . ExecuteAsync ( executeRequest , cancellationToken ) )
243+ . Callback ( ( ) => executed = true )
244+ . ReturnsAsync ( executeResponse ) ;
245+
246+ await coverletConsoleUtil . RunAsync ( coverageProject , cancellationToken ) ;
247+ }
97248
98249 }
99250
0 commit comments