Add layout helpers

This commit is contained in:
Dmitriy Simushev 2014-12-16 14:41:43 +00:00
parent 6da6ab2fe5
commit 56c2ddae82
18 changed files with 925 additions and 0 deletions

View File

@ -41,5 +41,13 @@ class Helpers extends BaseHelpers
$this->add('uppercase', new String\UppercaseHelper());
$this->add('repeat', new String\RepeatHelper());
$this->add('truncate', new String\TruncateHelper());
// Layout helpers
$storage = new Layout\BlockStorage();
$this->add('block', new Layout\BlockHelper($storage));
$this->add('extends', new Layout\ExtendsHelper($storage));
$this->add('override', new Layout\OverrideHelper($storage));
$this->add('ifOverridden', new Layout\IfOverriddenHelper($storage));
$this->add('unlessOverridden', new Layout\UnlessOverriddenHelper($storage));
}
}

View File

@ -0,0 +1,34 @@
<?php
/*
* This file is part of Handlebars.php Helpers Set
*
* (c) Dmitriy Simushev <simushevds@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace JustBlackBird\HandlebarsHelpers\Layout;
/**
* Contains base functionality for all helpers related with blocks overriding.
*
* @author Dmitriy Simushev <simushevds@gmail.com>
*/
abstract class AbstractBlockHelper
{
/**
* @var BlockStorage
*/
protected $blocksStorage;
/**
* Helper's constructor.
*
* @param BlockStorage $storage A Blocks context instance
*/
public function __construct(BlockStorage $storage)
{
$this->blocksStorage = $storage;
}
}

View File

@ -0,0 +1,58 @@
<?php
/*
* This file is part of Handlebars.php Helpers Set
*
* (c) Dmitriy Simushev <simushevds@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace JustBlackBird\HandlebarsHelpers\Layout;
use Handlebars\Context;
use Handlebars\Helper as HelperInterface;
use Handlebars\Template;
/**
* A helper for defining default content of a block.
*
* Usage:
* ```handlebars
* {{#block name}}
* Default content for the block
* {{/block}}
* ```
*
* Arguments:
* - "name": Name of the block.
*
* @author Dmitriy Simushev <simushevds@gmail.com>
*/
class BlockHelper extends AbstractBlockHelper implements HelperInterface
{
/**
* {@inheritdoc}
*/
public function execute(Template $template, Context $context, $args, $source)
{
// Get block name
$parsed_args = $template->parseArguments($args);
if (count($parsed_args) != 1) {
throw new \InvalidArgumentException(
'"block" helper expects exactly one argument.'
);
}
$block_name = $context->get(array_shift($parsed_args));
// If the block is not overridden render and show the default value
if (!$this->blocksStorage->has($block_name)) {
return $template->render($context);
}
$content = $this->blocksStorage->get($block_name);
// Show overridden content
return $content;
}
}

View File

@ -0,0 +1,78 @@
<?php
/*
* This file is part of Handlebars.php Helpers Set
*
* (c) Dmitriy Simushev <simushevds@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace JustBlackBird\HandlebarsHelpers\Layout;
/**
* A storage for overridable blocks' content.
*
* @author Dmitriy Simushev <simushevds@gmail.com>
*/
class BlockStorage
{
/**
* Associative array of blocks. The keys are blocks names and the values are
* blocks content.
*
* @type string[]
*/
protected $blocks = array();
/**
* Gets content of a block.
*
* @param string $name Block's name.
* @return string Block's content.
*/
public function get($name)
{
return isset($this->blocks[$name]) ? $this->blocks[$name] : false;
}
/**
* Sets content of a block.
*
* @param string $name Block's name.
* @param string $content Block's content.
*/
public function set($name, $content)
{
$this->blocks[$name] = $content;
}
/**
* Checks if a block exists in the storage.
*
* @param string $name Block's name
* @return boolean
*/
public function has($name)
{
return isset($this->blocks[$name]);
}
/**
* Removes block from the storage.
*
* @param string $name Block's name.
*/
public function remove($name)
{
unset($this->blocks[$name]);
}
/**
* Removes all blocks from the storage.
*/
public function clear()
{
$this->blocks = array();
}
}

View File

@ -0,0 +1,79 @@
<?php
/*
* This file is part of Handlebars.php Helpers Set
*
* (c) Dmitriy Simushev <simushevds@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace JustBlackBird\HandlebarsHelpers\Layout;
use Handlebars\Context;
use Handlebars\Helper as HelperInterface;
use Handlebars\Template;
/**
* A helper for templates extending.
*
* This helper works as a wrapper for one or more "override" blocks which
* defines name of the parent template.
*
* Example of usage:
* ```handlebars
* {{#extends parentTemplateName}}
* {{#override "blockName"}}
* Overridden block content
* {{/override}}
* {{/extends}}
* ```
*
* Arguments:
* - "parentTemplateName": Name of the template that should be extended.
*
* @author Dmitriy Simushev <simushevds@gmail.com>
*/
class ExtendsHelper extends AbstractBlockHelper implements HelperInterface
{
/**
* The current inheritance level of the templates.
* @var int
*/
protected $level = 0;
/**
* {@inheritdoc}
*/
public function execute(Template $template, Context $context, $args, $source)
{
// Get name of the parent template
$parsed_args = $template->parseArguments($args);
if (count($parsed_args) != 1) {
throw new \InvalidArgumentException(
'"extends" helper expects exactly one argument.'
);
}
$parent_template = $context->get(array_shift($parsed_args));
// Render content inside "extends" block to override blocks
$template->render($context);
// We need another instance of \Handlebars\Template to render parent
// template. It can be got from Handlebars engine, so get the engine.
$handlebars = $template->getEngine();
// Render the parent template
$this->level++;
$buffer = $handlebars->render($parent_template, $context);
$this->level--;
if ($this->level == 0) {
// The template and all its parents are rendered. Clean up the
// storage.
$this->blocksStorage->clear();
}
return $buffer;
}
}

36
src/Layout/Helpers.php Normal file
View File

@ -0,0 +1,36 @@
<?php
/*
* This file is part of Handlebars.php Helpers Set
*
* (c) Dmitriy Simushev <simushevds@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace JustBlackBird\HandlebarsHelpers\Layout;
use Handlebars\Helpers as BaseHelpers;
/**
* Contains all layout helpers.
*
* @author Dmitriy Simushev <simushevds@gmail.com>
*/
class Helpers extends BaseHelpers
{
/**
* {@inheritdoc}
*/
protected function addDefaultHelpers()
{
parent::addDefaultHelpers();
$storage = new BlockStorage();
$this->add('block', new BlockHelper($storage));
$this->add('extends', new ExtendsHelper($storage));
$this->add('override', new OverrideHelper($storage));
$this->add('ifOverridden', new IfOverriddenHelper($storage));
$this->add('unlessOverridden', new UnlessOverriddenHelper($storage));
}
}

View File

@ -0,0 +1,64 @@
<?php
/*
* This file is part of Handlebars.php Helpers Set
*
* (c) Dmitriy Simushev <simushevds@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace JustBlackBird\HandlebarsHelpers\Layout;
use Handlebars\Context;
use Handlebars\Helper as HelperInterface;
use Handlebars\Template;
/**
* Conditional helper that checks if block overridden or not.
*
* Usage:
* ```handlebars
* {{#ifOverridden name}}
* The block was overridden
* {{else}}
* The block was not overridden
* {{/ifOverridden}}
* ```
*
* Arguments:
* - "name": Name of the block.
*
* @author Dmitriy Simushev <simushevds@gmail.com>
*/
class IfOverriddenHelper extends AbstractBlockHelper implements HelperInterface
{
/**
* {@inheritdoc}
*/
public function execute(Template $template, Context $context, $args, $source)
{
// Get block name
$parsed_args = $template->parseArguments($args);
if (count($parsed_args) != 1) {
throw new \InvalidArgumentException(
'"ifOverridden" helper expects exactly one argument.'
);
}
$block_name = $context->get(array_shift($parsed_args));
// Check condition and render blocks
if ($this->blocksStorage->has($block_name)) {
$template->setStopToken('else');
$buffer = $template->render($context);
$template->setStopToken(false);
} else {
$template->setStopToken('else');
$template->discard();
$template->setStopToken(false);
$buffer = $template->render($context);
}
return $buffer;
}
}

View File

@ -0,0 +1,59 @@
<?php
/*
* This file is part of Handlebars.php Helpers Set
*
* (c) Dmitriy Simushev <simushevds@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace JustBlackBird\HandlebarsHelpers\Layout;
use Handlebars\Context;
use Handlebars\Helper as HelperInterface;
use Handlebars\Template;
/**
* A helper for overriding content of a block.
*
* One or more "override" blocks must be wrapped with
* {@link \JustBlackBird\HandlebarsHelpers\Layout\ExtendsHelper} helper.
*
* Usage:
* ```handlebars
* {{#override blockName}}
* Overridden content of the block.
* {{/override}}
* ```
*
* Arguments:
* - blockName: Name of the block which should be overridden.
*
* @author Dmitriy Simushev <simushevds@gmail.com>
*/
class OverrideHelper extends AbstractBlockHelper implements HelperInterface
{
/**
* {@inheritdoc}
*/
public function execute(Template $template, Context $context, $args, $source)
{
// Get block name
$parsed_args = $template->parseArguments($args);
if (count($parsed_args) != 1) {
throw new \InvalidArgumentException(
'"override" helper expects exactly one argument.'
);
}
$block_name = $context->get(array_shift($parsed_args));
// We need to provide unlimited inheritence level. Rendering is started
// from the deepest level template. If the content is in the block
// storage it is related with the deepest level template. Thus we do not
// need to override it.
if (!$this->blocksStorage->has($block_name)) {
$this->blocksStorage->set($block_name, $template->render($context));
}
}
}

View File

@ -0,0 +1,64 @@
<?php
/*
* This file is part of Handlebars.php Helpers Set
*
* (c) Dmitriy Simushev <simushevds@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace JustBlackBird\HandlebarsHelpers\Layout;
use Handlebars\Context;
use Handlebars\Helper as HelperInterface;
use Handlebars\Template;
/**
* Conditional helper that checks if block overridden or not.
*
* Usage:
* ```handlebars
* {{#unlessOverridden name}}
* The block was not overridden
* {{else}}
* The block was overridden
* {{/unlessOverridden}}
* ```
*
* Arguments:
* - "name": Name of the block.
*
* @author Dmitriy Simushev <simushevds@gmail.com>
*/
class UnlessOverriddenHelper extends AbstractBlockHelper implements HelperInterface
{
/**
* {@inheritdoc}
*/
public function execute(Template $template, Context $context, $args, $source)
{
// Get block name
$parsed_args = $template->parseArguments($args);
if (count($parsed_args) != 1) {
throw new \InvalidArgumentException(
'"unlessOverridden" helper expects exactly one argument.'
);
}
$block_name = $context->get(array_shift($parsed_args));
// Check condition and render blocks
if (!$this->blocksStorage->has($block_name)) {
$template->setStopToken('else');
$buffer = $template->render($context);
$template->setStopToken(false);
} else {
$template->setStopToken('else');
$template->discard();
$template->setStopToken(false);
$buffer = $template->render($context);
}
return $buffer;
}
}

View File

@ -53,6 +53,13 @@ class HelpersTest extends \PHPUnit_Framework_TestCase
array('uppercase', '\\JustBlackBird\\HandlebarsHelpers\\String\\UppercaseHelper'),
array('repeat', '\\JustBlackBird\\HandlebarsHelpers\\String\\RepeatHelper'),
array('truncate', '\\JustBlackBird\\HandlebarsHelpers\\String\\TruncateHelper'),
// Layout helpers
array('block', '\\JustBlackBird\\HandlebarsHelpers\\Layout\\BlockHelper'),
array('extends', '\\JustBlackBird\\HandlebarsHelpers\\Layout\\ExtendsHelper'),
array('override', '\\JustBlackBird\\HandlebarsHelpers\\Layout\\OverrideHelper'),
array('ifOverridden', '\\JustBlackBird\\HandlebarsHelpers\\Layout\\IfOverriddenHelper'),
array('unlessOverridden', '\\JustBlackBird\\HandlebarsHelpers\\Layout\\UnlessOverriddenHelper'),
);
}
}

View File

@ -0,0 +1,50 @@
<?php
/*
* This file is part of Handlebars.php Helpers Set
*
* (c) Dmitriy Simushev <simushevds@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace JustBlackBird\HandlebarsHelpers\Tests\Layout;
use JustBlackBird\HandlebarsHelpers\Layout\BlockHelper;
use JustBlackBird\HandlebarsHelpers\Layout\BlockStorage;
/**
* Test class for "block" helper.
*
* @author Dmitriy Simushev <simushevds@gmail.com>
*/
class BlockHelperTest extends \PHPUnit_Framework_TestCase
{
/**
* Tests that exception is thrown if wrong number of arguments is used.
*
* @expectedException InvalidArgumentException
* @dataProvider wrongArgumentsProvider
*/
public function testArgumentsCount($template)
{
$storage = new BlockStorage();
$helpers = new \Handlebars\Helpers(array('block' => new BlockHelper($storage)));
$engine = new \Handlebars\Handlebars(array('helpers' => $helpers));
$engine->render($template, array());
}
/**
* A data provider for testArgumentsCount method.
*/
public function wrongArgumentsProvider()
{
return array(
// Not enough arguments
array('{{#block}}content{{/block}}'),
// Too much arguments
array('{{#block "arg1" "arg2"}}content{{/block}}'),
);
}
}

View File

@ -0,0 +1,42 @@
<?php
/*
* This file is part of Handlebars.php Helpers Set
*
* (c) Dmitriy Simushev <simushevds@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace JustBlackBird\HandlebarsHelpers\Tests\Layout;
use JustBlackBird\HandlebarsHelpers\Layout\BlockStorage;
/**
* Test class for BlockStorage.
*
* @author Dmitriy Simushev <simushevds@gmail.com>
*/
class BlockStorageTest extends \PHPUnit_Framework_TestCase
{
/**
* Tests basic operations with storage.
*/
public function testBasicOperations()
{
$storage = new BlockStorage();
$this->assertFalse($storage->has('test'));
$storage->set('test', 'content');
$this->assertTrue($storage->has('test'));
$this->assertEquals($storage->get('test'), 'content');
$storage->set('test', 'another content');
$this->assertEquals($storage->get('test'), 'another content');
$storage->remove('test');
$this->assertFalse($storage->has('test'));
$storage->set('test', 'content');
$storage->set('another_test', 'content');
$storage->clear();
$this->assertFalse($storage->has('test'));
$this->assertFalse($storage->has('another_test'));
}
}

View File

@ -0,0 +1,50 @@
<?php
/*
* This file is part of Handlebars.php Helpers Set
*
* (c) Dmitriy Simushev <simushevds@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace JustBlackBird\HandlebarsHelpers\Tests\Layout;
use JustBlackBird\HandlebarsHelpers\Layout\BlockStorage;
use JustBlackBird\HandlebarsHelpers\Layout\ExtendsHelper;
/**
* Test class for "extends" helper.
*
* @author Dmitriy Simushev <simushevds@gmail.com>
*/
class ExtendsHelperTest extends \PHPUnit_Framework_TestCase
{
/**
* Tests that exception is thrown if wrong number of arguments is used.
*
* @expectedException InvalidArgumentException
* @dataProvider wrongArgumentsProvider
*/
public function testArgumentsCount($template)
{
$storage = new BlockStorage();
$helpers = new \Handlebars\Helpers(array('extends' => new ExtendsHelper($storage)));
$engine = new \Handlebars\Handlebars(array('helpers' => $helpers));
$engine->render($template, array());
}
/**
* A data provider for testArgumentsCount method.
*/
public function wrongArgumentsProvider()
{
return array(
// Not enough arguments
array('{{#extends}}content{{/extends}}'),
// Too much arguments
array('{{#extends "arg1" "arg2"}}content{{/extends}}'),
);
}
}

View File

@ -0,0 +1,48 @@
<?php
/*
* This file is part of Handlebars.php Helpers Set
*
* (c) Dmitriy Simushev <simushevds@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace JustBlackBird\HandlebarsHelpers\Tests\Layout;
use JustBlackBird\HandlebarsHelpers\Layout\Helpers;
/**
* Test class for Layout Helpers Set.
*
* @author Dmitriy Simushev <simushevds@gmail.com>
*/
class HelpersTest extends \PHPUnit_Framework_TestCase
{
/**
* Tests that all helpers in the set exist and have valid classes.
*
* @dataProvider helpersProvider
*/
public function testHelper($name, $class)
{
$helpers = new Helpers();
$this->assertTrue($helpers->has($name), sprintf('There is no "%s" helper', $name));
$this->assertInstanceOf($class, $helpers->{$name});
}
/**
* A data provider for testHelper method.
*/
public function helpersProvider()
{
return array(
array('block', '\\JustBlackBird\\HandlebarsHelpers\\Layout\\BlockHelper'),
array('extends', '\\JustBlackBird\\HandlebarsHelpers\\Layout\\ExtendsHelper'),
array('override', '\\JustBlackBird\\HandlebarsHelpers\\Layout\\OverrideHelper'),
array('ifOverridden', '\\JustBlackBird\\HandlebarsHelpers\\Layout\\IfOverriddenHelper'),
array('unlessOverridden', '\\JustBlackBird\\HandlebarsHelpers\\Layout\\UnlessOverriddenHelper'),
);
}
}

View File

@ -0,0 +1,50 @@
<?php
/*
* This file is part of Handlebars.php Helpers Set
*
* (c) Dmitriy Simushev <simushevds@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace JustBlackBird\HandlebarsHelpers\Tests\Layout;
use JustBlackBird\HandlebarsHelpers\Layout\BlockStorage;
use JustBlackBird\HandlebarsHelpers\Layout\IfOverriddenHelper;
/**
* Test class for "ifOverridden" helper.
*
* @author Dmitriy Simushev <simushevds@gmail.com>
*/
class IfOverriddenHelperTest extends \PHPUnit_Framework_TestCase
{
/**
* Tests that exception is thrown if wrong number of arguments is used.
*
* @expectedException InvalidArgumentException
* @dataProvider wrongArgumentsProvider
*/
public function testArgumentsCount($template)
{
$storage = new BlockStorage();
$helpers = new \Handlebars\Helpers(array('ifOverridden' => new IfOverriddenHelper($storage)));
$engine = new \Handlebars\Handlebars(array('helpers' => $helpers));
$engine->render($template, array());
}
/**
* A data provider for testArgumentsCount method.
*/
public function wrongArgumentsProvider()
{
return array(
// Not enough arguments
array('{{#ifOverridden}}true{{else}}false{{/ifOverridden}}'),
// Too much arguments
array('{{#ifOverridden "arg1" "arg2"}}true{{else}}false{{/ifOverridden}}'),
);
}
}

View File

@ -0,0 +1,98 @@
<?php
/*
* This file is part of Handlebars.php Helpers Set
*
* (c) Dmitriy Simushev <simushevds@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace JustBlackBird\HandlebarsHelpers\Tests\Layout;
use JustBlackBird\HandlebarsHelpers\Layout\BlockHelper;
use JustBlackBird\HandlebarsHelpers\Layout\BlockStorage;
use JustBlackBird\HandlebarsHelpers\Layout\ExtendsHelper;
use JustBlackBird\HandlebarsHelpers\Layout\IfOverriddenHelper;
use JustBlackBird\HandlebarsHelpers\Layout\OverrideHelper;
use JustBlackBird\HandlebarsHelpers\Layout\UnlessOverriddenHelper;
/**
* Test class for all layout helpers.
*
* Layout helpers must work together thus combined tests should be used.
*
* @author Dmitriy Simushev <simushevds@gmail.com>
*/
class IntegrationTest extends \PHPUnit_Framework_TestCase
{
/**
* Tests how inheritance helpers works together.
*/
public function testInheritance()
{
$storage = new BlockStorage();
$helpers = new \Handlebars\Helpers(array(
'block' => new BlockHelper($storage),
'extends' => new ExtendsHelper($storage),
'override' => new OverrideHelper($storage),
));
$engine = new \Handlebars\Handlebars(array('helpers' => $helpers));
// Test simple inheritance
$engine->setLoader(new \Handlebars\Loader\ArrayLoader(array(
'parent' => '{{#block "name"}}parent{{/block}} template',
'child' => '{{#extends "parent"}}{{#override "name"}}child{{/override}}{{/extends}}',
'grandchild' => '{{#extends "child"}}{{#override "name"}}grandchild{{/override}}{{/extends}}',
)));
$this->assertEquals($engine->render('parent', array()), 'parent template');
$this->assertEquals($engine->render('child', array()), 'child template');
$this->assertEquals($engine->render('grandchild', array()), 'grandchild template');
// Test inheritance with nested blocks
$engine->setLoader(new \Handlebars\Loader\ArrayLoader(array(
'parent' => '{{#block "title"}}{{#block "name"}}parent{{/block}} template{{/block}}',
'child' => '{{#extends "parent"}}{{#override "name"}}child{{/override}}{{/extends}}',
'newbie' => '{{#extends "parent"}}{{#override "title"}}Newbie!{{/override}}{{/extends}}',
)));
$this->assertEquals($engine->render('parent', array()), 'parent template');
$this->assertEquals($engine->render('child', array()), 'child template');
$this->assertEquals($engine->render('newbie', array()), 'Newbie!');
}
/**
* Tests that conditions related with inheritance works as expected.
*/
public function testConditions()
{
$storage = new BlockStorage();
$helpers = new \Handlebars\Helpers(array(
'block' => new BlockHelper($storage),
'extends' => new ExtendsHelper($storage),
'override' => new OverrideHelper($storage),
'ifOverridden' => new IfOverriddenHelper($storage),
'unlessOverridden' => new UnlessOverriddenHelper($storage),
));
$engine = new \Handlebars\Handlebars(array('helpers' => $helpers));
// Test "ifOverridden" helper
$engine->setLoader(new \Handlebars\Loader\ArrayLoader(array(
'parent' => '{{#block "name"}}{{/block}}{{#ifOverridden "name"}}true{{else}}false{{/ifOverridden}}',
'child' => '{{#extends "parent"}}{{#override "name"}}{{/override}}{{/extends}}',
'another_child' => '{{#extends "parent"}}{{/extends}}',
)));
$this->assertEquals($engine->render('parent', array()), 'false');
$this->assertEquals($engine->render('child', array()), 'true');
$this->assertEquals($engine->render('another_child', array()), 'false');
// Test "unlessOverridden" helper
$engine->setLoader(new \Handlebars\Loader\ArrayLoader(array(
'parent' => '{{#block "name"}}{{/block}}{{#unlessOverridden "name"}}false{{else}}true{{/unlessOverridden}}',
'child' => '{{#extends "parent"}}{{#override "name"}}{{/override}}{{/extends}}',
'another_child' => '{{#extends "parent"}}{{/extends}}',
)));
$this->assertEquals($engine->render('parent', array()), 'false');
$this->assertEquals($engine->render('child', array()), 'true');
$this->assertEquals($engine->render('another_child', array()), 'false');
}
}

View File

@ -0,0 +1,50 @@
<?php
/*
* This file is part of Handlebars.php Helpers Set
*
* (c) Dmitriy Simushev <simushevds@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace JustBlackBird\HandlebarsHelpers\Tests\Layout;
use JustBlackBird\HandlebarsHelpers\Layout\OverrideHelper;
use JustBlackBird\HandlebarsHelpers\Layout\BlockStorage;
/**
* Test class for "override" helper.
*
* @author Dmitriy Simushev <simushevds@gmail.com>
*/
class OverrideHelperTest extends \PHPUnit_Framework_TestCase
{
/**
* Tests that exception is thrown if wrong number of arguments is used.
*
* @expectedException InvalidArgumentException
* @dataProvider wrongArgumentsProvider
*/
public function testArgumentsCount($template)
{
$storage = new BlockStorage();
$helpers = new \Handlebars\Helpers(array('override' => new OverrideHelper($storage)));
$engine = new \Handlebars\Handlebars(array('helpers' => $helpers));
$engine->render($template, array());
}
/**
* A data provider for testArgumentsCount method.
*/
public function wrongArgumentsProvider()
{
return array(
// Not enough arguments
array('{{#override}}content{{/override}}'),
// Too much arguments
array('{{#override "arg1" "arg2"}}content{{/override}}'),
);
}
}

View File

@ -0,0 +1,50 @@
<?php
/*
* This file is part of Handlebars.php Helpers Set
*
* (c) Dmitriy Simushev <simushevds@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace JustBlackBird\HandlebarsHelpers\Tests\Layout;
use JustBlackBird\HandlebarsHelpers\Layout\BlockStorage;
use JustBlackBird\HandlebarsHelpers\Layout\UnlessOverriddenHelper;
/**
* Test class for "unlessOverridden" helper.
*
* @author Dmitriy Simushev <simushevds@gmail.com>
*/
class UnlessOverriddenHelperTest extends \PHPUnit_Framework_TestCase
{
/**
* Tests that exception is thrown if wrong number of arguments is used.
*
* @expectedException InvalidArgumentException
* @dataProvider wrongArgumentsProvider
*/
public function testArgumentsCount($template)
{
$storage = new BlockStorage();
$helpers = new \Handlebars\Helpers(array('unlessOverridden' => new UnlessOverriddenHelper($storage)));
$engine = new \Handlebars\Handlebars(array('helpers' => $helpers));
$engine->render($template, array());
}
/**
* A data provider for testArgumentsCount method.
*/
public function wrongArgumentsProvider()
{
return array(
// Not enough arguments
array('{{#unlessOverridden}}false{{else}}true{{/unlessOverridden}}'),
// Too much arguments
array('{{#unlessOverridden "arg1" "arg2"}}false{{else}}true{{/unlessOverridden}}'),
);
}
}