/** * @dataProvider sourcesProvider */ public function testCompiles($source, $expectedOutput, $locals) { // // parse // $parseContext = new ParserContext(); $parseContext->setString($source)->setBaseDirectory(__DIR__); $template = $parseContext->parse(); $this->assertInstanceOf('Skrz\\Templating\\Engine\\AST\\TemplateNode', $template); // // compile // $compilerContext = new CompilerContext(); $compilerContext->setNamespace('Skrz\\Templating\\Engine')->setClassName("Template_" . sha1(uniqid('', true)))->setTemplate($template)->setParserContext($parseContext)->addModifier("strip_tags", function (Compiler $compiler, ModifierNode $modifier, $text) { return new ModifierCompilerResult("strip_tags({$text})"); })->addFunction("inferno", function (Compiler $compiler, FunctionNode $function) { /** @var StatementAndExpressionVO $hell */ $hell = $compiler->walk($function->getArgument("hell")); $ret = ""; $ret .= "echo '666 ';"; $ret .= $hell->getStatement(); $ret .= "echo " . $hell->getExpression() . ";"; $ret .= "echo ' 666';"; return new FunctionCompilerResult($ret); }); $compiled = $compilerContext->compile(); // // debug // // echo "\n\n"; // echo "$source\n"; // echo "--------\n"; // echo $compiled; // echo "\n"; // // run // $this->assertNull(eval("?>{$compiled}")); $fullyQualifiedClassName = $compilerContext->getFullyQualifiedClassName(); $templateInstance = new $fullyQualifiedClassName(); ob_start(); $templateInstance($locals); $actualOutput = ob_get_contents(); ob_end_clean(); $this->assertEquals($expectedOutput, $actualOutput); }