File: Completion\CompletionProviders\SuggestionModeCompletionProviderTests.vb
Web Access
Project: ..\..\..\src\EditorFeatures\VisualBasicTest\Microsoft.CodeAnalysis.VisualBasic.EditorFeatures.UnitTests.vbproj (Microsoft.CodeAnalysis.VisualBasic.EditorFeatures.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.Threading
Imports Microsoft.CodeAnalysis.Completion
Imports Microsoft.CodeAnalysis.Editor.UnitTests.Extensions
Imports Microsoft.CodeAnalysis.Editor.UnitTests.Workspaces
Imports Microsoft.CodeAnalysis.Options
Imports Microsoft.CodeAnalysis.VisualBasic.Completion.Providers
 
Namespace Microsoft.CodeAnalysis.Editor.VisualBasic.UnitTests.Completion.CompletionProviders
    <Trait(Traits.Feature, Traits.Features.Completion)>
    Public Class SuggestionModeCompletionProviderTests
        Inherits AbstractVisualBasicCompletionProviderTests
 
        <Fact>
        Public Async Function TestFieldDeclaration1() As Task
            Dim markup = <a>Class C
    $$
End Class</a>
 
            Await VerifyNotBuilderAsync(markup)
        End Function
 
        <Fact>
        Public Async Function TestFieldDeclaration2() As Task
            Dim markup = <a>Class C
    Public $$
End Class</a>
 
            Await VerifyBuilderAsync(markup)
        End Function
 
        <Fact>
        Public Async Function TestFieldDeclaration3() As Task
            Dim markup = <a>Module M
    Public $$
End Module</a>
 
            Await VerifyBuilderAsync(markup)
        End Function
 
        <Fact>
        Public Async Function TestFieldDeclaration4() As Task
            Dim markup = <a>Structure S
    Public $$
End Structure</a>
 
            Await VerifyBuilderAsync(markup)
        End Function
 
        <Fact>
        Public Async Function TestFieldDeclaration5() As Task
            Dim markup = <a>Class C
    WithEvents $$
End Class</a>
 
            Await VerifyBuilderAsync(markup)
        End Function
 
        <Fact>
        Public Async Function TestFieldDeclaration6() As Task
            Dim markup = <a>Class C
    Protected Friend $$
End Class</a>
 
            Await VerifyBuilderAsync(markup)
        End Function
 
        <Fact>
        Public Async Function TestParameterDeclaration1() As Task
            Dim markup = <a>Class C
    Public Sub Bar($$
    End Sub
End Class</a>
 
            Await VerifyBuilderAsync(markup)
        End Function
 
        <Fact>
        Public Async Function TestParameterDeclaration2() As Task
            Dim markup = <a>Class C
    Public Sub Bar(Optional goo as Integer, $$
    End Sub
End Class</a>
 
            Await VerifyNotBuilderAsync(markup)
        End Function
 
        <Fact>
        Public Async Function TestParameterDeclaration3() As Task
            Dim markup = <a>Class C
    Public Sub Bar(Optional $$
    End Sub
End Class</a>
 
            Await VerifyBuilderAsync(markup)
        End Function
 
        <Fact>
        Public Async Function TestParameterDeclaration4() As Task
            Dim markup = <a>Class C
    Public Sub Bar(Optional x $$
    End Sub
End Class</a>
 
            Await VerifyNotBuilderAsync(markup)
        End Function
 
        <Fact>
        Public Async Function TestParameterDeclaration5() As Task
            Dim markup = <a>Class C
    Public Sub Bar(Optional x As $$
    End Sub
End Class</a>
 
            Await VerifyNotBuilderAsync(markup)
        End Function
 
        <Fact>
        Public Async Function TestParameterDeclaration6() As Task
            Dim markup = <a>Class C
    Public Sub Bar(Optional x As Integer $$
    End Sub
End Class</a>
 
            Await VerifyNotBuilderAsync(markup)
        End Function
 
        <Fact>
        Public Async Function TestParameterDeclaration7() As Task
            Dim markup = <a>Class C
    Public Sub Bar(ByVal $$
    End Sub
End Class</a>
 
            Await VerifyBuilderAsync(markup)
        End Function
 
        <Fact>
        Public Async Function TestParameterDeclaration8() As Task
            Dim markup = <a>Class C
    Public Sub Bar(ByVal x $$
    End Sub
End Class</a>
 
            Await VerifyNotBuilderAsync(markup)
        End Function
 
        <Fact>
        Public Async Function TestParameterDeclaration9() As Task
            Dim markup = <a>Class C
    Sub Goo $$
End Class</a>
 
            Await VerifyNotBuilderAsync(markup)
        End Function
 
        <Fact>
        Public Async Function TestParameterDeclaration10() As Task
            Dim markup = <a>Class C
    Public Property SomeProp $$
End Class</a>
 
            Await VerifyNotBuilderAsync(markup)
        End Function
 
        <Fact>
        Public Async Function TestSelectClause1() As Task
            Dim markup = <a>Class z
    Sub bar()
        Dim a = New Integer(1, 2, 3) {}
        Dim goo = From z In a
                  Select $$
 
    End Sub
End Class</a>
 
            Await VerifyBuilderAsync(markup)
        End Function
 
        <Fact>
        Public Async Function TestSelectClause2() As Task
            Dim markup = <a>Class z
    Sub bar()
        Dim a = New Integer(1, 2, 3) {}
        Dim goo = From z In a
                  Select 1, $$
 
    End Sub
End Class</a>
 
            Await VerifyBuilderAsync(markup)
        End Function
 
        <Fact>
        Public Async Function TestForStatement1() As Task
            Dim markup = <a>Class z
    Sub bar()
        For $$
    End Sub
End Class</a>
 
            Await VerifyBuilderAsync(markup)
        End Function
 
        <Fact>
        Public Async Function TestForStatement2() As Task
            Dim markup = <a>Class z
    Sub bar()
        For $$ = 1 To 10
        Next
    End Sub
End Class</a>
 
            Await VerifyBuilderAsync(markup)
        End Function
 
        <Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545351")>
        Public Async Function TestBuilderWhenOptionExplicitOff() As Task
            Dim markup = <a>Option Explicit Off
 
Class C1
    Sub M()
        Console.WriteLine($$
    End Sub
End Class
</a>
 
            Await VerifyBuilderAsync(markup)
        End Function
 
        <Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/546659")>
        Public Async Function TestUsingStatement() As Task
            Dim markup = <a> 
Class C1
    Sub M()
        Using $$
    End Sub
End Class
</a>
            Await VerifyBuilderAsync(markup)
        End Function
 
        <Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/734596")>
        Public Async Function TestOptionExplicitOffStatementLevel1() As Task
            Dim markup = <a> 
Option Explicit Off
Class C1
    Sub M()
        $$
    End Sub
End Class
</a>
            Await VerifyBuilderAsync(markup)
        End Function
 
        <Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/734596")>
        Public Async Function TestOptionExplicitOffStatementLevel2() As Task
            Dim markup = <a> 
Option Explicit Off
Class C1
    Sub M()
        a = $$
    End Sub
End Class
</a>
            Await VerifyBuilderAsync(markup)
        End Function
 
        <Fact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/960416")>
        Public Async Function TestReadonlyField() As Task
            Dim markup = <a> 
Class C1
    Readonly $$
    Sub M()
    End Sub
End Class
</a>
            Await VerifyBuilderAsync(markup)
        End Function
 
        <Fact, WorkItem("https://github.com/dotnet/roslyn/issues/7213")>
        Public Async Function NamespaceDeclarationName_Unqualified() As Task
            Dim markup = <a> 
Namespace $$
End Namespace
</a>
            Await VerifyBuilderAsync(markup, CompletionTrigger.Invoke)
        End Function
 
        <Fact, WorkItem("https://github.com/dotnet/roslyn/issues/7213")>
        Public Async Function NamespaceDeclarationName_Qualified() As Task
            Dim markup = <a> 
Namespace A.$$
End Namespace
</a>
            Await VerifyBuilderAsync(markup, CompletionTrigger.Invoke)
        End Function
 
        <Fact, WorkItem("https://github.com/dotnet/roslyn/issues/7213")>
        Public Async Function PartialClassName() As Task
            Dim markup = <a>Partial Class $$</a>
            Await VerifyBuilderAsync(markup, CompletionTrigger.Invoke)
        End Function
 
        <Fact, WorkItem("https://github.com/dotnet/roslyn/issues/7213")>
        Public Async Function PartialStructureName() As Task
            Dim markup = <a>Partial Structure $$</a>
            Await VerifyBuilderAsync(markup, CompletionTrigger.Invoke)
        End Function
 
        <Fact, WorkItem("https://github.com/dotnet/roslyn/issues/7213")>
        Public Async Function PartialInterfaceName() As Task
            Dim markup = <a>Partial Interface $$</a>
            Await VerifyBuilderAsync(markup, CompletionTrigger.Invoke)
        End Function
 
        <Fact, WorkItem("https://github.com/dotnet/roslyn/issues/7213")>
        Public Async Function PartialModuleName() As Task
            Dim markup = <a>Partial Module $$</a>
            Await VerifyBuilderAsync(markup, CompletionTrigger.Invoke)
        End Function
 
        <Fact>
        Public Async Function TupleType() As Task
            Dim markup = <a>
Class C
    Sub M()
        Dim t As (a$$, b)
    End Sub
End Class</a>
 
            Await VerifyNotBuilderAsync(markup)
        End Function
 
        <Fact>
        Public Async Function TupleTypeAfterComma() As Task
            Dim markup = <a>
Class C
    Sub M()
        Dim t As (a, b$$)
    End Sub
End Class</a>
 
            Await VerifyNotBuilderAsync(markup)
        End Function
 
        Private Function VerifyNotBuilderAsync(markup As XElement, Optional triggerInfo As CompletionTrigger? = Nothing, Optional useDebuggerOptions As Boolean = False) As Task
            Return VerifySuggestionModeWorkerAsync(markup, isBuilder:=False, triggerInfo:=triggerInfo, useDebuggerOptions:=useDebuggerOptions)
        End Function
 
        Private Function VerifyBuilderAsync(markup As XElement, Optional triggerInfo As CompletionTrigger? = Nothing, Optional useDebuggerOptions As Boolean = False) As Task
            Return VerifySuggestionModeWorkerAsync(markup, isBuilder:=True, triggerInfo:=triggerInfo, useDebuggerOptions:=useDebuggerOptions)
        End Function
 
        Private Async Function VerifySuggestionModeWorkerAsync(markup As XElement, isBuilder As Boolean, triggerInfo As CompletionTrigger?, Optional useDebuggerOptions As Boolean = False) As Task
            Dim code As String = Nothing
            Dim position As Integer = 0
            MarkupTestFile.GetPosition(markup.NormalizedValue, code, position)
 
            Using workspaceFixture = New VisualBasicTestWorkspaceFixture()
                workspaceFixture.GetWorkspace(GetComposition())
                Dim document1 = workspaceFixture.UpdateDocument(code, SourceCodeKind.Regular)
 
                Dim options As CompletionOptions
 
                If useDebuggerOptions Then
                    options = New CompletionOptions() With
                    {
                        .FilterOutOfScopeLocals = False,
                        .ShowXmlDocCommentCompletion = False
                    }
                Else
                    options = CompletionOptions.Default
                End If
 
                Await CheckResultsAsync(document1, position, isBuilder, triggerInfo, options)
 
                If Await CanUseSpeculativeSemanticModelAsync(document1, position) Then
                    Dim document2 = workspaceFixture.UpdateDocument(code, SourceCodeKind.Regular, cleanBeforeUpdate:=False)
                    Await CheckResultsAsync(document2, position, isBuilder, triggerInfo, options)
                End If
            End Using
        End Function
 
        Private Overloads Async Function CheckResultsAsync(document As Document, position As Integer, isBuilder As Boolean, triggerInfo As CompletionTrigger?, options As CompletionOptions) As Task
            triggerInfo = If(triggerInfo, CompletionTrigger.CreateInsertionTrigger("a"c))
 
            Dim service = GetCompletionService(document.Project)
            Dim provider = Assert.Single(service.GetTestAccessor().GetImportedAndBuiltInProviders(ImmutableHashSet(Of String).Empty))
            Dim context = Await service.GetTestAccessor().GetContextAsync(
                provider, document, position, triggerInfo.Value, options, CancellationToken.None)
 
            If isBuilder Then
                Assert.NotNull(context)
                Assert.NotNull(context.SuggestionModeItem)
            Else
                If context IsNot Nothing Then
                    Assert.True(context.SuggestionModeItem Is Nothing, "group.Builder = " & If(context.SuggestionModeItem IsNot Nothing, context.SuggestionModeItem.DisplayText, "null"))
                End If
            End If
        End Function
 
        Friend Overrides Function GetCompletionProviderType() As Type
            Return GetType(VisualBasicSuggestionModeCompletionProvider)
        End Function
    End Class
End Namespace