converted unit tests from lime to PHPUnit for the following components: Console, DependencyInjection, EventDispatcher, OutputEscaper, and Yaml

This commit is contained in:
Fabien Potencier 2010-03-18 08:48:03 +01:00
parent 7f0ace8521
commit 13edcf64e2
91 changed files with 5032 additions and 4503 deletions

View File

@ -0,0 +1,330 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\Console;
require_once __DIR__.'/../../bootstrap.php';
use Symfony\Components\Console\Application;
use Symfony\Components\Console\Input\ArrayInput;
use Symfony\Components\Console\Output\Output;
use Symfony\Components\Console\Output\StreamOutput;
use Symfony\Components\Console\Tester\ApplicationTester;
class ApplicationTest extends \PHPUnit_Framework_TestCase
{
static protected $fixturesPath;
static public function setUpBeforeClass()
{
self::$fixturesPath = realpath(__DIR__.'/../../../../fixtures/Symfony/Components/Console/');
require_once self::$fixturesPath.'/FooCommand.php';
require_once self::$fixturesPath.'/Foo1Command.php';
require_once self::$fixturesPath.'/Foo2Command.php';
}
public function testConstructor()
{
$application = new Application('foo', 'bar');
$this->assertEquals($application->getName(), 'foo', '__construct() takes the application name as its first argument');
$this->assertEquals($application->getVersion(), 'bar', '__construct() takes the application version as its first argument');
$this->assertEquals(array_keys($application->getCommands()), array('help', 'list'), '__construct() registered the help and list commands by default');
}
public function testSetGetName()
{
$application = new Application();
$application->setName('foo');
$this->assertEquals($application->getName(), 'foo', '->setName() sets the name of the application');
}
public function testSetGetVersion()
{
$application = new Application();
$application->setVersion('bar');
$this->assertEquals($application->getVersion(), 'bar', '->setVersion() sets the version of the application');
}
public function testGetLongVersion()
{
$application = new Application('foo', 'bar');
$this->assertEquals($application->getLongVersion(), '<info>foo</info> version <comment>bar</comment>', '->getLongVersion() returns the long version of the application');
}
public function testHelp()
{
$application = new Application();
$this->assertEquals($application->getHelp(), file_get_contents(self::$fixturesPath.'/application_gethelp.txt'), '->setHelp() returns a help message');
}
public function testGetCommands()
{
$application = new Application();
$commands = $application->getCommands();
$this->assertEquals(get_class($commands['help']), 'Symfony\\Components\\Console\\Command\\HelpCommand', '->getCommands() returns the registered commands');
$application->addCommand(new \FooCommand());
$commands = $application->getCommands('foo');
$this->assertEquals(count($commands), 1, '->getCommands() takes a namespace as its first argument');
}
public function testRegister()
{
$application = new Application();
$command = $application->register('foo');
$this->assertEquals($command->getName(), 'foo', '->register() regiters a new command');
}
public function testAddCommand()
{
$application = new Application();
$application->addCommand($foo = new \FooCommand());
$commands = $application->getCommands();
$this->assertEquals($commands['foo:bar'], $foo, '->addCommand() registers a command');
$application = new Application();
$application->addCommands(array($foo = new \FooCommand(), $foo1 = new \Foo1Command()));
$commands = $application->getCommands();
$this->assertEquals(array($commands['foo:bar'], $commands['foo:bar1']), array($foo, $foo1), '->addCommands() registers an array of commands');
}
public function testHasGetCommand()
{
$application = new Application();
$this->assertTrue($application->hasCommand('list'), '->hasCommand() returns true if a named command is registered');
$this->assertTrue(!$application->hasCommand('afoobar'), '->hasCommand() returns false if a named command is not registered');
$application->addCommand($foo = new \FooCommand());
$this->assertTrue($application->hasCommand('afoobar'), '->hasCommand() returns true if an alias is registered');
$this->assertEquals($application->getCommand('foo:bar'), $foo, '->getCommand() returns a command by name');
$this->assertEquals($application->getCommand('afoobar'), $foo, '->getCommand() returns a command by alias');
try
{
$application->getCommand('foofoo');
$this->fail('->getCommand() throws an \InvalidArgumentException if the command does not exist');
}
catch (\InvalidArgumentException $e)
{
}
$application = new TestApplication();
$application->addCommand($foo = new \FooCommand());
$application->setWantHelps();
$command = $application->getCommand('foo:bar');
$this->assertEquals(get_class($command), 'Symfony\Components\Console\Command\HelpCommand', '->getCommand() returns the help command if --help is provided as the input');
}
public function testGetNamespaces()
{
$application = new TestApplication();
$application->addCommand(new \FooCommand());
$application->addCommand(new \Foo1Command());
$this->assertEquals($application->getNamespaces(), array('foo'), '->getNamespaces() returns an array of unique used namespaces');
}
public function testFindNamespace()
{
$application = new TestApplication();
$application->addCommand(new \FooCommand());
$this->assertEquals($application->findNamespace('foo'), 'foo', '->findNamespace() returns the given namespace if it exists');
$this->assertEquals($application->findNamespace('f'), 'foo', '->findNamespace() finds a namespace given an abbreviation');
$application->addCommand(new \Foo2Command());
$this->assertEquals($application->findNamespace('foo'), 'foo', '->findNamespace() returns the given namespace if it exists');
try
{
$application->findNamespace('f');
$this->fail('->findNamespace() throws an \InvalidArgumentException if the abbreviation is ambiguous');
}
catch (\InvalidArgumentException $e)
{
}
try
{
$application->findNamespace('bar');
$this->fail('->findNamespace() throws an \InvalidArgumentException if no command is in the given namespace');
}
catch (\InvalidArgumentException $e)
{
}
}
public function testFindCommand()
{
$application = new TestApplication();
$application->addCommand(new \FooCommand());
$this->assertEquals(get_class($application->findCommand('foo:bar')), 'FooCommand', '->findCommand() returns a command if its name exists');
$this->assertEquals(get_class($application->findCommand('h')), 'Symfony\Components\Console\Command\HelpCommand', '->findCommand() returns a command if its name exists');
$this->assertEquals(get_class($application->findCommand('f:bar')), 'FooCommand', '->findCommand() returns a command if the abbreviation for the namespace exists');
$this->assertEquals(get_class($application->findCommand('f:b')), 'FooCommand', '->findCommand() returns a command if the abbreviation for the namespace and the command name exist');
$this->assertEquals(get_class($application->findCommand('a')), 'FooCommand', '->findCommand() returns a command if the abbreviation exists for an alias');
$application->addCommand(new \Foo1Command());
$application->addCommand(new \Foo2Command());
try
{
$application->findCommand('f');
$this->fail('->findCommand() throws an \InvalidArgumentException if the abbreviation is ambiguous for a namespace');
}
catch (\InvalidArgumentException $e)
{
}
try
{
$application->findCommand('a');
$this->fail('->findCommand() throws an \InvalidArgumentException if the abbreviation is ambiguous for an alias');
}
catch (\InvalidArgumentException $e)
{
}
try
{
$application->findCommand('foo:b');
$this->fail('->findCommand() throws an \InvalidArgumentException if the abbreviation is ambiguous for a command');
}
catch (\InvalidArgumentException $e)
{
}
}
public function testSetCatchExceptions()
{
$application = new Application();
$application->setAutoExit(false);
$tester = new ApplicationTester($application);
$application->setCatchExceptions(true);
$tester->run(array('command' => 'foo'));
$this->assertEquals($tester->getDisplay(), file_get_contents(self::$fixturesPath.'/application_renderexception1.txt'), '->setCatchExceptions() sets the catch exception flag');
$application->setCatchExceptions(false);
try
{
$tester->run(array('command' => 'foo'));
$this->fail('->setCatchExceptions() sets the catch exception flag');
}
catch (\Exception $e)
{
}
}
public function testAsText()
{
$application = new Application();
$application->addCommand(new \FooCommand);
$this->assertEquals($application->asText(), file_get_contents(self::$fixturesPath.'/application_astext1.txt'), '->asText() returns a text representation of the application');
$this->assertEquals($application->asText('foo'), file_get_contents(self::$fixturesPath.'/application_astext2.txt'), '->asText() returns a text representation of the application');
}
public function testAsXml()
{
$application = new Application();
$application->addCommand(new \FooCommand);
$this->assertEquals($application->asXml(), file_get_contents(self::$fixturesPath.'/application_asxml1.txt'), '->asXml() returns an XML representation of the application');
$this->assertEquals($application->asXml('foo'), file_get_contents(self::$fixturesPath.'/application_asxml2.txt'), '->asXml() returns an XML representation of the application');
}
public function testRenderException()
{
$application = new Application();
$application->setAutoExit(false);
$tester = new ApplicationTester($application);
$tester->run(array('command' => 'foo'));
$this->assertEquals($tester->getDisplay(), file_get_contents(self::$fixturesPath.'/application_renderexception1.txt'), '->renderException() renders a pretty exception');
$tester->run(array('command' => 'foo'), array('verbosity' => Output::VERBOSITY_VERBOSE));
$this->assertRegExp('/Exception trace/', $tester->getDisplay(), '->renderException() renders a pretty exception with a stack trace when verbosity is verbose');
$tester->run(array('command' => 'list', '--foo' => true));
$this->assertEquals($tester->getDisplay(), file_get_contents(self::$fixturesPath.'/application_renderexception2.txt'), '->renderException() renders the command synopsis when an exception occurs in the context of a command');
}
public function testRun()
{
$application = new Application();
$application->setAutoExit(false);
$application->setCatchExceptions(false);
$application->addCommand($command = new \Foo1Command());
$_SERVER['argv'] = array('cli.php', 'foo:bar1');
ob_start();
$application->run();
ob_end_clean();
$this->assertEquals(get_class($command->input), 'Symfony\Components\Console\Input\ArgvInput', '->run() creates an ArgvInput by default if none is given');
$this->assertEquals(get_class($command->output), 'Symfony\Components\Console\Output\ConsoleOutput', '->run() creates a ConsoleOutput by default if none is given');
$application = new Application();
$application->setAutoExit(false);
$application->setCatchExceptions(false);
$tester = new ApplicationTester($application);
$tester->run(array());
$this->assertEquals($tester->getDisplay(), file_get_contents(self::$fixturesPath.'/application_run1.txt'), '->run() runs the list command if no argument is passed');
$tester->run(array('--help' => true));
$this->assertEquals($tester->getDisplay(), file_get_contents(self::$fixturesPath.'/application_run2.txt'), '->run() runs the help command if --help is passed');
$application = new Application();
$application->setAutoExit(false);
$application->setCatchExceptions(false);
$tester = new ApplicationTester($application);
$tester->run(array('command' => 'list', '--help' => true));
$this->assertEquals($tester->getDisplay(), file_get_contents(self::$fixturesPath.'/application_run3.txt'), '->run() displays the help if --help is passed');
$application = new Application();
$application->setAutoExit(false);
$application->setCatchExceptions(false);
$tester = new ApplicationTester($application);
$tester->run(array('--color' => true));
$this->assertTrue($tester->getOutput()->isDecorated(), '->run() forces color output if --color is passed');
$application = new Application();
$application->setAutoExit(false);
$application->setCatchExceptions(false);
$tester = new ApplicationTester($application);
$tester->run(array('--version' => true));
$this->assertEquals($tester->getDisplay(), file_get_contents(self::$fixturesPath.'/application_run4.txt'), '->run() displays the program version if --version is passed');
$application = new Application();
$application->setAutoExit(false);
$application->setCatchExceptions(false);
$tester = new ApplicationTester($application);
$tester->run(array('command' => 'list', '--quiet' => true));
$this->assertEquals($tester->getDisplay(), '', '->run() removes all output if --quiet is passed');
$application = new Application();
$application->setAutoExit(false);
$application->setCatchExceptions(false);
$tester = new ApplicationTester($application);
$tester->run(array('command' => 'list', '--verbose' => true));
$this->assertEquals($tester->getOutput()->getVerbosity(), Output::VERBOSITY_VERBOSE, '->run() sets the output to verbose is --verbose is passed');
$application = new Application();
$application->setAutoExit(false);
$application->setCatchExceptions(false);
$application->addCommand(new \FooCommand());
$tester = new ApplicationTester($application);
$tester->run(array('command' => 'foo:bar', '--no-interaction' => true));
$this->assertEquals($tester->getDisplay(), "called\n", '->run() does not called interact() if --no-interaction is passed');
}
}
class TestApplication extends Application
{
public function setWantHelps()
{
$this->wantHelps = true;
}
}

View File

@ -0,0 +1,242 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\Console\Command;
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\Console\Command\Command;
use Symfony\Components\Console\Application;
use Symfony\Components\Console\Input\InputDefinition;
use Symfony\Components\Console\Input\InputArgument;
use Symfony\Components\Console\Input\InputOption;
use Symfony\Components\Console\Input\InputInterface;
use Symfony\Components\Console\Input\StringInput;
use Symfony\Components\Console\Output\OutputInterface;
use Symfony\Components\Console\Output\NullOutput;
use Symfony\Components\Console\Output\StreamOutput;
use Symfony\Components\Console\Tester\CommandTester;
class CommandTest extends \PHPUnit_Framework_TestCase
{
static protected $fixturesPath;
static public function setUpBeforeClass()
{
self::$fixturesPath = __DIR__.'/../../../../../fixtures/Symfony/Components/Console/';
require_once self::$fixturesPath.'/TestCommand.php';
}
public function testConstructor()
{
$application = new Application();
try
{
$command = new Command();
$this->fail('__construct() throws a \LogicException if the name is null');
}
catch (\LogicException $e)
{
}
$command = new Command('foo:bar');
$this->assertEquals($command->getFullName(), 'foo:bar', '__construct() takes the command name as its first argument');
}
public function testSetApplication()
{
$application = new Application();
$command = new \TestCommand();
$command->setApplication($application);
$this->assertEquals($command->getApplication(), $application, '->setApplication() sets the current application');
}
public function testSetGetDefinition()
{
$command = new \TestCommand();
$ret = $command->setDefinition($definition = new InputDefinition());
$this->assertEquals($ret, $command, '->setDefinition() implements a fluent interface');
$this->assertEquals($command->getDefinition(), $definition, '->setDefinition() sets the current InputDefinition instance');
$command->setDefinition(array(new InputArgument('foo'), new InputOption('bar')));
$this->assertTrue($command->getDefinition()->hasArgument('foo'), '->setDefinition() also takes an array of InputArguments and InputOptions as an argument');
$this->assertTrue($command->getDefinition()->hasOption('bar'), '->setDefinition() also takes an array of InputArguments and InputOptions as an argument');
$command->setDefinition(new InputDefinition());
}
public function testAddArgument()
{
$command = new \TestCommand();
$ret = $command->addArgument('foo');
$this->assertEquals($ret, $command, '->addArgument() implements a fluent interface');
$this->assertTrue($command->getDefinition()->hasArgument('foo'), '->addArgument() adds an argument to the command');
}
public function testAddOption()
{
$command = new \TestCommand();
$ret = $command->addOption('foo');
$this->assertEquals($ret, $command, '->addOption() implements a fluent interface');
$this->assertTrue($command->getDefinition()->hasOption('foo'), '->addOption() adds an option to the command');
}
public function testgetNamespaceGetNameGetFullNameSetName()
{
$command = new \TestCommand();
$this->assertEquals($command->getNamespace(), 'namespace', '->getNamespace() returns the command namespace');
$this->assertEquals($command->getName(), 'name', '->getName() returns the command name');
$this->assertEquals($command->getFullName(), 'namespace:name', '->getNamespace() returns the full command name');
$command->setName('foo');
$this->assertEquals($command->getName(), 'foo', '->setName() sets the command name');
$command->setName(':bar');
$this->assertEquals($command->getName(), 'bar', '->setName() sets the command name');
$this->assertEquals($command->getNamespace(), '', '->setName() can set the command namespace');
$ret = $command->setName('foobar:bar');
$this->assertEquals($ret, $command, '->setName() implements a fluent interface');
$this->assertEquals($command->getName(), 'bar', '->setName() sets the command name');
$this->assertEquals($command->getNamespace(), 'foobar', '->setName() can set the command namespace');
try
{
$command->setName('');
$this->fail('->setName() throws an \InvalidArgumentException if the name is empty');
}
catch (\InvalidArgumentException $e)
{
}
try
{
$command->setName('foo:');
$this->fail('->setName() throws an \InvalidArgumentException if the name is empty');
}
catch (\InvalidArgumentException $e)
{
}
}
public function testGetSetDescription()
{
$command = new \TestCommand();
$this->assertEquals($command->getDescription(), 'description', '->getDescription() returns the description');
$ret = $command->setDescription('description1');
$this->assertEquals($ret, $command, '->setDescription() implements a fluent interface');
$this->assertEquals($command->getDescription(), 'description1', '->setDescription() sets the description');
}
public function testGetSetHelp()
{
$command = new \TestCommand();
$this->assertEquals($command->getHelp(), 'help', '->getHelp() returns the help');
$ret = $command->setHelp('help1');
$this->assertEquals($ret, $command, '->setHelp() implements a fluent interface');
$this->assertEquals($command->getHelp(), 'help1', '->setHelp() sets the help');
}
public function testGetSetAliases()
{
$command = new \TestCommand();
$this->assertEquals($command->getAliases(), array('name'), '->getAliases() returns the aliases');
$ret = $command->setAliases(array('name1'));
$this->assertEquals($ret, $command, '->setAliases() implements a fluent interface');
$this->assertEquals($command->getAliases(), array('name1'), '->setAliases() sets the aliases');
}
public function testGetSynopsis()
{
$command = new \TestCommand();
$command->addOption('foo');
$command->addArgument('foo');
$this->assertEquals($command->getSynopsis(), 'namespace:name [--foo] [foo]', '->getSynopsis() returns the synopsis');
}
public function testMergeApplicationDefinition()
{
$application1 = new Application();
$application1->getDefinition()->addArguments(array(new InputArgument('foo')));
$application1->getDefinition()->addOptions(array(new InputOption('bar')));
$command = new \TestCommand();
$command->setApplication($application1);
$command->setDefinition($definition = new InputDefinition(array(new InputArgument('bar'), new InputOption('foo'))));
$command->mergeApplicationDefinition();
$this->assertTrue($command->getDefinition()->hasArgument('foo'), '->mergeApplicationDefinition() merges the application arguments and the command arguments');
$this->assertTrue($command->getDefinition()->hasArgument('bar'), '->mergeApplicationDefinition() merges the application arguments and the command arguments');
$this->assertTrue($command->getDefinition()->hasOption('foo'), '->mergeApplicationDefinition() merges the application options and the command options');
$this->assertTrue($command->getDefinition()->hasOption('bar'), '->mergeApplicationDefinition() merges the application options and the command options');
$command->mergeApplicationDefinition();
$this->assertEquals($command->getDefinition()->getArgumentCount(), 3, '->mergeApplicationDefinition() does not try to merge twice the application arguments and options');
$command = new \TestCommand();
$command->mergeApplicationDefinition();
}
public function testRun()
{
$command = new \TestCommand();
$application = new Application();
$command->setApplication($application);
$tester = new CommandTester($command);
try
{
$tester->execute(array('--bar' => true));
$this->fail('->run() throws a \RuntimeException when the input does not validate the current InputDefinition');
}
catch (\RuntimeException $e)
{
}
$this->assertEquals($tester->execute(array(), array('interactive' => true)), "interact called\nexecute called\n", '->run() calls the interact() method if the input is interactive');
$this->assertEquals($tester->execute(array(), array('interactive' => false)), "execute called\n", '->run() does not call the interact() method if the input is not interactive');
$command = new Command('foo');
try
{
$command->run(new StringInput(''), new NullOutput());
$this->fail('->run() throws a \LogicException if the execute() method has not been overriden and no code has been provided');
}
catch (\LogicException $e)
{
}
}
public function testSetCode()
{
$application = new Application();
$command = new \TestCommand();
$command->setApplication($application);
$ret = $command->setCode(function (InputInterface $input, OutputInterface $output)
{
$output->writeln('from the code...');
});
$this->assertEquals($ret, $command, '->setCode() implements a fluent interface');
$tester = new CommandTester($command);
$tester->execute(array());
$this->assertEquals($tester->getDisplay(), "interact called\nfrom the code...\n");
}
public function testAsText()
{
$command = new \TestCommand();
$command->setApplication(new Application());
$tester = new CommandTester($command);
$tester->execute(array());
$this->assertEquals($command->asText(), file_get_contents(self::$fixturesPath.'/command_astext.txt'), '->asText() returns a text representation of the command');
}
public function testAsXml()
{
$command = new \TestCommand();
$command->setApplication(new Application());
$tester = new CommandTester($command);
$tester->execute(array());
$this->assertEquals($command->asXml(), file_get_contents(self::$fixturesPath.'/command_asxml.txt'), '->asXml() returns an XML representation of the command');
}
}

View File

@ -0,0 +1,42 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\Console\Command;
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\Console\Tester\CommandTester;
use Symfony\Components\Console\Command\HelpCommand;
use Symfony\Components\Console\Command\ListCommand;
use Symfony\Components\Console\Application;
class HelpCommandTest extends \PHPUnit_Framework_TestCase
{
public function testExecute()
{
$command = new HelpCommand();
$command->setCommand(new ListCommand());
$commandTester = new CommandTester($command);
$commandTester->execute(array());
$this->assertRegExp('/list \[--xml\] \[namespace\]/', $commandTester->getDisplay(), '->execute() returns a text help for the given command');
$commandTester->execute(array('--xml' => true));
$this->assertRegExp('/<command/', $commandTester->getDisplay(), '->execute() returns an XML help text if --xml is passed');
$application = new Application();
$commandTester = new CommandTester($application->getCommand('help'));
$commandTester->execute(array('command_name' => 'list'));
$this->assertRegExp('/list \[--xml\] \[namespace\]/', $commandTester->getDisplay(), '->execute() returns a text help for the given command');
$commandTester->execute(array('command_name' => 'list', '--xml' => true));
$this->assertRegExp('/<command/', $commandTester->getDisplay(), '->execute() returns an XML help text if --xml is passed');
}
}

View File

@ -0,0 +1,31 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\Console\Command;
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\Console\Tester\CommandTester;
use Symfony\Components\Console\Application;
class ListCommandTest extends \PHPUnit_Framework_TestCase
{
public function testExecute()
{
$application = new Application();
$commandTester = new CommandTester($application->getCommand('list'));
$commandTester->execute(array());
$this->assertRegExp('/help Displays help for a command/', $commandTester->getDisplay(), '->execute() returns a list of available commands');
$commandTester->execute(array('--xml' => true));
$this->assertRegExp('/<command id="list" namespace="_global" name="list">/', $commandTester->getDisplay(), '->execute() returns a list of available commands in XML if --xml is passed');
}
}

View File

@ -0,0 +1,35 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\Console\Formatter;
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\Console\Helper\FormatterHelper;
class FormatterHelperTest extends \PHPUnit_Framework_TestCase
{
public function testFormatSection()
{
$formatter = new FormatterHelper();
$this->assertEquals($formatter->formatSection('cli', 'Some text to display'), '<info>[cli]</info> Some text to display', '::formatSection() formats a message in a section');
}
public function testFormatBlock()
{
$formatter = new FormatterHelper();
$this->assertEquals($formatter->formatBlock('Some text to display', 'error'), '<error> Some text to display </error>', '::formatBlock() formats a message in a block');
$this->assertEquals($formatter->formatBlock(array('Some text to display', 'foo bar'), 'error'), "<error> Some text to display </error>\n<error> foo bar </error>", '::formatBlock() formats a message in a block');
$this->assertEquals($formatter->formatBlock('Some text to display', 'error', true), "<error> </error>\n<error> Some text to display </error>\n<error> </error>", '::formatBlock() formats a message in a block');
}
}

View File

@ -0,0 +1,175 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\Console\Input;
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\Console\Input\ArgvInput;
use Symfony\Components\Console\Input\InputDefinition;
use Symfony\Components\Console\Input\InputArgument;
use Symfony\Components\Console\Input\InputOption;
class ArgvInputTest extends \PHPUnit_Framework_TestCase
{
public function testConstructor()
{
$_SERVER['argv'] = array('cli.php', 'foo');
$input = new TestInput();
$this->assertEquals($input->getTokens(), array('foo'), '__construct() automatically get its input from the argv server variable');
}
public function testParser()
{
$input = new TestInput(array('cli.php', 'foo'));
$input->bind(new InputDefinition(array(new InputArgument('name'))));
$this->assertEquals($input->getArguments(), array('name' => 'foo'), '->parse() parses required arguments');
$input->bind(new InputDefinition(array(new InputArgument('name'))));
$this->assertEquals($input->getArguments(), array('name' => 'foo'), '->parse() is stateless');
$input = new TestInput(array('cli.php', '--foo'));
$input->bind(new InputDefinition(array(new InputOption('foo'))));
$this->assertEquals($input->getOptions(), array('foo' => true), '->parse() parses long options without parameter');
$input = new TestInput(array('cli.php', '--foo=bar'));
$input->bind(new InputDefinition(array(new InputOption('foo', 'f', InputOption::PARAMETER_REQUIRED))));
$this->assertEquals($input->getOptions(), array('foo' => 'bar'), '->parse() parses long options with a required parameter (with a = separator)');
$input = new TestInput(array('cli.php', '--foo', 'bar'));
$input->bind(new InputDefinition(array(new InputOption('foo', 'f', InputOption::PARAMETER_REQUIRED))));
$this->assertEquals($input->getOptions(), array('foo' => 'bar'), '->parse() parses long options with a required parameter (with a space separator)');
try
{
$input = new TestInput(array('cli.php', '--foo'));
$input->bind(new InputDefinition(array(new InputOption('foo', 'f', InputOption::PARAMETER_REQUIRED))));
$this->fail('->parse() throws a \RuntimeException if no parameter is passed to an option when it is required');
}
catch (\RuntimeException $e)
{
}
$input = new TestInput(array('cli.php', '-f'));
$input->bind(new InputDefinition(array(new InputOption('foo', 'f'))));
$this->assertEquals($input->getOptions(), array('foo' => true), '->parse() parses short options without parameter');
$input = new TestInput(array('cli.php', '-fbar'));
$input->bind(new InputDefinition(array(new InputOption('foo', 'f', InputOption::PARAMETER_REQUIRED))));
$this->assertEquals($input->getOptions(), array('foo' => 'bar'), '->parse() parses short options with a required parameter (with no separator)');
$input = new TestInput(array('cli.php', '-f', 'bar'));
$input->bind(new InputDefinition(array(new InputOption('foo', 'f', InputOption::PARAMETER_REQUIRED))));
$this->assertEquals($input->getOptions(), array('foo' => 'bar'), '->parse() parses short options with a required parameter (with a space separator)');
$input = new TestInput(array('cli.php', '-f', '-b', 'foo'));
$input->bind(new InputDefinition(array(new InputArgument('name'), new InputOption('foo', 'f', InputOption::PARAMETER_OPTIONAL), new InputOption('bar', 'b'))));
$this->assertEquals($input->getOptions(), array('foo' => null, 'bar' => true), '->parse() parses short options with an optional parameter which is not present');
try
{
$input = new TestInput(array('cli.php', '-f'));
$input->bind(new InputDefinition(array(new InputOption('foo', 'f', InputOption::PARAMETER_REQUIRED))));
$this->fail('->parse() throws a \RuntimeException if no parameter is passed to an option when it is required');
}
catch (\RuntimeException $e)
{
}
try
{
$input = new TestInput(array('cli.php', '-ffoo'));
$input->bind(new InputDefinition(array(new InputOption('foo', 'f', InputOption::PARAMETER_NONE))));
$this->fail('->parse() throws a \RuntimeException if a value is passed to an option which does not take one');
}
catch (\RuntimeException $e)
{
}
try
{
$input = new TestInput(array('cli.php', 'foo', 'bar'));
$input->bind(new InputDefinition());
$this->fail('->parse() throws a \RuntimeException if too many arguments are passed');
}
catch (\RuntimeException $e)
{
}
try
{
$input = new TestInput(array('cli.php', '--foo'));
$input->bind(new InputDefinition());
$this->fail('->parse() throws a \RuntimeException if an unknown long option is passed');
}
catch (\RuntimeException $e)
{
}
try
{
$input = new TestInput(array('cli.php', '-f'));
$input->bind(new InputDefinition());
$this->fail('->parse() throws a \RuntimeException if an unknown short option is passed');
}
catch (\RuntimeException $e)
{
}
$input = new TestInput(array('cli.php', '-fb'));
$input->bind(new InputDefinition(array(new InputOption('foo', 'f'), new InputOption('bar', 'b'))));
$this->assertEquals($input->getOptions(), array('foo' => true, 'bar' => true), '->parse() parses short options when they are aggregated as a single one');
$input = new TestInput(array('cli.php', '-fb', 'bar'));
$input->bind(new InputDefinition(array(new InputOption('foo', 'f'), new InputOption('bar', 'b', InputOption::PARAMETER_REQUIRED))));
$this->assertEquals($input->getOptions(), array('foo' => true, 'bar' => 'bar'), '->parse() parses short options when they are aggregated as a single one and the last one has a required parameter');
$input = new TestInput(array('cli.php', '-fb', 'bar'));
$input->bind(new InputDefinition(array(new InputOption('foo', 'f'), new InputOption('bar', 'b', InputOption::PARAMETER_OPTIONAL))));
$this->assertEquals($input->getOptions(), array('foo' => true, 'bar' => 'bar'), '->parse() parses short options when they are aggregated as a single one and the last one has an optional parameter');
$input = new TestInput(array('cli.php', '-fbbar'));
$input->bind(new InputDefinition(array(new InputOption('foo', 'f'), new InputOption('bar', 'b', InputOption::PARAMETER_OPTIONAL))));
$this->assertEquals($input->getOptions(), array('foo' => true, 'bar' => 'bar'), '->parse() parses short options when they are aggregated as a single one and the last one has an optional parameter with no separator');
$input = new TestInput(array('cli.php', '-fbbar'));
$input->bind(new InputDefinition(array(new InputOption('foo', 'f', InputOption::PARAMETER_OPTIONAL), new InputOption('bar', 'b', InputOption::PARAMETER_OPTIONAL))));
$this->assertEquals($input->getOptions(), array('foo' => 'bbar', 'bar' => null), '->parse() parses short options when they are aggregated as a single one and one of them takes a parameter');
}
public function testGetFirstArgument()
{
$input = new TestInput(array('cli.php', '-fbbar'));
$this->assertEquals($input->getFirstArgument(), '', '->getFirstArgument() returns the first argument from the raw input');
$input = new TestInput(array('cli.php', '-fbbar', 'foo'));
$this->assertEquals($input->getFirstArgument(), 'foo', '->getFirstArgument() returns the first argument from the raw input');
}
public function testHasParameterOption()
{
$input = new TestInput(array('cli.php', '-f', 'foo'));
$this->assertTrue($input->hasParameterOption('-f'), '->hasParameterOption() returns true if the given short option is in the raw input');
$input = new TestInput(array('cli.php', '--foo', 'foo'));
$this->assertTrue($input->hasParameterOption('--foo'), '->hasParameterOption() returns true if the given short option is in the raw input');
$input = new TestInput(array('cli.php', 'foo'));
$this->assertTrue(!$input->hasParameterOption('--foo'), '->hasParameterOption() returns false if the given short option is not in the raw input');
}
}
class TestInput extends ArgvInput
{
public function getTokens()
{
return $this->tokens;
}
}

View File

@ -0,0 +1,95 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\Console\Input;
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\Console\Input\ArrayInput;
use Symfony\Components\Console\Input\InputDefinition;
use Symfony\Components\Console\Input\InputArgument;
use Symfony\Components\Console\Input\InputOption;
class ArrayInputTest extends \PHPUnit_Framework_TestCase
{
public function testGetFirstArgument()
{
$input = new ArrayInput(array());
$this->assertEquals($input->getFirstArgument(), null, '->getFirstArgument() returns null if no argument were passed');
$input = new ArrayInput(array('name' => 'Fabien'));
$this->assertEquals($input->getFirstArgument(), 'Fabien', '->getFirstArgument() returns the first passed argument');
$input = new ArrayInput(array('--foo' => 'bar', 'name' => 'Fabien'));
$this->assertEquals($input->getFirstArgument(), 'Fabien', '->getFirstArgument() returns the first passed argument');
}
public function testHasParameterOption()
{
$input = new ArrayInput(array('name' => 'Fabien', '--foo' => 'bar'));
$this->assertTrue($input->hasParameterOption('--foo'), '->hasParameterOption() returns true if an option is present in the passed parameters');
$this->assertTrue(!$input->hasParameterOption('--bar'), '->hasParameterOption() returns false if an option is not present in the passed parameters');
$input = new ArrayInput(array('--foo'));
$this->assertTrue($input->hasParameterOption('--foo'), '->hasParameterOption() returns true if an option is present in the passed parameters');
}
public function testParse()
{
$input = new ArrayInput(array('name' => 'foo'), new InputDefinition(array(new InputArgument('name'))));
$this->assertEquals($input->getArguments(), array('name' => 'foo'), '->parse() parses required arguments');
try
{
$input = new ArrayInput(array('foo' => 'foo'), new InputDefinition(array(new InputArgument('name'))));
$this->fail('->parse() throws an \InvalidArgumentException exception if an invalid argument is passed');
}
catch (\RuntimeException $e)
{
}
$input = new ArrayInput(array('--foo' => 'bar'), new InputDefinition(array(new InputOption('foo'))));
$this->assertEquals($input->getOptions(), array('foo' => 'bar'), '->parse() parses long options');
$input = new ArrayInput(array('--foo' => 'bar'), new InputDefinition(array(new InputOption('foo', 'f', InputOption::PARAMETER_OPTIONAL, '', 'default'))));
$this->assertEquals($input->getOptions(), array('foo' => 'bar'), '->parse() parses long options with a default value');
$input = new ArrayInput(array('--foo' => null), new InputDefinition(array(new InputOption('foo', 'f', InputOption::PARAMETER_OPTIONAL, '', 'default'))));
$this->assertEquals($input->getOptions(), array('foo' => 'default'), '->parse() parses long options with a default value');
try
{
$input = new ArrayInput(array('--foo' => null), new InputDefinition(array(new InputOption('foo', 'f', InputOption::PARAMETER_REQUIRED))));
$this->fail('->parse() throws an \InvalidArgumentException exception if a required option is passed without a value');
}
catch (\RuntimeException $e)
{
}
try
{
$input = new ArrayInput(array('--foo' => 'foo'), new InputDefinition());
$this->fail('->parse() throws an \InvalidArgumentException exception if an invalid option is passed');
}
catch (\RuntimeException $e)
{
}
$input = new ArrayInput(array('-f' => 'bar'), new InputDefinition(array(new InputOption('foo', 'f'))));
$this->assertEquals($input->getOptions(), array('foo' => 'bar'), '->parse() parses short options');
try
{
$input = new ArrayInput(array('-o' => 'foo'), new InputDefinition());
$this->fail('->parse() throws an \InvalidArgumentException exception if an invalid option is passed');
}
catch (\RuntimeException $e)
{
}
}
}

View File

@ -0,0 +1,102 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\Console\Input;
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\Console\Input\InputArgument;
use Symfony\Components\Console\Exception;
class InputArgumentTest extends \PHPUnit_Framework_TestCase
{
public function testConstructor()
{
$argument = new InputArgument('foo');
$this->assertEquals($argument->getName(), 'foo', '__construct() takes a name as its first argument');
// mode argument
$argument = new InputArgument('foo');
$this->assertEquals($argument->isRequired(), false, '__construct() gives a "Argument::OPTIONAL" mode by default');
$argument = new InputArgument('foo', null);
$this->assertEquals($argument->isRequired(), false, '__construct() can take "Argument::OPTIONAL" as its mode');
$argument = new InputArgument('foo', InputArgument::OPTIONAL);
$this->assertEquals($argument->isRequired(), false, '__construct() can take "Argument::PARAMETER_OPTIONAL" as its mode');
$argument = new InputArgument('foo', InputArgument::REQUIRED);
$this->assertEquals($argument->isRequired(), true, '__construct() can take "Argument::PARAMETER_REQUIRED" as its mode');
try
{
$argument = new InputArgument('foo', 'ANOTHER_ONE');
$this->fail('__construct() throws an Exception if the mode is not valid');
}
catch (\Exception $e)
{
}
}
public function testIsArray()
{
$argument = new InputArgument('foo', InputArgument::IS_ARRAY);
$this->assertTrue($argument->isArray(), '->isArray() returns true if the argument can be an array');
$argument = new InputArgument('foo', InputArgument::OPTIONAL | InputArgument::IS_ARRAY);
$this->assertTrue($argument->isArray(), '->isArray() returns true if the argument can be an array');
$argument = new InputArgument('foo', InputArgument::OPTIONAL);
$this->assertTrue(!$argument->isArray(), '->isArray() returns false if the argument can not be an array');
}
public function testGetDescription()
{
$argument = new InputArgument('foo', null, 'Some description');
$this->assertEquals($argument->getDescription(), 'Some description', '->getDescription() return the message description');
}
public function testGetDefault()
{
$argument = new InputArgument('foo', InputArgument::OPTIONAL, '', 'default');
$this->assertEquals($argument->getDefault(), 'default', '->getDefault() return the default value');
}
public function testSetDefault()
{
$argument = new InputArgument('foo', InputArgument::OPTIONAL, '', 'default');
$argument->setDefault(null);
$this->assertTrue(is_null($argument->getDefault()), '->setDefault() can reset the default value by passing null');
$argument->setDefault('another');
$this->assertEquals($argument->getDefault(), 'another', '->setDefault() changes the default value');
$argument = new InputArgument('foo', InputArgument::OPTIONAL | InputArgument::IS_ARRAY);
$argument->setDefault(array(1, 2));
$this->assertEquals($argument->getDefault(), array(1, 2), '->setDefault() changes the default value');
try
{
$argument = new InputArgument('foo', InputArgument::REQUIRED);
$argument->setDefault('default');
$this->fail('->setDefault() throws an Exception if you give a default value for a required argument');
}
catch (\Exception $e)
{
}
try
{
$argument = new InputArgument('foo', InputArgument::IS_ARRAY);
$argument->setDefault('default');
$this->fail('->setDefault() throws an Exception if you give a default value which is not an array for a IS_ARRAY option');
}
catch (\Exception $e)
{
}
}
}

View File

@ -0,0 +1,368 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\Console\Input;
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\Console\Input\InputDefinition;
use Symfony\Components\Console\Input\InputArgument;
use Symfony\Components\Console\Input\InputOption;
use Symfony\Components\Console\Exception;
class InputDefinitionTest extends \PHPUnit_Framework_TestCase
{
static protected $fixtures;
protected $foo, $bar, $foo1, $foo2;
static public function setUpBeforeClass()
{
self::$fixtures = __DIR__.'/../../../../../fixtures/Symfony/Components/Console';
}
public function testConstructor()
{
$this->initializeArguments();
$definition = new InputDefinition();
$this->assertEquals($definition->getArguments(), array(), '__construct() creates a new InputDefinition object');
$definition = new InputDefinition(array($this->foo, $this->bar));
$this->assertEquals($definition->getArguments(), array('foo' => $this->foo, 'bar' => $this->bar), '__construct() takes an array of InputArgument objects as its first argument');
$this->initializeOptions();
$definition = new InputDefinition();
$this->assertEquals($definition->getOptions(), array(), '__construct() creates a new InputDefinition object');
$definition = new InputDefinition(array($this->foo, $this->bar));
$this->assertEquals($definition->getOptions(), array('foo' => $this->foo, 'bar' => $this->bar), '__construct() takes an array of InputOption objects as its first argument');
}
public function testSetArguments()
{
$this->initializeArguments();
$definition = new InputDefinition();
$definition->setArguments(array($this->foo));
$this->assertEquals($definition->getArguments(), array('foo' => $this->foo), '->setArguments() sets the array of InputArgument objects');
$definition->setArguments(array($this->bar));
$this->assertEquals($definition->getArguments(), array('bar' => $this->bar), '->setArguments() clears all InputArgument objects');
}
public function testAddArguments()
{
$this->initializeArguments();
$definition = new InputDefinition();
$definition->addArguments(array($this->foo));
$this->assertEquals($definition->getArguments(), array('foo' => $this->foo), '->addArguments() adds an array of InputArgument objects');
$definition->addArguments(array($this->bar));
$this->assertEquals($definition->getArguments(), array('foo' => $this->foo, 'bar' => $this->bar), '->addArguments() does not clear existing InputArgument objects');
}
public function testAddArgument()
{
$this->initializeArguments();
$definition = new InputDefinition();
$definition->addArgument($this->foo);
$this->assertEquals($definition->getArguments(), array('foo' => $this->foo), '->addArgument() adds a InputArgument object');
$definition->addArgument($this->bar);
$this->assertEquals($definition->getArguments(), array('foo' => $this->foo, 'bar' => $this->bar), '->addArgument() adds a InputArgument object');
// arguments must have different names
try
{
$definition->addArgument($this->foo1);
$this->fail('->addArgument() throws a Exception if another argument is already registered with the same name');
}
catch (\Exception $e)
{
}
// cannot add a parameter after an array parameter
$definition->addArgument(new InputArgument('fooarray', InputArgument::IS_ARRAY));
try
{
$definition->addArgument(new InputArgument('anotherbar'));
$this->fail('->addArgument() throws a Exception if there is an array parameter already registered');
}
catch (\Exception $e)
{
}
// cannot add a required argument after an optional one
$definition = new InputDefinition();
$definition->addArgument($this->foo);
try
{
$definition->addArgument($this->foo2);
$this->fail('->addArgument() throws an exception if you try to add a required argument after an optional one');
}
catch (\Exception $e)
{
}
}
public function testGetArgument()
{
$this->initializeArguments();
$definition = new InputDefinition();
$definition->addArguments(array($this->foo));
$this->assertEquals($definition->getArgument('foo'), $this->foo, '->getArgument() returns a InputArgument by its name');
try
{
$definition->getArgument('bar');
$this->fail('->getArgument() throws an exception if the InputArgument name does not exist');
}
catch (\Exception $e)
{
}
}
public function testHasArgument()
{
$this->initializeArguments();
$definition = new InputDefinition();
$definition->addArguments(array($this->foo));
$this->assertEquals($definition->hasArgument('foo'), true, '->hasArgument() returns true if a InputArgument exists for the given name');
$this->assertEquals($definition->hasArgument('bar'), false, '->hasArgument() returns false if a InputArgument exists for the given name');
}
public function testGetArgumentRequiredCount()
{
$this->initializeArguments();
$definition = new InputDefinition();
$definition->addArgument($this->foo2);
$this->assertEquals($definition->getArgumentRequiredCount(), 1, '->getArgumentRequiredCount() returns the number of required arguments');
$definition->addArgument($this->foo);
$this->assertEquals($definition->getArgumentRequiredCount(), 1, '->getArgumentRequiredCount() returns the number of required arguments');
}
public function testGetArgumentCount()
{
$this->initializeArguments();
$definition = new InputDefinition();
$definition->addArgument($this->foo2);
$this->assertEquals($definition->getArgumentCount(), 1, '->getArgumentCount() returns the number of arguments');
$definition->addArgument($this->foo);
$this->assertEquals($definition->getArgumentCount(), 2, '->getArgumentCount() returns the number of arguments');
}
public function testGetArgumentDefaults()
{
$definition = new InputDefinition(array(
new InputArgument('foo1', InputArgument::OPTIONAL),
new InputArgument('foo2', InputArgument::OPTIONAL, '', 'default'),
new InputArgument('foo3', InputArgument::OPTIONAL | InputArgument::IS_ARRAY),
// new InputArgument('foo4', InputArgument::OPTIONAL | InputArgument::IS_ARRAY, '', array(1, 2)),
));
$this->assertEquals($definition->getArgumentDefaults(), array('foo1' => null, 'foo2' => 'default', 'foo3' => array()), '->getArgumentDefaults() return the default values for each argument');
$definition = new InputDefinition(array(
new InputArgument('foo4', InputArgument::OPTIONAL | InputArgument::IS_ARRAY, '', array(1, 2)),
));
$this->assertEquals($definition->getArgumentDefaults(), array('foo4' => array(1, 2)), '->getArgumentDefaults() return the default values for each argument');
}
public function testSetOptions()
{
$this->initializeOptions();
$definition = new InputDefinition(array($this->foo));
$this->assertEquals($definition->getOptions(), array('foo' => $this->foo), '->setOptions() sets the array of InputOption objects');
$definition->setOptions(array($this->bar));
$this->assertEquals($definition->getOptions(), array('bar' => $this->bar), '->setOptions() clears all InputOption objects');
try
{
$definition->getOptionForShortcut('f');
$this->fail('->setOptions() clears all InputOption objects');
}
catch (\Exception $e)
{
}
}
public function testAddOptions()
{
$this->initializeOptions();
$definition = new InputDefinition(array($this->foo));
$this->assertEquals($definition->getOptions(), array('foo' => $this->foo), '->addOptions() adds an array of InputOption objects');
$definition->addOptions(array($this->bar));
$this->assertEquals($definition->getOptions(), array('foo' => $this->foo, 'bar' => $this->bar), '->addOptions() does not clear existing InputOption objects');
}
public function testAddOption()
{
$this->initializeOptions();
$definition = new InputDefinition();
$definition->addOption($this->foo);
$this->assertEquals($definition->getOptions(), array('foo' => $this->foo), '->addOption() adds a InputOption object');
$definition->addOption($this->bar);
$this->assertEquals($definition->getOptions(), array('foo' => $this->foo, 'bar' => $this->bar), '->addOption() adds a InputOption object');
try
{
$definition->addOption($this->foo2);
$this->fail('->addOption() throws a Exception if the another option is already registered with the same name');
}
catch (\Exception $e)
{
}
try
{
$definition->addOption($this->foo1);
$this->fail('->addOption() throws a Exception if the another option is already registered with the same shortcut');
}
catch (\Exception $e)
{
}
}
public function testGetOption()
{
$this->initializeOptions();
$definition = new InputDefinition(array($this->foo));
$this->assertEquals($definition->getOption('foo'), $this->foo, '->getOption() returns a InputOption by its name');
try
{
$definition->getOption('bar');
$this->fail('->getOption() throws an exception if the option name does not exist');
}
catch (\Exception $e)
{
}
}
public function testHasOption()
{
$this->initializeOptions();
$definition = new InputDefinition(array($this->foo));
$this->assertEquals($definition->hasOption('foo'), true, '->hasOption() returns true if a InputOption exists for the given name');
$this->assertEquals($definition->hasOption('bar'), false, '->hasOption() returns false if a InputOption exists for the given name');
}
public function testHasShortcut()
{
$this->initializeOptions();
$definition = new InputDefinition(array($this->foo));
$this->assertEquals($definition->hasShortcut('f'), true, '->hasShortcut() returns true if a InputOption exists for the given shortcut');
$this->assertEquals($definition->hasShortcut('b'), false, '->hasShortcut() returns false if a InputOption exists for the given shortcut');
}
public function testGetOptionForShortcut()
{
$this->initializeOptions();
$definition = new InputDefinition(array($this->foo));
$this->assertEquals($definition->getOptionForShortcut('f'), $this->foo, '->getOptionForShortcut() returns a InputOption by its shortcut');
try
{
$definition->getOptionForShortcut('l');
$this->fail('->getOption() throws an exception if the shortcut does not exist');
}
catch (\Exception $e)
{
}
}
public function testGetOptionDefaults()
{
$definition = new InputDefinition(array(
new InputOption('foo1', null, InputOption::PARAMETER_NONE),
new InputOption('foo2', null, InputOption::PARAMETER_REQUIRED),
new InputOption('foo3', null, InputOption::PARAMETER_REQUIRED, '', 'default'),
new InputOption('foo4', null, InputOption::PARAMETER_OPTIONAL),
new InputOption('foo5', null, InputOption::PARAMETER_OPTIONAL, '', 'default'),
new InputOption('foo6', null, InputOption::PARAMETER_OPTIONAL | InputOption::PARAMETER_IS_ARRAY),
new InputOption('foo7', null, InputOption::PARAMETER_OPTIONAL | InputOption::PARAMETER_IS_ARRAY, '', array(1, 2)),
));
$defaults = array(
'foo1' => null,
'foo2' => null,
'foo3' => 'default',
'foo4' => null,
'foo5' => 'default',
'foo6' => array(),
'foo7' => array(1, 2),
);
$this->assertEquals($definition->getOptionDefaults(), $defaults, '->getOptionDefaults() returns the default values for all options');
}
public function testGetSynopsis()
{
$definition = new InputDefinition(array(new InputOption('foo')));
$this->assertEquals($definition->getSynopsis(), '[--foo]', '->getSynopsis() returns a synopsis of arguments and options');
$definition = new InputDefinition(array(new InputOption('foo', 'f')));
$this->assertEquals($definition->getSynopsis(), '[-f|--foo]', '->getSynopsis() returns a synopsis of arguments and options');
$definition = new InputDefinition(array(new InputOption('foo', 'f', InputOption::PARAMETER_REQUIRED)));
$this->assertEquals($definition->getSynopsis(), '[-f|--foo="..."]', '->getSynopsis() returns a synopsis of arguments and options');
$definition = new InputDefinition(array(new InputOption('foo', 'f', InputOption::PARAMETER_OPTIONAL)));
$this->assertEquals($definition->getSynopsis(), '[-f|--foo[="..."]]', '->getSynopsis() returns a synopsis of arguments and options');
$definition = new InputDefinition(array(new InputArgument('foo')));
$this->assertEquals($definition->getSynopsis(), '[foo]', '->getSynopsis() returns a synopsis of arguments and options');
$definition = new InputDefinition(array(new InputArgument('foo', InputArgument::REQUIRED)));
$this->assertEquals($definition->getSynopsis(), 'foo', '->getSynopsis() returns a synopsis of arguments and options');
$definition = new InputDefinition(array(new InputArgument('foo', InputArgument::IS_ARRAY)));
$this->assertEquals($definition->getSynopsis(), '[foo1] ... [fooN]', '->getSynopsis() returns a synopsis of arguments and options');
$definition = new InputDefinition(array(new InputArgument('foo', InputArgument::REQUIRED | InputArgument::IS_ARRAY)));
$this->assertEquals($definition->getSynopsis(), 'foo1 ... [fooN]', '->getSynopsis() returns a synopsis of arguments and options');
}
public function testAsText()
{
$definition = new InputDefinition(array(
new InputArgument('foo', InputArgument::OPTIONAL, 'The bar argument'),
new InputArgument('bar', InputArgument::OPTIONAL | InputArgument::IS_ARRAY, 'The foo argument', array('bar')),
new InputOption('foo', 'f', InputOption::PARAMETER_REQUIRED, 'The foo option'),
new InputOption('bar', 'b', InputOption::PARAMETER_OPTIONAL, 'The foo option', 'bar'),
));
$this->assertEquals($definition->asText(), file_get_contents(self::$fixtures.'/definition_astext.txt'), '->asText() returns a textual representation of the InputDefinition');
}
public function testAsXml()
{
$definition = new InputDefinition(array(
new InputArgument('foo', InputArgument::OPTIONAL, 'The bar argument'),
new InputArgument('bar', InputArgument::OPTIONAL | InputArgument::IS_ARRAY, 'The foo argument', array('bar')),
new InputOption('foo', 'f', InputOption::PARAMETER_REQUIRED, 'The foo option'),
new InputOption('bar', 'b', InputOption::PARAMETER_OPTIONAL, 'The foo option', 'bar'),
));
$this->assertEquals($definition->asXml(), file_get_contents(self::$fixtures.'/definition_asxml.txt'), '->asText() returns a textual representation of the InputDefinition');
}
protected function initializeArguments()
{
$this->foo = new InputArgument('foo');
$this->bar = new InputArgument('bar');
$this->foo1 = new InputArgument('foo');
$this->foo2 = new InputArgument('foo2', InputArgument::REQUIRED);
}
protected function initializeOptions()
{
$this->foo = new InputOption('foo', 'f');
$this->bar = new InputOption('bar', 'b');
$this->foo1 = new InputOption('fooBis', 'f');
$this->foo2 = new InputOption('foo', 'p');
}
}

View File

@ -0,0 +1,142 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\Console\Input;
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\Console\Input\InputOption;
use Symfony\Components\Console\Exception;
class InputOptionTest extends \PHPUnit_Framework_TestCase
{
public function testConstructor()
{
$option = new InputOption('foo');
$this->assertEquals($option->getName(), 'foo', '__construct() takes a name as its first argument');
$option = new InputOption('--foo');
$this->assertEquals($option->getName(), 'foo', '__construct() removes the leading -- of the option name');
try
{
$option = new InputOption('foo', 'f', InputOption::PARAMETER_IS_ARRAY);
$this->fail('->setDefault() throws an Exception if PARAMETER_IS_ARRAY option is used when an option does not accept a value');
}
catch (\Exception $e)
{
}
// shortcut argument
$option = new InputOption('foo', 'f');
$this->assertEquals($option->getShortcut(), 'f', '__construct() can take a shortcut as its second argument');
$option = new InputOption('foo', '-f');
$this->assertEquals($option->getShortcut(), 'f', '__construct() removes the leading - of the shortcut');
// mode argument
$option = new InputOption('foo', 'f');
$this->assertEquals($option->acceptParameter(), false, '__construct() gives a "Option::PARAMETER_NONE" mode by default');
$this->assertEquals($option->isParameterRequired(), false, '__construct() gives a "Option::PARAMETER_NONE" mode by default');
$this->assertEquals($option->isParameterOptional(), false, '__construct() gives a "Option::PARAMETER_NONE" mode by default');
$option = new InputOption('foo', 'f', null);
$this->assertEquals($option->acceptParameter(), false, '__construct() can take "Option::PARAMETER_NONE" as its mode');
$this->assertEquals($option->isParameterRequired(), false, '__construct() can take "Option::PARAMETER_NONE" as its mode');
$this->assertEquals($option->isParameterOptional(), false, '__construct() can take "Option::PARAMETER_NONE" as its mode');
$option = new InputOption('foo', 'f', InputOption::PARAMETER_NONE);
$this->assertEquals($option->acceptParameter(), false, '__construct() can take "Option::PARAMETER_NONE" as its mode');
$this->assertEquals($option->isParameterRequired(), false, '__construct() can take "Option::PARAMETER_NONE" as its mode');
$this->assertEquals($option->isParameterOptional(), false, '__construct() can take "Option::PARAMETER_NONE" as its mode');
$option = new InputOption('foo', 'f', InputOption::PARAMETER_REQUIRED);
$this->assertEquals($option->acceptParameter(), true, '__construct() can take "Option::PARAMETER_REQUIRED" as its mode');
$this->assertEquals($option->isParameterRequired(), true, '__construct() can take "Option::PARAMETER_REQUIRED" as its mode');
$this->assertEquals($option->isParameterOptional(), false, '__construct() can take "Option::PARAMETER_REQUIRED" as its mode');
$option = new InputOption('foo', 'f', InputOption::PARAMETER_OPTIONAL);
$this->assertEquals($option->acceptParameter(), true, '__construct() can take "Option::PARAMETER_OPTIONAL" as its mode');
$this->assertEquals($option->isParameterRequired(), false, '__construct() can take "Option::PARAMETER_OPTIONAL" as its mode');
$this->assertEquals($option->isParameterOptional(), true, '__construct() can take "Option::PARAMETER_OPTIONAL" as its mode');
try
{
$option = new InputOption('foo', 'f', 'ANOTHER_ONE');
$this->fail('__construct() throws an Exception if the mode is not valid');
}
catch (\Exception $e)
{
}
}
public function testIsArray()
{
$option = new InputOption('foo', null, InputOption::PARAMETER_OPTIONAL | InputOption::PARAMETER_IS_ARRAY);
$this->assertTrue($option->isArray(), '->isArray() returns true if the option can be an array');
$option = new InputOption('foo', null, InputOption::PARAMETER_NONE);
$this->assertTrue(!$option->isArray(), '->isArray() returns false if the option can not be an array');
}
public function testGetDescription()
{
$option = new InputOption('foo', 'f', null, 'Some description');
$this->assertEquals($option->getDescription(), 'Some description', '->getDescription() returns the description message');
}
public function testGetDefault()
{
$option = new InputOption('foo', null, InputOption::PARAMETER_OPTIONAL, '', 'default');
$this->assertEquals($option->getDefault(), 'default', '->getDefault() returns the default value');
$option = new InputOption('foo', null, InputOption::PARAMETER_REQUIRED, '', 'default');
$this->assertEquals($option->getDefault(), 'default', '->getDefault() returns the default value');
$option = new InputOption('foo', null, InputOption::PARAMETER_REQUIRED);
$this->assertTrue(is_null($option->getDefault()), '->getDefault() returns null if no default value is configured');
$option = new InputOption('foo', null, InputOption::PARAMETER_OPTIONAL | InputOption::PARAMETER_IS_ARRAY);
$this->assertEquals($option->getDefault(), array(), '->getDefault() returns an empty array if option is an array');
$option = new InputOption('foo', null, InputOption::PARAMETER_NONE);
$this->assertTrue($option->getDefault() === false, '->getDefault() returns false if the option does not take a parameter');
}
public function testSetDefault()
{
$option = new InputOption('foo', null, InputOption::PARAMETER_REQUIRED, '', 'default');
$option->setDefault(null);
$this->assertTrue(is_null($option->getDefault()), '->setDefault() can reset the default value by passing null');
$option->setDefault('another');
$this->assertEquals($option->getDefault(), 'another', '->setDefault() changes the default value');
$option = new InputOption('foo', null, InputOption::PARAMETER_REQUIRED | InputOption::PARAMETER_IS_ARRAY);
$option->setDefault(array(1, 2));
$this->assertEquals($option->getDefault(), array(1, 2), '->setDefault() changes the default value');
$option = new InputOption('foo', 'f', InputOption::PARAMETER_NONE);
try
{
$option->setDefault('default');
$this->fail('->setDefault() throws an Exception if you give a default value for a PARAMETER_NONE option');
}
catch (\Exception $e)
{
}
$option = new InputOption('foo', 'f', InputOption::PARAMETER_OPTIONAL | InputOption::PARAMETER_IS_ARRAY);
try
{
$option->setDefault('default');
$this->fail('->setDefault() throws an Exception if you give a default value which is not an array for a PARAMETER_IS_ARRAY option');
}
catch (\Exception $e)
{
}
}
}

View File

@ -0,0 +1,126 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\Console\Input;
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\Console\Input\ArrayInput;
use Symfony\Components\Console\Input\InputDefinition;
use Symfony\Components\Console\Input\InputArgument;
use Symfony\Components\Console\Input\InputOption;
class InputTest extends \PHPUnit_Framework_TestCase
{
public function testConstructor()
{
$input = new ArrayInput(array('name' => 'foo'), new InputDefinition(array(new InputArgument('name'))));
$this->assertEquals($input->getArgument('name'), 'foo', '->__construct() takes a InputDefinition as an argument');
}
public function testOptions()
{
$input = new ArrayInput(array('--name' => 'foo'), new InputDefinition(array(new InputOption('name'))));
$this->assertEquals($input->getOption('name'), 'foo', '->getOption() returns the value for the given option');
$input->setOption('name', 'bar');
$this->assertEquals($input->getOption('name'), 'bar', '->setOption() sets the value for a given option');
$this->assertEquals($input->getOptions(), array('name' => 'bar'), '->getOptions() returns all option values');
$input = new ArrayInput(array('--name' => 'foo'), new InputDefinition(array(new InputOption('name'), new InputOption('bar', '', InputOption::PARAMETER_OPTIONAL, '', 'default'))));
$this->assertEquals($input->getOption('bar'), 'default', '->getOption() returns the default value for optional options');
$this->assertEquals($input->getOptions(), array('name' => 'foo', 'bar' => 'default'), '->getOptions() returns all option values, even optional ones');
try
{
$input->setOption('foo', 'bar');
$this->fail('->setOption() throws a \InvalidArgumentException if the option does not exist');
}
catch (\InvalidArgumentException $e)
{
}
try
{
$input->getOption('foo');
$this->fail('->getOption() throws a \InvalidArgumentException if the option does not exist');
}
catch (\InvalidArgumentException $e)
{
}
}
public function testArguments()
{
$input = new ArrayInput(array('name' => 'foo'), new InputDefinition(array(new InputArgument('name'))));
$this->assertEquals($input->getArgument('name'), 'foo', '->getArgument() returns the value for the given argument');
$input->setArgument('name', 'bar');
$this->assertEquals($input->getArgument('name'), 'bar', '->setArgument() sets the value for a given argument');
$this->assertEquals($input->getArguments(), array('name' => 'bar'), '->getArguments() returns all argument values');
$input = new ArrayInput(array('name' => 'foo'), new InputDefinition(array(new InputArgument('name'), new InputArgument('bar', InputArgument::OPTIONAL, '', 'default'))));
$this->assertEquals($input->getArgument('bar'), 'default', '->getArgument() returns the default value for optional arguments');
$this->assertEquals($input->getArguments(), array('name' => 'foo', 'bar' => 'default'), '->getArguments() returns all argument values, even optional ones');
try
{
$input->setArgument('foo', 'bar');
$this->fail('->setArgument() throws a \InvalidArgumentException if the argument does not exist');
}
catch (\InvalidArgumentException $e)
{
}
try
{
$input->getArgument('foo');
$this->fail('->getArgument() throws a \InvalidArgumentException if the argument does not exist');
}
catch (\InvalidArgumentException $e)
{
}
}
public function testValidate()
{
$input = new ArrayInput(array());
$input->bind(new InputDefinition(array(new InputArgument('name', InputArgument::REQUIRED))));
try
{
$input->validate();
$this->fail('->validate() throws a \RuntimeException if not enough arguments are given');
}
catch (\RuntimeException $e)
{
}
$input = new ArrayInput(array('name' => 'foo'));
$input->bind(new InputDefinition(array(new InputArgument('name', InputArgument::REQUIRED))));
try
{
$input->validate();
}
catch (\RuntimeException $e)
{
$this->fail('->validate() does not throw a \RuntimeException if enough arguments are given');
}
}
public function testSetFetInteractive()
{
$input = new ArrayInput(array());
$this->assertTrue($input->isInteractive(), '->isInteractive() returns whether the input should be interactive or not');
$input->setInteractive(false);
$this->assertTrue(!$input->isInteractive(), '->setInteractive() changes the interactive flag');
}
}

View File

@ -0,0 +1,98 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\Console\Input;
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\Console\Input\StringInput;
class StringInputTest extends \PHPUnit_Framework_TestCase
{
public function testTokenize()
{
$input = new TestInput1('');
$this->assertEquals($input->getTokens(), array(), '->tokenize() parses an empty string');
$input = new TestInput1('foo');
$this->assertEquals($input->getTokens(), array('foo'), '->tokenize() parses arguments');
$input = new TestInput1(' foo bar ');
$this->assertEquals($input->getTokens(), array('foo', 'bar'), '->tokenize() ignores whitespaces between arguments');
$input = new TestInput1('"quoted"');
$this->assertEquals($input->getTokens(), array('quoted'), '->tokenize() parses quoted arguments');
$input = new TestInput1("'quoted'");
$this->assertEquals($input->getTokens(), array('quoted'), '->tokenize() parses quoted arguments');
$input = new TestInput1('\"quoted\"');
$this->assertEquals($input->getTokens(), array('"quoted"'), '->tokenize() parses escaped-quoted arguments');
$input = new TestInput1("\'quoted\'");
$this->assertEquals($input->getTokens(), array('\'quoted\''), '->tokenize() parses escaped-quoted arguments');
$input = new TestInput1('-a');
$this->assertEquals($input->getTokens(), array('-a'), '->tokenize() parses short options');
$input = new TestInput1('-azc');
$this->assertEquals($input->getTokens(), array('-azc'), '->tokenize() parses aggregated short options');
$input = new TestInput1('-awithavalue');
$this->assertEquals($input->getTokens(), array('-awithavalue'), '->tokenize() parses short options with a value');
$input = new TestInput1('-a"foo bar"');
$this->assertEquals($input->getTokens(), array('-afoo bar'), '->tokenize() parses short options with a value');
$input = new TestInput1('-a"foo bar""foo bar"');
$this->assertEquals($input->getTokens(), array('-afoo barfoo bar'), '->tokenize() parses short options with a value');
$input = new TestInput1('-a\'foo bar\'');
$this->assertEquals($input->getTokens(), array('-afoo bar'), '->tokenize() parses short options with a value');
$input = new TestInput1('-a\'foo bar\'\'foo bar\'');
$this->assertEquals($input->getTokens(), array('-afoo barfoo bar'), '->tokenize() parses short options with a value');
$input = new TestInput1('-a\'foo bar\'"foo bar"');
$this->assertEquals($input->getTokens(), array('-afoo barfoo bar'), '->tokenize() parses short options with a value');
$input = new TestInput1('--long-option');
$this->assertEquals($input->getTokens(), array('--long-option'), '->tokenize() parses long options');
$input = new TestInput1('--long-option=foo');
$this->assertEquals($input->getTokens(), array('--long-option=foo'), '->tokenize() parses long options with a value');
$input = new TestInput1('--long-option="foo bar"');
$this->assertEquals($input->getTokens(), array('--long-option=foo bar'), '->tokenize() parses long options with a value');
$input = new TestInput1('--long-option="foo bar""another"');
$this->assertEquals($input->getTokens(), array('--long-option=foo baranother'), '->tokenize() parses long options with a value');
$input = new TestInput1('--long-option=\'foo bar\'');
$this->assertEquals($input->getTokens(), array('--long-option=foo bar'), '->tokenize() parses long options with a value');
$input = new TestInput1("--long-option='foo bar''another'");
$this->assertEquals($input->getTokens(), array("--long-option=foo baranother"), '->tokenize() parses long options with a value');
$input = new TestInput1("--long-option='foo bar'\"another\"");
$this->assertEquals($input->getTokens(), array("--long-option=foo baranother"), '->tokenize() parses long options with a value');
$input = new TestInput1('foo -a -ffoo --long bar');
$this->assertEquals($input->getTokens(), array('foo', '-a', '-ffoo', '--long', 'bar'), '->tokenize() parses when several arguments and options');
}
}
class TestInput1 extends StringInput
{
public function getTokens()
{
return $this->tokens;
}
}

View File

@ -0,0 +1,25 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\Console\Output;
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\Console\Output\ConsoleOutput;
use Symfony\Components\Console\Output\Output;
class ConsoleOutputTest extends \PHPUnit_Framework_TestCase
{
public function testConstructor()
{
$output = new ConsoleOutput(Output::VERBOSITY_QUIET, true);
$this->assertEquals($output->getVerbosity(), Output::VERBOSITY_QUIET, '__construct() takes the verbosity as its first argument');
}
}

View File

@ -0,0 +1,25 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\Console\Output;
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\Console\Output\NullOutput;
class NullOutputTest extends \PHPUnit_Framework_TestCase
{
public function testConstructor()
{
$output = new NullOutput();
$output->write('foo');
$this->assertTrue(true, '->write() does nothing');
}
}

View File

@ -0,0 +1,107 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\Console\Output;
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\Console\Output\Output;
class OutputTest extends \PHPUnit_Framework_TestCase
{
public function testConstructor()
{
$output = new TestOutput(Output::VERBOSITY_QUIET, true);
$this->assertEquals($output->getVerbosity(), Output::VERBOSITY_QUIET, '__construct() takes the verbosity as its first argument');
$this->assertEquals($output->isDecorated(), true, '__construct() takes the decorated flag as its second argument');
}
public function testSetIsDecorated()
{
$output = new TestOutput();
$output->setDecorated(true);
$this->assertEquals($output->isDecorated(), true, 'setDecorated() sets the decorated flag');
}
public function testSetGetVerbosity()
{
$output = new TestOutput();
$output->setVerbosity(Output::VERBOSITY_QUIET);
$this->assertEquals($output->getVerbosity(), Output::VERBOSITY_QUIET, '->setVerbosity() sets the verbosity');
}
public function testSetStyle()
{
Output::setStyle('FOO', array('bg' => 'red', 'fg' => 'yellow', 'blink' => true));
$this->assertEquals(TestOutput::getStyle('foo'), array('bg' => 'red', 'fg' => 'yellow', 'blink' => true), '::setStyle() sets a new style');
}
public function testWrite()
{
$output = new TestOutput(Output::VERBOSITY_QUIET);
$output->writeln('foo');
$this->assertEquals($output->output, '', '->writeln() outputs nothing if verbosity is set to VERBOSITY_QUIET');
$output = new TestOutput();
$output->writeln(array('foo', 'bar'));
$this->assertEquals($output->output, "foo\nbar\n", '->writeln() can take an array of messages to output');
$output = new TestOutput();
$output->writeln('<info>foo</info>', Output::OUTPUT_RAW);
$this->assertEquals($output->output, "<info>foo</info>\n", '->writeln() outputs the raw message if OUTPUT_RAW is specified');
$output = new TestOutput();
$output->writeln('<info>foo</info>', Output::OUTPUT_PLAIN);
$this->assertEquals($output->output, "foo\n", '->writeln() strips decoration tags if OUTPUT_PLAIN is specified');
$output = new TestOutput();
$output->setDecorated(false);
$output->writeln('<info>foo</info>');
$this->assertEquals($output->output, "foo\n", '->writeln() strips decoration tags if decoration is set to false');
$output = new TestOutput();
$output->setDecorated(true);
$output->writeln('<foo>foo</foo>');
$this->assertEquals($output->output, "\033[33;41;5mfoo\033[0m\n", '->writeln() decorates the output');
try
{
$output->writeln('<foo>foo</foo>', 24);
$this->fail('->writeln() throws an \InvalidArgumentException when the type does not exist');
}
catch (\InvalidArgumentException $e)
{
}
try
{
$output->writeln('<bar>foo</bar>');
$this->fail('->writeln() throws an \InvalidArgumentException when a style does not exist');
}
catch (\InvalidArgumentException $e)
{
}
}
}
class TestOutput extends Output
{
public $output = '';
static public function getStyle($name)
{
return static::$styles[$name];
}
public function doWrite($message, $newline)
{
$this->output .= $message.($newline ? "\n" : '');
}
}

View File

@ -0,0 +1,56 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\Console\Output;
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\Console\Output\Output;
use Symfony\Components\Console\Output\StreamOutput;
class StreamOutputTest extends \PHPUnit_Framework_TestCase
{
protected $stream;
public function setUp()
{
$this->stream = fopen('php://memory', 'a', false);
}
public function testConstructor()
{
try
{
$output = new StreamOutput('foo');
$this->fail('__construct() throws an \InvalidArgumentException if the first argument is not a stream');
}
catch (\InvalidArgumentException $e)
{
}
$output = new StreamOutput($this->stream, Output::VERBOSITY_QUIET, true);
$this->assertEquals($output->getVerbosity(), Output::VERBOSITY_QUIET, '__construct() takes the verbosity as its first argument');
$this->assertEquals($output->isDecorated(), true, '__construct() takes the decorated flag as its second argument');
}
public function testGetStream()
{
$output = new StreamOutput($this->stream);
$this->assertEquals($output->getStream(), $this->stream, '->getStream() returns the current stream');
}
public function testDoWrite()
{
$output = new StreamOutput($this->stream);
$output->writeln('foo');
rewind($output->getStream());
$this->assertEquals(stream_get_contents($output->getStream()), "foo\n", '->doWrite() writes to the stream');
}
}

View File

@ -0,0 +1,60 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\Console\Tester;
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\Console\Application;
use Symfony\Components\Console\Output\Output;
use Symfony\Components\Console\Tester\ApplicationTester;
class ApplicationTesterTest extends \PHPUnit_Framework_TestCase
{
protected $application;
protected $tester;
public function setUp()
{
$this->application = new Application();
$this->application->setAutoExit(false);
$this->application->register('foo')
->addArgument('command')
->addArgument('foo')
->setCode(function ($input, $output) { $output->writeln('foo'); })
;
$this->tester = new ApplicationTester($this->application);
$this->tester->run(array('command' => 'foo', 'foo' => 'bar'), array('interactive' => false, 'decorated' => false, 'verbosity' => Output::VERBOSITY_VERBOSE));
}
public function testRun()
{
$this->assertEquals($this->tester->getInput()->isInteractive(), false, '->execute() takes an interactive option');
$this->assertEquals($this->tester->getOutput()->isDecorated(), false, '->execute() takes a decorated option');
$this->assertEquals($this->tester->getOutput()->getVerbosity(), Output::VERBOSITY_VERBOSE, '->execute() takes a verbosity option');
}
public function testGetInput()
{
$this->assertEquals($this->tester->getInput()->getArgument('foo'), 'bar', '->getInput() returns the current input instance');
}
public function testGetOutput()
{
rewind($this->tester->getOutput()->getStream());
$this->assertEquals(stream_get_contents($this->tester->getOutput()->getStream()), "foo\n", '->getOutput() returns the current output instance');
}
public function testGetDisplay()
{
$this->assertEquals($this->tester->getDisplay(), "foo\n", '->getDisplay() returns the display of the last execution');
}
}

View File

@ -0,0 +1,57 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\Console\Tester;
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\Console\Command\Command;
use Symfony\Components\Console\Output\Output;
use Symfony\Components\Console\Tester\CommandTester;
class CommandTesterTest extends \PHPUnit_Framework_TestCase
{
protected $application;
protected $tester;
public function setUp()
{
$this->command = new Command('foo');
$this->command->addArgument('command');
$this->command->addArgument('foo');
$this->command->setCode(function ($input, $output) { $output->writeln('foo'); });
$this->tester = new CommandTester($this->command);
$this->tester->execute(array('foo' => 'bar'), array('interactive' => false, 'decorated' => false, 'verbosity' => Output::VERBOSITY_VERBOSE));
}
public function testExecute()
{
$this->assertEquals($this->tester->getInput()->isInteractive(), false, '->execute() takes an interactive option');
$this->assertEquals($this->tester->getOutput()->isDecorated(), false, '->execute() takes a decorated option');
$this->assertEquals($this->tester->getOutput()->getVerbosity(), Output::VERBOSITY_VERBOSE, '->execute() takes a verbosity option');
}
public function testGetInput()
{
$this->assertEquals($this->tester->getInput()->getArgument('foo'), 'bar', '->getInput() returns the current input instance');
}
public function testGetOutput()
{
rewind($this->tester->getOutput()->getStream());
$this->assertEquals(stream_get_contents($this->tester->getOutput()->getStream()), "foo\n", '->getOutput() returns the current output instance');
}
public function testGetDisplay()
{
$this->assertEquals($this->tester->getDisplay(), "foo\n", '->getDisplay() returns the display of the last execution');
}
}

View File

@ -0,0 +1,205 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\DependencyInjection;
require_once __DIR__.'/../../bootstrap.php';
use Symfony\Components\DependencyInjection\Builder;
use Symfony\Components\DependencyInjection\BuilderConfiguration;
use Symfony\Components\DependencyInjection\Definition;
use Symfony\Components\DependencyInjection\Reference;
use Symfony\Components\DependencyInjection\FileResource;
class BuilderConfigurationTest extends \PHPUnit_Framework_TestCase
{
static protected $fixturesPath;
static public function setUpBeforeClass()
{
self::$fixturesPath = __DIR__.'/../../../../fixtures/Symfony/Components/DependencyInjection/';
}
public function testConstructor()
{
$definitions = array(
'foo' => new Definition('FooClass'),
'bar' => new Definition('BarClass'),
);
$parameters = array(
'foo' => 'foo',
'bar' => 'bar',
);
$configuration = new BuilderConfiguration($definitions, $parameters);
$this->assertEquals($configuration->getDefinitions(), $definitions, '__construct() takes an array of definitions as its first argument');
$this->assertEquals($configuration->getParameters(), $parameters, '__construct() takes an array of parameters as its second argument');
}
public function testMerge()
{
$configuration = new BuilderConfiguration();
$configuration->merge(null);
$this->assertEquals($configuration->getParameters(), array(), '->merge() accepts null as an argument');
$this->assertEquals($configuration->getDefinitions(), array(), '->merge() accepts null as an argument');
$configuration = new BuilderConfiguration(array(), array('bar' => 'foo'));
$configuration1 = new BuilderConfiguration(array(), array('foo' => 'bar'));
$configuration->merge($configuration1);
$this->assertEquals($configuration->getParameters(), array('bar' => 'foo', 'foo' => 'bar'), '->merge() merges current parameters with the loaded ones');
$configuration = new BuilderConfiguration(array(), array('bar' => 'foo', 'foo' => 'baz'));
$config = new BuilderConfiguration(array(), array('foo' => 'bar'));
$configuration->merge($config);
$this->assertEquals($configuration->getParameters(), array('bar' => 'foo', 'foo' => 'bar'), '->merge() overrides existing parameters');
$configuration = new BuilderConfiguration(array('foo' => new Definition('FooClass'), 'bar' => new Definition('BarClass')));
$config = new BuilderConfiguration(array('baz' => new Definition('BazClass')));
$config->setAlias('alias_for_foo', 'foo');
$configuration->merge($config);
$this->assertEquals(array_keys($configuration->getDefinitions()), array('foo', 'bar', 'baz'), '->merge() merges definitions already defined ones');
$this->assertEquals($configuration->getAliases(), array('alias_for_foo' => 'foo'), '->merge() registers defined aliases');
$configuration = new BuilderConfiguration(array('foo' => new Definition('FooClass')));
$config->setDefinition('foo', new Definition('BazClass'));
$configuration->merge($config);
$this->assertEquals($configuration->getDefinition('foo')->getClass(), 'BazClass', '->merge() overrides already defined services');
$configuration = new BuilderConfiguration();
$configuration->addResource($a = new FileResource('foo.xml'));
$config = new BuilderConfiguration();
$config->addResource($b = new FileResource('foo.yml'));
$configuration->merge($config);
$this->assertEquals($configuration->getResources(), array($a, $b), '->merge() merges resources');
}
public function testSetGetParameters()
{
$configuration = new BuilderConfiguration();
$this->assertEquals($configuration->getParameters(), array(), '->getParameters() returns an empty array if no parameter has been defined');
$configuration->setParameters(array('foo' => 'bar'));
$this->assertEquals($configuration->getParameters(), array('foo' => 'bar'), '->setParameters() sets the parameters');
$configuration->setParameters(array('bar' => 'foo'));
$this->assertEquals($configuration->getParameters(), array('bar' => 'foo'), '->setParameters() overrides the previous defined parameters');
$configuration->setParameters(array('Bar' => 'foo'));
$this->assertEquals($configuration->getParameters(), array('bar' => 'foo'), '->setParameters() converts the key to lowercase');
}
public function testSetGetParameter()
{
$configuration = new BuilderConfiguration(array(), array('foo' => 'bar'));
$configuration->setParameter('bar', 'foo');
$this->assertEquals($configuration->getParameter('bar'), 'foo', '->setParameter() sets the value of a new parameter');
$configuration->setParameter('foo', 'baz');
$this->assertEquals($configuration->getParameter('foo'), 'baz', '->setParameter() overrides previously set parameter');
$configuration->setParameter('Foo', 'baz1');
$this->assertEquals($configuration->getParameter('foo'), 'baz1', '->setParameter() converts the key to lowercase');
$this->assertEquals($configuration->getParameter('FOO'), 'baz1', '->getParameter() converts the key to lowercase');
try
{
$configuration->getParameter('baba');
$this->fail('->getParameter() throws an \InvalidArgumentException if the key does not exist');
}
catch (\InvalidArgumentException $e)
{
}
}
public function testHasParameter()
{
$configuration = new BuilderConfiguration(array(), array('foo' => 'bar'));
$this->assertTrue($configuration->hasParameter('foo'), '->hasParameter() returns true if a parameter is defined');
$this->assertTrue($configuration->hasParameter('Foo'), '->hasParameter() converts the key to lowercase');
$this->assertTrue(!$configuration->hasParameter('bar'), '->hasParameter() returns false if a parameter is not defined');
}
public function testAddParameters()
{
$configuration = new BuilderConfiguration(array(), array('foo' => 'bar'));
$configuration->addParameters(array('bar' => 'foo'));
$this->assertEquals($configuration->getParameters(), array('foo' => 'bar', 'bar' => 'foo'), '->addParameters() adds parameters to the existing ones');
$configuration->addParameters(array('Bar' => 'fooz'));
$this->assertEquals($configuration->getParameters(), array('foo' => 'bar', 'bar' => 'fooz'), '->addParameters() converts keys to lowercase');
}
public function testAliases()
{
$configuration = new BuilderConfiguration();
$configuration->setAlias('bar', 'foo');
$this->assertEquals($configuration->getAlias('bar'), 'foo', '->setAlias() defines a new alias');
$this->assertTrue($configuration->hasAlias('bar'), '->hasAlias() returns true if the alias is defined');
$this->assertTrue(!$configuration->hasAlias('baba'), '->hasAlias() returns false if the alias is not defined');
try
{
$configuration->getAlias('baba');
$this->fail('->getAlias() throws an \InvalidArgumentException if the alias does not exist');
}
catch (\InvalidArgumentException $e)
{
}
$configuration->setAlias('barbar', 'foofoo');
$this->assertEquals($configuration->getAliases(), array('bar' => 'foo', 'barbar' => 'foofoo'), '->getAliases() returns an array of all defined aliases');
$configuration->addAliases(array('foo' => 'bar'));
$this->assertEquals($configuration->getAliases(), array('bar' => 'foo', 'barbar' => 'foofoo', 'foo' => 'bar'), '->addAliases() adds some aliases');
}
public function testDefinitions()
{
$configuration = new BuilderConfiguration();
$definitions = array(
'foo' => new Definition('FooClass'),
'bar' => new Definition('BarClass'),
);
$configuration->setDefinitions($definitions);
$this->assertEquals($configuration->getDefinitions(), $definitions, '->setDefinitions() sets the service definitions');
$this->assertTrue($configuration->hasDefinition('foo'), '->hasDefinition() returns true if a service definition exists');
$this->assertTrue(!$configuration->hasDefinition('foobar'), '->hasDefinition() returns false if a service definition does not exist');
$configuration->setDefinition('foobar', $foo = new Definition('FooBarClass'));
$this->assertEquals($configuration->getDefinition('foobar'), $foo, '->getDefinition() returns a service definition if defined');
$this->assertTrue($configuration->setDefinition('foobar', $foo = new Definition('FooBarClass')) === $foo, '->setDefinition() implements a fuild interface by returning the service reference');
$configuration->addDefinitions($defs = array('foobar' => new Definition('FooBarClass')));
$this->assertEquals($configuration->getDefinitions(), array_merge($definitions, $defs), '->addDefinitions() adds the service definitions');
try
{
$configuration->getDefinition('baz');
$this->fail('->getDefinition() throws an InvalidArgumentException if the service definition does not exist');
}
catch (\InvalidArgumentException $e)
{
}
}
public function testFindDefinition()
{
$configuration = new BuilderConfiguration(array('foo' => $definition = new Definition('FooClass')));
$configuration->setAlias('bar', 'foo');
$configuration->setAlias('foobar', 'bar');
$this->assertEquals($configuration->findDefinition('foobar'), $definition, '->findDefinition() returns a Definition');
}
public function testResources()
{
$configuration = new BuilderConfiguration();
$configuration->addResource($a = new FileResource('foo.xml'));
$configuration->addResource($b = new FileResource('foo.yml'));
$this->assertEquals($configuration->getResources(), array($a, $b), '->getResources() returns an array of resources read for the current configuration');
}
}

View File

@ -0,0 +1,328 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\DependencyInjection;
require_once __DIR__.'/../../bootstrap.php';
use Symfony\Components\DependencyInjection\Builder;
use Symfony\Components\DependencyInjection\BuilderConfiguration;
use Symfony\Components\DependencyInjection\Definition;
use Symfony\Components\DependencyInjection\Reference;
class BuilderTest extends \PHPUnit_Framework_TestCase
{
static protected $fixturesPath;
static public function setUpBeforeClass()
{
self::$fixturesPath = __DIR__.'/../../../../fixtures/Symfony/Components/DependencyInjection/';
}
public function testDefinitions()
{
$builder = new Builder();
$definitions = array(
'foo' => new Definition('FooClass'),
'bar' => new Definition('BarClass'),
);
$builder->setDefinitions($definitions);
$this->assertEquals($builder->getDefinitions(), $definitions, '->setDefinitions() sets the service definitions');
$this->assertTrue($builder->hasDefinition('foo'), '->hasDefinition() returns true if a service definition exists');
$this->assertTrue(!$builder->hasDefinition('foobar'), '->hasDefinition() returns false if a service definition does not exist');
$builder->setDefinition('foobar', $foo = new Definition('FooBarClass'));
$this->assertEquals($builder->getDefinition('foobar'), $foo, '->getDefinition() returns a service definition if defined');
$this->assertTrue($builder->setDefinition('foobar', $foo = new Definition('FooBarClass')) === $foo, '->setDefinition() implements a fuild interface by returning the service reference');
$builder->addDefinitions($defs = array('foobar' => new Definition('FooBarClass')));
$this->assertEquals($builder->getDefinitions(), array_merge($definitions, $defs), '->addDefinitions() adds the service definitions');
try
{
$builder->getDefinition('baz');
$this->fail('->getDefinition() throws an InvalidArgumentException if the service definition does not exist');
}
catch (\InvalidArgumentException $e)
{
}
}
public function testRegister()
{
$builder = new Builder();
$builder->register('foo', 'FooClass');
$this->assertTrue($builder->hasDefinition('foo'), '->register() registers a new service definition');
$this->assertTrue($builder->getDefinition('foo') instanceof Definition, '->register() returns the newly created Definition instance');
}
public function testHasService()
{
$builder = new Builder();
$this->assertTrue(!$builder->hasService('foo'), '->hasService() returns false if the service does not exist');
$builder->register('foo', 'FooClass');
$this->assertTrue($builder->hasService('foo'), '->hasService() returns true if a service definition exists');
$builder->bar = new \stdClass();
$this->assertTrue($builder->hasService('bar'), '->hasService() returns true if a service exists');
}
public function testGetService()
{
$builder = new Builder();
try
{
$builder->getService('foo');
$this->fail('->getService() throws an InvalidArgumentException if the service does not exist');
}
catch (\InvalidArgumentException $e)
{
}
$builder->register('foo', 'stdClass');
$this->assertTrue(is_object($builder->getService('foo')), '->getService() returns the service definition associated with the id');
$builder->bar = $bar = new \stdClass();
$this->assertEquals($builder->getService('bar'), $bar, '->getService() returns the service associated with the id');
$builder->register('bar', 'stdClass');
$this->assertEquals($builder->getService('bar'), $bar, '->getService() returns the service associated with the id even if a definition has been defined');
$builder->register('baz', 'stdClass')->setArguments(array(new Reference('baz')));
try
{
@$builder->getService('baz');
$this->fail('->getService() throws a LogicException if the service has a circular reference to itself');
}
catch (\LogicException $e)
{
}
$builder->register('foobar', 'stdClass')->setShared(true);
$this->assertTrue($builder->getService('bar') === $builder->getService('bar'), '->getService() always returns the same instance if the service is shared');
}
public function testGetServiceIds()
{
$builder = new Builder();
$builder->register('foo', 'stdClass');
$builder->bar = $bar = new \stdClass();
$builder->register('bar', 'stdClass');
$this->assertEquals($builder->getServiceIds(), array('foo', 'bar', 'service_container'), '->getServiceIds() returns all defined service ids');
}
public function testAliases()
{
$builder = new Builder();
$builder->register('foo', 'stdClass');
$builder->setAlias('bar', 'foo');
$this->assertTrue($builder->hasAlias('bar'), '->hasAlias() returns true if the alias exists');
$this->assertTrue(!$builder->hasAlias('foobar'), '->hasAlias() returns false if the alias does not exist');
$this->assertEquals($builder->getAlias('bar'), 'foo', '->getAlias() returns the aliased service');
$this->assertTrue($builder->hasService('bar'), '->setAlias() defines a new service');
$this->assertTrue($builder->getService('bar') === $builder->getService('foo'), '->setAlias() creates a service that is an alias to another one');
try
{
$builder->getAlias('foobar');
$this->fail('->getAlias() throws an InvalidArgumentException if the alias does not exist');
}
catch (\InvalidArgumentException $e)
{
}
}
public function testGetAliases()
{
$builder = new Builder();
$builder->setAlias('bar', 'foo');
$builder->setAlias('foobar', 'foo');
$this->assertEquals($builder->getAliases(), array('bar' => 'foo', 'foobar' => 'foo'), '->getAliases() returns all service aliases');
$builder->register('bar', 'stdClass');
$this->assertEquals($builder->getAliases(), array('foobar' => 'foo'), '->getAliases() does not return aliased services that have been overridden');
$builder->setService('foobar', 'stdClass');
$this->assertEquals($builder->getAliases(), array(), '->getAliases() does not return aliased services that have been overridden');
}
public function testCreateService()
{
$builder = new Builder();
$builder->register('foo1', 'FooClass')->setFile(self::$fixturesPath.'/includes/foo.php');
$this->assertTrue($builder->getService('foo1') instanceof \FooClass, '->createService() requires the file defined by the service definition');
$builder->register('foo2', 'FooClass')->setFile(self::$fixturesPath.'/includes/%file%.php');
$builder->setParameter('file', 'foo');
$this->assertTrue($builder->getService('foo2') instanceof \FooClass, '->createService() replaces parameters in the file provided by the service definition');
}
public function testCreateServiceClass()
{
$builder = new Builder();
$builder->register('foo1', '%class%');
$builder->setParameter('class', 'stdClass');
$this->assertTrue($builder->getService('foo1') instanceof \stdClass, '->createService() replaces parameters in the class provided by the service definition');
}
public function testCreateServiceArguments()
{
$builder = new Builder();
$builder->register('bar', 'stdClass');
$builder->register('foo1', 'FooClass')->addArgument(array('foo' => '%value%', '%value%' => 'foo', new Reference('bar')));
$builder->setParameter('value', 'bar');
$this->assertEquals($builder->getService('foo1')->arguments, array('foo' => 'bar', 'bar' => 'foo', $builder->getService('bar')), '->createService() replaces parameters and service references in the arguments provided by the service definition');
}
public function testCreateServiceConstructor()
{
$builder = new Builder();
$builder->register('bar', 'stdClass');
$builder->register('foo1', 'FooClass')->setConstructor('getInstance')->addArgument(array('foo' => '%value%', '%value%' => 'foo', new Reference('bar')));
$builder->setParameter('value', 'bar');
$this->assertTrue($builder->getService('foo1')->called, '->createService() calls the constructor to create the service instance');
$this->assertEquals($builder->getService('foo1')->arguments, array('foo' => 'bar', 'bar' => 'foo', $builder->getService('bar')), '->createService() passes the arguments to the constructor');
}
public function testCreateServiceMethodCalls()
{
$builder = new Builder();
$builder->register('bar', 'stdClass');
$builder->register('foo1', 'FooClass')->addMethodCall('setBar', array(array('%value%', new Reference('bar'))));
$builder->setParameter('value', 'bar');
$this->assertEquals($builder->getService('foo1')->bar, array('bar', $builder->getService('bar')), '->createService() replaces the values in the method calls arguments');
}
public function testCreateServiceConfigurator()
{
require_once self::$fixturesPath.'/includes/classes.php';
$builder = new Builder();
$builder->register('foo1', 'FooClass')->setConfigurator('sc_configure');
$this->assertTrue($builder->getService('foo1')->configured, '->createService() calls the configurator');
$builder->register('foo2', 'FooClass')->setConfigurator(array('%class%', 'configureStatic'));
$builder->setParameter('class', 'BazClass');
$this->assertTrue($builder->getService('foo2')->configured, '->createService() calls the configurator');
$builder->register('baz', 'BazClass');
$builder->register('foo3', 'FooClass')->setConfigurator(array(new Reference('baz'), 'configure'));
$this->assertTrue($builder->getService('foo3')->configured, '->createService() calls the configurator');
$builder->register('foo4', 'FooClass')->setConfigurator('foo');
try
{
$builder->getService('foo4');
$this->fail('->createService() throws an InvalidArgumentException if the configure callable is not a valid callable');
}
catch (\InvalidArgumentException $e)
{
}
}
public function testResolveValue()
{
$this->assertEquals(Builder::resolveValue('foo', array()), 'foo', '->resolveValue() returns its argument unmodified if no placeholders are found');
$this->assertEquals(Builder::resolveValue('I\'m a %foo%', array('foo' => 'bar')), 'I\'m a bar', '->resolveValue() replaces placeholders by their values');
$this->assertTrue(Builder::resolveValue('%foo%', array('foo' => true)) === true, '->resolveValue() replaces arguments that are just a placeholder by their value without casting them to strings');
$this->assertEquals(Builder::resolveValue(array('%foo%' => '%foo%'), array('foo' => 'bar')), array('bar' => 'bar'), '->resolveValue() replaces placeholders in keys and values of arrays');
$this->assertEquals(Builder::resolveValue(array('%foo%' => array('%foo%' => array('%foo%' => '%foo%'))), array('foo' => 'bar')), array('bar' => array('bar' => array('bar' => 'bar'))), '->resolveValue() replaces placeholders in nested arrays');
$this->assertEquals(Builder::resolveValue('I\'m a %%foo%%', array('foo' => 'bar')), 'I\'m a %foo%', '->resolveValue() supports % escaping by doubling it');
$this->assertEquals(Builder::resolveValue('I\'m a %foo% %%foo %foo%', array('foo' => 'bar')), 'I\'m a bar %foo bar', '->resolveValue() supports % escaping by doubling it');
try
{
Builder::resolveValue('%foobar%', array());
$this->fail('->resolveValue() throws a RuntimeException if a placeholder references a non-existant parameter');
}
catch (\RuntimeException $e)
{
}
try
{
Builder::resolveValue('foo %foobar% bar', array());
$this->fail('->resolveValue() throws a RuntimeException if a placeholder references a non-existant parameter');
}
catch (\RuntimeException $e)
{
}
}
public function testResolveServices()
{
$builder = new Builder();
$builder->register('foo', 'FooClass');
$this->assertEquals($builder->resolveServices(new Reference('foo')), $builder->getService('foo'), '->resolveServices() resolves service references to service instances');
$this->assertEquals($builder->resolveServices(array('foo' => array('foo', new Reference('foo')))), array('foo' => array('foo', $builder->getService('foo'))), '->resolveServices() resolves service references to service instances in nested arrays');
}
public function testMerge()
{
$container = new Builder();
$container->merge(null);
$this->assertEquals($container->getParameters(), array(), '->merge() accepts null as an argument');
$this->assertEquals($container->getDefinitions(), array(), '->merge() accepts null as an argument');
$container = new Builder(array('bar' => 'foo'));
$config = new BuilderConfiguration();
$config->setParameters(array('foo' => 'bar'));
$container->merge($config);
$this->assertEquals($container->getParameters(), array('bar' => 'foo', 'foo' => 'bar'), '->merge() merges current parameters with the loaded ones');
$container = new Builder(array('bar' => 'foo', 'foo' => 'baz'));
$config = new BuilderConfiguration();
$config->setParameters(array('foo' => 'bar'));
$container->merge($config);
$this->assertEquals($container->getParameters(), array('bar' => 'foo', 'foo' => 'baz'), '->merge() does not change the already defined parameters');
$container = new Builder(array('bar' => 'foo'));
$config = new BuilderConfiguration();
$config->setParameters(array('foo' => '%bar%'));
$container->merge($config);
$this->assertEquals($container->getParameters(), array('bar' => 'foo', 'foo' => 'foo'), '->merge() evaluates the values of the parameters towards already defined ones');
$container = new Builder(array('bar' => 'foo'));
$config = new BuilderConfiguration();
$config->setParameters(array('foo' => '%bar%', 'baz' => '%foo%'));
$container->merge($config);
$this->assertEquals($container->getParameters(), array('bar' => 'foo', 'foo' => 'foo', 'baz' => 'foo'), '->merge() evaluates the values of the parameters towards already defined ones');
$container = new Builder();
$container->register('foo', 'FooClass');
$container->register('bar', 'BarClass');
$config = new BuilderConfiguration();
$config->setDefinition('baz', new Definition('BazClass'));
$config->setAlias('alias_for_foo', 'foo');
$container->merge($config);
$this->assertEquals(array_keys($container->getDefinitions()), array('foo', 'bar', 'baz'), '->merge() merges definitions already defined ones');
$this->assertEquals($container->getAliases(), array('alias_for_foo' => 'foo'), '->merge() registers defined aliases');
$container = new Builder();
$container->register('foo', 'FooClass');
$config->setDefinition('foo', new Definition('BazClass'));
$container->merge($config);
$this->assertEquals($container->getDefinition('foo')->getClass(), 'BazClass', '->merge() overrides already defined services');
}
public function testFindAnnotatedServiceIds()
{
$builder = new Builder();
$builder
->register('foo', 'FooClass')
->addAnnotation('foo', array('foo' => 'foo'))
->addAnnotation('bar', array('bar' => 'bar'))
->addAnnotation('foo', array('foofoo' => 'foofoo'))
;
$this->assertEquals($builder->findAnnotatedServiceIds('foo'), array(
'foo' => array(
array('foo' => 'foo'),
array('foofoo' => 'foofoo'),
)
), '->findAnnotatedServiceIds() returns an array of service ids and its annotation attributes');
$this->assertEquals($builder->findAnnotatedServiceIds('foobar'), array(), '->findAnnotatedServiceIds() returns an empty array if there is annotated services');
}
}

View File

@ -0,0 +1,208 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\DependencyInjection;
require_once __DIR__.'/../../bootstrap.php';
use Symfony\Components\DependencyInjection\Container;
class ContainerTest extends \PHPUnit_Framework_TestCase
{
public function testConstructor()
{
$sc = new Container();
$this->assertEquals(spl_object_hash($sc->getService('service_container')), spl_object_hash($sc), '__construct() automatically registers itself as a service');
$sc = new Container(array('foo' => 'bar'));
$this->assertEquals($sc->getParameters(), array('foo' => 'bar'), '__construct() takes an array of parameters as its first argument');
}
public function testGetSetParameters()
{
$sc = new Container();
$this->assertEquals($sc->getParameters(), array(), '->getParameters() returns an empty array if no parameter has been defined');
$sc->setParameters(array('foo' => 'bar'));
$this->assertEquals($sc->getParameters(), array('foo' => 'bar'), '->setParameters() sets the parameters');
$sc->setParameters(array('bar' => 'foo'));
$this->assertEquals($sc->getParameters(), array('bar' => 'foo'), '->setParameters() overrides the previous defined parameters');
$sc->setParameters(array('Bar' => 'foo'));
$this->assertEquals($sc->getParameters(), array('bar' => 'foo'), '->setParameters() converts the key to lowercase');
}
public function testGetSetParameter()
{
$sc = new Container(array('foo' => 'bar'));
$sc->setParameter('bar', 'foo');
$this->assertEquals($sc->getParameter('bar'), 'foo', '->setParameter() sets the value of a new parameter');
$this->assertEquals($sc['bar'], 'foo', '->offsetGet() gets the value of a parameter');
$sc['bar1'] = 'foo1';
$this->assertEquals($sc['bar1'], 'foo1', '->offsetset() sets the value of a parameter');
unset($sc['bar1']);
$this->assertTrue(!isset($sc['bar1']), '->offsetUnset() removes a parameter');
$sc->setParameter('foo', 'baz');
$this->assertEquals($sc->getParameter('foo'), 'baz', '->setParameter() overrides previously set parameter');
$sc->setParameter('Foo', 'baz1');
$this->assertEquals($sc->getParameter('foo'), 'baz1', '->setParameter() converts the key to lowercase');
$this->assertEquals($sc->getParameter('FOO'), 'baz1', '->getParameter() converts the key to lowercase');
$this->assertEquals($sc['FOO'], 'baz1', '->offsetGet() converts the key to lowercase');
try
{
$sc->getParameter('baba');
$this->fail('->getParameter() thrown an \InvalidArgumentException if the key does not exist');
}
catch (\InvalidArgumentException $e)
{
}
try
{
$sc['baba'];
$this->fail('->offsetGet() thrown an \InvalidArgumentException if the key does not exist');
}
catch (\InvalidArgumentException $e)
{
}
}
public function testHasParameter()
{
$sc = new Container(array('foo' => 'bar'));
$this->assertTrue($sc->hasParameter('foo'), '->hasParameter() returns true if a parameter is defined');
$this->assertTrue($sc->hasParameter('Foo'), '->hasParameter() converts the key to lowercase');
$this->assertTrue(isset($sc['Foo']), '->offsetExists() converts the key to lowercase');
$this->assertTrue(!$sc->hasParameter('bar'), '->hasParameter() returns false if a parameter is not defined');
$this->assertTrue(isset($sc['foo']), '->offsetExists() returns true if a parameter is defined');
$this->assertTrue(!isset($sc['bar']), '->offsetExists() returns false if a parameter is not defined');
}
public function testAddParameters()
{
$sc = new Container(array('foo' => 'bar'));
$sc->addParameters(array('bar' => 'foo'));
$this->assertEquals($sc->getParameters(), array('foo' => 'bar', 'bar' => 'foo'), '->addParameters() adds parameters to the existing ones');
$sc->addParameters(array('Bar' => 'fooz'));
$this->assertEquals($sc->getParameters(), array('foo' => 'bar', 'bar' => 'fooz'), '->addParameters() converts keys to lowercase');
}
public function testServices()
{
$sc = new Container();
$sc->setService('foo', $obj = new \stdClass());
$this->assertEquals(spl_object_hash($sc->getService('foo')), spl_object_hash($obj), '->setService() registers a service under a key name');
$sc->foo1 = $obj1 = new \stdClass();
$this->assertEquals(spl_object_hash($sc->foo1), spl_object_hash($obj1), '->__set() sets a service');
$this->assertEquals(spl_object_hash($sc->foo), spl_object_hash($obj), '->__get() gets a service by name');
$this->assertTrue($sc->hasService('foo'), '->hasService() returns true if the service is defined');
$this->assertTrue(isset($sc->foo), '->__isset() returns true if the service is defined');
$this->assertTrue(!$sc->hasService('bar'), '->hasService() returns false if the service is not defined');
$this->assertTrue(!isset($sc->bar), '->__isset() returns false if the service is not defined');
}
public function testGetServiceIds()
{
$sc = new Container();
$sc->setService('foo', $obj = new \stdClass());
$sc->setService('bar', $obj = new \stdClass());
$this->assertEquals($sc->getServiceIds(), array('service_container', 'foo', 'bar'), '->getServiceIds() returns all defined service ids');
$sc = new ProjectServiceContainer();
$this->assertEquals(spl_object_hash($sc->getService('bar')), spl_object_hash($sc->__bar), '->getService() looks for a getXXXService() method');
$this->assertTrue($sc->hasService('bar'), '->hasService() returns true if the service has been defined as a getXXXService() method');
$sc->setService('bar', $bar = new \stdClass());
$this->assertNotEquals(spl_object_hash($sc->getService('bar')), spl_object_hash($bar), '->getService() prefers to return a service defined with a getXXXService() method than one defined with setService()');
try
{
$sc->getService('baba');
$this->fail('->getService() thrown an \InvalidArgumentException if the service does not exist');
}
catch (\InvalidArgumentException $e)
{
}
try
{
$sc->baba;
$this->fail('->__get() thrown an \InvalidArgumentException if the service does not exist');
}
catch (\InvalidArgumentException $e)
{
}
try
{
unset($sc->baba);
$this->fail('->__unset() thrown an LogicException if you try to remove a service');
}
catch (\LogicException $e)
{
}
$this->assertEquals(spl_object_hash($sc->getService('foo_bar')), spl_object_hash($sc->__foo_bar), '->getService() camelizes the service id when looking for a method');
$this->assertEquals(spl_object_hash($sc->getService('foo.baz')), spl_object_hash($sc->__foo_baz), '->getService() camelizes the service id when looking for a method');
}
public function testMagicCall()
{
$sc = new Container();
$sc->setService('foo_bar.foo', $foo = new \stdClass());
$this->assertEquals($sc->getFooBar_FooService(), $foo, '__call() finds services is the method is getXXXService()');
try
{
$sc->getFooBar_Foo();
$this->fail('__call() throws a \RuntimeException exception if the method is not a service method');
}
catch (\RuntimeException $e)
{
}
}
}
class ProjectServiceContainer extends Container
{
public $__bar, $__foo_bar, $__foo_baz;
public function __construct()
{
parent::__construct();
$this->__bar = new \stdClass();
$this->__foo_bar = new \stdClass();
$this->__foo_baz = new \stdClass();
}
protected function getBarService()
{
return $this->__bar;
}
protected function getFooBarService()
{
return $this->__foo_bar;
}
protected function getFoo_BazService()
{
return $this->__foo_baz;
}
}

View File

@ -0,0 +1,88 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\DependencyInjection;
require_once __DIR__.'/../../bootstrap.php';
use Symfony\Components\DependencyInjection\Builder;
class CrossCheckTest extends \PHPUnit_Framework_TestCase
{
static protected $fixturesPath;
static public function setUpBeforeClass()
{
self::$fixturesPath = __DIR__.'/../../../../fixtures/Symfony/Components/DependencyInjection/';
require_once self::$fixturesPath.'/includes/classes.php';
require_once self::$fixturesPath.'/includes/foo.php';
}
public function testCrossCheck()
{
// cross-check loaders/dumpers
$fixtures = array(
'services1.xml' => 'xml',
'services2.xml' => 'xml',
'services6.xml' => 'xml',
'services8.xml' => 'xml',
'services9.xml' => 'xml',
'services1.yml' => 'yaml',
'services2.yml' => 'yaml',
'services6.yml' => 'yaml',
'services8.yml' => 'yaml',
'services9.yml' => 'yaml',
);
foreach ($fixtures as $fixture => $type)
{
$loaderClass = 'Symfony\\Components\\DependencyInjection\\Loader\\'.ucfirst($type).'FileLoader';
$dumperClass = 'Symfony\\Components\\DependencyInjection\\Dumper\\'.ucfirst($type).'Dumper';
$container1 = new Builder();
$loader1 = new $loaderClass($container1);
$loader1->load(self::$fixturesPath.'/'.$type.'/'.$fixture);
$container1->setParameter('path', self::$fixturesPath.'/includes');
$dumper = new $dumperClass($container1);
$tmp = tempnam('sf_service_container', 'sf');
file_put_contents($tmp, $dumper->dump());
$container2 = new Builder();
$loader2 = new $loaderClass($container2);
$loader2->load($tmp);
$container2->setParameter('path', self::$fixturesPath.'/includes');
unlink($tmp);
$this->assertEquals(serialize($container1), serialize($container2), 'loading a dump from a previously loaded container returns the same container');
$this->assertEquals($container1->getParameters(), $container2->getParameters(), '->getParameters() returns the same value for both containers');
$services1 = array();
foreach ($container1 as $id => $service)
{
$services1[$id] = serialize($service);
}
$services2 = array();
foreach ($container2 as $id => $service)
{
$services2[$id] = serialize($service);
}
unset($services1['service_container'], $services2['service_container']);
$this->assertEquals($services1, $services2, 'Iterator on the containers returns the same services');
}
}
}

View File

@ -0,0 +1,95 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\DependencyInjection;
require_once __DIR__.'/../../bootstrap.php';
use Symfony\Components\DependencyInjection\Definition;
class DefinitionTest extends \PHPUnit_Framework_TestCase
{
public function testConstructor()
{
$def = new Definition('stdClass');
$this->assertEquals($def->getClass(), 'stdClass', '__construct() takes the class name as its first argument');
$def = new Definition('stdClass', array('foo'));
$this->assertEquals($def->getArguments(), array('foo'), '__construct() takes an optional array of arguments as its second argument');
}
public function testSetGetConstructor()
{
$def = new Definition('stdClass');
$this->assertEquals(spl_object_hash($def->setConstructor('foo')), spl_object_hash($def), '->setConstructor() implements a fluent interface');
$this->assertEquals($def->getConstructor(), 'foo', '->getConstructor() returns the constructor name');
}
public function testSetGetClass()
{
$def = new Definition('stdClass');
$this->assertEquals(spl_object_hash($def->setClass('foo')), spl_object_hash($def), '->setClass() implements a fluent interface');
$this->assertEquals($def->getClass(), 'foo', '->getClass() returns the class name');
}
public function testArguments()
{
$def = new Definition('stdClass');
$this->assertEquals(spl_object_hash($def->setArguments(array('foo'))), spl_object_hash($def), '->setArguments() implements a fluent interface');
$this->assertEquals($def->getArguments(), array('foo'), '->getArguments() returns the arguments');
$this->assertEquals(spl_object_hash($def->addArgument('bar')), spl_object_hash($def), '->addArgument() implements a fluent interface');
$this->assertEquals($def->getArguments(), array('foo', 'bar'), '->addArgument() adds an argument');
}
public function testMethodCalls()
{
$def = new Definition('stdClass');
$this->assertEquals(spl_object_hash($def->setMethodCalls(array(array('foo', array('foo'))))), spl_object_hash($def), '->setMethodCalls() implements a fluent interface');
$this->assertEquals($def->getMethodCalls(), array(array('foo', array('foo'))), '->getMethodCalls() returns the methods to call');
$this->assertEquals(spl_object_hash($def->addMethodCall('bar', array('bar'))), spl_object_hash($def), '->addMethodCall() implements a fluent interface');
$this->assertEquals($def->getMethodCalls(), array(array('foo', array('foo')), array('bar', array('bar'))), '->addMethodCall() adds a method to call');
}
public function testSetGetFile()
{
$def = new Definition('stdClass');
$this->assertEquals(spl_object_hash($def->setFile('foo')), spl_object_hash($def), '->setFile() implements a fluent interface');
$this->assertEquals($def->getFile(), 'foo', '->getFile() returns the file to include');
}
public function testSetIsShared()
{
$def = new Definition('stdClass');
$this->assertEquals($def->isShared(), true, '->isShared() returns true by default');
$this->assertEquals(spl_object_hash($def->setShared(false)), spl_object_hash($def), '->setShared() implements a fluent interface');
$this->assertEquals($def->isShared(), false, '->isShared() returns false if the instance must not be shared');
}
public function testSetGetConfigurator()
{
$def = new Definition('stdClass');
$this->assertEquals(spl_object_hash($def->setConfigurator('foo')), spl_object_hash($def), '->setConfigurator() implements a fluent interface');
$this->assertEquals($def->getConfigurator(), 'foo', '->getConfigurator() returns the configurator');
}
public function testAnnotations()
{
$def = new Definition('stdClass');
$this->assertEquals(spl_object_hash($def->addAnnotation('foo')), spl_object_hash($def), '->addAnnotation() implements a fluent interface');
$this->assertEquals($def->getAnnotation('foo'), array(array()), '->getAnnotation() returns attributes for an annotation name');
$def->addAnnotation('foo', array('foo' => 'bar'));
$this->assertEquals($def->getAnnotation('foo'), array(array(), array('foo' => 'bar')), '->addAnnotation() can adds the same annotation several times');
$def->addAnnotation('bar', array('bar' => 'bar'));
$this->assertEquals($def->getAnnotations(), array(
'foo' => array(array(), array('foo' => 'bar')),
'bar' => array(array('bar' => 'bar')),
), '->getAnnotations() returns all annotations');
}
}

View File

@ -0,0 +1,37 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\DependencyInjection\Dumper;
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\DependencyInjection\Builder;
use Symfony\Components\DependencyInjection\Dumper\Dumper;
class DumperTest extends \PHPUnit_Framework_TestCase
{
public function testDump()
{
$builder = new Builder();
$dumper = new ProjectDumper($builder);
try
{
$dumper->dump();
$this->fail('->dump() returns a LogicException if the dump() method has not been overriden by a children class');
}
catch (\LogicException $e)
{
}
}
}
class ProjectDumper extends Dumper
{
}

View File

@ -0,0 +1,55 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\DependencyInjection\Dumper;
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\DependencyInjection\Builder;
use Symfony\Components\DependencyInjection\Dumper\GraphvizDumper;
class GraphvizDumperTest extends \PHPUnit_Framework_TestCase
{
static protected $fixturesPath;
static public function setUpBeforeClass()
{
self::$fixturesPath = __DIR__.'/../../../../../fixtures/Symfony/Components/DependencyInjection/';
}
public function testDump()
{
$dumper = new GraphvizDumper($container = new Builder());
$this->assertEquals($dumper->dump(), file_get_contents(self::$fixturesPath.'/graphviz/services1.dot'), '->dump() dumps an empty container as an empty dot file');
$container = new Builder();
$dumper = new GraphvizDumper($container);
$container = include self::$fixturesPath.'/containers/container9.php';
$dumper = new GraphvizDumper($container);
$this->assertEquals($dumper->dump(), str_replace('%path%', __DIR__, file_get_contents(self::$fixturesPath.'/graphviz/services9.dot')), '->dump() dumps services');
$container = include self::$fixturesPath.'/containers/container10.php';
$dumper = new GraphvizDumper($container);
$this->assertEquals($dumper->dump(), str_replace('%path%', __DIR__, file_get_contents(self::$fixturesPath.'/graphviz/services10.dot')), '->dump() dumps services');
$container = include self::$fixturesPath.'/containers/container10.php';
$dumper = new GraphvizDumper($container);
$this->assertEquals($dumper->dump(array(
'graph' => array('ratio' => 'normal'),
'node' => array('fontsize' => 13, 'fontname' => 'Verdana', 'shape' => 'square'),
'edge' => array('fontsize' => 12, 'fontname' => 'Verdana', 'color' => 'white', 'arrowhead' => 'closed', 'arrowsize' => 1),
'node.instance' => array('fillcolor' => 'green', 'style' => 'empty'),
'node.definition' => array('fillcolor' => 'grey'),
'node.missing' => array('fillcolor' => 'red', 'style' => 'empty'),
)), str_replace('%path%', __DIR__, file_get_contents(self::$fixturesPath.'/graphviz/services10-1.dot')), '->dump() dumps services');
}
}

View File

@ -0,0 +1,62 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\DependencyInjection\Dumper;
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\DependencyInjection\Builder;
use Symfony\Components\DependencyInjection\Dumper\PhpDumper;
class PhpDumperTest extends \PHPUnit_Framework_TestCase
{
static protected $fixturesPath;
static public function setUpBeforeClass()
{
self::$fixturesPath = realpath(__DIR__.'/../../../../../fixtures/Symfony/Components/DependencyInjection/');
}
public function testDump()
{
$dumper = new PhpDumper($container = new Builder());
$this->assertEquals($dumper->dump(), file_get_contents(self::$fixturesPath.'/php/services1.php'), '->dump() dumps an empty container as an empty PHP class');
$this->assertEquals($dumper->dump(array('class' => 'Container', 'base_class' => 'AbstractContainer')), file_get_contents(self::$fixturesPath.'/php/services1-1.php'), '->dump() takes a class and a base_class options');
$container = new Builder();
$dumper = new PhpDumper($container);
}
public function testAddParameters()
{
$container = include self::$fixturesPath.'/containers/container8.php';
$dumper = new PhpDumper($container);
$this->assertEquals($dumper->dump(), file_get_contents(self::$fixturesPath.'/php/services8.php'), '->dump() dumps parameters');
}
public function testAddService()
{
$container = include self::$fixturesPath.'/containers/container9.php';
$dumper = new PhpDumper($container);
$this->assertEquals($dumper->dump(), str_replace('%path%', self::$fixturesPath.'/includes', file_get_contents(self::$fixturesPath.'/php/services9.php')), '->dump() dumps services');
$dumper = new PhpDumper($container = new Builder());
$container->register('foo', 'FooClass')->addArgument(new \stdClass());
try
{
$dumper->dump();
$this->fail('->dump() throws a RuntimeException if the container to be dumped has reference to objects or resources');
}
catch (\RuntimeException $e)
{
}
}
}

View File

@ -0,0 +1,61 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\DependencyInjection\Dumper;
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\DependencyInjection\Builder;
use Symfony\Components\DependencyInjection\Dumper\XmlDumper;
class XmlDumperTest extends \PHPUnit_Framework_TestCase
{
static protected $fixturesPath;
static public function setUpBeforeClass()
{
self::$fixturesPath = realpath(__DIR__.'/../../../../../fixtures/Symfony/Components/DependencyInjection/');
}
public function testDump()
{
$dumper = new XmlDumper($container = new Builder());
$this->assertEquals($dumper->dump(), file_get_contents(self::$fixturesPath.'/xml/services1.xml'), '->dump() dumps an empty container as an empty XML file');
$container = new Builder();
$dumper = new XmlDumper($container);
}
public function testAddParemeters()
{
$container = include self::$fixturesPath.'//containers/container8.php';
$dumper = new XmlDumper($container);
$this->assertEquals($dumper->dump(), file_get_contents(self::$fixturesPath.'/xml/services8.xml'), '->dump() dumps parameters');
}
public function testAddService()
{
$container = include self::$fixturesPath.'/containers/container9.php';
$dumper = new XmlDumper($container);
$this->assertEquals($dumper->dump(), str_replace('%path%', self::$fixturesPath.'/includes', file_get_contents(self::$fixturesPath.'/xml/services9.xml')), '->dump() dumps services');
$dumper = new XmlDumper($container = new Builder());
$container->register('foo', 'FooClass')->addArgument(new \stdClass());
try
{
$dumper->dump();
$this->fail('->dump() throws a RuntimeException if the container to be dumped has reference to objects or resources');
}
catch (\RuntimeException $e)
{
}
}
}

View File

@ -0,0 +1,61 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\DependencyInjection\Dumper;
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\DependencyInjection\Builder;
use Symfony\Components\DependencyInjection\Dumper\YamlDumper;
class YamlDumperTest extends \PHPUnit_Framework_TestCase
{
static protected $fixturesPath;
static public function setUpBeforeClass()
{
self::$fixturesPath = realpath(__DIR__.'/../../../../../fixtures/Symfony/Components/DependencyInjection/');
}
public function testDump()
{
$dumper = new YamlDumper($container = new Builder());
$this->assertEquals($dumper->dump(), file_get_contents(self::$fixturesPath.'/yaml/services1.yml'), '->dump() dumps an empty container as an empty YAML file');
$container = new Builder();
$dumper = new YamlDumper($container);
}
public function testAddParameters()
{
$container = include self::$fixturesPath.'/containers/container8.php';
$dumper = new YamlDumper($container);
$this->assertEquals($dumper->dump(), file_get_contents(self::$fixturesPath.'/yaml/services8.yml'), '->dump() dumps parameters');
}
public function testAddService()
{
$container = include self::$fixturesPath.'/containers/container9.php';
$dumper = new YamlDumper($container);
$this->assertEquals($dumper->dump(), str_replace('%path%', self::$fixturesPath.'/includes', file_get_contents(self::$fixturesPath.'/yaml/services9.yml')), '->dump() dumps services');
$dumper = new YamlDumper($container = new Builder());
$container->register('foo', 'FooClass')->addArgument(new \stdClass());
try
{
$dumper->dump();
$this->fail('->dump() throws a RuntimeException if the container to be dumped has reference to objects or resources');
}
catch (\RuntimeException $e)
{
}
}
}

View File

@ -0,0 +1,47 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\DependencyInjection;
require_once __DIR__.'/../../bootstrap.php';
use Symfony\Components\DependencyInjection\FileResource;
class FileResourceTest extends \PHPUnit_Framework_TestCase
{
protected $resource;
protected $file;
public function setUp()
{
$this->file = sys_get_temp_dir().'/tmp.xml';
touch($this->file);
$this->resource = new FileResource($this->file);
}
public function tearDown()
{
unlink($this->file);
}
public function testGetResource()
{
$this->assertEquals($this->resource->getResource(), $this->file, '->getResource() returns the path to the resource');
}
public function testIsUptodate()
{
$this->assertTrue($this->resource->isUptodate(time() + 10), '->isUptodate() returns true if the resource has not changed');
$this->assertTrue(!$this->resource->isUptodate(time() - 86400), '->isUptodate() returns false if the resource has been updated');
$resource = new FileResource('/____foo/foobar'.rand(1, 999999));
$this->assertTrue(!$resource->isUptodate(time()), '->isUptodate() returns false if the resource does not exist');
}
}

View File

@ -0,0 +1,57 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\DependencyInjection\Loader;
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\DependencyInjection\Builder;
use Symfony\Components\DependencyInjection\Loader\FileLoader;
class XmlDumperTest extends \PHPUnit_Framework_TestCase
{
public function testConstructor()
{
$loader = new ProjectLoader(__DIR__);
$this->assertEquals($loader->paths, array(__DIR__), '__construct() takes a path as its second argument');
$loader = new ProjectLoader(array(__DIR__, __DIR__));
$this->assertEquals($loader->paths, array(__DIR__, __DIR__), '__construct() takes an array of paths as its second argument');
}
public function testGetAbsolutePath()
{
$loader = new ProjectLoader(array(__DIR__.'/../../../../../bin'));
$this->assertEquals($loader->getAbsolutePath('/foo.xml'), '/foo.xml', '->getAbsolutePath() return the path unmodified if it is already an absolute path');
$this->assertEquals($loader->getAbsolutePath('c:\\\\foo.xml'), 'c:\\\\foo.xml', '->getAbsolutePath() return the path unmodified if it is already an absolute path');
$this->assertEquals($loader->getAbsolutePath('c:/foo.xml'), 'c:/foo.xml', '->getAbsolutePath() return the path unmodified if it is already an absolute path');
$this->assertEquals($loader->getAbsolutePath('\\server\\foo.xml'), '\\server\\foo.xml', '->getAbsolutePath() return the path unmodified if it is already an absolute path');
$this->assertEquals($loader->getAbsolutePath('FileLoaderTest.php', __DIR__), __DIR__.'/FileLoaderTest.php', '->getAbsolutePath() returns an absolute filename if the file exists in the current path');
$this->assertEquals($loader->getAbsolutePath('prove.php', __DIR__), __DIR__.'/../../../../../bin/prove.php', '->getAbsolutePath() returns an absolute filename if the file exists in one of the paths given in the constructor');
$this->assertEquals($loader->getAbsolutePath('foo.xml', __DIR__), 'foo.xml', '->getAbsolutePath() returns the path unmodified if it is unable to find it in the given paths');
}
}
class ProjectLoader extends FileLoader
{
public $paths;
public function load($resource)
{
}
public function getAbsolutePath($file, $currentPath = null)
{
return parent::getAbsolutePath($file, $currentPath);
}
}

View File

@ -0,0 +1,51 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\DependencyInjection\Loader;
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\DependencyInjection\Builder;
use Symfony\Components\DependencyInjection\Loader\IniFileLoader;
class IniLoaderTest extends \PHPUnit_Framework_TestCase
{
static protected $fixturesPath;
static public function setUpBeforeClass()
{
self::$fixturesPath = realpath(__DIR__.'/../../../../../fixtures/Symfony/Components/DependencyInjection/');
}
public function testLoader()
{
$loader = new IniFileLoader(self::$fixturesPath.'/ini');
$config = $loader->load('parameters.ini');
$this->assertEquals($config->getParameters(), array('foo' => 'bar', 'bar' => '%foo%'), '->load() takes a single file name as its first argument');
try
{
$loader->load('foo.ini');
$this->fail('->load() throws an InvalidArgumentException if the loaded file does not exist');
}
catch (\InvalidArgumentException $e)
{
}
try
{
@$loader->load('nonvalid.ini');
$this->fail('->load() throws an InvalidArgumentException if the loaded file is not parseable');
}
catch (\InvalidArgumentException $e)
{
}
}
}

View File

@ -0,0 +1,35 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\DependencyInjection\Loader;
require_once __DIR__.'/../../../bootstrap.php';
require_once __DIR__.'/../../../../../fixtures/Symfony/Components/DependencyInjection/includes/ProjectExtension.php';
class LoaderExtensionTest extends \PHPUnit_Framework_TestCase
{
public function testLoad()
{
$extension = new \ProjectExtension();
try
{
$extension->load('foo', array());
$this->fail('->load() throws an InvalidArgumentException if the tag does not exist');
}
catch (\InvalidArgumentException $e)
{
}
$config = $extension->load('bar', array('foo' => 'bar'));
$this->assertEquals($config->getParameters(), array('project.parameter.bar' => 'bar'), '->load() calls the method tied to the given tag');
}
}

View File

@ -8,22 +8,26 @@
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../../bootstrap.php';
namespace Symfony\Tests\Components\DependencyInjection\Loader;
use Symfony\Components\DependencyInjection\Loader\Loader;
require_once __DIR__.'/../../../bootstrap.php';
require_once __DIR__.'/../../../../../fixtures/Symfony/Components/DependencyInjection/includes/ProjectExtension.php';
class ProjectLoader extends Loader
use Symfony\Components\DependencyInjection\Loader\Loader;
class ProjectLoader1 extends Loader
{
public function load($resource)
{
}
}
$t = new LimeTest(1);
// ::registerExtension() ::getExtension()
$t->diag('::registerExtension() ::getExtension()');
ProjectLoader::registerExtension($extension = new ProjectExtension());
$t->ok(ProjectLoader::getExtension('project') === $extension, '::registerExtension() registers an extension');
class LoaderTest extends \PHPUnit_Framework_TestCase
{
public function testExtension()
{
ProjectLoader1::registerExtension($extension = new \ProjectExtension());
$this->assertTrue(ProjectLoader1::getExtension('project') === $extension, '::registerExtension() registers an extension');
}
}

View File

@ -0,0 +1,203 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\DependencyInjection\Loader;
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\DependencyInjection\Builder;
use Symfony\Components\DependencyInjection\Reference;
use Symfony\Components\DependencyInjection\Definition;
use Symfony\Components\DependencyInjection\Loader\Loader;
use Symfony\Components\DependencyInjection\Loader\XmlFileLoader;
class XmlFileLoaderTest extends \PHPUnit_Framework_TestCase
{
static protected $fixturesPath;
static public function setUpBeforeClass()
{
self::$fixturesPath = realpath(__DIR__.'/../../../../../fixtures/Symfony/Components/DependencyInjection/');
require_once self::$fixturesPath.'/includes/ProjectExtension.php';
}
public function testLoad()
{
$loader = new ProjectLoader2(self::$fixturesPath.'/ini');
try
{
$loader->load('foo.xml');
$this->fail('->load() throws an InvalidArgumentException if the loaded file does not exist');
}
catch (\InvalidArgumentException $e)
{
}
}
public function testParseFile()
{
$loader = new ProjectLoader2(self::$fixturesPath.'/ini');
try
{
$loader->parseFile(self::$fixturesPath.'/ini/parameters.ini');
$this->fail('->parseFile() throws an InvalidArgumentException if the loaded file is not a valid XML file');
}
catch (\InvalidArgumentException $e)
{
}
$loader = new ProjectLoader2(self::$fixturesPath.'/xml');
try
{
$loader->parseFile(self::$fixturesPath.'/xml/nonvalid.xml');
$this->fail('->parseFile() throws an InvalidArgumentException if the loaded file does not validate the XSD');
}
catch (\InvalidArgumentException $e)
{
}
$xml = $loader->parseFile(self::$fixturesPath.'/xml/services1.xml');
$this->assertEquals(get_class($xml), 'Symfony\\Components\\DependencyInjection\\SimpleXMLElement', '->parseFile() returns an SimpleXMLElement object');
}
public function testLoadParameters()
{
$loader = new ProjectLoader2(self::$fixturesPath.'/xml');
$config = $loader->load('services2.xml');
$actual = $config->getParameters();
$expected = array('a string', 'foo' => 'bar', 'values' => array(0, 'integer' => 4, 100 => null, 'true', true, false, 'on', 'off', 'float' => 1.3, 1000.3, 'a string', array('foo', 'bar')), 'foo_bar' => new Reference('foo_bar'));
$this->assertEquals($actual, $expected, '->load() converts XML values to PHP ones');
}
public function testLoadImports()
{
$loader = new ProjectLoader2(self::$fixturesPath.'/xml');
$config = $loader->load('services4.xml');
$actual = $config->getParameters();
$expected = array('a string', 'foo' => 'bar', 'values' => array(true, false), 'foo_bar' => new Reference('foo_bar'), 'bar' => '%foo%', 'imported_from_ini' => true, 'imported_from_yaml' => true);
$this->assertEquals(array_keys($actual), array_keys($expected), '->load() imports and merges imported files');
}
public function testLoadAnonymousServices()
{
$loader = new ProjectLoader2(self::$fixturesPath.'/xml');
$config = $loader->load('services5.xml');
$services = $config->getDefinitions();
$this->assertEquals(count($services), 3, '->load() attributes unique ids to anonymous services');
$args = $services['foo']->getArguments();
$this->assertEquals(count($args), 1, '->load() references anonymous services as "normal" ones');
$this->assertEquals(get_class($args[0]), 'Symfony\\Components\\DependencyInjection\\Reference', '->load() converts anonymous services to references to "normal" services');
$this->assertTrue(isset($services[(string) $args[0]]), '->load() makes a reference to the created ones');
$inner = $services[(string) $args[0]];
$this->assertEquals($inner->getClass(), 'BarClass', '->load() uses the same configuration as for the anonymous ones');
$args = $inner->getArguments();
$this->assertEquals(count($args), 1, '->load() references anonymous services as "normal" ones');
$this->assertEquals(get_class($args[0]), 'Symfony\\Components\\DependencyInjection\\Reference', '->load() converts anonymous services to references to "normal" services');
$this->assertTrue(isset($services[(string) $args[0]]), '->load() makes a reference to the created ones');
$inner = $services[(string) $args[0]];
$this->assertEquals($inner->getClass(), 'BazClass', '->load() uses the same configuration as for the anonymous ones');
}
public function testLoadServices()
{
$loader = new ProjectLoader2(self::$fixturesPath.'/xml');
$config = $loader->load('services6.xml');
$services = $config->getDefinitions();
$this->assertTrue(isset($services['foo']), '->load() parses <service> elements');
$this->assertEquals(get_class($services['foo']), 'Symfony\\Components\\DependencyInjection\\Definition', '->load() converts <service> element to Definition instances');
$this->assertEquals($services['foo']->getClass(), 'FooClass', '->load() parses the class attribute');
$this->assertTrue($services['shared']->isShared(), '->load() parses the shared attribute');
$this->assertTrue(!$services['non_shared']->isShared(), '->load() parses the shared attribute');
$this->assertEquals($services['constructor']->getConstructor(), 'getInstance', '->load() parses the constructor attribute');
$this->assertEquals($services['file']->getFile(), '%path%/foo.php', '->load() parses the file tag');
$this->assertEquals($services['arguments']->getArguments(), array('foo', new Reference('foo'), array(true, false)), '->load() parses the argument tags');
$this->assertEquals($services['configurator1']->getConfigurator(), 'sc_configure', '->load() parses the configurator tag');
$this->assertEquals($services['configurator2']->getConfigurator(), array(new Reference('baz'), 'configure'), '->load() parses the configurator tag');
$this->assertEquals($services['configurator3']->getConfigurator(), array('BazClass', 'configureStatic'), '->load() parses the configurator tag');
$this->assertEquals($services['method_call1']->getMethodCalls(), array(array('setBar', array())), '->load() parses the method_call tag');
$this->assertEquals($services['method_call2']->getMethodCalls(), array(array('setBar', array('foo', new Reference('foo'), array(true, false)))), '->load() parses the method_call tag');
$aliases = $config->getAliases();
$this->assertTrue(isset($aliases['alias_for_foo']), '->load() parses <service> elements');
$this->assertEquals($aliases['alias_for_foo'], 'foo', '->load() parses aliases');
}
public function testConvertDomElementToArray()
{
$doc = new \DOMDocument("1.0");
$doc->loadXML('<foo>bar</foo>');
$this->assertEquals(ProjectLoader2::convertDomElementToArray($doc->documentElement), 'bar', '::convertDomElementToArray() converts a \DomElement to an array');
$doc = new \DOMDocument("1.0");
$doc->loadXML('<foo foo="bar" />');
$this->assertEquals(ProjectLoader2::convertDomElementToArray($doc->documentElement), array('foo' => 'bar'), '::convertDomElementToArray() converts a \DomElement to an array');
$doc = new \DOMDocument("1.0");
$doc->loadXML('<foo><foo>bar</foo></foo>');
$this->assertEquals(ProjectLoader2::convertDomElementToArray($doc->documentElement), array('foo' => 'bar'), '::convertDomElementToArray() converts a \DomElement to an array');
$doc = new \DOMDocument("1.0");
$doc->loadXML('<foo><foo>bar<foo>bar</foo></foo></foo>');
$this->assertEquals(ProjectLoader2::convertDomElementToArray($doc->documentElement), array('foo' => array('value' => 'bar', 'foo' => 'bar')), '::convertDomElementToArray() converts a \DomElement to an array');
$doc = new \DOMDocument("1.0");
$doc->loadXML('<foo><foo></foo></foo>');
$this->assertEquals(ProjectLoader2::convertDomElementToArray($doc->documentElement), array('foo' => null), '::convertDomElementToArray() converts a \DomElement to an array');
$doc = new \DOMDocument("1.0");
$doc->loadXML('<foo><foo><!-- foo --></foo></foo>');
$this->assertEquals(ProjectLoader2::convertDomElementToArray($doc->documentElement), array('foo' => null), '::convertDomElementToArray() converts a \DomElement to an array');
}
public function testExtensions()
{
Loader::registerExtension(new \ProjectExtension());
$loader = new ProjectLoader2(self::$fixturesPath.'/xml');
$config = $loader->load('services10.xml');
$services = $config->getDefinitions();
$parameters = $config->getParameters();
$this->assertTrue(isset($services['project.service.bar']), '->load() parses extension elements');
$this->assertTrue(isset($parameters['project.parameter.bar']), '->load() parses extension elements');
try
{
$config = $loader->load('services11.xml');
$this->fail('->load() throws an InvalidArgumentException if the tag is not valid');
}
catch (\InvalidArgumentException $e)
{
}
try
{
$config = $loader->load('services12.xml');
$this->fail('->load() throws an InvalidArgumentException if an extension is not loaded');
}
catch (\InvalidArgumentException $e)
{
}
}
}
class ProjectLoader2 extends XmlFileLoader
{
public function parseFile($file)
{
return parent::parseFile($file);
}
}

View File

@ -0,0 +1,145 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\DependencyInjection\Loader;
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\DependencyInjection\Builder;
use Symfony\Components\DependencyInjection\Reference;
use Symfony\Components\DependencyInjection\Definition;
use Symfony\Components\DependencyInjection\Loader\Loader;
use Symfony\Components\DependencyInjection\Loader\YamlFileLoader;
class YamlFileLoaderTest extends \PHPUnit_Framework_TestCase
{
static protected $fixturesPath;
static public function setUpBeforeClass()
{
self::$fixturesPath = realpath(__DIR__.'/../../../../../fixtures/Symfony/Components/DependencyInjection/');
require_once self::$fixturesPath.'/includes/ProjectExtension.php';
}
public function testLoadFile()
{
$loader = new ProjectLoader3(self::$fixturesPath.'/ini');
try
{
$loader->loadFile('foo.yml');
$this->fail('->load() throws an InvalidArgumentException if the loaded file does not exist');
}
catch (\InvalidArgumentException $e)
{
}
try
{
$loader->loadFile('parameters.ini');
$this->fail('->load() throws an InvalidArgumentException if the loaded file is not a valid YAML file');
}
catch (\InvalidArgumentException $e)
{
}
$loader = new ProjectLoader3(self::$fixturesPath.'/yaml');
foreach (array('nonvalid1', 'nonvalid2') as $fixture)
{
try
{
$loader->loadFile($fixture.'.yml');
$this->fail('->load() throws an InvalidArgumentException if the loaded file does not validate');
}
catch (\InvalidArgumentException $e)
{
}
}
}
public function testLoadParameters()
{
$loader = new ProjectLoader3(self::$fixturesPath.'/yaml');
$config = $loader->load('services2.yml');
$this->assertEquals($config->getParameters(), array('foo' => 'bar', 'values' => array(true, false, 0, 1000.3), 'bar' => 'foo', 'foo_bar' => new Reference('foo_bar')), '->load() converts YAML keys to lowercase');
}
public function testLoadImports()
{
$loader = new ProjectLoader3(self::$fixturesPath.'/yaml');
$config = $loader->load('services4.yml');
$actual = $config->getParameters();
$expected = array('foo' => 'bar', 'values' => array(true, false), 'bar' => '%foo%', 'foo_bar' => new Reference('foo_bar'), 'imported_from_ini' => true, 'imported_from_xml' => true);
$this->assertEquals(array_keys($actual), array_keys($expected), '->load() imports and merges imported files');
}
public function testLoadServices()
{
$loader = new ProjectLoader3(self::$fixturesPath.'/yaml');
$config = $loader->load('services6.yml');
$services = $config->getDefinitions();
$this->assertTrue(isset($services['foo']), '->load() parses service elements');
$this->assertEquals(get_class($services['foo']), 'Symfony\\Components\\DependencyInjection\\Definition', '->load() converts service element to Definition instances');
$this->assertEquals($services['foo']->getClass(), 'FooClass', '->load() parses the class attribute');
$this->assertTrue($services['shared']->isShared(), '->load() parses the shared attribute');
$this->assertTrue(!$services['non_shared']->isShared(), '->load() parses the shared attribute');
$this->assertEquals($services['constructor']->getConstructor(), 'getInstance', '->load() parses the constructor attribute');
$this->assertEquals($services['file']->getFile(), '%path%/foo.php', '->load() parses the file tag');
$this->assertEquals($services['arguments']->getArguments(), array('foo', new Reference('foo'), array(true, false)), '->load() parses the argument tags');
$this->assertEquals($services['configurator1']->getConfigurator(), 'sc_configure', '->load() parses the configurator tag');
$this->assertEquals($services['configurator2']->getConfigurator(), array(new Reference('baz'), 'configure'), '->load() parses the configurator tag');
$this->assertEquals($services['configurator3']->getConfigurator(), array('BazClass', 'configureStatic'), '->load() parses the configurator tag');
$this->assertEquals($services['method_call1']->getMethodCalls(), array(array('setBar', array())), '->load() parses the method_call tag');
$this->assertEquals($services['method_call2']->getMethodCalls(), array(array('setBar', array('foo', new Reference('foo'), array(true, false)))), '->load() parses the method_call tag');
$aliases = $config->getAliases();
$this->assertTrue(isset($aliases['alias_for_foo']), '->load() parses aliases');
$this->assertEquals($aliases['alias_for_foo'], 'foo', '->load() parses aliases');
}
public function testExtensions()
{
Loader::registerExtension(new \ProjectExtension());
$loader = new ProjectLoader3(self::$fixturesPath.'/yaml');
$config = $loader->load('services10.yml');
$services = $config->getDefinitions();
$parameters = $config->getParameters();
$this->assertTrue(isset($services['project.service.bar']), '->load() parses extension elements');
$this->assertTrue(isset($parameters['project.parameter.bar']), '->load() parses extension elements');
try
{
$config = $loader->load('services11.yml');
$this->fail('->load() throws an InvalidArgumentException if the tag is not valid');
}
catch (\InvalidArgumentException $e)
{
}
try
{
$config = $loader->load('services12.yml');
$this->fail('->load() throws an InvalidArgumentException if an extension is not loaded');
}
catch (\InvalidArgumentException $e)
{
}
}
}
class ProjectLoader3 extends YamlFileLoader
{
public function loadFile($file)
{
return parent::loadFile($file);
}
}

View File

@ -0,0 +1,24 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\DependencyInjection;
require_once __DIR__.'/../../bootstrap.php';
use Symfony\Components\DependencyInjection\Parameter;
class ParameterTest extends \PHPUnit_Framework_TestCase
{
public function testConstructor()
{
$ref = new Parameter('foo');
$this->assertEquals((string) $ref, 'foo', '__construct() sets the id of the parameter, which is used for the __toString() method');
}
}

View File

@ -0,0 +1,24 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\DependencyInjection;
require_once __DIR__.'/../../bootstrap.php';
use Symfony\Components\DependencyInjection\Reference;
class ReferenceTest extends \PHPUnit_Framework_TestCase
{
public function testConstructor()
{
$ref = new Reference('foo');
$this->assertEquals((string) $ref, 'foo', '__construct() sets the id of the reference, which is used for the __toString() method');
}
}

View File

@ -0,0 +1,143 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\EventDispatcher;
require_once __DIR__.'/../../bootstrap.php';
use Symfony\Components\EventDispatcher\Event;
use Symfony\Components\EventDispatcher\EventDispatcher;
class EventDispatcherTest extends \PHPUnit_Framework_TestCase
{
public function testConnectAndDisconnect()
{
$dispatcher = new EventDispatcher();
$dispatcher->connect('bar', 'listenToBar');
$this->assertEquals($dispatcher->getListeners('bar'), array('listenToBar'), '->connect() connects a listener to an event name');
$dispatcher->connect('bar', 'listenToBarBar');
$this->assertEquals($dispatcher->getListeners('bar'), array('listenToBar', 'listenToBarBar'), '->connect() can connect several listeners for the same event name');
$dispatcher->connect('barbar', 'listenToBarBar');
$dispatcher->disconnect('bar', 'listenToBarBar');
$this->assertEquals($dispatcher->getListeners('bar'), array('listenToBar'), '->disconnect() disconnects a listener for an event name');
$this->assertEquals($dispatcher->getListeners('barbar'), array('listenToBarBar'), '->disconnect() disconnects a listener for an event name');
$this->assertTrue($dispatcher->disconnect('foobar', 'listen') === false, '->disconnect() returns false if the listener does not exist');
}
public function testGetHasListeners()
{
$dispatcher = new EventDispatcher();
$this->assertEquals($dispatcher->hasListeners('foo'), false, '->hasListeners() returns false if the event has no listener');
$dispatcher->connect('foo', 'listenToFoo');
$this->assertEquals($dispatcher->hasListeners('foo'), true, '->hasListeners() returns true if the event has some listeners');
$dispatcher->disconnect('foo', 'listenToFoo');
$this->assertEquals($dispatcher->hasListeners('foo'), false, '->hasListeners() returns false if the event has no listener');
$dispatcher->connect('bar', 'listenToBar');
$this->assertEquals($dispatcher->getListeners('bar'), array('listenToBar'), '->getListeners() returns an array of listeners connected to the given event name');
$this->assertEquals($dispatcher->getListeners('foobar'), array(), '->getListeners() returns an empty array if no listener are connected to the given event name');
}
public function testNotify()
{
$listener = new Listener();
$dispatcher = new EventDispatcher();
$dispatcher->connect('foo', array($listener, 'listenToFoo'));
$dispatcher->connect('foo', array($listener, 'listenToFooBis'));
$e = $dispatcher->notify($event = new Event(new \stdClass(), 'foo'));
$this->assertEquals($listener->getValue(), 'listenToFoolistenToFooBis', '->notify() notifies all registered listeners in order');
$this->assertEquals($e, $event, '->notify() returns the event object');
$listener->reset();
$dispatcher = new EventDispatcher();
$dispatcher->connect('foo', array($listener, 'listenToFooBis'));
$dispatcher->connect('foo', array($listener, 'listenToFoo'));
$dispatcher->notify(new Event(new \stdClass(), 'foo'));
$this->assertEquals($listener->getValue(), 'listenToFooBislistenToFoo', '->notify() notifies all registered listeners in order');
}
public function testNotifyUntil()
{
$listener = new Listener();
$dispatcher = new EventDispatcher();
$dispatcher->connect('foo', array($listener, 'listenToFoo'));
$dispatcher->connect('foo', array($listener, 'listenToFooBis'));
$e = $dispatcher->notifyUntil($event = new Event(new \stdClass(), 'foo'));
$this->assertEquals($listener->getValue(), 'listenToFoolistenToFooBis', '->notifyUntil() notifies all registered listeners in order and stops if it returns true');
$this->assertEquals($e, $event, '->notifyUntil() returns the event object');
$listener->reset();
$dispatcher = new EventDispatcher();
$dispatcher->connect('foo', array($listener, 'listenToFooBis'));
$dispatcher->connect('foo', array($listener, 'listenToFoo'));
$e = $dispatcher->notifyUntil($event = new Event(new \stdClass(), 'foo'));
$this->assertEquals($listener->getValue(), 'listenToFooBis', '->notifyUntil() notifies all registered listeners in order and stops if it returns true');
}
public function testFilter()
{
$listener = new Listener();
$dispatcher = new EventDispatcher();
$dispatcher->connect('foo', array($listener, 'filterFoo'));
$dispatcher->connect('foo', array($listener, 'filterFooBis'));
$e = $dispatcher->filter($event = new Event(new \stdClass(), 'foo'), 'foo');
$this->assertEquals($e->getReturnValue(), '-*foo*-', '->filter() filters a value');
$this->assertEquals($e, $event, '->filter() returns the event object');
$listener->reset();
$dispatcher = new EventDispatcher();
$dispatcher->connect('foo', array($listener, 'filterFooBis'));
$dispatcher->connect('foo', array($listener, 'filterFoo'));
$e = $dispatcher->filter($event = new Event(new \stdClass(), 'foo'), 'foo');
$this->assertEquals($e->getReturnValue(), '*-foo-*', '->filter() filters a value');
}
}
class Listener
{
protected
$value = '';
function filterFoo(Event $event, $foo)
{
return "*$foo*";
}
function filterFooBis(Event $event, $foo)
{
return "-$foo-";
}
function listenToFoo(Event $event)
{
$this->value .= 'listenToFoo';
}
function listenToFooBis(Event $event)
{
$this->value .= 'listenToFooBis';
return true;
}
function getValue()
{
return $this->value;
}
function reset()
{
$this->value = '';
}
}

View File

@ -0,0 +1,100 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\EventDispatcher;
require_once __DIR__.'/../../bootstrap.php';
use Symfony\Components\EventDispatcher\Event;
class EventTest extends \PHPUnit_Framework_TestCase
{
protected $subject;
protected $parameters;
public function testGetSubject()
{
$this->assertEquals($this->createEvent()->getSubject(), $this->subject, '->getSubject() returns the event subject');
}
public function testGetName()
{
$this->assertEquals($this->createEvent()->getName(), 'name', '->getName() returns the event name');
}
public function testParameters()
{
$event = $this->createEvent();
$this->assertEquals($event->getParameters(), $this->parameters, '->getParameters() returns the event parameters');
$this->assertEquals($event->getParameter('foo'), 'bar', '->getParameter() returns the value of a parameter');
$event->setParameter('foo', 'foo');
$this->assertEquals($event->getParameter('foo'), 'foo', '->setParameter() changes the value of a parameter');
$this->assertTrue($event->hasParameter('foo'), '->hasParameter() returns true if the parameter is defined');
unset($event['foo']);
$this->assertTrue(!$event->hasParameter('foo'), '->hasParameter() returns false if the parameter is not defined');
try
{
$event->getParameter('foobar');
$this->fail('->getParameter() throws an \InvalidArgumentException exception when the parameter does not exist');
}
catch (\InvalidArgumentException $e)
{
}
$event = new Event($this->subject, 'name', $this->parameters);
}
public function testSetGetReturnValue()
{
$event = $this->createEvent();
$event->setReturnValue('foo');
$this->assertEquals($event->getReturnValue(), 'foo', '->getReturnValue() returns the return value of the event');
}
public function testSetIsProcessed()
{
$event = $this->createEvent();
$event->setProcessed(true);
$this->assertEquals($event->isProcessed(), true, '->isProcessed() returns true if the event has been processed');
$event->setProcessed(false);
$this->assertEquals($event->isProcessed(), false, '->setProcessed() changes the processed status');
}
public function testArrayAccessInterface()
{
$event = $this->createEvent();
$this->assertEquals($event['foo'], 'bar', 'Event implements the ArrayAccess interface');
$event['foo'] = 'foo';
$this->assertEquals($event['foo'], 'foo', 'Event implements the ArrayAccess interface');
try
{
$event['foobar'];
$this->fail('::offsetGet() throws an \InvalidArgumentException exception when the parameter does not exist');
}
catch (\InvalidArgumentException $e)
{
}
$this->assertTrue(isset($event['foo']), 'Event implements the ArrayAccess interface');
unset($event['foo']);
$this->assertTrue(!isset($event['foo']), 'Event implements the ArrayAccess interface');
}
protected function createEvent()
{
$this->subject = new \stdClass();
$this->parameters = array('foo' => 'bar');
return new Event($this->subject, 'name', $this->parameters);
}
}

View File

@ -0,0 +1,90 @@
<?php
/*
* This file is part of the symfony package.
*
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\OutputEscaper;
require_once __DIR__.'/../../bootstrap.php';
use Symfony\Components\OutputEscaper\Escaper;
class ArrayDecoratorTest extends \PHPUnit_Framework_TestCase
{
static protected $escaped;
static public function setUpBeforeClass()
{
$a = array('<strong>escaped!</strong>', 1, null, array(2, '<strong>escaped!</strong>'));
self::$escaped = Escaper::escape('entities', $a);
}
public function testGetRaw()
{
$this->assertEquals(self::$escaped->getRaw(0), '<strong>escaped!</strong>', '->getRaw() returns the raw value');
}
public function testArrayAccessInterface()
{
$this->assertEquals(self::$escaped[0], '&lt;strong&gt;escaped!&lt;/strong&gt;', 'The escaped object behaves like an array');
$this->assertEquals(self::$escaped[2], null, 'The escaped object behaves like an array');
$this->assertEquals(self::$escaped[3][1], '&lt;strong&gt;escaped!&lt;/strong&gt;', 'The escaped object behaves like an array');
$this->assertTrue(isset(self::$escaped[1]), 'The escaped object behaves like an array (isset)');
try
{
unset(self::$escaped[0]);
$this->fail('The escaped object is read only (unset)');
}
catch (\LogicException $e)
{
}
try
{
self::$escaped[0] = 12;
$this->fail('The escaped object is read only (set)');
}
catch (\LogicException $e)
{
}
}
public function testIteratorInterface()
{
foreach (self::$escaped as $key => $value)
{
switch ($key)
{
case 0:
$this->assertEquals($value, '&lt;strong&gt;escaped!&lt;/strong&gt;', 'The escaped object behaves like an array');
break;
case 1:
$this->assertEquals($value, 1, 'The escaped object behaves like an array');
break;
case 2:
$this->assertEquals($value, null, 'The escaped object behaves like an array');
break;
case 3:
break;
default:
$this->fail('The escaped object behaves like an array');
}
}
}
public function testCountableInterface()
{
$this->assertEquals(count(self::$escaped), 4, 'The escaped object implements the Countable interface');
}
}

View File

@ -0,0 +1,182 @@
<?php
/*
* This file is part of the symfony package.
*
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\OutputEscaper;
require_once __DIR__.'/../../bootstrap.php';
use Symfony\Components\OutputEscaper\Escaper;
use Symfony\Components\OutputEscaper\SafeDecorator;
use Symfony\Components\OutputEscaper\IteratorDecorator;
use Symfony\Components\OutputEscaper\ArrayDecorator;
use Symfony\Components\OutputEscaper\ObjectDecorator;
class EscaperTest extends \PHPUnit_Framework_TestCase
{
public function testEscapeDoesNotEscapeSpecialValues()
{
$this->assertSame(Escaper::escape('entities', null), null, '::escape() returns null if the value to escape is null');
$this->assertSame(Escaper::escape('entities', false), false, '::escape() returns false if the value to escape is false');
$this->assertSame(Escaper::escape('entities', true), true, '::escape() returns true if the value to escape is true');
}
public function testEscapeDoesNotEscapeAValueWhenEscapingMethodIsRAW()
{
$this->assertEquals(Escaper::escape('raw', '<strong>escaped!</strong>'), '<strong>escaped!</strong>', '::escape() takes an escaping strategy function name as its first argument');
}
public function testEscapeEscapesStrings()
{
$this->assertEquals(Escaper::escape('entities', '<strong>escaped!</strong>'), '&lt;strong&gt;escaped!&lt;/strong&gt;', '::escape() returns an escaped string if the value to escape is a string');
$this->assertEquals(Escaper::escape('entities', '<strong>échappé</strong>'), '&lt;strong&gt;&eacute;chapp&eacute;&lt;/strong&gt;', '::escape() returns an escaped string if the value to escape is a string');
}
public function testEscapeEscapesArrays()
{
$input = array(
'foo' => '<strong>escaped!</strong>',
'bar' => array('foo' => '<strong>escaped!</strong>'),
);
$output = Escaper::escape('entities', $input);
$this->assertTrue($output instanceof ArrayDecorator, '::escape() returns a ArrayDecorator object if the value to escape is an array');
$this->assertEquals($output['foo'], '&lt;strong&gt;escaped!&lt;/strong&gt;', '::escape() escapes all elements of the original array');
$this->assertEquals($output['bar']['foo'], '&lt;strong&gt;escaped!&lt;/strong&gt;', '::escape() is recursive');
$this->assertEquals($output->getRawValue(), $input, '->getRawValue() returns the unescaped value');
}
public function testEscapeEscapesObjects()
{
$input = new OutputEscaperTestClass();
$output = Escaper::escape('entities', $input);
$this->assertTrue($output instanceof ObjectDecorator, '::escape() returns a ObjectDecorator object if the value to escape is an object');
$this->assertEquals($output->getTitle(), '&lt;strong&gt;escaped!&lt;/strong&gt;', '::escape() escapes all methods of the original object');
$this->assertEquals($output->title, '&lt;strong&gt;escaped!&lt;/strong&gt;', '::escape() escapes all properties of the original object');
$this->assertEquals($output->getTitleTitle(), '&lt;strong&gt;escaped!&lt;/strong&gt;', '::escape() is recursive');
$this->assertEquals($output->getRawValue(), $input, '->getRawValue() returns the unescaped value');
$this->assertEquals(Escaper::escape('entities', $output)->getTitle(), '&lt;strong&gt;escaped!&lt;/strong&gt;', '::escape() does not double escape an object');
$this->assertTrue(Escaper::escape('entities', new \DirectoryIterator('.')) instanceof IteratorDecorator, '::escape() returns a IteratorDecorator object if the value to escape is an object that implements the ArrayAccess interface');
}
public function testEscapeDoesNotEscapeObjectMarkedAsBeingSafe()
{
$this->assertTrue(Escaper::escape('entities', new SafeDecorator(new OutputEscaperTestClass())) instanceof OutputEscaperTestClass, '::escape() returns the original value if it is marked as being safe');
Escaper::markClassAsSafe('Symfony\Tests\Components\OutputEscaper\OutputEscaperTestClass');
$this->assertTrue(Escaper::escape('entities', new OutputEscaperTestClass()) instanceof OutputEscaperTestClass, '::escape() returns the original value if the object class is marked as being safe');
$this->assertTrue(Escaper::escape('entities', new OutputEscaperTestClassChild()) instanceof OutputEscaperTestClassChild, '::escape() returns the original value if one of the object parent class is marked as being safe');
}
public function testEscapeCannotEscapeResources()
{
$fh = fopen(__FILE__, 'r');
try
{
Escaper::escape('entities', $fh);
$this->fail('::escape() throws an InvalidArgumentException if the value cannot be escaped');
}
catch (\InvalidArgumentException $e)
{
}
fclose($fh);
}
public function testUnescapeDoesNotUnescapeSpecialValues()
{
$this->assertTrue(Escaper::unescape(null) === null, '::unescape() returns null if the value to unescape is null');
$this->assertTrue(Escaper::unescape(false) === false, '::unescape() returns false if the value to unescape is false');
$this->assertTrue(Escaper::unescape(true) === true, '::unescape() returns true if the value to unescape is true');
}
public function testUnescapeUnescapesStrings()
{
$this->assertEquals(Escaper::unescape('&lt;strong&gt;escaped!&lt;/strong&gt;'), '<strong>escaped!</strong>', '::unescape() returns an unescaped string if the value to unescape is a string');
$this->assertEquals(Escaper::unescape('&lt;strong&gt;&eacute;chapp&eacute;&lt;/strong&gt;'), '<strong>échappé</strong>', '::unescape() returns an unescaped string if the value to unescape is a string');
}
public function testUnescapeUnescapesArrays()
{
$input = Escaper::escape('entities', array(
'foo' => '<strong>escaped!</strong>',
'bar' => array('foo' => '<strong>escaped!</strong>'),
));
$output = Escaper::unescape($input);
$this->assertTrue(is_array($output), '::unescape() returns an array if the input is a ArrayDecorator object');
$this->assertEquals($output['foo'], '<strong>escaped!</strong>', '::unescape() unescapes all elements of the original array');
$this->assertEquals($output['bar']['foo'], '<strong>escaped!</strong>', '::unescape() is recursive');
}
public function testUnescapeUnescapesObjects()
{
$object = new OutputEscaperTestClass();
$input = Escaper::escape('entities', $object);
$output = Escaper::unescape($input);
$this->assertTrue($output instanceof OutputEscaperTestClass, '::unescape() returns the original object when a ObjectDecorator object is passed');
$this->assertEquals($output->getTitle(), '<strong>escaped!</strong>', '::unescape() unescapes all methods of the original object');
$this->assertEquals($output->title, '<strong>escaped!</strong>', '::unescape() unescapes all properties of the original object');
$this->assertEquals($output->getTitleTitle(), '<strong>escaped!</strong>', '::unescape() is recursive');
$this->assertTrue(IteratorDecorator::unescape(Escaper::escape('entities', new \DirectoryIterator('.'))) instanceof \DirectoryIterator, '::unescape() unescapes IteratorDecorator objects');
}
public function testUnescapeDoesNotUnescapeObjectMarkedAsBeingSafe()
{
$this->assertTrue(Escaper::unescape(Escaper::escape('entities', new SafeDecorator(new OutputEscaperTestClass()))) instanceof OutputEscaperTestClass, '::unescape() returns the original value if it is marked as being safe');
Escaper::markClassAsSafe('OutputEscaperTestClass');
$this->assertTrue(Escaper::unescape(Escaper::escape('entities', new OutputEscaperTestClass())) instanceof OutputEscaperTestClass, '::unescape() returns the original value if the object class is marked as being safe');
$this->assertTrue(Escaper::unescape(Escaper::escape('entities', new OutputEscaperTestClassChild())) instanceof OutputEscaperTestClassChild, '::unescape() returns the original value if one of the object parent class is marked as being safe');
}
public function testUnescapeDoesNothingToResources()
{
$fh = fopen(__FILE__, 'r');
$this->assertEquals(Escaper::unescape($fh), $fh, '::unescape() do nothing to resources');
}
public function testUnescapeUnescapesMixedArrays()
{
$object = new OutputEscaperTestClass();
$input = array(
'foo' => 'bar',
'bar' => Escaper::escape('entities', '<strong>bar</strong>'),
'foobar' => Escaper::escape('entities', $object),
);
$output = array(
'foo' => 'bar',
'bar' => '<strong>bar</strong>',
'foobar' => $object,
);
$this->assertEquals(Escaper::unescape($input), $output, '::unescape() unescapes values with some escaped and unescaped values');
}
}
class OutputEscaperTestClass
{
public $title = '<strong>escaped!</strong>';
public function getTitle()
{
return $this->title;
}
public function getTitleTitle()
{
$o = new self;
return $o->getTitle();
}
}
class OutputEscaperTestClassChild extends OutputEscaperTestClass
{
}

View File

@ -0,0 +1,59 @@
<?php
/*
* This file is part of the symfony package.
*
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\OutputEscaper;
require_once __DIR__.'/../../bootstrap.php';
use Symfony\Components\OutputEscaper\Escaper;
class ObjectDecoratorTest extends \PHPUnit_Framework_TestCase
{
static protected $escaped;
static public function setUpBeforeClass()
{
$object = new OutputEscaperTest();
self::$escaped = Escaper::escape('entities', $object);
}
public function testGenericBehavior()
{
$this->assertEquals(self::$escaped->getTitle(), '&lt;strong&gt;escaped!&lt;/strong&gt;', 'The escaped object behaves like the real object');
$array = self::$escaped->getTitles();
$this->assertEquals($array[2], '&lt;strong&gt;escaped!&lt;/strong&gt;', 'The escaped object behaves like the real object');
}
public function testMagicToString()
{
$this->assertEquals(self::$escaped->__toString(), '&lt;strong&gt;escaped!&lt;/strong&gt;', 'The escaped object behaves like the real object');
}
}
class OutputEscaperTest
{
public function __toString()
{
return $this->getTitle();
}
public function getTitle()
{
return '<strong>escaped!</strong>';
}
public function getTitles()
{
return array(1, 2, '<strong>escaped!</strong>');
}
}

View File

@ -0,0 +1,98 @@
<?php
/*
* This file is part of the symfony package.
*
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\OutputEscaper;
require_once __DIR__.'/../../bootstrap.php';
use Symfony\Components\OutputEscaper\SafeDecorator;
class SafeDecoratorTest extends \PHPUnit_Framework_TestCase
{
public function testGetValue()
{
$safe = new SafeDecorator('foo');
$this->assertEquals($safe->getValue(), 'foo', '->getValue() returns the embedded value');
}
public function testMagicGetAndSet()
{
$safe = new SafeDecorator(new TestClass1());
$this->assertEquals($safe->foo, 'bar', '->__get() returns the object parameter');
$safe->foo = 'baz';
$this->assertEquals($safe->foo, 'baz', '->__set() sets the object parameter');
}
public function testMagicCall()
{
$safe = new SafeDecorator(new TestClass2());
$this->assertEquals($safe->doSomething(), 'ok', '->__call() invokes the embedded method');
}
public function testMagicIssetAndUnset()
{
$safe = new SafeDecorator(new TestClass3());
$this->assertEquals(isset($safe->boolValue), true, '->__isset() returns true if the property is not null');
$this->assertEquals(isset($safe->nullValue), false, '->__isset() returns false if the property is null');
$this->assertEquals(isset($safe->undefinedValue), false, '->__isset() returns false if the property does not exist');
unset($safe->boolValue);
$this->assertEquals(isset($safe->boolValue), false, '->__unset() unsets the embedded property');
}
public function testIteratorInterface()
{
$input = array('one' => 1, 'two' => 2, 'three' => 3, 'children' => array(1, 2, 3));
$output = array();
$safe = new SafeDecorator($input);
foreach ($safe as $key => $value)
{
$output[$key] = $value;
}
$this->assertSame($output, $input, '"Iterator" implementation imitates an array');
}
public function testArrayAccessIterator()
{
$safe = new SafeDecorator(array('foo' => 'bar'));
$this->assertEquals($safe['foo'], 'bar', '"ArrayAccess" implementation returns a value from the embedded array');
$safe['foo'] = 'baz';
$this->assertEquals($safe['foo'], 'baz', '"ArrayAccess" implementation sets a value on the embedded array');
$this->assertEquals(isset($safe['foo']), true, '"ArrayAccess" checks if a value is set on the embedded array');
unset($safe['foo']);
$this->assertEquals(isset($safe['foo']), false, '"ArrayAccess" unsets a value on the embedded array');
}
}
class TestClass1
{
public $foo = 'bar';
}
class TestClass2
{
public function doSomething()
{
return 'ok';
}
}
class TestClass3
{
public
$boolValue = true,
$nullValue = null;
}

View File

@ -0,0 +1,173 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\OutputEscaper;
require_once __DIR__.'/../../bootstrap.php';
use Symfony\Components\Yaml\Yaml;
use Symfony\Components\Yaml\Parser;
use Symfony\Components\Yaml\Dumper;
class DumperTest extends \PHPUnit_Framework_TestCase
{
protected $parser;
protected $dumper;
protected $path;
static public function setUpBeforeClass()
{
Yaml::setSpecVersion('1.1');
}
public function setUp()
{
$this->parser = new Parser();
$this->dumper = new Dumper();
$this->path = __DIR__.'/../../../../fixtures/Symfony/Components/Yaml';
}
public function testSpecifications()
{
$files = $this->parser->parse(file_get_contents($this->path.'/index.yml'));
foreach ($files as $file)
{
$yamls = file_get_contents($this->path.'/'.$file.'.yml');
// split YAMLs documents
foreach (preg_split('/^---( %YAML\:1\.0)?/m', $yamls) as $yaml)
{
if (!$yaml)
{
continue;
}
$test = $this->parser->parse($yaml);
if (isset($test['dump_skip']) && $test['dump_skip'])
{
continue;
}
else if (isset($test['todo']) && $test['todo'])
{
// TODO
}
else
{
$expected = eval('return '.trim($test['php']).';');
$this->assertEquals($this->parser->parse($this->dumper->dump($expected, 10)), $expected, $test['test']);
}
}
}
}
public function testInlineLevel()
{
// inline level
$array = array(
'' => 'bar',
'foo' => '#bar',
'foo\'bar' => array(),
'bar' => array(1, 'foo'),
'foobar' => array(
'foo' => 'bar',
'bar' => array(1, 'foo'),
'foobar' => array(
'foo' => 'bar',
'bar' => array(1, 'foo'),
),
),
);
$expected = <<<EOF
{ '': bar, foo: '#bar', 'foo''bar': { }, bar: [1, foo], foobar: { foo: bar, bar: [1, foo], foobar: { foo: bar, bar: [1, foo] } } }
EOF;
$this->assertEquals($this->dumper->dump($array, -10), $expected, '->dump() takes an inline level argument');
$this->assertEquals($this->dumper->dump($array, 0), $expected, '->dump() takes an inline level argument');
$expected = <<<EOF
'': bar
foo: '#bar'
'foo''bar': { }
bar: [1, foo]
foobar: { foo: bar, bar: [1, foo], foobar: { foo: bar, bar: [1, foo] } }
EOF;
$this->assertEquals($this->dumper->dump($array, 1), $expected, '->dump() takes an inline level argument');
$expected = <<<EOF
'': bar
foo: '#bar'
'foo''bar': { }
bar:
- 1
- foo
foobar:
foo: bar
bar: [1, foo]
foobar: { foo: bar, bar: [1, foo] }
EOF;
$this->assertEquals($this->dumper->dump($array, 2), $expected, '->dump() takes an inline level argument');
$expected = <<<EOF
'': bar
foo: '#bar'
'foo''bar': { }
bar:
- 1
- foo
foobar:
foo: bar
bar:
- 1
- foo
foobar:
foo: bar
bar: [1, foo]
EOF;
$this->assertEquals($this->dumper->dump($array, 3), $expected, '->dump() takes an inline level argument');
$expected = <<<EOF
'': bar
foo: '#bar'
'foo''bar': { }
bar:
- 1
- foo
foobar:
foo: bar
bar:
- 1
- foo
foobar:
foo: bar
bar:
- 1
- foo
EOF;
$this->assertEquals($this->dumper->dump($array, 4), $expected, '->dump() takes an inline level argument');
$this->assertEquals($this->dumper->dump($array, 10), $expected, '->dump() takes an inline level argument');
}
public function testObjectsSupport()
{
$a = array('foo' => new A(), 'bar' => 1);
$this->assertEquals($this->dumper->dump($a), '{ foo: !!php/object:O:40:"Symfony\Tests\Components\OutputEscaper\A":1:{s:1:"a";s:3:"foo";}, bar: 1 }', '->dump() is able to dump objects');
}
}
class A
{
public $a = 'foo';
}

View File

@ -0,0 +1,163 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\OutputEscaper;
require_once __DIR__.'/../../bootstrap.php';
use Symfony\Components\Yaml\Yaml;
use Symfony\Components\Yaml\Inline;
class InlineTest extends \PHPUnit_Framework_TestCase
{
static public function setUpBeforeClass()
{
Yaml::setSpecVersion('1.1');
}
public function testLoad()
{
foreach ($this->getTestsForLoad() as $yaml => $value)
{
$this->assertEquals(Inline::load($yaml), $value, sprintf('::load() converts an inline YAML to a PHP structure (%s)', $yaml));
}
}
public function testDump()
{
$testsForDump = $this->getTestsForDump();
foreach ($testsForDump as $yaml => $value)
{
$this->assertEquals(Inline::dump($value), $yaml, sprintf('::dump() converts a PHP structure to an inline YAML (%s)', $yaml));
}
foreach ($this->getTestsForLoad() as $yaml => $value)
{
if ($value == 1230)
{
continue;
}
$this->assertEquals(Inline::load(Inline::dump($value)), $value, 'check consistency');
}
foreach ($testsForDump as $yaml => $value)
{
if ($value == 1230)
{
continue;
}
$this->assertEquals(Inline::load(Inline::dump($value)), $value, 'check consistency');
}
}
protected function getTestsForLoad()
{
return array(
'' => '',
'null' => null,
'false' => false,
'true' => true,
'12' => 12,
'"quoted string"' => 'quoted string',
"'quoted string'" => 'quoted string',
'12.30e+02' => 12.30e+02,
'0x4D2' => 0x4D2,
'02333' => 02333,
'.Inf' => -log(0),
'-.Inf' => log(0),
'123456789123456789' => '123456789123456789',
'"foo\r\nbar"' => "foo\r\nbar",
"'foo#bar'" => 'foo#bar',
"'foo # bar'" => 'foo # bar',
"'#cfcfcf'" => '#cfcfcf',
'2007-10-30' => mktime(0, 0, 0, 10, 30, 2007),
'2007-10-30T02:59:43Z' => gmmktime(2, 59, 43, 10, 30, 2007),
'2007-10-30 02:59:43 Z' => gmmktime(2, 59, 43, 10, 30, 2007),
'"a \\"string\\" with \'quoted strings inside\'"' => 'a "string" with \'quoted strings inside\'',
"'a \"string\" with ''quoted strings inside'''" => 'a "string" with \'quoted strings inside\'',
// sequences
// urls are no key value mapping. see #3609. Valid yaml "key: value" mappings require a space after the colon
'[foo, http://urls.are/no/mappings, false, null, 12]' => array('foo', 'http://urls.are/no/mappings', false, null, 12),
'[ foo , bar , false , null , 12 ]' => array('foo', 'bar', false, null, 12),
'[\'foo,bar\', \'foo bar\']' => array('foo,bar', 'foo bar'),
// mappings
'{foo:bar,bar:foo,false:false,null:null,integer:12}' => array('foo' => 'bar', 'bar' => 'foo', 'false' => false, 'null' => null, 'integer' => 12),
'{ foo : bar, bar : foo, false : false, null : null, integer : 12 }' => array('foo' => 'bar', 'bar' => 'foo', 'false' => false, 'null' => null, 'integer' => 12),
'{foo: \'bar\', bar: \'foo: bar\'}' => array('foo' => 'bar', 'bar' => 'foo: bar'),
'{\'foo\': \'bar\', "bar": \'foo: bar\'}' => array('foo' => 'bar', 'bar' => 'foo: bar'),
'{\'foo\'\'\': \'bar\', "bar\"": \'foo: bar\'}' => array('foo\'' => 'bar', "bar\"" => 'foo: bar'),
'{\'foo: \': \'bar\', "bar: ": \'foo: bar\'}' => array('foo: ' => 'bar', "bar: " => 'foo: bar'),
// nested sequences and mappings
'[foo, [bar, foo]]' => array('foo', array('bar', 'foo')),
'[foo, {bar: foo}]' => array('foo', array('bar' => 'foo')),
'{ foo: {bar: foo} }' => array('foo' => array('bar' => 'foo')),
'{ foo: [bar, foo] }' => array('foo' => array('bar', 'foo')),
'[ foo, [ bar, foo ] ]' => array('foo', array('bar', 'foo')),
'[{ foo: {bar: foo} }]' => array(array('foo' => array('bar' => 'foo'))),
'[foo, [bar, [foo, [bar, foo]], foo]]' => array('foo', array('bar', array('foo', array('bar', 'foo')), 'foo')),
'[foo, {bar: foo, foo: [foo, {bar: foo}]}, [foo, {bar: foo}]]' => array('foo', array('bar' => 'foo', 'foo' => array('foo', array('bar' => 'foo'))), array('foo', array('bar' => 'foo'))),
'[foo, bar: { foo: bar }]' => array('foo', '1' => array('bar' => array('foo' => 'bar'))),
);
}
protected function getTestsForDump()
{
return array(
'null' => null,
'false' => false,
'true' => true,
'12' => 12,
"'quoted string'" => 'quoted string',
'12.30e+02' => 12.30e+02,
'1234' => 0x4D2,
'1243' => 02333,
'.Inf' => -log(0),
'-.Inf' => log(0),
'"foo\r\nbar"' => "foo\r\nbar",
"'foo#bar'" => 'foo#bar',
"'foo # bar'" => 'foo # bar',
"'#cfcfcf'" => '#cfcfcf',
"'a \"string\" with ''quoted strings inside'''" => 'a "string" with \'quoted strings inside\'',
// sequences
'[foo, bar, false, null, 12]' => array('foo', 'bar', false, null, 12),
'[\'foo,bar\', \'foo bar\']' => array('foo,bar', 'foo bar'),
// mappings
'{ foo: bar, bar: foo, \'false\': false, \'null\': null, integer: 12 }' => array('foo' => 'bar', 'bar' => 'foo', 'false' => false, 'null' => null, 'integer' => 12),
'{ foo: bar, bar: \'foo: bar\' }' => array('foo' => 'bar', 'bar' => 'foo: bar'),
// nested sequences and mappings
'[foo, [bar, foo]]' => array('foo', array('bar', 'foo')),
'[foo, [bar, [foo, [bar, foo]], foo]]' => array('foo', array('bar', array('foo', array('bar', 'foo')), 'foo')),
'{ foo: { bar: foo } }' => array('foo' => array('bar' => 'foo')),
'[foo, { bar: foo }]' => array('foo', array('bar' => 'foo')),
'[foo, { bar: foo, foo: [foo, { bar: foo }] }, [foo, { bar: foo }]]' => array('foo', array('bar' => 'foo', 'foo' => array('foo', array('bar' => 'foo'))), array('foo', array('bar' => 'foo'))),
);
}
}

View File

@ -0,0 +1,103 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Symfony\Tests\Components\OutputEscaper;
require_once __DIR__.'/../../bootstrap.php';
use Symfony\Components\Yaml\Yaml;
use Symfony\Components\Yaml\Parser;
use Symfony\Components\Yaml\ParserException;
class ParserTest extends \PHPUnit_Framework_TestCase
{
protected $parser;
protected $path;
static public function setUpBeforeClass()
{
Yaml::setSpecVersion('1.1');
}
public function setUp()
{
$this->parser = new Parser();
$this->path = __DIR__.'/../../../../fixtures/Symfony/Components/Yaml';
}
public function testSpecifications()
{
$files = $this->parser->parse(file_get_contents($this->path.'/index.yml'));
foreach ($files as $file)
{
$yamls = file_get_contents($this->path.'/'.$file.'.yml');
// split YAMLs documents
foreach (preg_split('/^---( %YAML\:1\.0)?/m', $yamls) as $yaml)
{
if (!$yaml)
{
continue;
}
$test = $this->parser->parse($yaml);
if (isset($test['todo']) && $test['todo'])
{
// TODO
}
else
{
$expected = var_export(eval('return '.trim($test['php']).';'), true);
$this->assertEquals(var_export($this->parser->parse($test['yaml']), true), $expected, $test['test']);
}
}
}
}
public function testTabsInYaml()
{
// test tabs in YAML
$yamls = array(
"foo:\n bar",
"foo:\n bar",
"foo:\n bar",
"foo:\n bar",
);
foreach ($yamls as $yaml)
{
try
{
$content = $this->parser->parse($yaml);
$this->fail('YAML files must not contain tabs');
}
catch (ParserException $e)
{
}
}
}
public function testObjectsSupport()
{
$b = array('foo' => new B(), 'bar' => 1);
$this->assertEquals($this->parser->parse(<<<EOF
foo: !!php/object:O:40:"Symfony\Tests\Components\OutputEscaper\B":1:{s:1:"b";s:3:"foo";}
bar: 1
EOF
), $b, '->parse() is able to dump objects');
}
}
class B
{
public $b = 'foo';
}

View File

@ -2,18 +2,16 @@
/*
* This file is part of the symfony package.
*
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../../bootstrap.php';
require_once __DIR__.'/../../../src/Symfony/Foundation/ClassLoader.php';
require_once 'PHPUnit/Framework.php';
use Symfony\Components\Console\Output\NullOutput;
$t = new LimeTest(1);
$output = new NullOutput();
$output->write('foo');
$t->pass('->write() does nothing');
$loader = new Symfony\Foundation\ClassLoader();
$loader->registerNamespace('Symfony', __DIR__.'/../../../src');
$loader->register();

View File

@ -1,312 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\Console\Application;
use Symfony\Components\Console\Input\ArrayInput;
use Symfony\Components\Console\Output\Output;
use Symfony\Components\Console\Output\StreamOutput;
use Symfony\Components\Console\Tester\ApplicationTester;
$fixtures = __DIR__.'/../../../../fixtures/Symfony/Components/Console';
require_once $fixtures.'/FooCommand.php';
require_once $fixtures.'/Foo1Command.php';
require_once $fixtures.'/Foo2Command.php';
$t = new LimeTest(52);
// __construct()
$t->diag('__construct()');
$application = new Application('foo', 'bar');
$t->is($application->getName(), 'foo', '__construct() takes the application name as its first argument');
$t->is($application->getVersion(), 'bar', '__construct() takes the application version as its first argument');
$t->is(array_keys($application->getCommands()), array('help', 'list'), '__construct() registered the help and list commands by default');
// ->setName() ->getName()
$t->diag('->setName() ->getName()');
$application = new Application();
$application->setName('foo');
$t->is($application->getName(), 'foo', '->setName() sets the name of the application');
// ->getVersion() ->getVersion()
$t->diag('->getVersion() ->getVersion()');
$application = new Application();
$application->setVersion('bar');
$t->is($application->getVersion(), 'bar', '->setVersion() sets the version of the application');
// ->getLongVersion()
$t->diag('->getLongVersion()');
$application = new Application('foo', 'bar');
$t->is($application->getLongVersion(), '<info>foo</info> version <comment>bar</comment>', '->getLongVersion() returns the long version of the application');
// ->getHelp()
$t->diag('->getHelp()');
$application = new Application();
$t->is($application->getHelp(), file_get_contents($fixtures.'/application_gethelp.txt'), '->setHelp() returns a help message');
// ->getCommands()
$t->diag('->getCommands()');
$application = new Application();
$commands = $application->getCommands();
$t->is(get_class($commands['help']), 'Symfony\\Components\\Console\\Command\\HelpCommand', '->getCommands() returns the registered commands');
$application->addCommand(new FooCommand());
$commands = $application->getCommands('foo');
$t->is(count($commands), 1, '->getCommands() takes a namespace as its first argument');
// ->register()
$t->diag('->register()');
$application = new Application();
$command = $application->register('foo');
$t->is($command->getName(), 'foo', '->register() regiters a new command');
// ->addCommand() ->addCommands()
$t->diag('->addCommand() ->addCommands()');
$application = new Application();
$application->addCommand($foo = new FooCommand());
$commands = $application->getCommands();
$t->is($commands['foo:bar'], $foo, '->addCommand() registers a command');
$application = new Application();
$application->addCommands(array($foo = new FooCommand(), $foo1 = new Foo1Command()));
$commands = $application->getCommands();
$t->is(array($commands['foo:bar'], $commands['foo:bar1']), array($foo, $foo1), '->addCommands() registers an array of commands');
// ->hasCommand() ->getCommand()
$t->diag('->hasCommand() ->getCommand()');
$application = new Application();
$t->ok($application->hasCommand('list'), '->hasCommand() returns true if a named command is registered');
$t->ok(!$application->hasCommand('afoobar'), '->hasCommand() returns false if a named command is not registered');
$application->addCommand($foo = new FooCommand());
$t->ok($application->hasCommand('afoobar'), '->hasCommand() returns true if an alias is registered');
$t->is($application->getCommand('foo:bar'), $foo, '->getCommand() returns a command by name');
$t->is($application->getCommand('afoobar'), $foo, '->getCommand() returns a command by alias');
try
{
$application->getCommand('foofoo');
$t->fail('->getCommand() throws an \InvalidArgumentException if the command does not exist');
}
catch (\InvalidArgumentException $e)
{
$t->pass('->getCommand() throws an \InvalidArgumentException if the command does not exist');
}
class TestApplication extends Application
{
public function setWantHelps()
{
$this->wantHelps = true;
}
}
$application = new TestApplication();
$application->addCommand($foo = new FooCommand());
$application->setWantHelps();
$command = $application->getCommand('foo:bar');
$t->is(get_class($command), 'Symfony\Components\Console\Command\HelpCommand', '->getCommand() returns the help command if --help is provided as the input');
// ->getNamespaces()
$t->diag('->getNamespaces()');
$application = new TestApplication();
$application->addCommand(new FooCommand());
$application->addCommand(new Foo1Command());
$t->is($application->getNamespaces(), array('foo'), '->getNamespaces() returns an array of unique used namespaces');
// ->findNamespace()
$t->diag('->findNamespace()');
$application = new TestApplication();
$application->addCommand(new FooCommand());
$t->is($application->findNamespace('foo'), 'foo', '->findNamespace() returns the given namespace if it exists');
$t->is($application->findNamespace('f'), 'foo', '->findNamespace() finds a namespace given an abbreviation');
$application->addCommand(new Foo2Command());
$t->is($application->findNamespace('foo'), 'foo', '->findNamespace() returns the given namespace if it exists');
try
{
$application->findNamespace('f');
$t->fail('->findNamespace() throws an \InvalidArgumentException if the abbreviation is ambiguous');
}
catch (\InvalidArgumentException $e)
{
$t->pass('->findNamespace() throws an \InvalidArgumentException if the abbreviation is ambiguous');
}
try
{
$application->findNamespace('bar');
$t->fail('->findNamespace() throws an \InvalidArgumentException if no command is in the given namespace');
}
catch (\InvalidArgumentException $e)
{
$t->pass('->findNamespace() throws an \InvalidArgumentException if no command is in the given namespace');
}
// ->findCommand()
$t->diag('->findCommand()');
$application = new TestApplication();
$application->addCommand(new FooCommand());
$t->is(get_class($application->findCommand('foo:bar')), 'FooCommand', '->findCommand() returns a command if its name exists');
$t->is(get_class($application->findCommand('h')), 'Symfony\Components\Console\Command\HelpCommand', '->findCommand() returns a command if its name exists');
$t->is(get_class($application->findCommand('f:bar')), 'FooCommand', '->findCommand() returns a command if the abbreviation for the namespace exists');
$t->is(get_class($application->findCommand('f:b')), 'FooCommand', '->findCommand() returns a command if the abbreviation for the namespace and the command name exist');
$t->is(get_class($application->findCommand('a')), 'FooCommand', '->findCommand() returns a command if the abbreviation exists for an alias');
$application->addCommand(new Foo1Command());
$application->addCommand(new Foo2Command());
try
{
$application->findCommand('f');
$t->fail('->findCommand() throws an \InvalidArgumentException if the abbreviation is ambiguous for a namespace');
}
catch (\InvalidArgumentException $e)
{
$t->pass('->findCommand() throws an \InvalidArgumentException if the abbreviation is ambiguous for a namespace');
}
try
{
$application->findCommand('a');
$t->fail('->findCommand() throws an \InvalidArgumentException if the abbreviation is ambiguous for an alias');
}
catch (\InvalidArgumentException $e)
{
$t->pass('->findCommand() throws an \InvalidArgumentException if the abbreviation is ambiguous for an alias');
}
try
{
$application->findCommand('foo:b');
$t->fail('->findCommand() throws an \InvalidArgumentException if the abbreviation is ambiguous for a command');
}
catch (\InvalidArgumentException $e)
{
$t->pass('->findCommand() throws an \InvalidArgumentException if the abbreviation is ambiguous for a taks');
}
// ->setCatchExceptions()
$t->diag('->setCatchExceptions()');
$application = new Application();
$application->setAutoExit(false);
$tester = new ApplicationTester($application);
$application->setCatchExceptions(true);
$tester->run(array('command' => 'foo'));
$t->is($tester->getDisplay(), file_get_contents($fixtures.'/application_renderexception1.txt'), '->setCatchExceptions() sets the catch exception flag');
$application->setCatchExceptions(false);
try
{
$tester->run(array('command' => 'foo'));
$t->fail('->setCatchExceptions() sets the catch exception flag');
}
catch (\Exception $e)
{
$t->pass('->setCatchExceptions() sets the catch exception flag');
}
// ->asText()
$t->diag('->asText()');
$application = new Application();
$application->addCommand(new FooCommand);
$t->is($application->asText(), file_get_contents($fixtures.'/application_astext1.txt'), '->asText() returns a text representation of the application');
$t->is($application->asText('foo'), file_get_contents($fixtures.'/application_astext2.txt'), '->asText() returns a text representation of the application');
// ->asXml()
$t->diag('->asXml()');
$application = new Application();
$application->addCommand(new FooCommand);
$t->is($application->asXml(), file_get_contents($fixtures.'/application_asxml1.txt'), '->asXml() returns an XML representation of the application');
$t->is($application->asXml('foo'), file_get_contents($fixtures.'/application_asxml2.txt'), '->asXml() returns an XML representation of the application');
// ->renderException()
$t->diag('->renderException()');
$application = new Application();
$application->setAutoExit(false);
$tester = new ApplicationTester($application);
$tester->run(array('command' => 'foo'));
$t->is($tester->getDisplay(), file_get_contents($fixtures.'/application_renderexception1.txt'), '->renderException() renders a pretty exception');
$tester->run(array('command' => 'foo'), array('verbosity' => Output::VERBOSITY_VERBOSE));
$t->like($tester->getDisplay(), '/Exception trace/', '->renderException() renders a pretty exception with a stack trace when verbosity is verbose');
$tester->run(array('command' => 'list', '--foo' => true));
$t->is($tester->getDisplay(), file_get_contents($fixtures.'/application_renderexception2.txt'), '->renderException() renders the command synopsis when an exception occurs in the context of a command');
// ->run()
$t->diag('->run()');
$application = new Application();
$application->setAutoExit(false);
$application->setCatchExceptions(false);
$application->addCommand($command = new Foo1Command());
$_SERVER['argv'] = array('cli.php', 'foo:bar1');
ob_start();
$application->run();
ob_end_clean();
$t->is(get_class($command->input), 'Symfony\Components\Console\Input\ArgvInput', '->run() creates an ArgvInput by default if none is given');
$t->is(get_class($command->output), 'Symfony\Components\Console\Output\ConsoleOutput', '->run() creates a ConsoleOutput by default if none is given');
$application = new Application();
$application->setAutoExit(false);
$application->setCatchExceptions(false);
$tester = new ApplicationTester($application);
$tester->run(array());
$t->is($tester->getDisplay(), file_get_contents($fixtures.'/application_run1.txt'), '->run() runs the list command if no argument is passed');
$tester->run(array('--help' => true));
$t->is($tester->getDisplay(), file_get_contents($fixtures.'/application_run2.txt'), '->run() runs the help command if --help is passed');
$application = new Application();
$application->setAutoExit(false);
$application->setCatchExceptions(false);
$tester = new ApplicationTester($application);
$tester->run(array('command' => 'list', '--help' => true));
$t->is($tester->getDisplay(), file_get_contents($fixtures.'/application_run3.txt'), '->run() displays the help if --help is passed');
$application = new Application();
$application->setAutoExit(false);
$application->setCatchExceptions(false);
$tester = new ApplicationTester($application);
$tester->run(array('--color' => true));
$t->ok($tester->getOutput()->isDecorated(), '->run() forces color output if --color is passed');
$application = new Application();
$application->setAutoExit(false);
$application->setCatchExceptions(false);
$tester = new ApplicationTester($application);
$tester->run(array('--version' => true));
$t->is($tester->getDisplay(), file_get_contents($fixtures.'/application_run4.txt'), '->run() displays the program version if --version is passed');
$application = new Application();
$application->setAutoExit(false);
$application->setCatchExceptions(false);
$tester = new ApplicationTester($application);
$tester->run(array('command' => 'list', '--quiet' => true));
$t->is($tester->getDisplay(), '', '->run() removes all output if --quiet is passed');
$application = new Application();
$application->setAutoExit(false);
$application->setCatchExceptions(false);
$tester = new ApplicationTester($application);
$tester->run(array('command' => 'list', '--verbose' => true));
$t->is($tester->getOutput()->getVerbosity(), Output::VERBOSITY_VERBOSE, '->run() sets the output to verbose is --verbose is passed');
$application = new Application();
$application->setAutoExit(false);
$application->setCatchExceptions(false);
$application->addCommand(new FooCommand());
$tester = new ApplicationTester($application);
$tester->run(array('command' => 'foo:bar', '--no-interaction' => true));
$t->is($tester->getDisplay(), "called\n", '->run() does not called interact() if --no-interaction is passed');

View File

@ -1,206 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../../bootstrap.php';
use Symfony\Components\Console\Command\Command;
use Symfony\Components\Console\Application;
use Symfony\Components\Console\Input\InputDefinition;
use Symfony\Components\Console\Input\InputArgument;
use Symfony\Components\Console\Input\InputOption;
use Symfony\Components\Console\Input\InputInterface;
use Symfony\Components\Console\Input\StringInput;
use Symfony\Components\Console\Output\OutputInterface;
use Symfony\Components\Console\Output\NullOutput;
use Symfony\Components\Console\Output\StreamOutput;
use Symfony\Components\Console\Tester\CommandTester;
$fixtures = __DIR__.'/../../../../../fixtures/Symfony/Components/Console';
$t = new LimeTest(46);
require_once $fixtures.'/TestCommand.php';
$application = new Application();
// __construct()
$t->diag('__construct()');
try
{
$command = new Command();
$t->fail('__construct() throws a \LogicException if the name is null');
}
catch (\LogicException $e)
{
$t->pass('__construct() throws a \LogicException if the name is null');
}
$command = new Command('foo:bar');
$t->is($command->getFullName(), 'foo:bar', '__construct() takes the command name as its first argument');
// ->setApplication()
$t->diag('->setApplication()');
$command = new TestCommand();
$command->setApplication($application);
$t->is($command->getApplication(), $application, '->setApplication() sets the current application');
// ->setDefinition() ->getDefinition()
$t->diag('->setDefinition() ->getDefinition()');
$ret = $command->setDefinition($definition = new InputDefinition());
$t->is($ret, $command, '->setDefinition() implements a fluent interface');
$t->is($command->getDefinition(), $definition, '->setDefinition() sets the current InputDefinition instance');
$command->setDefinition(array(new InputArgument('foo'), new InputOption('bar')));
$t->ok($command->getDefinition()->hasArgument('foo'), '->setDefinition() also takes an array of InputArguments and InputOptions as an argument');
$t->ok($command->getDefinition()->hasOption('bar'), '->setDefinition() also takes an array of InputArguments and InputOptions as an argument');
$command->setDefinition(new InputDefinition());
// ->addArgument()
$t->diag('->addArgument()');
$ret = $command->addArgument('foo');
$t->is($ret, $command, '->addArgument() implements a fluent interface');
$t->ok($command->getDefinition()->hasArgument('foo'), '->addArgument() adds an argument to the command');
// ->addOption()
$t->diag('->addOption()');
$ret = $command->addOption('foo');
$t->is($ret, $command, '->addOption() implements a fluent interface');
$t->ok($command->getDefinition()->hasOption('foo'), '->addOption() adds an option to the command');
// ->getNamespace() ->getName() ->getFullName() ->setName()
$t->diag('->getNamespace() ->getName() ->getFullName()');
$t->is($command->getNamespace(), 'namespace', '->getNamespace() returns the command namespace');
$t->is($command->getName(), 'name', '->getName() returns the command name');
$t->is($command->getFullName(), 'namespace:name', '->getNamespace() returns the full command name');
$command->setName('foo');
$t->is($command->getName(), 'foo', '->setName() sets the command name');
$command->setName(':bar');
$t->is($command->getName(), 'bar', '->setName() sets the command name');
$t->is($command->getNamespace(), '', '->setName() can set the command namespace');
$ret = $command->setName('foobar:bar');
$t->is($ret, $command, '->setName() implements a fluent interface');
$t->is($command->getName(), 'bar', '->setName() sets the command name');
$t->is($command->getNamespace(), 'foobar', '->setName() can set the command namespace');
try
{
$command->setName('');
$t->fail('->setName() throws an \InvalidArgumentException if the name is empty');
}
catch (\InvalidArgumentException $e)
{
$t->pass('->setName() throws an \InvalidArgumentException if the name is empty');
}
try
{
$command->setName('foo:');
$t->fail('->setName() throws an \InvalidArgumentException if the name is empty');
}
catch (\InvalidArgumentException $e)
{
$t->pass('->setName() throws an \InvalidArgumentException if the name is empty');
}
// ->getDescription() ->setDescription()
$t->diag('->getDescription() ->setDescription()');
$t->is($command->getDescription(), 'description', '->getDescription() returns the description');
$ret = $command->setDescription('description1');
$t->is($ret, $command, '->setDescription() implements a fluent interface');
$t->is($command->getDescription(), 'description1', '->setDescription() sets the description');
// ->getHelp() ->setHelp()
$t->diag('->getHelp() ->setHelp()');
$t->is($command->getHelp(), 'help', '->getHelp() returns the help');
$ret = $command->setHelp('help1');
$t->is($ret, $command, '->setHelp() implements a fluent interface');
$t->is($command->getHelp(), 'help1', '->setHelp() sets the help');
// ->getAliases() ->setAliases()
$t->diag('->getAliases() ->setAliases()');
$t->is($command->getAliases(), array('name'), '->getAliases() returns the aliases');
$ret = $command->setAliases(array('name1'));
$t->is($ret, $command, '->setAliases() implements a fluent interface');
$t->is($command->getAliases(), array('name1'), '->setAliases() sets the aliases');
// ->getSynopsis()
$t->diag('->getSynopsis()');
$t->is($command->getSynopsis(), 'foobar:bar [--foo] [foo]', '->getSynopsis() returns the synopsis');
// ->mergeApplicationDefinition()
$t->diag('->mergeApplicationDefinition()');
$application1 = new Application();
$application1->getDefinition()->addArguments(array(new InputArgument('foo')));
$application1->getDefinition()->addOptions(array(new InputOption('bar')));
$command = new TestCommand();
$command->setApplication($application1);
$command->setDefinition($definition = new InputDefinition(array(new InputArgument('bar'), new InputOption('foo'))));
$command->mergeApplicationDefinition();
$t->ok($command->getDefinition()->hasArgument('foo'), '->mergeApplicationDefinition() merges the application arguments and the command arguments');
$t->ok($command->getDefinition()->hasArgument('bar'), '->mergeApplicationDefinition() merges the application arguments and the command arguments');
$t->ok($command->getDefinition()->hasOption('foo'), '->mergeApplicationDefinition() merges the application options and the command options');
$t->ok($command->getDefinition()->hasOption('bar'), '->mergeApplicationDefinition() merges the application options and the command options');
$command->mergeApplicationDefinition();
$t->is($command->getDefinition()->getArgumentCount(), 3, '->mergeApplicationDefinition() does not try to merge twice the application arguments and options');
$command = new TestCommand();
$command->mergeApplicationDefinition();
$t->pass('->mergeApplicationDefinition() does nothing if application is not set');
// ->run()
$t->diag('->run()');
$command = new TestCommand();
$command->setApplication($application);
$tester = new CommandTester($command);
try
{
$tester->execute(array('--bar' => true));
$t->fail('->run() throws a \RuntimeException when the input does not validate the current InputDefinition');
}
catch (\RuntimeException $e)
{
$t->pass('->run() throws a \RuntimeException when the input does not validate the current InputDefinition');
}
$t->is($tester->execute(array(), array('interactive' => true)), "interact called\nexecute called\n", '->run() calls the interact() method if the input is interactive');
$t->is($tester->execute(array(), array('interactive' => false)), "execute called\n", '->run() does not call the interact() method if the input is not interactive');
$command = new Command('foo');
try
{
$command->run(new StringInput(''), new NullOutput());
$t->fail('->run() throws a \LogicException if the execute() method has not been overriden and no code has been provided');
}
catch (\LogicException $e)
{
$t->pass('->run() throws a \LogicException if the execute() method has not been overriden and no code has been provided');
}
// ->setCode()
$t->diag('->setCode()');
$command = new TestCommand();
$command->setApplication($application);
$ret = $command->setCode(function (InputInterface $input, OutputInterface $output)
{
$output->writeln('from the code...');
});
$t->is($ret, $command, '->setCode() implements a fluent interface');
$tester = new CommandTester($command);
$tester->execute(array());
$t->is($tester->getDisplay(), "interact called\nfrom the code...\n");
// ->asText()
$t->diag('->asText()');
$t->is($command->asText(), file_get_contents($fixtures.'/command_astext.txt'), '->asText() returns a text representation of the command');
// ->asXml()
$t->diag('->asXml()');
$t->is($command->asXml(), file_get_contents($fixtures.'/command_asxml.txt'), '->asXml() returns an XML representation of the command');

View File

@ -1,39 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../../bootstrap.php';
use Symfony\Components\Console\Tester\CommandTester;
use Symfony\Components\Console\Command\HelpCommand;
use Symfony\Components\Console\Command\ListCommand;
use Symfony\Components\Console\Application;
$t = new LimeTest(4);
// ->execute()
$t->diag('->execute()');
$command = new HelpCommand();
$command->setCommand(new ListCommand());
$commandTester = new CommandTester($command);
$commandTester->execute(array());
$t->like($commandTester->getDisplay(), '/list \[--xml\] \[namespace\]/', '->execute() returns a text help for the given command');
$commandTester->execute(array('--xml' => true));
$t->like($commandTester->getDisplay(), '/<command/', '->execute() returns an XML help text if --xml is passed');
$application = new Application();
$commandTester = new CommandTester($application->getCommand('help'));
$commandTester->execute(array('command_name' => 'list'));
$t->like($commandTester->getDisplay(), '/list \[--xml\] \[namespace\]/', '->execute() returns a text help for the given command');
$commandTester->execute(array('command_name' => 'list', '--xml' => true));
$t->like($commandTester->getDisplay(), '/<command/', '->execute() returns an XML help text if --xml is passed');

View File

@ -1,28 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../../bootstrap.php';
use Symfony\Components\Console\Tester\CommandTester;
use Symfony\Components\Console\Application;
$t = new LimeTest(2);
$application = new Application();
// ->execute()
$t->diag('->execute()');
$commandTester = new CommandTester($application->getCommand('list'));
$commandTester->execute(array());
$t->like($commandTester->getDisplay(), '/help Displays help for a command/', '->execute() returns a list of available commands');
$commandTester->execute(array('--xml' => true));
$t->like($commandTester->getDisplay(), '/<command id="list" namespace="_global" name="list">/', '->execute() returns a list of available commands in XML if --xml is passed');

View File

@ -1,28 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../../bootstrap.php';
use Symfony\Components\Console\Helper\FormatterHelper;
$formatter = new FormatterHelper();
$t = new LimeTest(4);
// ::formatSection()
$t->diag('::formatSection()');
$t->is($formatter->formatSection('cli', 'Some text to display'), '<info>[cli]</info> Some text to display', '::formatSection() formats a message in a section');
// ::formatBlock()
$t->diag('::formatBlock()');
$t->is($formatter->formatBlock('Some text to display', 'error'), '<error> Some text to display </error>', '::formatBlock() formats a message in a block');
$t->is($formatter->formatBlock(array('Some text to display', 'foo bar'), 'error'), "<error> Some text to display </error>\n<error> foo bar </error>", '::formatBlock() formats a message in a block');
$t->is($formatter->formatBlock('Some text to display', 'error', true), "<error> </error>\n<error> Some text to display </error>\n<error> </error>", '::formatBlock() formats a message in a block');

View File

@ -1,174 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../../bootstrap.php';
use Symfony\Components\Console\Input\ArgvInput;
use Symfony\Components\Console\Input\InputDefinition;
use Symfony\Components\Console\Input\InputArgument;
use Symfony\Components\Console\Input\InputOption;
class TestInput extends ArgvInput
{
public function getTokens()
{
return $this->tokens;
}
}
$t = new LimeTest(26);
// __construct()
$t->diag('__construct()');
$_SERVER['argv'] = array('cli.php', 'foo');
$input = new TestInput();
$t->is($input->getTokens(), array('foo'), '__construct() automatically get its input from the argv server variable');
// ->parse()
$t->diag('->parse()');
$input = new TestInput(array('cli.php', 'foo'));
$input->bind(new InputDefinition(array(new InputArgument('name'))));
$t->is($input->getArguments(), array('name' => 'foo'), '->parse() parses required arguments');
$input->bind(new InputDefinition(array(new InputArgument('name'))));
$t->is($input->getArguments(), array('name' => 'foo'), '->parse() is stateless');
$input = new TestInput(array('cli.php', '--foo'));
$input->bind(new InputDefinition(array(new InputOption('foo'))));
$t->is($input->getOptions(), array('foo' => true), '->parse() parses long options without parameter');
$input = new TestInput(array('cli.php', '--foo=bar'));
$input->bind(new InputDefinition(array(new InputOption('foo', 'f', InputOption::PARAMETER_REQUIRED))));
$t->is($input->getOptions(), array('foo' => 'bar'), '->parse() parses long options with a required parameter (with a = separator)');
$input = new TestInput(array('cli.php', '--foo', 'bar'));
$input->bind(new InputDefinition(array(new InputOption('foo', 'f', InputOption::PARAMETER_REQUIRED))));
$t->is($input->getOptions(), array('foo' => 'bar'), '->parse() parses long options with a required parameter (with a space separator)');
try
{
$input = new TestInput(array('cli.php', '--foo'));
$input->bind(new InputDefinition(array(new InputOption('foo', 'f', InputOption::PARAMETER_REQUIRED))));
$t->fail('->parse() throws a \RuntimeException if no parameter is passed to an option when it is required');
}
catch (\RuntimeException $e)
{
$t->pass('->parse() throws a \RuntimeException if no parameter is passed to an option when it is required');
}
$input = new TestInput(array('cli.php', '-f'));
$input->bind(new InputDefinition(array(new InputOption('foo', 'f'))));
$t->is($input->getOptions(), array('foo' => true), '->parse() parses short options without parameter');
$input = new TestInput(array('cli.php', '-fbar'));
$input->bind(new InputDefinition(array(new InputOption('foo', 'f', InputOption::PARAMETER_REQUIRED))));
$t->is($input->getOptions(), array('foo' => 'bar'), '->parse() parses short options with a required parameter (with no separator)');
$input = new TestInput(array('cli.php', '-f', 'bar'));
$input->bind(new InputDefinition(array(new InputOption('foo', 'f', InputOption::PARAMETER_REQUIRED))));
$t->is($input->getOptions(), array('foo' => 'bar'), '->parse() parses short options with a required parameter (with a space separator)');
$input = new TestInput(array('cli.php', '-f', '-b', 'foo'));
$input->bind(new InputDefinition(array(new InputArgument('name'), new InputOption('foo', 'f', InputOption::PARAMETER_OPTIONAL), new InputOption('bar', 'b'))));
$t->is($input->getOptions(), array('foo' => null, 'bar' => true), '->parse() parses short options with an optional parameter which is not present');
try
{
$input = new TestInput(array('cli.php', '-f'));
$input->bind(new InputDefinition(array(new InputOption('foo', 'f', InputOption::PARAMETER_REQUIRED))));
$t->fail('->parse() throws a \RuntimeException if no parameter is passed to an option when it is required');
}
catch (\RuntimeException $e)
{
$t->pass('->parse() throws a \RuntimeException if no parameter is passed to an option when it is required');
}
try
{
$input = new TestInput(array('cli.php', '-ffoo'));
$input->bind(new InputDefinition(array(new InputOption('foo', 'f', InputOption::PARAMETER_NONE))));
$t->fail('->parse() throws a \RuntimeException if a value is passed to an option which does not take one');
}
catch (\RuntimeException $e)
{
$t->pass('->parse() throws a \RuntimeException if a value is passed to an option which does not take one');
}
try
{
$input = new TestInput(array('cli.php', 'foo', 'bar'));
$input->bind(new InputDefinition());
$t->fail('->parse() throws a \RuntimeException if too many arguments are passed');
}
catch (\RuntimeException $e)
{
$t->pass('->parse() throws a \RuntimeException if too many arguments are passed');
}
try
{
$input = new TestInput(array('cli.php', '--foo'));
$input->bind(new InputDefinition());
$t->fail('->parse() throws a \RuntimeException if an unknown long option is passed');
}
catch (\RuntimeException $e)
{
$t->pass('->parse() throws a \RuntimeException if an unknown long option is passed');
}
try
{
$input = new TestInput(array('cli.php', '-f'));
$input->bind(new InputDefinition());
$t->fail('->parse() throws a \RuntimeException if an unknown short option is passed');
}
catch (\RuntimeException $e)
{
$t->pass('->parse() throws a \RuntimeException if an unknown short option is passed');
}
$input = new TestInput(array('cli.php', '-fb'));
$input->bind(new InputDefinition(array(new InputOption('foo', 'f'), new InputOption('bar', 'b'))));
$t->is($input->getOptions(), array('foo' => true, 'bar' => true), '->parse() parses short options when they are aggregated as a single one');
$input = new TestInput(array('cli.php', '-fb', 'bar'));
$input->bind(new InputDefinition(array(new InputOption('foo', 'f'), new InputOption('bar', 'b', InputOption::PARAMETER_REQUIRED))));
$t->is($input->getOptions(), array('foo' => true, 'bar' => 'bar'), '->parse() parses short options when they are aggregated as a single one and the last one has a required parameter');
$input = new TestInput(array('cli.php', '-fb', 'bar'));
$input->bind(new InputDefinition(array(new InputOption('foo', 'f'), new InputOption('bar', 'b', InputOption::PARAMETER_OPTIONAL))));
$t->is($input->getOptions(), array('foo' => true, 'bar' => 'bar'), '->parse() parses short options when they are aggregated as a single one and the last one has an optional parameter');
$input = new TestInput(array('cli.php', '-fbbar'));
$input->bind(new InputDefinition(array(new InputOption('foo', 'f'), new InputOption('bar', 'b', InputOption::PARAMETER_OPTIONAL))));
$t->is($input->getOptions(), array('foo' => true, 'bar' => 'bar'), '->parse() parses short options when they are aggregated as a single one and the last one has an optional parameter with no separator');
$input = new TestInput(array('cli.php', '-fbbar'));
$input->bind(new InputDefinition(array(new InputOption('foo', 'f', InputOption::PARAMETER_OPTIONAL), new InputOption('bar', 'b', InputOption::PARAMETER_OPTIONAL))));
$t->is($input->getOptions(), array('foo' => 'bbar', 'bar' => null), '->parse() parses short options when they are aggregated as a single one and one of them takes a parameter');
// ->getFirstArgument()
$t->diag('->getFirstArgument()');
$input = new TestInput(array('cli.php', '-fbbar'));
$t->is($input->getFirstArgument(), '', '->getFirstArgument() returns the first argument from the raw input');
$input = new TestInput(array('cli.php', '-fbbar', 'foo'));
$t->is($input->getFirstArgument(), 'foo', '->getFirstArgument() returns the first argument from the raw input');
// ->hasParameterOption()
$t->diag('->hasParameterOption()');
$input = new TestInput(array('cli.php', '-f', 'foo'));
$t->ok($input->hasParameterOption('-f'), '->hasParameterOption() returns true if the given short option is in the raw input');
$input = new TestInput(array('cli.php', '--foo', 'foo'));
$t->ok($input->hasParameterOption('--foo'), '->hasParameterOption() returns true if the given short option is in the raw input');
$input = new TestInput(array('cli.php', 'foo'));
$t->ok(!$input->hasParameterOption('--foo'), '->hasParameterOption() returns false if the given short option is not in the raw input');

View File

@ -1,93 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../../bootstrap.php';
use Symfony\Components\Console\Input\ArrayInput;
use Symfony\Components\Console\Input\InputDefinition;
use Symfony\Components\Console\Input\InputArgument;
use Symfony\Components\Console\Input\InputOption;
$t = new LimeTest(15);
// ->getFirstArgument()
$t->diag('->getFirstArgument()');
$input = new ArrayInput(array());
$t->is($input->getFirstArgument(), null, '->getFirstArgument() returns null if no argument were passed');
$input = new ArrayInput(array('name' => 'Fabien'));
$t->is($input->getFirstArgument(), 'Fabien', '->getFirstArgument() returns the first passed argument');
$input = new ArrayInput(array('--foo' => 'bar', 'name' => 'Fabien'));
$t->is($input->getFirstArgument(), 'Fabien', '->getFirstArgument() returns the first passed argument');
// ->hasParameterOption()
$t->diag('->hasParameterOption()');
$input = new ArrayInput(array('name' => 'Fabien', '--foo' => 'bar'));
$t->ok($input->hasParameterOption('--foo'), '->hasParameterOption() returns true if an option is present in the passed parameters');
$t->ok(!$input->hasParameterOption('--bar'), '->hasParameterOption() returns false if an option is not present in the passed parameters');
$input = new ArrayInput(array('--foo'));
$t->ok($input->hasParameterOption('--foo'), '->hasParameterOption() returns true if an option is present in the passed parameters');
// ->parse()
$t->diag('->parse()');
$input = new ArrayInput(array('name' => 'foo'), new InputDefinition(array(new InputArgument('name'))));
$t->is($input->getArguments(), array('name' => 'foo'), '->parse() parses required arguments');
try
{
$input = new ArrayInput(array('foo' => 'foo'), new InputDefinition(array(new InputArgument('name'))));
$t->fail('->parse() throws an \InvalidArgumentException exception if an invalid argument is passed');
}
catch (\RuntimeException $e)
{
$t->pass('->parse() throws an \InvalidArgumentException exception if an invalid argument is passed');
}
$input = new ArrayInput(array('--foo' => 'bar'), new InputDefinition(array(new InputOption('foo'))));
$t->is($input->getOptions(), array('foo' => 'bar'), '->parse() parses long options');
$input = new ArrayInput(array('--foo' => 'bar'), new InputDefinition(array(new InputOption('foo', 'f', InputOption::PARAMETER_OPTIONAL, '', 'default'))));
$t->is($input->getOptions(), array('foo' => 'bar'), '->parse() parses long options with a default value');
$input = new ArrayInput(array('--foo' => null), new InputDefinition(array(new InputOption('foo', 'f', InputOption::PARAMETER_OPTIONAL, '', 'default'))));
$t->is($input->getOptions(), array('foo' => 'default'), '->parse() parses long options with a default value');
try
{
$input = new ArrayInput(array('--foo' => null), new InputDefinition(array(new InputOption('foo', 'f', InputOption::PARAMETER_REQUIRED))));
$t->fail('->parse() throws an \InvalidArgumentException exception if a required option is passed without a value');
}
catch (\RuntimeException $e)
{
$t->pass('->parse() throws an \InvalidArgumentException exception if a required option is passed without a value');
}
try
{
$input = new ArrayInput(array('--foo' => 'foo'), new InputDefinition());
$t->fail('->parse() throws an \InvalidArgumentException exception if an invalid option is passed');
}
catch (\RuntimeException $e)
{
$t->pass('->parse() throws an \InvalidArgumentException exception if an invalid option is passed');
}
$input = new ArrayInput(array('-f' => 'bar'), new InputDefinition(array(new InputOption('foo', 'f'))));
$t->is($input->getOptions(), array('foo' => 'bar'), '->parse() parses short options');
try
{
$input = new ArrayInput(array('-o' => 'foo'), new InputDefinition());
$t->fail('->parse() throws an \InvalidArgumentException exception if an invalid option is passed');
}
catch (\RuntimeException $e)
{
$t->pass('->parse() throws an \InvalidArgumentException exception if an invalid option is passed');
}

View File

@ -1,97 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../../bootstrap.php';
use Symfony\Components\Console\Input\InputArgument;
use Symfony\Components\Console\Exception;
$t = new LimeTest(16);
// __construct()
$t->diag('__construct()');
$argument = new InputArgument('foo');
$t->is($argument->getName(), 'foo', '__construct() takes a name as its first argument');
// mode argument
$argument = new InputArgument('foo');
$t->is($argument->isRequired(), false, '__construct() gives a "Argument::OPTIONAL" mode by default');
$argument = new InputArgument('foo', null);
$t->is($argument->isRequired(), false, '__construct() can take "Argument::OPTIONAL" as its mode');
$argument = new InputArgument('foo', InputArgument::OPTIONAL);
$t->is($argument->isRequired(), false, '__construct() can take "Argument::PARAMETER_OPTIONAL" as its mode');
$argument = new InputArgument('foo', InputArgument::REQUIRED);
$t->is($argument->isRequired(), true, '__construct() can take "Argument::PARAMETER_REQUIRED" as its mode');
try
{
$argument = new InputArgument('foo', 'ANOTHER_ONE');
$t->fail('__construct() throws an Exception if the mode is not valid');
}
catch (\Exception $e)
{
$t->pass('__construct() throws an Exception if the mode is not valid');
}
// ->isArray()
$t->diag('->isArray()');
$argument = new InputArgument('foo', InputArgument::IS_ARRAY);
$t->ok($argument->isArray(), '->isArray() returns true if the argument can be an array');
$argument = new InputArgument('foo', InputArgument::OPTIONAL | InputArgument::IS_ARRAY);
$t->ok($argument->isArray(), '->isArray() returns true if the argument can be an array');
$argument = new InputArgument('foo', InputArgument::OPTIONAL);
$t->ok(!$argument->isArray(), '->isArray() returns false if the argument can not be an array');
// ->getDescription()
$t->diag('->getDescription()');
$argument = new InputArgument('foo', null, 'Some description');
$t->is($argument->getDescription(), 'Some description', '->getDescription() return the message description');
// ->getDefault()
$t->diag('->getDefault()');
$argument = new InputArgument('foo', InputArgument::OPTIONAL, '', 'default');
$t->is($argument->getDefault(), 'default', '->getDefault() return the default value');
// ->setDefault()
$t->diag('->setDefault()');
$argument = new InputArgument('foo', InputArgument::OPTIONAL, '', 'default');
$argument->setDefault(null);
$t->ok(is_null($argument->getDefault()), '->setDefault() can reset the default value by passing null');
$argument->setDefault('another');
$t->is($argument->getDefault(), 'another', '->setDefault() changes the default value');
$argument = new InputArgument('foo', InputArgument::OPTIONAL | InputArgument::IS_ARRAY);
$argument->setDefault(array(1, 2));
$t->is($argument->getDefault(), array(1, 2), '->setDefault() changes the default value');
try
{
$argument = new InputArgument('foo', InputArgument::REQUIRED);
$argument->setDefault('default');
$t->fail('->setDefault() throws an Exception if you give a default value for a required argument');
}
catch (\Exception $e)
{
$t->pass('->setDefault() throws an Exception if you give a default value for a required argument');
}
try
{
$argument = new InputArgument('foo', InputArgument::IS_ARRAY);
$argument->setDefault('default');
$t->fail('->setDefault() throws an Exception if you give a default value which is not an array for a IS_ARRAY option');
}
catch (\Exception $e)
{
$t->pass('->setDefault() throws an Exception if you give a default value which is not an array for a IS_ARRAY option');
}

View File

@ -1,305 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../../bootstrap.php';
use Symfony\Components\Console\Input\InputDefinition;
use Symfony\Components\Console\Input\InputArgument;
use Symfony\Components\Console\Input\InputOption;
use Symfony\Components\Console\Exception;
$fixtures = __DIR__.'/../../../../../fixtures/Symfony/Components/Console';
$t = new LimeTest(51);
$foo = new InputArgument('foo');
$bar = new InputArgument('bar');
$foo1 = new InputArgument('foo');
$foo2 = new InputArgument('foo2', InputArgument::REQUIRED);
// __construct()
$t->diag('__construct()');
$definition = new InputDefinition();
$t->is($definition->getArguments(), array(), '__construct() creates a new InputDefinition object');
$definition = new InputDefinition(array($foo, $bar));
$t->is($definition->getArguments(), array('foo' => $foo, 'bar' => $bar), '__construct() takes an array of InputArgument objects as its first argument');
// ->setArguments()
$t->diag('->setArguments()');
$definition = new InputDefinition();
$definition->setArguments(array($foo));
$t->is($definition->getArguments(), array('foo' => $foo), '->setArguments() sets the array of InputArgument objects');
$definition->setArguments(array($bar));
$t->is($definition->getArguments(), array('bar' => $bar), '->setArguments() clears all InputArgument objects');
// ->addArguments()
$t->diag('->addArguments()');
$definition = new InputDefinition();
$definition->addArguments(array($foo));
$t->is($definition->getArguments(), array('foo' => $foo), '->addArguments() adds an array of InputArgument objects');
$definition->addArguments(array($bar));
$t->is($definition->getArguments(), array('foo' => $foo, 'bar' => $bar), '->addArguments() does not clear existing InputArgument objects');
// ->addArgument()
$t->diag('->addArgument()');
$definition = new InputDefinition();
$definition->addArgument($foo);
$t->is($definition->getArguments(), array('foo' => $foo), '->addArgument() adds a InputArgument object');
$definition->addArgument($bar);
$t->is($definition->getArguments(), array('foo' => $foo, 'bar' => $bar), '->addArgument() adds a InputArgument object');
// arguments must have different names
try
{
$definition->addArgument($foo1);
$t->fail('->addArgument() throws a Exception if another argument is already registered with the same name');
}
catch (\Exception $e)
{
$t->pass('->addArgument() throws a Exception if another argument is already registered with the same name');
}
// cannot add a parameter after an array parameter
$definition->addArgument(new InputArgument('fooarray', InputArgument::IS_ARRAY));
try
{
$definition->addArgument(new InputArgument('anotherbar'));
$t->fail('->addArgument() throws a Exception if there is an array parameter already registered');
}
catch (\Exception $e)
{
$t->pass('->addArgument() throws a Exception if there is an array parameter already registered');
}
// cannot add a required argument after an optional one
$definition = new InputDefinition();
$definition->addArgument($foo);
try
{
$definition->addArgument($foo2);
$t->fail('->addArgument() throws an exception if you try to add a required argument after an optional one');
}
catch (\Exception $e)
{
$t->pass('->addArgument() throws an exception if you try to add a required argument after an optional one');
}
// ->getArgument()
$t->diag('->getArgument()');
$definition = new InputDefinition();
$definition->addArguments(array($foo));
$t->is($definition->getArgument('foo'), $foo, '->getArgument() returns a InputArgument by its name');
try
{
$definition->getArgument('bar');
$t->fail('->getArgument() throws an exception if the InputArgument name does not exist');
}
catch (\Exception $e)
{
$t->pass('->getArgument() throws an exception if the InputArgument name does not exist');
}
// ->hasArgument()
$t->diag('->hasArgument()');
$definition = new InputDefinition();
$definition->addArguments(array($foo));
$t->is($definition->hasArgument('foo'), true, '->hasArgument() returns true if a InputArgument exists for the given name');
$t->is($definition->hasArgument('bar'), false, '->hasArgument() returns false if a InputArgument exists for the given name');
// ->getArgumentRequiredCount()
$t->diag('->getArgumentRequiredCount()');
$definition = new InputDefinition();
$definition->addArgument($foo2);
$t->is($definition->getArgumentRequiredCount(), 1, '->getArgumentRequiredCount() returns the number of required arguments');
$definition->addArgument($foo);
$t->is($definition->getArgumentRequiredCount(), 1, '->getArgumentRequiredCount() returns the number of required arguments');
// ->getArgumentCount()
$t->diag('->getArgumentCount()');
$definition = new InputDefinition();
$definition->addArgument($foo2);
$t->is($definition->getArgumentCount(), 1, '->getArgumentCount() returns the number of arguments');
$definition->addArgument($foo);
$t->is($definition->getArgumentCount(), 2, '->getArgumentCount() returns the number of arguments');
// ->getArgumentDefaults()
$t->diag('->getArgumentDefaults()');
$definition = new InputDefinition(array(
new InputArgument('foo1', InputArgument::OPTIONAL),
new InputArgument('foo2', InputArgument::OPTIONAL, '', 'default'),
new InputArgument('foo3', InputArgument::OPTIONAL | InputArgument::IS_ARRAY),
// new InputArgument('foo4', InputArgument::OPTIONAL | InputArgument::IS_ARRAY, '', array(1, 2)),
));
$t->is($definition->getArgumentDefaults(), array('foo1' => null, 'foo2' => 'default', 'foo3' => array()), '->getArgumentDefaults() return the default values for each argument');
$definition = new InputDefinition(array(
new InputArgument('foo4', InputArgument::OPTIONAL | InputArgument::IS_ARRAY, '', array(1, 2)),
));
$t->is($definition->getArgumentDefaults(), array('foo4' => array(1, 2)), '->getArgumentDefaults() return the default values for each argument');
$foo = new InputOption('foo', 'f');
$bar = new InputOption('bar', 'b');
$foo1 = new InputOption('fooBis', 'f');
$foo2 = new InputOption('foo', 'p');
// __construct()
$t->diag('__construct()');
$definition = new InputDefinition();
$t->is($definition->getOptions(), array(), '__construct() creates a new InputDefinition object');
$definition = new InputDefinition(array($foo, $bar));
$t->is($definition->getOptions(), array('foo' => $foo, 'bar' => $bar), '__construct() takes an array of InputOption objects as its first argument');
// ->setOptions()
$t->diag('->setOptions()');
$definition = new InputDefinition(array($foo));
$t->is($definition->getOptions(), array('foo' => $foo), '->setOptions() sets the array of InputOption objects');
$definition->setOptions(array($bar));
$t->is($definition->getOptions(), array('bar' => $bar), '->setOptions() clears all InputOption objects');
try
{
$definition->getOptionForShortcut('f');
$t->fail('->setOptions() clears all InputOption objects');
}
catch (\Exception $e)
{
$t->pass('->setOptions() clears all InputOption objects');
}
// ->addOptions()
$t->diag('->addOptions()');
$definition = new InputDefinition(array($foo));
$t->is($definition->getOptions(), array('foo' => $foo), '->addOptions() adds an array of InputOption objects');
$definition->addOptions(array($bar));
$t->is($definition->getOptions(), array('foo' => $foo, 'bar' => $bar), '->addOptions() does not clear existing InputOption objects');
// ->addOption()
$t->diag('->addOption()');
$definition = new InputDefinition();
$definition->addOption($foo);
$t->is($definition->getOptions(), array('foo' => $foo), '->addOption() adds a InputOption object');
$definition->addOption($bar);
$t->is($definition->getOptions(), array('foo' => $foo, 'bar' => $bar), '->addOption() adds a InputOption object');
try
{
$definition->addOption($foo2);
$t->fail('->addOption() throws a Exception if the another option is already registered with the same name');
}
catch (\Exception $e)
{
$t->pass('->addOption() throws a Exception if the another option is already registered with the same name');
}
try
{
$definition->addOption($foo1);
$t->fail('->addOption() throws a Exception if the another option is already registered with the same shortcut');
}
catch (\Exception $e)
{
$t->pass('->addOption() throws a Exception if the another option is already registered with the same shortcut');
}
// ->getOption()
$t->diag('->getOption()');
$definition = new InputDefinition(array($foo));
$t->is($definition->getOption('foo'), $foo, '->getOption() returns a InputOption by its name');
try
{
$definition->getOption('bar');
$t->fail('->getOption() throws an exception if the option name does not exist');
}
catch (\Exception $e)
{
$t->pass('->getOption() throws an exception if the option name does not exist');
}
// ->hasOption()
$t->diag('->hasOption()');
$definition = new InputDefinition(array($foo));
$t->is($definition->hasOption('foo'), true, '->hasOption() returns true if a InputOption exists for the given name');
$t->is($definition->hasOption('bar'), false, '->hasOption() returns false if a InputOption exists for the given name');
// ->hasShortcut()
$t->diag('->hasShortcut()');
$definition = new InputDefinition(array($foo));
$t->is($definition->hasShortcut('f'), true, '->hasShortcut() returns true if a InputOption exists for the given shortcut');
$t->is($definition->hasShortcut('b'), false, '->hasShortcut() returns false if a InputOption exists for the given shortcut');
// ->getOptionForShortcut()
$t->diag('->getOptionForShortcut()');
$definition = new InputDefinition(array($foo));
$t->is($definition->getOptionForShortcut('f'), $foo, '->getOptionForShortcut() returns a InputOption by its shortcut');
try
{
$definition->getOptionForShortcut('l');
$t->fail('->getOption() throws an exception if the shortcut does not exist');
}
catch (\Exception $e)
{
$t->pass('->getOption() throws an exception if the shortcut does not exist');
}
// ->getOptionDefaults()
$t->diag('->getOptionDefaults()');
$definition = new InputDefinition(array(
new InputOption('foo1', null, InputOption::PARAMETER_NONE),
new InputOption('foo2', null, InputOption::PARAMETER_REQUIRED),
new InputOption('foo3', null, InputOption::PARAMETER_REQUIRED, '', 'default'),
new InputOption('foo4', null, InputOption::PARAMETER_OPTIONAL),
new InputOption('foo5', null, InputOption::PARAMETER_OPTIONAL, '', 'default'),
new InputOption('foo6', null, InputOption::PARAMETER_OPTIONAL | InputOption::PARAMETER_IS_ARRAY),
new InputOption('foo7', null, InputOption::PARAMETER_OPTIONAL | InputOption::PARAMETER_IS_ARRAY, '', array(1, 2)),
));
$defaults = array(
'foo1' => null,
'foo2' => null,
'foo3' => 'default',
'foo4' => null,
'foo5' => 'default',
'foo6' => array(),
'foo7' => array(1, 2),
);
$t->is($definition->getOptionDefaults(), $defaults, '->getOptionDefaults() returns the default values for all options');
// ->getSynopsis()
$t->diag('->getSynopsis()');
$definition = new InputDefinition(array(new InputOption('foo')));
$t->is($definition->getSynopsis(), '[--foo]', '->getSynopsis() returns a synopsis of arguments and options');
$definition = new InputDefinition(array(new InputOption('foo', 'f')));
$t->is($definition->getSynopsis(), '[-f|--foo]', '->getSynopsis() returns a synopsis of arguments and options');
$definition = new InputDefinition(array(new InputOption('foo', 'f', InputOption::PARAMETER_REQUIRED)));
$t->is($definition->getSynopsis(), '[-f|--foo="..."]', '->getSynopsis() returns a synopsis of arguments and options');
$definition = new InputDefinition(array(new InputOption('foo', 'f', InputOption::PARAMETER_OPTIONAL)));
$t->is($definition->getSynopsis(), '[-f|--foo[="..."]]', '->getSynopsis() returns a synopsis of arguments and options');
$definition = new InputDefinition(array(new InputArgument('foo')));
$t->is($definition->getSynopsis(), '[foo]', '->getSynopsis() returns a synopsis of arguments and options');
$definition = new InputDefinition(array(new InputArgument('foo', InputArgument::REQUIRED)));
$t->is($definition->getSynopsis(), 'foo', '->getSynopsis() returns a synopsis of arguments and options');
$definition = new InputDefinition(array(new InputArgument('foo', InputArgument::IS_ARRAY)));
$t->is($definition->getSynopsis(), '[foo1] ... [fooN]', '->getSynopsis() returns a synopsis of arguments and options');
$definition = new InputDefinition(array(new InputArgument('foo', InputArgument::REQUIRED | InputArgument::IS_ARRAY)));
$t->is($definition->getSynopsis(), 'foo1 ... [fooN]', '->getSynopsis() returns a synopsis of arguments and options');
// ->asText()
$t->diag('->asText()');
$definition = new InputDefinition(array(
new InputArgument('foo', InputArgument::OPTIONAL, 'The bar argument'),
new InputArgument('bar', InputArgument::OPTIONAL | InputArgument::IS_ARRAY, 'The foo argument', array('bar')),
new InputOption('foo', 'f', InputOption::PARAMETER_REQUIRED, 'The foo option'),
new InputOption('bar', 'b', InputOption::PARAMETER_OPTIONAL, 'The foo option', 'bar'),
));
$t->is($definition->asText(), file_get_contents($fixtures.'/definition_astext.txt'), '->asText() returns a textual representation of the InputDefinition');
// ->asXml()
$t->diag('->asXml()');
$t->is($definition->asXml(), file_get_contents($fixtures.'/definition_asxml.txt'), '->asText() returns a textual representation of the InputDefinition');

View File

@ -1,138 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../../bootstrap.php';
use Symfony\Components\Console\Input\InputOption;
use Symfony\Components\Console\Exception;
$t = new LimeTest(34);
// __construct()
$t->diag('__construct()');
$option = new InputOption('foo');
$t->is($option->getName(), 'foo', '__construct() takes a name as its first argument');
$option = new InputOption('--foo');
$t->is($option->getName(), 'foo', '__construct() removes the leading -- of the option name');
try
{
$option = new InputOption('foo', 'f', InputOption::PARAMETER_IS_ARRAY);
$t->fail('->setDefault() throws an Exception if PARAMETER_IS_ARRAY option is used when an option does not accept a value');
}
catch (\Exception $e)
{
$t->pass('->setDefault() throws an Exception if PARAMETER_IS_ARRAY option is used when an option does not accept a value');
}
// shortcut argument
$option = new InputOption('foo', 'f');
$t->is($option->getShortcut(), 'f', '__construct() can take a shortcut as its second argument');
$option = new InputOption('foo', '-f');
$t->is($option->getShortcut(), 'f', '__construct() removes the leading - of the shortcut');
// mode argument
$option = new InputOption('foo', 'f');
$t->is($option->acceptParameter(), false, '__construct() gives a "Option::PARAMETER_NONE" mode by default');
$t->is($option->isParameterRequired(), false, '__construct() gives a "Option::PARAMETER_NONE" mode by default');
$t->is($option->isParameterOptional(), false, '__construct() gives a "Option::PARAMETER_NONE" mode by default');
$option = new InputOption('foo', 'f', null);
$t->is($option->acceptParameter(), false, '__construct() can take "Option::PARAMETER_NONE" as its mode');
$t->is($option->isParameterRequired(), false, '__construct() can take "Option::PARAMETER_NONE" as its mode');
$t->is($option->isParameterOptional(), false, '__construct() can take "Option::PARAMETER_NONE" as its mode');
$option = new InputOption('foo', 'f', InputOption::PARAMETER_NONE);
$t->is($option->acceptParameter(), false, '__construct() can take "Option::PARAMETER_NONE" as its mode');
$t->is($option->isParameterRequired(), false, '__construct() can take "Option::PARAMETER_NONE" as its mode');
$t->is($option->isParameterOptional(), false, '__construct() can take "Option::PARAMETER_NONE" as its mode');
$option = new InputOption('foo', 'f', InputOption::PARAMETER_REQUIRED);
$t->is($option->acceptParameter(), true, '__construct() can take "Option::PARAMETER_REQUIRED" as its mode');
$t->is($option->isParameterRequired(), true, '__construct() can take "Option::PARAMETER_REQUIRED" as its mode');
$t->is($option->isParameterOptional(), false, '__construct() can take "Option::PARAMETER_REQUIRED" as its mode');
$option = new InputOption('foo', 'f', InputOption::PARAMETER_OPTIONAL);
$t->is($option->acceptParameter(), true, '__construct() can take "Option::PARAMETER_OPTIONAL" as its mode');
$t->is($option->isParameterRequired(), false, '__construct() can take "Option::PARAMETER_OPTIONAL" as its mode');
$t->is($option->isParameterOptional(), true, '__construct() can take "Option::PARAMETER_OPTIONAL" as its mode');
try
{
$option = new InputOption('foo', 'f', 'ANOTHER_ONE');
$t->fail('__construct() throws an Exception if the mode is not valid');
}
catch (\Exception $e)
{
$t->pass('__construct() throws an Exception if the mode is not valid');
}
// ->isArray()
$t->diag('->isArray()');
$option = new InputOption('foo', null, InputOption::PARAMETER_OPTIONAL | InputOption::PARAMETER_IS_ARRAY);
$t->ok($option->isArray(), '->isArray() returns true if the option can be an array');
$option = new InputOption('foo', null, InputOption::PARAMETER_NONE);
$t->ok(!$option->isArray(), '->isArray() returns false if the option can not be an array');
// ->getDescription()
$t->diag('->getDescription()');
$option = new InputOption('foo', 'f', null, 'Some description');
$t->is($option->getDescription(), 'Some description', '->getDescription() returns the description message');
// ->getDefault()
$t->diag('->getDefault()');
$option = new InputOption('foo', null, InputOption::PARAMETER_OPTIONAL, '', 'default');
$t->is($option->getDefault(), 'default', '->getDefault() returns the default value');
$option = new InputOption('foo', null, InputOption::PARAMETER_REQUIRED, '', 'default');
$t->is($option->getDefault(), 'default', '->getDefault() returns the default value');
$option = new InputOption('foo', null, InputOption::PARAMETER_REQUIRED);
$t->ok(is_null($option->getDefault()), '->getDefault() returns null if no default value is configured');
$option = new InputOption('foo', null, InputOption::PARAMETER_OPTIONAL | InputOption::PARAMETER_IS_ARRAY);
$t->is($option->getDefault(), array(), '->getDefault() returns an empty array if option is an array');
$option = new InputOption('foo', null, InputOption::PARAMETER_NONE);
$t->ok($option->getDefault() === false, '->getDefault() returns false if the option does not take a parameter');
// ->setDefault()
$t->diag('->setDefault()');
$option = new InputOption('foo', null, InputOption::PARAMETER_REQUIRED, '', 'default');
$option->setDefault(null);
$t->ok(is_null($option->getDefault()), '->setDefault() can reset the default value by passing null');
$option->setDefault('another');
$t->is($option->getDefault(), 'another', '->setDefault() changes the default value');
$option = new InputOption('foo', null, InputOption::PARAMETER_REQUIRED | InputOption::PARAMETER_IS_ARRAY);
$option->setDefault(array(1, 2));
$t->is($option->getDefault(), array(1, 2), '->setDefault() changes the default value');
$option = new InputOption('foo', 'f', InputOption::PARAMETER_NONE);
try
{
$option->setDefault('default');
$t->fail('->setDefault() throws an Exception if you give a default value for a PARAMETER_NONE option');
}
catch (\Exception $e)
{
$t->pass('->setDefault() throws an Exception if you give a default value for a PARAMETER_NONE option');
}
$option = new InputOption('foo', 'f', InputOption::PARAMETER_OPTIONAL | InputOption::PARAMETER_IS_ARRAY);
try
{
$option->setDefault('default');
$t->fail('->setDefault() throws an Exception if you give a default value which is not an array for a PARAMETER_IS_ARRAY option');
}
catch (\Exception $e)
{
$t->pass('->setDefault() throws an Exception if you give a default value which is not an array for a PARAMETER_IS_ARRAY option');
}

View File

@ -1,124 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../../bootstrap.php';
use Symfony\Components\Console\Input\ArrayInput;
use Symfony\Components\Console\Input\InputDefinition;
use Symfony\Components\Console\Input\InputArgument;
use Symfony\Components\Console\Input\InputOption;
$t = new LimeTest(19);
// __construct()
$t->diag('__construct()');
$input = new ArrayInput(array('name' => 'foo'), new InputDefinition(array(new InputArgument('name'))));
$t->is($input->getArgument('name'), 'foo', '->__construct() takes a InputDefinition as an argument');
// ->getOption() ->setOption() ->getOptions()
$t->diag('->getOption() ->setOption() ->getOptions()');
$input = new ArrayInput(array('--name' => 'foo'), new InputDefinition(array(new InputOption('name'))));
$t->is($input->getOption('name'), 'foo', '->getOption() returns the value for the given option');
$input->setOption('name', 'bar');
$t->is($input->getOption('name'), 'bar', '->setOption() sets the value for a given option');
$t->is($input->getOptions(), array('name' => 'bar'), '->getOptions() returns all option values');
$input = new ArrayInput(array('--name' => 'foo'), new InputDefinition(array(new InputOption('name'), new InputOption('bar', '', InputOption::PARAMETER_OPTIONAL, '', 'default'))));
$t->is($input->getOption('bar'), 'default', '->getOption() returns the default value for optional options');
$t->is($input->getOptions(), array('name' => 'foo', 'bar' => 'default'), '->getOptions() returns all option values, even optional ones');
try
{
$input->setOption('foo', 'bar');
$t->fail('->setOption() throws a \InvalidArgumentException if the option does not exist');
}
catch (\InvalidArgumentException $e)
{
$t->pass('->setOption() throws a \InvalidArgumentException if the option does not exist');
}
try
{
$input->getOption('foo');
$t->fail('->getOption() throws a \InvalidArgumentException if the option does not exist');
}
catch (\InvalidArgumentException $e)
{
$t->pass('->getOption() throws a \InvalidArgumentException if the option does not exist');
}
// ->getArgument() ->setArgument() ->getArguments()
$t->diag('->getArgument() ->setArgument() ->getArguments()');
$input = new ArrayInput(array('name' => 'foo'), new InputDefinition(array(new InputArgument('name'))));
$t->is($input->getArgument('name'), 'foo', '->getArgument() returns the value for the given argument');
$input->setArgument('name', 'bar');
$t->is($input->getArgument('name'), 'bar', '->setArgument() sets the value for a given argument');
$t->is($input->getArguments(), array('name' => 'bar'), '->getArguments() returns all argument values');
$input = new ArrayInput(array('name' => 'foo'), new InputDefinition(array(new InputArgument('name'), new InputArgument('bar', InputArgument::OPTIONAL, '', 'default'))));
$t->is($input->getArgument('bar'), 'default', '->getArgument() returns the default value for optional arguments');
$t->is($input->getArguments(), array('name' => 'foo', 'bar' => 'default'), '->getArguments() returns all argument values, even optional ones');
try
{
$input->setArgument('foo', 'bar');
$t->fail('->setArgument() throws a \InvalidArgumentException if the argument does not exist');
}
catch (\InvalidArgumentException $e)
{
$t->pass('->setArgument() throws a \InvalidArgumentException if the argument does not exist');
}
try
{
$input->getArgument('foo');
$t->fail('->getArgument() throws a \InvalidArgumentException if the argument does not exist');
}
catch (\InvalidArgumentException $e)
{
$t->pass('->getArgument() throws a \InvalidArgumentException if the argument does not exist');
}
// ->validate()
$t->diag('->validate()');
$input = new ArrayInput(array());
$input->bind(new InputDefinition(array(new InputArgument('name', InputArgument::REQUIRED))));
try
{
$input->validate();
$t->fail('->validate() throws a \RuntimeException if not enough arguments are given');
}
catch (\RuntimeException $e)
{
$t->pass('->validate() throws a \RuntimeException if not enough arguments are given');
}
$input = new ArrayInput(array('name' => 'foo'));
$input->bind(new InputDefinition(array(new InputArgument('name', InputArgument::REQUIRED))));
try
{
$input->validate();
$t->pass('->validate() does not throw a \RuntimeException if enough arguments are given');
}
catch (\RuntimeException $e)
{
$t->fail('->validate() does not throw a \RuntimeException if enough arguments are given');
}
// ->setInteractive() ->isInteractive()
$t->diag('->setInteractive() ->isInteractive()');
$input = new ArrayInput(array());
$t->ok($input->isInteractive(), '->isInteractive() returns whether the input should be interactive or not');
$input->setInteractive(false);
$t->ok(!$input->isInteractive(), '->setInteractive() changes the interactive flag');

View File

@ -1,94 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../../bootstrap.php';
use Symfony\Components\Console\Input\StringInput;
class TestInput extends StringInput
{
public function getTokens()
{
return $this->tokens;
}
}
$t = new LimeTest(23);
// ->tokenize()
$t->diag('->tokenize()');
$input = new TestInput('');
$t->is($input->getTokens(), array(), '->tokenize() parses an empty string');
$input = new TestInput('foo');
$t->is($input->getTokens(), array('foo'), '->tokenize() parses arguments');
$input = new TestInput(' foo bar ');
$t->is($input->getTokens(), array('foo', 'bar'), '->tokenize() ignores whitespaces between arguments');
$input = new TestInput('"quoted"');
$t->is($input->getTokens(), array('quoted'), '->tokenize() parses quoted arguments');
$input = new TestInput("'quoted'");
$t->is($input->getTokens(), array('quoted'), '->tokenize() parses quoted arguments');
$input = new TestInput('\"quoted\"');
$t->is($input->getTokens(), array('"quoted"'), '->tokenize() parses escaped-quoted arguments');
$input = new TestInput("\'quoted\'");
$t->is($input->getTokens(), array('\'quoted\''), '->tokenize() parses escaped-quoted arguments');
$input = new TestInput('-a');
$t->is($input->getTokens(), array('-a'), '->tokenize() parses short options');
$input = new TestInput('-azc');
$t->is($input->getTokens(), array('-azc'), '->tokenize() parses aggregated short options');
$input = new TestInput('-awithavalue');
$t->is($input->getTokens(), array('-awithavalue'), '->tokenize() parses short options with a value');
$input = new TestInput('-a"foo bar"');
$t->is($input->getTokens(), array('-afoo bar'), '->tokenize() parses short options with a value');
$input = new TestInput('-a"foo bar""foo bar"');
$t->is($input->getTokens(), array('-afoo barfoo bar'), '->tokenize() parses short options with a value');
$input = new TestInput('-a\'foo bar\'');
$t->is($input->getTokens(), array('-afoo bar'), '->tokenize() parses short options with a value');
$input = new TestInput('-a\'foo bar\'\'foo bar\'');
$t->is($input->getTokens(), array('-afoo barfoo bar'), '->tokenize() parses short options with a value');
$input = new TestInput('-a\'foo bar\'"foo bar"');
$t->is($input->getTokens(), array('-afoo barfoo bar'), '->tokenize() parses short options with a value');
$input = new TestInput('--long-option');
$t->is($input->getTokens(), array('--long-option'), '->tokenize() parses long options');
$input = new TestInput('--long-option=foo');
$t->is($input->getTokens(), array('--long-option=foo'), '->tokenize() parses long options with a value');
$input = new TestInput('--long-option="foo bar"');
$t->is($input->getTokens(), array('--long-option=foo bar'), '->tokenize() parses long options with a value');
$input = new TestInput('--long-option="foo bar""another"');
$t->is($input->getTokens(), array('--long-option=foo baranother'), '->tokenize() parses long options with a value');
$input = new TestInput('--long-option=\'foo bar\'');
$t->is($input->getTokens(), array('--long-option=foo bar'), '->tokenize() parses long options with a value');
$input = new TestInput("--long-option='foo bar''another'");
$t->is($input->getTokens(), array("--long-option=foo baranother"), '->tokenize() parses long options with a value');
$input = new TestInput("--long-option='foo bar'\"another\"");
$t->is($input->getTokens(), array("--long-option=foo baranother"), '->tokenize() parses long options with a value');
$input = new TestInput('foo -a -ffoo --long bar');
$t->is($input->getTokens(), array('foo', '-a', '-ffoo', '--long', 'bar'), '->tokenize() parses when several arguments and options');

View File

@ -1,21 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../../bootstrap.php';
use Symfony\Components\Console\Output\ConsoleOutput;
use Symfony\Components\Console\Output\Output;
$t = new LimeTest(1);
// __construct()
$t->diag('__construct()');
$output = new ConsoleOutput(Output::VERBOSITY_QUIET, true);
$t->is($output->getVerbosity(), Output::VERBOSITY_QUIET, '__construct() takes the verbosity as its first argument');

View File

@ -1,100 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../../bootstrap.php';
use Symfony\Components\Console\Output\Output;
$t = new LimeTest(13);
class TestOutput extends Output
{
public $output = '';
static public function getStyle($name)
{
return static::$styles[$name];
}
public function doWrite($message, $newline)
{
$this->output .= $message.($newline ? "\n" : '');
}
}
// __construct()
$t->diag('__construct()');
$output = new TestOutput(Output::VERBOSITY_QUIET, true);
$t->is($output->getVerbosity(), Output::VERBOSITY_QUIET, '__construct() takes the verbosity as its first argument');
$t->is($output->isDecorated(), true, '__construct() takes the decorated flag as its second argument');
// ->setDecorated() ->isDecorated()
$t->diag('->setDecorated() ->isDecorated()');
$output = new TestOutput();
$output->setDecorated(true);
$t->is($output->isDecorated(), true, 'setDecorated() sets the decorated flag');
// ->setVerbosity() ->getVerbosity()
$t->diag('->setVerbosity() ->getVerbosity()');
$output->setVerbosity(Output::VERBOSITY_QUIET);
$t->is($output->getVerbosity(), Output::VERBOSITY_QUIET, '->setVerbosity() sets the verbosity');
// ::setStyle()
$t->diag('::setStyle()');
Output::setStyle('FOO', array('bg' => 'red', 'fg' => 'yellow', 'blink' => true));
$t->is(TestOutput::getStyle('foo'), array('bg' => 'red', 'fg' => 'yellow', 'blink' => true), '::setStyle() sets a new style');
// ->writeln()
$t->diag('->writeln()');
$output = new TestOutput(Output::VERBOSITY_QUIET);
$output->writeln('foo');
$t->is($output->output, '', '->writeln() outputs nothing if verbosity is set to VERBOSITY_QUIET');
$output = new TestOutput();
$output->writeln(array('foo', 'bar'));
$t->is($output->output, "foo\nbar\n", '->writeln() can take an array of messages to output');
$output = new TestOutput();
$output->writeln('<info>foo</info>', Output::OUTPUT_RAW);
$t->is($output->output, "<info>foo</info>\n", '->writeln() outputs the raw message if OUTPUT_RAW is specified');
$output = new TestOutput();
$output->writeln('<info>foo</info>', Output::OUTPUT_PLAIN);
$t->is($output->output, "foo\n", '->writeln() strips decoration tags if OUTPUT_PLAIN is specified');
$output = new TestOutput();
$output->setDecorated(false);
$output->writeln('<info>foo</info>');
$t->is($output->output, "foo\n", '->writeln() strips decoration tags if decoration is set to false');
$output = new TestOutput();
$output->setDecorated(true);
$output->writeln('<foo>foo</foo>');
$t->is($output->output, "\033[33;41;5mfoo\033[0m\n", '->writeln() decorates the output');
try
{
$output->writeln('<foo>foo</foo>', 24);
$t->fail('->writeln() throws an \InvalidArgumentException when the type does not exist');
}
catch (\InvalidArgumentException $e)
{
$t->pass('->writeln() throws an \InvalidArgumentException when the type does not exist');
}
try
{
$output->writeln('<bar>foo</bar>');
$t->fail('->writeln() throws an \InvalidArgumentException when a style does not exist');
}
catch (\InvalidArgumentException $e)
{
$t->pass('->writeln() throws an \InvalidArgumentException when a style does not exist');
}

View File

@ -1,47 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../../bootstrap.php';
use Symfony\Components\Console\Output\Output;
use Symfony\Components\Console\Output\StreamOutput;
$t = new LimeTest(5);
$stream = fopen('php://memory', 'a', false);
// __construct()
$t->diag('__construct()');
try
{
$output = new StreamOutput('foo');
$t->fail('__construct() throws an \InvalidArgumentException if the first argument is not a stream');
}
catch (\InvalidArgumentException $e)
{
$t->pass('__construct() throws an \InvalidArgumentException if the first argument is not a stream');
}
$output = new StreamOutput($stream, Output::VERBOSITY_QUIET, true);
$t->is($output->getVerbosity(), Output::VERBOSITY_QUIET, '__construct() takes the verbosity as its first argument');
$t->is($output->isDecorated(), true, '__construct() takes the decorated flag as its second argument');
// ->getStream()
$t->diag('->getStream()');
$output = new StreamOutput($stream);
$t->is($output->getStream(), $stream, '->getStream() returns the current stream');
// ->doWrite()
$t->diag('->doWrite()');
$output = new StreamOutput($stream);
$output->writeln('foo');
rewind($output->getStream());
$t->is(stream_get_contents($output->getStream()), "foo\n", '->doWrite() writes to the stream');

View File

@ -1,47 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../../bootstrap.php';
use Symfony\Components\Console\Application;
use Symfony\Components\Console\Output\Output;
use Symfony\Components\Console\Tester\ApplicationTester;
$t = new LimeTest(6);
$application = new Application();
$application->setAutoExit(false);
$application->register('foo')
->addArgument('command')
->addArgument('foo')
->setCode(function ($input, $output) { $output->writeln('foo'); })
;
$tester = new ApplicationTester($application);
$tester->run(array('command' => 'foo', 'foo' => 'bar'), array('interactive' => false, 'decorated' => false, 'verbosity' => Output::VERBOSITY_VERBOSE));
// ->run()
$t->diag('->run()');
$t->is($tester->getInput()->isInteractive(), false, '->execute() takes an interactive option');
$t->is($tester->getOutput()->isDecorated(), false, '->execute() takes a decorated option');
$t->is($tester->getOutput()->getVerbosity(), Output::VERBOSITY_VERBOSE, '->execute() takes a verbosity option');
// ->getInput()
$t->diag('->getInput()');
$t->is($tester->getInput()->getArgument('foo'), 'bar', '->getInput() returns the current input instance');
// ->getOutput()
$t->diag('->getOutput()');
rewind($tester->getOutput()->getStream());
$t->is(stream_get_contents($tester->getOutput()->getStream()), "foo\n", '->getOutput() returns the current output instance');
// ->getDisplay()
$t->diag('->getDisplay()');
$t->is($tester->getDisplay(), "foo\n", '->getDisplay() returns the display of the last execution');

View File

@ -1,44 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../../bootstrap.php';
use Symfony\Components\Console\Command\Command;
use Symfony\Components\Console\Output\Output;
use Symfony\Components\Console\Tester\CommandTester;
$t = new LimeTest(6);
$command = new Command('foo');
$command->addArgument('command');
$command->addArgument('foo');
$command->setCode(function ($input, $output) { $output->writeln('foo'); });
$tester = new CommandTester($command);
$tester->execute(array('foo' => 'bar'), array('interactive' => false, 'decorated' => false, 'verbosity' => Output::VERBOSITY_VERBOSE));
// ->execute()
$t->diag('->execute()');
$t->is($tester->getInput()->isInteractive(), false, '->execute() takes an interactive option');
$t->is($tester->getOutput()->isDecorated(), false, '->execute() takes a decorated option');
$t->is($tester->getOutput()->getVerbosity(), Output::VERBOSITY_VERBOSE, '->execute() takes a verbosity option');
// ->getInput()
$t->diag('->getInput()');
$t->is($tester->getInput()->getArgument('foo'), 'bar', '->getInput() returns the current input instance');
// ->getOutput()
$t->diag('->getOutput()');
rewind($tester->getOutput()->getStream());
$t->is(stream_get_contents($tester->getOutput()->getStream()), "foo\n", '->getOutput() returns the current output instance');
// ->getDisplay()
$t->diag('->getDisplay()');
$t->is($tester->getDisplay(), "foo\n", '->getDisplay() returns the display of the last execution');

View File

@ -1,192 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\DependencyInjection\Builder;
use Symfony\Components\DependencyInjection\BuilderConfiguration;
use Symfony\Components\DependencyInjection\Definition;
use Symfony\Components\DependencyInjection\Reference;
use Symfony\Components\DependencyInjection\FileResource;
$fixturesPath = __DIR__.'/../../../../fixtures/Symfony/Components/DependencyInjection/';
$t = new LimeTest(39);
// __construct()
$t->diag('__construct()');
$definitions = array(
'foo' => new Definition('FooClass'),
'bar' => new Definition('BarClass'),
);
$parameters = array(
'foo' => 'foo',
'bar' => 'bar',
);
$configuration = new BuilderConfiguration($definitions, $parameters);
$t->is($configuration->getDefinitions(), $definitions, '__construct() takes an array of definitions as its first argument');
$t->is($configuration->getParameters(), $parameters, '__construct() takes an array of parameters as its second argument');
// ->merge()
$t->diag('->merge()');
$configuration = new BuilderConfiguration();
$configuration->merge(null);
$t->is($configuration->getParameters(), array(), '->merge() accepts null as an argument');
$t->is($configuration->getDefinitions(), array(), '->merge() accepts null as an argument');
$configuration = new BuilderConfiguration(array(), array('bar' => 'foo'));
$configuration1 = new BuilderConfiguration(array(), array('foo' => 'bar'));
$configuration->merge($configuration1);
$t->is($configuration->getParameters(), array('bar' => 'foo', 'foo' => 'bar'), '->merge() merges current parameters with the loaded ones');
$configuration = new BuilderConfiguration(array(), array('bar' => 'foo', 'foo' => 'baz'));
$config = new BuilderConfiguration(array(), array('foo' => 'bar'));
$configuration->merge($config);
$t->is($configuration->getParameters(), array('bar' => 'foo', 'foo' => 'bar'), '->merge() overrides existing parameters');
$configuration = new BuilderConfiguration(array('foo' => new Definition('FooClass'), 'bar' => new Definition('BarClass')));
$config = new BuilderConfiguration(array('baz' => new Definition('BazClass')));
$config->setAlias('alias_for_foo', 'foo');
$configuration->merge($config);
$t->is(array_keys($configuration->getDefinitions()), array('foo', 'bar', 'baz'), '->merge() merges definitions already defined ones');
$t->is($configuration->getAliases(), array('alias_for_foo' => 'foo'), '->merge() registers defined aliases');
$configuration = new BuilderConfiguration(array('foo' => new Definition('FooClass')));
$config->setDefinition('foo', new Definition('BazClass'));
$configuration->merge($config);
$t->is($configuration->getDefinition('foo')->getClass(), 'BazClass', '->merge() overrides already defined services');
$configuration = new BuilderConfiguration();
$configuration->addResource($a = new FileResource('foo.xml'));
$config = new BuilderConfiguration();
$config->addResource($b = new FileResource('foo.yml'));
$configuration->merge($config);
$t->is($configuration->getResources(), array($a, $b), '->merge() merges resources');
// ->setParameters() ->getParameters()
$t->diag('->setParameters() ->getParameters()');
$configuration = new BuilderConfiguration();
$t->is($configuration->getParameters(), array(), '->getParameters() returns an empty array if no parameter has been defined');
$configuration->setParameters(array('foo' => 'bar'));
$t->is($configuration->getParameters(), array('foo' => 'bar'), '->setParameters() sets the parameters');
$configuration->setParameters(array('bar' => 'foo'));
$t->is($configuration->getParameters(), array('bar' => 'foo'), '->setParameters() overrides the previous defined parameters');
$configuration->setParameters(array('Bar' => 'foo'));
$t->is($configuration->getParameters(), array('bar' => 'foo'), '->setParameters() converts the key to lowercase');
// ->setParameter() ->getParameter()
$t->diag('->setParameter() ->getParameter() ');
$configuration = new BuilderConfiguration(array(), array('foo' => 'bar'));
$configuration->setParameter('bar', 'foo');
$t->is($configuration->getParameter('bar'), 'foo', '->setParameter() sets the value of a new parameter');
$configuration->setParameter('foo', 'baz');
$t->is($configuration->getParameter('foo'), 'baz', '->setParameter() overrides previously set parameter');
$configuration->setParameter('Foo', 'baz1');
$t->is($configuration->getParameter('foo'), 'baz1', '->setParameter() converts the key to lowercase');
$t->is($configuration->getParameter('FOO'), 'baz1', '->getParameter() converts the key to lowercase');
try
{
$configuration->getParameter('baba');
$t->fail('->getParameter() throws an \InvalidArgumentException if the key does not exist');
}
catch (\InvalidArgumentException $e)
{
$t->pass('->getParameter() throws an \InvalidArgumentException if the key does not exist');
}
// ->hasParameter()
$t->diag('->hasParameter()');
$configuration = new BuilderConfiguration(array(), array('foo' => 'bar'));
$t->ok($configuration->hasParameter('foo'), '->hasParameter() returns true if a parameter is defined');
$t->ok($configuration->hasParameter('Foo'), '->hasParameter() converts the key to lowercase');
$t->ok(!$configuration->hasParameter('bar'), '->hasParameter() returns false if a parameter is not defined');
// ->addParameters()
$t->diag('->addParameters()');
$configuration = new BuilderConfiguration(array(), array('foo' => 'bar'));
$configuration->addParameters(array('bar' => 'foo'));
$t->is($configuration->getParameters(), array('foo' => 'bar', 'bar' => 'foo'), '->addParameters() adds parameters to the existing ones');
$configuration->addParameters(array('Bar' => 'fooz'));
$t->is($configuration->getParameters(), array('foo' => 'bar', 'bar' => 'fooz'), '->addParameters() converts keys to lowercase');
// ->setAlias() ->getAlias() ->hasAlias() ->getAliases() ->addAliases()
$t->diag('->setAlias() ->getAlias() ->hasAlias()');
$configuration = new BuilderConfiguration();
$configuration->setAlias('bar', 'foo');
$t->is($configuration->getAlias('bar'), 'foo', '->setAlias() defines a new alias');
$t->ok($configuration->hasAlias('bar'), '->hasAlias() returns true if the alias is defined');
$t->ok(!$configuration->hasAlias('baba'), '->hasAlias() returns false if the alias is not defined');
try
{
$configuration->getAlias('baba');
$t->fail('->getAlias() throws an \InvalidArgumentException if the alias does not exist');
}
catch (\InvalidArgumentException $e)
{
$t->pass('->getAlias() throws an \InvalidArgumentException if the alias does not exist');
}
$configuration->setAlias('barbar', 'foofoo');
$t->is($configuration->getAliases(), array('bar' => 'foo', 'barbar' => 'foofoo'), '->getAliases() returns an array of all defined aliases');
$configuration->addAliases(array('foo' => 'bar'));
$t->is($configuration->getAliases(), array('bar' => 'foo', 'barbar' => 'foofoo', 'foo' => 'bar'), '->addAliases() adds some aliases');
// ->setDefinitions() ->addDefinitions() ->getDefinitions() ->setDefinition() ->getDefinition() ->hasDefinition()
$t->diag('->setDefinitions() ->addDefinitions() ->getDefinitions() ->setDefinition() ->getDefinition() ->hasDefinition()');
$configuration = new BuilderConfiguration();
$definitions = array(
'foo' => new Definition('FooClass'),
'bar' => new Definition('BarClass'),
);
$configuration->setDefinitions($definitions);
$t->is($configuration->getDefinitions(), $definitions, '->setDefinitions() sets the service definitions');
$t->ok($configuration->hasDefinition('foo'), '->hasDefinition() returns true if a service definition exists');
$t->ok(!$configuration->hasDefinition('foobar'), '->hasDefinition() returns false if a service definition does not exist');
$configuration->setDefinition('foobar', $foo = new Definition('FooBarClass'));
$t->is($configuration->getDefinition('foobar'), $foo, '->getDefinition() returns a service definition if defined');
$t->ok($configuration->setDefinition('foobar', $foo = new Definition('FooBarClass')) === $foo, '->setDefinition() implements a fuild interface by returning the service reference');
$configuration->addDefinitions($defs = array('foobar' => new Definition('FooBarClass')));
$t->is($configuration->getDefinitions(), array_merge($definitions, $defs), '->addDefinitions() adds the service definitions');
try
{
$configuration->getDefinition('baz');
$t->fail('->getDefinition() throws an InvalidArgumentException if the service definition does not exist');
}
catch (InvalidArgumentException $e)
{
$t->pass('->getDefinition() throws an InvalidArgumentException if the service definition does not exist');
}
// ->findDefinition()
$t->diag('->findDefinition()');
$configuration = new BuilderConfiguration(array('foo' => $definition = new Definition('FooClass')));
$configuration->setAlias('bar', 'foo');
$configuration->setAlias('foobar', 'bar');
$t->is($configuration->findDefinition('foobar'), $definition, '->findDefinition() returns a Definition');
// ->addResource() ->getResources()
$t->diag('->addResource() ->getResources()');
$configuration = new BuilderConfiguration();
$configuration->addResource($a = new FileResource('foo.xml'));
$configuration->addResource($b = new FileResource('foo.yml'));
$t->is($configuration->getResources(), array($a, $b), '->getResources() returns an array of resources read for the current configuration');

View File

@ -1,309 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\DependencyInjection\Builder;
use Symfony\Components\DependencyInjection\BuilderConfiguration;
use Symfony\Components\DependencyInjection\Definition;
use Symfony\Components\DependencyInjection\Reference;
$fixturesPath = __DIR__.'/../../../../fixtures/Symfony/Components/DependencyInjection/';
$t = new LimeTest(61);
// ->setDefinitions() ->addDefinitions() ->getDefinitions() ->setDefinition() ->getDefinition() ->hasDefinition()
$t->diag('->setDefinitions() ->addDefinitions() ->getDefinitions() ->setDefinition() ->getDefinition() ->hasDefinition()');
$builder = new Builder();
$definitions = array(
'foo' => new Definition('FooClass'),
'bar' => new Definition('BarClass'),
);
$builder->setDefinitions($definitions);
$t->is($builder->getDefinitions(), $definitions, '->setDefinitions() sets the service definitions');
$t->ok($builder->hasDefinition('foo'), '->hasDefinition() returns true if a service definition exists');
$t->ok(!$builder->hasDefinition('foobar'), '->hasDefinition() returns false if a service definition does not exist');
$builder->setDefinition('foobar', $foo = new Definition('FooBarClass'));
$t->is($builder->getDefinition('foobar'), $foo, '->getDefinition() returns a service definition if defined');
$t->ok($builder->setDefinition('foobar', $foo = new Definition('FooBarClass')) === $foo, '->setDefinition() implements a fuild interface by returning the service reference');
$builder->addDefinitions($defs = array('foobar' => new Definition('FooBarClass')));
$t->is($builder->getDefinitions(), array_merge($definitions, $defs), '->addDefinitions() adds the service definitions');
try
{
$builder->getDefinition('baz');
$t->fail('->getDefinition() throws an InvalidArgumentException if the service definition does not exist');
}
catch (InvalidArgumentException $e)
{
$t->pass('->getDefinition() throws an InvalidArgumentException if the service definition does not exist');
}
// ->register()
$t->diag('->register()');
$builder = new Builder();
$builder->register('foo', 'FooClass');
$t->ok($builder->hasDefinition('foo'), '->register() registers a new service definition');
$t->ok($builder->getDefinition('foo') instanceof Definition, '->register() returns the newly created Definition instance');
// ->hasService()
$t->diag('->hasService()');
$builder = new Builder();
$t->ok(!$builder->hasService('foo'), '->hasService() returns false if the service does not exist');
$builder->register('foo', 'FooClass');
$t->ok($builder->hasService('foo'), '->hasService() returns true if a service definition exists');
$builder->bar = new stdClass();
$t->ok($builder->hasService('bar'), '->hasService() returns true if a service exists');
// ->getService()
$t->diag('->getService()');
$builder = new Builder();
try
{
$builder->getService('foo');
$t->fail('->getService() throws an InvalidArgumentException if the service does not exist');
}
catch (InvalidArgumentException $e)
{
$t->pass('->getService() throws an InvalidArgumentException if the service does not exist');
}
$builder->register('foo', 'stdClass');
$t->ok(is_object($builder->getService('foo')), '->getService() returns the service definition associated with the id');
$builder->bar = $bar = new stdClass();
$t->is($builder->getService('bar'), $bar, '->getService() returns the service associated with the id');
$builder->register('bar', 'stdClass');
$t->is($builder->getService('bar'), $bar, '->getService() returns the service associated with the id even if a definition has been defined');
$builder->register('baz', 'stdClass')->setArguments(array(new Reference('baz')));
try
{
@$builder->getService('baz');
$t->fail('->getService() throws a LogicException if the service has a circular reference to itself');
}
catch (\LogicException $e)
{
$t->pass('->getService() throws a LogicException if the service has a circular reference to itself');
}
$builder->register('foobar', 'stdClass')->setShared(true);
$t->ok($builder->getService('bar') === $builder->getService('bar'), '->getService() always returns the same instance if the service is shared');
// ->getServiceIds()
$t->diag('->getServiceIds()');
$builder = new Builder();
$builder->register('foo', 'stdClass');
$builder->bar = $bar = new stdClass();
$builder->register('bar', 'stdClass');
$t->is($builder->getServiceIds(), array('foo', 'bar', 'service_container'), '->getServiceIds() returns all defined service ids');
// ->setAlias() ->getAlias() ->hasAlias()
$t->diag('->setAlias() ->getAlias() ->hasAlias()');
$builder = new Builder();
$builder->register('foo', 'stdClass');
$builder->setAlias('bar', 'foo');
$t->ok($builder->hasAlias('bar'), '->hasAlias() returns true if the alias exists');
$t->ok(!$builder->hasAlias('foobar'), '->hasAlias() returns false if the alias does not exist');
$t->is($builder->getAlias('bar'), 'foo', '->getAlias() returns the aliased service');
$t->ok($builder->hasService('bar'), '->setAlias() defines a new service');
$t->ok($builder->getService('bar') === $builder->getService('foo'), '->setAlias() creates a service that is an alias to another one');
try
{
$builder->getAlias('foobar');
$t->fail('->getAlias() throws an InvalidArgumentException if the alias does not exist');
}
catch (\InvalidArgumentException $e)
{
$t->pass('->getAlias() throws an InvalidArgumentException if the alias does not exist');
}
// ->getAliases()
$t->diag('->getAliases()');
$builder = new Builder();
$builder->setAlias('bar', 'foo');
$builder->setAlias('foobar', 'foo');
$t->is($builder->getAliases(), array('bar' => 'foo', 'foobar' => 'foo'), '->getAliases() returns all service aliases');
$builder->register('bar', 'stdClass');
$t->is($builder->getAliases(), array('foobar' => 'foo'), '->getAliases() does not return aliased services that have been overridden');
$builder->setService('foobar', 'stdClass');
$t->is($builder->getAliases(), array(), '->getAliases() does not return aliased services that have been overridden');
// ->createService() # file
$t->diag('->createService() # file');
$builder = new Builder();
$builder->register('foo1', 'FooClass')->setFile($fixturesPath.'/includes/foo.php');
$t->ok($builder->getService('foo1'), '->createService() requires the file defined by the service definition');
$builder->register('foo2', 'FooClass')->setFile($fixturesPath.'/includes/%file%.php');
$builder->setParameter('file', 'foo');
$t->ok($builder->getService('foo2'), '->createService() replaces parameters in the file provided by the service definition');
// ->createService() # class
$t->diag('->createService() # class');
$builder = new Builder();
$builder->register('foo1', '%class%');
$builder->setParameter('class', 'stdClass');
$t->ok($builder->getService('foo1') instanceof stdClass, '->createService() replaces parameters in the class provided by the service definition');
// ->createService() # arguments
$t->diag('->createService() # arguments');
$builder = new Builder();
$builder->register('bar', 'stdClass');
$builder->register('foo1', 'FooClass')->addArgument(array('foo' => '%value%', '%value%' => 'foo', new Reference('bar')));
$builder->setParameter('value', 'bar');
$t->is($builder->getService('foo1')->arguments, array('foo' => 'bar', 'bar' => 'foo', $builder->getService('bar')), '->createService() replaces parameters and service references in the arguments provided by the service definition');
// ->createService() # constructor
$t->diag('->createService() # constructor');
$builder = new Builder();
$builder->register('bar', 'stdClass');
$builder->register('foo1', 'FooClass')->setConstructor('getInstance')->addArgument(array('foo' => '%value%', '%value%' => 'foo', new Reference('bar')));
$builder->setParameter('value', 'bar');
$t->ok($builder->getService('foo1')->called, '->createService() calls the constructor to create the service instance');
$t->is($builder->getService('foo1')->arguments, array('foo' => 'bar', 'bar' => 'foo', $builder->getService('bar')), '->createService() passes the arguments to the constructor');
// ->createService() # method calls
$t->diag('->createService() # method calls');
$builder = new Builder();
$builder->register('bar', 'stdClass');
$builder->register('foo1', 'FooClass')->addMethodCall('setBar', array(array('%value%', new Reference('bar'))));
$builder->setParameter('value', 'bar');
$t->is($builder->getService('foo1')->bar, array('bar', $builder->getService('bar')), '->createService() replaces the values in the method calls arguments');
// ->createService() # configurator
require_once $fixturesPath.'/includes/classes.php';
$t->diag('->createService() # configurator');
$builder = new Builder();
$builder->register('foo1', 'FooClass')->setConfigurator('sc_configure');
$t->ok($builder->getService('foo1')->configured, '->createService() calls the configurator');
$builder->register('foo2', 'FooClass')->setConfigurator(array('%class%', 'configureStatic'));
$builder->setParameter('class', 'BazClass');
$t->ok($builder->getService('foo2')->configured, '->createService() calls the configurator');
$builder->register('baz', 'BazClass');
$builder->register('foo3', 'FooClass')->setConfigurator(array(new Reference('baz'), 'configure'));
$t->ok($builder->getService('foo3')->configured, '->createService() calls the configurator');
$builder->register('foo4', 'FooClass')->setConfigurator('foo');
try
{
$builder->getService('foo4');
$t->fail('->createService() throws an InvalidArgumentException if the configure callable is not a valid callable');
}
catch (\InvalidArgumentException $e)
{
$t->pass('->createService() throws an InvalidArgumentException if the configure callable is not a valid callable');
}
// ::resolveValue()
$t->diag('::resolveValue()');
$t->is(Builder::resolveValue('foo', array()), 'foo', '->resolveValue() returns its argument unmodified if no placeholders are found');
$t->is(Builder::resolveValue('I\'m a %foo%', array('foo' => 'bar')), 'I\'m a bar', '->resolveValue() replaces placeholders by their values');
$t->ok(Builder::resolveValue('%foo%', array('foo' => true)) === true, '->resolveValue() replaces arguments that are just a placeholder by their value without casting them to strings');
$t->is(Builder::resolveValue(array('%foo%' => '%foo%'), array('foo' => 'bar')), array('bar' => 'bar'), '->resolveValue() replaces placeholders in keys and values of arrays');
$t->is(Builder::resolveValue(array('%foo%' => array('%foo%' => array('%foo%' => '%foo%'))), array('foo' => 'bar')), array('bar' => array('bar' => array('bar' => 'bar'))), '->resolveValue() replaces placeholders in nested arrays');
$t->is(Builder::resolveValue('I\'m a %%foo%%', array('foo' => 'bar')), 'I\'m a %foo%', '->resolveValue() supports % escaping by doubling it');
$t->is(Builder::resolveValue('I\'m a %foo% %%foo %foo%', array('foo' => 'bar')), 'I\'m a bar %foo bar', '->resolveValue() supports % escaping by doubling it');
try
{
Builder::resolveValue('%foobar%', array());
$t->fail('->resolveValue() throws a RuntimeException if a placeholder references a non-existant parameter');
}
catch (RuntimeException $e)
{
$t->pass('->resolveValue() throws a RuntimeException if a placeholder references a non-existant parameter');
}
try
{
Builder::resolveValue('foo %foobar% bar', array());
$t->fail('->resolveValue() throws a RuntimeException if a placeholder references a non-existant parameter');
}
catch (RuntimeException $e)
{
$t->pass('->resolveValue() throws a RuntimeException if a placeholder references a non-existant parameter');
}
// ->resolveServices()
$t->diag('->resolveServices()');
$builder = new Builder();
$builder->register('foo', 'FooClass');
$t->is($builder->resolveServices(new Reference('foo')), $builder->getService('foo'), '->resolveServices() resolves service references to service instances');
$t->is($builder->resolveServices(array('foo' => array('foo', new Reference('foo')))), array('foo' => array('foo', $builder->getService('foo'))), '->resolveServices() resolves service references to service instances in nested arrays');
// ->merge()
$t->diag('->merge()');
$container = new Builder();
$container->merge(null);
$t->is($container->getParameters(), array(), '->merge() accepts null as an argument');
$t->is($container->getDefinitions(), array(), '->merge() accepts null as an argument');
$container = new Builder(array('bar' => 'foo'));
$config = new BuilderConfiguration();
$config->setParameters(array('foo' => 'bar'));
$container->merge($config);
$t->is($container->getParameters(), array('bar' => 'foo', 'foo' => 'bar'), '->merge() merges current parameters with the loaded ones');
$container = new Builder(array('bar' => 'foo', 'foo' => 'baz'));
$config = new BuilderConfiguration();
$config->setParameters(array('foo' => 'bar'));
$container->merge($config);
$t->is($container->getParameters(), array('bar' => 'foo', 'foo' => 'baz'), '->merge() does not change the already defined parameters');
$container = new Builder(array('bar' => 'foo'));
$config = new BuilderConfiguration();
$config->setParameters(array('foo' => '%bar%'));
$container->merge($config);
$t->is($container->getParameters(), array('bar' => 'foo', 'foo' => 'foo'), '->merge() evaluates the values of the parameters towards already defined ones');
$container = new Builder(array('bar' => 'foo'));
$config = new BuilderConfiguration();
$config->setParameters(array('foo' => '%bar%', 'baz' => '%foo%'));
$container->merge($config);
$t->is($container->getParameters(), array('bar' => 'foo', 'foo' => 'foo', 'baz' => 'foo'), '->merge() evaluates the values of the parameters towards already defined ones');
$container = new Builder();
$container->register('foo', 'FooClass');
$container->register('bar', 'BarClass');
$config = new BuilderConfiguration();
$config->setDefinition('baz', new Definition('BazClass'));
$config->setAlias('alias_for_foo', 'foo');
$container->merge($config);
$t->is(array_keys($container->getDefinitions()), array('foo', 'bar', 'baz'), '->merge() merges definitions already defined ones');
$t->is($container->getAliases(), array('alias_for_foo' => 'foo'), '->merge() registers defined aliases');
$container = new Builder();
$container->register('foo', 'FooClass');
$config->setDefinition('foo', new Definition('BazClass'));
$container->merge($config);
$t->is($container->getDefinition('foo')->getClass(), 'BazClass', '->merge() overrides already defined services');
// ->findAnnotatedServiceIds()
$t->diag('->findAnnotatedServiceIds()');
$builder = new Builder();
$builder
->register('foo', 'FooClass')
->addAnnotation('foo', array('foo' => 'foo'))
->addAnnotation('bar', array('bar' => 'bar'))
->addAnnotation('foo', array('foofoo' => 'foofoo'))
;
$t->is($builder->findAnnotatedServiceIds('foo'), array(
'foo' => array(
array('foo' => 'foo'),
array('foofoo' => 'foofoo'),
)
), '->findAnnotatedServiceIds() returns an array of service ids and its annotation attributes');
$t->is($builder->findAnnotatedServiceIds('foobar'), array(), '->findAnnotatedServiceIds() returns an empty array if there is annotated services');

View File

@ -1,207 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\DependencyInjection\Container;
$fixturesPath = __DIR__.'/../../../../fixtures/Symfony/Components/DependencyInjection/';
$t = new LimeTest(42);
// __construct()
$t->diag('__construct()');
$sc = new Container();
$t->is(spl_object_hash($sc->getService('service_container')), spl_object_hash($sc), '__construct() automatically registers itself as a service');
$sc = new Container(array('foo' => 'bar'));
$t->is($sc->getParameters(), array('foo' => 'bar'), '__construct() takes an array of parameters as its first argument');
// ->setParameters() ->getParameters()
$t->diag('->setParameters() ->getParameters()');
$sc = new Container();
$t->is($sc->getParameters(), array(), '->getParameters() returns an empty array if no parameter has been defined');
$sc->setParameters(array('foo' => 'bar'));
$t->is($sc->getParameters(), array('foo' => 'bar'), '->setParameters() sets the parameters');
$sc->setParameters(array('bar' => 'foo'));
$t->is($sc->getParameters(), array('bar' => 'foo'), '->setParameters() overrides the previous defined parameters');
$sc->setParameters(array('Bar' => 'foo'));
$t->is($sc->getParameters(), array('bar' => 'foo'), '->setParameters() converts the key to lowercase');
// ->setParameter() ->getParameter()
$t->diag('->setParameter() ->getParameter() ');
$sc = new Container(array('foo' => 'bar'));
$sc->setParameter('bar', 'foo');
$t->is($sc->getParameter('bar'), 'foo', '->setParameter() sets the value of a new parameter');
$t->is($sc['bar'], 'foo', '->offsetGet() gets the value of a parameter');
$sc['bar1'] = 'foo1';
$t->is($sc['bar1'], 'foo1', '->offsetset() sets the value of a parameter');
unset($sc['bar1']);
$t->ok(!isset($sc['bar1']), '->offsetUnset() removes a parameter');
$sc->setParameter('foo', 'baz');
$t->is($sc->getParameter('foo'), 'baz', '->setParameter() overrides previously set parameter');
$sc->setParameter('Foo', 'baz1');
$t->is($sc->getParameter('foo'), 'baz1', '->setParameter() converts the key to lowercase');
$t->is($sc->getParameter('FOO'), 'baz1', '->getParameter() converts the key to lowercase');
$t->is($sc['FOO'], 'baz1', '->offsetGet() converts the key to lowercase');
try
{
$sc->getParameter('baba');
$t->fail('->getParameter() thrown an \InvalidArgumentException if the key does not exist');
}
catch (\InvalidArgumentException $e)
{
$t->pass('->getParameter() thrown an \InvalidArgumentException if the key does not exist');
}
try
{
$sc['baba'];
$t->fail('->offsetGet() thrown an \InvalidArgumentException if the key does not exist');
}
catch (\InvalidArgumentException $e)
{
$t->pass('->offsetGet() thrown an \InvalidArgumentException if the key does not exist');
}
// ->hasParameter()
$t->diag('->hasParameter()');
$sc = new Container(array('foo' => 'bar'));
$t->ok($sc->hasParameter('foo'), '->hasParameter() returns true if a parameter is defined');
$t->ok($sc->hasParameter('Foo'), '->hasParameter() converts the key to lowercase');
$t->ok(isset($sc['Foo']), '->offsetExists() converts the key to lowercase');
$t->ok(!$sc->hasParameter('bar'), '->hasParameter() returns false if a parameter is not defined');
$t->ok(isset($sc['foo']), '->offsetExists() returns true if a parameter is defined');
$t->ok(!isset($sc['bar']), '->offsetExists() returns false if a parameter is not defined');
// ->addParameters()
$t->diag('->addParameters()');
$sc = new Container(array('foo' => 'bar'));
$sc->addParameters(array('bar' => 'foo'));
$t->is($sc->getParameters(), array('foo' => 'bar', 'bar' => 'foo'), '->addParameters() adds parameters to the existing ones');
$sc->addParameters(array('Bar' => 'fooz'));
$t->is($sc->getParameters(), array('foo' => 'bar', 'bar' => 'fooz'), '->addParameters() converts keys to lowercase');
// ->setService() ->hasService() ->getService()
$t->diag('->setService() ->hasService() ->getService()');
$sc = new Container();
$sc->setService('foo', $obj = new stdClass());
$t->is(spl_object_hash($sc->getService('foo')), spl_object_hash($obj), '->setService() registers a service under a key name');
$sc->foo1 = $obj1 = new stdClass();
$t->is(spl_object_hash($sc->foo1), spl_object_hash($obj1), '->__set() sets a service');
$t->is(spl_object_hash($sc->foo), spl_object_hash($obj), '->__get() gets a service by name');
$t->ok($sc->hasService('foo'), '->hasService() returns true if the service is defined');
$t->ok(isset($sc->foo), '->__isset() returns true if the service is defined');
$t->ok(!$sc->hasService('bar'), '->hasService() returns false if the service is not defined');
$t->ok(!isset($sc->bar), '->__isset() returns false if the service is not defined');
// ->getServiceIds()
$t->diag('->getServiceIds()');
$sc = new Container();
$sc->setService('foo', $obj = new stdClass());
$sc->setService('bar', $obj = new stdClass());
$t->is($sc->getServiceIds(), array('service_container', 'foo', 'bar'), '->getServiceIds() returns all defined service ids');
class ProjectServiceContainer extends Container
{
public $__bar, $__foo_bar, $__foo_baz;
public function __construct()
{
parent::__construct();
$this->__bar = new stdClass();
$this->__foo_bar = new stdClass();
$this->__foo_baz = new stdClass();
}
protected function getBarService()
{
return $this->__bar;
}
protected function getFooBarService()
{
return $this->__foo_bar;
}
protected function getFoo_BazService()
{
return $this->__foo_baz;
}
}
$sc = new ProjectServiceContainer();
$t->is(spl_object_hash($sc->getService('bar')), spl_object_hash($sc->__bar), '->getService() looks for a getXXXService() method');
$t->ok($sc->hasService('bar'), '->hasService() returns true if the service has been defined as a getXXXService() method');
$sc->setService('bar', $bar = new stdClass());
$t->isnt(spl_object_hash($sc->getService('bar')), spl_object_hash($bar), '->getService() prefers to return a service defined with a getXXXService() method than one defined with setService()');
try
{
$sc->getService('baba');
$t->fail('->getService() thrown an \InvalidArgumentException if the service does not exist');
}
catch (\InvalidArgumentException $e)
{
$t->pass('->getService() thrown an \InvalidArgumentException if the service does not exist');
}
try
{
$sc->baba;
$t->fail('->__get() thrown an \InvalidArgumentException if the service does not exist');
}
catch (\InvalidArgumentException $e)
{
$t->pass('->__get() thrown an \InvalidArgumentException if the service does not exist');
}
try
{
unset($sc->baba);
$t->fail('->__unset() thrown an LogicException if you try to remove a service');
}
catch (LogicException $e)
{
$t->pass('->__unset() thrown an LogicException if you try to remove a service');
}
$t->is(spl_object_hash($sc->getService('foo_bar')), spl_object_hash($sc->__foo_bar), '->getService() camelizes the service id when looking for a method');
$t->is(spl_object_hash($sc->getService('foo.baz')), spl_object_hash($sc->__foo_baz), '->getService() camelizes the service id when looking for a method');
// __call()
$t->diag('__call()');
$sc = new Container();
$sc->setService('foo_bar.foo', $foo = new stdClass());
$t->is($sc->getFooBar_FooService(), $foo, '__call() finds services is the method is getXXXService()');
try
{
$sc->getFooBar_Foo();
$t->fail('__call() throws a \RuntimeException exception if the method is not a service method');
}
catch (\RuntimeException $e)
{
$t->pass('__call() throws a \RuntimeException exception if the method is not a service method');
}

View File

@ -1,78 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\DependencyInjection\Builder;
$fixturesPath = realpath(__DIR__.'/../../../../fixtures/Symfony/Components/DependencyInjection/');
require_once $fixturesPath.'/includes/classes.php';
require_once $fixturesPath.'/includes/foo.php';
$t = new LimeTest(30);
// cross-check loaders/dumpers
$t->diag('cross-check loaders/dumpers');
$fixtures = array(
'services1.xml' => 'xml',
'services2.xml' => 'xml',
'services6.xml' => 'xml',
'services8.xml' => 'xml',
'services9.xml' => 'xml',
'services1.yml' => 'yaml',
'services2.yml' => 'yaml',
'services6.yml' => 'yaml',
'services8.yml' => 'yaml',
'services9.yml' => 'yaml',
);
foreach ($fixtures as $fixture => $type)
{
$loaderClass = 'Symfony\\Components\\DependencyInjection\\Loader\\'.ucfirst($type).'FileLoader';
$dumperClass = 'Symfony\\Components\\DependencyInjection\\Dumper\\'.ucfirst($type).'Dumper';
$container1 = new Builder();
$loader1 = new $loaderClass($container1);
$loader1->load($fixturesPath.'/'.$type.'/'.$fixture);
$container1->setParameter('path', $fixturesPath.'/includes');
$dumper = new $dumperClass($container1);
$tmp = tempnam('sf_service_container', 'sf');
file_put_contents($tmp, $dumper->dump());
$container2 = new Builder();
$loader2 = new $loaderClass($container2);
$loader2->load($tmp);
$container2->setParameter('path', $fixturesPath.'/includes');
unlink($tmp);
$t->is(serialize($container1), serialize($container2), 'loading a dump from a previously loaded container returns the same container');
$t->is($container1->getParameters(), $container2->getParameters(), '->getParameters() returns the same value for both containers');
$services1 = array();
foreach ($container1 as $id => $service)
{
$services1[$id] = serialize($service);
}
$services2 = array();
foreach ($container2 as $id => $service)
{
$services2[$id] = serialize($service);
}
unset($services1['service_container'], $services2['service_container']);
$t->is($services1, $services2, 'Iterator on the containers returns the same services');
}

View File

@ -1,84 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\DependencyInjection\Definition;
$t = new LimeTest(25);
// __construct()
$t->diag('__construct()');
$def = new Definition('stdClass');
$t->is($def->getClass(), 'stdClass', '__construct() takes the class name as its first argument');
$def = new Definition('stdClass', array('foo'));
$t->is($def->getArguments(), array('foo'), '__construct() takes an optional array of arguments as its second argument');
// ->setConstructor() ->getConstructor()
$t->diag('->setConstructor() ->getConstructor()');
$def = new Definition('stdClass');
$t->is(spl_object_hash($def->setConstructor('foo')), spl_object_hash($def), '->setConstructor() implements a fluent interface');
$t->is($def->getConstructor(), 'foo', '->getConstructor() returns the constructor name');
// ->setClass() ->getClass()
$t->diag('->setClass() ->getClass()');
$def = new Definition('stdClass');
$t->is(spl_object_hash($def->setClass('foo')), spl_object_hash($def), '->setClass() implements a fluent interface');
$t->is($def->getClass(), 'foo', '->getClass() returns the class name');
// ->setArguments() ->getArguments() ->addArgument()
$t->diag('->setArguments() ->getArguments() ->addArgument()');
$def = new Definition('stdClass');
$t->is(spl_object_hash($def->setArguments(array('foo'))), spl_object_hash($def), '->setArguments() implements a fluent interface');
$t->is($def->getArguments(), array('foo'), '->getArguments() returns the arguments');
$t->is(spl_object_hash($def->addArgument('bar')), spl_object_hash($def), '->addArgument() implements a fluent interface');
$t->is($def->getArguments(), array('foo', 'bar'), '->addArgument() adds an argument');
// ->setMethodCalls() ->getMethodCalls() ->addMethodCall()
$t->diag('->setMethodCalls() ->getMethodCalls() ->addMethodCall()');
$def = new Definition('stdClass');
$t->is(spl_object_hash($def->setMethodCalls(array(array('foo', array('foo'))))), spl_object_hash($def), '->setMethodCalls() implements a fluent interface');
$t->is($def->getMethodCalls(), array(array('foo', array('foo'))), '->getMethodCalls() returns the methods to call');
$t->is(spl_object_hash($def->addMethodCall('bar', array('bar'))), spl_object_hash($def), '->addMethodCall() implements a fluent interface');
$t->is($def->getMethodCalls(), array(array('foo', array('foo')), array('bar', array('bar'))), '->addMethodCall() adds a method to call');
// ->setFile() ->getFile()
$t->diag('->setFile() ->getFile()');
$def = new Definition('stdClass');
$t->is(spl_object_hash($def->setFile('foo')), spl_object_hash($def), '->setFile() implements a fluent interface');
$t->is($def->getFile(), 'foo', '->getFile() returns the file to include');
// ->setShared() ->isShared()
$t->diag('->setShared() ->isShared()');
$def = new Definition('stdClass');
$t->is($def->isShared(), true, '->isShared() returns true by default');
$t->is(spl_object_hash($def->setShared(false)), spl_object_hash($def), '->setShared() implements a fluent interface');
$t->is($def->isShared(), false, '->isShared() returns false if the instance must not be shared');
// ->setConfigurator() ->getConfigurator()
$t->diag('->setConfigurator() ->getConfigurator()');
$def = new Definition('stdClass');
$t->is(spl_object_hash($def->setConfigurator('foo')), spl_object_hash($def), '->setConfigurator() implements a fluent interface');
$t->is($def->getConfigurator(), 'foo', '->getConfigurator() returns the configurator');
// ->getAnnotations() ->getAnnotation() ->addAnnotation()
$t->diag('->getAnnotations() ->getAnnotation() ->addAnnotation()');
$def = new Definition('stdClass');
$t->is(spl_object_hash($def->addAnnotation('foo')), spl_object_hash($def), '->addAnnotation() implements a fluent interface');
$t->is($def->getAnnotation('foo'), array(array()), '->getAnnotation() returns attributes for an annotation name');
$def->addAnnotation('foo', array('foo' => 'bar'));
$t->is($def->getAnnotation('foo'), array(array(), array('foo' => 'bar')), '->addAnnotation() can adds the same annotation several times');
$def->addAnnotation('bar', array('bar' => 'bar'));
$t->is($def->getAnnotations(), array(
'foo' => array(array(), array('foo' => 'bar')),
'bar' => array(array('bar' => 'bar')),
), '->getAnnotations() returns all annotations');

View File

@ -1,32 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../../bootstrap.php';
use Symfony\Components\DependencyInjection\Builder;
use Symfony\Components\DependencyInjection\Dumper\Dumper;
$t = new LimeTest(1);
class ProjectDumper extends Dumper
{
}
$builder = new Builder();
$dumper = new ProjectDumper($builder);
try
{
$dumper->dump();
$t->fail('->dump() returns a LogicException if the dump() method has not been overriden by a children class');
}
catch (LogicException $e)
{
$t->pass('->dump() returns a LogicException if the dump() method has not been overriden by a children class');
}

View File

@ -1,46 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../../bootstrap.php';
use Symfony\Components\DependencyInjection\Builder;
use Symfony\Components\DependencyInjection\Dumper\GraphvizDumper;
$t = new LimeTest(4);
$fixturesPath = __DIR__.'/../../../../../fixtures/Symfony/Components/DependencyInjection/';
// ->dump()
$t->diag('->dump()');
$dumper = new GraphvizDumper($container = new Builder());
$t->is($dumper->dump(), file_get_contents($fixturesPath.'/graphviz/services1.dot'), '->dump() dumps an empty container as an empty dot file');
$container = new Builder();
$dumper = new GraphvizDumper($container);
$container = include $fixturesPath.'/containers/container9.php';
$dumper = new GraphvizDumper($container);
$t->is($dumper->dump(), str_replace('%path%', __DIR__, file_get_contents($fixturesPath.'/graphviz/services9.dot')), '->dump() dumps services');
$container = include $fixturesPath.'/containers/container10.php';
$dumper = new GraphvizDumper($container);
$t->is($dumper->dump(), str_replace('%path%', __DIR__, file_get_contents($fixturesPath.'/graphviz/services10.dot')), '->dump() dumps services');
$container = include $fixturesPath.'/containers/container10.php';
$dumper = new GraphvizDumper($container);
$t->is($dumper->dump(array(
'graph' => array('ratio' => 'normal'),
'node' => array('fontsize' => 13, 'fontname' => 'Verdana', 'shape' => 'square'),
'edge' => array('fontsize' => 12, 'fontname' => 'Verdana', 'color' => 'white', 'arrowhead' => 'closed', 'arrowsize' => 1),
'node.instance' => array('fillcolor' => 'green', 'style' => 'empty'),
'node.definition' => array('fillcolor' => 'grey'),
'node.missing' => array('fillcolor' => 'red', 'style' => 'empty'),
)), str_replace('%path%', __DIR__, file_get_contents($fixturesPath.'/graphviz/services10-1.dot')), '->dump() dumps services');

View File

@ -1,52 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../../bootstrap.php';
use Symfony\Components\DependencyInjection\Builder;
use Symfony\Components\DependencyInjection\Dumper\PhpDumper;
$t = new LimeTest(5);
$fixturesPath = realpath(__DIR__.'/../../../../../fixtures/Symfony/Components/DependencyInjection/');
// ->dump()
$t->diag('->dump()');
$dumper = new PhpDumper($container = new Builder());
$t->is($dumper->dump(), file_get_contents($fixturesPath.'/php/services1.php'), '->dump() dumps an empty container as an empty PHP class');
$t->is($dumper->dump(array('class' => 'Container', 'base_class' => 'AbstractContainer')), file_get_contents($fixturesPath.'/php/services1-1.php'), '->dump() takes a class and a base_class options');
$container = new Builder();
$dumper = new PhpDumper($container);
// ->addParameters()
$t->diag('->addParameters()');
$container = include $fixturesPath.'/containers/container8.php';
$dumper = new PhpDumper($container);
$t->is($dumper->dump(), file_get_contents($fixturesPath.'/php/services8.php'), '->dump() dumps parameters');
// ->addService()
$t->diag('->addService()');
$container = include $fixturesPath.'/containers/container9.php';
$dumper = new PhpDumper($container);
$t->is($dumper->dump(), str_replace('%path%', $fixturesPath.'/includes', file_get_contents($fixturesPath.'/php/services9.php')), '->dump() dumps services');
$dumper = new PhpDumper($container = new Builder());
$container->register('foo', 'FooClass')->addArgument(new stdClass());
try
{
$dumper->dump();
$t->fail('->dump() throws a RuntimeException if the container to be dumped has reference to objects or resources');
}
catch (RuntimeException $e)
{
$t->pass('->dump() throws a RuntimeException if the container to be dumped has reference to objects or resources');
}

View File

@ -1,51 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../../bootstrap.php';
use Symfony\Components\DependencyInjection\Builder;
use Symfony\Components\DependencyInjection\Dumper\XmlDumper;
$t = new LimeTest(4);
$fixturesPath = realpath(__DIR__.'/../../../../../fixtures/Symfony/Components/DependencyInjection/');
// ->dump()
$t->diag('->dump()');
$dumper = new XmlDumper($container = new Builder());
$t->is($dumper->dump(), file_get_contents($fixturesPath.'/xml/services1.xml'), '->dump() dumps an empty container as an empty XML file');
$container = new Builder();
$dumper = new XmlDumper($container);
// ->addParameters()
$t->diag('->addParameters()');
$container = include $fixturesPath.'//containers/container8.php';
$dumper = new XmlDumper($container);
$t->is($dumper->dump(), file_get_contents($fixturesPath.'/xml/services8.xml'), '->dump() dumps parameters');
// ->addService()
$t->diag('->addService()');
$container = include $fixturesPath.'/containers/container9.php';
$dumper = new XmlDumper($container);
$t->is($dumper->dump(), str_replace('%path%', $fixturesPath.'/includes', file_get_contents($fixturesPath.'/xml/services9.xml')), '->dump() dumps services');
$dumper = new XmlDumper($container = new Builder());
$container->register('foo', 'FooClass')->addArgument(new stdClass());
try
{
$dumper->dump();
$t->fail('->dump() throws a RuntimeException if the container to be dumped has reference to objects or resources');
}
catch (RuntimeException $e)
{
$t->pass('->dump() throws a RuntimeException if the container to be dumped has reference to objects or resources');
}

View File

@ -1,51 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../../bootstrap.php';
use Symfony\Components\DependencyInjection\Builder;
use Symfony\Components\DependencyInjection\Dumper\YamlDumper;
$t = new LimeTest(4);
$fixturesPath = realpath(__DIR__.'/../../../../../fixtures/Symfony/Components/DependencyInjection/');
// ->dump()
$t->diag('->dump()');
$dumper = new YamlDumper($container = new Builder());
$t->is($dumper->dump(), file_get_contents($fixturesPath.'/yaml/services1.yml'), '->dump() dumps an empty container as an empty YAML file');
$container = new Builder();
$dumper = new YamlDumper($container);
// ->addParameters()
$t->diag('->addParameters()');
$container = include $fixturesPath.'/containers/container8.php';
$dumper = new YamlDumper($container);
$t->is($dumper->dump(), file_get_contents($fixturesPath.'/yaml/services8.yml'), '->dump() dumps parameters');
// ->addService()
$t->diag('->addService()');
$container = include $fixturesPath.'/containers/container9.php';
$dumper = new YamlDumper($container);
$t->is($dumper->dump(), str_replace('%path%', $fixturesPath.'/includes', file_get_contents($fixturesPath.'/yaml/services9.yml')), '->dump() dumps services');
$dumper = new YamlDumper($container = new Builder());
$container->register('foo', 'FooClass')->addArgument(new stdClass());
try
{
$dumper->dump();
$t->fail('->dump() throws a RuntimeException if the container to be dumped has reference to objects or resources');
}
catch (RuntimeException $e)
{
$t->pass('->dump() throws a RuntimeException if the container to be dumped has reference to objects or resources');
}

View File

@ -1,31 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\DependencyInjection\FileResource;
$t = new LimeTest(4);
// ->getResource()
$t->diag('->getResource()');
$file = sys_get_temp_dir().'/tmp.xml';
touch($file);
$resource = new FileResource($file);
$t->is($resource->getResource(), $file, '->getResource() returns the path to the resource');
// ->isUptodate()
$t->diag('->isUptodate()');
$t->ok($resource->isUptodate(time() + 10), '->isUptodate() returns true if the resource has not changed');
$t->ok(!$resource->isUptodate(time() - 86400), '->isUptodate() returns false if the resource has been updated');
unlink($file);
$resource = new FileResource('/____foo/foobar'.rand(1, 999999));
$t->ok(!$resource->isUptodate(time()), '->isUptodate() returns false if the resource does not exist');

View File

@ -1,52 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../../bootstrap.php';
use Symfony\Components\DependencyInjection\Builder;
use Symfony\Components\DependencyInjection\Loader\FileLoader;
$t = new LimeTest(9);
class ProjectLoader extends FileLoader
{
public $paths;
public function load($resource)
{
}
public function getAbsolutePath($file, $currentPath = null)
{
return parent::getAbsolutePath($file, $currentPath);
}
}
// __construct()
$t->diag('__construct()');
$loader = new ProjectLoader(__DIR__);
$t->is($loader->paths, array(__DIR__), '__construct() takes a path as its second argument');
$loader = new ProjectLoader(array(__DIR__, __DIR__));
$t->is($loader->paths, array(__DIR__, __DIR__), '__construct() takes an array of paths as its second argument');
// ->getAbsolutePath()
$t->diag('->getAbsolutePath()');
$loader = new ProjectLoader(array(__DIR__.'/../../../../../bin'));
$t->is($loader->getAbsolutePath('/foo.xml'), '/foo.xml', '->getAbsolutePath() return the path unmodified if it is already an absolute path');
$t->is($loader->getAbsolutePath('c:\\\\foo.xml'), 'c:\\\\foo.xml', '->getAbsolutePath() return the path unmodified if it is already an absolute path');
$t->is($loader->getAbsolutePath('c:/foo.xml'), 'c:/foo.xml', '->getAbsolutePath() return the path unmodified if it is already an absolute path');
$t->is($loader->getAbsolutePath('\\server\\foo.xml'), '\\server\\foo.xml', '->getAbsolutePath() return the path unmodified if it is already an absolute path');
$t->is($loader->getAbsolutePath('FileLoaderTest.php', __DIR__), __DIR__.'/FileLoaderTest.php', '->getAbsolutePath() returns an absolute filename if the file exists in the current path');
$t->is($loader->getAbsolutePath('prove.php', __DIR__), __DIR__.'/../../../../../bin/prove.php', '->getAbsolutePath() returns an absolute filename if the file exists in one of the paths given in the constructor');
$t->is($loader->getAbsolutePath('foo.xml', __DIR__), 'foo.xml', '->getAbsolutePath() returns the path unmodified if it is unable to find it in the given paths');

View File

@ -1,42 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../../bootstrap.php';
use Symfony\Components\DependencyInjection\Builder;
use Symfony\Components\DependencyInjection\Loader\IniFileLoader;
$t = new LimeTest(3);
$fixturesPath = realpath(__DIR__.'/../../../../../fixtures/Symfony/Components/DependencyInjection/');
$loader = new IniFileLoader($fixturesPath.'/ini');
$config = $loader->load('parameters.ini');
$t->is($config->getParameters(), array('foo' => 'bar', 'bar' => '%foo%'), '->load() takes a single file name as its first argument');
try
{
$loader->load('foo.ini');
$t->fail('->load() throws an InvalidArgumentException if the loaded file does not exist');
}
catch (InvalidArgumentException $e)
{
$t->pass('->load() throws an InvalidArgumentException if the loaded file does not exist');
}
try
{
@$loader->load('nonvalid.ini');
$t->fail('->load() throws an InvalidArgumentException if the loaded file is not parseable');
}
catch (InvalidArgumentException $e)
{
$t->pass('->load() throws an InvalidArgumentException if the loaded file is not parseable');
}

View File

@ -1,32 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../../bootstrap.php';
require_once __DIR__.'/../../../../../fixtures/Symfony/Components/DependencyInjection/includes/ProjectExtension.php';
$t = new LimeTest(2);
// ->load()
$t->diag('->load()');
$extension = new ProjectExtension();
try
{
$extension->load('foo', array());
$t->fail('->load() throws an InvalidArgumentException if the tag does not exist');
}
catch (InvalidArgumentException $e)
{
$t->pass('->load() throws an InvalidArgumentException if the tag does not exist');
}
$config = $extension->load('bar', array('foo' => 'bar'));
$t->is($config->getParameters(), array('project.parameter.bar' => 'bar'), '->load() calls the method tied to the given tag');

View File

@ -1,182 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../../bootstrap.php';
use Symfony\Components\DependencyInjection\Builder;
use Symfony\Components\DependencyInjection\Reference;
use Symfony\Components\DependencyInjection\Definition;
use Symfony\Components\DependencyInjection\Loader\Loader;
use Symfony\Components\DependencyInjection\Loader\XmlFileLoader;
$t = new LimeTest(40);
$fixturesPath = realpath(__DIR__.'/../../../../../fixtures/Symfony/Components/DependencyInjection/');
require_once $fixturesPath.'/includes/ProjectExtension.php';
class ProjectLoader extends XmlFileLoader
{
public function parseFile($file)
{
return parent::parseFile($file);
}
}
// ->load()
$t->diag('->load()');
$loader = new ProjectLoader($fixturesPath.'/ini');
try
{
$loader->load('foo.xml');
$t->fail('->load() throws an InvalidArgumentException if the loaded file does not exist');
}
catch (InvalidArgumentException $e)
{
$t->pass('->load() throws an InvalidArgumentException if the loaded file does not exist');
}
// ->parseFile()
$t->diag('->parseFile()');
try
{
$loader->parseFile($fixturesPath.'/ini/parameters.ini');
$t->fail('->parseFile() throws an InvalidArgumentException if the loaded file is not a valid XML file');
}
catch (InvalidArgumentException $e)
{
$t->pass('->parseFile() throws an InvalidArgumentException if the loaded file is not a valid XML file');
}
$loader = new ProjectLoader($fixturesPath.'/xml');
try
{
$loader->parseFile($fixturesPath.'/xml/nonvalid.xml');
$t->fail('->parseFile() throws an InvalidArgumentException if the loaded file does not validate the XSD');
}
catch (InvalidArgumentException $e)
{
$t->pass('->parseFile() throws an InvalidArgumentException if the loaded file does not validate the XSD');
}
$xml = $loader->parseFile($fixturesPath.'/xml/services1.xml');
$t->is(get_class($xml), 'Symfony\\Components\\DependencyInjection\\SimpleXMLElement', '->parseFile() returns an SimpleXMLElement object');
// ->load() # parameters
$t->diag('->load() # parameters');
$loader = new ProjectLoader($fixturesPath.'/xml');
$config = $loader->load('services2.xml');
$t->is($config->getParameters(), array('a string', 'foo' => 'bar', 'values' => array(0, 'integer' => 4, 100 => null, 'true', true, false, 'on', 'off', 'float' => 1.3, 1000.3, 'a string', array('foo', 'bar')), 'foo_bar' => new Reference('foo_bar')), '->load() converts XML values to PHP ones');
// ->load() # imports
$t->diag('->load() # imports');
$config = $loader->load('services4.xml');
$t->is($config->getParameters(), array('a string', 'foo' => 'bar', 'bar' => '%foo%', 'values' => array(true, false), 'foo_bar' => new Reference('foo_bar'), 'imported_from_yaml' => true, 'imported_from_ini' => true), '->load() imports and merges imported files');
// ->load() # anonymous services
$t->diag('->load() # anonymous services');
$config = $loader->load('services5.xml');
$services = $config->getDefinitions();
$t->is(count($services), 3, '->load() attributes unique ids to anonymous services');
$args = $services['foo']->getArguments();
$t->is(count($args), 1, '->load() references anonymous services as "normal" ones');
$t->is(get_class($args[0]), 'Symfony\\Components\\DependencyInjection\\Reference', '->load() converts anonymous services to references to "normal" services');
$t->ok(isset($services[(string) $args[0]]), '->load() makes a reference to the created ones');
$inner = $services[(string) $args[0]];
$t->is($inner->getClass(), 'BarClass', '->load() uses the same configuration as for the anonymous ones');
$args = $inner->getArguments();
$t->is(count($args), 1, '->load() references anonymous services as "normal" ones');
$t->is(get_class($args[0]), 'Symfony\\Components\\DependencyInjection\\Reference', '->load() converts anonymous services to references to "normal" services');
$t->ok(isset($services[(string) $args[0]]), '->load() makes a reference to the created ones');
$inner = $services[(string) $args[0]];
$t->is($inner->getClass(), 'BazClass', '->load() uses the same configuration as for the anonymous ones');
// ->load() # services
$t->diag('->load() # services');
$config = $loader->load('services6.xml');
$services = $config->getDefinitions();
$t->ok(isset($services['foo']), '->load() parses <service> elements');
$t->is(get_class($services['foo']), 'Symfony\\Components\\DependencyInjection\\Definition', '->load() converts <service> element to Definition instances');
$t->is($services['foo']->getClass(), 'FooClass', '->load() parses the class attribute');
$t->ok($services['shared']->isShared(), '->load() parses the shared attribute');
$t->ok(!$services['non_shared']->isShared(), '->load() parses the shared attribute');
$t->is($services['constructor']->getConstructor(), 'getInstance', '->load() parses the constructor attribute');
$t->is($services['file']->getFile(), '%path%/foo.php', '->load() parses the file tag');
$t->is($services['arguments']->getArguments(), array('foo', new Reference('foo'), array(true, false)), '->load() parses the argument tags');
$t->is($services['configurator1']->getConfigurator(), 'sc_configure', '->load() parses the configurator tag');
$t->is($services['configurator2']->getConfigurator(), array(new Reference('baz'), 'configure'), '->load() parses the configurator tag');
$t->is($services['configurator3']->getConfigurator(), array('BazClass', 'configureStatic'), '->load() parses the configurator tag');
$t->is($services['method_call1']->getMethodCalls(), array(array('setBar', array())), '->load() parses the method_call tag');
$t->is($services['method_call2']->getMethodCalls(), array(array('setBar', array('foo', new Reference('foo'), array(true, false)))), '->load() parses the method_call tag');
$aliases = $config->getAliases();
$t->ok(isset($aliases['alias_for_foo']), '->load() parses <service> elements');
$t->is($aliases['alias_for_foo'], 'foo', '->load() parses aliases');
// ::convertDomElementToArray()
$t->diag('::convertDomElementToArray()');
$doc = new DOMDocument("1.0");
$doc->loadXML('<foo>bar</foo>');
$t->is(ProjectLoader::convertDomElementToArray($doc->documentElement), 'bar', '::convertDomElementToArray() converts a \DomElement to an array');
$doc = new DOMDocument("1.0");
$doc->loadXML('<foo foo="bar" />');
$t->is(ProjectLoader::convertDomElementToArray($doc->documentElement), array('foo' => 'bar'), '::convertDomElementToArray() converts a \DomElement to an array');
$doc = new DOMDocument("1.0");
$doc->loadXML('<foo><foo>bar</foo></foo>');
$t->is(ProjectLoader::convertDomElementToArray($doc->documentElement), array('foo' => 'bar'), '::convertDomElementToArray() converts a \DomElement to an array');
$doc = new DOMDocument("1.0");
$doc->loadXML('<foo><foo>bar<foo>bar</foo></foo></foo>');
$t->is(ProjectLoader::convertDomElementToArray($doc->documentElement), array('foo' => array('value' => 'bar', 'foo' => 'bar')), '::convertDomElementToArray() converts a \DomElement to an array');
$doc = new DOMDocument("1.0");
$doc->loadXML('<foo><foo></foo></foo>');
$t->is(ProjectLoader::convertDomElementToArray($doc->documentElement), array('foo' => null), '::convertDomElementToArray() converts a \DomElement to an array');
$doc = new DOMDocument("1.0");
$doc->loadXML('<foo><foo><!-- foo --></foo></foo>');
$t->is(ProjectLoader::convertDomElementToArray($doc->documentElement), array('foo' => null), '::convertDomElementToArray() converts a \DomElement to an array');
// extensions
$t->diag('extensions');
Loader::registerExtension(new ProjectExtension());
$loader = new ProjectLoader($fixturesPath.'/xml');
$config = $loader->load('services10.xml');
$services = $config->getDefinitions();
$parameters = $config->getParameters();
$t->ok(isset($services['project.service.bar']), '->load() parses extension elements');
$t->ok(isset($parameters['project.parameter.bar']), '->load() parses extension elements');
try
{
$config = $loader->load('services11.xml');
$t->fail('->load() throws an InvalidArgumentException if the tag is not valid');
}
catch (InvalidArgumentException $e)
{
$t->pass('->load() throws an InvalidArgumentException if the tag is not valid');
}
try
{
$config = $loader->load('services12.xml');
$t->fail('->load() throws an InvalidArgumentException if an extension is not loaded');
}
catch (InvalidArgumentException $e)
{
$t->pass('->load() throws an InvalidArgumentException if an extension is not loaded');
}

View File

@ -1,134 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../../bootstrap.php';
use Symfony\Components\DependencyInjection\Builder;
use Symfony\Components\DependencyInjection\Reference;
use Symfony\Components\DependencyInjection\Definition;
use Symfony\Components\DependencyInjection\Loader\Loader;
use Symfony\Components\DependencyInjection\Loader\YamlFileLoader;
$t = new LimeTest(25);
$fixturesPath = realpath(__DIR__.'/../../../../../fixtures/Symfony/Components/DependencyInjection/');
require_once $fixturesPath.'/includes/ProjectExtension.php';
class ProjectLoader extends YamlFileLoader
{
public function loadFile($file)
{
return parent::loadFile($file);
}
}
// ->loadFile()
$t->diag('->loadFile()');
$loader = new ProjectLoader($fixturesPath.'/ini');
try
{
$loader->loadFile('foo.yml');
$t->fail('->load() throws an InvalidArgumentException if the loaded file does not exist');
}
catch (InvalidArgumentException $e)
{
$t->pass('->load() throws an InvalidArgumentException if the loaded file does not exist');
}
try
{
$loader->loadFile('parameters.ini');
$t->fail('->load() throws an InvalidArgumentException if the loaded file is not a valid YAML file');
}
catch (InvalidArgumentException $e)
{
$t->pass('->load() throws an InvalidArgumentException if the loaded file is not a valid YAML file');
}
$loader = new ProjectLoader($fixturesPath.'/yaml');
foreach (array('nonvalid1', 'nonvalid2') as $fixture)
{
try
{
$loader->loadFile($fixture.'.yml');
$t->fail('->load() throws an InvalidArgumentException if the loaded file does not validate');
}
catch (InvalidArgumentException $e)
{
$t->pass('->load() throws an InvalidArgumentException if the loaded file does not validate');
}
}
// ->load() # parameters
$t->diag('->load() # parameters');
$loader = new ProjectLoader($fixturesPath.'/yaml');
$config = $loader->load('services2.yml');
$t->is($config->getParameters(), array('foo' => 'bar', 'values' => array(true, false, 0, 1000.3), 'bar' => 'foo', 'foo_bar' => new Reference('foo_bar')), '->load() converts YAML keys to lowercase');
// ->load() # imports
$t->diag('->load() # imports');
$config = $loader->load('services4.yml');
$t->is($config->getParameters(), array('foo' => 'bar', 'bar' => '%foo%', 'values' => array(true, false), 'foo_bar' => new Reference('foo_bar'), 'imported_from_xml' => true, 'imported_from_ini' => true), '->load() imports and merges imported files');
// ->load() # services
$t->diag('->load() # services');
$config = $loader->load('services6.yml');
$services = $config->getDefinitions();
$t->ok(isset($services['foo']), '->load() parses service elements');
$t->is(get_class($services['foo']), 'Symfony\\Components\\DependencyInjection\\Definition', '->load() converts service element to Definition instances');
$t->is($services['foo']->getClass(), 'FooClass', '->load() parses the class attribute');
$t->ok($services['shared']->isShared(), '->load() parses the shared attribute');
$t->ok(!$services['non_shared']->isShared(), '->load() parses the shared attribute');
$t->is($services['constructor']->getConstructor(), 'getInstance', '->load() parses the constructor attribute');
$t->is($services['file']->getFile(), '%path%/foo.php', '->load() parses the file tag');
$t->is($services['arguments']->getArguments(), array('foo', new Reference('foo'), array(true, false)), '->load() parses the argument tags');
$t->is($services['configurator1']->getConfigurator(), 'sc_configure', '->load() parses the configurator tag');
$t->is($services['configurator2']->getConfigurator(), array(new Reference('baz'), 'configure'), '->load() parses the configurator tag');
$t->is($services['configurator3']->getConfigurator(), array('BazClass', 'configureStatic'), '->load() parses the configurator tag');
$t->is($services['method_call1']->getMethodCalls(), array(array('setBar', array())), '->load() parses the method_call tag');
$t->is($services['method_call2']->getMethodCalls(), array(array('setBar', array('foo', new Reference('foo'), array(true, false)))), '->load() parses the method_call tag');
$aliases = $config->getAliases();
$t->ok(isset($aliases['alias_for_foo']), '->load() parses aliases');
$t->is($aliases['alias_for_foo'], 'foo', '->load() parses aliases');
// extensions
$t->diag('extensions');
Loader::registerExtension(new ProjectExtension());
$loader = new ProjectLoader($fixturesPath.'/yaml');
$config = $loader->load('services10.yml');
$services = $config->getDefinitions();
$parameters = $config->getParameters();
$t->ok(isset($services['project.service.bar']), '->load() parses extension elements');
$t->ok(isset($parameters['project.parameter.bar']), '->load() parses extension elements');
try
{
$config = $loader->load('services11.yml');
$t->fail('->load() throws an InvalidArgumentException if the tag is not valid');
}
catch (InvalidArgumentException $e)
{
$t->pass('->load() throws an InvalidArgumentException if the tag is not valid');
}
try
{
$config = $loader->load('services12.yml');
$t->fail('->load() throws an InvalidArgumentException if an extension is not loaded');
}
catch (InvalidArgumentException $e)
{
$t->pass('->load() throws an InvalidArgumentException if an extension is not loaded');
}

View File

@ -1,21 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\DependencyInjection\Parameter;
$t = new LimeTest(1);
// __construct() ->__toString()
$t->diag('__construct() ->__toString()');
$ref = new Parameter('foo');
$t->is((string) $ref, 'foo', '__construct() sets the id of the parameter, which is used for the __toString() method');

View File

@ -1,21 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\DependencyInjection\Reference;
$t = new LimeTest(1);
// __construct() ->__toString()
$t->diag('__construct() ->__toString()');
$ref = new Reference('foo');
$t->is((string) $ref, 'foo', '__construct() sets the id of the reference, which is used for the __toString() method');

View File

@ -1,134 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\EventDispatcher\Event;
use Symfony\Components\EventDispatcher\EventDispatcher;
$t = new LimeTest(19);
$dispatcher = new EventDispatcher();
// ->connect() ->disconnect()
$t->diag('->connect() ->disconnect()');
$dispatcher->connect('bar', 'listenToBar');
$t->is($dispatcher->getListeners('bar'), array('listenToBar'), '->connect() connects a listener to an event name');
$dispatcher->connect('bar', 'listenToBarBar');
$t->is($dispatcher->getListeners('bar'), array('listenToBar', 'listenToBarBar'), '->connect() can connect several listeners for the same event name');
$dispatcher->connect('barbar', 'listenToBarBar');
$dispatcher->disconnect('bar', 'listenToBarBar');
$t->is($dispatcher->getListeners('bar'), array('listenToBar'), '->disconnect() disconnects a listener for an event name');
$t->is($dispatcher->getListeners('barbar'), array('listenToBarBar'), '->disconnect() disconnects a listener for an event name');
$t->ok($dispatcher->disconnect('foobar', 'listen') === false, '->disconnect() returns false if the listener does not exist');
// ->getListeners() ->hasListeners()
$t->diag('->getListeners() ->hasListeners()');
$t->is($dispatcher->hasListeners('foo'), false, '->hasListeners() returns false if the event has no listener');
$dispatcher->connect('foo', 'listenToFoo');
$t->is($dispatcher->hasListeners('foo'), true, '->hasListeners() returns true if the event has some listeners');
$dispatcher->disconnect('foo', 'listenToFoo');
$t->is($dispatcher->hasListeners('foo'), false, '->hasListeners() returns false if the event has no listener');
$t->is($dispatcher->getListeners('bar'), array('listenToBar'), '->getListeners() returns an array of listeners connected to the given event name');
$t->is($dispatcher->getListeners('foobar'), array(), '->getListeners() returns an empty array if no listener are connected to the given event name');
$listener = new Listener();
// ->notify()
$t->diag('->notify()');
$listener->reset();
$dispatcher = new EventDispatcher();
$dispatcher->connect('foo', array($listener, 'listenToFoo'));
$dispatcher->connect('foo', array($listener, 'listenToFooBis'));
$e = $dispatcher->notify($event = new Event(new stdClass(), 'foo'));
$t->is($listener->getValue(), 'listenToFoolistenToFooBis', '->notify() notifies all registered listeners in order');
$t->is($e, $event, '->notify() returns the event object');
$listener->reset();
$dispatcher = new EventDispatcher();
$dispatcher->connect('foo', array($listener, 'listenToFooBis'));
$dispatcher->connect('foo', array($listener, 'listenToFoo'));
$dispatcher->notify(new Event(new stdClass(), 'foo'));
$t->is($listener->getValue(), 'listenToFooBislistenToFoo', '->notify() notifies all registered listeners in order');
// ->notifyUntil()
$t->diag('->notifyUntil()');
$listener->reset();
$dispatcher = new EventDispatcher();
$dispatcher->connect('foo', array($listener, 'listenToFoo'));
$dispatcher->connect('foo', array($listener, 'listenToFooBis'));
$e = $dispatcher->notifyUntil($event = new Event(new stdClass(), 'foo'));
$t->is($listener->getValue(), 'listenToFoolistenToFooBis', '->notifyUntil() notifies all registered listeners in order and stops if it returns true');
$t->is($e, $event, '->notifyUntil() returns the event object');
$listener->reset();
$dispatcher = new EventDispatcher();
$dispatcher->connect('foo', array($listener, 'listenToFooBis'));
$dispatcher->connect('foo', array($listener, 'listenToFoo'));
$e = $dispatcher->notifyUntil($event = new Event(new stdClass(), 'foo'));
$t->is($listener->getValue(), 'listenToFooBis', '->notifyUntil() notifies all registered listeners in order and stops if it returns true');
// ->filter()
$t->diag('->filter()');
$listener->reset();
$dispatcher = new EventDispatcher();
$dispatcher->connect('foo', array($listener, 'filterFoo'));
$dispatcher->connect('foo', array($listener, 'filterFooBis'));
$e = $dispatcher->filter($event = new Event(new stdClass(), 'foo'), 'foo');
$t->is($e->getReturnValue(), '-*foo*-', '->filter() filters a value');
$t->is($e, $event, '->filter() returns the event object');
$listener->reset();
$dispatcher = new EventDispatcher();
$dispatcher->connect('foo', array($listener, 'filterFooBis'));
$dispatcher->connect('foo', array($listener, 'filterFoo'));
$e = $dispatcher->filter($event = new Event(new stdClass(), 'foo'), 'foo');
$t->is($e->getReturnValue(), '*-foo-*', '->filter() filters a value');
class Listener
{
protected
$value = '';
function filterFoo(Event $event, $foo)
{
return "*$foo*";
}
function filterFooBis(Event $event, $foo)
{
return "-$foo-";
}
function listenToFoo(Event $event)
{
$this->value .= 'listenToFoo';
}
function listenToFooBis(Event $event)
{
$this->value .= 'listenToFooBis';
return true;
}
function getValue()
{
return $this->value;
}
function reset()
{
$this->value = '';
}
}

View File

@ -1,80 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\EventDispatcher\Event;
$t = new LimeTest(16);
$subject = new stdClass();
$parameters = array('foo' => 'bar');
$event = new Event($subject, 'name', $parameters);
// ->getSubject()
$t->diag('->getSubject()');
$t->is($event->getSubject(), $subject, '->getSubject() returns the event subject');
// ->getName()
$t->diag('->getName()');
$t->is($event->getName(), 'name', '->getName() returns the event name');
// ->getParameters() ->setParameter() ->hasParameter() ->getParameter()
$t->diag('->getParameters()');
$t->is($event->getParameters(), $parameters, '->getParameters() returns the event parameters');
$t->is($event->getParameter('foo'), 'bar', '->getParameter() returns the value of a parameter');
$event->setParameter('foo', 'foo');
$t->is($event->getParameter('foo'), 'foo', '->setParameter() changes the value of a parameter');
$t->ok($event->hasParameter('foo'), '->hasParameter() returns true if the parameter is defined');
unset($event['foo']);
$t->ok(!$event->hasParameter('foo'), '->hasParameter() returns false if the parameter is not defined');
try
{
$event->getParameter('foobar');
$t->fail('->getParameter() throws an \InvalidArgumentException exception when the parameter does not exist');
}
catch (\InvalidArgumentException $e)
{
$t->pass('->getParameter() throws an \InvalidArgumentException exception when the parameter does not exist');
}
$event = new Event($subject, 'name', $parameters);
// ->getReturnValue() ->setReturnValue()
$t->diag('->getReturnValue() ->setReturnValue()');
$event->setReturnValue('foo');
$t->is($event->getReturnValue(), 'foo', '->getReturnValue() returns the return value of the event');
// ->setProcessed() ->isProcessed()
$t->diag('->setProcessed() ->isProcessed()');
$event->setProcessed(true);
$t->is($event->isProcessed(), true, '->isProcessed() returns true if the event has been processed');
$event->setProcessed(false);
$t->is($event->isProcessed(), false, '->setProcessed() changes the processed status');
// ArrayAccess interface
$t->diag('ArrayAccess interface');
$t->is($event['foo'], 'bar', 'Event implements the ArrayAccess interface');
$event['foo'] = 'foo';
$t->is($event['foo'], 'foo', 'Event implements the ArrayAccess interface');
try
{
$event['foobar'];
$t->fail('::offsetGet() throws an \InvalidArgumentException exception when the parameter does not exist');
}
catch (\InvalidArgumentException $e)
{
$t->pass('::offsetGet() throws an \InvalidArgumentException exception when the parameter does not exist');
}
$t->ok(isset($event['foo']), 'Event implements the ArrayAccess interface');
unset($event['foo']);
$t->ok(!isset($event['foo']), 'Event implements the ArrayAccess interface');

View File

@ -1,78 +0,0 @@
<?php
/*
* This file is part of the symfony package.
*
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\OutputEscaper\Escaper;
$t = new LimeTest(11);
$a = array('<strong>escaped!</strong>', 1, null, array(2, '<strong>escaped!</strong>'));
$escaped = Escaper::escape('entities', $a);
// ->getRaw()
$t->diag('->getRaw()');
$t->is($escaped->getRaw(0), '<strong>escaped!</strong>', '->getRaw() returns the raw value');
// ArrayAccess interface
$t->diag('ArrayAccess interface');
$t->is($escaped[0], '&lt;strong&gt;escaped!&lt;/strong&gt;', 'The escaped object behaves like an array');
$t->is($escaped[2], null, 'The escaped object behaves like an array');
$t->is($escaped[3][1], '&lt;strong&gt;escaped!&lt;/strong&gt;', 'The escaped object behaves like an array');
$t->ok(isset($escaped[1]), 'The escaped object behaves like an array (isset)');
$t->diag('ArrayAccess interface is read only');
try
{
unset($escaped[0]);
$t->fail('The escaped object is read only (unset)');
}
catch (\LogicException $e)
{
$t->pass('The escaped object is read only (unset)');
}
try
{
$escaped[0] = 12;
$t->fail('The escaped object is read only (set)');
}
catch (\LogicException $e)
{
$t->pass('The escaped object is read only (set)');
}
// Iterator interface
$t->diag('Iterator interface');
foreach ($escaped as $key => $value)
{
switch ($key)
{
case 0:
$t->is($value, '&lt;strong&gt;escaped!&lt;/strong&gt;', 'The escaped object behaves like an array');
break;
case 1:
$t->is($value, 1, 'The escaped object behaves like an array');
break;
case 2:
$t->is($value, null, 'The escaped object behaves like an array');
break;
case 3:
break;
default:
$t->fail('The escaped object behaves like an array');
}
}
// Coutable interface
$t->diag('Countable interface');
$t->is(count($escaped), 4, 'The escaped object implements the Countable interface');

View File

@ -1,154 +0,0 @@
<?php
/*
* This file is part of the symfony package.
*
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\OutputEscaper\Escaper;
use Symfony\Components\OutputEscaper\SafeDecorator;
use Symfony\Components\OutputEscaper\IteratorDecorator;
use Symfony\Components\OutputEscaper\ArrayDecorator;
use Symfony\Components\OutputEscaper\ObjectDecorator;
$t = new LimeTest(39);
class OutputEscaperTestClass
{
public $title = '<strong>escaped!</strong>';
public function getTitle()
{
return $this->title;
}
public function getTitleTitle()
{
$o = new self;
return $o->getTitle();
}
}
class OutputEscaperTestClassChild extends OutputEscaperTestClass
{
}
// ::escape()
$t->diag('::escape()');
$t->diag('::escape() does not escape special values');
$t->ok(Escaper::escape('entities', null) === null, '::escape() returns null if the value to escape is null');
$t->ok(Escaper::escape('entities', false) === false, '::escape() returns false if the value to escape is false');
$t->ok(Escaper::escape('entities', true) === true, '::escape() returns true if the value to escape is true');
$t->diag('::escape() does not escape a value when escaping method is RAW');
$t->is(Escaper::escape('raw', '<strong>escaped!</strong>'), '<strong>escaped!</strong>', '::escape() takes an escaping strategy function name as its first argument');
$t->diag('::escape() escapes strings');
$t->is(Escaper::escape('entities', '<strong>escaped!</strong>'), '&lt;strong&gt;escaped!&lt;/strong&gt;', '::escape() returns an escaped string if the value to escape is a string');
$t->is(Escaper::escape('entities', '<strong>échappé</strong>'), '&lt;strong&gt;&eacute;chapp&eacute;&lt;/strong&gt;', '::escape() returns an escaped string if the value to escape is a string');
$t->diag('::escape() escapes arrays');
$input = array(
'foo' => '<strong>escaped!</strong>',
'bar' => array('foo' => '<strong>escaped!</strong>'),
);
$output = Escaper::escape('entities', $input);
$t->ok($output instanceof ArrayDecorator, '::escape() returns a ArrayDecorator object if the value to escape is an array');
$t->is($output['foo'], '&lt;strong&gt;escaped!&lt;/strong&gt;', '::escape() escapes all elements of the original array');
$t->is($output['bar']['foo'], '&lt;strong&gt;escaped!&lt;/strong&gt;', '::escape() is recursive');
$t->is($output->getRawValue(), $input, '->getRawValue() returns the unescaped value');
$t->diag('::escape() escapes objects');
$input = new OutputEscaperTestClass();
$output = Escaper::escape('entities', $input);
$t->ok($output instanceof ObjectDecorator, '::escape() returns a ObjectDecorator object if the value to escape is an object');
$t->is($output->getTitle(), '&lt;strong&gt;escaped!&lt;/strong&gt;', '::escape() escapes all methods of the original object');
$t->is($output->title, '&lt;strong&gt;escaped!&lt;/strong&gt;', '::escape() escapes all properties of the original object');
$t->is($output->getTitleTitle(), '&lt;strong&gt;escaped!&lt;/strong&gt;', '::escape() is recursive');
$t->is($output->getRawValue(), $input, '->getRawValue() returns the unescaped value');
$t->is(Escaper::escape('entities', $output)->getTitle(), '&lt;strong&gt;escaped!&lt;/strong&gt;', '::escape() does not double escape an object');
$t->ok(Escaper::escape('entities', new \DirectoryIterator('.')) instanceof IteratorDecorator, '::escape() returns a IteratorDecorator object if the value to escape is an object that implements the ArrayAccess interface');
$t->diag('::escape() does not escape object marked as being safe');
$t->ok(Escaper::escape('entities', new SafeDecorator(new OutputEscaperTestClass())) instanceof OutputEscaperTestClass, '::escape() returns the original value if it is marked as being safe');
Escaper::markClassAsSafe('OutputEscaperTestClass');
$t->ok(Escaper::escape('entities', new OutputEscaperTestClass()) instanceof OutputEscaperTestClass, '::escape() returns the original value if the object class is marked as being safe');
$t->ok(Escaper::escape('entities', new OutputEscaperTestClassChild()) instanceof OutputEscaperTestClassChild, '::escape() returns the original value if one of the object parent class is marked as being safe');
$t->diag('::escape() cannot escape resources');
$fh = fopen(__FILE__, 'r');
try
{
Escaper::escape('entities', $fh);
$t->fail('::escape() throws an InvalidArgumentException if the value cannot be escaped');
}
catch (InvalidArgumentException $e)
{
$t->pass('::escape() throws an InvalidArgumentException if the value cannot be escaped');
}
// ::unescape()
$t->diag('::unescape()');
$t->diag('::unescape() does not unescape special values');
$t->ok(Escaper::unescape(null) === null, '::unescape() returns null if the value to unescape is null');
$t->ok(Escaper::unescape(false) === false, '::unescape() returns false if the value to unescape is false');
$t->ok(Escaper::unescape(true) === true, '::unescape() returns true if the value to unescape is true');
$t->diag('::unescape() unescapes strings');
$t->is(Escaper::unescape('&lt;strong&gt;escaped!&lt;/strong&gt;'), '<strong>escaped!</strong>', '::unescape() returns an unescaped string if the value to unescape is a string');
$t->is(Escaper::unescape('&lt;strong&gt;&eacute;chapp&eacute;&lt;/strong&gt;'), '<strong>échappé</strong>', '::unescape() returns an unescaped string if the value to unescape is a string');
$t->diag('::unescape() unescapes arrays');
$input = Escaper::escape('entities', array(
'foo' => '<strong>escaped!</strong>',
'bar' => array('foo' => '<strong>escaped!</strong>'),
));
$output = Escaper::unescape($input);
$t->ok(is_array($output), '::unescape() returns an array if the input is a ArrayDecorator object');
$t->is($output['foo'], '<strong>escaped!</strong>', '::unescape() unescapes all elements of the original array');
$t->is($output['bar']['foo'], '<strong>escaped!</strong>', '::unescape() is recursive');
$t->diag('::unescape() unescapes objects');
$object = new OutputEscaperTestClass();
$input = Escaper::escape('entities', $object);
$output = Escaper::unescape($input);
$t->ok($output instanceof OutputEscaperTestClass, '::unescape() returns the original object when a ObjectDecorator object is passed');
$t->is($output->getTitle(), '<strong>escaped!</strong>', '::unescape() unescapes all methods of the original object');
$t->is($output->title, '<strong>escaped!</strong>', '::unescape() unescapes all properties of the original object');
$t->is($output->getTitleTitle(), '<strong>escaped!</strong>', '::unescape() is recursive');
$t->ok(IteratorDecorator::unescape(Escaper::escape('entities', new DirectoryIterator('.'))) instanceof DirectoryIterator, '::unescape() unescapes IteratorDecorator objects');
$t->diag('::unescape() does not unescape object marked as being safe');
$t->ok(Escaper::unescape(Escaper::escape('entities', new SafeDecorator(new OutputEscaperTestClass()))) instanceof OutputEscaperTestClass, '::unescape() returns the original value if it is marked as being safe');
Escaper::markClassAsSafe('OutputEscaperTestClass');
$t->ok(Escaper::unescape(Escaper::escape('entities', new OutputEscaperTestClass())) instanceof OutputEscaperTestClass, '::unescape() returns the original value if the object class is marked as being safe');
$t->ok(Escaper::unescape(Escaper::escape('entities', new OutputEscaperTestClassChild())) instanceof OutputEscaperTestClassChild, '::unescape() returns the original value if one of the object parent class is marked as being safe');
$t->diag('::unescape() do nothing to resources');
$fh = fopen(__FILE__, 'r');
$t->is(Escaper::unescape($fh), $fh, '::unescape() do nothing to resources');
$t->diag('::unescape() unescapes mixed arrays');
$object = new OutputEscaperTestClass();
$input = array(
'foo' => 'bar',
'bar' => Escaper::escape('entities', '<strong>bar</strong>'),
'foobar' => Escaper::escape('entities', $object),
);
$output = array(
'foo' => 'bar',
'bar' => '<strong>bar</strong>',
'foobar' => $object,
);
$t->is(Escaper::unescape($input), $output, '::unescape() unescapes values with some escaped and unescaped values');

View File

@ -1,47 +0,0 @@
<?php
/*
* This file is part of the symfony package.
*
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\OutputEscaper\Escaper;
$t = new LimeTest(3);
class OutputEscaperTest
{
public function __toString()
{
return $this->getTitle();
}
public function getTitle()
{
return '<strong>escaped!</strong>';
}
public function getTitles()
{
return array(1, 2, '<strong>escaped!</strong>');
}
}
$object = new OutputEscaperTest();
$escaped = Escaper::escape('entities', $object);
$t->is($escaped->getTitle(), '&lt;strong&gt;escaped!&lt;/strong&gt;', 'The escaped object behaves like the real object');
$array = $escaped->getTitles();
$t->is($array[2], '&lt;strong&gt;escaped!&lt;/strong&gt;', 'The escaped object behaves like the real object');
// __toString()
$t->diag('__toString()');
$t->is($escaped->__toString(), '&lt;strong&gt;escaped!&lt;/strong&gt;', 'The escaped object behaves like the real object');

View File

@ -1,93 +0,0 @@
<?php
/*
* This file is part of the symfony package.
*
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\OutputEscaper\SafeDecorator;
$t = new LimeTest(13);
// ->getValue()
$t->diag('->getValue()');
$safe = new SafeDecorator('foo');
$t->is($safe->getValue(), 'foo', '->getValue() returns the embedded value');
// ->__set() ->__get()
$t->diag('->__set() ->__get()');
class TestClass1
{
public $foo = 'bar';
}
$safe = new SafeDecorator(new TestClass1());
$t->is($safe->foo, 'bar', '->__get() returns the object parameter');
$safe->foo = 'baz';
$t->is($safe->foo, 'baz', '->__set() sets the object parameter');
// ->__call()
$t->diag('->__call()');
class TestClass2
{
public function doSomething()
{
return 'ok';
}
}
$safe = new SafeDecorator(new TestClass2());
$t->is($safe->doSomething(), 'ok', '->__call() invokes the embedded method');
// ->__isset() ->__unset()
$t->diag('->__isset() ->__unset()');
class TestClass3
{
public
$boolValue = true,
$nullValue = null;
}
$safe = new SafeDecorator(new TestClass3());
$t->is(isset($safe->boolValue), true, '->__isset() returns true if the property is not null');
$t->is(isset($safe->nullValue), false, '->__isset() returns false if the property is null');
$t->is(isset($safe->undefinedValue), false, '->__isset() returns false if the property does not exist');
unset($safe->boolValue);
$t->is(isset($safe->boolValue), false, '->__unset() unsets the embedded property');
// Iterator
$t->diag('Iterator');
$input = array('one' => 1, 'two' => 2, 'three' => 3, 'children' => array(1, 2, 3));
$output = array();
$safe = new SafeDecorator($input);
foreach ($safe as $key => $value)
{
$output[$key] = $value;
}
$t->same($output, $input, '"Iterator" implementation imitates an array');
// ArrayAccess
$t->diag('ArrayAccess');
$safe = new SafeDecorator(array('foo' => 'bar'));
$t->is($safe['foo'], 'bar', '"ArrayAccess" implementation returns a value from the embedded array');
$safe['foo'] = 'baz';
$t->is($safe['foo'], 'baz', '"ArrayAccess" implementation sets a value on the embedded array');
$t->is(isset($safe['foo']), true, '"ArrayAccess" checks if a value is set on the embedded array');
unset($safe['foo']);
$t->is(isset($safe['foo']), false, '"ArrayAccess" unsets a value on the embedded array');

View File

@ -1,153 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\Yaml\Yaml;
use Symfony\Components\Yaml\Parser;
use Symfony\Components\Yaml\Dumper;
Yaml::setSpecVersion('1.1');
$t = new LimeTest(151);
$parser = new Parser();
$dumper = new Dumper();
$path = __DIR__.'/../../../../fixtures/Symfony/Components/Yaml';
$files = $parser->parse(file_get_contents($path.'/index.yml'));
foreach ($files as $file)
{
$t->diag($file);
$yamls = file_get_contents($path.'/'.$file.'.yml');
// split YAMLs documents
foreach (preg_split('/^---( %YAML\:1\.0)?/m', $yamls) as $yaml)
{
if (!$yaml)
{
continue;
}
$test = $parser->parse($yaml);
if (isset($test['dump_skip']) && $test['dump_skip'])
{
continue;
}
else if (isset($test['todo']) && $test['todo'])
{
$t->todo($test['test']);
}
else
{
$expected = eval('return '.trim($test['php']).';');
$t->is($parser->parse($dumper->dump($expected, 10)), $expected, $test['test']);
}
}
}
// inline level
$array = array(
'' => 'bar',
'foo' => '#bar',
'foo\'bar' => array(),
'bar' => array(1, 'foo'),
'foobar' => array(
'foo' => 'bar',
'bar' => array(1, 'foo'),
'foobar' => array(
'foo' => 'bar',
'bar' => array(1, 'foo'),
),
),
);
$expected = <<<EOF
{ '': bar, foo: '#bar', 'foo''bar': { }, bar: [1, foo], foobar: { foo: bar, bar: [1, foo], foobar: { foo: bar, bar: [1, foo] } } }
EOF;
$t->is($dumper->dump($array, -10), $expected, '->dump() takes an inline level argument');
$t->is($dumper->dump($array, 0), $expected, '->dump() takes an inline level argument');
$expected = <<<EOF
'': bar
foo: '#bar'
'foo''bar': { }
bar: [1, foo]
foobar: { foo: bar, bar: [1, foo], foobar: { foo: bar, bar: [1, foo] } }
EOF;
$t->is($dumper->dump($array, 1), $expected, '->dump() takes an inline level argument');
$expected = <<<EOF
'': bar
foo: '#bar'
'foo''bar': { }
bar:
- 1
- foo
foobar:
foo: bar
bar: [1, foo]
foobar: { foo: bar, bar: [1, foo] }
EOF;
$t->is($dumper->dump($array, 2), $expected, '->dump() takes an inline level argument');
$expected = <<<EOF
'': bar
foo: '#bar'
'foo''bar': { }
bar:
- 1
- foo
foobar:
foo: bar
bar:
- 1
- foo
foobar:
foo: bar
bar: [1, foo]
EOF;
$t->is($dumper->dump($array, 3), $expected, '->dump() takes an inline level argument');
$expected = <<<EOF
'': bar
foo: '#bar'
'foo''bar': { }
bar:
- 1
- foo
foobar:
foo: bar
bar:
- 1
- foo
foobar:
foo: bar
bar:
- 1
- foo
EOF;
$t->is($dumper->dump($array, 4), $expected, '->dump() takes an inline level argument');
$t->is($dumper->dump($array, 10), $expected, '->dump() takes an inline level argument');
// objects
$t->diag('Objects support');
class A
{
public $a = 'foo';
}
$a = array('foo' => new A(), 'bar' => 1);
$t->is($dumper->dump($a), '{ foo: !!php/object:O:1:"A":1:{s:1:"a";s:3:"foo";}, bar: 1 }', '->dump() is able to dump objects');

View File

@ -1,148 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\Yaml\Yaml;
use Symfony\Components\Yaml\Inline;
Yaml::setSpecVersion('1.1');
$t = new LimeTest(124);
// ::load()
$t->diag('::load()');
$testsForLoad = array(
'' => '',
'null' => null,
'false' => false,
'true' => true,
'12' => 12,
'"quoted string"' => 'quoted string',
"'quoted string'" => 'quoted string',
'12.30e+02' => 12.30e+02,
'0x4D2' => 0x4D2,
'02333' => 02333,
'.Inf' => -log(0),
'-.Inf' => log(0),
'123456789123456789' => '123456789123456789',
'"foo\r\nbar"' => "foo\r\nbar",
"'foo#bar'" => 'foo#bar',
"'foo # bar'" => 'foo # bar',
"'#cfcfcf'" => '#cfcfcf',
'2007-10-30' => mktime(0, 0, 0, 10, 30, 2007),
'2007-10-30T02:59:43Z' => gmmktime(2, 59, 43, 10, 30, 2007),
'2007-10-30 02:59:43 Z' => gmmktime(2, 59, 43, 10, 30, 2007),
'"a \\"string\\" with \'quoted strings inside\'"' => 'a "string" with \'quoted strings inside\'',
"'a \"string\" with ''quoted strings inside'''" => 'a "string" with \'quoted strings inside\'',
// sequences
// urls are no key value mapping. see #3609. Valid yaml "key: value" mappings require a space after the colon
'[foo, http://urls.are/no/mappings, false, null, 12]' => array('foo', 'http://urls.are/no/mappings', false, null, 12),
'[ foo , bar , false , null , 12 ]' => array('foo', 'bar', false, null, 12),
'[\'foo,bar\', \'foo bar\']' => array('foo,bar', 'foo bar'),
// mappings
'{foo:bar,bar:foo,false:false,null:null,integer:12}' => array('foo' => 'bar', 'bar' => 'foo', 'false' => false, 'null' => null, 'integer' => 12),
'{ foo : bar, bar : foo, false : false, null : null, integer : 12 }' => array('foo' => 'bar', 'bar' => 'foo', 'false' => false, 'null' => null, 'integer' => 12),
'{foo: \'bar\', bar: \'foo: bar\'}' => array('foo' => 'bar', 'bar' => 'foo: bar'),
'{\'foo\': \'bar\', "bar": \'foo: bar\'}' => array('foo' => 'bar', 'bar' => 'foo: bar'),
'{\'foo\'\'\': \'bar\', "bar\"": \'foo: bar\'}' => array('foo\'' => 'bar', "bar\"" => 'foo: bar'),
'{\'foo: \': \'bar\', "bar: ": \'foo: bar\'}' => array('foo: ' => 'bar', "bar: " => 'foo: bar'),
// nested sequences and mappings
'[foo, [bar, foo]]' => array('foo', array('bar', 'foo')),
'[foo, {bar: foo}]' => array('foo', array('bar' => 'foo')),
'{ foo: {bar: foo} }' => array('foo' => array('bar' => 'foo')),
'{ foo: [bar, foo] }' => array('foo' => array('bar', 'foo')),
'[ foo, [ bar, foo ] ]' => array('foo', array('bar', 'foo')),
'[{ foo: {bar: foo} }]' => array(array('foo' => array('bar' => 'foo'))),
'[foo, [bar, [foo, [bar, foo]], foo]]' => array('foo', array('bar', array('foo', array('bar', 'foo')), 'foo')),
'[foo, {bar: foo, foo: [foo, {bar: foo}]}, [foo, {bar: foo}]]' => array('foo', array('bar' => 'foo', 'foo' => array('foo', array('bar' => 'foo'))), array('foo', array('bar' => 'foo'))),
'[foo, bar: { foo: bar }]' => array('foo', '1' => array('bar' => array('foo' => 'bar'))),
);
foreach ($testsForLoad as $yaml => $value)
{
$t->is(Inline::load($yaml), $value, sprintf('::load() converts an inline YAML to a PHP structure (%s)', $yaml));
}
$testsForDump = array(
'null' => null,
'false' => false,
'true' => true,
'12' => 12,
"'quoted string'" => 'quoted string',
'12.30e+02' => 12.30e+02,
'1234' => 0x4D2,
'1243' => 02333,
'.Inf' => -log(0),
'-.Inf' => log(0),
'"foo\r\nbar"' => "foo\r\nbar",
"'foo#bar'" => 'foo#bar',
"'foo # bar'" => 'foo # bar',
"'#cfcfcf'" => '#cfcfcf',
"'a \"string\" with ''quoted strings inside'''" => 'a "string" with \'quoted strings inside\'',
// sequences
'[foo, bar, false, null, 12]' => array('foo', 'bar', false, null, 12),
'[\'foo,bar\', \'foo bar\']' => array('foo,bar', 'foo bar'),
// mappings
'{ foo: bar, bar: foo, \'false\': false, \'null\': null, integer: 12 }' => array('foo' => 'bar', 'bar' => 'foo', 'false' => false, 'null' => null, 'integer' => 12),
'{ foo: bar, bar: \'foo: bar\' }' => array('foo' => 'bar', 'bar' => 'foo: bar'),
// nested sequences and mappings
'[foo, [bar, foo]]' => array('foo', array('bar', 'foo')),
'[foo, [bar, [foo, [bar, foo]], foo]]' => array('foo', array('bar', array('foo', array('bar', 'foo')), 'foo')),
'{ foo: { bar: foo } }' => array('foo' => array('bar' => 'foo')),
'[foo, { bar: foo }]' => array('foo', array('bar' => 'foo')),
'[foo, { bar: foo, foo: [foo, { bar: foo }] }, [foo, { bar: foo }]]' => array('foo', array('bar' => 'foo', 'foo' => array('foo', array('bar' => 'foo'))), array('foo', array('bar' => 'foo'))),
);
// ::dump()
$t->diag('::dump()');
foreach ($testsForDump as $yaml => $value)
{
$t->is(Inline::dump($value), $yaml, sprintf('::dump() converts a PHP structure to an inline YAML (%s)', $yaml));
}
foreach ($testsForLoad as $yaml => $value)
{
if ($value == 1230)
{
continue;
}
$t->is(Inline::load(Inline::dump($value)), $value, 'check consistency');
}
foreach ($testsForDump as $yaml => $value)
{
if ($value == 1230)
{
continue;
}
$t->is(Inline::load(Inline::dump($value)), $value, 'check consistency');
}

View File

@ -1,85 +0,0 @@
<?php
/*
* This file is part of the symfony package.
* (c) Fabien Potencier <fabien.potencier@symfony-project.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
require_once __DIR__.'/../../../bootstrap.php';
use Symfony\Components\Yaml\Yaml;
use Symfony\Components\Yaml\Parser;
use Symfony\Components\Yaml\ParserException;
Yaml::setSpecVersion('1.1');
$t = new LimeTest(151);
$parser = new Parser();
$path = __DIR__.'/../../../../fixtures/Symfony/Components/Yaml';
$files = $parser->parse(file_get_contents($path.'/index.yml'));
foreach ($files as $file)
{
$t->diag($file);
$yamls = file_get_contents($path.'/'.$file.'.yml');
// split YAMLs documents
foreach (preg_split('/^---( %YAML\:1\.0)?/m', $yamls) as $yaml)
{
if (!$yaml)
{
continue;
}
$test = $parser->parse($yaml);
if (isset($test['todo']) && $test['todo'])
{
$t->todo($test['test']);
}
else
{
$expected = var_export(eval('return '.trim($test['php']).';'), true);
$t->is(var_export($parser->parse($test['yaml']), true), $expected, $test['test']);
}
}
}
// test tabs in YAML
$yamls = array(
"foo:\n bar",
"foo:\n bar",
"foo:\n bar",
"foo:\n bar",
);
foreach ($yamls as $yaml)
{
try
{
$content = $parser->parse($yaml);
$t->fail('YAML files must not contain tabs');
}
catch (ParserException $e)
{
$t->pass('YAML files must not contain tabs');
}
}
// objects
$t->diag('Objects support');
class A
{
public $a = 'foo';
}
$a = array('foo' => new A(), 'bar' => 1);
$t->is($parser->parse(<<<EOF
foo: !!php/object:O:1:"A":1:{s:1:"a";s:3:"foo";}
bar: 1
EOF
), $a, '->parse() is able to dump objects');