| 
<?php
 declare(strict_types=1);
 
 namespace WsdlToPhp\PhpGenerator\Tests\Element;
 
 use InvalidArgumentException;
 use TypeError;
 use WsdlToPhp\PhpGenerator\Element\PhpAnnotationBlock;
 use WsdlToPhp\PhpGenerator\Element\PhpClass;
 use WsdlToPhp\PhpGenerator\Element\PhpConstant;
 use WsdlToPhp\PhpGenerator\Element\PhpInterface;
 use WsdlToPhp\PhpGenerator\Element\PhpMethod;
 use WsdlToPhp\PhpGenerator\Element\PhpProperty;
 use WsdlToPhp\PhpGenerator\Element\PhpVariable;
 use WsdlToPhp\PhpGenerator\Tests\TestCase;
 
 /**
 * @internal
 * @coversDefaultClass
 */
 class PhpClassTest extends TestCase
 {
 public function testGetPhpDeclarationSimpleClass()
 {
 $class = new PhpClass('Foo');
 
 $this->assertSame('class Foo', $class->getPhpDeclaration());
 }
 
 public function testGetPhpDeclarationAbstractClass()
 {
 $class = new PhpClass('Foo', true);
 
 $this->assertSame('abstract class Foo', $class->getPhpDeclaration());
 }
 
 public function testGetPhpDeclarationSimpleClassExtendsStringBar()
 {
 $class = new PhpClass('Foo', false, 'Bar');
 
 $this->assertSame('class Foo extends Bar', $class->getPhpDeclaration());
 }
 
 public function testGetPhpDeclarationAbstractClassExtendsStringBar()
 {
 $class = new PhpClass('Foo', true, 'Bar');
 
 $this->assertSame('abstract class Foo extends Bar', $class->getPhpDeclaration());
 }
 
 public function testGetPhpDeclarationSimpleClassExtendsStringBarImplementsStringDemo()
 {
 $class = new PhpClass('Foo', false, 'Bar', [
 'Demo',
 ]);
 
 $this->assertSame('class Foo extends Bar implements Demo', $class->getPhpDeclaration());
 }
 
 public function testGetPhpDeclarationSimpleClassExtendsStringBarImplementsArrayStringDemoSample()
 {
 $class = new PhpClass('Foo', false, 'Bar', [
 'Demo',
 'Sample',
 ]);
 
 $this->assertSame('class Foo extends Bar implements Demo, Sample', $class->getPhpDeclaration());
 }
 
 public function testGetPhpDeclarationAbstractClassExtendsStringBarImplementsStringDemo()
 {
 $class = new PhpClass('Foo', true, 'Bar', [
 'Demo',
 ]);
 
 $this->assertSame('abstract class Foo extends Bar implements Demo', $class->getPhpDeclaration());
 }
 
 public function testGetPhpDeclarationAbstractClassExtendsStringBarImplementsArrayStringDemoSample()
 {
 $class = new PhpClass('Foo', true, 'Bar', [
 'Demo',
 'Sample',
 ]);
 
 $this->assertSame('abstract class Foo extends Bar implements Demo, Sample', $class->getPhpDeclaration());
 }
 
 public function testGetPhpDeclarationSimpleClassExtendsStringBarImplementsPhpClassDemo()
 {
 $class = new PhpClass('Foo', false, 'Bar', [
 new PhpClass('Demo'),
 ]);
 
 $this->assertSame('class Foo extends Bar implements Demo', $class->getPhpDeclaration());
 }
 
 public function testGetPhpDeclarationSimpleClassExtendsStringBarImplementsArrayPhpClassDemoSample()
 {
 $class = new PhpClass('Foo', false, 'Bar', [
 new PhpClass('Demo'),
 new PhpClass('Sample'),
 ]);
 
 $this->assertSame('class Foo extends Bar implements Demo, Sample', $class->getPhpDeclaration());
 }
 
 public function testGetPhpDeclarationAbstractClassExtendsStringBarImplementsPhpClassDemo()
 {
 $class = new PhpClass('Foo', true, 'Bar', [
 new PhpClass('Demo'),
 ]);
 
 $this->assertSame('abstract class Foo extends Bar implements Demo', $class->getPhpDeclaration());
 }
 
 public function testGetPhpDeclarationAbstractClassExtendsStringBarImplementsArrayPhpClassDemoSample()
 {
 $class = new PhpClass('Foo', true, 'Bar', [
 new PhpClass('Demo'),
 new PhpClass('Sample'),
 ]);
 
 $this->assertSame('abstract class Foo extends Bar implements Demo, Sample', $class->getPhpDeclaration());
 }
 
 public function testAddChildWithException()
 {
 $this->expectException(InvalidArgumentException::class);
 
 $class = new PhpClass('Foo');
 
 $class->addChild(new PhpInterface('Bar'));
 }
 
 public function testSetAbstract()
 {
 $this->expectException(TypeError::class);
 
 $class = new PhpClass('Foo');
 
 $class->setAbstract(1);
 }
 
 public function testSetExtendsWithException()
 {
 $this->expectException(InvalidArgumentException::class);
 
 $class = new PhpClass('Foo');
 
 $class->setExtends(0);
 }
 
 public function testSetExtends()
 {
 $class = new PhpClass('Foo');
 
 $class->setExtends($extends = 'Partagé');
 
 $this->assertSame($extends, $class->getExtends());
 }
 
 public function testSetInterfacesWithException()
 {
 $this->expectException(InvalidArgumentException::class);
 
 $class = new PhpClass('Foo');
 
 $class->setInterfaces($interfaces = [
 0,
 ]);
 }
 
 public function testSetInterfaces()
 {
 $class = new PhpClass('Foo');
 
 $class->setInterfaces($interfaces = [
 'Partagé',
 ]);
 
 $this->assertSame($interfaces, $class->getInterfaces());
 }
 
 public function testAddChildMethod()
 {
 $class = new PhpClass('Foo');
 
 $class->addChild(new PhpMethod('Bar'));
 
 $this->assertCount(1, $class->getChildren());
 }
 
 public function testAddChildConstant()
 {
 $class = new PhpClass('Foo');
 
 $class->addChild(new PhpConstant('Bar'));
 
 $this->assertCount(1, $class->getChildren());
 }
 
 public function testAddChildAnnotationBlock()
 {
 $class = new PhpClass('Foo');
 
 $class->addChild(new PhpAnnotationBlock([
 'Bar',
 ]));
 
 $this->assertCount(1, $class->getChildren());
 }
 
 public function testAddChildProperty()
 {
 $class = new PhpClass('Foo');
 
 $class->addChild(new PhpProperty('Bar'));
 
 $this->assertCount(1, $class->getChildren());
 }
 
 public function testAddChildString()
 {
 $class = new PhpClass('Foo');
 
 $class->addChild("\n");
 
 $this->assertCount(1, $class->getChildren());
 }
 
 public function testSimpleClassEmptyBodyToString()
 {
 $class = new PhpClass('Foo');
 
 $this->assertSame("class Foo\n{\n}", $class->toString());
 }
 
 public function testSimpleClassEmptyBodyToStringMatchesStringCaasting()
 {
 $class = new PhpClass('Foo');
 
 $this->assertSame((string) $class, $class->toString());
 }
 
 public function testSimpleClassEmptyPublicMethodToString()
 {
 $class = new PhpClass('Foo');
 
 $class->addChild(new PhpMethod('bar'));
 
 $this->assertSame("class Foo\n{\n    public function bar()\n    {\n    }\n}", $class->toString());
 }
 
 public function testSimpleClassEmptyProtectedMethodToString()
 {
 $class = new PhpClass('Foo');
 
 $class->addChild(new PhpMethod('bar', [], null, PhpMethod::ACCESS_PROTECTED));
 
 $this->assertSame("class Foo\n{\n    protected function bar()\n    {\n    }\n}", $class->toString());
 }
 
 public function testSimpleClassEmptyPrivateMethodToString()
 {
 $class = new PhpClass('Foo');
 
 $class->addChild(new PhpMethod('bar', [], null, PhpMethod::ACCESS_PRIVATE));
 
 $this->assertSame("class Foo\n{\n    private function bar()\n    {\n    }\n}", $class->toString());
 }
 
 public function testSimpleClassPublicMethodToString()
 {
 $class = new PhpClass('Foo');
 
 $method = new PhpMethod('bar', [
 'bar',
 'foo',
 'sample',
 ], null, PhpMethod::ACCESS_PRIVATE);
 $method->addChild(new PhpVariable('foo', 1));
 $class->addChild($method);
 
 $this->assertSame("class Foo\n{\n    private function bar(\$bar, \$foo, \$sample)\n    {\n        \$foo = 1;\n    }\n}", $class->toString());
 }
 
 public function testExtendsFromNamespace()
 {
 $class = new PhpClass('Foo', false, '\\DOMDocument');
 
 $this->assertSame("class Foo extends \\DOMDocument\n{\n}", $class->toString());
 }
 
 public function testExceptionMessageOnName()
 {
 $this->expectException(TypeError::class);
 
 new PhpClass(0);
 }
 }
 
 |