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);
        }
Exemplo n.º 5
0
        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();
        }
Exemplo n.º 6
0
        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();
        }
Exemplo n.º 9
0
        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();
        }