Skip to content

Commit baf3bcc

Browse files
authored
Merge pull request #381 from tonyhallett/consistent-tool-window-opening
Move initialization into package. Record opened tool window when ope…
2 parents 7d613d3 + a6f9935 commit baf3bcc

30 files changed

+559
-260
lines changed

FineCodeCoverageTests/FCCEngine_Tests.cs

Lines changed: 4 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
using System;
22
using System.Collections.Generic;
3-
using System.IO;
43
using System.Linq;
54
using System.Threading;
65
using System.Threading.Tasks;
76
using AutoMoq;
7+
using FineCodeCoverage.Core.Initialization;
88
using FineCodeCoverage.Core.Utilities;
99
using FineCodeCoverage.Engine;
1010
using FineCodeCoverage.Engine.Cobertura;
1111
using FineCodeCoverage.Engine.Model;
1212
using FineCodeCoverage.Engine.MsTestPlatform;
1313
using FineCodeCoverage.Engine.ReportGenerator;
14-
using FineCodeCoverage.Impl;
1514
using FineCodeCoverage.Options;
1615
using FineCodeCoverage.Output;
1716
using Moq;
@@ -50,7 +49,7 @@ public void Should_Initialize_AppFolder_Then_Utils()
5049

5150
var openCoverMock = mocker.GetMock<ICoverageUtilManager>().Setup(openCover => openCover.Initialize(appDataFolderPath, disposalToken)).Callback(() => callOrder.Add(4));
5251

53-
fccEngine.Initialize(null,disposalToken);
52+
fccEngine.Initialize(disposalToken);
5453

5554
Assert.AreEqual(4, callOrder.Count);
5655
Assert.AreEqual(1, callOrder[0]);
@@ -63,7 +62,7 @@ public void Should_Set_AppDataFolderPath_From_Initialized_AppDataFolder_Director
6362
var appDataFolderPath = "some path";
6463
var mockAppDataFolder = mocker.GetMock<IAppDataFolder>();
6564
mockAppDataFolder.Setup(appDataFolder => appDataFolder.DirectoryPath).Returns(appDataFolderPath);
66-
fccEngine.Initialize(null, CancellationToken.None);
65+
fccEngine.Initialize(CancellationToken.None);
6766
Assert.AreEqual("some path", fccEngine.AppDataFolderPath);
6867
}
6968

@@ -102,46 +101,6 @@ public async Task Should_Log_Starting_When_Initialized()
102101
VerifyLogsReloadCoverageStatus(ReloadCoverageStatus.Start);
103102
}
104103

105-
[Test]
106-
public async Task Should_Poll_For_Initialized()
107-
{
108-
var times = 5;
109-
var initializeWait = 1000;
110-
fccEngine.InitializeWait = initializeWait;
111-
112-
var mockInitializeStatusProvider = new Mock<IInitializeStatusProvider>();
113-
mockInitializeStatusProvider.SetupProperty(i => i.InitializeStatus);
114-
var initializeStatusProvider = mockInitializeStatusProvider.Object;
115-
116-
fccEngine.Initialize(initializeStatusProvider, CancellationToken.None);
117-
118-
fccEngine.ReloadCoverage(() => Task.FromResult(new List<ICoverageProject>()));
119-
await Task.Delay(times * initializeWait).ContinueWith(_ =>
120-
{
121-
initializeStatusProvider.InitializeStatus = InitializeStatus.Initialized;
122-
});
123-
await fccEngine.reloadCoverageTask;
124-
mocker.Verify<ILogger>(l => l.Log(fccEngine.GetLogReloadCoverageStatusMessage(ReloadCoverageStatus.Initializing)), Times.AtLeast(times));
125-
}
126-
127-
[Test]
128-
public async Task Should_Throw_With_initializationFailedMessagePrefix_When_Initialize_Has_Failed()
129-
{
130-
var mockInitializerStatusProvider = new Mock<IInitializeStatusProvider>();
131-
mockInitializerStatusProvider.Setup(i => i.InitializeStatus).Returns(InitializeStatus.Error);
132-
var initializeExceptionMessage = "An exception was thrown";
133-
mockInitializerStatusProvider.Setup(i => i.InitializeExceptionMessage).Returns(initializeExceptionMessage);
134-
135-
fccEngine.Initialize(mockInitializerStatusProvider.Object, CancellationToken.None);
136-
137-
fccEngine.ReloadCoverage(() => Task.FromResult(new List<ICoverageProject>()));
138-
139-
await fccEngine.reloadCoverageTask;
140-
141-
mocker.Verify<ILogger>(l => l.Log(fccEngine.GetLogReloadCoverageStatusMessage(ReloadCoverageStatus.Error),It.Is<Exception>(exc => (FCCEngine.initializationFailedMessagePrefix + Environment.NewLine + initializeExceptionMessage) == exc.Message)));
142-
143-
}
144-
145104
[Test]
146105
public async Task Should_Prepare_For_Coverage_Suitable_CoverageProjects()
147106
{
@@ -302,14 +261,6 @@ public async Task Should_Process_ReportGenerator_Output_If_Success_Raising_Event
302261

303262
}
304263

305-
[Test]
306-
public async Task Should_Log_Single_Exception_From_Aggregate_Exception()
307-
{
308-
Exception exception = null;
309-
await ThrowException(exc => exception = exc);
310-
mocker.Verify<ILogger>(l => l.Log(fccEngine.GetLogReloadCoverageStatusMessage(ReloadCoverageStatus.Error),exception));
311-
}
312-
313264
[Test]
314265
public async Task Should_Cancel_Running_Coverage_Logging_Cancelled_When_StopCoverage()
315266
{
@@ -417,21 +368,6 @@ private async Task ThrowReadingReportHtml()
417368

418369
}
419370

420-
private async Task ThrowException(Action<Exception> exceptionCallback = null)
421-
{
422-
var exception = new Exception("an exception");
423-
exceptionCallback?.Invoke(exception);
424-
Task<List<ICoverageProject>> thrower() => Task.FromException<List<ICoverageProject>>(exception);
425-
426-
var mockInitializeStatusProvider = new Mock<IInitializeStatusProvider>();
427-
mockInitializeStatusProvider.Setup(i => i.InitializeStatus).Returns(InitializeStatus.Initialized);
428-
fccEngine.Initialize(mockInitializeStatusProvider.Object, CancellationToken.None);
429-
430-
fccEngine.ReloadCoverage(thrower);
431-
432-
await fccEngine.reloadCoverageTask;
433-
}
434-
435371
private async Task StopCoverage()
436372
{
437373
var mockSuitableCoverageProject = new Mock<ICoverageProject>();
@@ -461,9 +397,7 @@ private void SetUpSuccessfulRunReportGenerator()
461397
private async Task ReloadInitializedCoverage(params ICoverageProject[] coverageProjects)
462398
{
463399
var projectsFromTask = Task.FromResult(coverageProjects.ToList());
464-
var mockInitializeStatusProvider = new Mock<IInitializeStatusProvider>();
465-
mockInitializeStatusProvider.Setup(i => i.InitializeStatus).Returns(InitializeStatus.Initialized);
466-
fccEngine.Initialize(mockInitializeStatusProvider.Object, CancellationToken.None);
400+
fccEngine.Initialize(CancellationToken.None);
467401
fccEngine.ReloadCoverage(() => projectsFromTask);
468402
await fccEngine.reloadCoverageTask;
469403
}

FineCodeCoverageTests/FineCodeCoverageTests.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@
115115
<Compile Include="AppOptionsProvider_Tests.cs" />
116116
<Compile Include="CoverageUtilManager_Tests.cs" />
117117
<Compile Include="FileLineCoverage_Tests.cs" />
118+
<Compile Include="FirstTimeToolWindowOpener_Tests.cs" />
118119
<Compile Include="MsCodeCoverage\ShimCopier_Tests.cs" />
119120
<Compile Include="MsCodeCoverage\TemplatedRunSettingsService_Tests.cs" />
120121
<Compile Include="MsCodeCoverage\CustomRunSettingsTemplateProvider_Tests.cs" />
@@ -130,6 +131,8 @@
130131
<Compile Include="MsCodeCoverage\UserRunSettingsService_AddFCCSettings_Tests.cs" />
131132
<Compile Include="MsCodeCoverage\UserRunSettingsService_Analysis_Tests.cs" />
132133
<Compile Include="MsCodeCoverage\RunSettingsTemplateReplacementsFactory_Tests.cs" />
134+
<Compile Include="PackageLoader_Tests.cs" />
135+
<Compile Include="ShownToolWindowHistory_Tests.cs" />
133136
<Compile Include="Test helpers\MefOrderAssertions.cs" />
134137
<Compile Include="Test helpers\TestThreadHelper.cs" />
135138
<Compile Include="Test helpers\XmlAssert.cs" />
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
using AutoMoq;
2+
using FineCodeCoverage.Core.Initialization;
3+
using FineCodeCoverage.Core.Utilities;
4+
using Moq;
5+
using NUnit.Framework;
6+
using System.Threading;
7+
using System.Threading.Tasks;
8+
9+
namespace FineCodeCoverageTests
10+
{
11+
internal class FirstTimeToolWindowOpener_Tests
12+
{
13+
private AutoMoqer mocker;
14+
private FirstTimeToolWindowOpener firstTimeToolWindowOpener;
15+
16+
[SetUp]
17+
public void SetUp() {
18+
mocker = new AutoMoqer();
19+
firstTimeToolWindowOpener = mocker.Create<FirstTimeToolWindowOpener>();
20+
}
21+
22+
[TestCase(true,false,true)]
23+
[TestCase(true, true, false)]
24+
[TestCase(false, false, false)]
25+
[TestCase(false, true, false)]
26+
public async Task It_Should_Open_If_Have_Never_Shown_The_ToolWindow_And_InitializedFromTestContainerDiscoverer(
27+
bool initializedFromTestContainerDiscoverer,
28+
bool hasShownToolWindow,
29+
bool expectedShown
30+
)
31+
{
32+
mocker.GetMock<IInitializedFromTestContainerDiscoverer>().Setup(x => x.InitializedFromTestContainerDiscoverer).Returns(initializedFromTestContainerDiscoverer);
33+
mocker.GetMock<IShownToolWindowHistory>().Setup(x => x.HasShownToolWindow).Returns(hasShownToolWindow);
34+
35+
await firstTimeToolWindowOpener.OpenIfFirstTimeAsync(CancellationToken.None);
36+
37+
var expectedTimes = expectedShown ? Times.Once() : Times.Never();
38+
mocker.Verify<IToolWindowOpener>(toolWindowOpener => toolWindowOpener.OpenToolWindowAsync(), expectedTimes);
39+
40+
}
41+
}
42+
}

FineCodeCoverageTests/Initializer_Tests.cs

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
using System;
22
using System.Collections.Generic;
3-
using System.IO;
43
using System.Threading;
54
using System.Threading.Tasks;
65
using AutoMoq;
6+
using FineCodeCoverage.Core.Initialization;
77
using FineCodeCoverage.Engine;
88
using FineCodeCoverage.Engine.Model;
9-
using FineCodeCoverage.Impl;
109
using NUnit.Framework;
1110

1211
namespace Test
@@ -90,27 +89,18 @@ public async Task Should_Initialize_Dependencies_In_Order()
9089
{
9190
callOrder.Add(1);
9291
});
93-
mocker.GetMock<IFCCEngine>().Setup(engine => engine.Initialize(initializer, disposalToken)).Callback(() =>
92+
mocker.GetMock<IFCCEngine>().Setup(engine => engine.Initialize(disposalToken)).Callback(() =>
9493
{
9594
callOrder.Add(2);
9695
});
9796

98-
mocker.GetMock<IPackageInitializer>().Setup(p => p.InitializeAsync(disposalToken)).Callback(() =>
97+
mocker.GetMock<IFirstTimeToolWindowOpener>().Setup(firstTimeToolWindowOpener => firstTimeToolWindowOpener.OpenIfFirstTimeAsync(disposalToken)).Callback(() =>
9998
{
10099
callOrder.Add(3);
101100
});
102101

103102
await initializer.InitializeAsync(disposalToken);
104103
Assert.AreEqual(new List<int> { 1, 2, 3 }, callOrder);
105104
}
106-
107-
[Test]
108-
public async Task Should_Pass_Itself_To_FCCEngine_For_InitializeStatus()
109-
{
110-
var disposalToken = CancellationToken.None;
111-
await initializer.InitializeAsync(disposalToken);
112-
mocker.Verify<IFCCEngine>(engine => engine.Initialize(initializer, disposalToken));
113-
}
114-
115105
}
116106
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using AutoMoq;
2+
using FineCodeCoverage.Core.Initialization;
3+
using NUnit.Framework;
4+
using System.Threading;
5+
using System.Threading.Tasks;
6+
7+
namespace FineCodeCoverageTests
8+
{
9+
internal class PackageLoader_Tests
10+
{
11+
private AutoMoqer mocker;
12+
private PackageLoader packageLoader;
13+
14+
[SetUp]
15+
public void SetUp()
16+
{
17+
mocker = new AutoMoqer();
18+
packageLoader = mocker.Create<PackageLoader>();
19+
}
20+
21+
22+
23+
[Test]
24+
public void Should_Not_Be_InitializedFromTestContainerDiscoverer_If_LoadPackageAsync()
25+
{
26+
Assert.That(packageLoader.InitializedFromTestContainerDiscoverer, Is.False);
27+
}
28+
29+
[Test]
30+
public async Task Should_Be_InitializedFromTestContainerDiscoverer_If_LoadPackageAsync()
31+
{
32+
await packageLoader.LoadPackageAsync(CancellationToken.None);
33+
Assert.That(packageLoader.InitializedFromTestContainerDiscoverer, Is.True);
34+
}
35+
36+
[Test]
37+
public async Task It_Should_Load_The_Package_If_LoadPackageAsync()
38+
{
39+
await packageLoader.LoadPackageAsync(CancellationToken.None);
40+
41+
mocker.Verify<IShellPackageLoader>(x => x.LoadPackageAsync());
42+
}
43+
}
44+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
using AutoMoq;
2+
using FineCodeCoverage.Core.Utilities;
3+
using FineCodeCoverage.Engine;
4+
using Moq;
5+
using NUnit.Framework;
6+
using StructureMap.AutoMocking;
7+
using System;
8+
using System.Collections.Generic;
9+
using System.IO;
10+
using System.Linq;
11+
using System.Text;
12+
using System.Threading.Tasks;
13+
14+
namespace FineCodeCoverageTests
15+
{
16+
internal class ShownToolWindowHistory_Tests
17+
{
18+
private AutoMoqer mocker;
19+
private ShownToolWindowHistory shownToolWindowHistory;
20+
private string markerFilePath;
21+
22+
[SetUp]
23+
public void SetUp()
24+
{
25+
mocker = new AutoMoqer();
26+
shownToolWindowHistory = mocker.Create<ShownToolWindowHistory>();
27+
mocker.GetMock<IFCCEngine>().Setup(fccEngine => fccEngine.AppDataFolderPath).Returns("AppDataFolderPath");
28+
markerFilePath = Path.Combine("AppDataFolderPath", "outputWindowInitialized");
29+
}
30+
31+
[Test]
32+
public void It_Should_Write_Marker_File_When_ShowedToolWindow_First_Time()
33+
{
34+
shownToolWindowHistory.ShowedToolWindow();
35+
mocker.Verify<IFileUtil>(f => f.WriteAllText(markerFilePath, string.Empty));
36+
shownToolWindowHistory.ShowedToolWindow();
37+
mocker.Verify<IFileUtil>(f => f.WriteAllText(markerFilePath, string.Empty),Times.Once());
38+
}
39+
40+
[Test]
41+
public void It_Should_HasShownToolWindow_Without_Searching_For_Marker_File_When_ShowedToolWindow_Is_Invoked()
42+
{
43+
shownToolWindowHistory.ShowedToolWindow();
44+
mocker.Verify<IFileUtil>(f => f.Exists(It.IsAny<string>()), Times.Never());
45+
Assert.That(shownToolWindowHistory.HasShownToolWindow, Is.True);
46+
}
47+
48+
[TestCase(true)]
49+
[TestCase(false)]
50+
public void When_ShowedToolWindow_Has_Not_Been_Invoked_Should_Search_For_Marker_File_Once_When_HasShownToolWindow(bool fileExists)
51+
{
52+
mocker.GetMock<IFileUtil>().Setup(f => f.Exists(markerFilePath)).Returns(fileExists);
53+
54+
void HasShownToolWindow()
55+
{
56+
var hasShownToolWindow = shownToolWindowHistory.HasShownToolWindow;
57+
Assert.That(hasShownToolWindow, Is.EqualTo(fileExists));
58+
}
59+
HasShownToolWindow();
60+
HasShownToolWindow();
61+
62+
mocker.Verify<IFileUtil>(f => f.Exists(markerFilePath), Times.Once());
63+
}
64+
}
65+
}

0 commit comments

Comments
 (0)