File: VisualBasic\BasicNavigationBar.cs
Web Access
Project: ..\..\..\src\VisualStudio\IntegrationTest\New.IntegrationTests\Microsoft.VisualStudio.LanguageServices.New.IntegrationTests.csproj (Microsoft.VisualStudio.LanguageServices.New.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.Editor;
using Microsoft.CodeAnalysis.Editor.Options;
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Test.Utilities;
using Microsoft.VisualStudio.Text.Operations;
using Roslyn.VisualStudio.IntegrationTests;
using Xunit;
 
namespace Roslyn.VisualStudio.NewIntegrationTests.VisualBasic
{
    [Trait(Traits.Feature, Traits.Features.NavigationBar)]
    public class BasicNavigationBar : AbstractEditorTest
    {
        private const string TestSource = @"
Class C
    Public WithEvents Domain As AppDomain
    Public Sub $$Goo()
    End Sub
End Class
 
Structure S
    Public Property A As Integer
    Public Property B As Integer
End Structure";
 
        public BasicNavigationBar()
            : base(nameof(BasicNavigationBar))
        {
        }
 
        protected override string LanguageName => LanguageNames.VisualBasic;
 
        [IdeFact]
        public async Task VerifyNavBar()
        {
            await SetUpEditorAsync(TestSource, HangMitigatingCancellationToken);
 
            await TestServices.Editor.PlaceCaretAsync("Goo", charsOffset: 1, HangMitigatingCancellationToken);
 
            Assert.Equal("C", await TestServices.Editor.GetNavigationBarSelectionAsync(NavigationBarDropdownKind.Type, HangMitigatingCancellationToken));
            Assert.Equal("Goo", await TestServices.Editor.GetNavigationBarSelectionAsync(NavigationBarDropdownKind.Member, HangMitigatingCancellationToken));
 
            await TestServices.Editor.ExpandNavigationBarAsync(NavigationBarDropdownKind.Type, HangMitigatingCancellationToken);
            var expectedItems = new[]
            {
                "C",
                "Domain",
                "S",
            };
 
            Assert.Equal(expectedItems, await TestServices.Editor.GetNavigationBarItemsAsync(NavigationBarDropdownKind.Type, HangMitigatingCancellationToken));
 
            await TestServices.Editor.SelectNavigationBarItemAsync(NavigationBarDropdownKind.Type, "S", HangMitigatingCancellationToken);
 
            await TestServices.EditorVerifier.CaretPositionAsync(112, HangMitigatingCancellationToken);
            await TestServices.EditorVerifier.CurrentLineTextAsync("Structure $$S", assertCaretPosition: true);
 
            var view = await TestServices.Editor.GetActiveTextViewAsync(HangMitigatingCancellationToken);
            var editorOperationsFactory = await TestServices.Shell.GetComponentModelServiceAsync<IEditorOperationsFactoryService>(HangMitigatingCancellationToken);
            var editorOperations = editorOperationsFactory.GetEditorOperations(view);
            editorOperations.MoveLineDown(extendSelection: false);
 
            Assert.Equal("A", await TestServices.Editor.GetNavigationBarSelectionAsync(NavigationBarDropdownKind.Member, HangMitigatingCancellationToken));
 
            await TestServices.Editor.ExpandNavigationBarAsync(NavigationBarDropdownKind.Member, HangMitigatingCancellationToken);
            expectedItems = new[]
            {
                "A",
                "B",
            };
 
            Assert.Equal(expectedItems, await TestServices.Editor.GetNavigationBarItemsAsync(NavigationBarDropdownKind.Member, HangMitigatingCancellationToken));
            await TestServices.Editor.SelectNavigationBarItemAsync(NavigationBarDropdownKind.Member, "B", HangMitigatingCancellationToken);
            await TestServices.EditorVerifier.CaretPositionAsync(169, HangMitigatingCancellationToken);
            await TestServices.EditorVerifier.CurrentLineTextAsync("    Public Property $$B As Integer", assertCaretPosition: true, HangMitigatingCancellationToken);
        }
 
        [IdeFact]
        public async Task CodeSpit()
        {
            await SetUpEditorAsync(TestSource, HangMitigatingCancellationToken);
 
            await TestServices.Editor.PlaceCaretAsync("C", charsOffset: 1, HangMitigatingCancellationToken);
            Assert.Equal("C", await TestServices.Editor.GetNavigationBarSelectionAsync(NavigationBarDropdownKind.Type, HangMitigatingCancellationToken));
            await TestServices.Editor.ExpandNavigationBarAsync(NavigationBarDropdownKind.Member, HangMitigatingCancellationToken);
            Assert.Equal(new[] { "New", "Finalize", "Goo" }, await TestServices.Editor.GetNavigationBarItemsAsync(NavigationBarDropdownKind.Member, HangMitigatingCancellationToken));
            await TestServices.Editor.SelectNavigationBarItemAsync(NavigationBarDropdownKind.Member, "New", HangMitigatingCancellationToken);
            await TestServices.EditorVerifier.TextContainsAsync(@"
    Public Sub New()
 
    End Sub", cancellationToken: HangMitigatingCancellationToken);
            await TestServices.EditorVerifier.CaretPositionAsync(78, HangMitigatingCancellationToken); // Caret is between New() and End Sub() in virtual whitespace
            await TestServices.EditorVerifier.CurrentLineTextAsync("$$", assertCaretPosition: true, HangMitigatingCancellationToken);
        }
 
        [IdeFact]
        public async Task VerifyOption()
        {
            var globalOptions = await TestServices.Shell.GetComponentModelServiceAsync<IGlobalOptionService>(HangMitigatingCancellationToken);
 
            globalOptions.SetGlobalOption(NavigationBarViewOptionsStorage.ShowNavigationBar, LanguageNames.VisualBasic, false);
            Assert.False(await TestServices.Editor.IsNavigationBarEnabledAsync(HangMitigatingCancellationToken));
 
            globalOptions.SetGlobalOption(NavigationBarViewOptionsStorage.ShowNavigationBar, LanguageNames.VisualBasic, true);
            Assert.True(await TestServices.Editor.IsNavigationBarEnabledAsync(HangMitigatingCancellationToken));
        }
 
        [IdeFact]
        public async Task VerifyEvents()
        {
            await SetUpEditorAsync(@"
$$Class Item1
    Public Event EvA As Action
    Public Event EvB As Action
End Class
 
Class Item2
    Public Event EvX As Action
    Public Event EvY As Action
End Class
 
Partial Class C
    WithEvents item1 As Item1
    WithEvents item2 As Item2
End Class
 
Partial Class C
    Private Sub item1_EvA() Handles item1.EvA
        ' 1
    End Sub
 
    Private Sub item1_EvB() Handles item1.EvB
        ' 2
    End Sub
 
    Private Sub item2_EvX() Handles item2.EvX
        ' 3
    End Sub
 
    Private Sub item2_EvY() Handles item2.EvY
        ' 4
    End Sub
End Class", HangMitigatingCancellationToken);
 
            await TestServices.Editor.PlaceCaretAsync("' 1", charsOffset: 0, HangMitigatingCancellationToken);
 
            Assert.Equal("item1", await TestServices.Editor.GetNavigationBarSelectionAsync(NavigationBarDropdownKind.Type, HangMitigatingCancellationToken));
            Assert.Equal("EvA", await TestServices.Editor.GetNavigationBarSelectionAsync(NavigationBarDropdownKind.Member, HangMitigatingCancellationToken));
 
            await TestServices.Editor.PlaceCaretAsync("' 2", charsOffset: 0, HangMitigatingCancellationToken);
 
            Assert.Equal("item1", await TestServices.Editor.GetNavigationBarSelectionAsync(NavigationBarDropdownKind.Type, HangMitigatingCancellationToken));
            Assert.Equal("EvB", await TestServices.Editor.GetNavigationBarSelectionAsync(NavigationBarDropdownKind.Member, HangMitigatingCancellationToken));
 
            await TestServices.Editor.PlaceCaretAsync("' 3", charsOffset: 0, HangMitigatingCancellationToken);
 
            Assert.Equal("item2", await TestServices.Editor.GetNavigationBarSelectionAsync(NavigationBarDropdownKind.Type, HangMitigatingCancellationToken));
            Assert.Equal("EvX", await TestServices.Editor.GetNavigationBarSelectionAsync(NavigationBarDropdownKind.Member, HangMitigatingCancellationToken));
 
            await TestServices.Editor.PlaceCaretAsync("' 4", charsOffset: 0, HangMitigatingCancellationToken);
 
            Assert.Equal("item2", await TestServices.Editor.GetNavigationBarSelectionAsync(NavigationBarDropdownKind.Type, HangMitigatingCancellationToken));
            Assert.Equal("EvY", await TestServices.Editor.GetNavigationBarSelectionAsync(NavigationBarDropdownKind.Member, HangMitigatingCancellationToken));
 
            // Selecting an event should update the selected member in the type list.
            await TestServices.Editor.SelectNavigationBarItemAsync(NavigationBarDropdownKind.Member, "EvX", HangMitigatingCancellationToken);
            await TestServices.EditorVerifier.CurrentLineTextAsync("        $$' 3", assertCaretPosition: true, HangMitigatingCancellationToken);
 
            // Selecting an WithEvents member in the type list should have no impact on position.
            // But it should update the items in the member list.
            await TestServices.Editor.SelectNavigationBarItemAsync(NavigationBarDropdownKind.Type, "item1", HangMitigatingCancellationToken);
            await TestServices.EditorVerifier.CurrentLineTextAsync("        $$' 3", assertCaretPosition: true, HangMitigatingCancellationToken);
            Assert.Equal(new[] { "EvA", "EvB" }, await TestServices.Editor.GetNavigationBarItemsAsync(NavigationBarDropdownKind.Member, HangMitigatingCancellationToken));
        }
    }
}