File: SymbolFilterFactoryTests.cs
Web Access
Project: ..\..\..\test\Microsoft.DotNet.ApiSymbolExtensions.Tests\Microsoft.DotNet.ApiSymbolExtensions.Tests.csproj (Microsoft.DotNet.ApiSymbolExtensions.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
#nullable disable
 
using Xunit;
using Microsoft.DotNet.ApiSymbolExtensions.Filtering;
using Microsoft.CodeAnalysis;
 
namespace Microsoft.DotNet.ApiSymbolExtensions.Tests;
 
public class SymbolFilterFactoryTests
{
    [Theory]
    [InlineData(true)]
    [InlineData(false)]
    public void Test_FilterFromFiles(bool includeCustomType)
    {
        Test_FilterFromFiles_Internal(includeCustomType, accessibilitySymbolFilter: null);
    }
 
    [Theory]
    [InlineData(true)]
    [InlineData(false)]
    public void Test_FilterFromFiles_CustomAccessibilityFilter(bool includeCustomType)
    {
        Test_FilterFromFiles_Internal(includeCustomType, new AccessibilitySymbolFilter(includeInternalSymbols: true));
    }
 
    [Theory]
    [InlineData(true)]
    [InlineData(false)]
    public void Test_FilterFromList(bool includeCustomType)
    {
        Test_FilterFromList_Internal(includeCustomType, accessibilitySymbolFilter: null);
    }
 
    [Theory]
    [InlineData(true)]
    [InlineData(false)]
    public void Test_FilterFromList_WithCustomAccessibilityFilter(bool includeCustomType)
    {
        Test_FilterFromList_Internal(includeCustomType, new AccessibilitySymbolFilter(includeInternalSymbols: true));
    }
 
    private void Test_FilterFromFiles_Internal(bool includeCustomType, AccessibilitySymbolFilter accessibilitySymbolFilter)
    {
        using TempDirectory root = new();
        string filePath = Path.Combine(root.DirPath, "exclusions.txt");
        using (FileStream fileStream = File.Create(filePath))
        {
            using StreamWriter writer = new(fileStream);
            writer.WriteLine("T:System.Int32");
            writer.WriteLine("T:System.String");
            if (!includeCustomType)
            {
                writer.WriteLine("T:MyNamespace.MyClass");
            }
        }
 
        CompositeSymbolFilter filter = SymbolFilterFactory.GetFilterFromFiles(
            apiExclusionFilePaths: [filePath],
            accessibilitySymbolFilter: accessibilitySymbolFilter,
            respectInternals: true,
            includeEffectivelyPrivateSymbols: true,
            includeExplicitInterfaceImplementationSymbols: true) as CompositeSymbolFilter;
 
        Test_GetFilter_Internal(filter, includeCustomType);
    }
 
    private void Test_FilterFromList_Internal(bool includeCustomType, AccessibilitySymbolFilter accessibilitySymbolFilter)
    {
        List<string> exclusions = ["T:System.Int32", "T:System.String"];
        if (!includeCustomType)
        {
            exclusions.Add("T:MyNamespace.MyClass");
        }
 
        CompositeSymbolFilter filter = SymbolFilterFactory.GetFilterFromList(
            apiExclusionList: exclusions.ToArray(),
            accessibilitySymbolFilter: accessibilitySymbolFilter,
            respectInternals: true,
            includeEffectivelyPrivateSymbols: true,
            includeExplicitInterfaceImplementationSymbols: true) as CompositeSymbolFilter;
 
        Test_GetFilter_Internal(filter, includeCustomType);
    }
 
    private void Test_GetFilter_Internal(CompositeSymbolFilter compositeFilter, bool includeCustomType)
    {
        Assert.NotNull(compositeFilter);
 
        Assert.Equal(3, compositeFilter.Filters.Count);
 
        DocIdSymbolFilter docIdFilter = compositeFilter.Filters[0] as DocIdSymbolFilter;
        Assert.NotNull(docIdFilter);
 
        ImplicitSymbolFilter implicitFilter = compositeFilter.Filters[1] as ImplicitSymbolFilter;
        Assert.NotNull(implicitFilter);
 
        AccessibilitySymbolFilter accessibilityFilter = compositeFilter.Filters[2] as AccessibilitySymbolFilter;
        Assert.NotNull(accessibilityFilter);
 
        IAssemblySymbol assemblySymbol = SymbolFactory.GetAssemblyFromSyntax(@"
namespace MyNamespace
{
    public class MyClass { }
}");
        Assert.NotNull(assemblySymbol);
        INamedTypeSymbol myClass = assemblySymbol.GetTypeByMetadataName("MyNamespace.MyClass");
        Assert.NotNull(myClass);
        Assert.Equal(includeCustomType, docIdFilter.Include(myClass));
    }
}