Вход Регистрация
Файл: gapps/vendor/phpspec/prophecy/tests/Doubler/Generator/ClassMirrorTest.php
Строк: 368
<?php

namespace TestsProphecyDoublerGenerator;

use 
ProphecyDoublerGeneratorClassMirror;

class 
ClassMirrorTest extends PHPUnit_Framework_TestCase
{
    
/**
     * @test
     */
    
public function it_reflects_allowed_magic_methods()
    {
        
$class = new ReflectionClass('FixturesProphecySpecialMethods');

        
$mirror = new ClassMirror();

        
$node $mirror->reflect($class, array());

        
$this->assertCount(7$node->getMethods());
    }

    
/**
     * @test
     */
    
public function it_reflects_protected_abstract_methods()
    {
        
$class = new ReflectionClass('FixturesProphecyWithProtectedAbstractMethod');

        
$mirror = new ClassMirror();

        
$classNode $mirror->reflect($class, array());

        
$this->assertEquals('FixturesProphecyWithProtectedAbstractMethod'$classNode->getParentClass());

        
$methodNodes $classNode->getMethods();
        
$this->assertCount(1$methodNodes);

        
$this->assertEquals('protected'$methodNodes['innerDetail']->getVisibility());
    }

    
/**
     * @test
     */
    
public function it_reflects_public_static_methods()
    {
        
$class = new ReflectionClass('FixturesProphecyWithStaticMethod');

        
$mirror = new ClassMirror();

        
$classNode $mirror->reflect($class, array());

        
$this->assertEquals('FixturesProphecyWithStaticMethod'$classNode->getParentClass());

        
$methodNodes $classNode->getMethods();
        
$this->assertCount(1$methodNodes);

        
$this->assertTrue($methodNodes['innerDetail']->isStatic());
    }

    
/**
     * @test
     */
    
public function it_marks_required_args_without_types_as_not_optional()
    {
        
$class = new ReflectionClass('FixturesProphecyWithArguments');

        
$mirror = new ClassMirror();

        
$classNode $mirror->reflect($class, array());
        
$methodNode $classNode->getMethod('methodWithoutTypeHints');
        
$argNodes $methodNode->getArguments();

        
$this->assertCount(1$argNodes);

        
$this->assertEquals('arg'$argNodes[0]->getName());
        
$this->assertNull($argNodes[0]->getTypeHint());
        
$this->assertFalse($argNodes[0]->isOptional());
        
$this->assertNull($argNodes[0]->getDefault());
        
$this->assertFalse($argNodes[0]->isPassedByReference());
        
$this->assertFalse($argNodes[0]->isVariadic());
    }

    
/**
     * @test
     */
    
public function it_properly_reads_methods_arguments_with_types()
    {
        
$class = new ReflectionClass('FixturesProphecyWithArguments');

        
$mirror = new ClassMirror();

        
$classNode $mirror->reflect($class, array());
        
$methodNode $classNode->getMethod('methodWithArgs');
        
$argNodes $methodNode->getArguments();

        
$this->assertCount(3$argNodes);

        
$this->assertEquals('arg_1'$argNodes[0]->getName());
        
$this->assertEquals('array'$argNodes[0]->getTypeHint());
        
$this->assertTrue($argNodes[0]->isOptional());
        
$this->assertEquals(array(), $argNodes[0]->getDefault());
        
$this->assertFalse($argNodes[0]->isPassedByReference());
        
$this->assertFalse($argNodes[0]->isVariadic());

        
$this->assertEquals('arg_2'$argNodes[1]->getName());
        
$this->assertEquals('ArrayAccess'$argNodes[1]->getTypeHint());
        
$this->assertFalse($argNodes[1]->isOptional());

        
$this->assertEquals('arg_3'$argNodes[2]->getName());
        
$this->assertEquals('ArrayAccess'$argNodes[2]->getTypeHint());
        
$this->assertTrue($argNodes[2]->isOptional());
        
$this->assertNull($argNodes[2]->getDefault());
        
$this->assertFalse($argNodes[2]->isPassedByReference());
        
$this->assertFalse($argNodes[2]->isVariadic());
    }

    
/**
     * @test
     * @requires PHP 5.4
     */
    
public function it_properly_reads_methods_arguments_with_callable_types()
    {
        
$class = new ReflectionClass('FixturesProphecyWithCallableArgument');

        
$mirror = new ClassMirror();

        
$classNode $mirror->reflect($class, array());
        
$methodNode $classNode->getMethod('methodWithArgs');
        
$argNodes $methodNode->getArguments();

        
$this->assertCount(2$argNodes);

        
$this->assertEquals('arg_1'$argNodes[0]->getName());
        
$this->assertEquals('callable'$argNodes[0]->getTypeHint());
        
$this->assertFalse($argNodes[0]->isOptional());
        
$this->assertFalse($argNodes[0]->isPassedByReference());
        
$this->assertFalse($argNodes[0]->isVariadic());

        
$this->assertEquals('arg_2'$argNodes[1]->getName());
        
$this->assertEquals('callable'$argNodes[1]->getTypeHint());
        
$this->assertTrue($argNodes[1]->isOptional());
        
$this->assertNull($argNodes[1]->getDefault());
        
$this->assertFalse($argNodes[1]->isPassedByReference());
        
$this->assertFalse($argNodes[1]->isVariadic());
    }

    
/**
     * @test
     * @requires PHP 5.6
     */
    
public function it_properly_reads_methods_variadic_arguments()
    {
        
$class = new ReflectionClass('FixturesProphecyWithVariadicArgument');

        
$mirror = new ClassMirror();

        
$classNode $mirror->reflect($class, array());
        
$methodNode $classNode->getMethod('methodWithArgs');
        
$argNodes $methodNode->getArguments();

        
$this->assertCount(1$argNodes);

        
$this->assertEquals('args'$argNodes[0]->getName());
        
$this->assertNull($argNodes[0]->getTypeHint());
        
$this->assertFalse($argNodes[0]->isOptional());
        
$this->assertFalse($argNodes[0]->isPassedByReference());
        
$this->assertTrue($argNodes[0]->isVariadic());
    }

    
/**
     * @test
     * @requires PHP 5.6
     */
    
public function it_properly_reads_methods_typehinted_variadic_arguments()
    {
        if (
defined('HHVM_VERSION_ID')) {
            
$this->markTestSkipped('HHVM does not support typehints on variadic arguments.');
        }

        
$class = new ReflectionClass('FixturesProphecyWithTypehintedVariadicArgument');

        
$mirror = new ClassMirror();

        
$classNode $mirror->reflect($class, array());
        
$methodNode $classNode->getMethod('methodWithTypeHintedArgs');
        
$argNodes $methodNode->getArguments();

        
$this->assertCount(1$argNodes);

        
$this->assertEquals('args'$argNodes[0]->getName());
        
$this->assertEquals('array'$argNodes[0]->getTypeHint());
        
$this->assertFalse($argNodes[0]->isOptional());
        
$this->assertFalse($argNodes[0]->isPassedByReference());
        
$this->assertTrue($argNodes[0]->isVariadic());
    }

    
/**
     * @test
     */
    
public function it_marks_passed_by_reference_args_as_passed_by_reference()
    {
        
$class = new ReflectionClass('FixturesProphecyWithReferences');

        
$mirror = new ClassMirror();

        
$classNode $mirror->reflect($class, array());

        
$this->assertTrue($classNode->hasMethod('methodWithReferenceArgument'));

        
$argNodes $classNode->getMethod('methodWithReferenceArgument')->getArguments();

        
$this->assertCount(2$argNodes);

        
$this->assertTrue($argNodes[0]->isPassedByReference());
        
$this->assertTrue($argNodes[1]->isPassedByReference());
    }

    
/**
     * @test
     */
    
public function it_throws_an_exception_if_class_is_final()
    {
        
$class = new ReflectionClass('FixturesProphecyFinalClass');

        
$mirror = new ClassMirror();

        
$this->setExpectedException('ProphecyExceptionDoublerClassMirrorException');

        
$mirror->reflect($class, array());
    }

    
/**
     * @test
     */
    
public function it_ignores_final_methods()
    {
        
$class = new ReflectionClass('FixturesProphecyWithFinalMethod');

        
$mirror = new ClassMirror();

        
$classNode $mirror->reflect($class, array());

        
$this->assertCount(0$classNode->getMethods());
    }

    
/**
     * @test
     */
    
public function it_marks_final_methods_as_unextendable()
    {
        
$class = new ReflectionClass('FixturesProphecyWithFinalMethod');

        
$mirror = new ClassMirror();

        
$classNode $mirror->reflect($class, array());

        
$this->assertCount(1$classNode->getUnextendableMethods());
        
$this->assertFalse($classNode->isExtendable('finalImplementation'));
    }

    
/**
     * @test
     */
    
public function it_throws_an_exception_if_interface_provided_instead_of_class()
    {
        
$class = new ReflectionClass('FixturesProphecyEmptyInterface');

        
$mirror = new ClassMirror();

        
$this->setExpectedException('ProphecyExceptionInvalidArgumentException');

        
$mirror->reflect($class, array());
    }

    
/**
     * @test
     */
    
public function it_reflects_all_interfaces_methods()
    {
        
$mirror = new ClassMirror();

        
$classNode $mirror->reflect(null, array(
            new 
ReflectionClass('FixturesProphecyNamed'),
            new 
ReflectionClass('FixturesProphecyModifierInterface'),
        ));

        
$this->assertEquals('stdClass'$classNode->getParentClass());
        
$this->assertEquals(array(
            
'ProphecyDoublerGeneratorReflectionInterface',
            
'FixturesProphecyModifierInterface',
            
'FixturesProphecyNamed',
        ), 
$classNode->getInterfaces());

        
$this->assertCount(3$classNode->getMethods());
        
$this->assertTrue($classNode->hasMethod('getName'));
        
$this->assertTrue($classNode->hasMethod('isAbstract'));
        
$this->assertTrue($classNode->hasMethod('getVisibility'));
    }

    
/**
     * @test
     */
    
public function it_ignores_virtually_private_methods()
    {
        
$class = new ReflectionClass('FixturesProphecyWithVirtuallyPrivateMethod');

        
$mirror = new ClassMirror();

        
$classNode $mirror->reflect($class, array());

        
$this->assertCount(2$classNode->getMethods());
        
$this->assertTrue($classNode->hasMethod('isAbstract'));
        
$this->assertTrue($classNode->hasMethod('__toString'));
        
$this->assertFalse($classNode->hasMethod('_getName'));
    }

    
/**
     * @test
     */
    
public function it_does_not_throw_exception_for_virtually_private_finals()
    {
        
$class = new ReflectionClass('FixturesProphecyWithFinalVirtuallyPrivateMethod');

        
$mirror = new ClassMirror();

        
$classNode $mirror->reflect($class, array());

        
$this->assertCount(0$classNode->getMethods());
    }

    
/**
     * @test
     * @requires PHP 7
     */
    
public function it_reflects_return_typehints()
    {
        
$class = new ReflectionClass('FixturesProphecyWithReturnTypehints');

        
$mirror = new ClassMirror();

        
$classNode $mirror->reflect($class, array());

        
$this->assertCount(3$classNode->getMethods());
        
$this->assertTrue($classNode->hasMethod('getName'));
        
$this->assertTrue($classNode->hasMethod('getSelf'));
        
$this->assertTrue($classNode->hasMethod('getParent'));

        
$this->assertEquals('string'$classNode->getMethod('getName')->getReturnType());
        
$this->assertEquals('FixturesProphecyWithReturnTypehints'$classNode->getMethod('getSelf')->getReturnType());
        
$this->assertEquals('FixturesProphecyEmptyClass'$classNode->getMethod('getParent')->getReturnType());
    }

    
/**
     * @test
     */
    
public function it_throws_an_exception_if_class_provided_in_interfaces_list()
    {
        
$class = new ReflectionClass('FixturesProphecyEmptyClass');

        
$mirror = new ClassMirror();

        
$this->setExpectedException('InvalidArgumentException');

        
$mirror->reflect(null, array($class));
    }

    
/**
     * @test
     */
    
public function it_throws_an_exception_if_not_reflection_provided_as_interface()
    {
        
$mirror = new ClassMirror();

        
$this->setExpectedException('InvalidArgumentException');

        
$mirror->reflect(null, array(null));
    }

    
/**
     * @test
     */
    
public function it_doesnt_use_scalar_typehints()
    {
        
$mirror = new ClassMirror();

        
$classNode $mirror->reflect(new ReflectionClass('ReflectionMethod'), array());
        
$method $classNode->getMethod('export');
        
$arguments $method->getArguments();

        
$this->assertNull($arguments[0]->getTypeHint());
        
$this->assertNull($arguments[1]->getTypeHint());
        
$this->assertNull($arguments[2]->getTypeHint());
    }

    
/**
     * @test
     */
    
public function it_doesnt_fail_to_typehint_nonexistent_FQCN()
    {
        
$mirror = new ClassMirror();

        
$classNode $mirror->reflect(new ReflectionClass('FixturesProphecyOptionalDepsClass'), array());
        
$method $classNode->getMethod('iHaveAStrangeTypeHintedArg');
        
$arguments $method->getArguments();
        
$this->assertEquals('ISimplyAmNonexistent'$arguments[0]->getTypeHint());
    }

    
/**
     * @test
     */
    
public function it_doesnt_fail_to_typehint_nonexistent_RQCN()
    {
        
$mirror = new ClassMirror();

        
$classNode $mirror->reflect(new ReflectionClass('FixturesProphecyOptionalDepsClass'), array());
        
$method $classNode->getMethod('iHaveAnEvenStrangerTypeHintedArg');
        
$arguments $method->getArguments();
        
$this->assertEquals('ISimplyAmNot'$arguments[0]->getTypeHint());
    }

    
/**
     * @test
     */
    
function it_changes_argument_names_if_they_are_varying()
    {
        
// Use test doubles in this test, as arguments named ... in the Reflection API can only happen for internal classes
        
$class $this->prophesize('ReflectionClass');
        
$method $this->prophesize('ReflectionMethod');
        
$parameter $this->prophesize('ReflectionParameter');

        
$class->getName()->willReturn('CustomClassName');
        
$class->isInterface()->willReturn(false);
        
$class->isFinal()->willReturn(false);
        
$class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array($method));
        
$class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array());

        
$method->getParameters()->willReturn(array($parameter));
        
$method->getName()->willReturn('methodName');
        
$method->isFinal()->willReturn(false);
        
$method->isProtected()->willReturn(false);
        
$method->isStatic()->willReturn(false);
        
$method->returnsReference()->willReturn(false);

        if (
version_compare(PHP_VERSION'7.0''>=')) {
            
$method->hasReturnType()->willReturn(false);
        }

        
$parameter->getName()->willReturn('...');
        
$parameter->isDefaultValueAvailable()->willReturn(true);
        
$parameter->getDefaultValue()->willReturn(null);
        
$parameter->isPassedByReference()->willReturn(false);
        
$parameter->getClass()->willReturn($class);
        if (
version_compare(PHP_VERSION'5.6''>=')) {
            
$parameter->isVariadic()->willReturn(false);
        }

        
$mirror = new ClassMirror();

        
$classNode $mirror->reflect($class->reveal(), array());

        
$methodNodes $classNode->getMethods();

        
$argumentNodes $methodNodes['methodName']->getArguments();
        
$argumentNode $argumentNodes[0];

        
$this->assertEquals('__dot_dot_dot__'$argumentNode->getName());
    }
}
Онлайн: 0
Реклама