<?php 
 
declare(strict_types=1); 
 
namespace WsdlToPhp\PhpGenerator\Tests\Element; 
 
use InvalidArgumentException; 
use TypeError; 
use WsdlToPhp\PhpGenerator\Element\PhpFunctionParameter; 
use WsdlToPhp\PhpGenerator\Element\PhpInterface; 
use WsdlToPhp\PhpGenerator\Element\PhpMethod; 
use WsdlToPhp\PhpGenerator\Element\PhpVariable; 
use WsdlToPhp\PhpGenerator\Tests\TestCase; 
 
/** 
 * @internal 
 * @coversDefaultClass 
 */ 
class PhpMethodTest extends TestCase 
{ 
    public function testPublicGetPhpDeclaration() 
    { 
        $method = new PhpMethod('foo', [ 
            'bar', 
            [ 
                'name' => 'demo', 
                'value' => 1, 
            ], 
            [ 
                'name' => 'sample', 
                'value' => null, 
            ], 
            new PhpFunctionParameter('deamon', true), 
        ]); 
 
        $this->assertSame('public function foo($bar, $demo = 1, $sample = null, $deamon = true)', $method->getPhpDeclaration()); 
    } 
 
    public function testPublicGetPhpDeclarationWithReturnType() 
    { 
        $method = new PhpMethod('foo', [ 
            'bar', 
            [ 
                'name' => 'demo', 
                'value' => 1, 
            ], 
            [ 
                'name' => 'sample', 
                'value' => null, 
            ], 
            new PhpFunctionParameter('deamon', true), 
        ], 'float'); 
 
        $this->assertSame('public function foo($bar, $demo = 1, $sample = null, $deamon = true): float', $method->getPhpDeclaration()); 
    } 
 
    public function testProtectedGetPhpDeclaration() 
    { 
        $method = new PhpMethod('foo', [ 
            'bar', 
        ], null, PhpMethod::ACCESS_PROTECTED); 
 
        $this->assertSame('protected function foo($bar)', $method->getPhpDeclaration()); 
    } 
 
    public function testPrivateGetPhpDeclaration() 
    { 
        $method = new PhpMethod('foo', [ 
            'bar', 
        ], null, PhpMethod::ACCESS_PRIVATE); 
 
        $this->assertSame('private function foo($bar)', $method->getPhpDeclaration()); 
    } 
 
    public function testPublicStaticGetPhpDeclaration() 
    { 
        $method = new PhpMethod('foo', [ 
            'bar', 
        ], null, PhpMethod::ACCESS_PUBLIC, false, true); 
 
        $this->assertSame('public static function foo($bar)', $method->getPhpDeclaration()); 
    } 
 
    public function testProtectedStaticGetPhpDeclaration() 
    { 
        $method = new PhpMethod('foo', [ 
            'bar', 
        ], null, PhpMethod::ACCESS_PROTECTED, false, true); 
 
        $this->assertSame('protected static function foo($bar)', $method->getPhpDeclaration()); 
    } 
 
    public function testPublicFinalGetPhpDeclaration() 
    { 
        $method = new PhpMethod('foo', [ 
            'bar', 
        ], null, PhpMethod::ACCESS_PUBLIC, false, false, true); 
 
        $this->assertSame('final public function foo($bar)', $method->getPhpDeclaration()); 
    } 
 
    public function testAbstractPublicGetPhpDeclaration() 
    { 
        $method = new PhpMethod('foo', [ 
            'bar', 
        ], null, PhpMethod::ACCESS_PUBLIC, true); 
 
        $this->assertSame('abstract public function foo($bar);', $method->getPhpDeclaration()); 
    } 
 
    public function testEmptyBodyPublicGetPhpDeclaration() 
    { 
        $method = new PhpMethod('foo', [ 
            'bar', 
        ], null, PhpMethod::ACCESS_PUBLIC, false, false, false, false); 
 
        $this->assertSame('public function foo($bar);', $method->getPhpDeclaration()); 
    } 
 
    public function testAddChildWithException() 
    { 
        $this->expectException(InvalidArgumentException::class); 
        $this->expectExceptionMessage('Element of type "object:WsdlToPhp\PhpGenerator\Element\PhpInterface" is not authorized, please provide one of these types: string, WsdlToPhp\PhpGenerator\Element\PhpAnnotationBlock, WsdlToPhp\PhpGenerator\Element\PhpVariable'); 
 
        $method = new PhpMethod('Foo'); 
 
        $method->addChild(new PhpInterface('Bar')); 
    } 
 
    public function testGetLineBeforeChildren() 
    { 
        $method = new PhpMethod('Foo'); 
        $method->setHasBody(true); 
 
        $line = $method->getLineBeforeChildren(); 
 
        $this->assertSame('', $line); 
    } 
 
    public function testGetLineAfterChildren() 
    { 
        $method = new PhpMethod('Foo'); 
        $method->setHasBody(true); 
 
        $line = $method->getLineAfterChildren(); 
 
        $this->assertSame('', $line); 
    } 
 
    public function testAddChildString() 
    { 
        $method = new PhpMethod('Foo'); 
 
        $method->addChild("\n"); 
 
        $this->assertCount(1, $method->getChildren()); 
    } 
 
    public function testAddChildVariable() 
    { 
        $method = new PhpMethod('foo', []); 
 
        $method->addChild(new PhpVariable('bar')); 
 
        $this->assertCount(1, $method->getChildren()); 
    } 
 
    public function testPublicEmptyBodyToString() 
    { 
        $method = new PhpMethod('foo', [ 
            'bar', 
            [ 
                'name' => 'demo', 
                'value' => 1, 
            ], 
            [ 
                'name' => 'sample', 
                'value' => null, 
            ], 
            new PhpFunctionParameter('deamon', true), 
        ]); 
 
        $this->assertSame("public function foo(\$bar, \$demo = 1, \$sample = null, \$deamon = true)\n{\n}", $method->toString()); 
    } 
 
    public function testPublicEmptyBodyToStringWithReturnType() 
    { 
        $method = new PhpMethod('foo', [ 
            'bar', 
            [ 
                'name' => 'demo', 
                'value' => 1, 
            ], 
            [ 
                'name' => 'sample', 
                'value' => null, 
            ], 
            new PhpFunctionParameter('deamon', true), 
        ], 'App\\Entity'); 
 
        $this->assertSame("public function foo(\$bar, \$demo = 1, \$sample = null, \$deamon = true): App\\Entity\n{\n}", $method->toString()); 
    } 
 
    public function testPublicEmptyBodyToStringWithNullableReturnType() 
    { 
        $method = new PhpMethod('foo', [ 
            'bar', 
            [ 
                'name' => 'demo', 
                'value' => 1, 
            ], 
            [ 
                'name' => 'sample', 
                'value' => null, 
            ], 
            new PhpFunctionParameter('deamon', true), 
        ], '?App\\Entity'); 
 
        $this->assertSame("public function foo(\$bar, \$demo = 1, \$sample = null, \$deamon = true): ?App\\Entity\n{\n}", $method->toString()); 
    } 
 
    public function testPublicWithBodyToString() 
    { 
        $method = new PhpMethod('foo', [ 
            'bar', 
            [ 
                'name' => 'demo', 
                'value' => 1, 
            ], 
            [ 
                'name' => 'sample', 
                'value' => null, 
            ], 
            new PhpFunctionParameter('deamon', true), 
        ]); 
 
        $method 
            ->addChild(new PhpVariable('bar', 1)) 
            ->addChild('return $bar;') 
        ; 
 
        $this->assertSame("public function foo(\$bar, \$demo = 1, \$sample = null, \$deamon = true)\n{\n    \$bar = 1;\n    return \$bar;\n}", $method->toString()); 
    } 
 
    public function testExceptionMessageOnName() 
    { 
        $this->expectException(TypeError::class); 
 
        new PhpMethod(0); 
    } 
} 
 
 |