Skip to content

Commit 3622657

Browse files
committed
Tests/IsReferenceTest: add extra tests
This adds some extra tests which were already in use in PHPCSUtils. This brings test coverage for this method up to 100%. It also cleans up the test case file a little by removing some code which isn't actually used in the tests (namespace declaration).
1 parent 21afc77 commit 3622657

File tree

2 files changed

+166
-1
lines changed

2 files changed

+166
-1
lines changed

tests/Core/File/IsReferenceTest.inc

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
<?php
22

3-
namespace PHP_CodeSniffer\Tests\Core\File;
3+
/* testTokenizerIssue1971PHPCSlt330gt271A */
4+
// This has to be the first test in the file!
5+
[&$a, [$b, /* testTokenizerIssue1971PHPCSlt330gt271B */ &$c]] = $array;
46

57
/* testBitwiseAndA */
68
error_reporting( E_NOTICE & E_STRICT );
@@ -98,6 +100,32 @@ $myValue = &$obj->getValue();
98100
/* testAssignByReferenceE */
99101
$collection = &collector();
100102

103+
/* testAssignByReferenceF */
104+
$collection ??= &collector();
105+
106+
/* testShortListAssignByReferenceNoKeyA */
107+
[
108+
&$a,
109+
/* testShortListAssignByReferenceNoKeyB */
110+
&$b,
111+
/* testNestedShortListAssignByReferenceNoKey */
112+
[$c, &$d]
113+
] = $array;
114+
115+
/* testLongListAssignByReferenceNoKeyA */
116+
list($a, &$b, list(/* testLongListAssignByReferenceNoKeyB */ &$c, /* testLongListAssignByReferenceNoKeyC */ &$d)) = $array;
117+
118+
[
119+
/* testNestedShortListAssignByReferenceWithKeyA */
120+
'a' => [&$a, $b],
121+
/* testNestedShortListAssignByReferenceWithKeyB */
122+
'b' => [$c, &$d]
123+
] = $array;
124+
125+
126+
/* testLongListAssignByReferenceWithKeyA */
127+
list(get_key()[1] => &$e) = [1, 2, 3];
128+
101129
/* testPassByReferenceA */
102130
functionCall(&$something, $somethingElse);
103131

@@ -128,6 +156,9 @@ functionCall($something, &\SomeNS\SomeClass::$somethingElse);
128156
/* testPassByReferenceJ */
129157
functionCall($something, &namespace\SomeClass::$somethingElse);
130158

159+
/* testPassByReferencePartiallyQualifiedName */
160+
functionCall($something, &Sub\Level\SomeClass::$somethingElse);
161+
131162
/* testNewByReferenceA */
132163
$foobar2 = &new Foobar();
133164

@@ -137,9 +168,27 @@ functionCall( $something , &new Foobar() );
137168
/* testUseByReference */
138169
$closure = function() use (&$var){};
139170

171+
/* testUseByReferenceWithCommentFirstParam */
172+
$closure = function() use /*comment*/ (&$this->value){};
173+
174+
/* testUseByReferenceWithCommentSecondParam */
175+
$closure = function() use /*comment*/ ($varA, &$varB){};
176+
140177
/* testArrowFunctionReturnByReference */
141178
fn&($x) => $x;
142179

180+
$closure = function (
181+
/* testBitwiseAndExactParameterA */
182+
$a = MY_CONSTANT & parent::OTHER_CONSTANT,
183+
/* testPassByReferenceExactParameterB */
184+
&$b,
185+
/* testPassByReferenceExactParameterC */
186+
&...$c,
187+
/* testBitwiseAndExactParameterD */
188+
$d = E_NOTICE & E_STRICT,
189+
) {};
190+
191+
// Issue PHPCS#3049.
143192
/* testArrowFunctionPassByReferenceA */
144193
$fn = fn(array &$one) => 1;
145194

@@ -148,3 +197,14 @@ $fn = fn($param, &...$moreParams) => 1;
148197

149198
/* testClosureReturnByReference */
150199
$closure = function &($param) use ($value) {};
200+
201+
/* testBitwiseAndArrowFunctionInDefault */
202+
$fn = fn( $one = E_NOTICE & E_STRICT) => 1;
203+
204+
/* testTokenizerIssue1284PHPCSlt280A */
205+
if ($foo) {}
206+
[&$a, /* testTokenizerIssue1284PHPCSlt280B */ &$b] = $c;
207+
208+
/* testTokenizerIssue1284PHPCSlt280C */
209+
if ($foo) {}
210+
[&$a, $b];

tests/Core/File/IsReferenceTest.php

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,19 @@ class IsReferenceTest extends AbstractMethodUnitTest
2020
{
2121

2222

23+
/**
24+
* Test that false is returned when a non-"bitwise and" token is passed.
25+
*
26+
* @return void
27+
*/
28+
public function testNotBitwiseAndToken()
29+
{
30+
$target = $this->getTargetToken('/* testBitwiseAndA */', T_STRING);
31+
$this->assertFalse(self::$phpcsFile->isReference($target));
32+
33+
}//end testNotBitwiseAndToken()
34+
35+
2336
/**
2437
* Test correctly identifying whether a "bitwise and" token is a reference or not.
2538
*
@@ -49,6 +62,14 @@ public function testIsReference($identifier, $expected)
4962
public function dataIsReference()
5063
{
5164
return [
65+
'issue-1971-list-first-in-file' => [
66+
'testMarker' => '/* testTokenizerIssue1971PHPCSlt330gt271A */',
67+
'expected' => true,
68+
],
69+
'issue-1971-list-first-in-file-nested' => [
70+
'testMarker' => '/* testTokenizerIssue1971PHPCSlt330gt271B */',
71+
'expected' => true,
72+
],
5273
'bitwise and: param in function call' => [
5374
'testMarker' => '/* testBitwiseAndA */',
5475
'expected' => false,
@@ -177,6 +198,46 @@ public function dataIsReference()
177198
'testMarker' => '/* testAssignByReferenceE */',
178199
'expected' => true,
179200
],
201+
'reference: function return value, assign by reference, null coalesce assign' => [
202+
'testMarker' => '/* testAssignByReferenceF */',
203+
'expected' => true,
204+
],
205+
'reference: unkeyed short list, first var, assign by reference' => [
206+
'testMarker' => '/* testShortListAssignByReferenceNoKeyA */',
207+
'expected' => true,
208+
],
209+
'reference: unkeyed short list, second var, assign by reference' => [
210+
'testMarker' => '/* testShortListAssignByReferenceNoKeyB */',
211+
'expected' => true,
212+
],
213+
'reference: unkeyed short list, nested var, assign by reference' => [
214+
'testMarker' => '/* testNestedShortListAssignByReferenceNoKey */',
215+
'expected' => true,
216+
],
217+
'reference: unkeyed long list, second var, assign by reference' => [
218+
'testMarker' => '/* testLongListAssignByReferenceNoKeyA */',
219+
'expected' => true,
220+
],
221+
'reference: unkeyed long list, first nested var, assign by reference' => [
222+
'testMarker' => '/* testLongListAssignByReferenceNoKeyB */',
223+
'expected' => true,
224+
],
225+
'reference: unkeyed long list, last nested var, assign by reference' => [
226+
'testMarker' => '/* testLongListAssignByReferenceNoKeyC */',
227+
'expected' => true,
228+
],
229+
'reference: keyed short list, first nested var, assign by reference' => [
230+
'testMarker' => '/* testNestedShortListAssignByReferenceWithKeyA */',
231+
'expected' => true,
232+
],
233+
'reference: keyed short list, last nested var, assign by reference' => [
234+
'testMarker' => '/* testNestedShortListAssignByReferenceWithKeyB */',
235+
'expected' => true,
236+
],
237+
'reference: keyed long list, only var, assign by reference' => [
238+
'testMarker' => '/* testLongListAssignByReferenceWithKeyA */',
239+
'expected' => true,
240+
],
180241
'reference: first param in function call, pass by reference' => [
181242
'testMarker' => '/* testPassByReferenceA */',
182243
'expected' => true,
@@ -217,6 +278,10 @@ public function dataIsReference()
217278
'testMarker' => '/* testPassByReferenceJ */',
218279
'expected' => true,
219280
],
281+
'reference: static property in function call, last with PQN, pass by reference' => [
282+
'testMarker' => '/* testPassByReferencePartiallyQualifiedName */',
283+
'expected' => true,
284+
],
220285
'reference: new by reference' => [
221286
'testMarker' => '/* testNewByReferenceA */',
222287
'expected' => true,
@@ -229,10 +294,34 @@ public function dataIsReference()
229294
'testMarker' => '/* testUseByReference */',
230295
'expected' => true,
231296
],
297+
'reference: closure use by reference, first param, with comment' => [
298+
'testMarker' => '/* testUseByReferenceWithCommentFirstParam */',
299+
'expected' => true,
300+
],
301+
'reference: closure use by reference, last param, with comment' => [
302+
'testMarker' => '/* testUseByReferenceWithCommentSecondParam */',
303+
'expected' => true,
304+
],
232305
'reference: arrow fn declared to return by reference' => [
233306
'testMarker' => '/* testArrowFunctionReturnByReference */',
234307
'expected' => true,
235308
],
309+
'bitwise and: first param default value in closure declaration' => [
310+
'testMarker' => '/* testBitwiseAndExactParameterA */',
311+
'expected' => false,
312+
],
313+
'reference: param in closure declaration, pass by reference' => [
314+
'testMarker' => '/* testPassByReferenceExactParameterB */',
315+
'expected' => true,
316+
],
317+
'reference: variadic param in closure declaration, pass by reference' => [
318+
'testMarker' => '/* testPassByReferenceExactParameterC */',
319+
'expected' => true,
320+
],
321+
'bitwise and: last param default value in closure declaration' => [
322+
'testMarker' => '/* testBitwiseAndExactParameterD */',
323+
'expected' => false,
324+
],
236325
'reference: typed param in arrow fn declaration, pass by reference' => [
237326
'testMarker' => '/* testArrowFunctionPassByReferenceA */',
238327
'expected' => true,
@@ -245,6 +334,22 @@ public function dataIsReference()
245334
'testMarker' => '/* testClosureReturnByReference */',
246335
'expected' => true,
247336
],
337+
'bitwise and: param default value in arrow fn declaration' => [
338+
'testMarker' => '/* testBitwiseAndArrowFunctionInDefault */',
339+
'expected' => false,
340+
],
341+
'issue-1284-short-list-directly-after-close-curly-control-structure' => [
342+
'testMarker' => '/* testTokenizerIssue1284PHPCSlt280A */',
343+
'expected' => true,
344+
],
345+
'issue-1284-short-list-directly-after-close-curly-control-structure-second-item' => [
346+
'testMarker' => '/* testTokenizerIssue1284PHPCSlt280B */',
347+
'expected' => true,
348+
],
349+
'issue-1284-short-array-directly-after-close-curly-control-structure' => [
350+
'testMarker' => '/* testTokenizerIssue1284PHPCSlt280C */',
351+
'expected' => true,
352+
],
248353
];
249354

250355
}//end dataIsReference()

0 commit comments

Comments
 (0)