Skip to content

Conversation

@malsyned
Copy link
Contributor

This change addresses item #4418

This changes visible behavior

The following changes are proposed:

Adds configuration setting cmake.ctest.failurePatterns, a list of regular expressions and capture group indices for matching file, line, message, expected output, and actual output from failing tests.

The purpose of this change

Populate TestMessage objects with more specific information about test failures than is available through the DEF_SOURCE_LINE property.

Other Notes/Information

I based the design of this feature around the design of Task Problem Matchers. It lacks some of the advanced features of Problem Matchers, like named patterns, pattern inheritance, multi-regexp patterns, and loops. I'm happy to add those to the implementation if needed, but I thought it better to start with the simplest thing that could work and grow it in response to feedback.

Screenshots

image

image

image

malsyned added a commit to malsyned/vscode-cmake-tools that referenced this pull request Apr 18, 2025
@gcampbell-msft
Copy link
Collaborator

@malsyned I think that this is a useful PR and is an interesting additive feature. There is also minimal risk for regression, as by default this will not perform any additional computation because the default is without this.

Before spending time reviewing, could you fix the merge conflicts?

Copy link
Collaborator

@gcampbell-msft gcampbell-msft left a comment

Choose a reason for hiding this comment

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

Could we use a more strict type than Object when defining the settings/emitters?

@malsyned
Copy link
Contributor Author

Could we use a more strict type than Object when defining the settings/emitters?

Fixed. I tightened up the corresponding schema in package.json while I was at it.

malsyned added a commit to malsyned/vscode-cmake-tools that referenced this pull request May 19, 2025
@malsyned malsyned force-pushed the failure-patterns branch from ce9c88f to 58a6a64 Compare May 19, 2025 21:55
@malsyned
Copy link
Contributor Author

malsyned commented May 19, 2025

I have been doing some work to make sure that this feature is powerful enough to match GoogleTest and GoogleMock failure patterns. I think it is. I went in thinking it might be challenging to match the fairly complicated set of expected vs. actual patterns, but actually, GoogleTest and GoogleMock provide so much additional info in their messages that would be hidden if TestMessage.actual and .expected were filled in, that I don't think I want to match them anyway.

The regexp for GoogleTest/GoogleMock is (.+?):((?:\\d|#)+): *(?:[Ff]ailure|[Ee]rror)\n+((?:.+\n)*), and it is able to match multiple failures in the same test if they are reported:
image

So, that's increased my confidence in this with its current feature set.

@malsyned
Copy link
Contributor Author

malsyned commented Jun 9, 2025

@paulmaybee @gcampbell-msft Is there anything else you all would like on this PR before you'd consider merging it?

gcampbell-msft
gcampbell-msft previously approved these changes Jun 11, 2025
Copy link
Collaborator

@gcampbell-msft gcampbell-msft left a comment

Choose a reason for hiding this comment

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

I think this is a cool feature! It seems to present very little risk for regressions of other features and is purely additive, so I think this looks good, and it seems you have done good testing.

I left just a comment or two, but overall I think this looks great!

@malsyned
Copy link
Contributor Author

I think this is a cool feature! It seems to present very little risk for regressions of other features and is purely additive, so I think this looks good, and it seems you have done good testing.

I left just a comment or two, but overall I think this looks great!

I'm glad you like it! Thanks for the review. I'll work on your comments today.

malsyned added a commit to malsyned/vscode-cmake-tools that referenced this pull request Jun 20, 2025
malsyned added a commit to malsyned/vscode-cmake-tools that referenced this pull request Jul 11, 2025
@malsyned
Copy link
Contributor Author

@gcampbell-msft just rebased this against the latest post-1.21.36 main. The only outstanding question I think is whether you want me to make cmake.ctest.failurePatterns an empty array instead of being pre-populated with some generic regexps. Other than that I think it's ready for merging if you do.

Adds configuration setting `cmake.ctest.failurePatterns`, a list of
regular expressions and capture group indices for matching file, line,
message, expected output, and actual output from failing tests. Pattern
matches are used to populate `TestMessage` objects with more specific
information than is available through the `DEF_SOURCE_LINE` property.
The string passed into `searchOutputForFailure()` has been normalized to
CRLF, so make sure the substrings produced from it also have CRLF line
endings.

https://code.visualstudio.com/api/extension-guides/testing#test-output
The package.json schema for `cmake.ctest.failurePattens` was more
lenient in some ways than the corresponding `FailurePatternsConfig`
TypeScript type. Bring them in line with each other.
Copy link
Contributor

@hanniavalera hanniavalera left a comment

Choose a reason for hiding this comment

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

@malsyned Thanks for getting this done! As to your question, I think you leaving the default patterns makes sense as it improves the user experience from the start! The patterns you've added look generic enough to work with standard error output formats without causing issues.

@hanniavalera hanniavalera enabled auto-merge (squash) October 16, 2025 16:09
@hanniavalera hanniavalera merged commit ae6f493 into microsoft:main Oct 16, 2025
4 checks passed
Sign up for free to 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