From 52dca03fc50220da35526bd42b3978da6ebd801f Mon Sep 17 00:00:00 2001 From: Tony Hallett Date: Thu, 13 May 2021 16:38:00 +0100 Subject: [PATCH 1/2] clear ui when start run coverage --- FineCodeCoverage/Core/FCCEngine.cs | 3 +- FineCodeCoverageTests/FCCEngine_Tests.cs | 347 ++++++++++++----------- 2 files changed, 177 insertions(+), 173 deletions(-) diff --git a/FineCodeCoverage/Core/FCCEngine.cs b/FineCodeCoverage/Core/FCCEngine.cs index f71cc47c..1327c4ee 100644 --- a/FineCodeCoverage/Core/FCCEngine.cs +++ b/FineCodeCoverage/Core/FCCEngine.cs @@ -118,6 +118,7 @@ public void StopCoverage() private CancellationToken Reset() { + ClearUI(); StopCoverage(); cancellationTokenSource = new CancellationTokenSource(); @@ -240,7 +241,7 @@ private void ReloadCoverageTaskContinuation(System.Threading.Tasks.Task<(List(l => l.Log(fccEngine.GetLogReloadCoverageStatusMessage(reloadCoverageStatus))); - } - private void VerifyRaisedUIEvents() - { - Assert.True(raisedUpdateOutputWindow); - Assert.True(raisedUpdateMarginTags); - } - private void VerifyClearUIEvents() - { - VerifyRaisedUIEvents(); - Assert.IsNull(fccEngine.CoverageLines); - Assert.IsNull(htmlContent); - } - - private void SetUpSuccessfulRunReportGenerator() - { - mocker.GetMock() - .Setup(rg => rg.RunReportGeneratorAsync( - It.IsAny>(), - It.IsAny(), - It.IsAny() - ).Result) - .Returns(new ReportGeneratorResult { Success = true }); - } - - private async Task ReloadInitializedCoverage(params ICoverageProject[] coverageProjects) - { - var projectsFromTask = Task.FromResult(coverageProjects.ToList()); - var mockInitializeStatusProvider = new Mock(); - mockInitializeStatusProvider.Setup(i => i.InitializeStatus).Returns(InitializeStatus.Initialized); - fccEngine.Initialize(mockInitializeStatusProvider.Object); - fccEngine.ReloadCoverage(() => projectsFromTask); - await fccEngine.reloadCoverageTask; - } - private Mock CreateSuitableProject() - { - var mockSuitableCoverageProject = new Mock(); - mockSuitableCoverageProject.Setup(p => p.ProjectFile).Returns("Defined.csproj"); - mockSuitableCoverageProject.Setup(p => p.Settings.Enabled).Returns(true); - mockSuitableCoverageProject.Setup(p => p.PrepareForCoverageAsync()).Returns(Task.CompletedTask); - mockSuitableCoverageProject.Setup(p => p.StepAsync("Run Coverage Tool", It.IsAny>())).Returns(Task.CompletedTask); - return mockSuitableCoverageProject; - } - private async Task> ReloadSuitableCoverageProject(Action> setUp = null) - { - var mockSuitableCoverageProject = CreateSuitableProject(); - setUp?.Invoke(mockSuitableCoverageProject); - SetUpSuccessfulRunReportGenerator(); - await ReloadInitializedCoverage(mockSuitableCoverageProject.Object); - return mockSuitableCoverageProject; - } + private List updateMarginTagsEvents; + private List> updateMarginTagsCoverageLines; + private List updateOutputWindowEvents; [SetUp] public void SetUp() { mocker = new AutoMoqer(); fccEngine = mocker.Create(); - - raisedUpdateMarginTags = false; - raisedUpdateOutputWindow = false; + + updateMarginTagsEvents = new List(); + updateMarginTagsCoverageLines = new List>(); + updateOutputWindowEvents = new List(); tempReportGeneratedHtml = null; - htmlContent = null; fccEngine.UpdateMarginTags += (UpdateMarginTagsEventArgs e) => { - raisedUpdateMarginTags = true; + updateMarginTagsEvents.Add(e); + updateMarginTagsCoverageLines.Add(fccEngine.CoverageLines); }; fccEngine.UpdateOutputWindow += (UpdateOutputWindowEventArgs e) => { - raisedUpdateOutputWindow = true; - htmlContent = e.HtmlContent; + updateOutputWindowEvents.Add(e); }; } @@ -341,7 +287,6 @@ public async Task Should_Not_Run_ReportGenerator_If_No_Successful_Projects() mocker.Verify(rg => rg.RunReportGeneratorAsync(It.IsAny>(), It.IsAny(), It.IsAny()), Times.Never()); } - [Test] public async Task Should_Process_ReportGenerator_Output_If_Success() { @@ -394,90 +339,35 @@ public async Task Should_Not_Process_ReportGenerator_Output_If_Failure() mocker.Verify(coberturaUtil => coberturaUtil.ProcessCoberturaXmlFile(It.IsAny()), Times.Never()); } - - private async Task<(string reportGeneratedHtmlContent,List updatedCoverageLines)> RunToCompletion(bool early) + + [Test] + public async Task Should_Clear_UI_Then_Update_UI_When_ReloadCoverage_Completes_Fully() { - var passedProject = CreateSuitableProject(); - - var mockReportGenerator = mocker.GetMock(); - mockReportGenerator.Setup(rg => - rg.RunReportGeneratorAsync( - It.IsAny>(), - It.IsAny(), - true).Result) - .Returns( - new ReportGeneratorResult - { - Success = true, - } - ); + fccEngine.CoverageLines = new List(); + var (updatedCoverageLines, reportGeneratedHtmlContent) = await RunToCompletion(false); - var reportGeneratedHtmlContent = ""; - tempReportGeneratedHtml = Path.GetTempFileName(); - File.WriteAllText(tempReportGeneratedHtml, reportGeneratedHtmlContent); - mockReportGenerator.Setup(rg => rg.ProcessUnifiedHtmlFile(It.IsAny(), It.IsAny(), out tempReportGeneratedHtml)); + VerifyLogsReloadCoverageStatus(ReloadCoverageStatus.Done); - List coverageLines = new List() { new CoverageLine() }; - mocker.GetMock().Setup(coberturaUtil => coberturaUtil.CoverageLines).Returns(coverageLines); - if (early) - { - await ReloadInitializedCoverage(); - } - else - { - await ReloadInitializedCoverage(passedProject.Object); - } - - return (reportGeneratedHtmlContent, coverageLines); - - } + VerifyClearUIEvents(0); - [Test] - public async Task Should_Update_UI_When_ReloadCoverage_Completes_Fully() - { - var mocked = await RunToCompletion(false); - VerifyLogsReloadCoverageStatus(ReloadCoverageStatus.Done); - Assert.AreSame(mocked.updatedCoverageLines, fccEngine.CoverageLines); - Assert.AreEqual(mocked.reportGeneratedHtmlContent, htmlContent); + Assert.AreSame(updatedCoverageLines, updateMarginTagsCoverageLines[1]); + Assert.AreEqual(reportGeneratedHtmlContent, updateOutputWindowEvents[1].HtmlContent); } [Test] - public async Task Should_Clear_UI_When_ReloadCoverage_Completes_Early_With_Reset() + public async Task Should_Clear_UI_When_ReloadCoverage_And_No_CoverageProjects() { fccEngine.CoverageLines = new List(); + await RunToCompletion(true); + VerifyLogsReloadCoverageStatus(ReloadCoverageStatus.Done); - VerifyClearUIEvents(); - } - - private async Task ThrowReadingReportHtml() - { - var passedProject = CreateSuitableProject(); - - var mockReportGenerator = mocker.GetMock(); - mockReportGenerator.Setup(rg => - rg.RunReportGeneratorAsync( - It.IsAny>(), - It.IsAny(), - true).Result) - .Returns( - new ReportGeneratorResult - { - Success = true, - } - ); - - var badPath = "^&$!"; - mockReportGenerator.Setup(rg => rg.ProcessUnifiedHtmlFile(It.IsAny(), It.IsAny(), out badPath)); - - List coverageLines = new List() { new CoverageLine() }; - mocker.GetMock().Setup(coberturaUtil => coberturaUtil.CoverageLines).Returns(coverageLines); - await ReloadInitializedCoverage(passedProject.Object); - + Assert.Null(updateMarginTagsCoverageLines[1]); + Assert.Null(updateOutputWindowEvents[1].HtmlContent); } - + [Test] // CoverageLines will be present and tags added hence done - unlikely for this branch to occur public async Task Should_Log_Done_When_Exception_Reading_Report_Html() { @@ -497,26 +387,12 @@ public async Task Should_Log_Message_When_Exception_Reading_Report_Html() public async Task Should_Update_OutputWindow_With_Null_HtmlContent_When_Reading_Report_Html_Throws() { await ThrowReadingReportHtml(); - Assert.True(raisedUpdateOutputWindow); - Assert.IsNull(htmlContent); - - } - - private async Task ThrowException(Action exceptionCallback = null) - { - var exception = new Exception("an exception"); - exceptionCallback?.Invoke(exception); - Task> thrower() => Task.FromException>(exception); - - var mockInitializeStatusProvider = new Mock(); - mockInitializeStatusProvider.Setup(i => i.InitializeStatus).Returns(InitializeStatus.Initialized); - fccEngine.Initialize(mockInitializeStatusProvider.Object); - - fccEngine.ReloadCoverage(thrower); - await fccEngine.reloadCoverageTask; - } + Assert.AreEqual(updateMarginTagsCoverageLines[1].Count, 1); + Assert.Null(updateOutputWindowEvents[1].HtmlContent); + } + [Test] public async Task Should_Log_Single_Exception_From_Aggregate_Exception() { @@ -531,23 +407,7 @@ public async Task Should_Clear_UI_When_There_Is_An_Exception() { fccEngine.CoverageLines = new List(); await ThrowException(); - VerifyClearUIEvents(); - } - - - private async Task StopCoverage() - { - var mockSuitableCoverageProject = new Mock(); - mockSuitableCoverageProject.Setup(p => p.ProjectFile).Returns("Defined.csproj"); - mockSuitableCoverageProject.Setup(p => p.Settings.Enabled).Returns(true); - - mockSuitableCoverageProject.Setup(p => p.PrepareForCoverageAsync()).Callback(() => - { - fccEngine.StopCoverage(); - - }).Returns(Task.CompletedTask); - - await ReloadInitializedCoverage(mockSuitableCoverageProject.Object); + VerifyClearUIEvents(1); } [Test] @@ -561,8 +421,8 @@ public async Task Should_Cancel_Running_Coverage_Logging_Cancelled_When_StopCove public async Task Should_Not_Update_UI_When_ReloadCoverage_Is_Cancelled() { await StopCoverage(); - Assert.False(raisedUpdateMarginTags); - Assert.False(raisedUpdateOutputWindow); + Assert.AreEqual(1, updateMarginTagsEvents.Count); + Assert.AreEqual(1, updateOutputWindowEvents.Count); } @@ -611,6 +471,149 @@ public async Task Should_Cancel_Existing_ReloadCoverage_When_ReloadCoverage() } + private void VerifyLogsReloadCoverageStatus(ReloadCoverageStatus reloadCoverageStatus) + { + mocker.Verify(l => l.Log(fccEngine.GetLogReloadCoverageStatusMessage(reloadCoverageStatus))); + } + + private void VerifyClearUIEvents(int eventNumber) + { + Assert.Null(updateMarginTagsCoverageLines[eventNumber]); + Assert.Null(updateOutputWindowEvents[eventNumber].HtmlContent); + } + + private async Task<(string reportGeneratedHtmlContent, List updatedCoverageLines)> RunToCompletion(bool noCoverageProjects) + { + var passedProject = CreateSuitableProject(); + + var mockReportGenerator = mocker.GetMock(); + mockReportGenerator.Setup(rg => + rg.RunReportGeneratorAsync( + It.IsAny>(), + It.IsAny(), + true).Result) + .Returns( + new ReportGeneratorResult + { + Success = true, + } + ); + + var reportGeneratedHtmlContent = ""; + tempReportGeneratedHtml = Path.GetTempFileName(); + File.WriteAllText(tempReportGeneratedHtml, reportGeneratedHtmlContent); + mockReportGenerator.Setup(rg => rg.ProcessUnifiedHtmlFile(It.IsAny(), It.IsAny(), out tempReportGeneratedHtml)); + + List coverageLines = new List() { new CoverageLine() }; + mocker.GetMock().Setup(coberturaUtil => coberturaUtil.CoverageLines).Returns(coverageLines); + if (noCoverageProjects) + { + await ReloadInitializedCoverage(); + } + else + { + await ReloadInitializedCoverage(passedProject.Object); + } + + return (reportGeneratedHtmlContent, coverageLines); + + } + + private async Task ThrowReadingReportHtml() + { + var passedProject = CreateSuitableProject(); + + var mockReportGenerator = mocker.GetMock(); + mockReportGenerator.Setup(rg => + rg.RunReportGeneratorAsync( + It.IsAny>(), + It.IsAny(), + true).Result) + .Returns( + new ReportGeneratorResult + { + Success = true, + } + ); + + var badPath = "^&$!"; + mockReportGenerator.Setup(rg => rg.ProcessUnifiedHtmlFile(It.IsAny(), It.IsAny(), out badPath)); + + List coverageLines = new List() { new CoverageLine() }; + mocker.GetMock().Setup(coberturaUtil => coberturaUtil.CoverageLines).Returns(coverageLines); + + await ReloadInitializedCoverage(passedProject.Object); + + } + + private async Task ThrowException(Action exceptionCallback = null) + { + var exception = new Exception("an exception"); + exceptionCallback?.Invoke(exception); + Task> thrower() => Task.FromException>(exception); + + var mockInitializeStatusProvider = new Mock(); + mockInitializeStatusProvider.Setup(i => i.InitializeStatus).Returns(InitializeStatus.Initialized); + fccEngine.Initialize(mockInitializeStatusProvider.Object); + + fccEngine.ReloadCoverage(thrower); + + await fccEngine.reloadCoverageTask; + } + + private async Task StopCoverage() + { + var mockSuitableCoverageProject = new Mock(); + mockSuitableCoverageProject.Setup(p => p.ProjectFile).Returns("Defined.csproj"); + mockSuitableCoverageProject.Setup(p => p.Settings.Enabled).Returns(true); + + mockSuitableCoverageProject.Setup(p => p.PrepareForCoverageAsync()).Callback(() => + { + fccEngine.StopCoverage(); + + }).Returns(Task.CompletedTask); + + await ReloadInitializedCoverage(mockSuitableCoverageProject.Object); + } + + private void SetUpSuccessfulRunReportGenerator() + { + mocker.GetMock() + .Setup(rg => rg.RunReportGeneratorAsync( + It.IsAny>(), + It.IsAny(), + It.IsAny() + ).Result) + .Returns(new ReportGeneratorResult { Success = true }); + } + + private async Task ReloadInitializedCoverage(params ICoverageProject[] coverageProjects) + { + var projectsFromTask = Task.FromResult(coverageProjects.ToList()); + var mockInitializeStatusProvider = new Mock(); + mockInitializeStatusProvider.Setup(i => i.InitializeStatus).Returns(InitializeStatus.Initialized); + fccEngine.Initialize(mockInitializeStatusProvider.Object); + fccEngine.ReloadCoverage(() => projectsFromTask); + await fccEngine.reloadCoverageTask; + } + private Mock CreateSuitableProject() + { + var mockSuitableCoverageProject = new Mock(); + mockSuitableCoverageProject.Setup(p => p.ProjectFile).Returns("Defined.csproj"); + mockSuitableCoverageProject.Setup(p => p.Settings.Enabled).Returns(true); + mockSuitableCoverageProject.Setup(p => p.PrepareForCoverageAsync()).Returns(Task.CompletedTask); + mockSuitableCoverageProject.Setup(p => p.StepAsync("Run Coverage Tool", It.IsAny>())).Returns(Task.CompletedTask); + return mockSuitableCoverageProject; + } + private async Task> ReloadSuitableCoverageProject(Action> setUp = null) + { + var mockSuitableCoverageProject = CreateSuitableProject(); + setUp?.Invoke(mockSuitableCoverageProject); + SetUpSuccessfulRunReportGenerator(); + await ReloadInitializedCoverage(mockSuitableCoverageProject.Object); + return mockSuitableCoverageProject; + } + } } \ No newline at end of file From 5168c2e19ecb0af156929119ac8e96165be33e97 Mon Sep 17 00:00:00 2001 From: Tony Hallett Date: Thu, 13 May 2021 16:47:34 +0100 Subject: [PATCH 2/2] correct tuple deconstruction in test --- FineCodeCoverageTests/FCCEngine_Tests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FineCodeCoverageTests/FCCEngine_Tests.cs b/FineCodeCoverageTests/FCCEngine_Tests.cs index e3fc637e..b40c8736 100644 --- a/FineCodeCoverageTests/FCCEngine_Tests.cs +++ b/FineCodeCoverageTests/FCCEngine_Tests.cs @@ -344,7 +344,7 @@ public async Task Should_Not_Process_ReportGenerator_Output_If_Failure() public async Task Should_Clear_UI_Then_Update_UI_When_ReloadCoverage_Completes_Fully() { fccEngine.CoverageLines = new List(); - var (updatedCoverageLines, reportGeneratedHtmlContent) = await RunToCompletion(false); + var (reportGeneratedHtmlContent, updatedCoverageLines) = await RunToCompletion(false); VerifyLogsReloadCoverageStatus(ReloadCoverageStatus.Done);