From 3d14d95088989789a9d2aa3ee973bb1c81587256 Mon Sep 17 00:00:00 2001 From: Manish Vasani Date: Thu, 14 May 2020 06:44:04 -0700 Subject: [PATCH] Add Find References unit tests for ContainingTypeInfo and ContainingMemberInfo custom columns Builds on #44240 to add FAR tests for more custom columns --- .../FindReferencesTests.FieldSymbols.vb | 62 +++++++++++++ .../FindReferencesTests.NamedTypeSymbols.vb | 88 ++++++++++++++++++- .../FindReferences/FindReferencesTests.vb | 70 +++++++++++++++ 3 files changed, 217 insertions(+), 3 deletions(-) diff --git a/src/EditorFeatures/Test2/FindReferences/FindReferencesTests.FieldSymbols.vb b/src/EditorFeatures/Test2/FindReferences/FindReferencesTests.FieldSymbols.vb index bf782721c94..a6e1da712e2 100644 --- a/src/EditorFeatures/Test2/FindReferences/FindReferencesTests.FieldSymbols.vb +++ b/src/EditorFeatures/Test2/FindReferences/FindReferencesTests.FieldSymbols.vb @@ -446,6 +446,68 @@ class Definition:Program } + + Await TestAPIAndFeature(input, kind, host) + End Function + + + Public Async Function TestField_ContainingTypeInfo(kind As TestKind, host As TestHost) As Task + Dim input = + + + + class C + { + int {|Definition:$$i|}; + + int P + { + get + { + return {|AdditionalProperty.ContainingTypeInfo.C:[|i|]|} + } + } + + int P2 => {|AdditionalProperty.ContainingTypeInfo.C:[|i|]|} + + void Goo() + { + Console.WriteLine({|AdditionalProperty.ContainingTypeInfo.C:[|i|]|}); + } + } + + + + Await TestAPIAndFeature(input, kind, host) + End Function + + + Public Async Function TestField_ContainingMemberInfo(kind As TestKind, host As TestHost) As Task + Dim input = + + + + class C + { + int {|Definition:$$i|}; + + int P + { + get + { + return {|AdditionalProperty.ContainingMemberInfo.P:[|i|]|} + } + } + + int P2 => {|AdditionalProperty.ContainingMemberInfo.P2:[|i|]|} + + void Goo() + { + Console.WriteLine({|AdditionalProperty.ContainingMemberInfo.Goo:[|i|]|}); + } + } + + Await TestAPIAndFeature(input, kind, host) End Function diff --git a/src/EditorFeatures/Test2/FindReferences/FindReferencesTests.NamedTypeSymbols.vb b/src/EditorFeatures/Test2/FindReferences/FindReferencesTests.NamedTypeSymbols.vb index 904212a4dcb..5ed88aeffb9 100644 --- a/src/EditorFeatures/Test2/FindReferences/FindReferencesTests.NamedTypeSymbols.vb +++ b/src/EditorFeatures/Test2/FindReferences/FindReferencesTests.NamedTypeSymbols.vb @@ -2189,8 +2189,6 @@ public class D { } End Function - - Public Async Function TestNamedType_TypeOrNamespaceUsageInfo(kind As TestKind, host As TestHost) As Task Dim input = @@ -2224,7 +2222,91 @@ public class D { } public class Class3: {|TypeOrNamespaceUsageInfo.Qualified,Base:[|Class1|]|}.Nested, I<{|TypeOrNamespaceUsageInfo.Qualified,TypeArgument:[|Class1|]|}.Nested> { - public static [|Class1|] M2() => new {|TypeOrNamespaceUsageInfo.ObjectCreation:[|Class1|]|}(); + public static {|TypeOrNamespaceUsageInfo.None:[|Class1|]|} M2() => new {|TypeOrNamespaceUsageInfo.ObjectCreation:[|Class1|]|}(); + } + }]]> + + + + Await TestAPIAndFeature(input, kind, host) + End Function + + + Public Async Function TestNamedType_ContainingTypeInfo(kind As TestKind, host As TestHost) As Task + Dim input = + + + { } + + public class {|Definition:$$Class1|} + { + public static int Field; + public class Nested { } + } + + public class Class2 : {|AdditionalProperty.ContainingTypeInfo.Class2:[|Class1|]|}, I<{|AdditionalProperty.ContainingTypeInfo.Class2:[|Class1|]|}> + { + public static int M() => {|AdditionalProperty.ContainingTypeInfo.Class2:[|Class1|]|}.Field; + } + } + + namespace N2.N3 + { + using Alias2 = N2.{|AdditionalProperty.ContainingTypeInfo.:[|Class1|]|}.Nested; + + public class Class3: {|AdditionalProperty.ContainingTypeInfo.Class3:[|Class1|]|}.Nested, I<{|AdditionalProperty.ContainingTypeInfo.Class3:[|Class1|]|}.Nested> + { + public static {|AdditionalProperty.ContainingTypeInfo.Class3:[|Class1|]|} M2() => new {|AdditionalProperty.ContainingTypeInfo.Class3:[|Class1|]|}(); + } + }]]> + + + + Await TestAPIAndFeature(input, kind, host) + End Function + + + Public Async Function TestNamedType_ContainingMemberInfo(kind As TestKind, host As TestHost) As Task + Dim input = + + + { } + + public class {|Definition:$$Class1|} + { + public static int Field; + public class Nested { } + } + + public class Class2 : {|AdditionalProperty.ContainingMemberInfo.Class2:[|Class1|]|}, I<{|AdditionalProperty.ContainingMemberInfo.Class2:[|Class1|]|}> + { + public static int M() => {|AdditionalProperty.ContainingMemberInfo.M:[|Class1|]|}.Field; + } + } + + namespace N2.N3 + { + using Alias2 = N2.{|AdditionalProperty.ContainingMemberInfo.N3:[|Class1|]|}.Nested; + + public class Class3: {|AdditionalProperty.ContainingMemberInfo.Class3:[|Class1|]|}.Nested, I<{|AdditionalProperty.ContainingMemberInfo.Class3:[|Class1|]|}.Nested> + { + public static {|AdditionalProperty.ContainingMemberInfo.M2:[|Class1|]|} M2() => new {|AdditionalProperty.ContainingMemberInfo.M2:[|Class1|]|}(); } }]]> diff --git a/src/EditorFeatures/Test2/FindReferences/FindReferencesTests.vb b/src/EditorFeatures/Test2/FindReferences/FindReferencesTests.vb index 2f3ba453576..09617556e27 100644 --- a/src/EditorFeatures/Test2/FindReferences/FindReferencesTests.vb +++ b/src/EditorFeatures/Test2/FindReferences/FindReferencesTests.vb @@ -21,6 +21,7 @@ Namespace Microsoft.CodeAnalysis.Editor.UnitTests.FindReferences Private Const DefinitionKey As String = "Definition" Private Const ValueUsageInfoKey As String = "ValueUsageInfo." Private Const TypeOrNamespaceUsageInfoKey As String = "TypeOrNamespaceUsageInfo." + Private Const AdditionalPropertyKey As String = "AdditionalProperty." Private ReadOnly _outputHelper As ITestOutputHelper @@ -129,10 +130,53 @@ Namespace Microsoft.CodeAnalysis.Editor.UnitTests.FindReferences Assert.Equal(expected, actual) Next + + Dim additionalPropertiesMap = GetExpectedAdditionalPropertiesMap(workspace) + For Each kvp In additionalPropertiesMap + Dim propertyName = kvp.Key + For Each propertyValue In kvp.Value + Dim annotationKey = AdditionalPropertyKey + propertyName + "." + propertyValue + Dim expected = + workspace.Documents.Where(Function(d) d.AnnotatedSpans.ContainsKey(annotationKey) AndAlso d.AnnotatedSpans(annotationKey).Any()). + OrderBy(Function(d) d.Name). + Select(Function(d) New FileNameAndSpans( + d.Name, d.AnnotatedSpans(annotationKey).ToList())).ToList() + Dim actual = GetFileNamesAndSpans( + context.References.Where(Function(r) + Dim actualValue As String = Nothing + If r.AdditionalProperties.TryGetValue(propertyName, actualValue) Then + Return actualValue = propertyValue + End If + + Return propertyValue.Length = 0 + End Function).Select(Function(r) r.SourceSpan)) + + Assert.Equal(expected, actual) + Next + Next Next End Using End Function + Private Shared Function GetExpectedAdditionalPropertiesMap(workspace As TestWorkspace) As Dictionary(Of String, HashSet(Of String)) + Dim additionalPropertyKeys = workspace.Documents.SelectMany(Function(d) d.AnnotatedSpans.Keys.Where(Function(key) key.StartsWith(AdditionalPropertyKey)).Select(Function(key) key.Substring(AdditionalPropertyKey.Length))) + Dim additionalPropertiesMap As New Dictionary(Of String, HashSet(Of String)) + For Each key In additionalPropertyKeys + Dim index = key.IndexOf(".") + Assert.True(index > 0) + Dim propertyName = key.Substring(0, index) + Dim propertyValue = key.Substring(index + 1) + Dim propertyValues As HashSet(Of String) = Nothing + If Not additionalPropertiesMap.TryGetValue(propertyName, propertyValues) Then + propertyValues = New HashSet(Of String)() + additionalPropertiesMap.Add(propertyName, propertyValues) + End If + propertyValues.Add(propertyValue) + Next + + Return additionalPropertiesMap + End Function + Private Function GetFileNamesAndSpans(items As IEnumerable(Of DocumentSpan)) As List(Of FileNameAndSpans) Return items.Where(Function(i) i.Document IsNot Nothing). GroupBy(Function(i) i.Document). @@ -314,6 +358,32 @@ Namespace Microsoft.CodeAnalysis.Editor.UnitTests.FindReferences End If Next Next + + Dim additionalPropertiesMap = GetExpectedAdditionalPropertiesMap(workspace) + For Each kvp In additionalPropertiesMap + Dim propertyName = kvp.Key + For Each propertyValue In kvp.Value + Dim annotationKey = AdditionalPropertyKey + propertyName + "." + propertyValue + For Each doc In documentsWithAnnotatedSpans.Where(Function(d) d.AnnotatedSpans.ContainsKey(annotationKey)) + + Dim expectedSpans = doc.AnnotatedSpans(annotationKey).Order() + + actualReferences = GetActualReferences(result, uiVisibleOnly, options, document, workspace, Function(r) + Dim actualValue As String = Nothing + If r.AdditionalProperties.TryGetValue(propertyName, actualValue) Then + Return actualValue = propertyValue + End If + + Return propertyValue.Length = 0 + End Function) + Dim actualSpans = actualReferences(GetFilePathAndProjectLabel(workspace, doc)).Order() + + If Not TextSpansMatch(expectedSpans, actualSpans) Then + Assert.True(False, PrintSpans(expectedSpans, actualSpans, workspace.CurrentSolution.GetDocument(doc.Id), $"{{|{annotationKey}:", "|}")) + End If + Next + Next + Next Next End Using End Function -- GitLab