Reflection.expandClassName.phpt 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. <?php
  2. /**
  3. * Test: Expanding class alias to FQN.
  4. */
  5. declare(strict_types=1);
  6. use Nette\Utils\Reflection;
  7. use Tester\Assert;
  8. require __DIR__ . '/../bootstrap.php';
  9. require __DIR__ . '/fixtures.reflection/expandClass.noNamespace.php';
  10. require __DIR__ . '/fixtures.reflection/expandClass.inBracketedNamespace.php';
  11. require __DIR__ . '/fixtures.reflection/expandClass.inNamespace.php';
  12. if (PHP_VERSION_ID >= 80100) {
  13. require __DIR__ . '/fixtures.reflection/expandClass.special.php';
  14. Assert::same('A\B', Reflection::expandClassName('C', new ReflectionClass(T::class)));
  15. Assert::same('A\B', Reflection::expandClassName('C', new ReflectionClass(I::class)));
  16. Assert::same('A\B', Reflection::expandClassName('C', new ReflectionClass(E::class)));
  17. }
  18. $rcTest = new ReflectionClass(Test::class);
  19. $rcBTest = new ReflectionClass(BTest::class);
  20. $rcFoo = new ReflectionClass(Test\Space\Foo::class);
  21. $rcBar = new ReflectionClass(Test\Space\Bar::class);
  22. Assert::exception(
  23. fn() => Reflection::expandClassName('', $rcTest),
  24. Nette\InvalidArgumentException::class,
  25. 'Class name must not be empty.',
  26. );
  27. Assert::exception(
  28. fn() => Reflection::expandClassName('A', new ReflectionClass(new class {
  29. })),
  30. Nette\NotImplementedException::class,
  31. 'Anonymous classes are not supported.',
  32. );
  33. Assert::same('A', Reflection::expandClassName('A', $rcTest));
  34. Assert::same('A\B', Reflection::expandClassName('C', $rcTest));
  35. Assert::same('BTest', Reflection::expandClassName('BTest', $rcBTest));
  36. Assert::same('Test\Space\Foo', Reflection::expandClassName('self', $rcFoo));
  37. Assert::same('Test\Space\Foo', Reflection::expandClassName('Self', $rcFoo));
  38. Assert::same('parent', Reflection::expandClassName('parent', $rcFoo));
  39. Assert::same('Test\Space\Foo', Reflection::expandClassName('parent', new ReflectionClass(new class extends Test\Space\Foo {
  40. })));
  41. foreach (['String', 'string', 'int', 'float', 'bool', 'array', 'callable', 'iterable', 'void', 'null'] as $type) {
  42. Assert::same(strtolower($type), Reflection::expandClassName($type, $rcFoo));
  43. }
  44. /*
  45. alias to expand => [
  46. FQN for $rcFoo,
  47. FQN for $rcBar
  48. ]
  49. */
  50. $cases = [
  51. '\Absolute' => [
  52. 'Absolute',
  53. 'Absolute',
  54. ],
  55. '\Absolute\Foo' => [
  56. 'Absolute\Foo',
  57. 'Absolute\Foo',
  58. ],
  59. 'AAA' => [
  60. 'Test\Space\AAA',
  61. 'AAA',
  62. ],
  63. 'AAA\Foo' => [
  64. 'Test\Space\AAA\Foo',
  65. 'AAA\Foo',
  66. ],
  67. 'B' => [
  68. 'Test\Space\B',
  69. 'BBB',
  70. ],
  71. 'B\Foo' => [
  72. 'Test\Space\B\Foo',
  73. 'BBB\Foo',
  74. ],
  75. 'DDD' => [
  76. 'Test\Space\DDD',
  77. 'CCC\DDD',
  78. ],
  79. 'DDD\Foo' => [
  80. 'Test\Space\DDD\Foo',
  81. 'CCC\DDD\Foo',
  82. ],
  83. 'F' => [
  84. 'Test\Space\F',
  85. 'EEE\FFF',
  86. ],
  87. 'F\Foo' => [
  88. 'Test\Space\F\Foo',
  89. 'EEE\FFF\Foo',
  90. ],
  91. 'HHH' => [
  92. 'Test\Space\HHH',
  93. 'Test\Space\HHH',
  94. ],
  95. 'Notdef' => [
  96. 'Test\Space\Notdef',
  97. 'Test\Space\Notdef',
  98. ],
  99. 'Notdef\Foo' => [
  100. 'Test\Space\Notdef\Foo',
  101. 'Test\Space\Notdef\Foo',
  102. ],
  103. // trim leading backslash
  104. 'G' => [
  105. 'Test\Space\G',
  106. 'GGG',
  107. ],
  108. 'G\Foo' => [
  109. 'Test\Space\G\Foo',
  110. 'GGG\Foo',
  111. ],
  112. ];
  113. foreach ($cases as $alias => $fqn) {
  114. Assert::same($fqn[0], Reflection::expandClassName($alias, $rcFoo));
  115. Assert::same($fqn[1], Reflection::expandClassName($alias, $rcBar));
  116. }
  117. Assert::same(
  118. ['C' => 'A\B'],
  119. Reflection::getUseStatements(new ReflectionClass('Test')),
  120. );
  121. Assert::same(
  122. [],
  123. Reflection::getUseStatements(new ReflectionClass('Test\Space\Foo')),
  124. );
  125. Assert::same(
  126. ['AAA' => 'AAA', 'B' => 'BBB', 'DDD' => 'CCC\DDD', 'F' => 'EEE\FFF', 'G' => 'GGG'],
  127. Reflection::getUseStatements(new ReflectionClass('Test\Space\Bar')),
  128. );
  129. Assert::same(
  130. [],
  131. Reflection::getUseStatements(new ReflectionClass('stdClass')),
  132. );
  133. Assert::exception(
  134. fn() => Reflection::getUseStatements(new ReflectionClass(new class {
  135. })),
  136. Nette\NotImplementedException::class,
  137. 'Anonymous classes are not supported.',
  138. );