Fix TreeNodeFilter OR-pattern diagnostics - #7415

Merged
Amaury Levé (Evangelink) merged 11 commits into
mainfrom
dev/amauryleve/tree-node-filter
May 26, 2026
Merged

Fix TreeNodeFilter OR-pattern diagnostics#7415
Amaury Levé (Evangelink) merged 11 commits into
mainfrom
dev/amauryleve/tree-node-filter

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented Feb 14, 2026

Copy link
Copy Markdown
Member

Description

Partially addresses (does not fully fix) #7300. That issue reports four broken --treenode-filter patterns; this PR only improves the diagnostics and documentation for one of them and clarifies a known matching limitation that affects the other three.

Symptoms reported in #7300

#PatternObservation
1/*/*/*/(MyTest1)Does not match a test named MyTest1
2/*/*/*/(MyTest1)|(MyTest2)Does not match either test
3/*/*/*/(MyTest1|MyTest2)Does not match either test
4(/*/*/*/MyTest1)|(/*/*/*/MyTest2)Crashes with a generic InvalidOperationException

Analysis

  • Cases 1–3 are not a parser bug: (MyTest1) and (MyTest1\|MyTest2)do match a node whose final segment is exactly MyTest1 (see the new OrExpression_WorksForSinglePathSegmentInsideParentheses test). Path segments are matched against an anchored regex ^value$, so a literal MyTest1 will not match a node whose actual ID is MyTest1() (or anything else with extra suffix). TUnit appends method-signature info to the displayed name, so the node IDs the user is actually filtering against are most likely MyTest1(), MyTest2(), etc. — which is why every pattern with a wildcard like MyTest1* "works" while every literal one does not. This is a UX mismatch (display vs. node ID), not a TreeNodeFilter parser defect. Properly resolving it requires either action in TUnit's adapter (use stable IDs that match the displayed name) or a design change to relax literal-segment matching — both are out of scope here.
  • Case 4 is a real parser bug: full-path OR like (/A/B/C/X)\|(/A/B/C/Y) hits separator processing inside parentheses and throws a generic InvalidOperationException with no guidance. This PR replaces that with an actionable message that points the user to the supported form /A/B/C/(X|Y).

Changes

  • TreeNodeFilter.cs: thread the filter string into ProcessStackOperator so the "unexpected / inside parenthesized expression" error can include the filter and a suggested fix. Add grammar remarks noting that OR over a single path segment is supported but OR over full paths is not.
  • PlatformResources.resx (+ all xlf): new TreeNodeFilterUnexpectedSlashOperatorInPathSegmentErrorMessage resource (the previous one is preserved for back-compat; tests use the new message).
  • TreeNodeFilterTests.cs: regression tests for single-segment OR (OrExpression_WorksForSinglePathSegmentInsideParentheses), for the actionable error on full-path OR (FullPathOrInsideParenthesizedExpressions_IsNotSupported_ThrowsActionableMessage), and LiteralSegment_RequiresWildcardToMatchNodesWithAdditionalSuffix which documents (with a comment) the surprising literal-vs-suffix limitation behind cases 1–3.
  • Changelog-Platform.md: entry framed as a diagnostics/docs clarification, not a behavior fix.

Validation

dotnet test Microsoft.Testing.Platform.UnitTests.csproj -c Debug --filter "FullyQualifiedName~TreeNodeFilterTests" → 46/46 passing on net9.0/net8.0/net462.

Follow-ups (not in this PR)

@Youssef1313Youssef Fahmy (Youssef1313) left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have doubts that the problem here is clarity of error message. The behavior seems buggy IMO. Let's discuss offline.

CopilotAI review requested due to automatic review settings May 16, 2026 12:20
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Merged latest main into the PR branch (was ~941 commits behind). The merge was clean with no conflicts. Verified the fix is still relevant — TreeNodeFilter.cs on main has not received an equivalent fix.

Verification:

  • Built Microsoft.Testing.Platform.csproj (Debug): 0 warnings, 0 errors.
  • Ran Microsoft.Testing.Platform.UnitTests filtered to TreeNodeFilter: 165 passed / 0 failed across net8.0, net9.0, net48.

Ready for CI re-run and review.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR clarifies TreeNodeFilter behavior for OR patterns and improves diagnostics when unsupported full-path OR expressions are parenthesized.

Changes:

  • Adds regression coverage for single-segment OR patterns and exact-match behavior.
  • Updates TreeNodeFilter grammar remarks and propagates filter text into parser error construction.
  • Improves the unexpected slash diagnostic for parenthesized full-path OR patterns.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Requests/TreeNodeFilterTests.csAdds tests for supported OR syntax and unsupported parenthesized full-path OR diagnostics.
src/Platform/Microsoft.Testing.Platform/Requests/TreeNodeFilter/TreeNodeFilter.csDocuments OR syntax limitations and augments the unexpected slash exception message.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 1

CopilotAI added 2 commits May 16, 2026 16:04
The merge of origin/main into this branch brought in many new resx entries
(IsGreaterThan, IsLessThan, IsPositive, IsNegative, IsInRange, Contains*,
DoesNotContain*, ContainsSingle, etc.). Regenerated all 13 XLF files via
'dotnet msbuild /t:UpdateXlf' to keep them in sync.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Move the inline hint diagnostic appended to TreeNodeFilterUnexpectedSlashOperatorErrorMessage into a new PlatformResources entry (TreeNodeFilterUnexpectedSlashOperatorInPathSegmentErrorMessage) so the full message is localized like the surrounding parser diagnostics. XLFs regenerated via UpdateXlf.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 16, 2026 15:07

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 29/29 changed files
  • Comments generated: 1

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Reviewed the outstanding feedback and pushed bc8c8cf. Addressed the remaining actionable Copilot comment by adding the missing Changelog-Platform.md entry, then re-ran .\build.cmd successfully (0 warnings, 0 errors). I did not make further code changes for the older Youssef review because it reads as a discussion note ('Let's discuss offline') rather than concrete change guidance, and I skipped the already-handled localization thread because Evangelink had already replied there.

…ode-filter
# Conflicts:
#	src/Platform/Microsoft.Testing.Platform/Requests/TreeNodeFilter/TreeNodeFilter.cs
CopilotAI review requested due to automatic review settings May 23, 2026 15:18

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 30/30 changed files
  • Comments generated: 1

Comment threadsrc/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.cs.xlf Outdated
@Evangelink

Copy link
Copy Markdown
MemberAuthor

🔍 Build Failure Analysis

Summary — Build failed due to out-of-sync localization files (.xlf) after modifying the FrameworkMessages.resx resource file.

Root cause: Localization files (.xlf) out of sync with .resx changes

The PR modifies src/TestFramework/TestFramework/Resources/FrameworkMessages.resx by adding multiple new resource keys and renaming existing ones (e.g., AreEqualDeltaFailMsgAreEqualDeltaFailedSummary). While the corresponding .xlf localization files were updated in the PR, the Microsoft.DotNet.XliffTasks build validation detected that they are still out of sync with the source .resx file.

The XliffTasks validation enforces that all localization files must be perfectly synchronized with the source resource file to prevent translation drift in CI/official builds.

Affected files / errors

Resource keys modified in FrameworkMessages.resx:

  • Renamed: AreEqualDeltaFailMsgAreEqualDeltaFailedSummary
  • Renamed: AreNotEqualDeltaFailMsgAreNotEqualDeltaFailedSummary
  • Renamed: HasCountFailMsgHasCountFailedSummary
  • Renamed: IsNotEmptyFailMsgIsNotEmptyFailedSummary
  • Added: AreNotSequenceEqualInAnyOrderFailedSummary, AreNotSequenceEqualInOrderFailedSummary, AreSequenceEqualInAnyOrderFailedSummary, AreSequenceEqualInOrderFailedSummary, and many more new resource keys

Proposed fix

Run the UpdateXlf MSBuild target to regenerate all .xlf files from the source .resx file:

dotnet build src/TestFramework/TestFramework/TestFramework.csproj /t:UpdateXlf

This will update all 13 localization files:

  • FrameworkMessages.cs.xlf (Czech)
  • FrameworkMessages.de.xlf (German)
  • FrameworkMessages.es.xlf (Spanish)
  • FrameworkMessages.fr.xlf (French)
  • FrameworkMessages.it.xlf (Italian)
  • FrameworkMessages.ja.xlf (Japanese)
  • FrameworkMessages.ko.xlf (Korean)
  • FrameworkMessages.pl.xlf (Polish)
  • FrameworkMessages.pt-BR.xlf (Portuguese-Brazil)
  • FrameworkMessages.ru.xlf (Russian)
  • FrameworkMessages.tr.xlf (Turkish)
  • FrameworkMessages.zh-Hans.xlf (Simplified Chinese)
  • FrameworkMessages.zh-Hant.xlf (Traditional Chinese)

After running the command, commit the updated .xlf files and push to this PR.


Build overview

Configuration: Debug
Exit code: 1 (failure)
Failed target: Build (XliffTasks validation)
Projects affected: TestFramework.csproj (all target frameworks: net8.0, net9.0, netstandard2.0)

All MSBuild errors (3)
CodeProjectFile:LineMessage
(XliffTasks)TestFramework.csproj::net8.0Microsoft.DotNet.XliffTasks.targets:84'Resources/xlf/FrameworkMessages.cs.xlf' is out-of-date with 'Resources/FrameworkMessages.resx'. Run msbuild /t:UpdateXlf to update .xlf files...
(XliffTasks)TestFramework.csproj::net9.0Microsoft.DotNet.XliffTasks.targets:84'Resources/xlf/FrameworkMessages.cs.xlf' is out-of-date with 'Resources/FrameworkMessages.resx'. Run msbuild /t:UpdateXlf to update .xlf files...
(XliffTasks)TestFramework.csproj::netstandard2.0Microsoft.DotNet.XliffTasks.targets:84'Resources/xlf/FrameworkMessages.cs.xlf' is out-of-date with 'Resources/FrameworkMessages.resx'. Run msbuild /t:UpdateXlf to update .xlf files...

🤖 Generated by the Build Failure Analysis workflow using binlog analysis · commit 948f3bd

Generated by Build Failure Analysis for issue #7415 · ● 5.3M ·

Rename ExactMatch_DoesNotMatchAdditionalSuffixUnlessWildcardIsUsed to
LiteralSegment_RequiresWildcardToMatchNodesWithAdditionalSuffix and add an
explanatory comment so the test documents (not endorses) the surprising
behavior reported in issue #7300 where node IDs include suffixes like '()'
that literal filter segments don't match.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The earlier 'Sync FrameworkMessages XLF files after merge with main' commit
wiped existing translations and marked entries as state="new" because the
resx values in this branch were unchanged from main. This PR does not touch
FrameworkMessages.resx or AzureDevOpsResources.resx, so their xlf files
must match main. Restore them from main.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 25, 2026 11:54

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 25/25 changed files
  • Comments generated: 3

…stic
Address Copilot review feedback: also assert the original filter string is present in the exception message so the test catches regressions where the filter parameter stops being threaded into the diagnostic. Adds descriptive failure messages on both asserts.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 25, 2026 17:09

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 17/17 changed files
  • Comments generated: 0 new

@Evangelink
Amaury Levé (Evangelink) merged commit 32a2695 into mainMay 26, 2026
26 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/tree-node-filter branch May 26, 2026 08:31
Amaury Levé (Evangelink) added a commit that referenced this pull request May 28, 2026
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Amaury Levé (Evangelink) added a commit that referenced this pull request Jun 16, 2026
…MSTest changelog
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Amaury Levé (Evangelink) added a commit that referenced this pull request Jun 16, 2026
…ngelog entry
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Evangelink@Youssef1313
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Fix TreeNodeFilter OR-pattern diagnostics - #7415

Merged
Amaury Levé (Evangelink) merged 11 commits into
mainfrom
dev/amauryleve/tree-node-filter
May 26, 2026
Merged

Fix TreeNodeFilter OR-pattern diagnostics#7415
Amaury Levé (Evangelink) merged 11 commits into
mainfrom
dev/amauryleve/tree-node-filter

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented Feb 14, 2026

Copy link
Copy Markdown
Member

Description

Partially addresses (does not fully fix) #7300. That issue reports four broken --treenode-filter patterns; this PR only improves the diagnostics and documentation for one of them and clarifies a known matching limitation that affects the other three.

Symptoms reported in #7300

#PatternObservation
1/*/*/*/(MyTest1)Does not match a test named MyTest1
2/*/*/*/(MyTest1)|(MyTest2)Does not match either test
3/*/*/*/(MyTest1|MyTest2)Does not match either test
4(/*/*/*/MyTest1)|(/*/*/*/MyTest2)Crashes with a generic InvalidOperationException

Analysis

  • Cases 1–3 are not a parser bug: (MyTest1) and (MyTest1\|MyTest2)do match a node whose final segment is exactly MyTest1 (see the new OrExpression_WorksForSinglePathSegmentInsideParentheses test). Path segments are matched against an anchored regex ^value$, so a literal MyTest1 will not match a node whose actual ID is MyTest1() (or anything else with extra suffix). TUnit appends method-signature info to the displayed name, so the node IDs the user is actually filtering against are most likely MyTest1(), MyTest2(), etc. — which is why every pattern with a wildcard like MyTest1* "works" while every literal one does not. This is a UX mismatch (display vs. node ID), not a TreeNodeFilter parser defect. Properly resolving it requires either action in TUnit's adapter (use stable IDs that match the displayed name) or a design change to relax literal-segment matching — both are out of scope here.
  • Case 4 is a real parser bug: full-path OR like (/A/B/C/X)\|(/A/B/C/Y) hits separator processing inside parentheses and throws a generic InvalidOperationException with no guidance. This PR replaces that with an actionable message that points the user to the supported form /A/B/C/(X|Y).

Changes

  • TreeNodeFilter.cs: thread the filter string into ProcessStackOperator so the "unexpected / inside parenthesized expression" error can include the filter and a suggested fix. Add grammar remarks noting that OR over a single path segment is supported but OR over full paths is not.
  • PlatformResources.resx (+ all xlf): new TreeNodeFilterUnexpectedSlashOperatorInPathSegmentErrorMessage resource (the previous one is preserved for back-compat; tests use the new message).
  • TreeNodeFilterTests.cs: regression tests for single-segment OR (OrExpression_WorksForSinglePathSegmentInsideParentheses), for the actionable error on full-path OR (FullPathOrInsideParenthesizedExpressions_IsNotSupported_ThrowsActionableMessage), and LiteralSegment_RequiresWildcardToMatchNodesWithAdditionalSuffix which documents (with a comment) the surprising literal-vs-suffix limitation behind cases 1–3.
  • Changelog-Platform.md: entry framed as a diagnostics/docs clarification, not a behavior fix.

Validation

dotnet test Microsoft.Testing.Platform.UnitTests.csproj -c Debug --filter "FullyQualifiedName~TreeNodeFilterTests" → 46/46 passing on net9.0/net8.0/net462.

Follow-ups (not in this PR)

@Youssef1313Youssef Fahmy (Youssef1313) left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have doubts that the problem here is clarity of error message. The behavior seems buggy IMO. Let's discuss offline.

CopilotAI review requested due to automatic review settings May 16, 2026 12:20
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Merged latest main into the PR branch (was ~941 commits behind). The merge was clean with no conflicts. Verified the fix is still relevant — TreeNodeFilter.cs on main has not received an equivalent fix.

Verification:

  • Built Microsoft.Testing.Platform.csproj (Debug): 0 warnings, 0 errors.
  • Ran Microsoft.Testing.Platform.UnitTests filtered to TreeNodeFilter: 165 passed / 0 failed across net8.0, net9.0, net48.

Ready for CI re-run and review.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR clarifies TreeNodeFilter behavior for OR patterns and improves diagnostics when unsupported full-path OR expressions are parenthesized.

Changes:

  • Adds regression coverage for single-segment OR patterns and exact-match behavior.
  • Updates TreeNodeFilter grammar remarks and propagates filter text into parser error construction.
  • Improves the unexpected slash diagnostic for parenthesized full-path OR patterns.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Requests/TreeNodeFilterTests.csAdds tests for supported OR syntax and unsupported parenthesized full-path OR diagnostics.
src/Platform/Microsoft.Testing.Platform/Requests/TreeNodeFilter/TreeNodeFilter.csDocuments OR syntax limitations and augments the unexpected slash exception message.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 1

CopilotAI added 2 commits May 16, 2026 16:04
The merge of origin/main into this branch brought in many new resx entries
(IsGreaterThan, IsLessThan, IsPositive, IsNegative, IsInRange, Contains*,
DoesNotContain*, ContainsSingle, etc.). Regenerated all 13 XLF files via
'dotnet msbuild /t:UpdateXlf' to keep them in sync.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Move the inline hint diagnostic appended to TreeNodeFilterUnexpectedSlashOperatorErrorMessage into a new PlatformResources entry (TreeNodeFilterUnexpectedSlashOperatorInPathSegmentErrorMessage) so the full message is localized like the surrounding parser diagnostics. XLFs regenerated via UpdateXlf.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 16, 2026 15:07

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 29/29 changed files
  • Comments generated: 1

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Reviewed the outstanding feedback and pushed bc8c8cf. Addressed the remaining actionable Copilot comment by adding the missing Changelog-Platform.md entry, then re-ran .\build.cmd successfully (0 warnings, 0 errors). I did not make further code changes for the older Youssef review because it reads as a discussion note ('Let's discuss offline') rather than concrete change guidance, and I skipped the already-handled localization thread because Evangelink had already replied there.

…ode-filter
# Conflicts:
#	src/Platform/Microsoft.Testing.Platform/Requests/TreeNodeFilter/TreeNodeFilter.cs
CopilotAI review requested due to automatic review settings May 23, 2026 15:18

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 30/30 changed files
  • Comments generated: 1

Comment threadsrc/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.cs.xlf Outdated
@Evangelink

Copy link
Copy Markdown
MemberAuthor

🔍 Build Failure Analysis

Summary — Build failed due to out-of-sync localization files (.xlf) after modifying the FrameworkMessages.resx resource file.

Root cause: Localization files (.xlf) out of sync with .resx changes

The PR modifies src/TestFramework/TestFramework/Resources/FrameworkMessages.resx by adding multiple new resource keys and renaming existing ones (e.g., AreEqualDeltaFailMsgAreEqualDeltaFailedSummary). While the corresponding .xlf localization files were updated in the PR, the Microsoft.DotNet.XliffTasks build validation detected that they are still out of sync with the source .resx file.

The XliffTasks validation enforces that all localization files must be perfectly synchronized with the source resource file to prevent translation drift in CI/official builds.

Affected files / errors

Resource keys modified in FrameworkMessages.resx:

  • Renamed: AreEqualDeltaFailMsgAreEqualDeltaFailedSummary
  • Renamed: AreNotEqualDeltaFailMsgAreNotEqualDeltaFailedSummary
  • Renamed: HasCountFailMsgHasCountFailedSummary
  • Renamed: IsNotEmptyFailMsgIsNotEmptyFailedSummary
  • Added: AreNotSequenceEqualInAnyOrderFailedSummary, AreNotSequenceEqualInOrderFailedSummary, AreSequenceEqualInAnyOrderFailedSummary, AreSequenceEqualInOrderFailedSummary, and many more new resource keys

Proposed fix

Run the UpdateXlf MSBuild target to regenerate all .xlf files from the source .resx file:

dotnet build src/TestFramework/TestFramework/TestFramework.csproj /t:UpdateXlf

This will update all 13 localization files:

  • FrameworkMessages.cs.xlf (Czech)
  • FrameworkMessages.de.xlf (German)
  • FrameworkMessages.es.xlf (Spanish)
  • FrameworkMessages.fr.xlf (French)
  • FrameworkMessages.it.xlf (Italian)
  • FrameworkMessages.ja.xlf (Japanese)
  • FrameworkMessages.ko.xlf (Korean)
  • FrameworkMessages.pl.xlf (Polish)
  • FrameworkMessages.pt-BR.xlf (Portuguese-Brazil)
  • FrameworkMessages.ru.xlf (Russian)
  • FrameworkMessages.tr.xlf (Turkish)
  • FrameworkMessages.zh-Hans.xlf (Simplified Chinese)
  • FrameworkMessages.zh-Hant.xlf (Traditional Chinese)

After running the command, commit the updated .xlf files and push to this PR.


Build overview

Configuration: Debug
Exit code: 1 (failure)
Failed target: Build (XliffTasks validation)
Projects affected: TestFramework.csproj (all target frameworks: net8.0, net9.0, netstandard2.0)

All MSBuild errors (3)
CodeProjectFile:LineMessage
(XliffTasks)TestFramework.csproj::net8.0Microsoft.DotNet.XliffTasks.targets:84'Resources/xlf/FrameworkMessages.cs.xlf' is out-of-date with 'Resources/FrameworkMessages.resx'. Run msbuild /t:UpdateXlf to update .xlf files...
(XliffTasks)TestFramework.csproj::net9.0Microsoft.DotNet.XliffTasks.targets:84'Resources/xlf/FrameworkMessages.cs.xlf' is out-of-date with 'Resources/FrameworkMessages.resx'. Run msbuild /t:UpdateXlf to update .xlf files...
(XliffTasks)TestFramework.csproj::netstandard2.0Microsoft.DotNet.XliffTasks.targets:84'Resources/xlf/FrameworkMessages.cs.xlf' is out-of-date with 'Resources/FrameworkMessages.resx'. Run msbuild /t:UpdateXlf to update .xlf files...

🤖 Generated by the Build Failure Analysis workflow using binlog analysis · commit 948f3bd

Generated by Build Failure Analysis for issue #7415 · ● 5.3M ·

Rename ExactMatch_DoesNotMatchAdditionalSuffixUnlessWildcardIsUsed to
LiteralSegment_RequiresWildcardToMatchNodesWithAdditionalSuffix and add an
explanatory comment so the test documents (not endorses) the surprising
behavior reported in issue #7300 where node IDs include suffixes like '()'
that literal filter segments don't match.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The earlier 'Sync FrameworkMessages XLF files after merge with main' commit
wiped existing translations and marked entries as state="new" because the
resx values in this branch were unchanged from main. This PR does not touch
FrameworkMessages.resx or AzureDevOpsResources.resx, so their xlf files
must match main. Restore them from main.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 25, 2026 11:54

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 25/25 changed files
  • Comments generated: 3

…stic
Address Copilot review feedback: also assert the original filter string is present in the exception message so the test catches regressions where the filter parameter stops being threaded into the diagnostic. Adds descriptive failure messages on both asserts.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 25, 2026 17:09

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 17/17 changed files
  • Comments generated: 0 new

@Evangelink
Amaury Levé (Evangelink) merged commit 32a2695 into mainMay 26, 2026
26 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/tree-node-filter branch May 26, 2026 08:31
Amaury Levé (Evangelink) added a commit that referenced this pull request May 28, 2026
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Amaury Levé (Evangelink) added a commit that referenced this pull request Jun 16, 2026
…MSTest changelog
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Amaury Levé (Evangelink) added a commit that referenced this pull request Jun 16, 2026
…ngelog entry
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Evangelink@Youssef1313
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix TreeNodeFilter OR-pattern diagnostics - #7415

Merged
Amaury Levé (Evangelink) merged 11 commits into
mainfrom
dev/amauryleve/tree-node-filter
May 26, 2026
Merged

Fix TreeNodeFilter OR-pattern diagnostics#7415
Amaury Levé (Evangelink) merged 11 commits into
mainfrom
dev/amauryleve/tree-node-filter

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented Feb 14, 2026

Copy link
Copy Markdown
Member

Description

Partially addresses (does not fully fix) #7300. That issue reports four broken --treenode-filter patterns; this PR only improves the diagnostics and documentation for one of them and clarifies a known matching limitation that affects the other three.

Symptoms reported in #7300

#PatternObservation
1/*/*/*/(MyTest1)Does not match a test named MyTest1
2/*/*/*/(MyTest1)|(MyTest2)Does not match either test
3/*/*/*/(MyTest1|MyTest2)Does not match either test
4(/*/*/*/MyTest1)|(/*/*/*/MyTest2)Crashes with a generic InvalidOperationException

Analysis

  • Cases 1–3 are not a parser bug: (MyTest1) and (MyTest1\|MyTest2)do match a node whose final segment is exactly MyTest1 (see the new OrExpression_WorksForSinglePathSegmentInsideParentheses test). Path segments are matched against an anchored regex ^value$, so a literal MyTest1 will not match a node whose actual ID is MyTest1() (or anything else with extra suffix). TUnit appends method-signature info to the displayed name, so the node IDs the user is actually filtering against are most likely MyTest1(), MyTest2(), etc. — which is why every pattern with a wildcard like MyTest1* "works" while every literal one does not. This is a UX mismatch (display vs. node ID), not a TreeNodeFilter parser defect. Properly resolving it requires either action in TUnit's adapter (use stable IDs that match the displayed name) or a design change to relax literal-segment matching — both are out of scope here.
  • Case 4 is a real parser bug: full-path OR like (/A/B/C/X)\|(/A/B/C/Y) hits separator processing inside parentheses and throws a generic InvalidOperationException with no guidance. This PR replaces that with an actionable message that points the user to the supported form /A/B/C/(X|Y).

Changes

  • TreeNodeFilter.cs: thread the filter string into ProcessStackOperator so the "unexpected / inside parenthesized expression" error can include the filter and a suggested fix. Add grammar remarks noting that OR over a single path segment is supported but OR over full paths is not.
  • PlatformResources.resx (+ all xlf): new TreeNodeFilterUnexpectedSlashOperatorInPathSegmentErrorMessage resource (the previous one is preserved for back-compat; tests use the new message).
  • TreeNodeFilterTests.cs: regression tests for single-segment OR (OrExpression_WorksForSinglePathSegmentInsideParentheses), for the actionable error on full-path OR (FullPathOrInsideParenthesizedExpressions_IsNotSupported_ThrowsActionableMessage), and LiteralSegment_RequiresWildcardToMatchNodesWithAdditionalSuffix which documents (with a comment) the surprising literal-vs-suffix limitation behind cases 1–3.
  • Changelog-Platform.md: entry framed as a diagnostics/docs clarification, not a behavior fix.

Validation

dotnet test Microsoft.Testing.Platform.UnitTests.csproj -c Debug --filter "FullyQualifiedName~TreeNodeFilterTests" → 46/46 passing on net9.0/net8.0/net462.

Follow-ups (not in this PR)

@Youssef1313Youssef Fahmy (Youssef1313) left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have doubts that the problem here is clarity of error message. The behavior seems buggy IMO. Let's discuss offline.

CopilotAI review requested due to automatic review settings May 16, 2026 12:20
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Merged latest main into the PR branch (was ~941 commits behind). The merge was clean with no conflicts. Verified the fix is still relevant — TreeNodeFilter.cs on main has not received an equivalent fix.

Verification:

  • Built Microsoft.Testing.Platform.csproj (Debug): 0 warnings, 0 errors.
  • Ran Microsoft.Testing.Platform.UnitTests filtered to TreeNodeFilter: 165 passed / 0 failed across net8.0, net9.0, net48.

Ready for CI re-run and review.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR clarifies TreeNodeFilter behavior for OR patterns and improves diagnostics when unsupported full-path OR expressions are parenthesized.

Changes:

  • Adds regression coverage for single-segment OR patterns and exact-match behavior.
  • Updates TreeNodeFilter grammar remarks and propagates filter text into parser error construction.
  • Improves the unexpected slash diagnostic for parenthesized full-path OR patterns.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Requests/TreeNodeFilterTests.csAdds tests for supported OR syntax and unsupported parenthesized full-path OR diagnostics.
src/Platform/Microsoft.Testing.Platform/Requests/TreeNodeFilter/TreeNodeFilter.csDocuments OR syntax limitations and augments the unexpected slash exception message.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 1

CopilotAI added 2 commits May 16, 2026 16:04
The merge of origin/main into this branch brought in many new resx entries
(IsGreaterThan, IsLessThan, IsPositive, IsNegative, IsInRange, Contains*,
DoesNotContain*, ContainsSingle, etc.). Regenerated all 13 XLF files via
'dotnet msbuild /t:UpdateXlf' to keep them in sync.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Move the inline hint diagnostic appended to TreeNodeFilterUnexpectedSlashOperatorErrorMessage into a new PlatformResources entry (TreeNodeFilterUnexpectedSlashOperatorInPathSegmentErrorMessage) so the full message is localized like the surrounding parser diagnostics. XLFs regenerated via UpdateXlf.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 16, 2026 15:07

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 29/29 changed files
  • Comments generated: 1

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Reviewed the outstanding feedback and pushed bc8c8cf. Addressed the remaining actionable Copilot comment by adding the missing Changelog-Platform.md entry, then re-ran .\build.cmd successfully (0 warnings, 0 errors). I did not make further code changes for the older Youssef review because it reads as a discussion note ('Let's discuss offline') rather than concrete change guidance, and I skipped the already-handled localization thread because Evangelink had already replied there.

…ode-filter
# Conflicts:
#	src/Platform/Microsoft.Testing.Platform/Requests/TreeNodeFilter/TreeNodeFilter.cs
CopilotAI review requested due to automatic review settings May 23, 2026 15:18

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 30/30 changed files
  • Comments generated: 1

Comment threadsrc/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.cs.xlf Outdated
@Evangelink

Copy link
Copy Markdown
MemberAuthor

🔍 Build Failure Analysis

Summary — Build failed due to out-of-sync localization files (.xlf) after modifying the FrameworkMessages.resx resource file.

Root cause: Localization files (.xlf) out of sync with .resx changes

The PR modifies src/TestFramework/TestFramework/Resources/FrameworkMessages.resx by adding multiple new resource keys and renaming existing ones (e.g., AreEqualDeltaFailMsgAreEqualDeltaFailedSummary). While the corresponding .xlf localization files were updated in the PR, the Microsoft.DotNet.XliffTasks build validation detected that they are still out of sync with the source .resx file.

The XliffTasks validation enforces that all localization files must be perfectly synchronized with the source resource file to prevent translation drift in CI/official builds.

Affected files / errors

Resource keys modified in FrameworkMessages.resx:

  • Renamed: AreEqualDeltaFailMsgAreEqualDeltaFailedSummary
  • Renamed: AreNotEqualDeltaFailMsgAreNotEqualDeltaFailedSummary
  • Renamed: HasCountFailMsgHasCountFailedSummary
  • Renamed: IsNotEmptyFailMsgIsNotEmptyFailedSummary
  • Added: AreNotSequenceEqualInAnyOrderFailedSummary, AreNotSequenceEqualInOrderFailedSummary, AreSequenceEqualInAnyOrderFailedSummary, AreSequenceEqualInOrderFailedSummary, and many more new resource keys

Proposed fix

Run the UpdateXlf MSBuild target to regenerate all .xlf files from the source .resx file:

dotnet build src/TestFramework/TestFramework/TestFramework.csproj /t:UpdateXlf

This will update all 13 localization files:

  • FrameworkMessages.cs.xlf (Czech)
  • FrameworkMessages.de.xlf (German)
  • FrameworkMessages.es.xlf (Spanish)
  • FrameworkMessages.fr.xlf (French)
  • FrameworkMessages.it.xlf (Italian)
  • FrameworkMessages.ja.xlf (Japanese)
  • FrameworkMessages.ko.xlf (Korean)
  • FrameworkMessages.pl.xlf (Polish)
  • FrameworkMessages.pt-BR.xlf (Portuguese-Brazil)
  • FrameworkMessages.ru.xlf (Russian)
  • FrameworkMessages.tr.xlf (Turkish)
  • FrameworkMessages.zh-Hans.xlf (Simplified Chinese)
  • FrameworkMessages.zh-Hant.xlf (Traditional Chinese)

After running the command, commit the updated .xlf files and push to this PR.


Build overview

Configuration: Debug
Exit code: 1 (failure)
Failed target: Build (XliffTasks validation)
Projects affected: TestFramework.csproj (all target frameworks: net8.0, net9.0, netstandard2.0)

All MSBuild errors (3)
CodeProjectFile:LineMessage
(XliffTasks)TestFramework.csproj::net8.0Microsoft.DotNet.XliffTasks.targets:84'Resources/xlf/FrameworkMessages.cs.xlf' is out-of-date with 'Resources/FrameworkMessages.resx'. Run msbuild /t:UpdateXlf to update .xlf files...
(XliffTasks)TestFramework.csproj::net9.0Microsoft.DotNet.XliffTasks.targets:84'Resources/xlf/FrameworkMessages.cs.xlf' is out-of-date with 'Resources/FrameworkMessages.resx'. Run msbuild /t:UpdateXlf to update .xlf files...
(XliffTasks)TestFramework.csproj::netstandard2.0Microsoft.DotNet.XliffTasks.targets:84'Resources/xlf/FrameworkMessages.cs.xlf' is out-of-date with 'Resources/FrameworkMessages.resx'. Run msbuild /t:UpdateXlf to update .xlf files...

🤖 Generated by the Build Failure Analysis workflow using binlog analysis · commit 948f3bd

Generated by Build Failure Analysis for issue #7415 · ● 5.3M ·

Rename ExactMatch_DoesNotMatchAdditionalSuffixUnlessWildcardIsUsed to
LiteralSegment_RequiresWildcardToMatchNodesWithAdditionalSuffix and add an
explanatory comment so the test documents (not endorses) the surprising
behavior reported in issue #7300 where node IDs include suffixes like '()'
that literal filter segments don't match.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The earlier 'Sync FrameworkMessages XLF files after merge with main' commit
wiped existing translations and marked entries as state="new" because the
resx values in this branch were unchanged from main. This PR does not touch
FrameworkMessages.resx or AzureDevOpsResources.resx, so their xlf files
must match main. Restore them from main.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 25, 2026 11:54

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 25/25 changed files
  • Comments generated: 3

…stic
Address Copilot review feedback: also assert the original filter string is present in the exception message so the test catches regressions where the filter parameter stops being threaded into the diagnostic. Adds descriptive failure messages on both asserts.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 25, 2026 17:09

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 17/17 changed files
  • Comments generated: 0 new

@Evangelink
Amaury Levé (Evangelink) merged commit 32a2695 into mainMay 26, 2026
26 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/tree-node-filter branch May 26, 2026 08:31
Amaury Levé (Evangelink) added a commit that referenced this pull request May 28, 2026
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Amaury Levé (Evangelink) added a commit that referenced this pull request Jun 16, 2026
…MSTest changelog
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Amaury Levé (Evangelink) added a commit that referenced this pull request Jun 16, 2026
…ngelog entry
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Evangelink@Youssef1313
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix TreeNodeFilter OR-pattern diagnostics - #7415

Merged
Amaury Levé (Evangelink) merged 11 commits into
mainfrom
dev/amauryleve/tree-node-filter
May 26, 2026
Merged

Fix TreeNodeFilter OR-pattern diagnostics#7415
Amaury Levé (Evangelink) merged 11 commits into
mainfrom
dev/amauryleve/tree-node-filter

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented Feb 14, 2026

Copy link
Copy Markdown
Member

Description

Partially addresses (does not fully fix) #7300. That issue reports four broken --treenode-filter patterns; this PR only improves the diagnostics and documentation for one of them and clarifies a known matching limitation that affects the other three.

Symptoms reported in #7300

#PatternObservation
1/*/*/*/(MyTest1)Does not match a test named MyTest1
2/*/*/*/(MyTest1)|(MyTest2)Does not match either test
3/*/*/*/(MyTest1|MyTest2)Does not match either test
4(/*/*/*/MyTest1)|(/*/*/*/MyTest2)Crashes with a generic InvalidOperationException

Analysis

  • Cases 1–3 are not a parser bug: (MyTest1) and (MyTest1\|MyTest2)do match a node whose final segment is exactly MyTest1 (see the new OrExpression_WorksForSinglePathSegmentInsideParentheses test). Path segments are matched against an anchored regex ^value$, so a literal MyTest1 will not match a node whose actual ID is MyTest1() (or anything else with extra suffix). TUnit appends method-signature info to the displayed name, so the node IDs the user is actually filtering against are most likely MyTest1(), MyTest2(), etc. — which is why every pattern with a wildcard like MyTest1* "works" while every literal one does not. This is a UX mismatch (display vs. node ID), not a TreeNodeFilter parser defect. Properly resolving it requires either action in TUnit's adapter (use stable IDs that match the displayed name) or a design change to relax literal-segment matching — both are out of scope here.
  • Case 4 is a real parser bug: full-path OR like (/A/B/C/X)\|(/A/B/C/Y) hits separator processing inside parentheses and throws a generic InvalidOperationException with no guidance. This PR replaces that with an actionable message that points the user to the supported form /A/B/C/(X|Y).

Changes

  • TreeNodeFilter.cs: thread the filter string into ProcessStackOperator so the "unexpected / inside parenthesized expression" error can include the filter and a suggested fix. Add grammar remarks noting that OR over a single path segment is supported but OR over full paths is not.
  • PlatformResources.resx (+ all xlf): new TreeNodeFilterUnexpectedSlashOperatorInPathSegmentErrorMessage resource (the previous one is preserved for back-compat; tests use the new message).
  • TreeNodeFilterTests.cs: regression tests for single-segment OR (OrExpression_WorksForSinglePathSegmentInsideParentheses), for the actionable error on full-path OR (FullPathOrInsideParenthesizedExpressions_IsNotSupported_ThrowsActionableMessage), and LiteralSegment_RequiresWildcardToMatchNodesWithAdditionalSuffix which documents (with a comment) the surprising literal-vs-suffix limitation behind cases 1–3.
  • Changelog-Platform.md: entry framed as a diagnostics/docs clarification, not a behavior fix.

Validation

dotnet test Microsoft.Testing.Platform.UnitTests.csproj -c Debug --filter "FullyQualifiedName~TreeNodeFilterTests" → 46/46 passing on net9.0/net8.0/net462.

Follow-ups (not in this PR)

@Youssef1313Youssef Fahmy (Youssef1313) left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have doubts that the problem here is clarity of error message. The behavior seems buggy IMO. Let's discuss offline.

CopilotAI review requested due to automatic review settings May 16, 2026 12:20
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Merged latest main into the PR branch (was ~941 commits behind). The merge was clean with no conflicts. Verified the fix is still relevant — TreeNodeFilter.cs on main has not received an equivalent fix.

Verification:

  • Built Microsoft.Testing.Platform.csproj (Debug): 0 warnings, 0 errors.
  • Ran Microsoft.Testing.Platform.UnitTests filtered to TreeNodeFilter: 165 passed / 0 failed across net8.0, net9.0, net48.

Ready for CI re-run and review.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR clarifies TreeNodeFilter behavior for OR patterns and improves diagnostics when unsupported full-path OR expressions are parenthesized.

Changes:

  • Adds regression coverage for single-segment OR patterns and exact-match behavior.
  • Updates TreeNodeFilter grammar remarks and propagates filter text into parser error construction.
  • Improves the unexpected slash diagnostic for parenthesized full-path OR patterns.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Requests/TreeNodeFilterTests.csAdds tests for supported OR syntax and unsupported parenthesized full-path OR diagnostics.
src/Platform/Microsoft.Testing.Platform/Requests/TreeNodeFilter/TreeNodeFilter.csDocuments OR syntax limitations and augments the unexpected slash exception message.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 1

CopilotAI added 2 commits May 16, 2026 16:04
The merge of origin/main into this branch brought in many new resx entries
(IsGreaterThan, IsLessThan, IsPositive, IsNegative, IsInRange, Contains*,
DoesNotContain*, ContainsSingle, etc.). Regenerated all 13 XLF files via
'dotnet msbuild /t:UpdateXlf' to keep them in sync.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Move the inline hint diagnostic appended to TreeNodeFilterUnexpectedSlashOperatorErrorMessage into a new PlatformResources entry (TreeNodeFilterUnexpectedSlashOperatorInPathSegmentErrorMessage) so the full message is localized like the surrounding parser diagnostics. XLFs regenerated via UpdateXlf.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 16, 2026 15:07

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 29/29 changed files
  • Comments generated: 1

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Reviewed the outstanding feedback and pushed bc8c8cf. Addressed the remaining actionable Copilot comment by adding the missing Changelog-Platform.md entry, then re-ran .\build.cmd successfully (0 warnings, 0 errors). I did not make further code changes for the older Youssef review because it reads as a discussion note ('Let's discuss offline') rather than concrete change guidance, and I skipped the already-handled localization thread because Evangelink had already replied there.

…ode-filter
# Conflicts:
#	src/Platform/Microsoft.Testing.Platform/Requests/TreeNodeFilter/TreeNodeFilter.cs
CopilotAI review requested due to automatic review settings May 23, 2026 15:18

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 30/30 changed files
  • Comments generated: 1

Comment threadsrc/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.cs.xlf Outdated
@Evangelink

Copy link
Copy Markdown
MemberAuthor

🔍 Build Failure Analysis

Summary — Build failed due to out-of-sync localization files (.xlf) after modifying the FrameworkMessages.resx resource file.

Root cause: Localization files (.xlf) out of sync with .resx changes

The PR modifies src/TestFramework/TestFramework/Resources/FrameworkMessages.resx by adding multiple new resource keys and renaming existing ones (e.g., AreEqualDeltaFailMsgAreEqualDeltaFailedSummary). While the corresponding .xlf localization files were updated in the PR, the Microsoft.DotNet.XliffTasks build validation detected that they are still out of sync with the source .resx file.

The XliffTasks validation enforces that all localization files must be perfectly synchronized with the source resource file to prevent translation drift in CI/official builds.

Affected files / errors

Resource keys modified in FrameworkMessages.resx:

  • Renamed: AreEqualDeltaFailMsgAreEqualDeltaFailedSummary
  • Renamed: AreNotEqualDeltaFailMsgAreNotEqualDeltaFailedSummary
  • Renamed: HasCountFailMsgHasCountFailedSummary
  • Renamed: IsNotEmptyFailMsgIsNotEmptyFailedSummary
  • Added: AreNotSequenceEqualInAnyOrderFailedSummary, AreNotSequenceEqualInOrderFailedSummary, AreSequenceEqualInAnyOrderFailedSummary, AreSequenceEqualInOrderFailedSummary, and many more new resource keys

Proposed fix

Run the UpdateXlf MSBuild target to regenerate all .xlf files from the source .resx file:

dotnet build src/TestFramework/TestFramework/TestFramework.csproj /t:UpdateXlf

This will update all 13 localization files:

  • FrameworkMessages.cs.xlf (Czech)
  • FrameworkMessages.de.xlf (German)
  • FrameworkMessages.es.xlf (Spanish)
  • FrameworkMessages.fr.xlf (French)
  • FrameworkMessages.it.xlf (Italian)
  • FrameworkMessages.ja.xlf (Japanese)
  • FrameworkMessages.ko.xlf (Korean)
  • FrameworkMessages.pl.xlf (Polish)
  • FrameworkMessages.pt-BR.xlf (Portuguese-Brazil)
  • FrameworkMessages.ru.xlf (Russian)
  • FrameworkMessages.tr.xlf (Turkish)
  • FrameworkMessages.zh-Hans.xlf (Simplified Chinese)
  • FrameworkMessages.zh-Hant.xlf (Traditional Chinese)

After running the command, commit the updated .xlf files and push to this PR.


Build overview

Configuration: Debug
Exit code: 1 (failure)
Failed target: Build (XliffTasks validation)
Projects affected: TestFramework.csproj (all target frameworks: net8.0, net9.0, netstandard2.0)

All MSBuild errors (3)
CodeProjectFile:LineMessage
(XliffTasks)TestFramework.csproj::net8.0Microsoft.DotNet.XliffTasks.targets:84'Resources/xlf/FrameworkMessages.cs.xlf' is out-of-date with 'Resources/FrameworkMessages.resx'. Run msbuild /t:UpdateXlf to update .xlf files...
(XliffTasks)TestFramework.csproj::net9.0Microsoft.DotNet.XliffTasks.targets:84'Resources/xlf/FrameworkMessages.cs.xlf' is out-of-date with 'Resources/FrameworkMessages.resx'. Run msbuild /t:UpdateXlf to update .xlf files...
(XliffTasks)TestFramework.csproj::netstandard2.0Microsoft.DotNet.XliffTasks.targets:84'Resources/xlf/FrameworkMessages.cs.xlf' is out-of-date with 'Resources/FrameworkMessages.resx'. Run msbuild /t:UpdateXlf to update .xlf files...

🤖 Generated by the Build Failure Analysis workflow using binlog analysis · commit 948f3bd

Generated by Build Failure Analysis for issue #7415 · ● 5.3M ·

Rename ExactMatch_DoesNotMatchAdditionalSuffixUnlessWildcardIsUsed to
LiteralSegment_RequiresWildcardToMatchNodesWithAdditionalSuffix and add an
explanatory comment so the test documents (not endorses) the surprising
behavior reported in issue #7300 where node IDs include suffixes like '()'
that literal filter segments don't match.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The earlier 'Sync FrameworkMessages XLF files after merge with main' commit
wiped existing translations and marked entries as state="new" because the
resx values in this branch were unchanged from main. This PR does not touch
FrameworkMessages.resx or AzureDevOpsResources.resx, so their xlf files
must match main. Restore them from main.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 25, 2026 11:54

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 25/25 changed files
  • Comments generated: 3

…stic
Address Copilot review feedback: also assert the original filter string is present in the exception message so the test catches regressions where the filter parameter stops being threaded into the diagnostic. Adds descriptive failure messages on both asserts.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 25, 2026 17:09

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 17/17 changed files
  • Comments generated: 0 new

@Evangelink
Amaury Levé (Evangelink) merged commit 32a2695 into mainMay 26, 2026
26 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/tree-node-filter branch May 26, 2026 08:31
Amaury Levé (Evangelink) added a commit that referenced this pull request May 28, 2026
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Amaury Levé (Evangelink) added a commit that referenced this pull request Jun 16, 2026
…MSTest changelog
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Amaury Levé (Evangelink) added a commit that referenced this pull request Jun 16, 2026
…ngelog entry
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Evangelink@Youssef1313
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Fix TreeNodeFilter OR-pattern diagnostics - #7415

Merged
Amaury Levé (Evangelink) merged 11 commits into
mainfrom
dev/amauryleve/tree-node-filter
May 26, 2026
Merged

Fix TreeNodeFilter OR-pattern diagnostics#7415
Amaury Levé (Evangelink) merged 11 commits into
mainfrom
dev/amauryleve/tree-node-filter

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented Feb 14, 2026

Copy link
Copy Markdown
Member

Description

Partially addresses (does not fully fix) #7300. That issue reports four broken --treenode-filter patterns; this PR only improves the diagnostics and documentation for one of them and clarifies a known matching limitation that affects the other three.

Symptoms reported in #7300

#PatternObservation
1/*/*/*/(MyTest1)Does not match a test named MyTest1
2/*/*/*/(MyTest1)|(MyTest2)Does not match either test
3/*/*/*/(MyTest1|MyTest2)Does not match either test
4(/*/*/*/MyTest1)|(/*/*/*/MyTest2)Crashes with a generic InvalidOperationException

Analysis

  • Cases 1–3 are not a parser bug: (MyTest1) and (MyTest1\|MyTest2)do match a node whose final segment is exactly MyTest1 (see the new OrExpression_WorksForSinglePathSegmentInsideParentheses test). Path segments are matched against an anchored regex ^value$, so a literal MyTest1 will not match a node whose actual ID is MyTest1() (or anything else with extra suffix). TUnit appends method-signature info to the displayed name, so the node IDs the user is actually filtering against are most likely MyTest1(), MyTest2(), etc. — which is why every pattern with a wildcard like MyTest1* "works" while every literal one does not. This is a UX mismatch (display vs. node ID), not a TreeNodeFilter parser defect. Properly resolving it requires either action in TUnit's adapter (use stable IDs that match the displayed name) or a design change to relax literal-segment matching — both are out of scope here.
  • Case 4 is a real parser bug: full-path OR like (/A/B/C/X)\|(/A/B/C/Y) hits separator processing inside parentheses and throws a generic InvalidOperationException with no guidance. This PR replaces that with an actionable message that points the user to the supported form /A/B/C/(X|Y).

Changes

  • TreeNodeFilter.cs: thread the filter string into ProcessStackOperator so the "unexpected / inside parenthesized expression" error can include the filter and a suggested fix. Add grammar remarks noting that OR over a single path segment is supported but OR over full paths is not.
  • PlatformResources.resx (+ all xlf): new TreeNodeFilterUnexpectedSlashOperatorInPathSegmentErrorMessage resource (the previous one is preserved for back-compat; tests use the new message).
  • TreeNodeFilterTests.cs: regression tests for single-segment OR (OrExpression_WorksForSinglePathSegmentInsideParentheses), for the actionable error on full-path OR (FullPathOrInsideParenthesizedExpressions_IsNotSupported_ThrowsActionableMessage), and LiteralSegment_RequiresWildcardToMatchNodesWithAdditionalSuffix which documents (with a comment) the surprising literal-vs-suffix limitation behind cases 1–3.
  • Changelog-Platform.md: entry framed as a diagnostics/docs clarification, not a behavior fix.

Validation

dotnet test Microsoft.Testing.Platform.UnitTests.csproj -c Debug --filter "FullyQualifiedName~TreeNodeFilterTests" → 46/46 passing on net9.0/net8.0/net462.

Follow-ups (not in this PR)

@Youssef1313Youssef Fahmy (Youssef1313) left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have doubts that the problem here is clarity of error message. The behavior seems buggy IMO. Let's discuss offline.

CopilotAI review requested due to automatic review settings May 16, 2026 12:20
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Merged latest main into the PR branch (was ~941 commits behind). The merge was clean with no conflicts. Verified the fix is still relevant — TreeNodeFilter.cs on main has not received an equivalent fix.

Verification:

  • Built Microsoft.Testing.Platform.csproj (Debug): 0 warnings, 0 errors.
  • Ran Microsoft.Testing.Platform.UnitTests filtered to TreeNodeFilter: 165 passed / 0 failed across net8.0, net9.0, net48.

Ready for CI re-run and review.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR clarifies TreeNodeFilter behavior for OR patterns and improves diagnostics when unsupported full-path OR expressions are parenthesized.

Changes:

  • Adds regression coverage for single-segment OR patterns and exact-match behavior.
  • Updates TreeNodeFilter grammar remarks and propagates filter text into parser error construction.
  • Improves the unexpected slash diagnostic for parenthesized full-path OR patterns.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Requests/TreeNodeFilterTests.csAdds tests for supported OR syntax and unsupported parenthesized full-path OR diagnostics.
src/Platform/Microsoft.Testing.Platform/Requests/TreeNodeFilter/TreeNodeFilter.csDocuments OR syntax limitations and augments the unexpected slash exception message.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 1

CopilotAI added 2 commits May 16, 2026 16:04
The merge of origin/main into this branch brought in many new resx entries
(IsGreaterThan, IsLessThan, IsPositive, IsNegative, IsInRange, Contains*,
DoesNotContain*, ContainsSingle, etc.). Regenerated all 13 XLF files via
'dotnet msbuild /t:UpdateXlf' to keep them in sync.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Move the inline hint diagnostic appended to TreeNodeFilterUnexpectedSlashOperatorErrorMessage into a new PlatformResources entry (TreeNodeFilterUnexpectedSlashOperatorInPathSegmentErrorMessage) so the full message is localized like the surrounding parser diagnostics. XLFs regenerated via UpdateXlf.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 16, 2026 15:07

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 29/29 changed files
  • Comments generated: 1

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Reviewed the outstanding feedback and pushed bc8c8cf. Addressed the remaining actionable Copilot comment by adding the missing Changelog-Platform.md entry, then re-ran .\build.cmd successfully (0 warnings, 0 errors). I did not make further code changes for the older Youssef review because it reads as a discussion note ('Let's discuss offline') rather than concrete change guidance, and I skipped the already-handled localization thread because Evangelink had already replied there.

…ode-filter
# Conflicts:
#	src/Platform/Microsoft.Testing.Platform/Requests/TreeNodeFilter/TreeNodeFilter.cs
CopilotAI review requested due to automatic review settings May 23, 2026 15:18

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 30/30 changed files
  • Comments generated: 1

Comment threadsrc/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.cs.xlf Outdated
@Evangelink

Copy link
Copy Markdown
MemberAuthor

🔍 Build Failure Analysis

Summary — Build failed due to out-of-sync localization files (.xlf) after modifying the FrameworkMessages.resx resource file.

Root cause: Localization files (.xlf) out of sync with .resx changes

The PR modifies src/TestFramework/TestFramework/Resources/FrameworkMessages.resx by adding multiple new resource keys and renaming existing ones (e.g., AreEqualDeltaFailMsgAreEqualDeltaFailedSummary). While the corresponding .xlf localization files were updated in the PR, the Microsoft.DotNet.XliffTasks build validation detected that they are still out of sync with the source .resx file.

The XliffTasks validation enforces that all localization files must be perfectly synchronized with the source resource file to prevent translation drift in CI/official builds.

Affected files / errors

Resource keys modified in FrameworkMessages.resx:

  • Renamed: AreEqualDeltaFailMsgAreEqualDeltaFailedSummary
  • Renamed: AreNotEqualDeltaFailMsgAreNotEqualDeltaFailedSummary
  • Renamed: HasCountFailMsgHasCountFailedSummary
  • Renamed: IsNotEmptyFailMsgIsNotEmptyFailedSummary
  • Added: AreNotSequenceEqualInAnyOrderFailedSummary, AreNotSequenceEqualInOrderFailedSummary, AreSequenceEqualInAnyOrderFailedSummary, AreSequenceEqualInOrderFailedSummary, and many more new resource keys

Proposed fix

Run the UpdateXlf MSBuild target to regenerate all .xlf files from the source .resx file:

dotnet build src/TestFramework/TestFramework/TestFramework.csproj /t:UpdateXlf

This will update all 13 localization files:

  • FrameworkMessages.cs.xlf (Czech)
  • FrameworkMessages.de.xlf (German)
  • FrameworkMessages.es.xlf (Spanish)
  • FrameworkMessages.fr.xlf (French)
  • FrameworkMessages.it.xlf (Italian)
  • FrameworkMessages.ja.xlf (Japanese)
  • FrameworkMessages.ko.xlf (Korean)
  • FrameworkMessages.pl.xlf (Polish)
  • FrameworkMessages.pt-BR.xlf (Portuguese-Brazil)
  • FrameworkMessages.ru.xlf (Russian)
  • FrameworkMessages.tr.xlf (Turkish)
  • FrameworkMessages.zh-Hans.xlf (Simplified Chinese)
  • FrameworkMessages.zh-Hant.xlf (Traditional Chinese)

After running the command, commit the updated .xlf files and push to this PR.


Build overview

Configuration: Debug
Exit code: 1 (failure)
Failed target: Build (XliffTasks validation)
Projects affected: TestFramework.csproj (all target frameworks: net8.0, net9.0, netstandard2.0)

All MSBuild errors (3)
CodeProjectFile:LineMessage
(XliffTasks)TestFramework.csproj::net8.0Microsoft.DotNet.XliffTasks.targets:84'Resources/xlf/FrameworkMessages.cs.xlf' is out-of-date with 'Resources/FrameworkMessages.resx'. Run msbuild /t:UpdateXlf to update .xlf files...
(XliffTasks)TestFramework.csproj::net9.0Microsoft.DotNet.XliffTasks.targets:84'Resources/xlf/FrameworkMessages.cs.xlf' is out-of-date with 'Resources/FrameworkMessages.resx'. Run msbuild /t:UpdateXlf to update .xlf files...
(XliffTasks)TestFramework.csproj::netstandard2.0Microsoft.DotNet.XliffTasks.targets:84'Resources/xlf/FrameworkMessages.cs.xlf' is out-of-date with 'Resources/FrameworkMessages.resx'. Run msbuild /t:UpdateXlf to update .xlf files...

🤖 Generated by the Build Failure Analysis workflow using binlog analysis · commit 948f3bd

Generated by Build Failure Analysis for issue #7415 · ● 5.3M ·

Rename ExactMatch_DoesNotMatchAdditionalSuffixUnlessWildcardIsUsed to
LiteralSegment_RequiresWildcardToMatchNodesWithAdditionalSuffix and add an
explanatory comment so the test documents (not endorses) the surprising
behavior reported in issue #7300 where node IDs include suffixes like '()'
that literal filter segments don't match.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The earlier 'Sync FrameworkMessages XLF files after merge with main' commit
wiped existing translations and marked entries as state="new" because the
resx values in this branch were unchanged from main. This PR does not touch
FrameworkMessages.resx or AzureDevOpsResources.resx, so their xlf files
must match main. Restore them from main.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 25, 2026 11:54

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 25/25 changed files
  • Comments generated: 3

…stic
Address Copilot review feedback: also assert the original filter string is present in the exception message so the test catches regressions where the filter parameter stops being threaded into the diagnostic. Adds descriptive failure messages on both asserts.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 25, 2026 17:09

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 17/17 changed files
  • Comments generated: 0 new

@Evangelink
Amaury Levé (Evangelink) merged commit 32a2695 into mainMay 26, 2026
26 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/tree-node-filter branch May 26, 2026 08:31
Amaury Levé (Evangelink) added a commit that referenced this pull request May 28, 2026
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Amaury Levé (Evangelink) added a commit that referenced this pull request Jun 16, 2026
…MSTest changelog
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Amaury Levé (Evangelink) added a commit that referenced this pull request Jun 16, 2026
…ngelog entry
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Evangelink@Youssef1313
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix TreeNodeFilter OR-pattern diagnostics - #7415

Merged
Amaury Levé (Evangelink) merged 11 commits into
mainfrom
dev/amauryleve/tree-node-filter
May 26, 2026
Merged

Fix TreeNodeFilter OR-pattern diagnostics#7415
Amaury Levé (Evangelink) merged 11 commits into
mainfrom
dev/amauryleve/tree-node-filter

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented Feb 14, 2026

Copy link
Copy Markdown
Member

Description

Partially addresses (does not fully fix) #7300. That issue reports four broken --treenode-filter patterns; this PR only improves the diagnostics and documentation for one of them and clarifies a known matching limitation that affects the other three.

Symptoms reported in #7300

#PatternObservation
1/*/*/*/(MyTest1)Does not match a test named MyTest1
2/*/*/*/(MyTest1)|(MyTest2)Does not match either test
3/*/*/*/(MyTest1|MyTest2)Does not match either test
4(/*/*/*/MyTest1)|(/*/*/*/MyTest2)Crashes with a generic InvalidOperationException

Analysis

  • Cases 1–3 are not a parser bug: (MyTest1) and (MyTest1\|MyTest2)do match a node whose final segment is exactly MyTest1 (see the new OrExpression_WorksForSinglePathSegmentInsideParentheses test). Path segments are matched against an anchored regex ^value$, so a literal MyTest1 will not match a node whose actual ID is MyTest1() (or anything else with extra suffix). TUnit appends method-signature info to the displayed name, so the node IDs the user is actually filtering against are most likely MyTest1(), MyTest2(), etc. — which is why every pattern with a wildcard like MyTest1* "works" while every literal one does not. This is a UX mismatch (display vs. node ID), not a TreeNodeFilter parser defect. Properly resolving it requires either action in TUnit's adapter (use stable IDs that match the displayed name) or a design change to relax literal-segment matching — both are out of scope here.
  • Case 4 is a real parser bug: full-path OR like (/A/B/C/X)\|(/A/B/C/Y) hits separator processing inside parentheses and throws a generic InvalidOperationException with no guidance. This PR replaces that with an actionable message that points the user to the supported form /A/B/C/(X|Y).

Changes

  • TreeNodeFilter.cs: thread the filter string into ProcessStackOperator so the "unexpected / inside parenthesized expression" error can include the filter and a suggested fix. Add grammar remarks noting that OR over a single path segment is supported but OR over full paths is not.
  • PlatformResources.resx (+ all xlf): new TreeNodeFilterUnexpectedSlashOperatorInPathSegmentErrorMessage resource (the previous one is preserved for back-compat; tests use the new message).
  • TreeNodeFilterTests.cs: regression tests for single-segment OR (OrExpression_WorksForSinglePathSegmentInsideParentheses), for the actionable error on full-path OR (FullPathOrInsideParenthesizedExpressions_IsNotSupported_ThrowsActionableMessage), and LiteralSegment_RequiresWildcardToMatchNodesWithAdditionalSuffix which documents (with a comment) the surprising literal-vs-suffix limitation behind cases 1–3.
  • Changelog-Platform.md: entry framed as a diagnostics/docs clarification, not a behavior fix.

Validation

dotnet test Microsoft.Testing.Platform.UnitTests.csproj -c Debug --filter "FullyQualifiedName~TreeNodeFilterTests" → 46/46 passing on net9.0/net8.0/net462.

Follow-ups (not in this PR)

@Youssef1313Youssef Fahmy (Youssef1313) left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have doubts that the problem here is clarity of error message. The behavior seems buggy IMO. Let's discuss offline.

CopilotAI review requested due to automatic review settings May 16, 2026 12:20
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Merged latest main into the PR branch (was ~941 commits behind). The merge was clean with no conflicts. Verified the fix is still relevant — TreeNodeFilter.cs on main has not received an equivalent fix.

Verification:

  • Built Microsoft.Testing.Platform.csproj (Debug): 0 warnings, 0 errors.
  • Ran Microsoft.Testing.Platform.UnitTests filtered to TreeNodeFilter: 165 passed / 0 failed across net8.0, net9.0, net48.

Ready for CI re-run and review.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR clarifies TreeNodeFilter behavior for OR patterns and improves diagnostics when unsupported full-path OR expressions are parenthesized.

Changes:

  • Adds regression coverage for single-segment OR patterns and exact-match behavior.
  • Updates TreeNodeFilter grammar remarks and propagates filter text into parser error construction.
  • Improves the unexpected slash diagnostic for parenthesized full-path OR patterns.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Requests/TreeNodeFilterTests.csAdds tests for supported OR syntax and unsupported parenthesized full-path OR diagnostics.
src/Platform/Microsoft.Testing.Platform/Requests/TreeNodeFilter/TreeNodeFilter.csDocuments OR syntax limitations and augments the unexpected slash exception message.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 1

CopilotAI added 2 commits May 16, 2026 16:04
The merge of origin/main into this branch brought in many new resx entries
(IsGreaterThan, IsLessThan, IsPositive, IsNegative, IsInRange, Contains*,
DoesNotContain*, ContainsSingle, etc.). Regenerated all 13 XLF files via
'dotnet msbuild /t:UpdateXlf' to keep them in sync.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Move the inline hint diagnostic appended to TreeNodeFilterUnexpectedSlashOperatorErrorMessage into a new PlatformResources entry (TreeNodeFilterUnexpectedSlashOperatorInPathSegmentErrorMessage) so the full message is localized like the surrounding parser diagnostics. XLFs regenerated via UpdateXlf.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 16, 2026 15:07

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 29/29 changed files
  • Comments generated: 1

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Reviewed the outstanding feedback and pushed bc8c8cf. Addressed the remaining actionable Copilot comment by adding the missing Changelog-Platform.md entry, then re-ran .\build.cmd successfully (0 warnings, 0 errors). I did not make further code changes for the older Youssef review because it reads as a discussion note ('Let's discuss offline') rather than concrete change guidance, and I skipped the already-handled localization thread because Evangelink had already replied there.

…ode-filter
# Conflicts:
#	src/Platform/Microsoft.Testing.Platform/Requests/TreeNodeFilter/TreeNodeFilter.cs
CopilotAI review requested due to automatic review settings May 23, 2026 15:18

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 30/30 changed files
  • Comments generated: 1

Comment threadsrc/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.cs.xlf Outdated
@Evangelink

Copy link
Copy Markdown
MemberAuthor

🔍 Build Failure Analysis

Summary — Build failed due to out-of-sync localization files (.xlf) after modifying the FrameworkMessages.resx resource file.

Root cause: Localization files (.xlf) out of sync with .resx changes

The PR modifies src/TestFramework/TestFramework/Resources/FrameworkMessages.resx by adding multiple new resource keys and renaming existing ones (e.g., AreEqualDeltaFailMsgAreEqualDeltaFailedSummary). While the corresponding .xlf localization files were updated in the PR, the Microsoft.DotNet.XliffTasks build validation detected that they are still out of sync with the source .resx file.

The XliffTasks validation enforces that all localization files must be perfectly synchronized with the source resource file to prevent translation drift in CI/official builds.

Affected files / errors

Resource keys modified in FrameworkMessages.resx:

  • Renamed: AreEqualDeltaFailMsgAreEqualDeltaFailedSummary
  • Renamed: AreNotEqualDeltaFailMsgAreNotEqualDeltaFailedSummary
  • Renamed: HasCountFailMsgHasCountFailedSummary
  • Renamed: IsNotEmptyFailMsgIsNotEmptyFailedSummary
  • Added: AreNotSequenceEqualInAnyOrderFailedSummary, AreNotSequenceEqualInOrderFailedSummary, AreSequenceEqualInAnyOrderFailedSummary, AreSequenceEqualInOrderFailedSummary, and many more new resource keys

Proposed fix

Run the UpdateXlf MSBuild target to regenerate all .xlf files from the source .resx file:

dotnet build src/TestFramework/TestFramework/TestFramework.csproj /t:UpdateXlf

This will update all 13 localization files:

  • FrameworkMessages.cs.xlf (Czech)
  • FrameworkMessages.de.xlf (German)
  • FrameworkMessages.es.xlf (Spanish)
  • FrameworkMessages.fr.xlf (French)
  • FrameworkMessages.it.xlf (Italian)
  • FrameworkMessages.ja.xlf (Japanese)
  • FrameworkMessages.ko.xlf (Korean)
  • FrameworkMessages.pl.xlf (Polish)
  • FrameworkMessages.pt-BR.xlf (Portuguese-Brazil)
  • FrameworkMessages.ru.xlf (Russian)
  • FrameworkMessages.tr.xlf (Turkish)
  • FrameworkMessages.zh-Hans.xlf (Simplified Chinese)
  • FrameworkMessages.zh-Hant.xlf (Traditional Chinese)

After running the command, commit the updated .xlf files and push to this PR.


Build overview

Configuration: Debug
Exit code: 1 (failure)
Failed target: Build (XliffTasks validation)
Projects affected: TestFramework.csproj (all target frameworks: net8.0, net9.0, netstandard2.0)

All MSBuild errors (3)
CodeProjectFile:LineMessage
(XliffTasks)TestFramework.csproj::net8.0Microsoft.DotNet.XliffTasks.targets:84'Resources/xlf/FrameworkMessages.cs.xlf' is out-of-date with 'Resources/FrameworkMessages.resx'. Run msbuild /t:UpdateXlf to update .xlf files...
(XliffTasks)TestFramework.csproj::net9.0Microsoft.DotNet.XliffTasks.targets:84'Resources/xlf/FrameworkMessages.cs.xlf' is out-of-date with 'Resources/FrameworkMessages.resx'. Run msbuild /t:UpdateXlf to update .xlf files...
(XliffTasks)TestFramework.csproj::netstandard2.0Microsoft.DotNet.XliffTasks.targets:84'Resources/xlf/FrameworkMessages.cs.xlf' is out-of-date with 'Resources/FrameworkMessages.resx'. Run msbuild /t:UpdateXlf to update .xlf files...

🤖 Generated by the Build Failure Analysis workflow using binlog analysis · commit 948f3bd

Generated by Build Failure Analysis for issue #7415 · ● 5.3M ·

Rename ExactMatch_DoesNotMatchAdditionalSuffixUnlessWildcardIsUsed to
LiteralSegment_RequiresWildcardToMatchNodesWithAdditionalSuffix and add an
explanatory comment so the test documents (not endorses) the surprising
behavior reported in issue #7300 where node IDs include suffixes like '()'
that literal filter segments don't match.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The earlier 'Sync FrameworkMessages XLF files after merge with main' commit
wiped existing translations and marked entries as state="new" because the
resx values in this branch were unchanged from main. This PR does not touch
FrameworkMessages.resx or AzureDevOpsResources.resx, so their xlf files
must match main. Restore them from main.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 25, 2026 11:54

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 25/25 changed files
  • Comments generated: 3

…stic
Address Copilot review feedback: also assert the original filter string is present in the exception message so the test catches regressions where the filter parameter stops being threaded into the diagnostic. Adds descriptive failure messages on both asserts.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 25, 2026 17:09

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 17/17 changed files
  • Comments generated: 0 new

@Evangelink
Amaury Levé (Evangelink) merged commit 32a2695 into mainMay 26, 2026
26 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/tree-node-filter branch May 26, 2026 08:31
Amaury Levé (Evangelink) added a commit that referenced this pull request May 28, 2026
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Amaury Levé (Evangelink) added a commit that referenced this pull request Jun 16, 2026
…MSTest changelog
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Amaury Levé (Evangelink) added a commit that referenced this pull request Jun 16, 2026
…ngelog entry
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Evangelink@Youssef1313
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix TreeNodeFilter OR-pattern diagnostics - #7415

Merged
Amaury Levé (Evangelink) merged 11 commits into
mainfrom
dev/amauryleve/tree-node-filter
May 26, 2026
Merged

Fix TreeNodeFilter OR-pattern diagnostics#7415
Amaury Levé (Evangelink) merged 11 commits into
mainfrom
dev/amauryleve/tree-node-filter

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented Feb 14, 2026

Copy link
Copy Markdown
Member

Description

Partially addresses (does not fully fix) #7300. That issue reports four broken --treenode-filter patterns; this PR only improves the diagnostics and documentation for one of them and clarifies a known matching limitation that affects the other three.

Symptoms reported in #7300

#PatternObservation
1/*/*/*/(MyTest1)Does not match a test named MyTest1
2/*/*/*/(MyTest1)|(MyTest2)Does not match either test
3/*/*/*/(MyTest1|MyTest2)Does not match either test
4(/*/*/*/MyTest1)|(/*/*/*/MyTest2)Crashes with a generic InvalidOperationException

Analysis

  • Cases 1–3 are not a parser bug: (MyTest1) and (MyTest1\|MyTest2)do match a node whose final segment is exactly MyTest1 (see the new OrExpression_WorksForSinglePathSegmentInsideParentheses test). Path segments are matched against an anchored regex ^value$, so a literal MyTest1 will not match a node whose actual ID is MyTest1() (or anything else with extra suffix). TUnit appends method-signature info to the displayed name, so the node IDs the user is actually filtering against are most likely MyTest1(), MyTest2(), etc. — which is why every pattern with a wildcard like MyTest1* "works" while every literal one does not. This is a UX mismatch (display vs. node ID), not a TreeNodeFilter parser defect. Properly resolving it requires either action in TUnit's adapter (use stable IDs that match the displayed name) or a design change to relax literal-segment matching — both are out of scope here.
  • Case 4 is a real parser bug: full-path OR like (/A/B/C/X)\|(/A/B/C/Y) hits separator processing inside parentheses and throws a generic InvalidOperationException with no guidance. This PR replaces that with an actionable message that points the user to the supported form /A/B/C/(X|Y).

Changes

  • TreeNodeFilter.cs: thread the filter string into ProcessStackOperator so the "unexpected / inside parenthesized expression" error can include the filter and a suggested fix. Add grammar remarks noting that OR over a single path segment is supported but OR over full paths is not.
  • PlatformResources.resx (+ all xlf): new TreeNodeFilterUnexpectedSlashOperatorInPathSegmentErrorMessage resource (the previous one is preserved for back-compat; tests use the new message).
  • TreeNodeFilterTests.cs: regression tests for single-segment OR (OrExpression_WorksForSinglePathSegmentInsideParentheses), for the actionable error on full-path OR (FullPathOrInsideParenthesizedExpressions_IsNotSupported_ThrowsActionableMessage), and LiteralSegment_RequiresWildcardToMatchNodesWithAdditionalSuffix which documents (with a comment) the surprising literal-vs-suffix limitation behind cases 1–3.
  • Changelog-Platform.md: entry framed as a diagnostics/docs clarification, not a behavior fix.

Validation

dotnet test Microsoft.Testing.Platform.UnitTests.csproj -c Debug --filter "FullyQualifiedName~TreeNodeFilterTests" → 46/46 passing on net9.0/net8.0/net462.

Follow-ups (not in this PR)

@Youssef1313Youssef Fahmy (Youssef1313) left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have doubts that the problem here is clarity of error message. The behavior seems buggy IMO. Let's discuss offline.

CopilotAI review requested due to automatic review settings May 16, 2026 12:20
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Merged latest main into the PR branch (was ~941 commits behind). The merge was clean with no conflicts. Verified the fix is still relevant — TreeNodeFilter.cs on main has not received an equivalent fix.

Verification:

  • Built Microsoft.Testing.Platform.csproj (Debug): 0 warnings, 0 errors.
  • Ran Microsoft.Testing.Platform.UnitTests filtered to TreeNodeFilter: 165 passed / 0 failed across net8.0, net9.0, net48.

Ready for CI re-run and review.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR clarifies TreeNodeFilter behavior for OR patterns and improves diagnostics when unsupported full-path OR expressions are parenthesized.

Changes:

  • Adds regression coverage for single-segment OR patterns and exact-match behavior.
  • Updates TreeNodeFilter grammar remarks and propagates filter text into parser error construction.
  • Improves the unexpected slash diagnostic for parenthesized full-path OR patterns.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Requests/TreeNodeFilterTests.csAdds tests for supported OR syntax and unsupported parenthesized full-path OR diagnostics.
src/Platform/Microsoft.Testing.Platform/Requests/TreeNodeFilter/TreeNodeFilter.csDocuments OR syntax limitations and augments the unexpected slash exception message.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 1

CopilotAI added 2 commits May 16, 2026 16:04
The merge of origin/main into this branch brought in many new resx entries
(IsGreaterThan, IsLessThan, IsPositive, IsNegative, IsInRange, Contains*,
DoesNotContain*, ContainsSingle, etc.). Regenerated all 13 XLF files via
'dotnet msbuild /t:UpdateXlf' to keep them in sync.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Move the inline hint diagnostic appended to TreeNodeFilterUnexpectedSlashOperatorErrorMessage into a new PlatformResources entry (TreeNodeFilterUnexpectedSlashOperatorInPathSegmentErrorMessage) so the full message is localized like the surrounding parser diagnostics. XLFs regenerated via UpdateXlf.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 16, 2026 15:07

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 29/29 changed files
  • Comments generated: 1

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Reviewed the outstanding feedback and pushed bc8c8cf. Addressed the remaining actionable Copilot comment by adding the missing Changelog-Platform.md entry, then re-ran .\build.cmd successfully (0 warnings, 0 errors). I did not make further code changes for the older Youssef review because it reads as a discussion note ('Let's discuss offline') rather than concrete change guidance, and I skipped the already-handled localization thread because Evangelink had already replied there.

…ode-filter
# Conflicts:
#	src/Platform/Microsoft.Testing.Platform/Requests/TreeNodeFilter/TreeNodeFilter.cs
CopilotAI review requested due to automatic review settings May 23, 2026 15:18

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 30/30 changed files
  • Comments generated: 1

Comment threadsrc/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.cs.xlf Outdated
@Evangelink

Copy link
Copy Markdown
MemberAuthor

🔍 Build Failure Analysis

Summary — Build failed due to out-of-sync localization files (.xlf) after modifying the FrameworkMessages.resx resource file.

Root cause: Localization files (.xlf) out of sync with .resx changes

The PR modifies src/TestFramework/TestFramework/Resources/FrameworkMessages.resx by adding multiple new resource keys and renaming existing ones (e.g., AreEqualDeltaFailMsgAreEqualDeltaFailedSummary). While the corresponding .xlf localization files were updated in the PR, the Microsoft.DotNet.XliffTasks build validation detected that they are still out of sync with the source .resx file.

The XliffTasks validation enforces that all localization files must be perfectly synchronized with the source resource file to prevent translation drift in CI/official builds.

Affected files / errors

Resource keys modified in FrameworkMessages.resx:

  • Renamed: AreEqualDeltaFailMsgAreEqualDeltaFailedSummary
  • Renamed: AreNotEqualDeltaFailMsgAreNotEqualDeltaFailedSummary
  • Renamed: HasCountFailMsgHasCountFailedSummary
  • Renamed: IsNotEmptyFailMsgIsNotEmptyFailedSummary
  • Added: AreNotSequenceEqualInAnyOrderFailedSummary, AreNotSequenceEqualInOrderFailedSummary, AreSequenceEqualInAnyOrderFailedSummary, AreSequenceEqualInOrderFailedSummary, and many more new resource keys

Proposed fix

Run the UpdateXlf MSBuild target to regenerate all .xlf files from the source .resx file:

dotnet build src/TestFramework/TestFramework/TestFramework.csproj /t:UpdateXlf

This will update all 13 localization files:

  • FrameworkMessages.cs.xlf (Czech)
  • FrameworkMessages.de.xlf (German)
  • FrameworkMessages.es.xlf (Spanish)
  • FrameworkMessages.fr.xlf (French)
  • FrameworkMessages.it.xlf (Italian)
  • FrameworkMessages.ja.xlf (Japanese)
  • FrameworkMessages.ko.xlf (Korean)
  • FrameworkMessages.pl.xlf (Polish)
  • FrameworkMessages.pt-BR.xlf (Portuguese-Brazil)
  • FrameworkMessages.ru.xlf (Russian)
  • FrameworkMessages.tr.xlf (Turkish)
  • FrameworkMessages.zh-Hans.xlf (Simplified Chinese)
  • FrameworkMessages.zh-Hant.xlf (Traditional Chinese)

After running the command, commit the updated .xlf files and push to this PR.


Build overview

Configuration: Debug
Exit code: 1 (failure)
Failed target: Build (XliffTasks validation)
Projects affected: TestFramework.csproj (all target frameworks: net8.0, net9.0, netstandard2.0)

All MSBuild errors (3)
CodeProjectFile:LineMessage
(XliffTasks)TestFramework.csproj::net8.0Microsoft.DotNet.XliffTasks.targets:84'Resources/xlf/FrameworkMessages.cs.xlf' is out-of-date with 'Resources/FrameworkMessages.resx'. Run msbuild /t:UpdateXlf to update .xlf files...
(XliffTasks)TestFramework.csproj::net9.0Microsoft.DotNet.XliffTasks.targets:84'Resources/xlf/FrameworkMessages.cs.xlf' is out-of-date with 'Resources/FrameworkMessages.resx'. Run msbuild /t:UpdateXlf to update .xlf files...
(XliffTasks)TestFramework.csproj::netstandard2.0Microsoft.DotNet.XliffTasks.targets:84'Resources/xlf/FrameworkMessages.cs.xlf' is out-of-date with 'Resources/FrameworkMessages.resx'. Run msbuild /t:UpdateXlf to update .xlf files...

🤖 Generated by the Build Failure Analysis workflow using binlog analysis · commit 948f3bd

Generated by Build Failure Analysis for issue #7415 · ● 5.3M ·

Rename ExactMatch_DoesNotMatchAdditionalSuffixUnlessWildcardIsUsed to
LiteralSegment_RequiresWildcardToMatchNodesWithAdditionalSuffix and add an
explanatory comment so the test documents (not endorses) the surprising
behavior reported in issue #7300 where node IDs include suffixes like '()'
that literal filter segments don't match.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The earlier 'Sync FrameworkMessages XLF files after merge with main' commit
wiped existing translations and marked entries as state="new" because the
resx values in this branch were unchanged from main. This PR does not touch
FrameworkMessages.resx or AzureDevOpsResources.resx, so their xlf files
must match main. Restore them from main.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 25, 2026 11:54

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 25/25 changed files
  • Comments generated: 3

…stic
Address Copilot review feedback: also assert the original filter string is present in the exception message so the test catches regressions where the filter parameter stops being threaded into the diagnostic. Adds descriptive failure messages on both asserts.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 25, 2026 17:09

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 17/17 changed files
  • Comments generated: 0 new

@Evangelink
Amaury Levé (Evangelink) merged commit 32a2695 into mainMay 26, 2026
26 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/tree-node-filter branch May 26, 2026 08:31
Amaury Levé (Evangelink) added a commit that referenced this pull request May 28, 2026
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Amaury Levé (Evangelink) added a commit that referenced this pull request Jun 16, 2026
…MSTest changelog
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Amaury Levé (Evangelink) added a commit that referenced this pull request Jun 16, 2026
…ngelog entry
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Evangelink@Youssef1313
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Fix TreeNodeFilter OR-pattern diagnostics - #7415

Merged
Amaury Levé (Evangelink) merged 11 commits into
mainfrom
dev/amauryleve/tree-node-filter
May 26, 2026
Merged

Fix TreeNodeFilter OR-pattern diagnostics#7415
Amaury Levé (Evangelink) merged 11 commits into
mainfrom
dev/amauryleve/tree-node-filter

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented Feb 14, 2026

Copy link
Copy Markdown
Member

Description

Partially addresses (does not fully fix) #7300. That issue reports four broken --treenode-filter patterns; this PR only improves the diagnostics and documentation for one of them and clarifies a known matching limitation that affects the other three.

Symptoms reported in #7300

#PatternObservation
1/*/*/*/(MyTest1)Does not match a test named MyTest1
2/*/*/*/(MyTest1)|(MyTest2)Does not match either test
3/*/*/*/(MyTest1|MyTest2)Does not match either test
4(/*/*/*/MyTest1)|(/*/*/*/MyTest2)Crashes with a generic InvalidOperationException

Analysis

  • Cases 1–3 are not a parser bug: (MyTest1) and (MyTest1\|MyTest2)do match a node whose final segment is exactly MyTest1 (see the new OrExpression_WorksForSinglePathSegmentInsideParentheses test). Path segments are matched against an anchored regex ^value$, so a literal MyTest1 will not match a node whose actual ID is MyTest1() (or anything else with extra suffix). TUnit appends method-signature info to the displayed name, so the node IDs the user is actually filtering against are most likely MyTest1(), MyTest2(), etc. — which is why every pattern with a wildcard like MyTest1* "works" while every literal one does not. This is a UX mismatch (display vs. node ID), not a TreeNodeFilter parser defect. Properly resolving it requires either action in TUnit's adapter (use stable IDs that match the displayed name) or a design change to relax literal-segment matching — both are out of scope here.
  • Case 4 is a real parser bug: full-path OR like (/A/B/C/X)\|(/A/B/C/Y) hits separator processing inside parentheses and throws a generic InvalidOperationException with no guidance. This PR replaces that with an actionable message that points the user to the supported form /A/B/C/(X|Y).

Changes

  • TreeNodeFilter.cs: thread the filter string into ProcessStackOperator so the "unexpected / inside parenthesized expression" error can include the filter and a suggested fix. Add grammar remarks noting that OR over a single path segment is supported but OR over full paths is not.
  • PlatformResources.resx (+ all xlf): new TreeNodeFilterUnexpectedSlashOperatorInPathSegmentErrorMessage resource (the previous one is preserved for back-compat; tests use the new message).
  • TreeNodeFilterTests.cs: regression tests for single-segment OR (OrExpression_WorksForSinglePathSegmentInsideParentheses), for the actionable error on full-path OR (FullPathOrInsideParenthesizedExpressions_IsNotSupported_ThrowsActionableMessage), and LiteralSegment_RequiresWildcardToMatchNodesWithAdditionalSuffix which documents (with a comment) the surprising literal-vs-suffix limitation behind cases 1–3.
  • Changelog-Platform.md: entry framed as a diagnostics/docs clarification, not a behavior fix.

Validation

dotnet test Microsoft.Testing.Platform.UnitTests.csproj -c Debug --filter "FullyQualifiedName~TreeNodeFilterTests" → 46/46 passing on net9.0/net8.0/net462.

Follow-ups (not in this PR)

@Youssef1313Youssef Fahmy (Youssef1313) left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have doubts that the problem here is clarity of error message. The behavior seems buggy IMO. Let's discuss offline.

CopilotAI review requested due to automatic review settings May 16, 2026 12:20
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Merged latest main into the PR branch (was ~941 commits behind). The merge was clean with no conflicts. Verified the fix is still relevant — TreeNodeFilter.cs on main has not received an equivalent fix.

Verification:

  • Built Microsoft.Testing.Platform.csproj (Debug): 0 warnings, 0 errors.
  • Ran Microsoft.Testing.Platform.UnitTests filtered to TreeNodeFilter: 165 passed / 0 failed across net8.0, net9.0, net48.

Ready for CI re-run and review.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR clarifies TreeNodeFilter behavior for OR patterns and improves diagnostics when unsupported full-path OR expressions are parenthesized.

Changes:

  • Adds regression coverage for single-segment OR patterns and exact-match behavior.
  • Updates TreeNodeFilter grammar remarks and propagates filter text into parser error construction.
  • Improves the unexpected slash diagnostic for parenthesized full-path OR patterns.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Requests/TreeNodeFilterTests.csAdds tests for supported OR syntax and unsupported parenthesized full-path OR diagnostics.
src/Platform/Microsoft.Testing.Platform/Requests/TreeNodeFilter/TreeNodeFilter.csDocuments OR syntax limitations and augments the unexpected slash exception message.

Copilot's findings

  • Files reviewed: 2/2 changed files
  • Comments generated: 1

CopilotAI added 2 commits May 16, 2026 16:04
The merge of origin/main into this branch brought in many new resx entries
(IsGreaterThan, IsLessThan, IsPositive, IsNegative, IsInRange, Contains*,
DoesNotContain*, ContainsSingle, etc.). Regenerated all 13 XLF files via
'dotnet msbuild /t:UpdateXlf' to keep them in sync.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Move the inline hint diagnostic appended to TreeNodeFilterUnexpectedSlashOperatorErrorMessage into a new PlatformResources entry (TreeNodeFilterUnexpectedSlashOperatorInPathSegmentErrorMessage) so the full message is localized like the surrounding parser diagnostics. XLFs regenerated via UpdateXlf.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 16, 2026 15:07

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 29/29 changed files
  • Comments generated: 1

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Reviewed the outstanding feedback and pushed bc8c8cf. Addressed the remaining actionable Copilot comment by adding the missing Changelog-Platform.md entry, then re-ran .\build.cmd successfully (0 warnings, 0 errors). I did not make further code changes for the older Youssef review because it reads as a discussion note ('Let's discuss offline') rather than concrete change guidance, and I skipped the already-handled localization thread because Evangelink had already replied there.

…ode-filter
# Conflicts:
#	src/Platform/Microsoft.Testing.Platform/Requests/TreeNodeFilter/TreeNodeFilter.cs
CopilotAI review requested due to automatic review settings May 23, 2026 15:18

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 30/30 changed files
  • Comments generated: 1

Comment threadsrc/TestFramework/TestFramework/Resources/xlf/FrameworkMessages.cs.xlf Outdated
@Evangelink

Copy link
Copy Markdown
MemberAuthor

🔍 Build Failure Analysis

Summary — Build failed due to out-of-sync localization files (.xlf) after modifying the FrameworkMessages.resx resource file.

Root cause: Localization files (.xlf) out of sync with .resx changes

The PR modifies src/TestFramework/TestFramework/Resources/FrameworkMessages.resx by adding multiple new resource keys and renaming existing ones (e.g., AreEqualDeltaFailMsgAreEqualDeltaFailedSummary). While the corresponding .xlf localization files were updated in the PR, the Microsoft.DotNet.XliffTasks build validation detected that they are still out of sync with the source .resx file.

The XliffTasks validation enforces that all localization files must be perfectly synchronized with the source resource file to prevent translation drift in CI/official builds.

Affected files / errors

Resource keys modified in FrameworkMessages.resx:

  • Renamed: AreEqualDeltaFailMsgAreEqualDeltaFailedSummary
  • Renamed: AreNotEqualDeltaFailMsgAreNotEqualDeltaFailedSummary
  • Renamed: HasCountFailMsgHasCountFailedSummary
  • Renamed: IsNotEmptyFailMsgIsNotEmptyFailedSummary
  • Added: AreNotSequenceEqualInAnyOrderFailedSummary, AreNotSequenceEqualInOrderFailedSummary, AreSequenceEqualInAnyOrderFailedSummary, AreSequenceEqualInOrderFailedSummary, and many more new resource keys

Proposed fix

Run the UpdateXlf MSBuild target to regenerate all .xlf files from the source .resx file:

dotnet build src/TestFramework/TestFramework/TestFramework.csproj /t:UpdateXlf

This will update all 13 localization files:

  • FrameworkMessages.cs.xlf (Czech)
  • FrameworkMessages.de.xlf (German)
  • FrameworkMessages.es.xlf (Spanish)
  • FrameworkMessages.fr.xlf (French)
  • FrameworkMessages.it.xlf (Italian)
  • FrameworkMessages.ja.xlf (Japanese)
  • FrameworkMessages.ko.xlf (Korean)
  • FrameworkMessages.pl.xlf (Polish)
  • FrameworkMessages.pt-BR.xlf (Portuguese-Brazil)
  • FrameworkMessages.ru.xlf (Russian)
  • FrameworkMessages.tr.xlf (Turkish)
  • FrameworkMessages.zh-Hans.xlf (Simplified Chinese)
  • FrameworkMessages.zh-Hant.xlf (Traditional Chinese)

After running the command, commit the updated .xlf files and push to this PR.


Build overview

Configuration: Debug
Exit code: 1 (failure)
Failed target: Build (XliffTasks validation)
Projects affected: TestFramework.csproj (all target frameworks: net8.0, net9.0, netstandard2.0)

All MSBuild errors (3)
CodeProjectFile:LineMessage
(XliffTasks)TestFramework.csproj::net8.0Microsoft.DotNet.XliffTasks.targets:84'Resources/xlf/FrameworkMessages.cs.xlf' is out-of-date with 'Resources/FrameworkMessages.resx'. Run msbuild /t:UpdateXlf to update .xlf files...
(XliffTasks)TestFramework.csproj::net9.0Microsoft.DotNet.XliffTasks.targets:84'Resources/xlf/FrameworkMessages.cs.xlf' is out-of-date with 'Resources/FrameworkMessages.resx'. Run msbuild /t:UpdateXlf to update .xlf files...
(XliffTasks)TestFramework.csproj::netstandard2.0Microsoft.DotNet.XliffTasks.targets:84'Resources/xlf/FrameworkMessages.cs.xlf' is out-of-date with 'Resources/FrameworkMessages.resx'. Run msbuild /t:UpdateXlf to update .xlf files...

🤖 Generated by the Build Failure Analysis workflow using binlog analysis · commit 948f3bd

Generated by Build Failure Analysis for issue #7415 · ● 5.3M ·

Rename ExactMatch_DoesNotMatchAdditionalSuffixUnlessWildcardIsUsed to
LiteralSegment_RequiresWildcardToMatchNodesWithAdditionalSuffix and add an
explanatory comment so the test documents (not endorses) the surprising
behavior reported in issue #7300 where node IDs include suffixes like '()'
that literal filter segments don't match.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The earlier 'Sync FrameworkMessages XLF files after merge with main' commit
wiped existing translations and marked entries as state="new" because the
resx values in this branch were unchanged from main. This PR does not touch
FrameworkMessages.resx or AzureDevOpsResources.resx, so their xlf files
must match main. Restore them from main.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 25, 2026 11:54

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 25/25 changed files
  • Comments generated: 3

…stic
Address Copilot review feedback: also assert the original filter string is present in the exception message so the test catches regressions where the filter parameter stops being threaded into the diagnostic. Adds descriptive failure messages on both asserts.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 25, 2026 17:09

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot's findings

  • Files reviewed: 17/17 changed files
  • Comments generated: 0 new

@Evangelink
Amaury Levé (Evangelink) merged commit 32a2695 into mainMay 26, 2026
26 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the dev/amauryleve/tree-node-filter branch May 26, 2026 08:31
Amaury Levé (Evangelink) added a commit that referenced this pull request May 28, 2026
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Amaury Levé (Evangelink) added a commit that referenced this pull request Jun 16, 2026
…MSTest changelog
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Amaury Levé (Evangelink) added a commit that referenced this pull request Jun 16, 2026
…ngelog entry
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Evangelink@Youssef1313