Skip to content

Commit

Permalink
Tests/IsReferenceTest: add extra tests
Browse files Browse the repository at this point in the history
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).
  • Loading branch information
jrfnl committed Jan 2, 2024
1 parent 21afc77 commit 3622657
Show file tree
Hide file tree
Showing 2 changed files with 166 additions and 1 deletion.
62 changes: 61 additions & 1 deletion tests/Core/File/IsReferenceTest.inc
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
<?php

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

/* testBitwiseAndA */
error_reporting( E_NOTICE & E_STRICT );
Expand Down Expand Up @@ -98,6 +100,32 @@ $myValue = &$obj->getValue();
/* testAssignByReferenceE */
$collection = &collector();

/* testAssignByReferenceF */
$collection ??= &collector();

/* testShortListAssignByReferenceNoKeyA */
[
&$a,
/* testShortListAssignByReferenceNoKeyB */
&$b,
/* testNestedShortListAssignByReferenceNoKey */
[$c, &$d]
] = $array;

/* testLongListAssignByReferenceNoKeyA */
list($a, &$b, list(/* testLongListAssignByReferenceNoKeyB */ &$c, /* testLongListAssignByReferenceNoKeyC */ &$d)) = $array;

[
/* testNestedShortListAssignByReferenceWithKeyA */
'a' => [&$a, $b],
/* testNestedShortListAssignByReferenceWithKeyB */
'b' => [$c, &$d]
] = $array;


/* testLongListAssignByReferenceWithKeyA */
list(get_key()[1] => &$e) = [1, 2, 3];

/* testPassByReferenceA */
functionCall(&$something, $somethingElse);

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

/* testPassByReferencePartiallyQualifiedName */
functionCall($something, &Sub\Level\SomeClass::$somethingElse);

/* testNewByReferenceA */
$foobar2 = &new Foobar();

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

/* testUseByReferenceWithCommentFirstParam */
$closure = function() use /*comment*/ (&$this->value){};

/* testUseByReferenceWithCommentSecondParam */
$closure = function() use /*comment*/ ($varA, &$varB){};

/* testArrowFunctionReturnByReference */
fn&($x) => $x;

$closure = function (
/* testBitwiseAndExactParameterA */
$a = MY_CONSTANT & parent::OTHER_CONSTANT,
/* testPassByReferenceExactParameterB */
&$b,
/* testPassByReferenceExactParameterC */
&...$c,
/* testBitwiseAndExactParameterD */
$d = E_NOTICE & E_STRICT,
) {};

// Issue PHPCS#3049.
/* testArrowFunctionPassByReferenceA */
$fn = fn(array &$one) => 1;

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

/* testClosureReturnByReference */
$closure = function &($param) use ($value) {};

/* testBitwiseAndArrowFunctionInDefault */
$fn = fn( $one = E_NOTICE & E_STRICT) => 1;

/* testTokenizerIssue1284PHPCSlt280A */
if ($foo) {}
[&$a, /* testTokenizerIssue1284PHPCSlt280B */ &$b] = $c;

/* testTokenizerIssue1284PHPCSlt280C */
if ($foo) {}
[&$a, $b];
105 changes: 105 additions & 0 deletions tests/Core/File/IsReferenceTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,19 @@ class IsReferenceTest extends AbstractMethodUnitTest
{


/**
* Test that false is returned when a non-"bitwise and" token is passed.
*
* @return void
*/
public function testNotBitwiseAndToken()
{
$target = $this->getTargetToken('/* testBitwiseAndA */', T_STRING);
$this->assertFalse(self::$phpcsFile->isReference($target));

}//end testNotBitwiseAndToken()


/**
* Test correctly identifying whether a "bitwise and" token is a reference or not.
*
Expand Down Expand Up @@ -49,6 +62,14 @@ public function testIsReference($identifier, $expected)
public function dataIsReference()
{
return [
'issue-1971-list-first-in-file' => [
'testMarker' => '/* testTokenizerIssue1971PHPCSlt330gt271A */',
'expected' => true,
],
'issue-1971-list-first-in-file-nested' => [
'testMarker' => '/* testTokenizerIssue1971PHPCSlt330gt271B */',
'expected' => true,
],
'bitwise and: param in function call' => [
'testMarker' => '/* testBitwiseAndA */',
'expected' => false,
Expand Down Expand Up @@ -177,6 +198,46 @@ public function dataIsReference()
'testMarker' => '/* testAssignByReferenceE */',
'expected' => true,
],
'reference: function return value, assign by reference, null coalesce assign' => [
'testMarker' => '/* testAssignByReferenceF */',
'expected' => true,
],
'reference: unkeyed short list, first var, assign by reference' => [
'testMarker' => '/* testShortListAssignByReferenceNoKeyA */',
'expected' => true,
],
'reference: unkeyed short list, second var, assign by reference' => [
'testMarker' => '/* testShortListAssignByReferenceNoKeyB */',
'expected' => true,
],
'reference: unkeyed short list, nested var, assign by reference' => [
'testMarker' => '/* testNestedShortListAssignByReferenceNoKey */',
'expected' => true,
],
'reference: unkeyed long list, second var, assign by reference' => [
'testMarker' => '/* testLongListAssignByReferenceNoKeyA */',
'expected' => true,
],
'reference: unkeyed long list, first nested var, assign by reference' => [
'testMarker' => '/* testLongListAssignByReferenceNoKeyB */',
'expected' => true,
],
'reference: unkeyed long list, last nested var, assign by reference' => [
'testMarker' => '/* testLongListAssignByReferenceNoKeyC */',
'expected' => true,
],
'reference: keyed short list, first nested var, assign by reference' => [
'testMarker' => '/* testNestedShortListAssignByReferenceWithKeyA */',
'expected' => true,
],
'reference: keyed short list, last nested var, assign by reference' => [
'testMarker' => '/* testNestedShortListAssignByReferenceWithKeyB */',
'expected' => true,
],
'reference: keyed long list, only var, assign by reference' => [
'testMarker' => '/* testLongListAssignByReferenceWithKeyA */',
'expected' => true,
],
'reference: first param in function call, pass by reference' => [
'testMarker' => '/* testPassByReferenceA */',
'expected' => true,
Expand Down Expand Up @@ -217,6 +278,10 @@ public function dataIsReference()
'testMarker' => '/* testPassByReferenceJ */',
'expected' => true,
],
'reference: static property in function call, last with PQN, pass by reference' => [
'testMarker' => '/* testPassByReferencePartiallyQualifiedName */',
'expected' => true,
],
'reference: new by reference' => [
'testMarker' => '/* testNewByReferenceA */',
'expected' => true,
Expand All @@ -229,10 +294,34 @@ public function dataIsReference()
'testMarker' => '/* testUseByReference */',
'expected' => true,
],
'reference: closure use by reference, first param, with comment' => [
'testMarker' => '/* testUseByReferenceWithCommentFirstParam */',
'expected' => true,
],
'reference: closure use by reference, last param, with comment' => [
'testMarker' => '/* testUseByReferenceWithCommentSecondParam */',
'expected' => true,
],
'reference: arrow fn declared to return by reference' => [
'testMarker' => '/* testArrowFunctionReturnByReference */',
'expected' => true,
],
'bitwise and: first param default value in closure declaration' => [
'testMarker' => '/* testBitwiseAndExactParameterA */',
'expected' => false,
],
'reference: param in closure declaration, pass by reference' => [
'testMarker' => '/* testPassByReferenceExactParameterB */',
'expected' => true,
],
'reference: variadic param in closure declaration, pass by reference' => [
'testMarker' => '/* testPassByReferenceExactParameterC */',
'expected' => true,
],
'bitwise and: last param default value in closure declaration' => [
'testMarker' => '/* testBitwiseAndExactParameterD */',
'expected' => false,
],
'reference: typed param in arrow fn declaration, pass by reference' => [
'testMarker' => '/* testArrowFunctionPassByReferenceA */',
'expected' => true,
Expand All @@ -245,6 +334,22 @@ public function dataIsReference()
'testMarker' => '/* testClosureReturnByReference */',
'expected' => true,
],
'bitwise and: param default value in arrow fn declaration' => [
'testMarker' => '/* testBitwiseAndArrowFunctionInDefault */',
'expected' => false,
],
'issue-1284-short-list-directly-after-close-curly-control-structure' => [
'testMarker' => '/* testTokenizerIssue1284PHPCSlt280A */',
'expected' => true,
],
'issue-1284-short-list-directly-after-close-curly-control-structure-second-item' => [
'testMarker' => '/* testTokenizerIssue1284PHPCSlt280B */',
'expected' => true,
],
'issue-1284-short-array-directly-after-close-curly-control-structure' => [
'testMarker' => '/* testTokenizerIssue1284PHPCSlt280C */',
'expected' => true,
],
];

}//end dataIsReference()
Expand Down

0 comments on commit 3622657

Please sign in to comment.