<?php 
 
declare(strict_types=1); 
 
namespace WsdlToPhp\PhpGenerator\Tests\Component; 
 
use InvalidArgumentException; 
use WsdlToPhp\PhpGenerator\Component\PhpClass as PhpClassComponent; 
use WsdlToPhp\PhpGenerator\Component\PhpFile as PhpFileComponent; 
use WsdlToPhp\PhpGenerator\Component\PhpInterface as PhpInterfaceComponent; 
use WsdlToPhp\PhpGenerator\Element\PhpAnnotation as PhpAnnotationElement; 
use WsdlToPhp\PhpGenerator\Element\PhpDeclare; 
use WsdlToPhp\PhpGenerator\Element\PhpFile; 
use WsdlToPhp\PhpGenerator\Element\PhpFunctionParameter as PhpFunctionParameterElement; 
use WsdlToPhp\PhpGenerator\Element\PhpProperty; 
use WsdlToPhp\PhpGenerator\Element\PhpProperty as PhpPropertyElement; 
 
/** 
 * @internal 
 * @coversDefaultClass 
 */ 
class PhpFileTest extends AbstractComponent 
{ 
    public function testGetMainElementMustBeOfPhpFileElement() 
    { 
        $class = new PhpFileComponent('Foo', true, 'stdClass'); 
 
        $this->assertInstanceOf(PhpFile::class, $class->getMainElement()); 
    } 
 
    public function testSimpleClassToString() 
    { 
        $file = new PhpFileComponent('Foo'); 
        $class = new PhpClassComponent('Foo', true, 'stdClass'); 
 
        $class 
            ->addAnnotationBlock('@var string') 
            ->addConstant('FOO', 'theValue') 
            ->addString() 
            ->addAnnotationBlock('@var string') 
            ->addConstant('BAR', 'theOtherValue') 
            ->addString() 
            ->addAnnotationBlock(new PhpAnnotationElement('var', 'int')) 
            ->addProperty('bar', 1, PhpProperty::ACCESS_PRIVATE, PhpProperty::TYPE_INT) 
            ->addString() 
            ->addAnnotationBlock(new PhpAnnotationElement('var', 'bool')) 
            ->addPropertyElement(new PhpPropertyElement('sample', true)) 
            ->addString() 
            ->addAnnotationBlock([ 
                new PhpAnnotationElement(PhpAnnotationElement::NO_NAME, 'This method is very useful'), 
                new PhpAnnotationElement('date', '2012-03-01'), 
                '@return mixed', 
            ]) 
            ->addMethod('getMyValue', [ 
                new PhpFunctionParameterElement('asString', true), 
                'unusedParameter', 
            ]) 
            ->addAnnotationBlock([ 
                new PhpAnnotationElement(PhpAnnotationElement::NO_NAME, 'This method is very useless'), 
                new PhpAnnotationElement('date', '2012-03-01'), 
                '@return void', 
            ]) 
            ->addMethod('uselessMethod', [ 
                new PhpFunctionParameterElement('uselessParameter', null), 
                'unusedParameter', 
            ]) 
        ; 
 
        $declare = (new PhpDeclare(PhpDeclare::DIRECTIVE_STRICT_TYPES, 1)) 
            ->addChild(new PhpDeclare(PhpDeclare::DIRECTIVE_ENCODING, 'UTF-8')) 
        ; 
 
        $file 
            ->setDeclareElement($declare) 
            ->setNamespace('My\\Testing\\NamespaceName') 
            ->addUse('My\\Testing\\ParentNamespace\\Model') 
            ->addUse('My\\Testing\\ParentNamespace\\Repository') 
            ->addUse('My\\Testing\\ParentNamespace\\Generator') 
            ->addUse('My\\Testing\\ParentNamespace\\Foo', 'FooType', true) 
            ->addClassComponent($class) 
        ; 
 
        $this->assertSameContent(__FUNCTION__, $file); 
    } 
 
    public function testSimpleClassToStringWithReturnType() 
    { 
        $file = new PhpFileComponent('Foo'); 
        $class = new PhpClassComponent('Foo', true, 'stdClass'); 
 
        $class 
            ->addAnnotationBlock('@var string') 
            ->addConstant('FOO', 'theValue') 
            ->addAnnotationBlock('@var string') 
            ->addConstant('BAR', 'theOtherValue') 
            ->addAnnotationBlock(new PhpAnnotationElement('var', 'int')) 
            ->addProperty('bar', 1) 
            ->addAnnotationBlock(new PhpAnnotationElement('var', 'bool')) 
            ->addPropertyElement(new PhpPropertyElement('sample', true)) 
            ->addAnnotationBlock([ 
                new PhpAnnotationElement(PhpAnnotationElement::NO_NAME, 'This method is very useful'), 
                new PhpAnnotationElement('date', '2012-03-01'), 
                '@return mixed', 
            ]) 
            ->addMethod('getMyValue', [ 
                new PhpFunctionParameterElement('asString', true), 
                'unusedParameter', 
            ]) 
            ->addAnnotationBlock([ 
                new PhpAnnotationElement(PhpAnnotationElement::NO_NAME, 'This method is very useless'), 
                new PhpAnnotationElement('date', '2012-03-01'), 
                '@return void', 
            ]) 
            ->addMethod('uselessMethod', [ 
                new PhpFunctionParameterElement('uselessParameter', null), 
                'unusedParameter', 
            ], 'void') 
            ->addMethod('getMyEntity', [ 
                new PhpFunctionParameterElement('entityId', PhpFunctionParameterElement::NO_VALUE, 'string'), 
            ], 'My\\Testing\\ParentNamespace\\Entity') 
        ; 
 
        $declare = (new PhpDeclare(PhpDeclare::DIRECTIVE_STRICT_TYPES, 1)) 
            ->addChild(new PhpDeclare(PhpDeclare::DIRECTIVE_ENCODING, 'UTF-8')) 
        ; 
 
        $file 
            ->setDeclareElement($declare) 
            ->setNamespace('My\\Testing\\NamespaceName') 
            ->addUse('My\\Testing\\ParentNamespace\\Model') 
            ->addUse('My\\Testing\\ParentNamespace\\Repository') 
            ->addUse('My\\Testing\\ParentNamespace\\Entity') 
            ->addUse('My\\Testing\\ParentNamespace\\Generator') 
            ->addUse('My\\Testing\\ParentNamespace\\Foo', 'FooType', true) 
            ->addClassComponent($class) 
        ; 
 
        $this->assertSameContent(__FUNCTION__, $file); 
    } 
 
    public function testSetMainElementWithException() 
    { 
        $this->expectException(InvalidArgumentException::class); 
 
        $file = new PhpFileComponent('Foo'); 
 
        $file->setMainElement(new PhpFunctionParameterElement('bar')); 
    } 
 
    public function testAddVariableToString() 
    { 
        $file = new PhpFileComponent('Foo'); 
 
        $file->addVariable('foo', 0); 
 
        $this->assertSame("<?php\n\$foo = 0;\n", $file->toString()); 
    } 
 
    public function testAddFunctionToString() 
    { 
        $file = new PhpFileComponent('Foo'); 
 
        $file->addFunction('name', [ 
            'bar', 
        ]); 
 
        $this->assertSame("<?php\nfunction name(\$bar)\n{\n}\n", $file->toString()); 
    } 
 
    public function testSimpleInterfaceToString() 
    { 
        $file = new PhpFileComponent('Foo'); 
        $interface = new PhpInterfaceComponent('Foo', true, null, [ 
            'stdClass', 
        ]); 
 
        $interface 
            ->addAnnotationBlock('@var string') 
            ->addConstant('FOO', 'theValue') 
            ->addAnnotationBlock('@var string') 
            ->addConstant('BAR', 'theOtherValue') 
            ->addAnnotationBlock(new PhpAnnotationElement('var', 'int')) 
            ->addProperty('bar', 1) 
            ->addAnnotationBlock(new PhpAnnotationElement('var', 'bool')) 
            ->addPropertyElement(new PhpPropertyElement('sample', true)) 
            ->addAnnotationBlock([ 
                new PhpAnnotationElement(PhpAnnotationElement::NO_NAME, 'This method is very useful'), 
                new PhpAnnotationElement('date', '2012-03-01'), 
                '@return mixed', 
            ]) 
            ->addMethod('getMyValue', [ 
                new PhpFunctionParameterElement('asString', true), 
                'unusedParameter', 
            ]) 
            ->addAnnotationBlock([ 
                new PhpAnnotationElement(PhpAnnotationElement::NO_NAME, 'This method is very useless'), 
                new PhpAnnotationElement('date', '2012-03-01'), 
                '@return void', 
            ]) 
            ->addMethod('uselessMethod', [ 
                new PhpFunctionParameterElement('uselessParameter', null), 
                'unusedParameter', 
            ]) 
        ; 
 
        $file 
            ->setDeclare(PhpDeclare::DIRECTIVE_STRICT_TYPES, 1) 
            ->setNamespace('My\\Testing\\NamespaceName') 
            ->addUse('My\\Testing\\ParentNamespace\\Model') 
            ->addUse('My\\Testing\\ParentNamespace\\Repository') 
            ->addUse('My\\Testing\\ParentNamespace\\Generator') 
            ->addUse('My\\Testing\\ParentNamespace\\Foo', 'FooType', true) 
            ->addInterfaceComponent($interface) 
        ; 
 
        $this->assertSameContent(__FUNCTION__, $file); 
    } 
} 
 
 |