Skip to content

Commit 04953a8

Browse files
authored
Merge pull request #212 from PHPCSStandards/feature/file-findextendedclassname-improve-tests
File::findExtendedClassName(): improve tests
2 parents a6bed33 + 92ca078 commit 04953a8

File tree

2 files changed

+104
-42
lines changed

2 files changed

+104
-42
lines changed
Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,32 @@
11
<?php
22

3-
namespace PHP_CodeSniffer\Tests\Core\File;
3+
/* testNotAClass */
4+
function notAClass() {}
45

5-
class testFECNClass {}
6+
/* testNonExtendedClass */
7+
class testFECNNonExtendedClass {}
68

7-
/* testExtendedClass */
9+
/* testExtendsUnqualifiedClass */
810
class testFECNExtendedClass extends testFECNClass {}
911

10-
/* testNamespacedClass */
12+
/* testExtendsFullyQualifiedClass */
1113
class testFECNNamespacedClass extends \PHP_CodeSniffer\Tests\Core\File\testFECNClass {}
1214

13-
/* testNonExtendedClass */
14-
class testFECNNonExtendedClass {}
15+
/* testExtendsPartiallyQualifiedClass */
16+
class testFECNQualifiedClass extends Core\File\RelativeClass {}
1517

16-
/* testInterface */
18+
/* testNonExtendedInterface */
1719
interface testFECNInterface {}
1820

19-
/* testInterfaceThatExtendsInterface */
21+
/* testInterfaceExtendsUnqualifiedInterface */
2022
interface testInterfaceThatExtendsInterface extends testFECNInterface{}
2123

22-
/* testInterfaceThatExtendsFQCNInterface */
24+
/* testInterfaceExtendsFullyQualifiedInterface */
2325
interface testInterfaceThatExtendsFQCNInterface extends \PHP_CodeSniffer\Tests\Core\File\testFECNInterface{}
2426

27+
/* testExtendedAnonClass */
28+
$anon = new class( $a, $b ) extends testFECNExtendedAnonClass {};
29+
2530
/* testNestedExtendedClass */
2631
class testFECNNestedExtendedClass {
2732
public function someMethod() {
@@ -35,3 +40,13 @@ class testFECNClassThatExtendsAndImplements extends testFECNClass implements Int
3540

3641
/* testClassThatImplementsAndExtends */
3742
class testFECNClassThatImplementsAndExtends implements InterfaceA, InterfaceB extends testFECNClass {}
43+
44+
/* testInterfaceMultiExtends */
45+
interface Multi extends \Package\FooInterface, \BarInterface {};
46+
47+
/* testMissingExtendsName */
48+
class testMissingExtendsName extends { /* missing classname */ } // Intentional parse error.
49+
50+
// Intentional parse error. Has to be the last test in the file.
51+
/* testParseError */
52+
class testParseError extends testFECNClass

tests/Core/File/FindExtendedClassNameTest.php

Lines changed: 80 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,39 @@ class FindExtendedClassNameTest extends AbstractMethodUnitTest
2020
{
2121

2222

23+
/**
24+
* Test getting a `false` result when a non-existent token is passed.
25+
*
26+
* @return void
27+
*/
28+
public function testNonExistentToken()
29+
{
30+
$result = self::$phpcsFile->findExtendedClassName(100000);
31+
$this->assertFalse($result);
32+
33+
}//end testNonExistentToken()
34+
35+
36+
/**
37+
* Test getting a `false` result when a token other than one of the supported tokens is passed.
38+
*
39+
* @return void
40+
*/
41+
public function testNotAClass()
42+
{
43+
$token = $this->getTargetToken('/* testNotAClass */', [T_FUNCTION]);
44+
$result = self::$phpcsFile->findExtendedClassName($token);
45+
$this->assertFalse($result);
46+
47+
}//end testNotAClass()
48+
49+
2350
/**
2451
* Test retrieving the name of the class being extended by another class
2552
* (or interface).
2653
*
27-
* @param string $identifier Comment which precedes the test case.
28-
* @param bool $expected Expected function output.
54+
* @param string $identifier Comment which precedes the test case.
55+
* @param string|false $expected Expected function output.
2956
*
3057
* @dataProvider dataExtendedClass
3158
*
@@ -45,50 +72,70 @@ public function testFindExtendedClassName($identifier, $expected)
4572
*
4673
* @see testFindExtendedClassName()
4774
*
48-
* @return array
75+
* @return array<string, array<string, string|false>>
4976
*/
5077
public function dataExtendedClass()
5178
{
5279
return [
53-
[
54-
'/* testExtendedClass */',
55-
'testFECNClass',
80+
'class does not extend' => [
81+
'identifier' => '/* testNonExtendedClass */',
82+
'expected' => false,
83+
],
84+
'class extends unqualified class' => [
85+
'identifier' => '/* testExtendsUnqualifiedClass */',
86+
'expected' => 'testFECNClass',
87+
],
88+
'class extends fully qualified class' => [
89+
'identifier' => '/* testExtendsFullyQualifiedClass */',
90+
'expected' => '\PHP_CodeSniffer\Tests\Core\File\testFECNClass',
91+
],
92+
'class extends partially qualified class' => [
93+
'identifier' => '/* testExtendsPartiallyQualifiedClass */',
94+
'expected' => 'Core\File\RelativeClass',
95+
],
96+
'interface does not extend' => [
97+
'identifier' => '/* testNonExtendedInterface */',
98+
'expected' => false,
99+
],
100+
'interface extends unqualified interface' => [
101+
'identifier' => '/* testInterfaceExtendsUnqualifiedInterface */',
102+
'expected' => 'testFECNInterface',
56103
],
57-
[
58-
'/* testNamespacedClass */',
59-
'\PHP_CodeSniffer\Tests\Core\File\testFECNClass',
104+
'interface extends fully qualified interface' => [
105+
'identifier' => '/* testInterfaceExtendsFullyQualifiedInterface */',
106+
'expected' => '\PHP_CodeSniffer\Tests\Core\File\testFECNInterface',
60107
],
61-
[
62-
'/* testNonExtendedClass */',
63-
false,
108+
'anon class extends unqualified class' => [
109+
'identifier' => '/* testExtendedAnonClass */',
110+
'expected' => 'testFECNExtendedAnonClass',
64111
],
65-
[
66-
'/* testInterface */',
67-
false,
112+
'class does not extend but contains anon class which extends' => [
113+
'identifier' => '/* testNestedExtendedClass */',
114+
'expected' => false,
68115
],
69-
[
70-
'/* testInterfaceThatExtendsInterface */',
71-
'testFECNInterface',
116+
'anon class extends, nested in non-extended class' => [
117+
'identifier' => '/* testNestedExtendedAnonClass */',
118+
'expected' => 'testFECNAnonClass',
72119
],
73-
[
74-
'/* testInterfaceThatExtendsFQCNInterface */',
75-
'\PHP_CodeSniffer\Tests\Core\File\testFECNInterface',
120+
'class extends and implements' => [
121+
'identifier' => '/* testClassThatExtendsAndImplements */',
122+
'expected' => 'testFECNClass',
76123
],
77-
[
78-
'/* testNestedExtendedClass */',
79-
false,
124+
'class implements and extends' => [
125+
'identifier' => '/* testClassThatImplementsAndExtends */',
126+
'expected' => 'testFECNClass',
80127
],
81-
[
82-
'/* testNestedExtendedAnonClass */',
83-
'testFECNAnonClass',
128+
'interface extends multiple interfaces (not supported)' => [
129+
'identifier' => '/* testInterfaceMultiExtends */',
130+
'expected' => '\Package\FooInterface',
84131
],
85-
[
86-
'/* testClassThatExtendsAndImplements */',
87-
'testFECNClass',
132+
'parse error - extends keyword, but no class name' => [
133+
'identifier' => '/* testMissingExtendsName */',
134+
'expected' => false,
88135
],
89-
[
90-
'/* testClassThatImplementsAndExtends */',
91-
'testFECNClass',
136+
'parse error - live coding - no curly braces' => [
137+
'identifier' => '/* testParseError */',
138+
'expected' => false,
92139
],
93140
];
94141

0 commit comments

Comments
 (0)