fail('Compile failed due to:' . print_r($context['error'], true)); } $renderer = LightnCandy::prepare($php); $this->assertEquals($issue['expected'], $renderer($issue['data'], $issue['debug']), "PHP CODE:\n$php"); } public function issueProvider() { $issues = Array( Array( 'id' => 39, 'template' => '{{{tt}}}', 'options' => null, 'data' => Array('tt' => 'bla bla bla'), 'expected' => 'bla bla bla' ), Array( 'id' => 44, 'template' => '
{{render "artists-terms"}}
', 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS | LightnCandy::FLAG_ERROR_LOG | LightnCandy::FLAG_EXTHELPER, 'helpers' => Array( 'url', 'render' => function($view,$data = array()) { return 'OK!'; } ) ), 'data' => Array('tt' => 'bla bla bla'), 'expected' => '
OK!
' ), Array( 'id' => 45, 'template' => '{{{a.b.c}}}, {{a.b.bar}}, {{a.b.prop}}', 'options' => Array( 'flags' => LightnCandy::FLAG_ERROR_LOG | LightnCandy::FLAG_INSTANCE | LightnCandy::FLAG_HANDLEBARSJS, ), 'data' => Array('a' => Array('b' => new foo)), 'expected' => ', OK!, Yes!' ), Array( 'id' => 46, 'template' => '{{{this.id}}}, {{a.id}}', 'options' => Array( 'flags' => LightnCandy::FLAG_THIS, ), 'data' => Array('id' => 'bla bla bla', 'a' => Array('id' => 'OK!')), 'expected' => 'bla bla bla, OK!' ), Array( 'id' => 49, 'template' => '{{date_format}} 1, {{date_format2}} 2, {{date_format3}} 3, {{date_format4}} 4', 'options' => Array( 'helpers' => Array( 'date_format' => 'meetup_date_format', 'date_format2' => 'meetup_date_format2', 'date_format3' => 'meetup_date_format3', 'date_format4' => 'meetup_date_format4' ) ), 'data' => null, 'expected' => 'OKOK~1 1, OKOK~2 2, OKOK~3 3, OKOK~4 4' ), Array( 'id' => 52, 'template' => '{{{test_array tmp}}} should be happy!', 'options' => Array( 'helpers' => Array( 'test_array', ) ), 'data' => Array('tmp' => Array('A', 'B', 'C')), 'expected' => 'IS_ARRAY should be happy!' ), Array( 'id' => 62, 'template' => '{{{test_join @root.foo.bar}}} should be happy!', 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS | LightnCandy::FLAG_ERROR_EXCEPTION, 'helpers' => array('test_join') ), 'data' => Array('foo' => Array('A', 'B', 'bar' => Array('C', 'D'))), 'expected' => 'C.D should be happy!', ), Array( 'id' => 64, 'template' => '{{#each foo}} Test! {{this}} {{/each}}{{> test1}} ! >>> {{>recursive}}', 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS | LightnCandy::FLAG_RUNTIMEPARTIAL, 'basedir' => 'tests', ), 'data' => Array( 'bar' => 1, 'foo' => Array( 'bar' => 3, 'foo' => Array( 'bar' => 5, 'foo' => Array( 'bar' => 7, 'foo' => Array( 'bar' => 11, 'foo' => Array( 'no foo here' ) ) ) ) ) ), 'expected' => " Test! 3 Test! [object Object] 123\n ! >>> 1 -> 3 -> 5 -> 7 -> 11 -> END!\n\n\n\n\n\n", ), Array( 'id' => 66, 'template' => '{{&foo}} , {{foo}}, {{{foo}}}', 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS ), 'data' => Array('foo' => 'Test & " \' :)'), 'expected' => 'Test & " \' :) , Test & " ' :), Test & " \' :)', ), Array( 'id' => 68, 'template' => '{{#myeach foo}} Test! {{this}} {{/myeach}}', 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'hbhelpers' => Array( 'myeach' => function ($context, $options) { $ret = ''; foreach ($context as $cx) { $ret .= $options['fn']($cx); } return $ret; } ) ), 'data' => Array('foo' => Array('A', 'B', 'bar' => Array('C', 'D', 'E'))), 'expected' => ' Test! A Test! B Test! C,D,E ', ), Array( 'id' => 81, 'template' => '{{#with ../person}} {{^name}} Unknown {{/name}} {{/with}}?!', 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS | LightnCandy::FLAG_ERROR_EXCEPTION, ), 'data' => Array('parent?!' => Array('A', 'B', 'bar' => Array('C', 'D', 'E'))), 'expected' => '?!' ), Array( 'id' => 83, 'template' => '{{> tests/test1}}', 'options' => Array( 'basedir' => '.', ), 'data' => null, 'expected' => "123\n" ), Array( 'id' => 85, 'template' => '{{helper 1 foo bar="q"}}', 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'hbhelpers' => Array( 'helper' => function ($arg1, $arg2, $options) { return "ARG1:$arg1, ARG2:$arg2, HASH:{$options['hash']['bar']}"; } ) ), 'data' => Array('foo' => 'BAR'), 'expected' => 'ARG1:1, ARG2:BAR, HASH:q', ), Array( 'id' => 88, 'template' => '{{>test2}}', 'options' => Array( 'flags' => 0, 'basedir' => 'tests', ), 'data' => null, 'expected' => "a123\nb\n", ), Array( 'id' => 89, 'template' => '{{#with}}SHOW:{{.}} {{/with}}', 'data' => Array('with' => Array(1, 3, 7), 'a' => Array(2, 4, 9)), 'expected' => 'SHOW:1 SHOW:3 SHOW:7 ', ), Array( 'id' => 90, 'template' => '{{#items}}{{#value}}{{.}}{{/value}}{{/items}}', 'data' => Array('items' => Array(Array('value'=>'123'))), 'expected' => '123', ), Array( 'id' => 109, 'template' => '{{#if "OK"}}it\'s great!{{/if}}', 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS | LightnCandy::FLAG_NOESCAPE, ), 'data' => null, 'expected' => 'it\'s great!', ), Array( 'id' => 110, 'template' => 'ABC{{#block "YES!"}}DEF{{foo}}GHI{{/block}}JKL', 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS | LightnCandy::FLAG_BESTPERFORMANCE, 'hbhelpers' => Array( 'block' => function ($name, $options) { return "1-$name-2-" . $options['fn']() . '-3'; } ), ), 'data' => Array('foo' => 'bar'), 'expected' => 'ABC1-YES!-2-DEFbarGHI-3JKL', ), Array( 'id' => 109, 'template' => '{{foo}} {{> test}}', 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS | LightnCandy::FLAG_NOESCAPE, 'partials' => Array('test' => '{{foo}}'), ), 'data' => Array('foo' => '<'), 'expected' => '< <', ), Array( 'id' => 114, 'template' => '{{^myeach .}}OK:{{.}},{{else}}NOT GOOD{{/myeach}}', 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS | LightnCandy::FLAG_BESTPERFORMANCE, 'hbhelpers' => Array( 'myeach' => function ($context, $options) { $ret = ''; foreach ($context as $cx) { $ret .= $options['fn']($cx); } return $ret; } ), ), 'data' => Array(1, 'foo', 3, 'bar'), 'expected' => 'NOT GOODNOT GOODNOT GOODNOT GOOD', ), Array( 'id' => 114, 'template' => '{{^myeach .}}OK:{{.}},{{else}}NOT GOOD{{/myeach}}', 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS | LightnCandy::FLAG_BESTPERFORMANCE, 'blockhelpers' => Array( 'myeach' => function ($input) { return $input; } ), ), 'data' => Array(1, 'foo', 3, 'bar'), 'expected' => 'NOT GOOD', ), Array( 'id' => 114, 'template' => '{{^myeach .}}OK:{{.}},{{else}}NOT GOOD{{/myeach}}', 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS | LightnCandy::FLAG_BESTPERFORMANCE, 'blockhelpers' => Array( 'myeach' => function ($input) { return; } ), ), 'data' => Array(1, 'foo', 3, 'bar'), 'expected' => 'OK:,', ), Array( 'id' => 124, 'template' => '{{list foo bar abc=(lt 10 3) def=(lt 3 10)}}', 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'hbhelpers' => Array( 'lt' => function ($a, $b) { return ($a > $b) ? Array("$a>$b", 'raw') : ''; }, 'list' => function () { $out = 'List:'; $args = func_get_args(); $opts = array_pop($args); foreach ($args as $v) { if ($v) { $out .= ")$v , "; } } foreach ($opts['hash'] as $k => $v) { if ($v) { $out .= "]$k=$v , "; } } return array($out, 'raw'); } ), ), 'data' => Array('foo' => 'OK!', 'bar' => 'OK2', 'abc' => false, 'def' => 123), 'expected' => 'List:)OK! , )OK2 , ]abc=10>3 , ', ), Array( 'id' => 124, 'template' => '{{#if (equal \'OK\' cde)}}YES!{{/if}}', 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'hbhelpers' => Array( 'equal' => function ($a, $b) { return $a === $b; } ), ), 'data' => Array('cde' => 'OK'), 'expected' => 'YES!' ), Array( 'id' => 124, 'template' => '{{#if (equal true (equal \'OK\' cde))}}YES!{{/if}}', 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'hbhelpers' => Array( 'equal' => function ($a, $b) { return $a === $b; } ), ), 'data' => Array('cde' => 'OK'), 'expected' => 'YES!' ), Array( 'id' => 125, 'template' => '{{#if (equal true ( equal \'OK\' cde))}}YES!{{/if}}', 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'hbhelpers' => Array( 'equal' => function ($a, $b) { return $a === $b; } ), ), 'data' => Array('cde' => 'OK'), 'expected' => 'YES!' ), Array( 'id' => 125, 'template' => '{{#if (equal true (equal \' OK\' cde))}}YES!{{/if}}', 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'hbhelpers' => Array( 'equal' => function ($a, $b) { return $a === $b; } ), ), 'data' => Array('cde' => ' OK'), 'expected' => 'YES!' ), Array( 'id' => 125, 'template' => '{{#if (equal true (equal \' ==\' cde))}}YES!{{/if}}', 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'hbhelpers' => Array( 'equal' => function ($a, $b) { return $a === $b; } ), ), 'data' => Array('cde' => ' =='), 'expected' => 'YES!' ), Array( 'id' => 125, 'template' => '{{#if (equal true (equal " ==" cde))}}YES!{{/if}}', 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'hbhelpers' => Array( 'equal' => function ($a, $b) { return $a === $b; } ), ), 'data' => Array('cde' => ' =='), 'expected' => 'YES!' ), Array( 'id' => 125, 'template' => '{{[ abc]}}', 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'hbhelpers' => Array( 'equal' => function ($a, $b) { return $a === $b; } ), ), 'data' => Array(' abc' => 'YES!'), 'expected' => 'YES!' ), Array( 'id' => 125, 'template' => '{{list [ abc] " xyz" \' def\' "==" \'==\' "OK"}}', 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'hbhelpers' => Array( 'list' => function ($a, $b) { $out = 'List:'; $args = func_get_args(); $opts = array_pop($args); foreach ($args as $v) { if ($v) { $out .= ")$v , "; } } return $out; } ), ), 'data' => Array(' abc' => 'YES!'), 'expected' => 'List:)YES! , ) xyz , ) def , )== , )== , )OK , ' ), Array( 'id' => 127, 'template' => '{{#each array}}#{{#if true}}{{name}}-{{../name}}-{{../../name}}-{{../../../name}}{{/if}}##{{#myif true}}{{name}}={{../name}}={{../../name}}={{../../../name}}{{/myif}}###{{#mywith true}}{{name}}~{{../name}}~{{../../name}}~{{../../../name}}{{/mywith}}{{/each}}', 'data' => Array('name' => 'john', 'array' => Array(1,2,3)), 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'hbhelpers' => Array('myif', 'mywith'), ), 'expected' => '#--john-##==john=###~~john~#--john-##==john=###~~john~#--john-##==john=###~~john~', ), Array( 'id' => 128, 'template' => 'foo: {{foo}} , parent foo: {{../foo}}', 'data' => Array('foo' => 'OK'), 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, ), 'expected' => 'foo: OK , parent foo: ', ), Array( 'id' => 132, 'template' => '{{list (keys .)}}', 'data' => Array('foo' => 'bar', 'test' => 'ok'), 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'helpers' => Array( 'keys' => function($arg) { return Array(array_keys($arg[0]), 'asis'); }, 'list' => function($arg) { return join(',', $arg[0]); } ), ), 'expected' => 'foo,test', ), Array( 'id' => 133, 'template' => "{{list (keys\n .\n ) \n}}", 'data' => Array('foo' => 'bar', 'test' => 'ok'), 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'helpers' => Array( 'keys' => function($arg) { return Array(array_keys($arg[0]), 'asis'); }, 'list' => function($arg) { return join(',', $arg[0]); } ), ), 'expected' => 'foo,test', ), Array( 'id' => 133, 'template' => "{{list\n .\n \n \n}}", 'data' => Array('foo', 'bar', 'test'), 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'helpers' => Array( 'list' => function($arg) { return join(',', $arg[0]); } ), ), 'expected' => 'foo,bar,test', ), Array( 'id' => 134, 'template' => "{{#if 1}}{{list (keys ../names)}}{{/if}}", 'data' => Array('names' => Array('foo' => 'bar', 'test' => 'ok')), 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'helpers' => Array( 'keys' => function($arg) { return Array(array_keys($arg[0]), 'asis'); }, 'list' => function($arg) { return join(',', $arg[0]); } ), ), 'expected' => 'foo,test', ), Array( 'id' => 138, 'template' => "{{#each (keys .)}}={{.}}{{/each}}", 'data' => Array('foo' => 'bar', 'test' => 'ok', 'Haha'), 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'helpers' => Array( 'keys' => function($arg) { return Array(array_keys($arg[0]), 'asis'); } ), ), 'expected' => '=foo=test=0', ), Array( 'id' => 140, 'template' => "{{[a.good.helper] .}}", 'data' => Array('ha', 'hey', 'ho'), 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'helpers' => Array( 'a.good.helper' => function($arg) { return join(',', $arg[0]); } ), ), 'expected' => 'ha,hey,ho', ), Array( 'id' => 141, 'template' => "{{#with foo}}{{#getThis bar}}{{/getThis}}{{/with}}", 'data' => Array('foo' => Array('bar' => 'Good!')), 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'hbhelpers' => Array( 'getThis' => function($input, $options) { return $input . '-' . $options['_this']['bar']; } ), ), 'expected' => 'Good!-Good!', ), Array( 'id' => 141, 'template' => "{{#with foo}}{{getThis bar}}{{/with}}", 'data' => Array('foo' => Array('bar' => 'Good!')), 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'hbhelpers' => Array( 'getThis' => function($input, $options) { return $input . '-' . $options['_this']['bar']; } ), ), 'expected' => 'Good!-Good!', ), Array( 'id' => 143, 'template' => "{{testString foo bar=\" \"}}", 'data' => Array('foo' => 'good!'), 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'helpers' => Array( 'testString' => function($args, $named) { return $args[0] . '-' . $named['bar']; } ), ), 'expected' => 'good!- ', ), Array( 'id' => 143, 'template' => "{{testString foo bar=\"\"}}", 'data' => Array('foo' => 'good!'), 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'helpers' => Array( 'testString' => function($args, $named) { return $args[0] . '-' . $named['bar']; } ), ), 'expected' => 'good!-', ), Array( 'id' => 143, 'template' => "{{testString foo bar=' '}}", 'data' => Array('foo' => 'good!'), 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'helpers' => Array( 'testString' => function($args, $named) { return $args[0] . '-' . $named['bar']; } ), ), 'expected' => 'good!- ', ), Array( 'id' => 143, 'template' => "{{testString foo bar=''}}", 'data' => Array('foo' => 'good!'), 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'helpers' => Array( 'testString' => function($args, $named) { return $args[0] . '-' . $named['bar']; } ), ), 'expected' => 'good!-', ), Array( 'id' => 143, 'template' => "{{testString foo bar=\" \"}}", 'data' => Array('foo' => 'good!'), 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'hbhelpers' => Array( 'testString' => function($arg1, $options) { return $arg1 . '-' . $options['hash']['bar']; } ), ), 'expected' => 'good!- ', ), Array( 'id' => 147, 'template' => '{{> test/test3 foo="bar"}}', 'data' => Array('test' => 'OK!', 'foo' => 'error'), 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS | LightnCandy::FLAG_RUNTIMEPARTIAL, 'partials' => Array('test/test3' => '{{test}}, {{foo}}'), ), 'expected' => 'OK!, bar' ), Array( 'id' => 147, 'template' => '{{> test/test3 foo="bar"}}', 'data' => new foo(), 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS | LightnCandy::FLAG_RUNTIMEPARTIAL | LightnCandy::FLAG_INSTANCE, 'partials' => Array('test/test3' => '{{bar}}, {{foo}}'), ), 'expected' => 'OK!, bar' ), Array( 'id' => 150, 'template' => '{{{.}}}', 'data' => Array('hello' => 'world'), 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'lcrun' => 'MyLCRunClass', ), 'expected' => "[[DEBUG:raw()=>array (\n 'hello' => 'world',\n)]]", ), Array( 'id' => 153, 'template' => '{{echo "test[]"}}', 'data' => null, 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'helpers' => Array( 'echo' => function ($in) { return "-$in[0]-"; } ) ), 'expected' => "-test[]-", ), Array( 'id' => 153, 'template' => '{{echo \'test[]\'}}', 'data' => null, 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'helpers' => Array( 'echo' => function ($in) { return "-$in[0]-"; } ) ), 'expected' => "-test[]-", ), Array( 'id' => 154, 'template' => 'O{{! this is comment ! ... }}K!', 'data' => null, 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, ), 'expected' => "OK!" ), Array( 'template' => '{{testNull null undefined 1}}', 'data' => 'test', 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'hbhelpers' => Array( 'testNull' => function($arg1, $arg2) { return (($arg1 === null) && ($arg2 === null)) ? 'YES!' : 'no'; } ) ), 'expected' => 'YES!' ), Array( 'template' => '{{> (pname foo) bar}}', 'data' => Array('bar' => 'OK! SUBEXP+PARTIAL!', 'foo' => Array('test/test3')), 'options' => Array( 'helpers' => Array( 'pname' => function($arg) { return $arg[0]; } ), 'flags' => LightnCandy::FLAG_HANDLEBARSJS | LightnCandy::FLAG_RUNTIMEPARTIAL, 'partials' => Array('test/test3' => '{{.}}'), ), 'expected' => 'OK! SUBEXP+PARTIAL!' ), Array( 'template' => '{{> testpartial newcontext mixed=foo}}', 'data' => Array('foo' => 'OK!', 'newcontext' => Array('bar' => 'test')), 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS | LightnCandy::FLAG_RUNTIMEPARTIAL, 'partials' => Array('testpartial' => '{{bar}}-{{mixed}}'), ), 'expected' => 'test-OK!' ), Array( 'template' => '{{[helper]}}', 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'hbhelpers' => Array( 'helper' => function () { return 'DEF'; } ) ), 'data' => Array(), 'expected' => 'DEF' ), Array( 'template' => '{{#[helper3]}}ABC{{/[helper3]}}', 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'hbhelpers' => Array( 'helper3' => function () { return 'DEF'; } ) ), 'data' => Array(), 'expected' => 'DEF' ), Array( 'template' => '{{#[helper3]}}ABC{{/[helper3]}}', 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'blockhelpers' => Array( 'helper3' => function () { return Array('a', 'b', 'c'); } ) ), 'data' => Array(), 'expected' => 'ABC' ), Array( 'template' => '{{hash abc=["def=123"]}}', 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS | LightnCandy::FLAG_BESTPERFORMANCE, 'hbhelpers' => Array( 'hash' => function ($options) { $ret = ''; foreach ($options['hash'] as $k => $v) { $ret .= "$k : $v,"; } return $ret; } ), ), 'data' => Array('"def=123"' => 'La!'), 'expected' => 'abc : La!,', ), Array( 'template' => '{{hash abc=[\'def=123\']}}', 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS | LightnCandy::FLAG_BESTPERFORMANCE, 'hbhelpers' => Array( 'hash' => function ($options) { $ret = ''; foreach ($options['hash'] as $k => $v) { $ret .= "$k : $v,"; } return $ret; } ), ), 'data' => Array("'def=123'" => 'La!'), 'expected' => 'abc : La!,', ), Array( 'template' => 'ABC{{#block "YES!"}}DEF{{foo}}GHI{{else}}NO~{{/block}}JKL', 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS | LightnCandy::FLAG_BESTPERFORMANCE, 'hbhelpers' => Array( 'block' => function ($name, $options) { return "1-$name-2-" . $options['fn']() . '-3'; } ), ), 'data' => Array('foo' => 'bar'), 'expected' => 'ABC1-YES!-2-DEFbarGHI-3JKL', ), Array( 'template' => '-{{getroot}}=', 'options' => Array( 'flags' => LightnCandy::FLAG_SPVARS, 'hbhelpers' => Array('getroot'), ), 'data' => 'ROOT!', 'expected' => '-ROOT!=', ), Array( 'template' => 'A{{#each .}}-{{#each .}}={{.}},{{@key}},{{@index}},{{@../index}}~{{/each}}%{{/each}}B', 'data' => Array(Array('a' => 'b'), Array('c' => 'd'), Array('e' => 'f')), 'options' => Array( 'flags' => LightnCandy::FLAG_PARENT | LightnCandy::FLAG_THIS | LightnCandy::FLAG_SPVARS, ), 'expected' => 'A-=b,a,0,0~%-=d,c,0,1~%-=f,e,0,2~%B', ), Array( 'template' => 'ABC{{#block "YES!"}}TRUE{{else}}DEF{{foo}}GHI{{/block}}JKL', 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS | LightnCandy::FLAG_BESTPERFORMANCE, 'hbhelpers' => Array( 'block' => function ($name, $options) { return "1-$name-2-" . $options['inverse']() . '-3'; } ), ), 'data' => Array('foo' => 'bar'), 'expected' => 'ABC1-YES!-2-DEFbarGHI-3JKL', ), Array( 'template' => '{{#each .}}{{..}}>{{/each}}', 'data' => Array('a', 'b', 'c'), 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, ), 'expected' => 'a,b,c>a,b,c>a,b,c>', ), Array( 'template' => '{{#each .}}->{{>tests/test3}}{{/each}}', 'data' => Array('a', 'b', 'c'), 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'basedir' => '.', ), 'expected' => "->New context:a\n->New context:b\n->New context:c\n", ), Array( 'template' => '{{#each .}}->{{>tests/test3 ../foo}}{{/each}}', 'data' => Array('a', 'foo' => Array('d', 'e', 'f')), 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS | LightnCandy::FLAG_RUNTIMEPARTIAL, 'basedir' => '.', ), 'expected' => "->New context:d,e,f\n->New context:d,e,f\n", ), Array( 'template' => '{{{"{{"}}}', 'data' => null, 'expected' => '{{', ), Array( 'template' => '{{good_helper}}', 'data' => null, 'options' => Array( 'helpers' => Array('good_helper' => 'foo::bar'), ), 'expected' => 'OK!', ), Array( 'template' => '-{{.}}-', 'options' => Array('flags' => LightnCandy::FLAG_THIS), 'data' => 'abc', 'expected' => '-abc-', ), Array( 'template' => '-{{this}}-', 'options' => Array('flags' => LightnCandy::FLAG_THIS), 'data' => 123, 'expected' => '-123-', ), Array( 'template' => '{{#if .}}YES{{else}}NO{{/if}}', 'options' => Array('flags' => LightnCandy::FLAG_ELSE), 'data' => true, 'expected' => 'YES', ), Array( 'template' => '{{foo}}', 'options' => Array('flags' => LightnCandy::FLAG_RENDER_DEBUG), 'data' => Array('foo' => 'OK'), 'expected' => 'OK', ), Array( 'template' => '{{foo}}', 'options' => Array('flags' => LightnCandy::FLAG_RENDER_DEBUG), 'debug' => LCRun3::DEBUG_TAGS_ANSI, 'data' => Array('foo' => 'OK'), 'expected' => pack('H*', '1b5b303b33326d7b7b5b666f6f5d7d7d1b5b306d'), ), Array( 'template' => '{{foo}}', 'options' => Array('flags' => LightnCandy::FLAG_RENDER_DEBUG), 'debug' => LCRun3::DEBUG_TAGS_HTML, 'data' => null, 'expected' => '{{[foo]}}', ), Array( 'template' => '{{#foo}}OK{{/foo}}', 'options' => Array('flags' => LightnCandy::FLAG_RENDER_DEBUG), 'debug' => LCRun3::DEBUG_TAGS_HTML, 'data' => null, 'expected' => '{{#[foo]}}{{/[foo]}}', ), Array( 'template' => '{{#foo}}OK{{/foo}}', 'options' => Array('flags' => LightnCandy::FLAG_RENDER_DEBUG), 'debug' => LCRun3::DEBUG_TAGS_ANSI, 'data' => null, 'expected' => pack('H*', '1b5b303b33316d7b7b235b666f6f5d7d7d1b5b306d1b5b303b33336d534b49505045441b5b306d1b5b303b33316d7b7b2f5b666f6f5d7d7d1b5b306d'), ), Array( 'template' => '{{#myif foo}}YES{{else}}NO{{/myif}}', 'data' => null, 'options' => Array( 'hbhelpers' => Array('myif'), ), 'expected' => 'NO', ), Array( 'template' => '{{#myif foo}}YES{{else}}NO{{/myif}}', 'data' => Array('foo' => 1), 'options' => Array( 'hbhelpers' => Array('myif'), ), 'expected' => 'YES', ), Array( 'template' => '{{#mylogic 0 foo bar}}YES:{{.}}{{else}}NO:{{.}}{{/mylogic}}', 'data' => Array('foo' => 'FOO', 'bar' => 'BAR'), 'options' => Array( 'hbhelpers' => Array('mylogic'), ), 'expected' => 'NO:BAR', ), Array( 'template' => '{{#mylogic true foo bar}}YES:{{.}}{{else}}NO:{{.}}{{/mylogic}}', 'data' => Array('foo' => 'FOO', 'bar' => 'BAR'), 'options' => Array( 'hbhelpers' => Array('mylogic'), ), 'expected' => 'YES:FOO', ), Array( 'template' => '{{#mywith foo}}YA: {{name}}{{/mywith}}', 'data' => Array('name' => 'OK?', 'foo' => Array('name' => 'OK!')), 'options' => Array( 'hbhelpers' => Array('mywith'), ), 'expected' => 'YA: OK!', ), Array( 'template' => '{{mydash \'abc\' "dev"}}', 'data' => Array('a' => 'a', 'b' => 'b', 'c' => Array('c' => 'c'), 'd' => 'd', 'e' => 'e'), 'options' => Array( 'hbhelpers' => Array('mydash'), ), 'expected' => 'abc-dev', ), Array( 'template' => '{{mydash \'a b c\' "d e f"}}', 'data' => Array('a' => 'a', 'b' => 'b', 'c' => Array('c' => 'c'), 'd' => 'd', 'e' => 'e'), 'options' => Array( 'flags' => LightnCandy::FLAG_ADVARNAME, 'hbhelpers' => Array('mydash'), ), 'expected' => 'a b c-d e f', ), Array( 'template' => '{{mydash "abc" (test_array 1)}}', 'data' => Array('a' => 'a', 'b' => 'b', 'c' => Array('c' => 'c'), 'd' => 'd', 'e' => 'e'), 'options' => Array( 'flags' => LightnCandy::FLAG_ADVARNAME, 'hbhelpers' => Array('mydash'), 'helpers' => Array('test_array'), ), 'expected' => 'abc-NOT_ARRAY', ), Array( 'template' => '{{mydash "abc" (myjoin a b)}}', 'data' => Array('a' => 'a', 'b' => 'b', 'c' => Array('c' => 'c'), 'd' => 'd', 'e' => 'e'), 'options' => Array( 'flags' => LightnCandy::FLAG_ADVARNAME, 'hbhelpers' => Array('mydash', 'myjoin'), ), 'expected' => 'abc-ab', ), Array( 'template' => '{{#with people}}Yes , {{name}}{{else}}No, {{name}}{{/with}}', 'data' => Array('people' => Array('name' => 'Peter'), 'name' => 'NoOne'), 'options' => Array('flags' => LightnCandy::FLAG_WITH), 'expected' => 'Yes , Peter', ), Array( 'template' => '{{#with people}}Yes , {{name}}{{else}}No, {{name}}{{/with}}', 'data' => Array('name' => 'NoOne'), 'options' => Array('flags' => LightnCandy::FLAG_WITH), 'expected' => 'No, NoOne', ), Array( 'template' => <<
  • 1. {{helper1 name}}
  • 2. {{helper1 value}}
  • 3. {{myClass::helper2 name}}
  • 4. {{myClass::helper2 value}}
  • 5. {{he name}}
  • 6. {{he value}}
  • 7. {{h2 name}}
  • 8. {{h2 value}}
  • 9. {{link name}}
  • 10. {{link value}}
  • 11. {{alink url text}}
  • 12. {{{alink url text}}}
  • VAREND , 'data' => Array('name' => 'John', 'value' => 10000, 'url' => 'http://yahoo.com', 'text' => 'You&Me!'), 'options' => Array( 'flags' => LightnCandy::FLAG_ERROR_LOG | LightnCandy::FLAG_HANDLEBARSJS, 'helpers' => Array( 'helper1', 'myClass::helper2', 'he' => 'helper1', 'h2' => 'myClass::helper2', 'link' => function ($arg) { if (is_array($arg)) { $arg = 'Array'; } return "click here"; }, 'alink', ) ), 'expected' => <<
  • 1. -Array-
  • 2. -Array-
  • 3. =Array=
  • 4. =Array=
  • 5. -Array-
  • 6. -Array-
  • 7. =Array=
  • 8. =Array=
  • 9. <a href="Array">click here</a>
  • 10. <a href="Array">click here</a>
  • 11. <a href="Array">Array</a>
  • 12. Array
  • VAREND ), Array( 'template' => '{{test.test}} == {{test.test3}}', 'data' => Array('test' => new myClass()), 'options' => Array('flags' => LightnCandy::FLAG_INSTANCE), 'expected' => "testMethod OK! == -- test3:Array\n(\n)\n", ), Array( 'template' => '{{test.test}} == {{test.bar}}', 'data' => Array('test' => new foo()), 'options' => Array('flags' => LightnCandy::FLAG_INSTANCE), 'expected' => ' == OK!', ), Array( 'template' => '{{#each foo}}{{@key}}: {{.}},{{/each}}', 'data' => Array('foo' => Array(1,'a'=>'b',5)), 'expected' => ': 1,: b,: 5,', ), Array( 'template' => '{{#each foo}}{{@key}}: {{.}},{{/each}}', 'data' => Array('foo' => Array(1,'a'=>'b',5)), 'options' => Array('flags' => LightnCandy::FLAG_SPVARS), 'expected' => '0: 1,a: b,1: 5,', ), Array( 'template' => '{{#each foo}}{{@key}}: {{.}},{{/each}}', 'data' => Array('foo' => new twoDimensionIterator(2, 3)), 'options' => Array('flags' => LightnCandy::FLAG_SPVARS), 'expected' => '0x0: 0,1x0: 0,0x1: 0,1x1: 1,0x2: 0,1x2: 2,', ), Array( 'template' => " {{#foo}}\n {{name}}\n{{/foo}}\n ", 'data' => Array('foo' => Array(Array('name' => 'A'),Array('name' => 'd'),Array('name' => 'E'))), 'options' => Array('flags' => LightnCandy::FLAG_MUSTACHESP), 'expected' => " A\n d\n E\n ", ), Array( 'template' => "{{bar}}\n {{#foo}}\n {{name}}\n{{/foo}}\n ", 'data' => Array('bar' => 'OK', 'foo' => Array(Array('name' => 'A'),Array('name' => 'd'),Array('name' => 'E'))), 'options' => Array('flags' => LightnCandy::FLAG_MUSTACHESP), 'expected' => "OK\n A\n d\n E\n ", ), Array( 'template' => " {{#if foo}}\nYES\n{{else}}\nNO\n{{/if}}\n", 'data' => null, 'options' => Array('flags' => LightnCandy::FLAG_MUSTACHESP | LightnCandy::FLAG_ELSE), 'expected' => "NO\n", ), Array( 'template' => " {{#each foo}}\n{{@key}}: {{.}}\n{{/each}}\nDONE", 'data' => Array('foo' => Array('a' => 'A', 'b' => 'BOY!')), 'options' => Array('flags' => LightnCandy::FLAG_SPVARS | LightnCandy::FLAG_MUSTACHESP), 'expected' => "a: A\nb: BOY!\nDONE", ), Array( 'template' => "{{>test1}}\n {{>test1}}\nDONE\n", 'data' => null, 'options' => Array( 'flags' => LightnCandy::FLAG_MUSTACHESP | LightnCandy::FLAG_MUSTACHEPAIN, 'partials' => Array('test1' => "1:A\n 2:B\n 3:C\n 4:D\n5:E\n"), ), 'expected' => "1:A\n 2:B\n 3:C\n 4:D\n5:E\n 1:A\n 2:B\n 3:C\n 4:D\n 5:E\nDONE\n", ), Array( 'template' => "{{>test1}}\n {{>test1}}\nDONE\n", 'data' => null, 'options' => Array( 'flags' => LightnCandy::FLAG_MUSTACHESP, 'partials' => Array('test1' => "1:A\n 2:B\n 3:C\n 4:D\n5:E\n"), ), 'expected' => "1:A\n 2:B\n 3:C\n 4:D\n5:E\n1:A\n 2:B\n 3:C\n 4:D\n5:E\nDONE\n", ), Array( 'template' => "{{>test1}}\n {{>test1}}\nDONE\n", 'data' => null, 'options' => Array( 'flags' => LightnCandy::FLAG_MUSTACHESP | LightnCandy::FLAG_RUNTIMEPARTIAL, 'partials' => Array('test1' => "1:A\n 2:B\n 3:C\n 4:D\n5:E\n"), ), 'expected' => "1:A\n 2:B\n 3:C\n 4:D\n5:E\n1:A\n 2:B\n 3:C\n 4:D\n5:E\nDONE\n", ), Array( 'template' => "ST:\n{{#foo}}\n {{>test1}}\n{{/foo}}\nOK\n", 'data' => Array('foo' => Array(1, 2)), 'options' => Array( 'flags' => LightnCandy::FLAG_MUSTACHESP | LightnCandy::FLAG_MUSTACHEPAIN | LightnCandy::FLAG_HANDLEBARSJS, 'partials' => Array('test1' => "1:A\n 2:B({{@index}})\n"), ), 'expected' => "ST:\n 1:A\n 2:B(0)\n 1:A\n 2:B(1)\nOK\n", ), Array( 'template' => "A\n {{#if 1}} \n\na\n{{#with 2}}\n123\n\n{{/with}}\n{{/if}} \n \n\n456", 'data' => null, 'options' => Array('flags' => LightnCandy::FLAG_WITH | LightnCandy::FLAG_MUSTACHESP), 'expected' => "A\n\na\n123\n\n \n\n456", ), Array( 'template' => "\n{{#with 1}}\n\n{{#with 1}}\nb\n\n{{/with}}\n{{/with}}\nC", 'data' => null, 'options' => Array('flags' => LightnCandy::FLAG_WITH | LightnCandy::FLAG_MUSTACHESP), 'expected' => "\n\nb\n\nC", ), Array( 'template' => ">{{helper1 \"===\"}}<", 'data' => null, 'options' => Array( 'flags' => LightnCandy::FLAG_HANDLEBARSJS, 'hbhelpers' => Array( 'helper1', ) ), 'expected' => ">-===-<", ), Array( 'template' => "{{foo}}", 'data' => Array('foo' => 'A&B " \''), 'options' => Array('flags' => LightnCandy::FLAG_NOESCAPE), 'expected' => "A&B \" '", ), Array( 'template' => "{{foo}}", 'data' => Array('foo' => 'A&B " \''), 'options' => null, 'expected' => "A&B " '", ), ); return array_map(function($i) { if (!isset($i['debug'])) { $i['debug'] = 0; } return Array($i); }, $issues); } } ?>