diff --git a/src/Platform/Microsoft.Testing.Extensions.VSTestBridge/ObjectModel/TreeNodeFilterExpression.cs b/src/Platform/Microsoft.Testing.Extensions.VSTestBridge/ObjectModel/TreeNodeFilterExpression.cs index 400fb4a3d7..b4b95a5f01 100644 --- a/src/Platform/Microsoft.Testing.Extensions.VSTestBridge/ObjectModel/TreeNodeFilterExpression.cs +++ b/src/Platform/Microsoft.Testing.Extensions.VSTestBridge/ObjectModel/TreeNodeFilterExpression.cs @@ -25,12 +25,20 @@ public TreeNodeFilterExpression(TreeNodeFilter treeNodeFilter, IEnumerable propertyValueProvider) { // TODO - var assemblyName = Path.GetFileNameWithoutExtension(testCase.Source); - var @namespace = ; - var className = ; - var methodName = ; - var propertyBag = ; + string assemblyName = Path.GetFileNameWithoutExtension(testCase.Source); + ReadOnlySpan fullyQualifiedName = testCase.FullyQualifiedName.AsSpan(); - return _treeNodeFilter.MatchesFilter($"/{assemblyName}/{@namespace}/{className}/{methodName}", propertyBag); + int lastDot = fullyQualifiedName.LastIndexOf('.'); + ReadOnlySpan methodName = fullyQualifiedName.Slice(lastDot + 1); + fullyQualifiedName = fullyQualifiedName.Slice(0, lastDot); + + lastDot = fullyQualifiedName.LastIndexOf('.'); + ReadOnlySpan className = fullyQualifiedName.Slice(lastDot + 1); + fullyQualifiedName = fullyQualifiedName.Slice(0, lastDot); + + ReadOnlySpan @namespace = fullyQualifiedName; + + // TODO: PropertyBag argument + return _treeNodeFilter.MatchesFilter($"/{assemblyName}/{@namespace.ToString()}/{className.ToString()}/{methodName.ToString()}", new()); } } diff --git a/test/UnitTests/Microsoft.Testing.Platform.UnitTests/Requests/TreeNodeFilterTests.cs b/test/UnitTests/Microsoft.Testing.Platform.UnitTests/Requests/TreeNodeFilterTests.cs index f587f02457..8334c458a4 100644 --- a/test/UnitTests/Microsoft.Testing.Platform.UnitTests/Requests/TreeNodeFilterTests.cs +++ b/test/UnitTests/Microsoft.Testing.Platform.UnitTests/Requests/TreeNodeFilterTests.cs @@ -220,6 +220,20 @@ public void MatchAllFilterSubpathWithPropertyExpression() Assert.IsFalse(filter.MatchesFilter("/B/A/C/D", new PropertyBag(new KeyValuePairStringProperty("A", "B")))); } + [TestMethod] + public void MatchEmptyNamespaceWithAsterisk() + { + TreeNodeFilter filter = new("/AssemblyName/*/ClassName/MethodName"); + Assert.IsTrue(filter.MatchesFilter("/AssemblyName//ClassName/MethodName", new PropertyBag())); + } + + [TestMethod] + public void MatchEmptyNamespaceWithEmpty() + { + TreeNodeFilter filter = new("/AssemblyName//ClassName/MethodName"); + Assert.IsFalse(filter.MatchesFilter("/AssemblyName//ClassName/MethodName", new PropertyBag())); + } + [TestMethod] public void MatchAllFilterWithPropertyExpression_DoNotAllowInMiddleOfFilter() => Assert.ThrowsException(() => _ = new TreeNodeFilter("/**/Path[A=B]")); }