SelfAccessorFixerTest.php 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. <?php
  2. declare(strict_types=1);
  3. /*
  4. * This file is part of PHP CS Fixer.
  5. *
  6. * (c) Fabien Potencier <fabien@symfony.com>
  7. * Dariusz Rumiński <dariusz.ruminski@gmail.com>
  8. *
  9. * This source file is subject to the MIT license that is bundled
  10. * with this source code in the file LICENSE.
  11. */
  12. namespace PhpCsFixer\Tests\Fixer\ClassNotation;
  13. use PhpCsFixer\Tests\Test\AbstractFixerTestCase;
  14. /**
  15. * @author Gregor Harlan <gharlan@web.de>
  16. *
  17. * @internal
  18. *
  19. * @covers \PhpCsFixer\Fixer\ClassNotation\SelfAccessorFixer
  20. */
  21. final class SelfAccessorFixerTest extends AbstractFixerTestCase
  22. {
  23. /**
  24. * @dataProvider provideFixCases
  25. */
  26. public function testFix(string $expected, ?string $input = null): void
  27. {
  28. $this->doTest($expected, $input);
  29. }
  30. public static function provideFixCases(): iterable
  31. {
  32. yield [
  33. '<?php class Foo { const BAR = self::BAZ; }',
  34. '<?php class Foo { const BAR = Foo::BAZ; }',
  35. ];
  36. yield [
  37. '<?php class Foo { private $bar = self::BAZ; }',
  38. '<?php class Foo { private $bar = fOO::BAZ; }', // case insensitive
  39. ];
  40. yield [
  41. '<?php class Foo { function bar($a = self::BAR) {} }',
  42. '<?php class Foo { function bar($a = Foo::BAR) {} }',
  43. ];
  44. yield [
  45. '<?php class Foo { function bar() { self::baz(); } }',
  46. '<?php class Foo { function bar() { Foo::baz(); } }',
  47. ];
  48. yield [
  49. '<?php class Foo { function bar() { self::class; } }',
  50. '<?php class Foo { function bar() { Foo::class; } }',
  51. ];
  52. yield [
  53. '<?php class Foo { function bar() { $x instanceof self; } }',
  54. '<?php class Foo { function bar() { $x instanceof Foo; } }',
  55. ];
  56. yield [
  57. '<?php class Foo { function bar() { new self(); } }',
  58. '<?php class Foo { function bar() { new Foo(); } }',
  59. ];
  60. yield [
  61. '<?php interface Foo { const BAR = self::BAZ; function bar($a = self::BAR); }',
  62. '<?php interface Foo { const BAR = Foo::BAZ; function bar($a = Foo::BAR); }',
  63. ];
  64. yield [
  65. '<?php class Foo { const Foo = 1; }',
  66. ];
  67. yield [
  68. '<?php class Foo { function foo() { } }',
  69. ];
  70. yield [
  71. '<?php class Foo { function bar() { new \Baz\Foo(); } }',
  72. ];
  73. yield [
  74. '<?php class Foo { function bar() { new Foo\Baz(); } }',
  75. ];
  76. yield [
  77. '<?php class Foo { function bar() { Baz\Foo::class; } }',
  78. ];
  79. yield [
  80. '<?php class Foo { function bar() { function ($a = self::BAZ) { new self(); }; } }',
  81. '<?php class Foo { function bar() { function ($a = Foo::BAZ) { new Foo(); }; } }',
  82. ];
  83. yield [
  84. // In trait "self" will reference the class it's used in, not the actual trait, so we can't replace "Foo" with "self" here
  85. '<?php trait Foo { function bar() { Foo::bar(); } } class Bar { use Foo; }',
  86. ];
  87. yield [
  88. '<?php class Foo { public function bar(self $foo, self $bar) { return new self(); } }',
  89. '<?php class Foo { public function bar(Foo $foo, Foo $bar) { return new Foo(); } }',
  90. ];
  91. yield [
  92. '<?php interface Foo { public function bar(self $foo, self $bar); }',
  93. '<?php interface Foo { public function bar(Foo $foo, Foo $bar); }',
  94. ];
  95. yield [
  96. '<?php interface Foo { public function bar(self $foo); }',
  97. '<?php interface Foo { public function bar(\Foo $foo); }',
  98. ];
  99. yield [
  100. '<?php namespace Foo; interface Bar { public function baz(\Bar $bar); }',
  101. ];
  102. yield [
  103. '<?php namespace Foo; interface Bar { public function baz(self $bar); }',
  104. '<?php namespace Foo; interface Bar { public function baz(Bar $bar); }',
  105. ];
  106. yield [
  107. '<?php namespace Foo; interface Bar { public function baz(self $bar); }',
  108. '<?php namespace Foo; interface Bar { public function baz(\Foo\Bar $bar); }',
  109. ];
  110. yield [
  111. '<?php namespace Foo; interface Bar { public function baz(Foo\Bar $bar); }',
  112. ];
  113. yield [
  114. '<?php namespace Foo; interface Bar { public function baz(Bar\Foo $bar); }',
  115. ];
  116. yield [
  117. '<?php
  118. namespace Foo\Foo2;
  119. interface Bar {
  120. public function baz00(Foo2\Bar $bar);
  121. public function baz10(\Foo2\Bar $bar);
  122. public function baz20(Foo\Foo2\Bar $bar);
  123. public function baz21(self $bar);
  124. public function baz30(Test\Foo\Foo2\Bar $bar);
  125. public function baz31(\Test\Foo\Foo2\Bar $bar);
  126. }',
  127. '<?php
  128. namespace Foo\Foo2;
  129. interface Bar {
  130. public function baz00(Foo2\Bar $bar);
  131. public function baz10(\Foo2\Bar $bar);
  132. public function baz20(Foo\Foo2\Bar $bar);
  133. public function baz21(\Foo\Foo2\Bar $bar);
  134. public function baz30(Test\Foo\Foo2\Bar $bar);
  135. public function baz31(\Test\Foo\Foo2\Bar $bar);
  136. }',
  137. ];
  138. yield [
  139. '<?php class Foo { function bar() {
  140. new class() { function baz() { new Foo(); } };
  141. } }',
  142. ];
  143. yield [
  144. '<?php class Foo { protected $foo; function bar() { return $this->foo::find(2); } }',
  145. ];
  146. yield [
  147. '<?php class Foo { public function bar(self $foo, self $bar): self { return new self(); } }',
  148. '<?php class Foo { public function bar(Foo $foo, Foo $bar): Foo { return new Foo(); } }',
  149. ];
  150. yield [
  151. '<?php interface Foo { public function bar(self $foo, self $bar): self; }',
  152. '<?php interface Foo { public function bar(Foo $foo, Foo $bar): Foo; }',
  153. ];
  154. yield [
  155. '<?php class Foo { public function bar(?self $foo, ?self $bar): ?self { return new self(); } }',
  156. '<?php class Foo { public function bar(?Foo $foo, ?Foo $bar): ?Foo { return new Foo(); } }',
  157. ];
  158. yield [
  159. "<?php interface Foo{ public function bar()\t/**/:?/**/self; }",
  160. "<?php interface Foo{ public function bar()\t/**/:?/**/Foo; }",
  161. ];
  162. }
  163. /**
  164. * @dataProvider provideFix80Cases
  165. *
  166. * @requires PHP 8.0
  167. */
  168. public function testFix80(string $expected, ?string $input = null): void
  169. {
  170. $this->doTest($expected, $input);
  171. }
  172. public static function provideFix80Cases(): iterable
  173. {
  174. yield [
  175. '<?php interface Foo { public function bar(self $foo, self $bar,): self; }',
  176. '<?php interface Foo { public function bar(Foo $foo, Foo $bar,): Foo; }',
  177. ];
  178. yield [
  179. '<?php class Foo { function bar() { $x instanceof (Foo()); } }',
  180. ];
  181. yield [
  182. '<?php class Foo { protected $foo; function bar() { return $this?->foo::find(2); } }',
  183. ];
  184. yield [
  185. '<?php class Foo { public function f(self|Bar|Baz $b) {} }',
  186. '<?php class Foo { public function f(Foo|Bar|Baz $b) {} }',
  187. ];
  188. yield [
  189. '<?php class Foo { public function f(Bar|self|Baz $b) {} }',
  190. '<?php class Foo { public function f(Bar|Foo|Baz $b) {} }',
  191. ];
  192. yield [
  193. '<?php class Foo { public function f(Bar|Baz|self $b) {} }',
  194. '<?php class Foo { public function f(Bar|Baz|Foo $b) {} }',
  195. ];
  196. yield [
  197. '<?php class Foo { public function f(Bar|Foo\C|Baz $b) {} }',
  198. ];
  199. yield [
  200. '<?php class Foo { public function f(Bar|C\Foo|Baz $b) {} }',
  201. ];
  202. }
  203. /**
  204. * @dataProvider provideFix82Cases
  205. *
  206. * @requires PHP 8.2
  207. */
  208. public function testFix82(string $expected, ?string $input = null): void
  209. {
  210. $this->doTest($expected, $input);
  211. }
  212. public static function provideFix82Cases(): iterable
  213. {
  214. yield [
  215. '<?php class Foo { public function f(self|(Bar&Baz)|Qux $b) {} }',
  216. '<?php class Foo { public function f(Foo|(Bar&Baz)|Qux $b) {} }',
  217. ];
  218. yield [
  219. '<?php class Foo { public function f(Bar|(Baz&Qux)|self $b) {} }',
  220. '<?php class Foo { public function f(Bar|(Baz&Qux)|Foo $b) {} }',
  221. ];
  222. }
  223. }