From 6f17937214559e14d9beb6cb1f6b52e6486cf390 Mon Sep 17 00:00:00 2001 From: Medeni Baykal <433724+Haplois@users.noreply.github.com> Date: Tue, 9 Feb 2021 01:30:28 +0100 Subject: [PATCH] Fixed broken tests for escaped fqn test cases. --- scripts/build.ps1 | 10 +-- scripts/test.ps1 | 1 + .../ManagedNameHelper.Reflection.cs | 62 ++++++++++++++++--- .../ManagedNameRoundTripTests.cs | 6 +- .../ManagedNameUtilities/SpecialNameTests.cs | 4 +- test/TestAssets/CILProject/CILProject.proj | 2 +- 6 files changed, 68 insertions(+), 17 deletions(-) diff --git a/scripts/build.ps1 b/scripts/build.ps1 index f5d5108a01..de6ebdf051 100644 --- a/scripts/build.ps1 +++ b/scripts/build.ps1 @@ -278,6 +278,11 @@ function Invoke-Build & $dotnetExe build $TPB_Solution --configuration $TPB_Configuration -v:minimal -p:Version=$TPB_Version -p:CIBuild=$TPB_CIBuild -p:LocalizedBuild=$TPB_LocalizedBuild -bl:TestPlatform.binlog Write-Log ".. .. Build: Complete." + Write-Log ".. .. Build: Source: $TPB_TestAssets_CILAssets" + Write-Verbose "$dotnetExe build $TPB_TestAssets_CILAssets --configuration $TPB_Configuration -v:minimal -p:Version=$TPB_Version -p:CIBuild=$TPB_CIBuild" + & $dotnetExe build $TPB_TestAssets_CILAssets --configuration $TPB_Configuration -v:minimal -p:CIBuild=$TPB_CIBuild -p:LocalizedBuild=$TPB_LocalizedBuild -bl:"$($env:TP_ROOT_DIR)\CILAssets.binlog" + Write-Log ".. .. Build: Complete." + Set-ScriptFailedOnError Write-Log "Invoke-Build: Complete. {$(Get-ElapsedTime($timer))}" @@ -294,11 +299,6 @@ function Invoke-TestAssetsBuild & $dotnetExe build $TPB_TestAssets_Solution --configuration $TPB_Configuration -v:minimal -p:CIBuild=$TPB_CIBuild -p:LocalizedBuild=$TPB_LocalizedBuild -bl:"$($env:TP_ROOT_DIR)\TestAssets.binlog" Write-Log ".. .. Build: Complete." - Write-Log ".. .. Build: Source: $TPB_TestAssets_CILAssets" - Write-Verbose "$dotnetExe build $TPB_TestAssets_CILAssets --configuration $TPB_Configuration -v:minimal -p:Version=$TPB_Version -p:CIBuild=$TPB_CIBuild" - & $dotnetExe build $TPB_TestAssets_CILAssets --configuration $TPB_Configuration -v:minimal -p:CIBuild=$TPB_CIBuild -p:LocalizedBuild=$TPB_LocalizedBuild -bl:"$($env:TP_ROOT_DIR)\CILAssets.binlog" - Write-Log ".. .. Build: Complete." - Set-ScriptFailedOnError Write-Log "Invoke-TestAssetsBuild: Complete. {$(Get-ElapsedTime($timer))}" diff --git a/scripts/test.ps1 b/scripts/test.ps1 index 576849ddf3..62dd097e33 100644 --- a/scripts/test.ps1 +++ b/scripts/test.ps1 @@ -207,6 +207,7 @@ function Invoke-Test } else { + Write-Log ".. . $testContainerName test container found. ($testOutputPath)" $testContainers += ,"$testContainerPath" } } diff --git a/src/Microsoft.TestPlatform.AdapterUtilities/ManagedNameUtilities/ManagedNameHelper.Reflection.cs b/src/Microsoft.TestPlatform.AdapterUtilities/ManagedNameUtilities/ManagedNameHelper.Reflection.cs index 48ce7fcbde..e13a382036 100644 --- a/src/Microsoft.TestPlatform.AdapterUtilities/ManagedNameUtilities/ManagedNameHelper.Reflection.cs +++ b/src/Microsoft.TestPlatform.AdapterUtilities/ManagedNameUtilities/ManagedNameHelper.Reflection.cs @@ -80,15 +80,15 @@ public static void GetManagedName(MethodBase method, out string managedTypeName, method = ((MethodInfo)method).GetGenericMethodDefinition(); } - var methodBuilder = new StringBuilder(); var typeBuilder = new StringBuilder(); + var methodBuilder = new StringBuilder(); // Namespace and Type Name (with arity designation) AppendTypeString(typeBuilder, semanticType, closedType: false); // Method Name with method arity - AppendMethodString(methodBuilder, method.Name); var arity = method.GetGenericArguments().Length; + AppendMethodString(methodBuilder, method.Name, arity); if (arity > 0) { methodBuilder.Append('`'); @@ -268,11 +268,30 @@ private static void AppendTypeString(StringBuilder b, Type type, bool closedType } } - private static void AppendMethodString(StringBuilder methodBuilder, string name) + private static void AppendMethodString(StringBuilder methodBuilder, string name, int methodArity) { + var arityStart = name.LastIndexOf('`'); + var arity = 0; + if (arityStart > 0) + { + arityStart++; + var arityString = name.Substring(arityStart, name.Length - arityStart); + if (int.TryParse(arityString, out arity)) + { + if (arity == methodArity) + { + name = name.Substring(0, arityStart - 1); + } + } + } + if (IsNormalized(name)) { methodBuilder.Append(name); + if (arity > 0 && methodArity == arity) + { + methodBuilder.Append($"`{arity}"); + } return; } @@ -293,13 +312,17 @@ private static void AppendMethodString(StringBuilder methodBuilder, string name) } } methodBuilder.Append("'"); + if (arity > 0 && methodArity == arity) + { + methodBuilder.Append($"`{arity}"); + } } private static bool IsNormalized(string s) { for (int i = 0; i < s.Length; i++) { - if (NeedsEscaping(s[i], i)) + if (NeedsEscaping(s[i], i) && s[i] != '.') { return false; } @@ -334,14 +357,39 @@ private static bool NeedsEscaping(char c, int pos) return true; } - private static void AppendNestedTypeName(StringBuilder b, Type type) + private static int AppendNestedTypeName(StringBuilder b, Type type) { + var outerArity = 0; if (type.IsNested) { - AppendNestedTypeName(b, type.DeclaringType); + outerArity = AppendNestedTypeName(b, type.DeclaringType); b.Append('+'); } - AppendMethodString(b, type.Name); + + var typeName = type.Name; + var stars = 0; + if (type.IsPointer) + { + for (int i = typeName.Length - 1; i > 0; i--) + { + if (typeName[i] != '*') + { + stars = typeName.Length - i - 1; + typeName = typeName.Substring(0, i + 1); + break; + } + } + } + + var info = type.GetTypeInfo(); + var arity = info.IsGenericType == false ? 0 + : info.GenericTypeParameters.Length > 0 + ? info.GenericTypeParameters.Length + : info.GenericTypeArguments.Length; + + AppendMethodString(b, typeName, arity - outerArity); + b.Append('*', stars); + return arity; } private static void AppendGenericTypeParameters(StringBuilder b, Type type) diff --git a/test/Microsoft.TestPlatform.AdapterUtilities.UnitTests/ManagedNameUtilities/ManagedNameRoundTripTests.cs b/test/Microsoft.TestPlatform.AdapterUtilities.UnitTests/ManagedNameUtilities/ManagedNameRoundTripTests.cs index 5ff18ae6ad..44543dab83 100644 --- a/test/Microsoft.TestPlatform.AdapterUtilities.UnitTests/ManagedNameUtilities/ManagedNameRoundTripTests.cs +++ b/test/Microsoft.TestPlatform.AdapterUtilities.UnitTests/ManagedNameUtilities/ManagedNameRoundTripTests.cs @@ -451,7 +451,7 @@ public void GenericExplicitInterfaceImplementation1() containingTypeSymbol: implT, methodSymbol: implT.FindMethod("TestClasses.IImplementation.ImplMethod0"), managedTypeName: "TestClasses.Impl`1", - managedMethodName: "TestClasses.IImplementation.ImplMethod0"); + managedMethodName: "'TestClasses\\u002eIImplementation\\u003cT\\u003e\\u002eImplMethod0'"); // "TestClasses.IImplementation.ImplMethod0" } [TestMethod] @@ -464,7 +464,7 @@ public void GenericExplicitInterfaceImplementation2() containingTypeSymbol: implT, methodSymbol: implT.FindMethod("TestClasses.IImplementation.ImplMethod1"), managedTypeName: "TestClasses.Impl`1", - managedMethodName: "TestClasses.IImplementation.ImplMethod1(!0)"); + managedMethodName: "'TestClasses\\u002eIImplementation\\u003cT\\u003e\\u002eImplMethod1'(!0)"); // "TestClasses.IImplementation.ImplMethod1(!0)" } [TestMethod] @@ -477,7 +477,7 @@ public void GenericExplicitInterfaceImplementation3() containingTypeSymbol: implT, methodSymbol: implT.FindMethod("TestClasses.IImplementation.ImplMethod2"), managedTypeName: "TestClasses.Impl`1", - managedMethodName: "TestClasses.IImplementation.ImplMethod2`1(!0,!!0,System.String)"); + managedMethodName: "'TestClasses\\u002eIImplementation\\u003cT\\u003e\\u002eImplMethod2'`1(!0,!!0,System.String)"); // "TestClasses.IImplementation.ImplMethod2`1(!0,!!0,System.String)" } [TestMethod] diff --git a/test/Microsoft.TestPlatform.AdapterUtilities.UnitTests/ManagedNameUtilities/SpecialNameTests.cs b/test/Microsoft.TestPlatform.AdapterUtilities.UnitTests/ManagedNameUtilities/SpecialNameTests.cs index 071b398772..5fad3a8955 100644 --- a/test/Microsoft.TestPlatform.AdapterUtilities.UnitTests/ManagedNameUtilities/SpecialNameTests.cs +++ b/test/Microsoft.TestPlatform.AdapterUtilities.UnitTests/ManagedNameUtilities/SpecialNameTests.cs @@ -9,6 +9,8 @@ namespace Microsoft.TestPlatform.AdapterUtilities.ManagedNameUtilities.UnitTests using System.Reflection; [TestClass] + [TestCategory("Windows")] + [TestCategory("AcceptanceTests")] public class SpecialNameTests { [TestMethod] @@ -17,8 +19,8 @@ public void VerifyThatInvalidIdentifierNamesAreParsed() var environment = new IntegrationTestEnvironment(); var asset = environment.GetTestAsset("CILProject.dll", "net451"); var assembly = Assembly.LoadFrom(asset); - var types = assembly.GetTypes(); + foreach (var type in types) { var methods = type.GetMethods(); diff --git a/test/TestAssets/CILProject/CILProject.proj b/test/TestAssets/CILProject/CILProject.proj index 5936e4376f..006695887e 100644 --- a/test/TestAssets/CILProject/CILProject.proj +++ b/test/TestAssets/CILProject/CILProject.proj @@ -10,7 +10,7 @@ net451 bin\$(Configuration) - true + true false