diff --git a/src/Platform/Microsoft.Testing.Platform/Requests/TreeNodeFilter/TreeNodeFilter.cs b/src/Platform/Microsoft.Testing.Platform/Requests/TreeNodeFilter/TreeNodeFilter.cs index 5421aee941..9bec02318e 100644 --- a/src/Platform/Microsoft.Testing.Platform/Requests/TreeNodeFilter/TreeNodeFilter.cs +++ b/src/Platform/Microsoft.Testing.Platform/Requests/TreeNodeFilter/TreeNodeFilter.cs @@ -441,7 +441,13 @@ public bool MatchesFilter(string testNodeFullPath, PropertyBag filterablePropert if (currentFragmentIndex >= _filters.Count) { // Note: The regex for ** is .*.*, so we match against such a value expression. - return currentFragmentIndex > 0 && _filters.Last() is ValueExpression { Value: ".*.*" }; + FilterExpression lastFilter = _filters.Last(); + if (lastFilter is ValueAndPropertyExpression valueAndPropertyExpression) + { + lastFilter = valueAndPropertyExpression.Value; + } + + return currentFragmentIndex > 0 && lastFilter is ValueExpression { Value: ".*.*" }; } if (!MatchFilterPattern( diff --git a/test/UnitTests/Microsoft.Testing.Platform.UnitTests/Requests/TreeNodeFilterTests.cs b/test/UnitTests/Microsoft.Testing.Platform.UnitTests/Requests/TreeNodeFilterTests.cs index facd2f354b..f07a899ae9 100644 --- a/test/UnitTests/Microsoft.Testing.Platform.UnitTests/Requests/TreeNodeFilterTests.cs +++ b/test/UnitTests/Microsoft.Testing.Platform.UnitTests/Requests/TreeNodeFilterTests.cs @@ -167,4 +167,23 @@ public void PropertiesDoNotNeedUrlEncodingOfSlashes(string filter, string nodePa Assert.IsFalse(filterInstance.MatchesFilter(nodePath, nodeProperties)); } } + + [TestMethod] + public void MatchAllFilterWithPropertyExpression() + { + TreeNodeFilter filter = new("/**[A=B]"); + Assert.IsTrue(filter.MatchesFilter("/A/B/C/D", new PropertyBag(new KeyValuePairStringProperty("A", "B")))); + Assert.IsFalse(filter.MatchesFilter("/A/B/C/D", new PropertyBag(new KeyValuePairStringProperty("A", "C")))); + } + + [TestMethod] + public void MatchAllFilterSubpathWithPropertyExpression() + { + TreeNodeFilter filter = new("/A/**[A=B]"); + Assert.IsTrue(filter.MatchesFilter("/A/B/C/D", new PropertyBag(new KeyValuePairStringProperty("A", "B")))); + Assert.IsFalse(filter.MatchesFilter("/B/A/C/D", new PropertyBag(new KeyValuePairStringProperty("A", "B")))); + } + + [TestMethod] + public void MatchAllFilterWithPropertyExpression_DoNotAllowInMiddleOfFilter() => Assert.ThrowsException(() => _ = new TreeNodeFilter("/**/Path[A=B]")); }