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