123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- <?php
- /**
- * SPDX-FileCopyrightText: 2016-2024 Nextcloud GmbH and Nextcloud contributors
- * SPDX-FileCopyrightText: 2016 ownCloud, Inc.
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
- namespace Test\AppFramework\Utility;
- use OC\AppFramework\Utility\ControllerMethodReflector;
- class BaseController {
- /**
- * @Annotation
- */
- public function test() {
- }
- /**
- * @Annotation
- */
- public function test2() {
- }
- /**
- * @Annotation
- */
- public function test3() {
- }
- }
- class MiddleController extends BaseController {
- /**
- * @NoAnnotation
- */
- public function test2() {
- }
- public function test3() {
- }
- /**
- * @psalm-param int<-4, 42> $rangedOne
- * @psalm-param int<min, max> $rangedTwo
- * @return void
- */
- public function test4(int $rangedOne, int $rangedTwo) {
- }
- }
- class EndController extends MiddleController {
- }
- class ControllerMethodReflectorTest extends \Test\TestCase {
- /**
- * @Annotation
- */
- public function testReadAnnotation() {
- $reader = new ControllerMethodReflector();
- $reader->reflect(
- '\Test\AppFramework\Utility\ControllerMethodReflectorTest',
- 'testReadAnnotation'
- );
- $this->assertTrue($reader->hasAnnotation('Annotation'));
- }
- /**
- * @Annotation(parameter=value)
- */
- public function testGetAnnotationParameterSingle() {
- $reader = new ControllerMethodReflector();
- $reader->reflect(
- __CLASS__,
- __FUNCTION__
- );
- $this->assertSame('value', $reader->getAnnotationParameter('Annotation', 'parameter'));
- }
- /**
- * @Annotation(parameter1=value1, parameter2=value2,parameter3=value3)
- */
- public function testGetAnnotationParameterMultiple() {
- $reader = new ControllerMethodReflector();
- $reader->reflect(
- __CLASS__,
- __FUNCTION__
- );
- $this->assertSame('value1', $reader->getAnnotationParameter('Annotation', 'parameter1'));
- $this->assertSame('value2', $reader->getAnnotationParameter('Annotation', 'parameter2'));
- $this->assertSame('value3', $reader->getAnnotationParameter('Annotation', 'parameter3'));
- }
- /**
- * @Annotation
- * @param test
- */
- public function testReadAnnotationNoLowercase() {
- $reader = new ControllerMethodReflector();
- $reader->reflect(
- '\Test\AppFramework\Utility\ControllerMethodReflectorTest',
- 'testReadAnnotationNoLowercase'
- );
- $this->assertTrue($reader->hasAnnotation('Annotation'));
- $this->assertFalse($reader->hasAnnotation('param'));
- }
- /**
- * @Annotation
- * @param int $test
- */
- public function testReadTypeIntAnnotations() {
- $reader = new ControllerMethodReflector();
- $reader->reflect(
- '\Test\AppFramework\Utility\ControllerMethodReflectorTest',
- 'testReadTypeIntAnnotations'
- );
- $this->assertEquals('int', $reader->getType('test'));
- }
- /**
- * @Annotation
- * @param int $a
- * @param int $b
- */
- public function arguments3($a, float $b, int $c, $d) {
- }
- /**
- * @requires PHP 7
- */
- public function testReadTypeIntAnnotationsScalarTypes() {
- $reader = new ControllerMethodReflector();
- $reader->reflect(
- '\Test\AppFramework\Utility\ControllerMethodReflectorTest',
- 'arguments3'
- );
- $this->assertEquals('int', $reader->getType('a'));
- $this->assertEquals('float', $reader->getType('b'));
- $this->assertEquals('int', $reader->getType('c'));
- $this->assertNull($reader->getType('d'));
- }
- /**
- * @Annotation
- * @param double $test something special
- */
- public function testReadTypeDoubleAnnotations() {
- $reader = new ControllerMethodReflector();
- $reader->reflect(
- '\Test\AppFramework\Utility\ControllerMethodReflectorTest',
- 'testReadTypeDoubleAnnotations'
- );
- $this->assertEquals('double', $reader->getType('test'));
- }
- /**
- * @Annotation
- * @param string $foo
- */
- public function testReadTypeWhitespaceAnnotations() {
- $reader = new ControllerMethodReflector();
- $reader->reflect(
- '\Test\AppFramework\Utility\ControllerMethodReflectorTest',
- 'testReadTypeWhitespaceAnnotations'
- );
- $this->assertEquals('string', $reader->getType('foo'));
- }
- public function arguments($arg, $arg2 = 'hi') {
- }
- public function testReflectParameters() {
- $reader = new ControllerMethodReflector();
- $reader->reflect(
- '\Test\AppFramework\Utility\ControllerMethodReflectorTest',
- 'arguments'
- );
- $this->assertEquals(['arg' => null, 'arg2' => 'hi'], $reader->getParameters());
- }
- public function arguments2($arg) {
- }
- public function testReflectParameters2() {
- $reader = new ControllerMethodReflector();
- $reader->reflect(
- '\Test\AppFramework\Utility\ControllerMethodReflectorTest',
- 'arguments2'
- );
- $this->assertEquals(['arg' => null], $reader->getParameters());
- }
- public function testInheritance() {
- $reader = new ControllerMethodReflector();
- $reader->reflect('Test\AppFramework\Utility\EndController', 'test');
- $this->assertTrue($reader->hasAnnotation('Annotation'));
- }
- public function testInheritanceOverride() {
- $reader = new ControllerMethodReflector();
- $reader->reflect('Test\AppFramework\Utility\EndController', 'test2');
- $this->assertTrue($reader->hasAnnotation('NoAnnotation'));
- $this->assertFalse($reader->hasAnnotation('Annotation'));
- }
- public function testInheritanceOverrideNoDocblock() {
- $reader = new ControllerMethodReflector();
- $reader->reflect('Test\AppFramework\Utility\EndController', 'test3');
- $this->assertFalse($reader->hasAnnotation('Annotation'));
- }
- public function testRangeDetection() {
- $reader = new ControllerMethodReflector();
- $reader->reflect('Test\AppFramework\Utility\EndController', 'test4');
- $rangeInfo1 = $reader->getRange('rangedOne');
- $this->assertSame(-4, $rangeInfo1['min']);
- $this->assertSame(42, $rangeInfo1['max']);
- $rangeInfo2 = $reader->getRange('rangedTwo');
- $this->assertSame(PHP_INT_MIN, $rangeInfo2['min']);
- $this->assertSame(PHP_INT_MAX, $rangeInfo2['max']);
- }
- }
|