PhpUnitStrictFixerTest.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. <?php
  2. /*
  3. * This file is part of PHP CS Fixer.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. * Dariusz Rumiński <dariusz.ruminski@gmail.com>
  7. *
  8. * This source file is subject to the MIT license that is bundled
  9. * with this source code in the file LICENSE.
  10. */
  11. namespace PhpCsFixer\Tests\Fixer\PhpUnit;
  12. use PhpCsFixer\Tests\Test\AbstractFixerTestCase;
  13. /**
  14. * @author Dariusz Rumiński <dariusz.ruminski@gmail.com>
  15. *
  16. * @internal
  17. *
  18. * @covers \PhpCsFixer\Fixer\PhpUnit\PhpUnitStrictFixer
  19. */
  20. final class PhpUnitStrictFixerTest extends AbstractFixerTestCase
  21. {
  22. /**
  23. * @param string $expected
  24. * @param null|string $input
  25. *
  26. * @group legacy
  27. * @dataProvider provideTestFixCases
  28. * @expectedDeprecation Passing "assertions" at the root of the configuration for rule "php_unit_strict" is deprecated and will not be supported in 3.0, use "assertions" => array(...) option instead.
  29. */
  30. public function testLegacyFix($expected, $input = null)
  31. {
  32. $this->fixer->configure(array_keys($this->getMethodsMap()));
  33. $this->doTest($expected, $input);
  34. }
  35. /**
  36. * @param string $expected
  37. * @param null|string $input
  38. *
  39. * @dataProvider provideTestFixCases
  40. */
  41. public function testFix($expected, $input = null)
  42. {
  43. $this->doTest($expected, $input);
  44. $this->fixer->configure(['assertions' => array_keys($this->getMethodsMap())]);
  45. $this->doTest($expected, $input);
  46. }
  47. public function provideTestFixCases()
  48. {
  49. $cases = [
  50. ['<?php $self->foo();'],
  51. [self::generateTest('$self->foo();')],
  52. ];
  53. foreach ($this->getMethodsMap() as $methodBefore => $methodAfter) {
  54. $cases[] = [self::generateTest("\$sth->{$methodBefore}(1, 1);")];
  55. $cases[] = [self::generateTest("\$sth->{$methodAfter}(1, 1);")];
  56. $cases[] = [self::generateTest("\$this->{$methodBefore}(1, 2, 'message', \$toMuch);")];
  57. $cases[] = [
  58. self::generateTest("\$this->{$methodAfter}(1, 2);"),
  59. self::generateTest("\$this->{$methodBefore}(1, 2);"),
  60. ];
  61. $cases[] = [
  62. self::generateTest("\$this->{$methodAfter}(1, 2); \$this->{$methodAfter}(1, 2);"),
  63. self::generateTest("\$this->{$methodBefore}(1, 2); \$this->{$methodBefore}(1, 2);"),
  64. ];
  65. $cases[] = [
  66. self::generateTest("\$this->{$methodAfter}(1, 2, 'descr');"),
  67. self::generateTest("\$this->{$methodBefore}(1, 2, 'descr');"),
  68. ];
  69. $cases[] = [
  70. self::generateTest("\$this->/*aaa*/{$methodAfter} \t /**bbb*/ ( /*ccc*/1 , 2);"),
  71. self::generateTest("\$this->/*aaa*/{$methodBefore} \t /**bbb*/ ( /*ccc*/1 , 2);"),
  72. ];
  73. $cases[] = [
  74. self::generateTest("\$this->{$methodAfter}(\$expectedTokens->count() + 10, \$tokens->count() ? 10 : 20 , 'Test');"),
  75. self::generateTest("\$this->{$methodBefore}(\$expectedTokens->count() + 10, \$tokens->count() ? 10 : 20 , 'Test');"),
  76. ];
  77. $cases[] = [
  78. self::generateTest("self::{$methodAfter}(1, 2);"),
  79. self::generateTest("self::{$methodBefore}(1, 2);"),
  80. ];
  81. $cases[] = [
  82. self::generateTest("static::{$methodAfter}(1, 2);"),
  83. self::generateTest("static::{$methodBefore}(1, 2);"),
  84. ];
  85. $cases[] = [
  86. self::generateTest("STATIC::{$methodAfter}(1, 2);"),
  87. self::generateTest("STATIC::{$methodBefore}(1, 2);"),
  88. ];
  89. }
  90. return $cases;
  91. }
  92. /**
  93. * Only method calls with 2 or 3 arguments should be fixed.
  94. *
  95. * @param string $expected
  96. *
  97. * @dataProvider provideTestNoFixWithWrongNumberOfArgumentsCases
  98. */
  99. public function testNoFixWithWrongNumberOfArguments($expected)
  100. {
  101. $this->fixer->configure(['assertions' => array_keys($this->getMethodsMap())]);
  102. $this->doTest($expected);
  103. }
  104. public function provideTestNoFixWithWrongNumberOfArgumentsCases()
  105. {
  106. $cases = [];
  107. foreach ($this->getMethodsMap() as $candidate => $fix) {
  108. $cases[sprintf('do not change call to "%s" without arguments.', $candidate)] = [
  109. self::generateTest(sprintf('$this->%s();', $candidate)),
  110. ];
  111. foreach ([1, 4, 5, 10] as $argumentCount) {
  112. $cases[sprintf('do not change call to "%s" with #%d arguments.', $candidate, $argumentCount)] = [
  113. self::generateTest(
  114. sprintf(
  115. '$this->%s(%s);',
  116. $candidate,
  117. substr(str_repeat('$a, ', $argumentCount), 0, -2)
  118. )
  119. ),
  120. ];
  121. }
  122. }
  123. return $cases;
  124. }
  125. public function testInvalidConfig()
  126. {
  127. $this->expectException(\PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException::class);
  128. $this->expectExceptionMessageMatches('/^\[php_unit_strict\] Invalid configuration: The option "assertions" .*\.$/');
  129. $this->fixer->configure(['assertions' => ['__TEST__']]);
  130. }
  131. /**
  132. * @param string $expected
  133. * @param string $input
  134. *
  135. * @requires PHP 7.3
  136. * @dataProvider provideFix73Cases
  137. */
  138. public function testFix73($expected, $input)
  139. {
  140. $this->doTest($expected, $input);
  141. }
  142. public function provideFix73Cases()
  143. {
  144. foreach ($this->getMethodsMap() as $methodBefore => $methodAfter) {
  145. yield [
  146. self::generateTest("static::{$methodAfter}(1, 2,);"),
  147. self::generateTest("static::{$methodBefore}(1, 2,);"),
  148. ];
  149. yield [
  150. self::generateTest("self::{$methodAfter}(1, \$a, '', );"),
  151. self::generateTest("self::{$methodBefore}(1, \$a, '', );"),
  152. ];
  153. }
  154. }
  155. /**
  156. * @return array<string, string>
  157. */
  158. private function getMethodsMap()
  159. {
  160. return [
  161. 'assertAttributeEquals' => 'assertAttributeSame',
  162. 'assertAttributeNotEquals' => 'assertAttributeNotSame',
  163. 'assertEquals' => 'assertSame',
  164. 'assertNotEquals' => 'assertNotSame',
  165. ];
  166. }
  167. /**
  168. * @param string $content
  169. *
  170. * @return string
  171. */
  172. private static function generateTest($content)
  173. {
  174. return "<?php final class FooTest extends \\PHPUnit_Framework_TestCase {\n public function testSomething() {\n ".$content."\n }\n}\n";
  175. }
  176. }