MacroTest.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. <?php
  2. declare(strict_types=1);
  3. /**
  4. * This file is part of the Carbon package.
  5. *
  6. * (c) Brian Nesbitt <brian@nesbot.com>
  7. *
  8. * For the full copyright and license information, please view the LICENSE
  9. * file that was distributed with this source code.
  10. */
  11. namespace Tests\PHPStan;
  12. use Carbon\Carbon;
  13. use Carbon\CarbonImmutable;
  14. use Carbon\PHPStan\Macro;
  15. use ReflectionClass;
  16. use Tests\AbstractTestCase;
  17. class MacroTest extends AbstractTestCase
  18. {
  19. public function testIsStatic()
  20. {
  21. $macro = new Macro(Carbon::class, 'calendarBerlin', static function (): string {
  22. return self::this()->tz('Europe/Berlin')->calendar();
  23. });
  24. $this->assertTrue($macro->isStatic());
  25. $macro = new Macro(Carbon::class, 'calendarBerlin', function (): string {
  26. return $this->tz('Europe/Berlin')->calendar();
  27. });
  28. $this->assertFalse($macro->isStatic());
  29. }
  30. public function testGetDeclaringClass()
  31. {
  32. $macro = new Macro(Carbon::class, 'lower', 'strtolower');
  33. $this->assertSame(Carbon::class, $macro->getDeclaringClass()->getName());
  34. $macro = new Macro(CarbonImmutable::class, 'lower', 'strtolower');
  35. $this->assertSame(CarbonImmutable::class, $macro->getDeclaringClass()->getName());
  36. }
  37. public function testIsPrivate()
  38. {
  39. $macro = new Macro(Carbon::class, 'lower', 'strtolower');
  40. $this->assertFalse($macro->isPrivate());
  41. }
  42. public function testIsPublic()
  43. {
  44. $macro = new Macro(Carbon::class, 'lower', 'strtolower');
  45. $this->assertTrue($macro->isPublic());
  46. }
  47. public function testIsFinal()
  48. {
  49. $mixinClass = new class() {
  50. // Declaring final won't apply for macro, sub-class will always be able to override macros.
  51. final public static function foo(): string
  52. {
  53. return 'foo';
  54. }
  55. public static function bar(): string
  56. {
  57. return 'bar';
  58. }
  59. };
  60. $macro = new Macro(Carbon::class, 'foo', [$mixinClass, 'foo']);
  61. $this->assertFalse($macro->isFinal());
  62. $macro = new Macro(Carbon::class, 'bar', [$mixinClass, 'bar']);
  63. $this->assertFalse($macro->isFinal());
  64. }
  65. public function testIsInternal()
  66. {
  67. $macro = new Macro(Carbon::class, 'lower', 'strtolower');
  68. $this->assertFalse($macro->isInternal());
  69. }
  70. public function testIsAbstract()
  71. {
  72. $macro = new Macro(Carbon::class, 'lower', 'strtolower');
  73. $this->assertFalse($macro->isAbstract());
  74. }
  75. public function testGetDocComment()
  76. {
  77. $macro = new Macro(
  78. Carbon::class,
  79. 'foo',
  80. /**
  81. * Foo.
  82. */
  83. function () {
  84. return 'foo';
  85. }
  86. );
  87. $this->assertSame(
  88. "/**\n* Foo.\n*/",
  89. preg_replace('/^[\t ]+/m', '', $macro->getDocComment())
  90. );
  91. }
  92. public function testGetFileName()
  93. {
  94. $macro = new Macro(Carbon::class, 'foo', function () {
  95. });
  96. $this->assertSame(__FILE__, $macro->getFileName());
  97. }
  98. public function testGetName()
  99. {
  100. $macro = new Macro(Carbon::class, 'lower', 'strtolower');
  101. $this->assertSame('lower', $macro->getName());
  102. }
  103. public function testGetParameters()
  104. {
  105. $macro = new Macro(Carbon::class, 'lower', function () {
  106. });
  107. $this->assertSame([], $macro->getParameters());
  108. $macro = new Macro(Carbon::class, 'lower', function (string $a, $b = 9) {
  109. });
  110. $parameters = $macro->getParameters();
  111. $this->assertCount(2, $parameters);
  112. $this->assertSame('a', $parameters[0]->getName());
  113. $this->assertTrue($parameters[0]->hasType());
  114. $this->assertFalse($parameters[0]->isDefaultValueAvailable());
  115. $this->assertSame('string', $parameters[0]->getType()->getName());
  116. $this->assertSame('b', $parameters[1]->getName());
  117. $this->assertTrue($parameters[1]->isDefaultValueAvailable());
  118. $this->assertFalse($parameters[1]->hasType());
  119. $this->assertNull($parameters[1]->getType());
  120. $this->assertSame(9, $parameters[1]->getDefaultValue());
  121. }
  122. public function testGetReturnType()
  123. {
  124. $macro = new Macro(Carbon::class, 'lower', function () {
  125. });
  126. $this->assertNull($macro->getReturnType());
  127. $macro = new Macro(Carbon::class, 'lower', function (): Carbon {
  128. });
  129. $this->assertSame(Carbon::class, $macro->getReturnType()->getName());
  130. }
  131. public function testGetLines()
  132. {
  133. $line = __LINE__;
  134. $macro = new Macro(Carbon::class, 'foo', function () {
  135. return 'foo';
  136. });
  137. $this->assertSame($line + 1, $macro->getStartLine());
  138. $this->assertSame($line + 3, $macro->getEndLine());
  139. }
  140. public function testIsDeprecated()
  141. {
  142. $macro = new Macro(
  143. Carbon::class,
  144. 'lower',
  145. /**
  146. * @deprecated since 3.0.0
  147. */
  148. function () {
  149. }
  150. );
  151. $this->assertTrue($macro->isDeprecated()->yes());
  152. $macro = new Macro(
  153. Carbon::class,
  154. 'lower',
  155. /**
  156. * @discouraged since 3.0.0
  157. */
  158. function () {
  159. }
  160. );
  161. $this->assertFalse($macro->isDeprecated()->yes());
  162. }
  163. public function testIsVariadic()
  164. {
  165. $macro = new Macro(Carbon::class, 'lower', function (...$params) {
  166. });
  167. $this->assertTrue($macro->isVariadic());
  168. $macro = new Macro(Carbon::class, 'lower', function ($params) {
  169. });
  170. $this->assertFalse($macro->isVariadic());
  171. }
  172. public function testGetPrototype()
  173. {
  174. $macro = new Macro(Carbon::class, 'lower', function () {
  175. });
  176. $this->assertSame($macro, $macro->getPrototype());
  177. }
  178. public function testGetReflection()
  179. {
  180. require_once __DIR__.'/MixinClass.php';
  181. $mixinClass = MixinClass::class;
  182. $macro = new Macro(Carbon::class, 'foo', [$mixinClass, 'foo']);
  183. $this->assertSame(
  184. (new ReflectionClass($mixinClass))->getName(),
  185. $macro->getReflection()->getDeclaringClass()->getName()
  186. );
  187. $this->assertSame('foo', $macro->getReflection()->getName());
  188. $this->assertNull($macro->getTentativeReturnType());
  189. $this->assertTrue($macro->returnsByReference()->no());
  190. $macro = new Macro(Carbon::class, 'bar', function () {
  191. });
  192. $this->assertNull($macro->getReflection());
  193. $this->assertNull($macro->getTentativeReturnType());
  194. }
  195. }