2010-03-18 14:26:21 +00:00
< ? php
/*
2010-04-25 16:06:54 +01:00
* This file is part of the Symfony package .
2010-03-18 14:26:21 +00:00
*
* ( c ) Fabien Potencier < fabien . potencier @ symfony - project . com >
2010-04-07 02:07:59 +01:00
*
2010-03-18 14:26:21 +00:00
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
2010-08-20 22:09:55 +01:00
namespace Symfony\Tests\Component\Templating ;
2010-03-18 14:26:21 +00:00
2010-06-28 08:31:54 +01:00
require_once __DIR__ . '/Fixtures/SimpleHelper.php' ;
2010-03-18 14:26:21 +00:00
2010-08-20 22:09:55 +01:00
use Symfony\Component\Templating\Engine ;
use Symfony\Component\Templating\Loader\Loader ;
use Symfony\Component\Templating\Renderer\Renderer ;
use Symfony\Component\Templating\Renderer\PhpRenderer ;
use Symfony\Component\Templating\Storage\Storage ;
use Symfony\Component\Templating\Storage\StringStorage ;
use Symfony\Component\Templating\Helper\SlotsHelper ;
2010-03-18 14:26:21 +00:00
class EngineTest extends \PHPUnit_Framework_TestCase
{
2010-05-06 12:25:53 +01:00
static protected $loader , $renderer ;
static public function setUpBeforeClass ()
2010-03-18 14:26:21 +00:00
{
2010-05-06 12:25:53 +01:00
self :: $loader = new ProjectTemplateLoader ();
self :: $renderer = new ProjectTemplateRenderer ();
2010-03-18 14:26:21 +00:00
}
2010-05-06 12:25:53 +01:00
public function testConstructor ()
{
$engine = new ProjectTemplateEngine ( self :: $loader );
$this -> assertEquals ( self :: $loader , $engine -> getLoader (), '__construct() takes a loader instance as its second first argument' );
$this -> assertEquals ( array ( 'php' ), array_keys ( $engine -> getRenderers ()), '__construct() automatically registers a PHP renderer if none is given' );
2010-03-18 14:26:21 +00:00
2010-05-06 12:25:53 +01:00
$engine = new ProjectTemplateEngine ( self :: $loader , array ( 'foo' => self :: $renderer ));
$this -> assertEquals ( array ( 'foo' , 'php' ), array_keys ( $engine -> getRenderers ()), '__construct() takes an array of renderers as its third argument' );
$this -> assertTrue ( self :: $renderer -> getEngine () === $engine , '__construct() registers itself on all renderers' );
2010-03-18 14:26:21 +00:00
2010-05-06 12:25:53 +01:00
$engine = new ProjectTemplateEngine ( self :: $loader , array ( 'php' => self :: $renderer ));
$this -> assertTrue ( $engine -> getRenderers () === array ( 'php' => self :: $renderer ), '__construct() can overridde the default PHP renderer' );
2010-03-18 14:26:21 +00:00
}
2010-05-06 12:25:53 +01:00
2010-08-19 14:52:47 +01:00
public function testOffsetGet ()
2010-03-18 14:26:21 +00:00
{
2010-05-06 12:25:53 +01:00
$engine = new ProjectTemplateEngine ( self :: $loader );
$engine -> set ( $helper = new \SimpleHelper ( 'bar' ), 'foo' );
2010-08-19 14:52:47 +01:00
$this -> assertEquals ( $helper , $engine [ 'foo' ], '->offsetGet() returns the value of a helper' );
2010-05-06 12:25:53 +01:00
2010-05-07 15:09:11 +01:00
try {
2010-08-19 14:52:47 +01:00
$engine [ 'bar' ];
$this -> fail ( '->offsetGet() throws an InvalidArgumentException if the helper is not defined' );
2010-05-07 15:09:11 +01:00
} catch ( \Exception $e ) {
2010-08-19 14:52:47 +01:00
$this -> assertInstanceOf ( '\InvalidArgumentException' , $e , '->offsetGet() throws an InvalidArgumentException if the helper is not defined' );
$this -> assertEquals ( 'The helper "bar" is not defined.' , $e -> getMessage (), '->offsetGet() throws an InvalidArgumentException if the helper is not defined' );
2010-05-06 12:25:53 +01:00
}
2010-03-18 14:26:21 +00:00
}
2010-05-06 12:25:53 +01:00
public function testGetSetHas ()
2010-03-18 14:26:21 +00:00
{
2010-05-06 12:25:53 +01:00
$engine = new ProjectTemplateEngine ( self :: $loader );
$foo = new \SimpleHelper ( 'foo' );
$engine -> set ( $foo );
$this -> assertEquals ( $foo , $engine -> get ( 'foo' ), '->set() sets a helper' );
$engine -> set ( $foo , 'bar' );
$this -> assertEquals ( $foo , $engine -> get ( 'bar' ), '->set() takes an alias as a second argument' );
2010-05-07 15:09:11 +01:00
try {
2010-05-06 12:25:53 +01:00
$engine -> get ( 'foobar' );
$this -> fail ( '->get() throws an InvalidArgumentException if the helper is not defined' );
2010-05-07 15:09:11 +01:00
} catch ( \Exception $e ) {
2010-05-06 12:25:53 +01:00
$this -> assertInstanceOf ( '\InvalidArgumentException' , $e , '->get() throws an InvalidArgumentException if the helper is not defined' );
$this -> assertEquals ( 'The helper "foobar" is not defined.' , $e -> getMessage (), '->get() throws an InvalidArgumentException if the helper is not defined' );
}
$this -> assertTrue ( $engine -> has ( 'foo' ), '->has() returns true if the helper exists' );
$this -> assertFalse ( $engine -> has ( 'foobar' ), '->has() returns false if the helper does not exist' );
2010-03-18 14:26:21 +00:00
}
2010-05-06 12:25:53 +01:00
public function testExtendRender ()
2010-03-18 14:26:21 +00:00
{
2010-05-06 12:25:53 +01:00
$engine = new ProjectTemplateEngine ( self :: $loader , array (), array ( new SlotsHelper ()));
2010-05-07 15:09:11 +01:00
try {
2010-05-06 12:25:53 +01:00
$engine -> render ( 'name' );
$this -> fail ( '->render() throws an InvalidArgumentException if the template does not exist' );
2010-05-07 15:09:11 +01:00
} catch ( \Exception $e ) {
2010-05-06 12:25:53 +01:00
$this -> assertInstanceOf ( '\InvalidArgumentException' , $e , '->render() throws an InvalidArgumentException if the template does not exist' );
$this -> assertEquals ( 'The template "name" does not exist (renderer: php).' , $e -> getMessage (), '->render() throws an InvalidArgumentException if the template does not exist' );
}
2010-05-07 15:09:11 +01:00
try {
2010-05-06 12:25:53 +01:00
self :: $loader -> setTemplate ( 'name.foo' , 'foo' );
$engine -> render ( 'foo:name' );
$this -> fail ( '->render() throws an InvalidArgumentException if no renderer is registered for the given renderer' );
2010-05-07 15:09:11 +01:00
} catch ( \Exception $e ) {
2010-05-06 12:25:53 +01:00
$this -> assertInstanceOf ( '\InvalidArgumentException' , $e , '->render() throws an InvalidArgumentException if no renderer is registered for the given renderer' );
2010-07-21 22:04:53 +01:00
$this -> assertEquals ( 'The template "foo:name" does not exist (renderer: name).' , $e -> getMessage (), '->render() throws an InvalidArgumentException if no renderer is registered for the given renderer' );
2010-05-06 12:25:53 +01:00
}
$engine = new ProjectTemplateEngine ( self :: $loader , array (), array ( new SlotsHelper ()));
$engine -> set ( new \SimpleHelper ( 'bar' ));
2010-08-19 14:52:47 +01:00
self :: $loader -> setTemplate ( 'foo.php' , '<?php $view->extend("layout"); echo $view[\'foo\'].$foo ?>' );
self :: $loader -> setTemplate ( 'layout.php' , '-<?php echo $view[\'slots\']->get("_content") ?>-' );
2010-05-06 12:25:53 +01:00
$this -> assertEquals ( '-barfoo-' , $engine -> render ( 'foo' , array ( 'foo' => 'foo' )), '->render() uses the decorator to decorate the template' );
$engine = new ProjectTemplateEngine ( self :: $loader , array (), array ( new SlotsHelper ()));
$engine -> set ( new \SimpleHelper ( 'bar' ));
self :: $loader -> setTemplate ( 'bar.php' , 'bar' );
self :: $loader -> setTemplate ( 'foo.php' , '<?php $view->extend("layout"); echo $foo ?>' );
2010-08-19 14:52:47 +01:00
self :: $loader -> setTemplate ( 'layout.php' , '<?php echo $view->render("bar") ?>-<?php echo $view[\'slots\']->get("_content") ?>-' );
2010-05-06 12:25:53 +01:00
$this -> assertEquals ( 'bar-foo-' , $engine -> render ( 'foo' , array ( 'foo' => 'foo' , 'bar' => 'bar' )), '->render() supports render() calls in templates' );
2010-03-18 14:26:21 +00:00
}
2010-05-06 12:25:53 +01:00
public function testEscape ()
2010-03-18 14:26:21 +00:00
{
2010-05-06 12:25:53 +01:00
$engine = new ProjectTemplateEngine ( self :: $loader );
$this -> assertEquals ( '<br />' , $engine -> escape ( '<br />' ), '->escape() escapes strings' );
$foo = new \stdClass ();
$this -> assertEquals ( $foo , $engine -> escape ( $foo ), '->escape() does nothing on non strings' );
2010-03-18 14:26:21 +00:00
}
2010-05-06 12:25:53 +01:00
public function testGetSetCharset ()
2010-03-18 14:26:21 +00:00
{
2010-05-06 12:25:53 +01:00
$engine = new ProjectTemplateEngine ( self :: $loader );
$this -> assertEquals ( 'UTF-8' , $engine -> getCharset (), '->getCharset() returns UTF-8 by default' );
$engine -> setCharset ( 'ISO-8859-1' );
$this -> assertEquals ( 'ISO-8859-1' , $engine -> getCharset (), '->setCharset() changes the default charset to use' );
2010-03-18 14:26:21 +00:00
}
2010-12-20 12:05:28 +00:00
public function testGlobalVariables ()
{
$engine = new ProjectTemplateEngine ( self :: $loader );
$engine -> addGlobal ( 'global_variable' , 'lorem ipsum' );
$this -> assertEquals ( array (
'global_variable' => 'lorem ipsum' ,
), $engine -> getGlobals ());
}
public function testGlobalsGetPassedToTemplate ()
{
$engine = new ProjectTemplateEngine ( self :: $loader );
$engine -> addGlobal ( 'global' , 'global variable' );
self :: $loader -> setTemplate ( 'global.php' , '<?php echo $global; ?>' );
$this -> assertEquals ( $engine -> render ( 'global:php' ), 'global variable' );
$this -> assertEquals ( $engine -> render ( 'global:php' , array ( 'global' => 'overwritten' )), 'overwritten' );
}
2010-03-18 14:26:21 +00:00
}
class ProjectTemplateEngine extends Engine
{
2010-05-06 12:25:53 +01:00
public function getLoader ()
{
return $this -> loader ;
}
public function getRenderers ()
{
return $this -> renderers ;
}
2010-03-18 14:26:21 +00:00
}
class ProjectTemplateRenderer extends PhpRenderer
{
2010-05-06 12:25:53 +01:00
public function getEngine ()
{
return $this -> engine ;
}
2010-03-18 14:26:21 +00:00
}
class ProjectTemplateLoader extends Loader
{
2010-05-06 12:25:53 +01:00
public $templates = array ();
2010-03-18 14:26:21 +00:00
2010-05-06 12:25:53 +01:00
public function setTemplate ( $name , $template )
2010-03-18 14:26:21 +00:00
{
2010-05-06 12:25:53 +01:00
$this -> templates [ $name ] = $template ;
2010-03-18 14:26:21 +00:00
}
2010-05-06 12:25:53 +01:00
public function load ( $template , array $options = array ())
{
2010-05-07 15:09:11 +01:00
if ( isset ( $this -> templates [ $template . '.' . $options [ 'renderer' ]])) {
2010-05-06 12:25:53 +01:00
return new StringStorage ( $this -> templates [ $template . '.' . $options [ 'renderer' ]]);
}
return false ;
}
2010-05-20 19:57:25 +01:00
public function isFresh ( $template , array $options = array (), $time )
2010-05-06 12:25:53 +01:00
{
2010-05-20 19:57:25 +01:00
return false ;
2010-05-06 12:25:53 +01:00
}
2010-03-18 14:26:21 +00:00
}
class FooTemplateRenderer extends Renderer
{
2010-05-06 12:25:53 +01:00
public function evaluate ( Storage $template , array $parameters = array ())
{
return 'foo' ;
}
2010-03-18 14:26:21 +00:00
}