File: AdditionalFileProviderTests.cs
Web Access
Project: src\src\RoslynAnalyzers\Utilities.UnitTests\Analyzer.Utilities.UnitTests.csproj (Analyzer.Utilities.UnitTests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading;
using Analyzer.Utilities;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Text;
using Xunit;
 
namespace Analyzers.Utilities.UnitTests
{
#pragma warning disable CS0419 // Ambiguous reference in cref attribute
    /// <summary>
    /// Tests for <see cref="Analyzer.Utilities.AdditionalFileProvider"/>.
    /// </summary>
#pragma warning restore CS0419 // Ambiguous reference in cref attribute
    public sealed class AdditionalFileProviderTests
    {
        [Theory]
        [InlineData(new object[] { new string[] { } })]
        [InlineData(new object[] { new string[] { "b.txt" } })]
        [InlineData(new object[] { new string[] { "a.bat" } })]
        public void DesiredFileMissing_GetFile_ReturnsNull(string[] fileNames)
        {
            var fileProvider = new AdditionalFileProvider(CreateAdditionalFiles(fileNames));
 
            var file = fileProvider.GetFile("a.txt");
 
            Assert.Null(file);
        }
 
        [Theory]
        [InlineData("a.txt")]
        [InlineData("a.txt", "b.txt")]
        [InlineData("b.txt", "a.txt")]
        [InlineData("a.bat", "a.txt")]
        public void DesiredFilePresent_GetFile_ReturnsFile(params string[] fileNames)
        {
            var fileProvider = new AdditionalFileProvider(CreateAdditionalFiles(fileNames));
 
            var file = fileProvider.GetFile("a.txt");
 
            Assert.NotNull(file);
            Assert.Equal("a.txt", file.Path);
        }
 
        [Theory]
        [InlineData("a")]
        [InlineData("a.+")]
        [InlineData("a.tx")]
        public void DesiredFilePresent_GetFileWithoutExactName_ReturnsNull(string fileName)
        {
            var fileProvider = new AdditionalFileProvider(CreateAdditionalFiles("a.txt"));
 
            var file = fileProvider.GetFile(fileName);
 
            Assert.Null(file);
        }
 
        [Fact]
        public void DesiredFilePresentMoreThanOnce_GetFile_ReturnsFirstFile()
        {
            var fileProvider = new AdditionalFileProvider(CreateAdditionalFiles(("a.txt", "1"), ("b.txt", "2"), ("a.txt", "3")));
 
            var file = fileProvider.GetFile("a.txt");
            Assert.NotNull(file);
            Assert.Equal("a.txt", file.Path);
 
            var text = file.GetText();
            Assert.NotNull(text);
            Assert.Equal("1", text.ToString());
        }
 
        [Theory]
        [InlineData(new string[] { }, ".")]
        [InlineData(new[] { "a.txt" }, "c")]
        public void MatchingFilesMissing_GetMatchingFiles_ReturnsEmptyEnumerable(IEnumerable<string> fileNames, string pattern)
        {
            var fileProvider = new AdditionalFileProvider(CreateAdditionalFiles(fileNames.ToArray()));
 
            var files = fileProvider.GetMatchingFiles(pattern);
 
            Assert.Empty(files);
        }
 
        [Theory]
        [InlineData(new[] { "a.txt" }, "a", new[] { "a.txt" })]
        [InlineData(new[] { "a.txt", "b.txt" }, @"\w\.", new[] { "a.txt", "b.txt" })]
        [InlineData(new[] { "a.txt", "b.txt", "c.bat" }, @"\.txt", new[] { "a.txt", "b.txt" })]
        public void MatchingFilesPresent_GetMatchingFiles_ReturnsMatchingFiles(IEnumerable<string> fileNames, string pattern, IEnumerable<string> expectedFileNames)
        {
            var fileProvider = new AdditionalFileProvider(CreateAdditionalFiles(fileNames.ToArray()));
 
            var files = fileProvider.GetMatchingFiles(pattern);
 
            Assert.Equal(expectedFileNames, files.Select(x => x.Path));
        }
 
        private static ImmutableArray<AdditionalText> CreateAdditionalFiles(params (string FileName, string Content)[] fileNameAndContentGroups)
            => ImmutableArray.Create(fileNameAndContentGroups.Select(x => CreateAdditionalFile(x.FileName, x.Content)).ToArray());
 
        private static ImmutableArray<AdditionalText> CreateAdditionalFiles(params string[] fileNames)
            => ImmutableArray.Create(fileNames.Select(x => CreateAdditionalFile(x)).ToArray());
 
        private static AdditionalText CreateAdditionalFile(string fileName, string content = "")
            => new FakeAdditionalText(fileName, content);
 
        private sealed class FakeAdditionalText : AdditionalText
        {
            private readonly SourceText _text;
 
            public FakeAdditionalText(string path, string text = "")
            {
                Path = path;
                _text = SourceText.From(text);
            }
 
            public override string Path { get; }
 
            public override SourceText GetText(CancellationToken cancellationToken = default) => _text;
        }
    }
}