assertEquals($expected, $tmpl_obj->render($bindings)); } public function testConstantExpression() { $bindings = array(); $template = '17 + 4 = {"foo" != "bar" ? 17 + 4 : 42.0}'; $expected = '17 + 4 = 21'; $tmpl_obj = new Template($template); $this->assertEquals($expected, $tmpl_obj->render($bindings)); } public function testConditionExpression() { $bindings = array('a' => 0, 'b' => 42); $template = 'answer is {"" ?: a ?: b}'; $expected = 'answer is 42'; $tmpl_obj = new Template($template); $this->assertEquals($expected, $tmpl_obj->render($bindings)); } public function testStringEscapes() { $bindings = array(); $template = '"{"\\tfoo\'\\"\\n"}{\'{"bar"}\'}"'; $expected = "\"\tfoo'\"\n{\"bar\"}\""; $tmpl_obj = new Template($template); $this->assertEquals($expected, $tmpl_obj->render($bindings)); } public function testOperatorPrecedence() { $bindings = array('val' => array(array(42))); $template = '{-val[0][0] / (17+4) + 8 > 6 && "foo" == "f"~"o"~"o" ? 1 : 2}'; $expected = '2'; $tmpl_obj = new Template($template); $this->assertEquals($expected, $tmpl_obj->render($bindings)); } public function testSimpleBindings() { $bindings = array('foo' => 'bar', 'val' => array(17, 4), 'pi' => 3.14159); $template = 'foo = "{foo}", sum = {val[0] + val[1]}, pi^2 = {pi * pi}, x = {x}'; $expected = 'foo = "bar", sum = 21, pi^2 = 9.8695877281, x = '; $tmpl_obj = new Template($template); $this->assertEquals($expected, $tmpl_obj->render($bindings)); } public function testConditional() { $bindings = array('foo' => 'bar', 'pi' => 3.14159); $template = '{if foo == "foo"}NO{elseif foo == "bar"}pi = {pi}{else}NO{endif}'; $expected = 'pi = 3.14159'; $tmpl_obj = new Template($template); $this->assertEquals($expected, $tmpl_obj->render($bindings)); } public function testConditionalIteration() { $bindings = array('foo' => 'bar', 'pi' => 3.14159); $template = '{foreach foo}{if foo}{foo}{endif}{endforeach}'; $expected = 'bar'; $tmpl_obj = new Template($template); $this->assertEquals($expected, $tmpl_obj->render($bindings)); } public function testIteration() { $bindings = array('persons' => array( 1 => array('user' => 'jane', 'phone' => '555-81281'), 2 => array('user' => 'mike', 'phone' => '230-28382'), 3 => array('user' => 'john', 'phone' => '911-19212') )); $template = ''; $expected = ''; $tmpl_obj = new Template($template); $this->assertEquals($expected, $tmpl_obj->render($bindings)); } public function testEmptyIteration() { $bindings = array('foo' => array(), 'bar' => false); $template = '{foreach foo}foo{endforeach}:{foreach bar}bar{endforeach}'; $expected = ':'; $tmpl_obj = new Template($template); $this->assertEquals($expected, $tmpl_obj->render($bindings)); } public function testVariableScope() { $bindings = array('value' => 42, 'test' => array( array(), array('value' => 17), array('test' => array( array(), array('value' => 4) )) )); $template = '{foreach test}{value}:{foreach test}{value}~{endforeach}{endforeach}'; $expected = '42:42~17~42~17:17~17~17~42:42~4~'; $tmpl_obj = new Template($template); $this->assertEquals($expected, $tmpl_obj->render($bindings)); } public function testNestedStatements() { foreach (range(0, 9) as $i) { $bindings['loop'][$i]['i'] = "$i"; } $template = '{foreach loop}' . '{if i+1>4 && i<(1+10/2)}{i==4*1 ? \'foo\'~i : "bar"}' . '{elseif !(i<=+4)}+{elseif i==""}..{else}{"-"}{endif}' . '{endforeach}'; $expected = '----foo4bar++++'; $tmpl_obj = new Template($template); $this->assertEquals($expected, $tmpl_obj->render($bindings)); } public function testFunctionCall() { $bindings = array('val' => array(0, 1, 2, 3)); $template = '{strlen("foobar") + count(val)}'; $expected = '10'; $tmpl_obj = new Template($template); $this->assertEquals($expected, $tmpl_obj->render($bindings)); } public function testFilters() { $bindings = array( 'pi' => 3.14159, 'format' => function($a, $b) { return number_format($a, $b); }, 'upper' => function($a) { return strtoupper($a); } ); $template = '{pi|format(3) ~ ":" ~ "foobar"|upper}'; $expected = '3.142:FOOBAR'; $tmpl_obj = new Template($template); $this->assertEquals($expected, $tmpl_obj->render($bindings)); } public function testRawFilter() { $bindings = array('foo' => '', 'upper' => function($a) { return strtoupper($a); }); $template = '{foo}:{foo|upper|raw}'; $expected = '<img>:'; $tmpl_obj = new Template($template); $tmpl_obj->autoescape('html'); $this->assertEquals($expected, $tmpl_obj->render($bindings)); } public function testHtmlAutoEscape() { $bindings = array('foo' => '', 'pi' => 3.14159); $template = '{foo}:{pi}'; $expected = '<img>:3.14159'; $tmpl_obj = new Template($template); $tmpl_obj->autoescape('html'); $this->assertEquals($expected, $tmpl_obj->render($bindings)); } public function testJsonAutoEscape() { $bindings = array('foo' => '', 'pi' => 3.14159); $template = '{foo}:{pi}'; $expected = '"":3.14159'; $tmpl_obj = new Template($template); $tmpl_obj->autoescape('json'); $this->assertEquals($expected, $tmpl_obj->render($bindings)); } }