예제 #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);
        }
예제 #2
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);
        }
예제 #3
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
        }
예제 #4
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();
        }
예제 #5
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);
        }
예제 #6
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();
            }
        }