public void OnIssuesChanged_BufferFileIsChanged_TagsChangedIsRaisedWithAffectedSpan() { var buffer = CreateBufferMock(filePath: ValidBufferDocName); var oldIssue1 = CreateLocViz(new SnapshotSpan(buffer.Object.CurrentSnapshot, 3, 1)); var oldIssue2 = CreateLocViz(new SnapshotSpan(buffer.Object.CurrentSnapshot, 20, 2)); var oldIssues = new[] { oldIssue1, oldIssue2 }; var storeMock = new Mock <IIssueLocationStore>(); storeMock.Setup(x => x.GetLocations(ValidBufferDocName)).Returns(oldIssues); var testSubject = new LocationTagger(buffer.Object, storeMock.Object, ValidSpanCalculator, ValidLogger); var newIssue1 = CreateLocViz(new SnapshotSpan(buffer.Object.CurrentSnapshot, 15, 10)); var newIssue2 = CreateLocViz(new SnapshotSpan(buffer.Object.CurrentSnapshot, 25, 5)); var newIssues = new[] { newIssue1, newIssue2 }; storeMock.Setup(x => x.GetLocations(ValidBufferDocName)).Returns(newIssues); SnapshotSpanEventArgs actualTagsChangedArgs = null; testSubject.TagsChanged += (senders, args) => actualTagsChangedArgs = args; RaiseIssuesChangedEvent(storeMock, ValidBufferDocName); actualTagsChangedArgs.Should().NotBeNull(); actualTagsChangedArgs.Span.Start.Position.Should().Be(3); // oldIssue1.Start actualTagsChangedArgs.Span.End.Position.Should().Be(30); // newIssue2.Start + newIssue2.Length }
public void Ctor_InitialisesTags() { var bufferMock = CreateBufferMock(filePath: ValidBufferDocName); var existingSpan = new SnapshotSpan(bufferMock.Object.CurrentSnapshot, new Span(1, 10)); var locVizWithSpan = CreateLocViz(existingSpan); var locVizWithoutSpan = CreateLocViz(null); var locVizWithEmptySpan = CreateLocViz(new SnapshotSpan?()); var storeMock = new Mock <IIssueLocationStore>(); storeMock.Setup(x => x.GetLocations(ValidBufferDocName)).Returns(new[] { locVizWithSpan, locVizWithoutSpan, locVizWithEmptySpan }); var newSpan1 = new SnapshotSpan(bufferMock.Object.CurrentSnapshot, new Span(1, 10)); var newSpan2 = new SnapshotSpan(bufferMock.Object.CurrentSnapshot, new Span(5, 3)); var calculatorMock = new Mock <IIssueSpanCalculator>(); calculatorMock.Setup(x => x.CalculateSpan(locVizWithoutSpan.Location, It.IsAny <ITextSnapshot>())).Returns(newSpan1); calculatorMock.Setup(x => x.CalculateSpan(locVizWithEmptySpan.Location, It.IsAny <ITextSnapshot>())).Returns(newSpan2); var testSubject = new LocationTagger(bufferMock.Object, storeMock.Object, calculatorMock.Object, ValidLogger); testSubject.TagSpans.Should().NotBeNull(); testSubject.TagSpans.Count.Should().Be(3); testSubject.TagSpans[0].Tag.Location.Should().BeSameAs(locVizWithSpan); testSubject.TagSpans[1].Tag.Location.Should().BeSameAs(locVizWithoutSpan); testSubject.TagSpans[2].Tag.Location.Should().BeSameAs(locVizWithEmptySpan); // Locations without spans should have one calculated for them testSubject.TagSpans[0].Tag.Location.Span.Value.Should().Be(existingSpan); testSubject.TagSpans[1].Tag.Location.Span.Value.Should().Be(newSpan1); testSubject.TagSpans[2].Tag.Location.Span.Value.Should().Be(newSpan2); }
public void GetTags_DifferentSnapshots_SnapshotsAreTranslated() { const int length = 100; var buffer = CreateBufferMock(length, ValidBufferDocName).Object; var versionMock2 = CreateTextVersion(buffer, 2); var versionMock1 = CreateTextVersion(buffer, 1, nextVersion: versionMock2); var snapshotMock1 = CreateSnapshot(buffer, length, versionMock1); var snapshotMock2 = CreateSnapshot(buffer, length, versionMock2); var locSpan1 = new Span(1, 10); var locSpan2 = new Span(11, 5); var storeMock = CreateStoreWithLocationsWithSpans(snapshotMock1, out _, locSpan1, locSpan2); var inputSpans = new NormalizedSnapshotSpanCollection(snapshotMock2, new Span(18, 22)); var testSubject = new LocationTagger(buffer, storeMock, ValidSpanCalculator, ValidLogger); // Sanity checks testSubject.TagSpans.Count().Should().Be(2); testSubject.TagSpans[0].Span.Snapshot.Should().Be(snapshotMock1); testSubject.TagSpans[1].Span.Snapshot.Should().Be(snapshotMock1); testSubject.TagSpans[0].Tag.Location.Span.Value.Snapshot.Should().Be(snapshotMock1); testSubject.TagSpans[1].Tag.Location.Span.Value.Snapshot.Should().Be(snapshotMock1); testSubject.GetTags(inputSpans).ToArray(); // GetTags is lazy so we need to reify the result to force evaluation testSubject.TagSpans.Count().Should().Be(2); testSubject.TagSpans[0].Span.Snapshot.Should().Be(snapshotMock2); testSubject.TagSpans[1].Span.Snapshot.Should().Be(snapshotMock2); testSubject.TagSpans[0].Tag.Location.Span.Value.Snapshot.Should().Be(snapshotMock2); testSubject.TagSpans[1].Tag.Location.Span.Value.Snapshot.Should().Be(snapshotMock2); }
public void Ctor_LocationsHaveSpansThatBelongToAnotherBuffer_SpansRecalculated() { var oldBufferMock = CreateBufferMock(filePath: ValidBufferDocName); var oldBufferSpan = new SnapshotSpan(oldBufferMock.Object.CurrentSnapshot, new Span(1, 10)); var location = CreateLocViz(oldBufferSpan); var storeMock = new Mock <IIssueLocationStore>(); storeMock.Setup(x => x.GetLocations(ValidBufferDocName)).Returns(new[] { location }); var newBufferMock = CreateBufferMock(filePath: ValidBufferDocName); var newSpan = new SnapshotSpan(newBufferMock.Object.CurrentSnapshot, new Span(1, 10)); var calculatorMock = new Mock <IIssueSpanCalculator>(); calculatorMock.Setup(x => x.CalculateSpan(location.Location, newBufferMock.Object.CurrentSnapshot)).Returns(newSpan); var testSubject = new LocationTagger(newBufferMock.Object, storeMock.Object, calculatorMock.Object, ValidLogger); testSubject.TagSpans.Should().NotBeNull(); testSubject.TagSpans.Count.Should().Be(1); testSubject.TagSpans[0].Span.Should().Be(newSpan); testSubject.TagSpans[0].Tag.Location.Should().BeSameAs(location); testSubject.TagSpans[0].Tag.Location.Span.Should().Be(newSpan); }
public void Ctor_LocationsHaveNoSpans_TagsNotCreated() { var bufferMock = CreateBufferMock(filePath: ValidBufferDocName); var existingSpan = new SnapshotSpan(bufferMock.Object.CurrentSnapshot, new Span(1, 10)); var locVizWithSpan = CreateLocViz(existingSpan); var locVizWithoutSpan = CreateLocViz(null); var storeMock = new Mock <IIssueLocationStore>(); storeMock.Setup(x => x.GetLocations(ValidBufferDocName)).Returns(new[] { locVizWithSpan, locVizWithoutSpan }); var calculatorMock = new Mock <IIssueSpanCalculator>(); calculatorMock.Setup(x => x.CalculateSpan(locVizWithoutSpan.Location, It.IsAny <ITextSnapshot>())).Returns(new SnapshotSpan()); var testSubject = new LocationTagger(bufferMock.Object, storeMock.Object, calculatorMock.Object, ValidLogger); testSubject.TagSpans.Should().NotBeNull(); testSubject.TagSpans.Count.Should().Be(1); testSubject.TagSpans[0].Tag.Location.Should().BeSameAs(locVizWithSpan); testSubject.TagSpans[0].Tag.Location.Span.Value.Should().Be(existingSpan); locVizWithoutSpan.Span.Should().NotBeNull(); locVizWithoutSpan.Span.Value.IsEmpty.Should().BeTrue(); }
public void GetTags_EmptyInputSpan_ReturnsEmpty() { var testSubject = new LocationTagger(ValidBuffer, ValidStore, ValidSpanCalculator, ValidLogger); var inputSpans = new NormalizedSnapshotSpanCollection(); testSubject.GetTags(inputSpans) .Should().BeEmpty(); }
public void GetTags_NoTags_ReturnsEmpty() { var testSubject = new LocationTagger(ValidBuffer, ValidStore, ValidSpanCalculator, ValidLogger); var validSpan = new Span(0, ValidBuffer.CurrentSnapshot.Length); var inputSpans = new NormalizedSnapshotSpanCollection(ValidBuffer.CurrentSnapshot, validSpan); testSubject.GetTags(inputSpans) .Should().BeEmpty(); }
public void Ctor_GetCurrentFilePath_ReturnsExpectedValue() { var bufferMock = CreateBufferMock(filePath: "original"); var testSubject = new LocationTagger(bufferMock.Object, ValidStore, ValidSpanCalculator, ValidLogger); testSubject.GetCurrentFilePath().Should().Be("original"); // Check the name change is picked up RenameBufferFile(bufferMock, "new"); testSubject.GetCurrentFilePath().Should().Be("new"); }
public void Dispose_UnsubscribesFromEvents() { var storeMock = new Mock <IIssueLocationStore>(); storeMock.SetupAdd(x => x.IssuesChanged += (sender, args) => { }); var bufferMock = CreateBufferMock(filePath: ValidBufferDocName); bufferMock.SetupAdd(x => x.ChangedLowPriority += (sender, args) => { }); var testSubject = new LocationTagger(bufferMock.Object, storeMock.Object, ValidSpanCalculator, ValidLogger); testSubject.Dispose(); storeMock.VerifyRemove(x => x.IssuesChanged -= It.IsAny <EventHandler <IssuesChangedEventArgs> >(), Times.Once); bufferMock.VerifyRemove(x => x.ChangedLowPriority -= It.IsAny <EventHandler <TextContentChangedEventArgs> >(), Times.Once); }
public void OnIssuesChanged_BufferFileNotChanged_TagsChangedNotRaised() { var storeMock = new Mock <IIssueLocationStore>(); var testSubject = new LocationTagger(ValidBuffer, storeMock.Object, ValidSpanCalculator, ValidLogger); var initialTags = testSubject.TagSpans; initialTags.Should().NotBeNull(); // sanity check var eventCount = 0; testSubject.TagsChanged += (senders, args) => eventCount++; RaiseIssuesChangedEvent(storeMock, "not the file being tracked.txt"); eventCount.Should().Be(0); testSubject.TagSpans.Should().BeSameAs(initialTags); }
public void GetTags_NoIntersectingSpans_ReturnsEmpty() { // Make sure the tagger and NormalizedSpanCollection use the same snapshot // so we don't attempt to translate the spans var buffer = CreateBufferMock(); var locSpan1 = new Span(1, 10); var locSpan2 = new Span(11, 10); var storeMock = CreateStoreWithLocationsWithSpans(buffer.Object.CurrentSnapshot, out _, locSpan1, locSpan2); var inputSpans = new NormalizedSnapshotSpanCollection(buffer.Object.CurrentSnapshot, new Span(32, 5)); var testSubject = new LocationTagger(buffer.Object, storeMock, ValidSpanCalculator, ValidLogger); testSubject.TagSpans.Count.Should().Be(2); // sanity check var matchingTags = testSubject.GetTags(inputSpans); matchingTags.Should().BeEmpty(); }
public void GetTags_ExceptionInTranslatingSpan_ExceptionSuppressedAndLogged() { const int length = 100; var buffer = CreateBufferMock(length, ValidBufferDocName).Object; var snapshot = CreateSnapshot(buffer, length); var storeMock = CreateStoreWithLocationsWithSpans(snapshot, out _, new Span(1, 10)); var logger = new TestLogger(); var testSubject = new LocationTagger(buffer, storeMock, ValidSpanCalculator, logger); testSubject.TagSpans.Count.Should().Be(1); var snapshotForAnotherBuffer = CreateSnapshot(CreateBuffer(), length); var inputSpans = new NormalizedSnapshotSpanCollection(snapshotForAnotherBuffer, new Span(18, 22)); Action act = () => testSubject.GetTags(inputSpans).ToArray(); act.Should().NotThrow(); testSubject.TagSpans.Count.Should().Be(0); logger.AssertPartialOutputStringExists(ValidBufferDocName, "The specified ITextSnapshot doesn't belong to the correct TextBuffer."); }
[DataRow(11, false)] // after -> no match public void GetTags_RequestedSpansAreZeroLength_ReturnsExpectedTags(int inputSpanStart, bool shouldMatch) { // Regression test for #1720: Tooltips do not appear for primary locations // https://github.com/SonarSource/sonarlint-visualstudio/issues/1720 var tagSpan = Span.FromBounds(5, 10); var inputSpan = Span.FromBounds(inputSpanStart, inputSpanStart); // Make sure the tagger and NormalizedSpanCollection use the same snapshot // so we don't attempt to translate the spans var buffer = CreateBufferMock(); var storeMock = CreateStoreWithLocationsWithSpans(buffer.Object.CurrentSnapshot, out _, tagSpan); var inputSpans = new NormalizedSnapshotSpanCollection(buffer.Object.CurrentSnapshot, inputSpan); var testSubject = new LocationTagger(buffer.Object, storeMock, ValidSpanCalculator, ValidLogger); var matchingTags = testSubject.GetTags(inputSpans); var expectedCount = shouldMatch ? 1 : 0; matchingTags.Count().Should().Be(expectedCount); }