public void GetTags_HasTagsAndFilterReturnsData_CreatesExpectedTagSpans() { var buffer = ValidBuffer; var snapshot = buffer.CurrentSnapshot; // Using the same span for the input and the aggregator tag spans to make sure they overlap var validSpan = new Span(0, snapshot.Length); var inputSpans = new NormalizedSnapshotSpanCollection(snapshot, validSpan); var tagSpan1 = CreateMappingTagSpan(snapshot, new TrackedTag(), validSpan); var tagSpan2 = CreateMappingTagSpan(snapshot, new TrackedTag(), validSpan); var tagSpan3 = CreateMappingTagSpan(snapshot, new TrackedTag(), validSpan); var aggregator = CreateAggregator(tagSpan1, tagSpan2, tagSpan3); var testSubject = new TestableFilteringTagger(aggregator, buffer); testSubject.SetFilterResult(tagSpan1, tagSpan3); // Act var actual = testSubject.GetTags(inputSpans).ToArray(); testSubject.FilterCallCount.Should().Be(1); testSubject.LastFilterInput.Should().BeEquivalentTo(tagSpan1, tagSpan2, tagSpan3); actual.Should().NotBeEmpty(); actual.Select(tagSpan => tagSpan.Tag.SuppliedTrackedTag).Should().BeEquivalentTo(tagSpan1.Tag, tagSpan3.Tag); }
public void GetSnapshot_CreatedWithTextView_ReturnsExpectedValue() { var textViewMock = new Mock <ITextView>(); textViewMock.Setup(x => x.TextSnapshot).Returns(Mock.Of <ITextSnapshot>()); var testSubject = new TestableFilteringTagger(Mock.Of <ITagAggregator <TrackedTag> >(), textViewMock.Object); testSubject.GetSnapshotTestAccessor().Should().Be(textViewMock.Object.TextSnapshot); }
public void Ctor_SubscribesToEvents() { var aggregatorMock = new Mock <ITagAggregator <TrackedTag> >(); aggregatorMock.SetupAdd(x => x.BatchedTagsChanged += (sender, args) => { }); var testSubject = new TestableFilteringTagger(aggregatorMock.Object, ValidBuffer); aggregatorMock.VerifyAdd(x => x.BatchedTagsChanged += It.IsAny <EventHandler <BatchedTagsChangedEventArgs> >(), Times.Once); }
public void GetTags_EmptyInputSpan_ReturnsEmpty() { var aggregatorMock = new Mock <ITagAggregator <TrackedTag> >(); var inputSpans = new NormalizedSnapshotSpanCollection(); var testSubject = new TestableFilteringTagger(aggregatorMock.Object, ValidBuffer); testSubject.GetTags(inputSpans) .Should().BeEmpty(); aggregatorMock.Verify(x => x.GetTags(inputSpans), Times.Never); }
public void Dispose_UnsubscribesFromEventsAndDisposesAggregrator() { var aggregatorMock = new Mock <ITagAggregator <TrackedTag> >(); aggregatorMock.SetupAdd(x => x.BatchedTagsChanged += (sender, args) => { }); var testSubject = new TestableFilteringTagger(aggregatorMock.Object, ValidBuffer); testSubject.Dispose(); aggregatorMock.VerifyRemove(x => x.BatchedTagsChanged -= It.IsAny <EventHandler <BatchedTagsChangedEventArgs> >(), Times.Once); aggregatorMock.Verify(x => x.Dispose(), Times.Once); }
public void GetTags_NoTags_ReturnsEmpty() { var validSpan = new Span(0, ValidBuffer.CurrentSnapshot.Length); var inputSpans = new NormalizedSnapshotSpanCollection(ValidBuffer.CurrentSnapshot, validSpan); var aggregatorMock = new Mock <ITagAggregator <TrackedTag> >(); aggregatorMock.Setup(x => x.GetTags(inputSpans)).Returns(Array.Empty <IMappingTagSpan <TrackedTag> >()); var testSubject = new TestableFilteringTagger(aggregatorMock.Object, ValidBuffer); testSubject.GetTags(inputSpans) .Should().BeEmpty(); aggregatorMock.Verify(x => x.GetTags(inputSpans), Times.Once); testSubject.FilterCallCount.Should().Be(0); // Performance: shouldn't call the filter if there are no tags }
public void OnAggregatorTagsChanged_NotifiesEditorOfChange() { var aggregatorMock = new Mock <ITagAggregator <TrackedTag> >(); var testSubject = new TestableFilteringTagger(aggregatorMock.Object, ValidBuffer); SnapshotSpanEventArgs suppliedArgs = null; int eventCount = 0; SnapshotSpan expectedSnapshotSpan = new SnapshotSpan(ValidBuffer.CurrentSnapshot, new Span(0, ValidBuffer.CurrentSnapshot.Length)); testSubject.TagsChanged += (sender, args) => { eventCount++; suppliedArgs = args; }; // Act aggregatorMock.Raise(x => x.BatchedTagsChanged += null, new BatchedTagsChangedEventArgs(Array.Empty <IMappingSpan>())); eventCount.Should().Be(1); suppliedArgs.Should().NotBeNull(); suppliedArgs.Span.Should().Be(expectedSnapshotSpan); }
public void GetTags_HasTagsButNoOverlappingSpans_ReturnsEmpty() { var snapshot = CreateSnapshot(length: 100); var inputSpan = new Span(20, 10); var inputSpans = new NormalizedSnapshotSpanCollection(snapshot, inputSpan); var tagSpan1 = CreateMappingTagSpan(snapshot, new TrackedTag(), new Span(0, 0)); var tagSpan2 = CreateMappingTagSpan(snapshot, new TrackedTag(), new Span(1, 5)); var tagSpan3 = CreateMappingTagSpan(snapshot, new TrackedTag(), new Span(31, 10)); var aggregator = CreateAggregator(tagSpan1, tagSpan2, tagSpan3); var testSubject = new TestableFilteringTagger(aggregator, snapshot.TextBuffer); // Act var actual = testSubject.GetTags(inputSpans).ToArray(); testSubject.FilterCallCount.Should().Be(1); testSubject.LastFilterInput.Should().BeEquivalentTo(tagSpan1, tagSpan2, tagSpan3); actual.Should().BeEmpty(); }
public void GetTags_HasTagsWithOverlappingSpans_CreatesExpectedTags() { var snapshot = CreateSnapshot(length: 100); var inputSpan = new Span(20, 10); var inputSpans = new NormalizedSnapshotSpanCollection(snapshot, inputSpan); var tagSpan1 = CreateMappingTagSpan(snapshot, new TrackedTag(), new Span(0, 0)); // no overlap var tagSpan2 = CreateMappingTagSpan(snapshot, new TrackedTag(), new Span(1, 20)); // overlaps [20, 30] var tagSpan3 = CreateMappingTagSpan(snapshot, new TrackedTag(), new Span(30, 10)); // overlaps [20, 30] var tagSpan4 = CreateMappingTagSpan(snapshot, new TrackedTag(), new Span(31, 1)); // no overlap var aggregator = CreateAggregator(tagSpan1, tagSpan2, tagSpan3, tagSpan4); var testSubject = new TestableFilteringTagger(aggregator, snapshot.TextBuffer); // Act var actual = testSubject.GetTags(inputSpans).ToArray(); testSubject.FilterCallCount.Should().Be(1); testSubject.LastFilterInput.Should().BeEquivalentTo(tagSpan1, tagSpan2, tagSpan3, tagSpan4); actual.Select(tagSpan => tagSpan.Tag.SuppliedTrackedTag).Should().BeEquivalentTo(tagSpan2.Tag, tagSpan3.Tag); }
public void GetTags_WhenDisposed_ReturnsEmpty() { // See issue #1693: Object disposed exception thrown by tagger // https://github.com/SonarSource/sonarlint-visualstudio/issues/1693 var aggregatorMock = new Mock <ITagAggregator <TrackedTag> >(); aggregatorMock.Setup(x => x.GetTags(It.IsAny <NormalizedSnapshotSpanCollection>())) .Throws(new ObjectDisposedException("this is a test")); var snapshot = CreateSnapshot(length: 100); var inputSpan = new Span(20, 10); var inputSpans = new NormalizedSnapshotSpanCollection(snapshot, inputSpan); var testSubject = new TestableFilteringTagger(aggregatorMock.Object, ValidBuffer); testSubject.Dispose(); using (new AssertIgnoreScope()) { var actual = testSubject.GetTags(inputSpans).ToArray(); actual.Should().BeEmpty(); } }
public void GetSnapshot_CreatedWithBuffer_ReturnsExpectedValue() { var testSubject = new TestableFilteringTagger(Mock.Of <ITagAggregator <TrackedTag> >(), ValidBuffer); testSubject.GetSnapshotTestAccessor().Should().Be(ValidBuffer.CurrentSnapshot); }