Allow unit-testing try-catch(condition) #1664
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Our CBot unit tests run in single-step mode. Our implementation of try-catch has a hack that prevents evaluation of catch conditions in single-step mode. We can't test code that we can't run.
colobot/CBot/src/CBot/CBotInstr/CBotTry.cpp
Lines 104 to 105 in e00f99f
I have removed the hack to enable unit-testing, but that caused a different problem - debugging code inside the body of try-catch became inconvenient because the player had to manually step through every catch expression after every single instruction in try body.
A solution I have found is to have the debugger automatically step over the catch expressions.Edit: I solved this by teaching CBotTry to step-over the catch conditions.The previous implementation can be found here.Edit: I have realized that the players may want to be able to debug the condition of catch(bool) too. New solution: skip the evaluation of the expression in
catch(int)
unless there was an error. This also implements CBOT enhancement proposal: untangle catch(int) and catch(bool). The previous implementation can be found here.Here is how things work now:
The debugging of code guarded by catch(int) is not impacted. The debugging of code guarded by catch(int) does become less convenient, but I don't know what else I can do to improve this.
Testing
Before
After
Before
After
Valgrind