-
-
Notifications
You must be signed in to change notification settings - Fork 73
Tests/Tokenizer: fix bug in the default
keyword tests
#850
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
Tests/Tokenizer: fix bug in the default
keyword tests
#850
Conversation
This commit fixes a bug in `RecurseScopeMapDefaultKeywordConditionsTest ::testSwitchDefault()`. Among other things, this method checks whether tokens within the scope of a `default` have `T_DEFAULT` set as the scope condition. But the code would never check if the scope condition is set for the tokens within the scope of a `T_DEFAULT` token when `$conditionStop` is not `null`. `$conditionStop` is used when `T_DEFAULT` uses curlies to open and close the scope. In those cases, scope conditions are not set all the way until the scope closer. Instead, they are set only until just before a T_BREAK|T_RETURN|T_CONTINUE. `simple_switch_default_with_curlies` test case is the only one that currently sets `$conditionStop` to something other than `null`. But it passes an offset value of the condition stop while the code was expecting an absolute value of the index of the token where the scope condition stops being set. Passing an offset meant that when `$end` was set to be equal to `$conditionStop` it would always be less than `$i` and the assertion inside the `for` loop would never run: https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/be74da1a2727948c35e8862cc378fcf9e9345b42/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapDefaultKeywordConditionsTest.php#L160-L170 Now the code calculates the correct value for `$end` when `$conditionStop` is not null. It was also necessary to update the value for `$conditionStop` in `simple_switch_default_with_curlies` as it was pointing to the wrong token. This uncovered an inconsistency in the tokenizer that might need to be addressed in a separate issue. When `T_DEFAULT` doesn't use curlies the tokenizer sets `scope_condition` for all the tokens until the token just before `T_BREAK|T_RETURN|T_CONTINUE`. But when there are curlies, `scope_condition` is set including for `T_BREAK|T_RETURN|T_CONTINUE`. It needs to be determined if this behavior is intentional or not.
I'm basing the above on this code comment: PHP_CodeSniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapDefaultKeywordConditionsTest.php Lines 192 to 195 in 2ab8974
|
tests/Core/Tokenizers/Tokenizer/RecurseScopeMapDefaultKeywordConditionsTest.php
Outdated
Show resolved
Hide resolved
tests/Core/Tokenizers/Tokenizer/RecurseScopeMapDefaultKeywordConditionsTest.php
Outdated
Show resolved
Hide resolved
Until I look into this I don't know whether this needs fixing or not (and whether it is even possible to fix), so yes, please open an issue and use the "Status: needs investigation" label. Do not mark this as a "Bug" as it is not yet determined whether it actually is one or not. Edit - this may be related to/a duplicate of: squizlabs/PHP_CodeSniffer#3794 |
Thanks for your review, @jrfnl. I implemented the changes that you suggested. Could you please take another look at this PR?
Here is the issue: #862 While creating it, I noticed that I made a mistake when describing the issue in this PR. Where I wrote |
This commit fixes a bug in `RecurseScopeMapDefaultKeywordConditionsTest ::testSwitchDefault()`. Among other things, this method checks whether tokens within the scope of a `default` have `T_DEFAULT` set as the scope condition. But the code would never check if the scope condition is set for the tokens within the scope of a `T_DEFAULT` token when `$conditionStop` is not `null`. `$conditionStop` is used when `T_DEFAULT` uses curlies to open and close the scope. In those cases, scope conditions are not set all the way until the scope closer. Instead, they are set only until just before a T_BREAK|T_RETURN|T_CONTINUE. `simple_switch_default_with_curlies` test case is the only one that currently sets `$conditionStop` to something other than `null`. But it passes an offset value of the condition stop while the code was expecting an absolute value of the index of the token where the scope condition stops being set. Passing an offset meant that when `$end` was set to be equal to `$conditionStop` it would always be less than `$i` and the assertion inside the `for` loop would never run: https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/be74da1a2727948c35e8862cc378fcf9e9345b42/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapDefaultKeywordConditionsTest.php#L160-L170 Now the code calculates the correct value for `$end` when `$conditionStop` is not null. It was also necessary to update the value for `$conditionStop` in `simple_switch_default_with_curlies` as it was pointing to the wrong token. This uncovered an inconsistency in the tokenizer that might need to be addressed in a separate issue. When `T_DEFAULT` doesn't use curlies the tokenizer sets `scope_condition` for all the tokens until the token just before `T_BREAK|T_RETURN|T_CONTINUE`. But when there are curlies, `scope_condition` is set including for `T_BREAK|T_RETURN|T_CONTINUE`. It needs to be determined if this behavior is intentional or not.
Description
This PR fixes a bug in
RecurseScopeMapDefaultKeywordConditionsTest ::testSwitchDefault()
. Among other things, this method checks whether tokens within the scope of adefault
haveT_DEFAULT
set as the scope condition.But the code would never check if the scope condition is set for the tokens within the scope of a
T_DEFAULT
token when$conditionStop
is notnull
.$conditionStop
is used whenT_DEFAULT
uses curlies to open and close the scope. In those cases, scope conditions are not set all the way until the scope closer. Instead, they are set only until just before a T_BREAK|T_RETURN|T_CONTINUE.simple_switch_default_with_curlies
test case is the only one that currently sets$conditionStop
to something other thannull
. But it passes an offset value of the condition stop while the code was expecting an absolute value of the index of the token where the scope condition stops being set. Passing an offset meant that when$end
was set to be equal to$conditionStop
it would always be less than$i
and the assertion inside thefor
loop would never run:PHP_CodeSniffer/tests/Core/Tokenizers/Tokenizer/RecurseScopeMapDefaultKeywordConditionsTest.php
Lines 160 to 170 in be74da1
Now, the code calculates the correct value for
$end
when$conditionStop
is not null. It was also necessary to update the value for$conditionStop
insimple_switch_default_with_curlies
as it was pointing to the wrong token.This uncovered an inconsistency in the tokenizer that might need to be addressed in a separate issue. When
T_DEFAULT
doesn't use curlies the tokenizer setsscope_condition
for all the tokens until the token just beforeT_BREAK|T_RETURN|T_CONTINUE
. But when there are curlies,scope_condition
is set including forT_BREAK|T_RETURN|T_CONTINUE
. It needs to be determined if this behavior is intentional or not. Let me know if I should create an issue for us to investigate this.Related issues/external references
This problem was found while working on #813.
Types of changes
PR checklist