|
' 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
Imports Microsoft.CodeAnalysis.LanguageService
Imports Microsoft.CodeAnalysis.PullMemberUp
Imports Microsoft.CodeAnalysis.Shared.Extensions
Imports Microsoft.CodeAnalysis.Test.Utilities
Imports Microsoft.VisualStudio.LanguageServices.Implementation.CommonControls
Imports Microsoft.VisualStudio.LanguageServices.Implementation.PullMemberUp
Imports Microsoft.VisualStudio.LanguageServices.Utilities
Imports Microsoft.VisualStudio.Utilities
Namespace Microsoft.VisualStudio.LanguageServices.UnitTests.CommonControls
<[UseExportProvider]>
<Trait(Traits.Feature, Traits.Features.CodeActionsPullMemberUp)>
Public Class MemberSelectionViewModelTests
<Fact>
Public Async Function SelectPublicMembers() As Task
Dim markUp = <Text><![CDATA[
interface Level2Interface
{
}
interface Level1Interface : Level2Interface
{
}
class Level1BaseClass: Level2Interface
{
}
class MyClass : Level1BaseClass, Level1Interface
{
public void G$$oo()
{
}
public double e => 2.717;
public const days = 365;
private double pi => 3.1416;
protected float goldenRadio = 0.618;
internal float gravitational = 6.67e-11;
}"]]></Text>
Dim viewModel = Await GetViewModelAsync(markUp, LanguageNames.CSharp)
viewModel.SelectPublic()
For Each member In viewModel.Members.Where(Function(memberViewModel) memberViewModel.Symbol.DeclaredAccessibility = Microsoft.CodeAnalysis.Accessibility.Public)
Assert.True(member.IsChecked)
Next
End Function
<Fact>
Public Async Function TestMemberSelectionViewModelDoNot_PullDisableItem() As Task
Dim markUp = <Text><![CDATA[
interface Level2Interface
{
}
interface Level1Interface : Level2Interface
{
}
class Level1BaseClass: Level2Interface
{
}
class MyClass : Level1BaseClass, Level1Interface
{
public void G$$oo()
{
}
public double e => 2.717;
public const days = 365;
private double pi => 3.1416;
protected float goldenRadio = 0.618;
internal float gravitational = 6.67e-11;
}"]]></Text>
Dim viewModel = Await GetViewModelAsync(markUp, LanguageNames.CSharp)
viewModel.SelectAll()
' select an interface, all checkbox of field will be disable
viewModel.UpdateMembersBasedOnDestinationKind(TypeKind.Interface)
' Make sure fields are not pulled to interface
Dim checkedMembers = viewModel.CheckedMembers()
Assert.Empty(checkedMembers.WhereAsArray(Function(analysisResult) analysisResult.Symbol.IsKind(SymbolKind.Field)))
End Function
<Fact>
Public Async Function SelectDependents() As Task
Dim markUp = <Text><![CDATA[
using System;
class Level1BaseClass
{
}
class MyClass : Level1BaseClass
{
private int i = 100;
private event EventHandler FooEvent;
public void G$$oo()
{
int i = BarBar(e);
What = 1000;
}
public int BarBar(double e)
{
Nested1();
return 1000;
}
private void Nested1()
{
int i = 1000;
gravitational == 1.0;
}
internal float gravitational = 6.67e-11;
private int What {get; set; }
public double e => 2.717;
}"]]></Text>
Dim viewModel = Await GetViewModelAsync(markUp, LanguageNames.CSharp)
viewModel.SelectDependents()
' Dependents of Goo
Assert.True(FindMemberByName("Goo()", viewModel.Members).IsChecked)
Assert.True(FindMemberByName("e", viewModel.Members).IsChecked)
Assert.True(FindMemberByName("What", viewModel.Members).IsChecked)
Assert.True(FindMemberByName("BarBar(double)", viewModel.Members).IsChecked)
Assert.True(FindMemberByName("Nested1()", viewModel.Members).IsChecked)
Assert.True(FindMemberByName("gravitational", viewModel.Members).IsChecked)
' Not the depenents of Goo
Assert.False(FindMemberByName("i", viewModel.Members).IsChecked)
Assert.False(FindMemberByName("FooEvent", viewModel.Members).IsChecked)
End Function
Private Shared Function FindMemberByName(name As String, memberArray As ImmutableArray(Of MemberSymbolViewModel)) As MemberSymbolViewModel
Dim member = memberArray.FirstOrDefault(Function(memberViewModel) memberViewModel.SymbolName.Equals(name))
If (member Is Nothing) Then
Assert.True(False, $"No member called {name} found")
End If
Return member
End Function
Private Shared Async Function GetViewModelAsync(markup As XElement, languageName As String) As Task(Of MemberSelectionViewModel)
Dim workspaceXml =
<Workspace>
<Project Language=<%= languageName %> CommonReferences="true">
<Document><%= markup.Value %></Document>
</Project>
</Workspace>
Using workspace = EditorTestWorkspace.Create(workspaceXml)
Dim doc = workspace.Documents.Single()
Dim workspaceDoc = workspace.CurrentSolution.GetDocument(doc.Id)
If (Not doc.CursorPosition.HasValue) Then
Throw New ArgumentException("Missing caret location in document.")
End If
Dim tree = Await workspaceDoc.GetSyntaxTreeAsync()
Dim token = Await tree.GetTouchingWordAsync(doc.CursorPosition.Value, workspaceDoc.Project.Services.GetService(Of ISyntaxFactsService)(), CancellationToken.None)
Dim memberSymbol = (Await workspaceDoc.GetSemanticModelAsync()).GetDeclaredSymbol(token.Parent)
Dim membersInType = memberSymbol.ContainingType.GetMembers().WhereAsArray(Function(member) MemberAndDestinationValidator.IsMemberValid(member))
Dim membersViewModel = membersInType.SelectAsArray(
Function(member) New MemberSymbolViewModel(member, glyphService:=Nothing) With {.IsChecked = member.Equals(memberSymbol), .IsCheckable = True, .MakeAbstract = False})
Dim memberToDependents = SymbolDependentsBuilder.FindMemberToDependentsMap(membersInType, workspaceDoc.Project, CancellationToken.None)
Return New MemberSelectionViewModel(
workspace.GetService(Of IUIThreadOperationExecutor),
membersViewModel,
memberToDependents)
End Using
End Function
End Class
End Namespace
|