public void WhenFileIsSaved_AnalysisIsRequested_ButOnlyIfATaggerIsRegistered() { // Arrange var testSubject = new TextBufferIssueTracker(taggerProvider.dte, taggerProvider, mockedJavascriptDocumentFooJs.Object, javascriptLanguage, new TestLogger()); // 1. No tagger -> analysis not requested RaiseFileSavedEvent(mockedJavascriptDocumentFooJs); CheckAnalysisWasNotRequested(); // 2. Add a tagger and raise -> analysis requested var tagger = new IssueTagger(testSubject); mockAnalyzerController.Invocations.Clear(); RaiseFileSavedEvent(mockedJavascriptDocumentFooJs); mockAnalyzerController.Verify(x => x.ExecuteAnalysis("foo.js", "utf-8", new AnalysisLanguage[] { AnalysisLanguage.Javascript }, testSubject, It.IsAny <ProjectItem>()), Times.Once); // 3. Unregister tagger and raise -> analysis not requested tagger.Dispose(); mockAnalyzerController.Invocations.Clear(); RaiseFileSavedEvent(mockedJavascriptDocumentFooJs); CheckAnalysisWasNotRequested(); }
public void WhenNewIssuesAreFound_ButForIncorrectFile_ListenersAreNotUpdated() { // Arrange var issues = new[] { new Sonarlint.Issue { RuleKey = "S123", StartLine = 1, EndLine = 1 } }; // Add a couple of error list listeners var errorListSinkMock1 = RegisterNewErrorListSink(); var errorListSinkMock2 = RegisterNewErrorListSink(); var testSubject = new TextBufferIssueTracker(taggerProvider.dte, taggerProvider, mockedJavascriptDocumentFooJs.Object, javascriptLanguage, new TestLogger()); var tagger = new IssueTagger(testSubject); // Act using (new AssertIgnoreScope()) { ((IIssueConsumer)testSubject).Accept("aRandomFile.xxx", issues); } // Assert CheckSinkNotNotified(errorListSinkMock1); CheckSinkNotNotified(errorListSinkMock2); }
public void WhenFileIsSaved_AnalysisIsRequested_ButOnlyIfATaggerIsRegistered() { // Arrange var testSubject = new TextBufferIssueTracker(taggerProvider.dte, taggerProvider, mockedJavascriptDocumentFooJs.Object, javascriptLanguage, new TestLogger()); // 1. No tagger -> analysis not requested RaiseFileSavedEvent(mockedJavascriptDocumentFooJs); CheckAnalysisWasNotRequested(); // 2. Add a tagger and raise -> analysis requested var tagger = new IssueTagger(testSubject); daemonMock.ResetCalls(); RaiseFileSavedEvent(mockedJavascriptDocumentFooJs); daemonMock.Verify(x => x.RequestAnalysis("foo.js", "utf-8", "js", null, testSubject), Times.Once); // 3. Unregister tagger and raise -> analysis not requested tagger.Dispose(); daemonMock.ResetCalls(); RaiseFileSavedEvent(mockedJavascriptDocumentFooJs); CheckAnalysisWasNotRequested(); }
public void SetUp() { mockAnalyzerController = new Mock <IAnalyzerController>(); issuesFilter = new Mock <IIssuesFilter>(); taggerProvider = CreateTaggerProvider(); mockedJavascriptDocumentFooJs = CreateDocumentMock("foo.js"); javascriptLanguage = new[] { AnalysisLanguage.Javascript }; testSubject = new TextBufferIssueTracker(taggerProvider.dte, taggerProvider, mockedJavascriptDocumentFooJs.Object, javascriptLanguage, new TestLogger(), issuesFilter.Object); }
public void SetUp() { mockSonarErrorDataSource = new Mock <ISonarErrorListDataSource>(); mockAnalyzerController = new Mock <IAnalyzerController>(); issuesFilter = new Mock <IIssuesFilter>(); taggerProvider = CreateTaggerProvider(); mockDocumentTextBuffer = CreateTextBufferMock(); mockedJavascriptDocumentFooJs = CreateDocumentMock("foo.js", mockDocumentTextBuffer.Object); javascriptLanguage = new[] { AnalysisLanguage.Javascript }; projectGuid = Guid.NewGuid(); testSubject = CreateTextBufferIssueTracker(); }
public void WhenNewIssuesAreFound_FileHasNoAssociatedProject_NoExceptionIsThrown() { mockSolution.Reset(); mockSolution .Setup(x => x.FindProjectItem(mockedJavascriptDocumentFooJs.Name)) .Returns((ProjectItem)null); testSubject = CreateTextBufferIssueTracker(); Action act = () => testSubject.HandleNewIssues(new List <IAnalysisIssueVisualization>()); act.Should().NotThrow(); }
public void WhenTaggerIsRegistered_AnalysisIsRequested() { // Arrange var testSubject = new TextBufferIssueTracker(taggerProvider.dte, taggerProvider, mockedJavascriptDocumentFooJs.Object, javascriptLanguage, new TestLogger()); // 1. No tagger -> analysis not requested CheckAnalysisWasNotRequested(); // 2. Add a tagger -> analysis requested var tagger = new IssueTagger(testSubject); daemonMock.Verify(x => x.RequestAnalysis("foo.js", "utf-8", "js", null, testSubject), Times.Once); }
public void WhenFileIsSaved_ButNoTaggers_AnalysisIsNotRequested() { // Arrange var testSubject = new TextBufferIssueTracker(taggerProvider.dte, taggerProvider, mockedJavascriptDocumentFooJs.Object, javascriptLanguage, new TestLogger()); CheckAnalysisWasNotRequested(); // Act RaiseFileLoadedEvent(mockedJavascriptDocumentFooJs); // Assert CheckAnalysisWasNotRequested(); }
public void WhenNewIssuesAreFound_FilterIsApplied_ListenersAreUpdated() { // Arrange // Use the test version of the text buffer to bypass the span translation code testSubject = new TestableTextBufferIssueTracker(taggerProvider.dte, taggerProvider, mockedJavascriptDocumentFooJs.Object, javascriptLanguage, issuesFilter.Object, mockSonarErrorDataSource.Object, Mock.Of <IAnalysisIssueVisualizationConverter>(), Mock.Of <IVsSolution5>(), logger); mockSonarErrorDataSource.Invocations.Clear(); var originalId = testSubject.Factory.CurrentSnapshot.AnalysisRunId; var inputIssues = new[] { CreateIssue("S111", startLine: 1, endLine: 1), CreateIssue("S222", startLine: 2, endLine: 2) }; var issuesToReturnFromFilter = new[] { CreateIssue("xxx", startLine: 3, endLine: 3) }; SetupIssuesFilter(out var issuesPassedToFilter, issuesToReturnFromFilter); // Act testSubject.HandleNewIssues(inputIssues); // Assert // Check the snapshot has changed testSubject.Factory.CurrentSnapshot.AnalysisRunId.Should().NotBe(originalId); // Check the expected issues were passed to the filter issuesPassedToFilter.Count.Should().Be(2); issuesPassedToFilter.Should().BeEquivalentTo(inputIssues, c => c.WithStrictOrdering()); CheckErrorListRefreshWasRequestedOnce(testSubject.Factory); // Check the post-filter issues testSubject.Factory.CurrentSnapshot.Issues.Count().Should().Be(1); testSubject.Factory.CurrentSnapshot.Issues.First().Issue.RuleKey.Should().Be("xxx"); testSubject.Factory.CurrentSnapshot.TryGetValue(0, StandardTableKeyNames.ProjectName, out var projectName).Should().BeTrue(); projectName.Should().Be("MyProject"); testSubject.Factory.CurrentSnapshot.TryGetValue(0, StandardTableKeyNames.ProjectGuid, out var projectGuid).Should().BeTrue(); projectGuid.Should().Be(projectGuid); }
public void WhenTaggerIsRegistered_AnalysisIsRequested() { // Arrange var testSubject = new TextBufferIssueTracker(taggerProvider.dte, taggerProvider, mockedJavascriptDocumentFooJs.Object, javascriptLanguage, new TestLogger()); // 1. No tagger -> analysis not requested CheckAnalysisWasNotRequested(); // 2. Add a tagger -> analysis requested using (var tagger = new IssueTagger(testSubject)) { mockAnalyzerController.Verify(x => x.ExecuteAnalysis("foo.js", "utf-8", new AnalysisLanguage[] { AnalysisLanguage.Javascript }, testSubject, It.IsAny <ProjectItem>()), Times.Once); } }
public void WhenNewIssuesAreFound_ListenersAreUpdated() { // Arrange var issues = new[] { new Sonarlint.Issue { RuleKey = "S111", StartLine = 1, EndLine = 1 }, // The next issue is outside the range of the new snapshot and should be ignored new Sonarlint.Issue { RuleKey = "S222", StartLine = 99999998, EndLine = 99999999 }, new Sonarlint.Issue { RuleKey = "S333", StartLine = 100, EndLine = 101 } }; // Add a couple of error list listeners var errorListSinkMock1 = RegisterNewErrorListSink(); var errorListSinkMock2 = RegisterNewErrorListSink(); var testSubject = new TextBufferIssueTracker(taggerProvider.dte, taggerProvider, mockedJavascriptDocumentFooJs.Object, javascriptLanguage, new TestLogger()); var tagger = new IssueTagger(testSubject); // Sanity check testSubject.LastIssues.Should().BeNull(); testSubject.Factory.CurrentSnapshot.VersionNumber.Should().Be(0); testSubject.Factory.CurrentSnapshot.IssueMarkers.Count().Should().Be(0); // Act ((IIssueConsumer)testSubject).Accept(mockedJavascriptDocumentFooJs.Object.FilePath, issues); // Assert // We can't check that the editors listeners are notified: we can't mock // SnapshotSpan well enough for the product code to work -> affected span // is always null so the taggers don't notify their listeners. CheckSinkNotified(errorListSinkMock1, 1); CheckSinkNotified(errorListSinkMock2, 1); testSubject.LastIssues.Should().NotBeNull(); testSubject.Factory.CurrentSnapshot.VersionNumber.Should().Be(1); testSubject.Factory.CurrentSnapshot.IssueMarkers.Count().Should().Be(2); var actualMarkers = testSubject.Factory.CurrentSnapshot.IssueMarkers.ToArray(); actualMarkers[0].Issue.RuleKey.Should().Be("S111"); actualMarkers[1].Issue.RuleKey.Should().Be("S333"); }
public void WhenFileIsLoaded_AnalysisIsNotRequested() { // Arrange var testSubject = new TextBufferIssueTracker(taggerProvider.dte, taggerProvider, mockedJavascriptDocumentFooJs.Object, javascriptLanguage, new TestLogger()); var tagger = new IssueTagger(testSubject); daemonMock.ResetCalls(); // Act RaiseFileLoadedEvent(mockedJavascriptDocumentFooJs); CheckAnalysisWasNotRequested(); // Sanity check (that the test setup is correct and that events are actually being handled) RaiseFileSavedEvent(mockedJavascriptDocumentFooJs); daemonMock.Verify(x => x.RequestAnalysis("foo.js", "utf-8", "js", null, testSubject), Times.Once); }
public void WhenFileIsLoaded_AnalysisIsNotRequested() { // Arrange var testSubject = new TextBufferIssueTracker(taggerProvider.dte, taggerProvider, mockedJavascriptDocumentFooJs.Object, javascriptLanguage, new TestLogger()); using (var tagger = new IssueTagger(testSubject)) { mockAnalyzerController.Invocations.Clear(); // Act RaiseFileLoadedEvent(mockedJavascriptDocumentFooJs); CheckAnalysisWasNotRequested(); // Sanity check (that the test setup is correct and that events are actually being handled) RaiseFileSavedEvent(mockedJavascriptDocumentFooJs); mockAnalyzerController.Verify(x => x.ExecuteAnalysis("foo.js", "utf-8", new AnalysisLanguage[] { AnalysisLanguage.Javascript }, testSubject, It.IsAny <ProjectItem>()), Times.Once); } }
public void WhenFileRenamed_FileNameIsUpdated_AndAnalysisIsNotRequested() { // Arrange var testSubject = new TextBufferIssueTracker(taggerProvider.dte, taggerProvider, mockedJavascriptDocumentFooJs.Object, javascriptLanguage, new TestLogger()); var errorListSink = RegisterNewErrorListSink(); testSubject.Factory.CurrentSnapshot.VersionNumber.Should().Be(0); // sanity check // Act RaiseRenameEvent(mockedJavascriptDocumentFooJs, "newPath.js"); // Assert testSubject.FilePath.Should().Be("newPath.js"); // Check the snapshot was updated and the error list notified testSubject.Factory.CurrentSnapshot.VersionNumber.Should().Be(1); CheckSinkNotified(errorListSink, 1); CheckAnalysisWasNotRequested(); }