File: VisualBasic\BasicIntelliSense.cs
Web Access
Project: ..\..\..\src\VisualStudio\IntegrationTest\IntegrationTests\Microsoft.VisualStudio.LanguageServices.IntegrationTests.csproj (Microsoft.VisualStudio.LanguageServices.IntegrationTests)
// 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.Threading.Tasks;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Test.Utilities;
using Microsoft.VisualStudio.IntegrationTest.Utilities;
using Microsoft.VisualStudio.IntegrationTest.Utilities.Input;
using Roslyn.Test.Utilities;
using Xunit;
using Xunit.Abstractions;
 
namespace Roslyn.VisualStudio.IntegrationTests.VisualBasic
{
    [Collection(nameof(SharedIntegrationHostFixture))]
    [Trait(Traits.Feature, Traits.Features.Completion)]
    public class BasicIntelliSense : AbstractEditorTest
    {
        protected override string LanguageName => LanguageNames.VisualBasic;
 
        public BasicIntelliSense(VisualStudioInstanceFactory instanceFactory)
            : base(instanceFactory, nameof(BasicIntelliSense))
        {
        }
 
        public override async Task InitializeAsync()
        {
            await base.InitializeAsync().ConfigureAwait(true);
 
            // Disable import completion.
            VisualStudio.Workspace.SetImportCompletionOption(false);
        }
 
        [WpfFact(Skip = "https://github.com/dotnet/roslyn/issues/38301")]
        public void IntelliSenseTriggersOnParenWithBraceCompletionAndCorrectUndoMerging()
        {
            SetUpEditor(@"
Module Module1
    Sub Main()
        $$
    End Sub
End Module");
 
            VisualStudio.Editor.SetUseSuggestionMode(false);
 
            VisualStudio.SendKeys.Send("dim q as lis(");
            VisualStudio.Editor.Verify.CompletionItemsExist("Of");
 
            VisualStudio.Editor.Verify.TextContains(@"
Module Module1
    Sub Main()
        Dim q As List($$)
    End Sub
End Module",
assertCaretPosition: true);
 
            VisualStudio.SendKeys.Send(
                VirtualKey.Down,
                VirtualKey.Tab);
 
            VisualStudio.Editor.Verify.TextContains(@"
Module Module1
    Sub Main()
        Dim q As List(Of$$)
    End Sub
End Module",
assertCaretPosition: true);
 
            VisualStudio.SendKeys.Send(" inte");
            VisualStudio.Editor.Verify.CompletionItemsExist("Integer");
 
            VisualStudio.SendKeys.Send(')');
 
            VisualStudio.Editor.Verify.TextContains(@"
Module Module1
    Sub Main()
        Dim q As List(Of Integer)$$
    End Sub
End Module",
assertCaretPosition: true);
 
            VisualStudio.SendKeys.Send(Ctrl(VirtualKey.Z));
 
            VisualStudio.Editor.Verify.TextContains(@"
Module Module1
    Sub Main()
        Dim q As List(Of inte)$$
    End Sub
End Module",
assertCaretPosition: true);
 
            VisualStudio.SendKeys.Send(Ctrl(VirtualKey.Z));
 
            VisualStudio.Editor.Verify.TextContains(@"
Module Module1
    Sub Main()
        Dim q As List(Of inte$$)
    End Sub
End Module",
assertCaretPosition: true);
 
            VisualStudio.SendKeys.Send(Ctrl(VirtualKey.Z));
 
            VisualStudio.Editor.Verify.TextContains(@"
Module Module1
    Sub Main()
        Dim q As List(Of$$)
    End Sub
End Module",
assertCaretPosition: true);
 
            VisualStudio.SendKeys.Send(Ctrl(VirtualKey.Z));
 
            VisualStudio.Editor.Verify.TextContains(@"
Module Module1
    Sub Main()
        Dim q As List($$)
    End Sub
End Module",
assertCaretPosition: true);
 
            VisualStudio.SendKeys.Send(Ctrl(VirtualKey.Z));
 
            VisualStudio.Editor.Verify.TextContains(@"
Module Module1
    Sub Main()
        Dim q As lis($$)
    End Sub
End Module",
assertCaretPosition: true);
 
            VisualStudio.SendKeys.Send(Ctrl(VirtualKey.Z));
 
            VisualStudio.Editor.Verify.TextContains(@"
Module Module1
    Sub Main()
        Dim q As lis($$
    End Sub
End Module",
assertCaretPosition: true);
        }
 
        [WpfFact(Skip = "https://github.com/dotnet/roslyn/issues/45234")]
        public void TypeAVariableDeclaration()
        {
            SetUpEditor(@"
Module Module1
    Sub Main()
        $$
    End Sub
End Module");
 
            VisualStudio.Editor.SetUseSuggestionMode(false);
 
            VisualStudio.SendKeys.Send("dim");
            VisualStudio.Editor.Verify.CompletionItemsExist("Dim", "ReDim");
 
            VisualStudio.SendKeys.Send(' ');
            Assert.False(VisualStudio.Editor.IsCompletionActive());
 
            VisualStudio.SendKeys.Send('i');
            Assert.False(VisualStudio.Editor.IsCompletionActive());
 
            VisualStudio.SendKeys.Send(' ');
            VisualStudio.Editor.Verify.CompletionItemsExist("As");
 
            VisualStudio.SendKeys.Send("a ");
            VisualStudio.SendKeys.Send("intege");
            VisualStudio.Editor.Verify.CompletionItemsExist("Integer", "UInteger");
 
            VisualStudio.SendKeys.Send(' ');
            Assert.False(VisualStudio.Editor.IsCompletionActive());
 
            VisualStudio.SendKeys.Send('=');
            Assert.True(VisualStudio.Editor.IsCompletionActive());
 
            VisualStudio.SendKeys.Send(' ');
            Assert.True(VisualStudio.Editor.IsCompletionActive());
 
            VisualStudio.SendKeys.Send("fooo");
            Assert.False(VisualStudio.Editor.IsCompletionActive());
 
            VisualStudio.SendKeys.Send(' ');
            Assert.True(VisualStudio.Editor.IsCompletionActive());
 
            VisualStudio.SendKeys.Send(VirtualKey.Backspace);
            Assert.False(VisualStudio.Editor.IsCompletionActive());
 
            VisualStudio.SendKeys.Send(VirtualKey.Backspace);
            Assert.True(VisualStudio.Editor.IsCompletionActive());
 
            VisualStudio.SendKeys.Send(
                VirtualKey.Left,
                VirtualKey.Delete);
            Assert.True(VisualStudio.Editor.IsCompletionActive());
        }
 
        [WpfFact]
        public void DismissIntelliSenseOnApostrophe()
        {
            SetUpEditor(@"
Module Module1
    Sub Main()
        $$
    End Sub
End Module");
 
            VisualStudio.Editor.SetUseSuggestionMode(false);
 
            VisualStudio.SendKeys.Send("dim q as ");
            VisualStudio.Editor.Verify.CompletionItemsExist("_AppDomain");
 
            VisualStudio.SendKeys.Send("'");
            Assert.False(VisualStudio.Editor.IsCompletionActive());
            var actualText = VisualStudio.Editor.GetText();
            Assert.Contains(@"Module Module1
    Sub Main()
        Dim q As '
    End Sub
End Module", actualText);
        }
 
        [WpfFact]
        public void TypeLeftAngleAfterImports()
        {
            SetUpEditor(@"
Imports$$");
 
            VisualStudio.Editor.SetUseSuggestionMode(false);
 
            VisualStudio.SendKeys.Send(' ');
            VisualStudio.Editor.Verify.CompletionItemsExist("Microsoft", "System");
 
            VisualStudio.SendKeys.Send('<');
            Assert.False(VisualStudio.Editor.IsCompletionActive());
        }
 
        [WpfFact]
        public void DismissAndRetriggerIntelliSenseOnEquals()
        {
            SetUpEditor(@"
Module Module1
    Function M(val As Integer) As Integer
        $$
    End Function
End Module");
 
            VisualStudio.Editor.SetUseSuggestionMode(false);
 
            VisualStudio.SendKeys.Send('M');
            VisualStudio.Editor.Verify.CompletionItemsExist("M");
 
            VisualStudio.SendKeys.Send("=v");
            VisualStudio.Editor.Verify.CompletionItemsExist("val");
 
            VisualStudio.SendKeys.Send(' ');
            VisualStudio.Editor.Verify.TextContains(@"
Module Module1
    Function M(val As Integer) As Integer
        M=val $$
    End Function
End Module",
assertCaretPosition: true);
        }
 
        [WpfFact]
        public void CtrlAltSpace()
        {
            VisualStudio.Editor.SetUseSuggestionMode(false);
 
            VisualStudio.SendKeys.Send("Nam Foo");
            VisualStudio.Editor.Verify.CurrentLineText("Namespace Foo$$", assertCaretPosition: true);
 
            ClearEditor();
 
            VisualStudio.Editor.SendKeys(new KeyPress(VirtualKey.Space, ShiftState.Ctrl | ShiftState.Alt));
 
            VisualStudio.SendKeys.Send("Nam Foo");
            VisualStudio.Editor.Verify.CurrentLineText("Nam Foo$$", assertCaretPosition: true);
        }
 
        [WpfFact]
        public void CtrlAltSpaceOption()
        {
            VisualStudio.Editor.SetUseSuggestionMode(false);
 
            VisualStudio.SendKeys.Send("Nam Foo");
            VisualStudio.Editor.Verify.CurrentLineText("Namespace Foo$$", assertCaretPosition: true);
 
            ClearEditor();
 
            VisualStudio.ExecuteCommand(WellKnownCommandNames.Edit_ToggleCompletionMode);
 
            VisualStudio.SendKeys.Send("Nam Foo");
            VisualStudio.Editor.Verify.CurrentLineText("Nam Foo$$", assertCaretPosition: true);
        }
 
        [WpfFact]
        public void EnterTriggerCompletionListAndImplementInterface()
        {
            SetUpEditor(@"
Interface UFoo
    Sub FooBar()
End Interface
 
Public Class Bar
    Implements$$
 
End Class");
 
            VisualStudio.Editor.SetUseSuggestionMode(false);
 
            VisualStudio.SendKeys.Send(" UF");
            VisualStudio.Editor.Verify.CompletionItemsExist("UFoo");
 
            VisualStudio.SendKeys.Send(VirtualKey.Enter);
            Assert.False(VisualStudio.Editor.IsCompletionActive());
            var actualText = VisualStudio.Editor.GetText();
            Assert.Contains(@"
Interface UFoo
    Sub FooBar()
End Interface
 
Public Class Bar
    Implements UFoo
 
    Public Sub FooBar() Implements UFoo.FooBar
        Throw New NotImplementedException()
    End Sub
End Class", actualText);
        }
    }
}