diff options
Diffstat (limited to 'vendor/zordius/lightncandy/tests/handlebarsSpecTest.php')
-rw-r--r-- | vendor/zordius/lightncandy/tests/handlebarsSpecTest.php | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/vendor/zordius/lightncandy/tests/handlebarsSpecTest.php b/vendor/zordius/lightncandy/tests/handlebarsSpecTest.php new file mode 100644 index 00000000..5124b226 --- /dev/null +++ b/vendor/zordius/lightncandy/tests/handlebarsSpecTest.php @@ -0,0 +1,162 @@ +<?php + +require_once('src/lightncandy.php'); + +$tmpdir = sys_get_temp_dir(); + +class HandlebarsSpecTest extends PHPUnit_Framework_TestCase +{ + /** + * @dataProvider jsonSpecProvider + */ + public function testSpecs($spec) + { + global $tmpdir; + + //// Skip bad specs + // No expect in spec + if (!isset($spec['expected'])) { + $this->markTestIncomplete("Skip [{$spec['file']}#{$spec['description']}]#{$spec['no']} , no expected result in spec, skip."); + } + // This spec is bad , lightncandy result as '} hello }' and same with mustache.js + if ($spec['template'] === '{{{{raw}}}} {{test}} {{{{/raw}}}}') { + $this->markTestIncomplete("Skip [{$spec['file']}#{$spec['description']}]#{$spec['no']} , bad spec, skip."); + } + // missing partial in this spec + if ($spec['it'] === 'rendering function partial in vm mode') { + $this->markTestIncomplete("Skip [{$spec['file']}#{$spec['description']}]#{$spec['no']} , bad spec, skip."); + } + // Helper depend on an external class, skip it now. + if ($spec['it'] === 'simple literals work') { + $this->markTestIncomplete("Skip [{$spec['file']}#{$spec['description']}]#{$spec['no']} , external class not found, skip."); + } + // partial not found: global_test + if ($spec['message'] === 'Partials can use globals or passed') { + $this->markTestIncomplete("Skip [{$spec['file']}#{$spec['description']}]#{$spec['no']} , partial not found, skip."); + } + // lambda not found in spec + if ($spec['it'] === "bug reported by @fat where lambdas weren't being properly resolved") { + $this->markTestIncomplete("Skip [{$spec['file']}#{$spec['description']}]#{$spec['no']} , lambda not found, skip."); + } + + //// Skip unsupported features + // can not get any hint of 'function' from handlebars-spec , maybe it is a conversion error. + if (($spec['description'] === 'basic context') && preg_match('/functions/', $spec['it'])) { + $this->markTestIncomplete("Skip [{$spec['file']}#{$spec['description']}]#{$spec['no']} , undefined function in spec json, skip."); + } + if (preg_match('/(.+) with function argument/', $spec['it'])) { + $this->markTestIncomplete("Skip [{$spec['file']}#{$spec['description']}]#{$spec['no']} , undefined function in spec json, skip."); + } + if ($spec['it'] === 'Functions are bound to the context in knownHelpers only mode') { + $this->markTestIncomplete("Skip [{$spec['file']}#{$spec['description']}]#{$spec['no']} , undefined function in spec json, skip."); + } + if ($spec['it'] === 'lambdas are resolved by blockHelperMissing, not handlebars proper') { + $this->markTestIncomplete("Skip [{$spec['file']}#{$spec['description']}]#{$spec['no']} , undefined function in spec json, skip."); + } + if ($spec['description'] === '#SafeString') { + $this->markTestIncomplete("Skip [{$spec['file']}#{$spec['description']}]#{$spec['no']} , undefined function in spec json, skip."); + } + + // Do not support includeZero now + if (($spec['description'] === '#if') && preg_match('/includeZero=true/', $spec['template'])) { + $this->markTestIncomplete("Skip [{$spec['file']}#{$spec['description']}]#{$spec['no']} , lightncandy do not support this now."); + } + + // Do not support setting options.data now + if ($spec['it'] === 'data passed to helpers') { + $this->markTestIncomplete("Skip [{$spec['file']}#{$spec['description']}]#{$spec['no']} , lightncandy do not support this now."); + } + + // Do not support buildin helper : lookup now + if ($spec['description'] == '#lookup') { + $this->markTestIncomplete("Skip [{$spec['file']}#{$spec['description']}]#{$spec['no']} , lightncandy do not support this now."); + } + + // Lightncandy will not support old path style as foo/bar , now only support foo.bar . + if ($spec['it'] === 'literal paths') { + $this->markTestIncomplete("Skip [{$spec['file']}#{$spec['description']}]#{$spec['no']} , lightncandy do not support this now."); + } + + // Do not support {{~{foo}~}} , use {{{~foo~}}} + if ($spec['template'] === ' {{~{foo}~}} ') { + $this->markTestIncomplete("Skip [{$spec['file']}#{$spec['description']}]#{$spec['no']} , lightncandy do not support this now."); + } + + // setup helpers + $helpers = Array(); + if (isset($spec['helpers'])) { + foreach ($spec['helpers'] as $name => $func) { + if (!isset($func['php'])) { + $this->markTestIncomplete("Skip [{$spec['file']}#{$spec['description']}]#{$spec['no']} , no PHP helper code provided for this case."); + } + + // Wrong PHP helper interface in spec, skip. + preg_match('/function\s*\(.+?\)/', isset($func['javascript']) ? $func['javascript'] : '', $js_args); + preg_match('/function\s*\(.+?\)/', $func['php'], $php_args); + $jsn = isset($js_args[0]) ? substr_count($js_args[0], ',') : 0; + $phpn = isset($php_args[0]) ? substr_count($php_args[0], ',') : 0; + if ($jsn !== $phpn) { + $this->markTestIncomplete("Skip [{$spec['file']}#{$spec['description']}]#{$spec['no']} , PHP helper interface is wrong."); + } + + $hname = "custom_helper_{$spec['no']}_$name"; + $helpers[$name] = $hname; + eval(preg_replace('/function/', "function $hname", $func['php'], 1)); + } + + } + + if (($spec['it'] === 'tokenizes hash arguments') || ($spec['it'] === 'tokenizes special @ identifiers')) { + $helpers['foo'] = function () {return 'ABC';}; + } + + $flag = LightnCandy::FLAG_HANDLEBARSJS | LightnCandy::FLAG_ERROR_EXCEPTION | LightnCandy::FLAG_RUNTIMEPARTIAL | LightnCandy::FLAG_EXTHELPER | LightnCandy::FLAG_ERROR_SKIPPARTIAL | LightnCandy::FLAG_EXTHELPER; + + foreach (Array($flag, $flag | LightnCandy::FLAG_STANDALONE) as $f) { + try { + $php = LightnCandy::compile($spec['template'], Array( + 'flags' => $f, + 'hbhelpers' => $helpers, + 'basedir' => $tmpdir, + 'partials' => isset($spec['partials']) ? $spec['partials'] : null, + )); + } catch (Exception $e) { + if (($spec['description'] === 'Tokenizer') && preg_match('/tokenizes inverse .+ as "OPEN_INVERSE.+CLOSE"/', $spec['it'])) { + continue; + } + print_r(LightnCandy::getContext()); + $this->fail('Exception:' . $e->getMessage()); + } + $renderer = LightnCandy::prepare($php); + if ($spec['description'] === 'Tokenizer') { + // no compile error means passed + continue; + } + $this->assertEquals($spec['expected'], $renderer($spec['data']), "[{$spec['file']}#{$spec['description']}]#{$spec['no']}:{$spec['it']} PHP CODE: $php"); + } + } + + public function jsonSpecProvider() + { + $ret = Array(); + + foreach (glob('specs/handlebars/spec/*.json') as $file) { + $i=0; + $json = json_decode(file_get_contents($file), true); + $ret = array_merge($ret, array_map(function ($d) use ($file, &$i) { + $d['file'] = $file; + $d['no'] = ++$i; + if (!isset($d['message'])) { + $d['message'] = null; + } + if (!isset($d['data'])) { + $d['data'] = null; + } + return Array($d); + }, $json)); + } + + return $ret; + } +} +?> |