File: AnalyzerSupport\AnalyzerDependencyCheckerTests.vb
Web Access
Project: ..\..\..\src\VisualStudio\Core\Test\Microsoft.VisualStudio.LanguageServices.UnitTests.vbproj (Microsoft.VisualStudio.LanguageServices.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.
 
Imports System.Collections.Immutable
Imports System.FormattableString
Imports System.IO
Imports System.Text
Imports Microsoft.CodeAnalysis
Imports Microsoft.CodeAnalysis.CSharp
Imports Microsoft.CodeAnalysis.Test.Utilities
Imports Microsoft.VisualStudio.LanguageServices.Implementation
Imports Microsoft.Win32
Imports Roslyn.Test.Utilities
Imports Roslyn.Utilities
 
Namespace Microsoft.VisualStudio.LanguageServices.UnitTests
    <[UseExportProvider]>
    Public Class AnalyzerDependencyCheckerTests
        Inherits TestBase
 
        Private Shared ReadOnly s_mscorlibDisplayName As String = "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
 
        Private Shared Function GetIgnorableAssemblyLists() As IEnumerable(Of IIgnorableAssemblyList)
            Dim mscorlib As AssemblyIdentity = Nothing
            AssemblyIdentity.TryParseDisplayName(s_mscorlibDisplayName, mscorlib)
 
            Return SpecializedCollections.SingletonEnumerable(
                New IgnorableAssemblyIdentityList(SpecializedCollections.SingletonEnumerable(mscorlib)))
        End Function
 
        <Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1064914")>
        Public Sub ConflictsTest1()
            ' Dependency Graph:
            '   A
 
            Using directory = New DisposableDirectory(Temp)
                Dim library = BuildLibrary(directory, "public class A { }", "A")
 
                Dim results = AnalyzerDependencyChecker.ComputeDependencyConflicts({library}, GetIgnorableAssemblyLists())
 
                Assert.Empty(results.Conflicts)
            End Using
 
        End Sub
 
        <Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1064914")>
        Public Sub ConflictsTest2()
            ' Dependency graph:
            '   A --> B
 
            Dim sourceA = "
public class A
{
    void M()
    {
        B b = new B();
    }
}"
 
            Dim sourceB = "public class B { }"
 
            Using directory = New DisposableDirectory(Temp)
                Dim libraryB = BuildLibrary(directory, sourceB, "B")
                Dim libraryA = BuildLibrary(directory, sourceA, "A", "B")
 
                Dim results = AnalyzerDependencyChecker.ComputeDependencyConflicts({libraryA, libraryB}, GetIgnorableAssemblyLists())
 
                Assert.Empty(results.Conflicts)
            End Using
        End Sub
 
        <Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1064914")>
        Public Sub ConflictsTest3()
            ' Dependency graph:
            '   A --> B
            '     \
            '      -> C
 
            Dim sourceA = "
public class A
{
    void M()
    {
        B b = new B();
        C c = new C();
    }
}"
 
            Dim sourceB = "public class B { }"
            Dim sourceC = "public class C { }"
 
            Using directory = New DisposableDirectory(Temp)
                Dim libraryC = BuildLibrary(directory, sourceC, "C")
                Dim libraryB = BuildLibrary(directory, sourceB, "B")
                Dim libraryA = BuildLibrary(directory, sourceA, "A", "B", "C")
 
                Dim results = AnalyzerDependencyChecker.ComputeDependencyConflicts({libraryA, libraryB, libraryC}, GetIgnorableAssemblyLists())
 
                Assert.Empty(results.Conflicts)
                Assert.Empty(results.MissingDependencies)
            End Using
 
        End Sub
 
        <Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1064914")>
        Public Sub ConflictsTest4()
            ' Dependency graph:
            '   A --> B
            '   C --> D
 
            Dim sourceA = "
public class A
{
    void M()
    {
        B b = new B();
    }
}"
            Dim sourceB = "public class B { }"
 
            Dim sourceC = "
public class C
{
    void M()
    {
        C c = new C();
    }
}"
            Dim sourceD = "public class D { }"
 
            Using directory = New DisposableDirectory(Temp)
                Dim libraryB = BuildLibrary(directory, sourceB, "B")
                Dim libraryA = BuildLibrary(directory, sourceA, "A", "B")
                Dim libraryD = BuildLibrary(directory, sourceD, "D")
                Dim libraryC = BuildLibrary(directory, sourceC, "C", "D")
 
                Dim results = AnalyzerDependencyChecker.ComputeDependencyConflicts({libraryA, libraryB, libraryC, libraryD}, GetIgnorableAssemblyLists())
 
                Assert.Empty(results.Conflicts)
                Assert.Empty(results.MissingDependencies)
            End Using
        End Sub
 
        <Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1064914")>
        Public Sub ConflictsTest5()
            ' Dependency graph:
            '   Directory 1:
            '     A --> B
            '   Directory 2:
            '     C --> D
 
            Dim sourceA = "
public class A
{
    void M()
    {
        B b = new B();
    }
}"
            Dim sourceB = "public class B { }"
 
            Dim sourceC = "
public class C
{
    void M()
    {
        C c = new C();
    }
}"
            Dim sourceD = "public class D { }"
 
            Using directory1 = New DisposableDirectory(Temp), directory2 = New DisposableDirectory(Temp)
                Dim libraryB = BuildLibrary(directory1, sourceB, "B")
                Dim libraryA = BuildLibrary(directory1, sourceA, "A", "B")
                Dim libraryD = BuildLibrary(directory2, sourceD, "D")
                Dim libraryC = BuildLibrary(directory2, sourceC, "C", "D")
 
                Dim results = AnalyzerDependencyChecker.ComputeDependencyConflicts({libraryA, libraryB, libraryC, libraryD}, GetIgnorableAssemblyLists())
 
                Assert.Empty(results.Conflicts)
                Assert.Empty(results.MissingDependencies)
            End Using
        End Sub
 
        <Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1064914")>
        Public Sub ConflictsTest6()
            ' Dependency graph:
            ' A -
            '    \
            '     -> C
            '    /
            ' B -
 
            Dim sourceA = "
public class A
{
    void M()
    {
        C c = new C();
    }
}"
 
            Dim sourceB = "
public class B
{
    void M()
    {
        C c = new C();
    }
}"
            Dim sourceC = "public class C { }"
 
            Using directory = New DisposableDirectory(Temp)
                Dim libraryC = BuildLibrary(directory, sourceC, "C")
                Dim libraryA = BuildLibrary(directory, sourceA, "A", "C")
                Dim libraryB = BuildLibrary(directory, sourceB, "B", "C")
 
                Dim results = AnalyzerDependencyChecker.ComputeDependencyConflicts({libraryA, libraryB, libraryC}, GetIgnorableAssemblyLists())
 
                Assert.Empty(results.Conflicts)
                Assert.Empty(results.MissingDependencies)
            End Using
        End Sub
 
        <Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1064914")>
        Public Sub ConflictsTest7()
            ' Dependency graph:
            '   Directory 1:
            '     A --> C
            '   Directory 2:
            '     B --> C
 
            Dim sourceA = "
public class A
{
    void M()
    {
        C c = new C();
    }
}"
 
            Dim sourceB = "
public class B
{
    void M()
    {
        C c = new C();
    }
}"
            Dim sourceC = "public class C { }"
 
            Using directory1 = New DisposableDirectory(Temp), directory2 = New DisposableDirectory(Temp)
                Dim libraryC1 = BuildLibrary(directory1, sourceC, "C")
                Dim libraryA = BuildLibrary(directory1, sourceA, "A", "C")
                Dim libraryC2 = directory2.CreateFile("C.dll").CopyContentFrom(libraryC1).Path
                Dim libraryB = BuildLibrary(directory2, sourceB, "B", "C")
 
                Dim results = AnalyzerDependencyChecker.ComputeDependencyConflicts({libraryA, libraryB, libraryC1, libraryC2}, GetIgnorableAssemblyLists())
 
                Assert.Empty(results.Conflicts)
                Assert.Empty(results.MissingDependencies)
            End Using
        End Sub
 
        <Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1064914")>
        Public Sub ConflictsTest8()
            ' Dependency graph:
            '   Directory 1:
            '     A --> C
            '   Directory 2:
            '     B --> C'
 
            Dim sourceA = "
public class A
{
    void M()
    {
        C c = new C();
    }
}"
 
            Dim sourceB = "
public class B
{
    void M()
    {
        C c = new C();
    }
}"
 
            Dim sourceC = "
public class C
{
    public static string Field = ""Assembly C"";
}"
 
            Dim sourceCPrime = "
public class C
{
    public static string Field = ""Assembly C Prime"";
}"
 
            Using directory1 = New DisposableDirectory(Temp), directory2 = New DisposableDirectory(Temp)
                Dim libraryC = BuildLibrary(directory1, sourceC, "C")
                Dim libraryA = BuildLibrary(directory1, sourceA, "A", "C")
                Dim libraryCPrime = BuildLibrary(directory2, sourceCPrime, "C")
                Dim libraryB = BuildLibrary(directory2, sourceB, "B", "C")
 
                Dim results = AnalyzerDependencyChecker.ComputeDependencyConflicts({libraryA, libraryB, libraryC, libraryCPrime}, GetIgnorableAssemblyLists())
 
                Dim conflicts = results.Conflicts
 
                Assert.Equal(expected:=1, actual:=conflicts.Length)
 
                Dim analyzer1FileName As String = Path.GetFileName(conflicts(0).AnalyzerFilePath1)
                Dim analyzer2FileName As String = Path.GetFileName(conflicts(0).AnalyzerFilePath2)
 
                Assert.Equal(expected:="C.dll", actual:=analyzer1FileName)
                Assert.Equal(expected:="C.dll", actual:=analyzer2FileName)
                Assert.Equal(expected:=New AssemblyIdentity("C"), actual:=conflicts(0).Identity)
            End Using
        End Sub
 
        <Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1064914")>
        Public Sub ConflictsTest9()
            ' Dependency graph:
            '   Directory 1:
            '     A --> C --> D
            '   Directory 2:
            '     B --> C --> D'
 
            Dim sourceA = "
public class A
{
    void M()
    {
        C c = new C();
    }
}"
 
            Dim sourceB = "
public class B
{
    void M()
    {
        C c = new C();
    }
}"
 
            Dim sourceC = "
public class C
{
    void M()
    {
        D d = new D();
    }
}"
 
            Dim sourceD = "
public class D
{
    public static string Field = ""Assembly D"";
}"
 
            Dim sourceDPrime = "
public class D
{
    public static string Field = ""Assembly D Prime"";
}"
 
            Using directory1 = New DisposableDirectory(Temp), directory2 = New DisposableDirectory(Temp)
                Dim libraryD = BuildLibrary(directory1, sourceD, "D")
                Dim libraryDPrime = BuildLibrary(directory2, sourceDPrime, "D")
                Dim libraryC1 = BuildLibrary(directory1, sourceC, "C", "D")
                Dim libraryC2 = directory2.CreateFile("C.dll").CopyContentFrom(libraryC1).Path
                Dim libraryA = BuildLibrary(directory1, sourceA, "A", "C")
                Dim libraryB = BuildLibrary(directory2, sourceB, "B", "C")
 
                Dim results = AnalyzerDependencyChecker.ComputeDependencyConflicts({libraryA, libraryB, libraryC1, libraryC2, libraryD, libraryDPrime}, GetIgnorableAssemblyLists())
 
                Dim conflicts = results.Conflicts
                Assert.Equal(expected:=1, actual:=conflicts.Length)
 
                Dim analyzer1FileName As String = Path.GetFileName(conflicts(0).AnalyzerFilePath1)
                Dim analyzer2FileName As String = Path.GetFileName(conflicts(0).AnalyzerFilePath2)
 
                Assert.Equal(expected:="D.dll", actual:=analyzer1FileName)
                Assert.Equal(expected:="D.dll", actual:=analyzer2FileName)
                Assert.Equal(expected:=New AssemblyIdentity("D"), actual:=conflicts(0).Identity)
            End Using
        End Sub
 
        <Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1064914")>
        Public Sub ConflictsTest10()
            ' Dependency graph:
            '   Directory 1:
            '     A --> C --> E
            '   Directory 2:
            '     B --> D --> E'
 
            Dim sourceA = "
public class A
{
    void M()
    {
        C c = new C();
    }
}"
 
            Dim sourceB = "
public class B
{
    void M()
    {
        D d = new D();
    }
}"
 
            Dim sourceC = "
public class C
{
    void M()
    {
        E e = new E();
    }
}"
 
            Dim sourceD = "
public class D
{
    void M()
    {
        E e = new E();
    }
}"
 
            Dim sourceE = "
public class E
{
    public static string Field = ""Assembly E"";
}"
 
            Dim sourceEPrime = "
public class E
{
    public static string Field = ""Assembly D Prime"";
}"
 
            Using directory1 = New DisposableDirectory(Temp), directory2 = New DisposableDirectory(Temp)
                Dim libraryE = BuildLibrary(directory1, sourceE, "E")
                Dim libraryEPrime = BuildLibrary(directory2, sourceEPrime, "E")
                Dim libraryC = BuildLibrary(directory1, sourceC, "C", "E")
                Dim libraryD = BuildLibrary(directory2, sourceD, "D", "E")
                Dim libraryA = BuildLibrary(directory1, sourceA, "A", "C")
                Dim libraryB = BuildLibrary(directory2, sourceB, "B", "D")
 
                Dim results = AnalyzerDependencyChecker.ComputeDependencyConflicts({libraryA, libraryB, libraryC, libraryD, libraryE, libraryEPrime}, GetIgnorableAssemblyLists())
                Dim conflicts = results.Conflicts
 
                Assert.Equal(expected:=1, actual:=conflicts.Length)
 
                Dim analyzer1FileName As String = Path.GetFileName(conflicts(0).AnalyzerFilePath1)
                Dim analyzer2FileName As String = Path.GetFileName(conflicts(0).AnalyzerFilePath2)
 
                Assert.Equal(expected:="E.dll", actual:=analyzer1FileName)
                Assert.Equal(expected:="E.dll", actual:=analyzer2FileName)
                Assert.Equal(expected:=New AssemblyIdentity("E"), actual:=conflicts(0).Identity)
            End Using
        End Sub
 
        <Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1064914")>
        Public Sub ConflictsTest11()
            ' Dependency graph:
            '   Directory 1:
            '     A --> B
            '   Directory 2:
            '     A --> B'
 
            Dim sourceA = "
public class A
{
    void M()
    {
        B b = new B();
    }
}"
 
            Dim sourceB = "
public class B
{
    public static string Field = ""Assembly B"";
}"
 
            Dim sourceBPrime = "
public class B
{
    public static string Field = ""Assembly B Prime"";
}"
 
            Using directory1 = New DisposableDirectory(Temp), directory2 = New DisposableDirectory(Temp)
                Dim libraryB = BuildLibrary(directory1, sourceB, "B")
                Dim libraryA1 = BuildLibrary(directory1, sourceA, "A", "B")
 
                Dim libraryBPrime = BuildLibrary(directory2, sourceBPrime, "B")
                Dim libraryA2 = directory2.CreateFile("A.dll").CopyContentFrom(libraryA1).Path
 
                Dim results = AnalyzerDependencyChecker.ComputeDependencyConflicts({libraryA1, libraryA2, libraryB, libraryBPrime}, GetIgnorableAssemblyLists())
                Dim conflicts = results.Conflicts
 
                Assert.Equal(expected:=1, actual:=conflicts.Length)
 
                Dim analyzer1FileName As String = Path.GetFileName(conflicts(0).AnalyzerFilePath1)
                Dim analyzer2FileName As String = Path.GetFileName(conflicts(0).AnalyzerFilePath2)
 
                Assert.Equal(expected:="B.dll", actual:=analyzer1FileName)
                Assert.Equal(expected:="B.dll", actual:=analyzer2FileName)
                Assert.Equal(expected:=New AssemblyIdentity("B"), actual:=conflicts(0).Identity)
            End Using
        End Sub
 
        <Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1064914")>
        Public Sub ConflictsTest12()
            ' Dependency graph:
            '   Directory 1:
            '     A --> B
            '   Directory 2:
            '     A' --> B'
 
            Dim sourceA = "
public class A
{
    public static string Field = ""Assembly A"";
 
    void M()
    {
        B b = new B();
    }
}"
 
            Dim sourceAPrime = "
public class A
{
    public static string Field = ""Assembly A Prime"";
 
    void M()
    {
        B b = new B();
    }
}"
 
            Dim sourceB = "
public class B
{
    public static string Field = ""Assembly B"";
}"
 
            Dim sourceBPrime = "
public class B
{
    public static string Field = ""Assembly B Prime"";
}"
 
            Using directory1 = New DisposableDirectory(Temp), directory2 = New DisposableDirectory(Temp)
                Dim libraryB = BuildLibrary(directory1, sourceB, "B")
                Dim libraryA = BuildLibrary(directory1, sourceA, "A", "B")
 
                Dim libraryBPrime = BuildLibrary(directory2, sourceBPrime, "B")
                Dim libraryAPrime = BuildLibrary(directory2, sourceAPrime, "A", "B")
 
                Dim results = AnalyzerDependencyChecker.ComputeDependencyConflicts({libraryA, libraryAPrime, libraryB, libraryBPrime}, GetIgnorableAssemblyLists())
                Dim conflicts = results.Conflicts
 
                Assert.Equal(expected:=2, actual:=conflicts.Length)
            End Using
        End Sub
 
        <Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1064914")>
        Public Sub ConflictsTest13()
            ' Dependency graph:
            '   Directory 1:
            '     A  --> B
            '   Directory 2:
            '     A' --> B
 
            Dim sourceA = "
public class A
{
    public static string Field = ""Assembly A"";
 
    void M()
    {
        B b = new B();
    }
}"
 
            Dim sourceAPrime = "
public class A
{
    public static string Field = ""Assembly A Prime"";
 
    void M()
    {
        B b = new B();
    }
}"
 
            Dim sourceB = "
public class B
{
    public static string Field = ""Assembly B"";
}"
 
            Using directory1 = New DisposableDirectory(Temp), directory2 = New DisposableDirectory(Temp)
                Dim libraryB1 = BuildLibrary(directory1, sourceB, "B")
                Dim libraryA = BuildLibrary(directory1, sourceA, "A", "B")
 
                Dim libraryB2 = directory2.CreateFile("B.dll").CopyContentFrom(libraryB1).Path
                Dim libraryAPrime = BuildLibrary(directory2, sourceAPrime, "A", "B")
 
                Dim results = AnalyzerDependencyChecker.ComputeDependencyConflicts({libraryA, libraryAPrime, libraryB1, libraryB2}, GetIgnorableAssemblyLists())
                Dim conflicts = results.Conflicts
 
                Assert.Equal(expected:=1, actual:=conflicts.Length)
 
                Dim analyzer1FileName As String = Path.GetFileName(conflicts(0).AnalyzerFilePath1)
                Dim analyzer2FileName As String = Path.GetFileName(conflicts(0).AnalyzerFilePath2)
 
                Assert.Equal(expected:="A.dll", actual:=analyzer1FileName)
                Assert.Equal(expected:="A.dll", actual:=analyzer2FileName)
                Assert.Equal(expected:=New AssemblyIdentity("A"), actual:=conflicts(0).Identity)
            End Using
        End Sub
 
        <Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/1064914")>
        Public Sub ConflictsTest14()
            ' Dependency graph:
            '   Directory 1:
            '     A --> D
            '   Directory 2:
            '     B --> D'
            '   Directory 3:
            '     C --> D''
 
            Dim sourceA = "
public class A
{
    void M()
    {
        D d = new D();
    }
}"
 
            Dim sourceB = "
public class B
{
    void M()
    {
        D d = new D();
    }
}"
 
            Dim sourceC = "
public class C
{
    void M()
    {
        D d = new D();
    }
}"
 
            Dim sourceD = "
public class D
{
    public static string Field = ""Assembly D"";
}"
 
            Dim sourceDPrime = "
public class D
{
    public static string Field = ""Assembly D Prime"";
}"
 
            Dim sourceDPrimePrime = "
public class D
{
    public static string Field = ""Assembly D Prime Prime"";
}"
 
            Using directory1 = New DisposableDirectory(Temp), directory2 = New DisposableDirectory(Temp), directory3 = New DisposableDirectory(Temp)
                Dim libraryD = BuildLibrary(directory1, sourceD, "D")
                Dim libraryA = BuildLibrary(directory1, sourceA, "A", "D")
 
                Dim libraryDPrime = BuildLibrary(directory2, sourceDPrime, "D")
                Dim libraryB = BuildLibrary(directory2, sourceB, "B", "D")
 
                Dim libraryDPrimePrime = BuildLibrary(directory3, sourceDPrimePrime, "D")
                Dim libraryC = BuildLibrary(directory3, sourceC, "C", "D")
 
                Dim results = AnalyzerDependencyChecker.ComputeDependencyConflicts({libraryA, libraryB, libraryC, libraryD, libraryDPrime, libraryDPrimePrime}, GetIgnorableAssemblyLists())
 
                Assert.Equal(expected:=3, actual:=results.Conflicts.Length)
            End Using
        End Sub
 
        <Fact>
        Public Sub MissingTest1()
            ' Dependency Graph:
            '   A
 
            Using directory = New DisposableDirectory(Temp)
                Dim library = BuildLibrary(directory, "public class A { }", "A")
 
                Dim results = AnalyzerDependencyChecker.ComputeDependencyConflicts({library}, GetIgnorableAssemblyLists())
 
                Assert.Empty(results.MissingDependencies)
            End Using
        End Sub
 
        <Fact>
        Public Sub MissingTest2()
            ' Dependency graph:
            '   A --> B*
 
            Dim sourceA = "
public class A
{
    void M()
    {
        B b = new B();
    }
}"
 
            Dim sourceB = "public class B { }"
 
            Using directory = New DisposableDirectory(Temp)
                Dim libraryB = BuildLibrary(directory, sourceB, "B")
                Dim libraryA = BuildLibrary(directory, sourceA, "A", "B")
 
                Dim results = AnalyzerDependencyChecker.ComputeDependencyConflicts({libraryA}, GetIgnorableAssemblyLists())
                Dim missingDependencies = results.MissingDependencies
 
                Assert.Equal(expected:=1, actual:=missingDependencies.Count)
 
                Dim analyzerFileName As String = Path.GetFileName(missingDependencies(0).AnalyzerPath)
                Assert.Equal(expected:="A.dll", actual:=analyzerFileName)
                Assert.Equal(expected:=New AssemblyIdentity("B"), actual:=missingDependencies(0).DependencyIdentity)
            End Using
        End Sub
 
        <Fact, WorkItem("https://github.com/dotnet/roslyn/issues/3020")>
        Public Sub IgnorableAssemblyIdentityList_IncludesItem()
            Dim mscorlib1 As AssemblyIdentity = Nothing
            AssemblyIdentity.TryParseDisplayName(s_mscorlibDisplayName, mscorlib1)
 
            Dim ignorableAssemblyList = New IgnorableAssemblyIdentityList({mscorlib1})
 
            Dim mscorlib2 As AssemblyIdentity = Nothing
            AssemblyIdentity.TryParseDisplayName(s_mscorlibDisplayName, mscorlib2)
 
            Assert.True(ignorableAssemblyList.Includes(mscorlib2))
        End Sub
 
        <Fact, WorkItem("https://github.com/dotnet/roslyn/issues/3020")>
        Public Sub IgnorableAssemblyIdentityList_DoesNotIncludeItem()
            Dim mscorlib As AssemblyIdentity = Nothing
            AssemblyIdentity.TryParseDisplayName(s_mscorlibDisplayName, mscorlib)
 
            Dim ignorableAssemblyList = New IgnorableAssemblyIdentityList({mscorlib})
 
            Dim alpha As AssemblyIdentity = Nothing
            AssemblyIdentity.TryParseDisplayName("Alpha, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", alpha)
 
            Assert.False(ignorableAssemblyList.Includes(alpha))
        End Sub
 
        <Fact, WorkItem("https://github.com/dotnet/roslyn/issues/3020")>
        Public Sub IgnorableAssemblyNamePrefixList_IncludesItem_Prefix()
            Dim ignorableAssemblyList = New IgnorableAssemblyNamePrefixList("Alpha")
 
            Dim alphaBeta As AssemblyIdentity = Nothing
            AssemblyIdentity.TryParseDisplayName("Alpha.Beta, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", alphaBeta)
 
            Assert.True(ignorableAssemblyList.Includes(alphaBeta))
        End Sub
 
        <Fact, WorkItem("https://github.com/dotnet/roslyn/issues/3020")>
        Public Sub IgnorableAssemblyNamePrefixList_IncludesItem_WholeName()
            Dim ignorableAssemblyList = New IgnorableAssemblyNamePrefixList("Alpha")
 
            Dim alpha As AssemblyIdentity = Nothing
            AssemblyIdentity.TryParseDisplayName("Alpha, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", alpha)
 
            Assert.True(ignorableAssemblyList.Includes(alpha))
        End Sub
 
        <Fact, WorkItem("https://github.com/dotnet/roslyn/issues/3020")>
        Public Sub IgnorableAssemblyNamePrefixList_DoesNotIncludeItem()
            Dim ignorableAssemblyList = New IgnorableAssemblyNamePrefixList("Beta")
 
            Dim alpha As AssemblyIdentity = Nothing
            AssemblyIdentity.TryParseDisplayName("Alpha, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", alpha)
 
            Assert.False(ignorableAssemblyList.Includes(alpha))
        End Sub
 
        <Fact, WorkItem("https://github.com/dotnet/roslyn/issues/3020")>
        Public Sub IgnorableAssemblyNameList_IncludesItem_Prefix()
            Dim ignorableAssemblyList = New IgnorableAssemblyNameList(ImmutableHashSet.Create("Alpha"))
 
            Dim alphaBeta As AssemblyIdentity = Nothing
            AssemblyIdentity.TryParseDisplayName("Alpha.Beta, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", alphaBeta)
 
            Assert.False(ignorableAssemblyList.Includes(alphaBeta))
        End Sub
 
        <Fact, WorkItem("https://github.com/dotnet/roslyn/issues/3020")>
        Public Sub IgnorableAssemblyNameList_IncludesItem_WholeName()
            Dim ignorableAssemblyList = New IgnorableAssemblyNameList(ImmutableHashSet.Create("Alpha"))
 
            ' No version
            Dim alpha As AssemblyIdentity = Nothing
            AssemblyIdentity.TryParseDisplayName("Alpha", alpha)
 
            Assert.True(ignorableAssemblyList.Includes(alpha))
 
            ' With a version.
            alpha = Nothing
            AssemblyIdentity.TryParseDisplayName("Alpha, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", alpha)
 
            Assert.True(ignorableAssemblyList.Includes(alpha))
 
            ' Version doesn't matter.
            alpha = Nothing
            AssemblyIdentity.TryParseDisplayName("Alpha, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", alpha)
 
            Assert.True(ignorableAssemblyList.Includes(alpha))
        End Sub
 
        <Fact, WorkItem("https://github.com/dotnet/roslyn/issues/3020")>
        Public Sub IgnorableAssemblyNameList_DoesNotIncludeItem()
            Dim ignorableAssemblyList = New IgnorableAssemblyNameList(ImmutableHashSet.Create("Beta"))
 
            Dim alpha As AssemblyIdentity = Nothing
            AssemblyIdentity.TryParseDisplayName("Alpha, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", alpha)
 
            Assert.False(ignorableAssemblyList.Includes(alpha))
        End Sub
 
        Private Shared Function BuildLibrary(directory As DisposableDirectory, fileContents As String, libraryName As String, ParamArray referenceNames As String()) As String
            Dim sourceFile = directory.CreateFile(libraryName + ".cs").WriteAllText(fileContents).Path
            Dim tempOut = Path.Combine(directory.Path, libraryName + ".out")
            Dim libraryOut = Path.Combine(directory.Path, libraryName + ".dll")
 
            Dim syntaxTrees = {CSharpSyntaxTree.ParseText(fileContents, path:=sourceFile)}
 
            Dim references = New List(Of PortableExecutableReference)
            For Each referenceName In referenceNames
                references.Add(PortableExecutableReference.CreateFromFile(Path.Combine(directory.Path, referenceName + ".dll")))
            Next
 
            references.Add(TestMetadata.Net451.mscorlib)
 
            Dim compilation = CSharpCompilation.Create(libraryName, syntaxTrees, references, New CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary))
            Dim emitResult = compilation.Emit(libraryOut)
 
            Assert.Empty(emitResult.Diagnostics)
            Assert.True(emitResult.Success)
 
            Return libraryOut
        End Function
    End Class
End Namespace