Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        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
        }
Exemplo n.º 7
0
        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);
        }
Exemplo n.º 8
0
        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();
        }
Exemplo n.º 9
0
        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);
        }
Exemplo n.º 10
0
        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();
            }
        }
Exemplo n.º 11
0
        public void GetSnapshot_CreatedWithBuffer_ReturnsExpectedValue()
        {
            var testSubject = new TestableFilteringTagger(Mock.Of <ITagAggregator <TrackedTag> >(), ValidBuffer);

            testSubject.GetSnapshotTestAccessor().Should().Be(ValidBuffer.CurrentSnapshot);
        }