fenom/tests/TestCase.php

275 lines
8.2 KiB
PHP
Raw Normal View History

2013-02-15 01:49:26 +04:00
<?php
2013-06-28 11:53:53 +04:00
namespace Fenom;
use Fenom, Fenom\Provider as FS;
2013-02-15 01:49:26 +04:00
2013-07-29 14:58:14 +04:00
class TestCase extends \PHPUnit_Framework_TestCase
{
2013-02-15 01:49:26 +04:00
/**
2013-06-28 11:53:53 +04:00
* @var Fenom
2013-02-15 01:49:26 +04:00
*/
2013-06-28 11:53:53 +04:00
public $fenom;
2013-04-04 10:56:44 +04:00
public $values = array(
2013-07-22 18:03:43 +04:00
"zero" => 0,
2013-07-29 14:58:14 +04:00
"one" => 1,
2013-04-04 10:56:44 +04:00
"two" => 2,
"three" => 3,
2013-07-22 18:03:43 +04:00
"float" => 4.5,
2013-07-29 14:58:14 +04:00
"bool" => true,
2013-07-22 18:03:43 +04:00
0 => "empty value",
2013-04-04 10:56:44 +04:00
1 => "one value",
2 => "two value",
3 => "three value",
);
2013-02-15 01:49:26 +04:00
2013-07-29 14:58:14 +04:00
public static function getVars()
{
2013-07-22 18:03:43 +04:00
return array(
"zero" => 0,
2013-07-29 14:58:14 +04:00
"one" => 1,
2013-07-22 18:03:43 +04:00
"two" => 2,
"three" => 3,
"float" => 4.5,
2013-07-29 14:58:14 +04:00
"bool" => true,
"obj" => new \StdClass,
2013-07-22 18:03:43 +04:00
"list" => array(
"a" => 1,
2013-08-03 18:56:17 +04:00
"one" => 1,
"b" => 2,
"two" => 2
2013-07-22 18:03:43 +04:00
),
0 => "empty value",
1 => "one value",
2 => "two value",
3 => "three value",
);
}
2013-07-29 14:58:14 +04:00
public function setUp()
{
if (!file_exists(FENOM_RESOURCES . '/compile')) {
mkdir(FENOM_RESOURCES . '/compile', 0777, true);
2013-02-15 01:49:26 +04:00
} else {
2013-07-29 14:58:14 +04:00
FS::clean(FENOM_RESOURCES . '/compile/');
2013-02-15 01:49:26 +04:00
}
2013-07-22 18:03:43 +04:00
2013-07-29 14:58:14 +04:00
$this->fenom = Fenom::factory(FENOM_RESOURCES . '/template', FENOM_RESOURCES . '/compile');
$this->fenom->addModifier('dots', __CLASS__ . '::dots');
$this->fenom->addModifier('concat', __CLASS__ . '::concat');
2013-08-29 11:29:34 +04:00
$this->fenom->addModifier('append', __CLASS__ . '::append');
2013-07-29 14:58:14 +04:00
$this->fenom->addFunction('test_function', __CLASS__ . '::inlineFunction');
$this->fenom->addBlockFunction('test_block_function', __CLASS__ . '::blockFunction');
}
2013-07-29 14:58:14 +04:00
public static function dots($value)
{
return $value . "...";
2013-02-15 01:49:26 +04:00
}
2013-07-29 14:58:14 +04:00
public static function concat()
{
return call_user_func_array('var_export', func_get_args());
}
2013-05-30 20:00:52 +04:00
2013-08-29 11:29:34 +04:00
public static function append()
{
return implode("", func_get_args());
}
2013-07-29 14:58:14 +04:00
public static function inlineFunction($params)
{
2013-07-07 01:34:19 +04:00
return isset($params["text"]) ? $params["text"] : "";
}
2013-07-29 14:58:14 +04:00
public static function blockFunction($params, $text)
{
2013-07-07 01:34:19 +04:00
return $text;
}
2013-07-29 14:58:14 +04:00
public static function setUpBeforeClass()
{
if (!file_exists(FENOM_RESOURCES . '/template')) {
mkdir(FENOM_RESOURCES . '/template', 0777, true);
2013-02-20 18:03:53 +04:00
} else {
2013-07-29 14:58:14 +04:00
FS::clean(FENOM_RESOURCES . '/template/');
2013-02-20 18:03:53 +04:00
}
}
2013-07-29 14:58:14 +04:00
public function tpl($name, $code)
{
$dir = dirname($name);
2013-07-29 14:58:14 +04:00
if ($dir != "." && !is_dir(FENOM_RESOURCES . '/template/' . $dir)) {
mkdir(FENOM_RESOURCES . '/template/' . $dir, 0777, true);
}
2013-07-29 14:58:14 +04:00
file_put_contents(FENOM_RESOURCES . '/template/' . $name, $code);
2013-02-20 18:03:53 +04:00
}
2013-02-15 01:49:26 +04:00
/**
* Compile and execute template
*
* @param string $code source of template
* @param array $vars variables of template
* @param string $result expected result.
2013-07-20 21:27:31 +04:00
* @param int $options
2013-02-15 01:49:26 +04:00
* @param bool $dump dump source and result code (for debug)
2013-09-14 11:24:23 +04:00
* @return \Fenom\Template
2013-02-15 01:49:26 +04:00
*/
2013-07-29 14:58:14 +04:00
public function exec($code, $vars, $result, $options = 0, $dump = false)
{
2013-07-20 21:27:31 +04:00
$this->fenom->setOptions($options);
2013-06-28 11:53:53 +04:00
$tpl = $this->fenom->compileCode($code, "runtime.tpl");
2013-07-29 14:58:14 +04:00
if ($dump) {
echo "\n========= DUMP BEGIN ===========\n" . $code . "\n--- to ---\n" . $tpl->getBody() . "\n========= DUMP END =============\n";
2013-02-15 01:49:26 +04:00
}
$this->assertSame(Modifier::strip($result), Modifier::strip($tpl->fetch($vars), true), "Test $code");
2013-09-14 11:24:23 +04:00
return $tpl;
2013-02-15 01:49:26 +04:00
}
2013-07-29 14:58:14 +04:00
public function execTpl($name, $code, $vars, $result, $dump = false)
{
2013-02-20 18:03:53 +04:00
$this->tpl($name, $code);
2013-06-28 11:53:53 +04:00
$tpl = $this->fenom->getTemplate($name);
2013-07-29 14:58:14 +04:00
if ($dump) {
echo "\n========= DUMP BEGIN ===========\n" . $code . "\n--- to ---\n" . $tpl->getBody() . "\n========= DUMP END =============\n";
2013-02-20 18:03:53 +04:00
}
$this->assertSame(Modifier::strip($result, true), Modifier::strip($tpl->fetch($vars), true), "Test tpl $name");
}
2013-02-15 01:49:26 +04:00
/**
* Try to compile the invalid template
* @param string $code source of the template
* @param string $exception exception class
* @param string $message exception message
2013-06-28 11:53:53 +04:00
* @param int $options Fenom's options
2013-02-15 01:49:26 +04:00
*/
2013-07-29 14:58:14 +04:00
public function execError($code, $exception, $message, $options = 0)
{
2013-06-28 11:53:53 +04:00
$opt = $this->fenom->getOptions();
$this->fenom->setOptions($options);
2013-02-15 01:49:26 +04:00
try {
2013-06-28 11:53:53 +04:00
$this->fenom->compileCode($code, "inline.tpl");
2013-07-29 14:58:14 +04:00
} catch (\Exception $e) {
2013-02-15 01:49:26 +04:00
$this->assertSame($exception, get_class($e), "Exception $code");
$this->assertStringStartsWith($message, $e->getMessage());
2013-06-28 11:53:53 +04:00
$this->fenom->setOptions($opt);
2013-02-15 01:49:26 +04:00
return;
}
2013-06-28 11:53:53 +04:00
$this->fenom->setOptions($opt);
2013-02-15 01:49:26 +04:00
$this->fail("Code $code must be invalid");
}
2013-04-04 10:56:44 +04:00
2013-07-29 14:58:14 +04:00
public function assertRender($tpl, $result, $debug = false)
{
2013-06-28 11:53:53 +04:00
$template = $this->fenom->compileCode($tpl);
2013-07-29 14:58:14 +04:00
if ($debug) {
print_r("$tpl:\n" . $template->getBody());
}
2013-04-04 10:56:44 +04:00
$this->assertSame($result, $template->fetch($this->values));
}
2013-07-29 14:58:14 +04:00
public static function providerNumbers()
{
return array(
array('0', 0),
array('77', 77),
array('-33', -33),
array('0.2', 0.2),
array('-0.3', -0.3),
array('1e6', 1e6),
array('-2e6', -2e6),
);
}
2013-07-29 14:58:14 +04:00
public static function providerStrings()
{
return array(
array('"str"', 'str'),
array('"str\nand\nmany\nlines"', "str\nand\nmany\nlines"),
array('"str and \'substr\'"', "str and 'substr'"),
array('"str and \"substr\""', 'str and "substr"'),
array("'str'", 'str'),
array("'str\\nin\\none\\nline'", 'str\nin\none\nline'),
array("'str and \"substr\"'", 'str and "substr"'),
array("'str and \'substr\''", "str and 'substr'"),
array('"$one"', '1'),
array('"$one $two"', '1 2'),
array('"$one and $two"', '1 and 2'),
array('"a $one and $two b"', 'a 1 and 2 b'),
array('"{$one}"', '1'),
array('"a {$one} b"', 'a 1 b'),
array('"{$one + 2}"', '3'),
array('"{$one * $two + 1}"', '3'),
array('"{$one} and {$two}"', '1 and 2'),
array('"$one and {$two}"', '1 and 2'),
array('"{$one} and $two"', '1 and 2'),
array('"a {$one} and {$two} b"', 'a 1 and 2 b'),
array('"{$one+1} and {$two-1}"', '2 and 1'),
array('"a {$one+1} and {$two-1} b"', 'a 2 and 1 b'),
array('"a {$one|dots} and {$two|dots} b"', 'a 1... and 2... b'),
array('"a {$one|dots} and $two b"', 'a 1... and 2 b'),
array('"a $one and {$two|dots} b"', 'a 1 and 2... b'),
);
}
2013-07-29 14:58:14 +04:00
public function providerVariables()
{
2013-08-03 18:56:17 +04:00
return array(
array('$one', 1),
array('$list.one', 1),
array('$list[$$.DEVELOP]', 1),
);
2013-07-29 14:58:14 +04:00
}
2013-07-29 14:58:14 +04:00
public static function providerObjects()
{
return array();
}
2013-07-29 14:58:14 +04:00
public static function providerArrays()
{
$scalars = array();
$data = array(
array('[]', array()),
array('[[],[]]', array(array(), array())),
);
foreach (self::providerScalars() as $scalar) {
$scalars[0][] = $scalar[0];
$scalars[1][] = $scalar[1];
2013-07-29 14:58:14 +04:00
$data[] = array(
"[" . $scalar[0] . "]",
array($scalar[1])
);
$data[] = array(
"['some_key' =>" . $scalar[0] . "]",
array('some_key' => $scalar[1])
);
}
$data[] = array(
"[" . implode(", ", $scalars[0]) . "]",
$scalars[1]
);
return $data;
}
2013-07-29 14:58:14 +04:00
public static function providerScalars()
{
return array_merge(
self::providerNumbers(),
self::providerStrings()
);
}
2013-07-29 14:58:14 +04:00
public static function providerValues()
{
return array_merge(
self::providerScalars(),
self::providerArrays(),
self::providerVariables(),
self::providerObjects()
);
}
2013-04-04 10:56:44 +04:00
}