| 
<?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);
 }
 }
 
 |