MacroExtensionTest.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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\CarbonInterface;
  14. use Carbon\CarbonInterval;
  15. use Carbon\PHPStan\MacroScanner;
  16. use PHPStan\Reflection\ClassReflection;
  17. use PHPStan\Reflection\ReflectionProvider;
  18. use Tests\AbstractTestCase;
  19. class MacroExtensionTest extends AbstractTestCase
  20. {
  21. private function mockReflectionProvider()
  22. {
  23. $carbonReflection = $this->createMock(ClassReflection::class);
  24. $carbonReflection->method('getName')->willReturn(Carbon::class);
  25. $carbonReflection->method('isSubclassOf')->with(CarbonInterface::class)->willReturn(true);
  26. $intervalReflection = $this->createMock(ClassReflection::class);
  27. $intervalReflection->method('getName')->willReturn(CarbonInterval::class);
  28. $intervalReflection->method('isSubclassOf')->with(CarbonInterface::class)->willReturn(false);
  29. $interfaceReflection = $this->createMock(ClassReflection::class);
  30. $interfaceReflection->method('getName')->willReturn(CarbonInterface::class);
  31. $interfaceReflection->method('isSubclassOf')->with(CarbonInterface::class)->willReturn(false);
  32. $reflectionProvider = $this->createMock(ReflectionProvider::class);
  33. $reflectionProvider->method('getClass')->willReturnCallback(
  34. function (string $className) use ($carbonReflection, $interfaceReflection, $intervalReflection) {
  35. if ($className === Carbon::class) {
  36. return $carbonReflection;
  37. }
  38. if ($className === CarbonInterface::class) {
  39. return $interfaceReflection;
  40. }
  41. if ($className === CarbonInterval::class) {
  42. return $intervalReflection;
  43. }
  44. $this->fail("Reflection received unexpected class $className");
  45. }
  46. );
  47. return $reflectionProvider;
  48. }
  49. public function testHasMacro()
  50. {
  51. $scanner = new MacroScanner($this->mockReflectionProvider());
  52. $this->assertFalse($scanner->hasMethod(Carbon::class, 'foo'));
  53. Carbon::macro('foo', function ($someArg) {
  54. });
  55. $this->assertTrue($scanner->hasMethod(Carbon::class, 'foo'));
  56. $this->assertFalse($scanner->hasMethod(CarbonInterval::class, 'foo'));
  57. $this->assertFalse($scanner->hasMethod(CarbonInterface::class, 'foo'));
  58. }
  59. public function testGetMacro()
  60. {
  61. $scanner = new MacroScanner($this->mockReflectionProvider());
  62. Carbon::macro('foo', function (): CarbonInterval {
  63. });
  64. $this->assertSame(
  65. CarbonInterval::class,
  66. $scanner->getMethod(Carbon::class, 'foo')->getReturnType()->getName()
  67. );
  68. }
  69. }