| 
<?php
 declare(strict_types=1);
 
 namespace WsdlToPhp\PhpGenerator\Tests\Element;
 
 use InvalidArgumentException;
 use TypeError;
 use WsdlToPhp\PhpGenerator\Element\PhpFunction;
 use WsdlToPhp\PhpGenerator\Element\PhpFunctionParameter;
 use WsdlToPhp\PhpGenerator\Element\PhpProperty;
 use WsdlToPhp\PhpGenerator\Element\PhpVariable;
 use WsdlToPhp\PhpGenerator\Tests\TestCase;
 
 /**
 * @internal
 * @coversDefaultClass
 */
 class PhpFunctionTest extends TestCase
 {
 public function testGetPhpDeclaration()
 {
 $function = new PhpFunction('foo', [
 'bar',
 [
 'name' => 'demo',
 'value' => 1,
 ],
 [
 'name' => 'sample',
 'value' => null,
 ],
 new PhpFunctionParameter('deamon', true),
 ]);
 
 $this->assertSame('function foo($bar, $demo = 1, $sample = null, $deamon = true)', $function->getPhpDeclaration());
 }
 
 public function testGetPhpDeclarationWithReturnType()
 {
 $function = new PhpFunction('foo', [
 'bar',
 [
 'name' => 'demo',
 'value' => 1,
 ],
 [
 'name' => 'sample',
 'value' => null,
 ],
 new PhpFunctionParameter('deamon', true),
 ], 'void');
 
 $this->assertSame('function foo($bar, $demo = 1, $sample = null, $deamon = true): void', $function->getPhpDeclaration());
 }
 
 public function testAddChild()
 {
 $this->expectException(InvalidArgumentException::class);
 
 $function = new PhpFunction('foo', []);
 
 $function->addChild(new PhpProperty('Bar'));
 }
 
 public function testSetParameters()
 {
 $this->expectException(InvalidArgumentException::class);
 
 $function = new PhpFunction('foo', []);
 
 $function->setParameters([
 new PhpFunction('bar'),
 ]);
 }
 
 public function testSetName()
 {
 $function = new PhpFunction('foo', []);
 
 $function->setName($name = 'Partagé');
 
 $this->assertSame($name, $function->getName());
 }
 
 public function testAddChildVariable()
 {
 $function = new PhpFunction('foo', []);
 
 $function->addChild(new PhpVariable('bar'));
 
 $this->assertCount(1, $function->getChildren());
 }
 
 public function testSetReturnType()
 {
 $function = new PhpFunction('foo', []);
 
 $function->setReturnType($returnType = 'int');
 
 $this->assertSame($returnType, $function->getReturnType());
 }
 
 public function testAddChildString()
 {
 $function = new PhpFunction('foo', []);
 
 $function->addChild('bar');
 
 $this->assertCount(1, $function->getChildren());
 }
 
 public function testToStringEmptyBody()
 {
 $function = new PhpFunction('foo', [
 'bar',
 [
 'name' => 'demo',
 'value' => 1,
 ],
 [
 'name' => 'sample',
 'value' => null,
 ],
 new PhpFunctionParameter('deamon', true),
 ]);
 
 $this->assertSame("function foo(\$bar, \$demo = 1, \$sample = null, \$deamon = true)\n{\n}", $function->toString());
 }
 
 public function testToStringWithBody()
 {
 $function = new PhpFunction('foo', [
 'bar',
 [
 'name' => 'demo',
 'value' => 1,
 ],
 [
 'name' => 'sample',
 'value' => null,
 ],
 new PhpFunctionParameter('deamon', true),
 ]);
 
 $function
 ->addChild(new PhpVariable('bar', 1))
 ->addChild('return $bar;')
 ;
 
 $this->assertSame("function foo(\$bar, \$demo = 1, \$sample = null, \$deamon = true)\n{\n    \$bar = 1;\n    return \$bar;\n}", $function->toString());
 }
 
 public function testToStringWithBodyWithReturnType()
 {
 $function = new PhpFunction('foo', [
 'bar',
 [
 'name' => 'demo',
 'value' => 1,
 ],
 [
 'name' => 'sample',
 'value' => null,
 ],
 new PhpFunctionParameter('deamon', true),
 ], 'int');
 
 $function
 ->addChild(new PhpVariable('bar', 1))
 ->addChild('return $bar;')
 ;
 
 $this->assertSame("function foo(\$bar, \$demo = 1, \$sample = null, \$deamon = true): int\n{\n    \$bar = 1;\n    return \$bar;\n}", $function->toString());
 }
 
 public function testToStringWithBodyWithNullableReturnType()
 {
 $function = new PhpFunction('foo', [
 'bar',
 [
 'name' => 'demo',
 'value' => 1,
 ],
 [
 'name' => 'sample',
 'value' => null,
 ],
 new PhpFunctionParameter('deamon', true),
 ], '?int');
 
 $function
 ->addChild(new PhpVariable('bar', 1))
 ->addChild('return $bar;')
 ;
 
 $this->assertSame("function foo(\$bar, \$demo = 1, \$sample = null, \$deamon = true): ?int\n{\n    \$bar = 1;\n    return \$bar;\n}", $function->toString());
 }
 
 public function testExceptionMessageOnName()
 {
 $this->expectException(TypeError::class);
 
 new PhpFunction(0);
 }
 }
 
 |