xref: /plugin/combo/vendor/salesforce/handlebars-php/tests/Handlebars/HandlebarsTest.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau
3*04fd306cSNickeau/**
4*04fd306cSNickeau * Class AutoloaderTest
5*04fd306cSNickeau */
6*04fd306cSNickeauclass HandlebarsTest extends PHPUnit\Framework\TestCase
7*04fd306cSNickeau{
8*04fd306cSNickeau    /**
9*04fd306cSNickeau     * Test handlebars autoloader
10*04fd306cSNickeau     *
11*04fd306cSNickeau     * @return void
12*04fd306cSNickeau     */
13*04fd306cSNickeau    public function testAutoLoad()
14*04fd306cSNickeau    {
15*04fd306cSNickeau        Handlebars\Autoloader::register(realpath(__DIR__ . '/../fixture/'));
16*04fd306cSNickeau
17*04fd306cSNickeau        $this->assertTrue(class_exists('Handlebars\\Test'));
18*04fd306cSNickeau        $this->assertTrue(class_exists('Handlebars\\Example\\Test'));
19*04fd306cSNickeau    }
20*04fd306cSNickeau
21*04fd306cSNickeau    /**
22*04fd306cSNickeau     * Test basic tags
23*04fd306cSNickeau     *
24*04fd306cSNickeau     * @param string $src    handlebars source
25*04fd306cSNickeau     * @param array  $data   data
26*04fd306cSNickeau     * @param string $result expected data
27*04fd306cSNickeau     *
28*04fd306cSNickeau     * @dataProvider simpleTagdataProvider
29*04fd306cSNickeau     *
30*04fd306cSNickeau     * @return void
31*04fd306cSNickeau     */
32*04fd306cSNickeau    public function testBasicTags($src, $data, $result)
33*04fd306cSNickeau    {
34*04fd306cSNickeau        $loader = new \Handlebars\Loader\StringLoader();
35*04fd306cSNickeau        $engine = new \Handlebars\Handlebars(array('loader' => $loader));
36*04fd306cSNickeau        $this->assertEquals($result, $engine->render($src, $data));
37*04fd306cSNickeau    }
38*04fd306cSNickeau
39*04fd306cSNickeau    /**
40*04fd306cSNickeau     * Simple tag provider
41*04fd306cSNickeau     *
42*04fd306cSNickeau     * @return array
43*04fd306cSNickeau     */
44*04fd306cSNickeau    public function simpleTagdataProvider()
45*04fd306cSNickeau    {
46*04fd306cSNickeau        return array(
47*04fd306cSNickeau            array(
48*04fd306cSNickeau                '{{! This is comment}}',
49*04fd306cSNickeau                array(),
50*04fd306cSNickeau                ''
51*04fd306cSNickeau            ),
52*04fd306cSNickeau            array(
53*04fd306cSNickeau                '{{data}}',
54*04fd306cSNickeau                array('data' => 'result'),
55*04fd306cSNickeau                'result'
56*04fd306cSNickeau            ),
57*04fd306cSNickeau            array(
58*04fd306cSNickeau                '{{data.key}}',
59*04fd306cSNickeau                array('data' => array('key' => 'result')),
60*04fd306cSNickeau                'result'
61*04fd306cSNickeau            ),
62*04fd306cSNickeau        );
63*04fd306cSNickeau    }
64*04fd306cSNickeau
65*04fd306cSNickeau
66*04fd306cSNickeau    /**
67*04fd306cSNickeau     * Test helpers (internal helpers)
68*04fd306cSNickeau     *
69*04fd306cSNickeau     * @param string $src    handlebars source
70*04fd306cSNickeau     * @param array  $data   data
71*04fd306cSNickeau     * @param string $result expected data
72*04fd306cSNickeau     *
73*04fd306cSNickeau     * @dataProvider internalHelpersdataProvider
74*04fd306cSNickeau     *
75*04fd306cSNickeau     * @return void
76*04fd306cSNickeau     */
77*04fd306cSNickeau    public function testSimpleHelpers($src, $data, $result)
78*04fd306cSNickeau    {
79*04fd306cSNickeau        $loader = new \Handlebars\Loader\StringLoader();
80*04fd306cSNickeau        $helpers = new \Handlebars\Helpers();
81*04fd306cSNickeau        $engine = new \Handlebars\Handlebars(array('loader' => $loader, 'helpers' => $helpers));
82*04fd306cSNickeau
83*04fd306cSNickeau        $this->assertEquals($result, $engine->render($src, $data));
84*04fd306cSNickeau    }
85*04fd306cSNickeau
86*04fd306cSNickeau    /**
87*04fd306cSNickeau     * Simple helpers provider
88*04fd306cSNickeau     *
89*04fd306cSNickeau     * @return array
90*04fd306cSNickeau     */
91*04fd306cSNickeau    public function internalHelpersdataProvider()
92*04fd306cSNickeau    {
93*04fd306cSNickeau        return [
94*04fd306cSNickeau            [
95*04fd306cSNickeau                '{{#if data}}Yes{{/if}}',
96*04fd306cSNickeau                ['data' => true],
97*04fd306cSNickeau                'Yes'
98*04fd306cSNickeau            ],
99*04fd306cSNickeau            [
100*04fd306cSNickeau                '{{#if data}}Yes{{/if}}',
101*04fd306cSNickeau                ['data' => false],
102*04fd306cSNickeau                ''
103*04fd306cSNickeau            ],
104*04fd306cSNickeau            [
105*04fd306cSNickeau                '{{#unless data}}OK{{/unless}}',
106*04fd306cSNickeau                ['data' => false],
107*04fd306cSNickeau                'OK'
108*04fd306cSNickeau            ],
109*04fd306cSNickeau            [
110*04fd306cSNickeau                '{{#unless data}}OK {{else}}I believe{{/unless}}',
111*04fd306cSNickeau                ['data' => true],
112*04fd306cSNickeau                'I believe'
113*04fd306cSNickeau            ],
114*04fd306cSNickeau            [
115*04fd306cSNickeau                '{{#with data}}{{key}}{{/with}}',
116*04fd306cSNickeau                ['data' => ['key' => 'result']],
117*04fd306cSNickeau                'result'
118*04fd306cSNickeau            ],
119*04fd306cSNickeau            [
120*04fd306cSNickeau                '{{#each data}}{{this}}{{/each}}',
121*04fd306cSNickeau                ['data' => [1, 2, 3, 4]],
122*04fd306cSNickeau                '1234'
123*04fd306cSNickeau            ],
124*04fd306cSNickeau            [
125*04fd306cSNickeau                '{{#each data[0:2]}}{{this}}{{/each}}',
126*04fd306cSNickeau                ['data' => [1, 2, 3, 4]],
127*04fd306cSNickeau                '12'
128*04fd306cSNickeau            ],
129*04fd306cSNickeau            [
130*04fd306cSNickeau                '{{#each data[1:2]}}{{this}}{{/each}}',
131*04fd306cSNickeau                ['data' => [1, 2, 3, 4]],
132*04fd306cSNickeau                '23'
133*04fd306cSNickeau            ],
134*04fd306cSNickeau            [
135*04fd306cSNickeau                '{{#upper data}}',
136*04fd306cSNickeau                ['data' => "hello"],
137*04fd306cSNickeau                'HELLO'
138*04fd306cSNickeau            ],
139*04fd306cSNickeau            [
140*04fd306cSNickeau                '{{#lower data}}',
141*04fd306cSNickeau                ['data' => "HELlO"],
142*04fd306cSNickeau                'hello'
143*04fd306cSNickeau            ],
144*04fd306cSNickeau            [
145*04fd306cSNickeau                '{{#capitalize data}}',
146*04fd306cSNickeau                ['data' => "hello"],
147*04fd306cSNickeau                'Hello'
148*04fd306cSNickeau            ],
149*04fd306cSNickeau            [
150*04fd306cSNickeau                '{{#capitalize_words data}}',
151*04fd306cSNickeau                ['data' => "hello world"],
152*04fd306cSNickeau                'Hello World'
153*04fd306cSNickeau            ],
154*04fd306cSNickeau            [
155*04fd306cSNickeau                '{{#reverse data}}',
156*04fd306cSNickeau                ['data' => "hello"],
157*04fd306cSNickeau                'olleh'
158*04fd306cSNickeau            ],
159*04fd306cSNickeau            [
160*04fd306cSNickeau                "{{#inflect count 'album' 'albums' }}",
161*04fd306cSNickeau                ["count" => 1],
162*04fd306cSNickeau                'album'
163*04fd306cSNickeau            ],
164*04fd306cSNickeau            [
165*04fd306cSNickeau                "{{#inflect count 'album' 'albums' }}",
166*04fd306cSNickeau                ["count" => 10],
167*04fd306cSNickeau                'albums'
168*04fd306cSNickeau            ],
169*04fd306cSNickeau            [
170*04fd306cSNickeau                "{{#inflect count '%d album' '%d albums' }}",
171*04fd306cSNickeau                ["count" => 1],
172*04fd306cSNickeau                '1 album'
173*04fd306cSNickeau            ],
174*04fd306cSNickeau            [
175*04fd306cSNickeau                "{{#inflect count '%d album' '%d albums' }}",
176*04fd306cSNickeau                ["count" => 10],
177*04fd306cSNickeau                '10 albums'
178*04fd306cSNickeau            ],
179*04fd306cSNickeau            [
180*04fd306cSNickeau                "{{#default data 'OK' }}",
181*04fd306cSNickeau                ["data" => "hello"],
182*04fd306cSNickeau                'hello'
183*04fd306cSNickeau            ],
184*04fd306cSNickeau            [
185*04fd306cSNickeau                "{{#default data 'OK' }}",
186*04fd306cSNickeau                [],
187*04fd306cSNickeau                'OK'
188*04fd306cSNickeau            ],
189*04fd306cSNickeau            [
190*04fd306cSNickeau                "{{#truncate data 8 '...'}}",
191*04fd306cSNickeau                ["data" => "Hello World! How are you?"],
192*04fd306cSNickeau                'Hello Wo...'
193*04fd306cSNickeau            ],
194*04fd306cSNickeau            [
195*04fd306cSNickeau                "{{#raw}}I'm raw {{data}}{{/raw}}",
196*04fd306cSNickeau                ["data" => "raw to be included, but won't :)"],
197*04fd306cSNickeau                "I'm raw {{data}}"
198*04fd306cSNickeau            ],
199*04fd306cSNickeau            [
200*04fd306cSNickeau                "{{#repeat 3}}Yes {{/repeat}}",
201*04fd306cSNickeau                [],
202*04fd306cSNickeau                "Yes Yes Yes "
203*04fd306cSNickeau            ],
204*04fd306cSNickeau            [
205*04fd306cSNickeau                "{{#repeat 4}}Nice {{data}} {{/repeat}}",
206*04fd306cSNickeau                ["data" => "Daddy!"],
207*04fd306cSNickeau                "Nice Daddy! Nice Daddy! Nice Daddy! Nice Daddy! "
208*04fd306cSNickeau            ],
209*04fd306cSNickeau            [
210*04fd306cSNickeau                "{{#define test}}I'm Defined and Invoked{{/define}}{{#invoke test}}",
211*04fd306cSNickeau                [],
212*04fd306cSNickeau                "I'm Defined and Invoked"
213*04fd306cSNickeau            ],
214*04fd306cSNickeau        ];
215*04fd306cSNickeau    }
216*04fd306cSNickeau
217*04fd306cSNickeau    /**
218*04fd306cSNickeau     * @param string $src
219*04fd306cSNickeau     * @param array $data
220*04fd306cSNickeau     * @param string $result
221*04fd306cSNickeau     * @param bool $enableDataVariables
222*04fd306cSNickeau     * @dataProvider internalDataVariablesDataProvider
223*04fd306cSNickeau     */
224*04fd306cSNickeau    public function testDataVariables($src, $data, $result, $enableDataVariables)
225*04fd306cSNickeau    {
226*04fd306cSNickeau        $loader = new \Handlebars\Loader\StringLoader();
227*04fd306cSNickeau        $helpers = new \Handlebars\Helpers();
228*04fd306cSNickeau        $engine = new \Handlebars\Handlebars(array(
229*04fd306cSNickeau            'loader' => $loader,
230*04fd306cSNickeau            'helpers' => $helpers,
231*04fd306cSNickeau            'enableDataVariables'=> $enableDataVariables,
232*04fd306cSNickeau        ));
233*04fd306cSNickeau
234*04fd306cSNickeau        $this->assertEquals($result, $engine->render($src, $data));
235*04fd306cSNickeau    }
236*04fd306cSNickeau
237*04fd306cSNickeau    public function testDataVariables1()
238*04fd306cSNickeau    {
239*04fd306cSNickeau        $object = new stdClass;
240*04fd306cSNickeau        $object->{'@first'} = 'apple';
241*04fd306cSNickeau        $object->{'@last'} = 'banana';
242*04fd306cSNickeau        $object->{'@index'} = 'carrot';
243*04fd306cSNickeau        $object->{'@unknown'} = 'zucchini';
244*04fd306cSNickeau        $data = ['data' => [$object]];
245*04fd306cSNickeau        $engine = new \Handlebars\Handlebars(array(
246*04fd306cSNickeau            'loader' => new \Handlebars\Loader\StringLoader(),
247*04fd306cSNickeau            'helpers' => new \Handlebars\Helpers(),
248*04fd306cSNickeau            'enableDataVariables'=> false,
249*04fd306cSNickeau        ));
250*04fd306cSNickeau        $template = "{{#each data}}{{@first}}, {{@last}}, {{@index}}, {{@unknown}}{{/each}}";
251*04fd306cSNickeau
252*04fd306cSNickeau        $this->assertEquals('apple, banana, 0, zucchini', $engine->render($template, $data));
253*04fd306cSNickeau    }
254*04fd306cSNickeau
255*04fd306cSNickeau    /**
256*04fd306cSNickeau     * Data provider for data variables
257*04fd306cSNickeau     * @return array
258*04fd306cSNickeau     */
259*04fd306cSNickeau    public function internalDataVariablesDataProvider()
260*04fd306cSNickeau    {
261*04fd306cSNickeau        // Build a standard set of objects to test against
262*04fd306cSNickeau        $keyPropertyName = '@key';
263*04fd306cSNickeau        $firstPropertyName = '@first';
264*04fd306cSNickeau        $lastPropertyName = '@last';
265*04fd306cSNickeau        $unknownPropertyName = '@unknown';
266*04fd306cSNickeau        $objects = [];
267*04fd306cSNickeau        foreach (['apple', 'banana', 'carrot', 'zucchini'] as $itemValue) {
268*04fd306cSNickeau            $object = new stdClass();
269*04fd306cSNickeau            $object->$keyPropertyName = $itemValue;
270*04fd306cSNickeau            $object->$firstPropertyName = $itemValue;
271*04fd306cSNickeau            $object->$lastPropertyName = $itemValue;
272*04fd306cSNickeau            $object->$unknownPropertyName = $itemValue;
273*04fd306cSNickeau            $objects[] = $object;
274*04fd306cSNickeau        }
275*04fd306cSNickeau
276*04fd306cSNickeau        // Build a list of scenarios. These will be used later to build fanned out scenarios that will be used against
277*04fd306cSNickeau        // the test. Each entry represents two different tests: (1) when enableDataVariables is enabled and (2) not enabled.
278*04fd306cSNickeau        $scenarios = [
279*04fd306cSNickeau            [
280*04fd306cSNickeau                'src' => '{{#each data}}{{@index}}{{/each}}',
281*04fd306cSNickeau                'data' => ['data' => ['apple', 'banana', 'carrot', 'zucchini']],
282*04fd306cSNickeau                // @index should work the same regardless of the feature flag
283*04fd306cSNickeau                'outputNotEnabled' => '0123',
284*04fd306cSNickeau                'outputEnabled' => '0123',
285*04fd306cSNickeau            ],
286*04fd306cSNickeau            [
287*04fd306cSNickeau                'src' => '{{#each data}}{{@key}}{{/each}}',
288*04fd306cSNickeau                'data' => ['data' => ['apple', 'banana', 'carrot', 'zucchini']],
289*04fd306cSNickeau                'outputNotEnabled' => '',
290*04fd306cSNickeau                'outputEnabled' => '0123'
291*04fd306cSNickeau            ],
292*04fd306cSNickeau            [
293*04fd306cSNickeau                'src' => '{{#each data}}{{#each this}}outer: {{@../key}},inner: {{@key}};{{/each}}{{/each}}',
294*04fd306cSNickeau                'data' => ['data' => [['apple', 'banana'], ['carrot', 'zucchini']]],
295*04fd306cSNickeau                'outputNotEnabled' => 'outer: ,inner: ;outer: ,inner: ;outer: ,inner: ;outer: ,inner: ;',
296*04fd306cSNickeau                'outputEnabled' => 'outer: 0,inner: 0;outer: 0,inner: 1;outer: 1,inner: 0;outer: 1,inner: 1;',
297*04fd306cSNickeau            ],
298*04fd306cSNickeau            [
299*04fd306cSNickeau                'src' => '{{#each data}}{{#if @first}}true{{else}}false{{/if}}{{/each}}',
300*04fd306cSNickeau                'data' => ['data' => ['apple', 'banana', 'carrot', 'zucchini']],
301*04fd306cSNickeau                'outputNotEnabled' => 'falsefalsefalsefalse',
302*04fd306cSNickeau                'outputEnabled' => 'truefalsefalsefalse',
303*04fd306cSNickeau            ],
304*04fd306cSNickeau            [
305*04fd306cSNickeau                'src' => '{{#each data}}{{@first}}{{/each}}',
306*04fd306cSNickeau                'data' => ['data' => ['apple', 'banana', 'carrot', 'zucchini']],
307*04fd306cSNickeau                'outputNotEnabled' => '',
308*04fd306cSNickeau                'outputEnabled' => 'truefalsefalsefalse',
309*04fd306cSNickeau            ],
310*04fd306cSNickeau            [
311*04fd306cSNickeau                'src' => '{{#each data}}{{#each this}}outer: {{@../first}},inner: {{@first}};{{/each}}{{/each}}',
312*04fd306cSNickeau                'data' => ['data' => [['apple', 'banana'], ['carrot', 'zucchini']]],
313*04fd306cSNickeau                'outputNotEnabled' => 'outer: ,inner: ;outer: ,inner: ;outer: ,inner: ;outer: ,inner: ;',
314*04fd306cSNickeau                'outputEnabled' => 'outer: true,inner: true;outer: true,inner: false;outer: false,inner: true;outer: false,inner: false;',
315*04fd306cSNickeau            ],
316*04fd306cSNickeau            [
317*04fd306cSNickeau                'src' => '{{#each data}}{{#if @last}}true{{else}}false{{/if}}{{/each}}',
318*04fd306cSNickeau                'data' => ['data' => ['apple', 'banana', 'carrot', 'zucchini']],
319*04fd306cSNickeau                'outputNotEnabled' => 'falsefalsefalsefalse',
320*04fd306cSNickeau                'outputEnabled' => 'falsefalsefalsetrue'
321*04fd306cSNickeau            ],
322*04fd306cSNickeau            [
323*04fd306cSNickeau                'src' => '{{#each data}}{{@last}}{{/each}}',
324*04fd306cSNickeau                'data' => ['data' => ['apple', 'banana', 'carrot', 'zucchini']],
325*04fd306cSNickeau                'outputNotEnabled' => '',
326*04fd306cSNickeau                'outputEnabled' => 'falsefalsefalsetrue'
327*04fd306cSNickeau            ],
328*04fd306cSNickeau            [
329*04fd306cSNickeau                'src' => '{{#each data}}{{#each this}}outer: {{@../last}},inner: {{@last}};{{/each}}{{/each}}',
330*04fd306cSNickeau                'data' => ['data' => [['apple', 'banana'], ['carrot', 'zucchini']]],
331*04fd306cSNickeau                'outputNotEnabled' => 'outer: ,inner: ;outer: ,inner: ;outer: ,inner: ;outer: ,inner: ;',
332*04fd306cSNickeau                'outputEnabled' => 'outer: false,inner: false;outer: false,inner: true;outer: true,inner: false;outer: true,inner: true;'
333*04fd306cSNickeau            ],
334*04fd306cSNickeau            [
335*04fd306cSNickeau                // @index variables are ignored and the data variable is used
336*04fd306cSNickeau                'src' => '{{#each data}}{{@index}}{{/each}}',
337*04fd306cSNickeau                'data' => ['data' => [['@index' => 'apple'], ['@index' => 'banana'], ['@index' => 'carrot'], ['@index' => 'zucchini']]],
338*04fd306cSNickeau                'outputNotEnabled' => '0123',
339*04fd306cSNickeau                'outputEnabled' => '0123'
340*04fd306cSNickeau            ],
341*04fd306cSNickeau            [
342*04fd306cSNickeau                // @key variables are ignored and the data variable is used
343*04fd306cSNickeau                'src' => '{{#each data}}{{@index}}{{/each}}',
344*04fd306cSNickeau                'data' => ['data' => $objects],
345*04fd306cSNickeau                'outputNotEnabled' => '0123',
346*04fd306cSNickeau                'outputEnabled' => '0123'
347*04fd306cSNickeau            ],
348*04fd306cSNickeau            [
349*04fd306cSNickeau                // @first variables are used when data variables are not enabled.
350*04fd306cSNickeau                'src' => '{{#each data}}{{@first}}{{/each}}',
351*04fd306cSNickeau                'data' => ['data' => $objects],
352*04fd306cSNickeau                'outputNotEnabled' => 'applebananacarrotzucchini',
353*04fd306cSNickeau                'outputEnabled' => 'truefalsefalsefalse'
354*04fd306cSNickeau            ],
355*04fd306cSNickeau            [
356*04fd306cSNickeau                // @last variables are used when data variables are not enabled.
357*04fd306cSNickeau                'src' => '{{#each data}}{{@last}}{{/each}}',
358*04fd306cSNickeau                'data' => ['data' => $objects],
359*04fd306cSNickeau                'outputNotEnabled' => 'applebananacarrotzucchini',
360*04fd306cSNickeau                'outputEnabled' => 'falsefalsefalsetrue'
361*04fd306cSNickeau            ],
362*04fd306cSNickeau            [
363*04fd306cSNickeau                // @unknown variables are used when data variables are not enabled however since "unknown" is not a valid
364*04fd306cSNickeau                // value it should ignored.
365*04fd306cSNickeau                'src' => '{{#each data}}{{@unknown}}{{/each}}',
366*04fd306cSNickeau                'data' => ['data' => $objects],
367*04fd306cSNickeau                'outputNotEnabled' => 'applebananacarrotzucchini',
368*04fd306cSNickeau                'outputEnabled' => ''
369*04fd306cSNickeau            ],
370*04fd306cSNickeau            [
371*04fd306cSNickeau                'src' => '{{#each data}}{{@key}}{{/each}}',
372*04fd306cSNickeau                'data' => ['data' => ['fruit' => 'apple', '19' => 'banana', 'true' => 'carrot']],
373*04fd306cSNickeau                'outputNotEnabled' => 'fruit19true',
374*04fd306cSNickeau                'outputEnabled' => 'fruit19true',
375*04fd306cSNickeau            ],
376*04fd306cSNickeau        ];
377*04fd306cSNickeau
378*04fd306cSNickeau        // Build out a test case for when the enableDataVariables feature is enabled and when it's not
379*04fd306cSNickeau        $fannedOutScenarios = [];
380*04fd306cSNickeau        foreach ($scenarios as $scenario) {
381*04fd306cSNickeau            $fannedOutScenarios['not enabled: ' . $scenario['src']] = [
382*04fd306cSNickeau                $scenario['src'],
383*04fd306cSNickeau                $scenario['data'],
384*04fd306cSNickeau                $scenario['outputNotEnabled'],
385*04fd306cSNickeau                false,
386*04fd306cSNickeau            ];
387*04fd306cSNickeau            $fannedOutScenarios['enabled: ' . $scenario['src']] = [
388*04fd306cSNickeau                $scenario['src'],
389*04fd306cSNickeau                $scenario['data'],
390*04fd306cSNickeau                $scenario['outputEnabled'],
391*04fd306cSNickeau                true,
392*04fd306cSNickeau            ];
393*04fd306cSNickeau        }
394*04fd306cSNickeau        return $fannedOutScenarios;
395*04fd306cSNickeau    }
396*04fd306cSNickeau
397*04fd306cSNickeau    /**
398*04fd306cSNickeau     * Management helpers
399*04fd306cSNickeau     */
400*04fd306cSNickeau    public function testHelpersManagement()
401*04fd306cSNickeau    {
402*04fd306cSNickeau        $helpers = new \Handlebars\Helpers(array('test' => function () {
403*04fd306cSNickeau        }), false);
404*04fd306cSNickeau        $engine = new \Handlebars\Handlebars(array('helpers' => $helpers));
405*04fd306cSNickeau        $this->assertTrue(is_callable($engine->getHelper('test')));
406*04fd306cSNickeau        $this->assertTrue($engine->hasHelper('test'));
407*04fd306cSNickeau        $engine->removeHelper('test');
408*04fd306cSNickeau        $this->assertFalse($engine->hasHelper('test'));
409*04fd306cSNickeau    }
410*04fd306cSNickeau
411*04fd306cSNickeau    /**
412*04fd306cSNickeau     * Custom helper test
413*04fd306cSNickeau     */
414*04fd306cSNickeau    public function testCustomHelper()
415*04fd306cSNickeau    {
416*04fd306cSNickeau        $loader = new \Handlebars\Loader\StringLoader();
417*04fd306cSNickeau        $engine = new \Handlebars\Handlebars(array('loader' => $loader));
418*04fd306cSNickeau        $engine->addHelper('test', function () {
419*04fd306cSNickeau            return 'Test helper is called';
420*04fd306cSNickeau        });
421*04fd306cSNickeau        $this->assertEquals('Test helper is called', $engine->render('{{#test}}', []));
422*04fd306cSNickeau    }
423*04fd306cSNickeau
424*04fd306cSNickeau    /**
425*04fd306cSNickeau     * @param $dir
426*04fd306cSNickeau     *
427*04fd306cSNickeau     * @return bool
428*04fd306cSNickeau     */
429*04fd306cSNickeau    private function delTree($dir)
430*04fd306cSNickeau    {
431*04fd306cSNickeau        $contents = scandir($dir);
432*04fd306cSNickeau        if ($contents === false) {
433*04fd306cSNickeau            return;
434*04fd306cSNickeau        }
435*04fd306cSNickeau        $files = array_diff($contents, array('.', '..'));
436*04fd306cSNickeau        foreach ($files as $file) {
437*04fd306cSNickeau            (is_dir("$dir/$file")) ? delTree("$dir/$file") : unlink("$dir/$file");
438*04fd306cSNickeau        }
439*04fd306cSNickeau
440*04fd306cSNickeau        return rmdir($dir);
441*04fd306cSNickeau    }
442*04fd306cSNickeau
443*04fd306cSNickeau    /**
444*04fd306cSNickeau     * Its not a good test :) but ok
445*04fd306cSNickeau     */
446*04fd306cSNickeau    public function testCacheSystem()
447*04fd306cSNickeau    {
448*04fd306cSNickeau        $path = sys_get_temp_dir() . '/__cache__handlebars';
449*04fd306cSNickeau
450*04fd306cSNickeau        @$this->delTree($path);
451*04fd306cSNickeau
452*04fd306cSNickeau        $dummy = new \Handlebars\Cache\Disk($path);
453*04fd306cSNickeau        $engine = new \Handlebars\Handlebars(array('cache' => $dummy));
454*04fd306cSNickeau        $this->assertEquals(0, count(glob($path . '/*')));
455*04fd306cSNickeau        $engine->render('test', array());
456*04fd306cSNickeau        $this->assertEquals(1, count(glob($path . '/*')));
457*04fd306cSNickeau    }
458*04fd306cSNickeau}
459