mirror of
				https://github.com/Mibew/handlebars.php.git
				synced 2025-11-04 12:05:09 +03:00 
			
		
		
		
	better registerHelper Tests
This commit is contained in:
		
							parent
							
								
									08f4328f9d
								
							
						
					
					
						commit
						407732cef3
					
				@ -438,29 +438,230 @@ class HandlebarsTest extends \PHPUnit_Framework_TestCase
 | 
				
			|||||||
        $this->setExpectedException('InvalidArgumentException');
 | 
					        $this->setExpectedException('InvalidArgumentException');
 | 
				
			||||||
        $engine->getHelpers()->call('invalid', $engine->loadTemplate(''), new \Handlebars\Context(), '', '');
 | 
					        $engine->getHelpers()->call('invalid', $engine->loadTemplate(''), new \Handlebars\Context(), '', '');
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
	
 | 
					    
 | 
				
			||||||
	public function testRegisterHelper()
 | 
					    public function testRegisterHelper()
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $template = '{{#grand test "test2"}}  In 1: {{test4}} {{#grand ../test \'test3\'}} In 2: {{test5}}{{#parent}}  In 3: {{test6}}  {{../../../test}}{{/parent}}{{/grand}}{{/grand}}';
 | 
					        $loader = new \Handlebars\Loader\StringLoader();
 | 
				
			||||||
        $vars = array('test' => 'Hello World');
 | 
					 | 
				
			||||||
        $expected = '  In 1: Hello World  In 2: This is Test 5  In 3: This is Test 6  Hello World';
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		$loader = new \Handlebars\Loader\StringLoader();
 | 
					 | 
				
			||||||
        $engine = new \Handlebars\Handlebars(array('loader' => $loader));
 | 
					        $engine = new \Handlebars\Handlebars(array('loader' => $loader));
 | 
				
			||||||
 | 
					        //date_default_timezone_set('GMT');
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
		$engine->registerHelper('grand', function($test1, $test2, $options) {
 | 
					        //FIRST UP: some awesome helpers!!
 | 
				
			||||||
			return $options['fn'](array(
 | 
					        
 | 
				
			||||||
				'test4' => $test1,
 | 
					        //translations
 | 
				
			||||||
				'test5' => 'This is Test 5'
 | 
					        $translations = array(
 | 
				
			||||||
			));
 | 
					            'hello' => 'bonjour',
 | 
				
			||||||
		});
 | 
					            'my name is %s' => 'mon nom est %s',
 | 
				
			||||||
		
 | 
					            'how are your %s kids and %s' => 'comment sont les enfants de votre %s et %s'
 | 
				
			||||||
		$engine->registerHelper('parent', function($options) {
 | 
					        );
 | 
				
			||||||
			return $options['fn'](array('test6' => 'This is Test 6'));
 | 
					        
 | 
				
			||||||
		});
 | 
					        //i18n
 | 
				
			||||||
		
 | 
					        $engine->registerHelper('_', function($key) use ($translations) {
 | 
				
			||||||
		
 | 
					            $args = func_get_args();
 | 
				
			||||||
        $this->assertEquals($expected, $engine->render($template, $vars));
 | 
					            $key = array_shift($args);
 | 
				
			||||||
 | 
					            $options = array_pop($args);
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            //make sure it's a string
 | 
				
			||||||
 | 
					            $key = (string) $key;
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            //by default the translation is the key
 | 
				
			||||||
 | 
					            $translation = $key;
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            //if there is a translation
 | 
				
			||||||
 | 
					            if(isset($translations[$key])) {
 | 
				
			||||||
 | 
					                //translate it
 | 
				
			||||||
 | 
					                $translation = $translations[$key];
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            //if there are more arguments
 | 
				
			||||||
 | 
					            if(!empty($args)) {
 | 
				
			||||||
 | 
					                //it means the translations was 
 | 
				
			||||||
 | 
					                //something like 'Hello %s'
 | 
				
			||||||
 | 
					                return vsprintf($translation, $args);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            //just return what we got
 | 
				
			||||||
 | 
					            return $translation;
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        //create a better if helper
 | 
				
			||||||
 | 
					        $engine->registerHelper('when', function($value1, $operator, $value2, $options) {
 | 
				
			||||||
 | 
					            //make sure value 1 is scalar 
 | 
				
			||||||
 | 
					            if(is_object($value1) && method_exists($value1, '__toString')) {
 | 
				
			||||||
 | 
					                $value1 = (string) $value1;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            //make sure operator is scalar 
 | 
				
			||||||
 | 
					            if(is_object($operator) && method_exists($operator, '__toString')) {
 | 
				
			||||||
 | 
					                $operator = (string) $operator;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            //make sure value 2 is scalar 
 | 
				
			||||||
 | 
					            if(is_object($value2) && method_exists($value2, '__toString')) {
 | 
				
			||||||
 | 
					                $value2 = (string) $value2;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            $valid = false;
 | 
				
			||||||
 | 
					            //the amazing reverse switch!
 | 
				
			||||||
 | 
					            switch (true) {
 | 
				
			||||||
 | 
					                case $operator == 'eq' && $value1 == $value2:
 | 
				
			||||||
 | 
					                case $operator == '==' && $value1 == $value2:
 | 
				
			||||||
 | 
					                case $operator == 'req' && $value1 === $value2:
 | 
				
			||||||
 | 
					                case $operator == '===' && $value1 === $value2:
 | 
				
			||||||
 | 
					                case $operator == 'neq' && $value1 != $value2:
 | 
				
			||||||
 | 
					                case $operator == '!=' && $value1 != $value2:
 | 
				
			||||||
 | 
					                case $operator == 'rneq' && $value1 !== $value2:
 | 
				
			||||||
 | 
					                case $operator == '!==' && $value1 !== $value2:
 | 
				
			||||||
 | 
					                case $operator == 'lt' && $value1 < $value2:
 | 
				
			||||||
 | 
					                case $operator == '<' && $value1 < $value2:
 | 
				
			||||||
 | 
					                case $operator == 'lte' && $value1 <= $value2:
 | 
				
			||||||
 | 
					                case $operator == '<=' && $value1 <= $value2:
 | 
				
			||||||
 | 
					                case $operator == 'gt' && $value1 > $value2:
 | 
				
			||||||
 | 
					                case $operator == '>' && $value1 > $value2:
 | 
				
			||||||
 | 
					                case $operator == 'gte' && $value1 >= $value2:
 | 
				
			||||||
 | 
					                case $operator == '>=' && $value1 >= $value2:
 | 
				
			||||||
 | 
					                case $operator == 'and' && $value1 && $value2: 
 | 
				
			||||||
 | 
					                case $operator == '&&' && ($value1 && $value2):
 | 
				
			||||||
 | 
					                case $operator == 'or' && ($value1 || $value2):
 | 
				
			||||||
 | 
					                case $operator == '||' && ($value1 || $value2):
 | 
				
			||||||
 | 
					                    $valid = true;
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            if($valid) {
 | 
				
			||||||
 | 
					                return $options['fn']();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					            return $options['inverse']();
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        //a loop helper
 | 
				
			||||||
 | 
					        $engine->registerHelper('loop', function($object, $options) {
 | 
				
			||||||
 | 
					            //expected for subtemplates of this block to use
 | 
				
			||||||
 | 
					            //  {{value.profile_name}} vs {{profile_name}}
 | 
				
			||||||
 | 
					            //  {{key}} vs {{@index}}
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            $i = 0;
 | 
				
			||||||
 | 
					            $buffer = array();
 | 
				
			||||||
 | 
					            $total = count($object);
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            //loop through the object
 | 
				
			||||||
 | 
					            foreach($object as $key => $value) {
 | 
				
			||||||
 | 
					                //call the sub template and 
 | 
				
			||||||
 | 
					                //add it to the buffer
 | 
				
			||||||
 | 
					                $buffer[] = $options['fn'](array(
 | 
				
			||||||
 | 
					                    'key'    => $key,
 | 
				
			||||||
 | 
					                    'value'    => $value,
 | 
				
			||||||
 | 
					                    'last'    => ++$i === $total
 | 
				
			||||||
 | 
					                ));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            return implode('', $buffer);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        //array in
 | 
				
			||||||
 | 
					        $engine->registerHelper('in', function(array $array, $key, $options) {
 | 
				
			||||||
 | 
					            //make sure key is scalar 
 | 
				
			||||||
 | 
					            if(is_object($key) && method_exists($key, '__toString')) {
 | 
				
			||||||
 | 
					                $key = (string) $key;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            if(in_array($key, $array)) {
 | 
				
			||||||
 | 
					                return $options['fn']();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return $options['inverse']();
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        //converts date formats to other formats
 | 
				
			||||||
 | 
					        $engine->registerHelper('date', function($time, $format, $options) {
 | 
				
			||||||
 | 
					            //make sure time is scalar 
 | 
				
			||||||
 | 
					            if(is_object($time) && method_exists($time, '__toString')) {
 | 
				
			||||||
 | 
					                $time = (string) $time;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            //make sure format is scalar 
 | 
				
			||||||
 | 
					            if(is_object($format) && method_exists($format, '__toString')) {
 | 
				
			||||||
 | 
					                $format = (string) $format;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            return date($format, strtotime($time));
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        //nesting helpers, these don't really help anyone :)
 | 
				
			||||||
 | 
					        $engine->registerHelper('nested1', function($test1, $test2, $options) {
 | 
				
			||||||
 | 
					            return $options['fn'](array(
 | 
				
			||||||
 | 
					                'test4' => $test1,
 | 
				
			||||||
 | 
					                'test5' => 'This is Test 5'
 | 
				
			||||||
 | 
					            ));
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        $engine->registerHelper('nested2', function($options) {
 | 
				
			||||||
 | 
					            return $options['fn'](array('test6' => 'This is Test 6'));
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        //NEXT UP: some practical case studies
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        //case 1
 | 
				
			||||||
 | 
					        $variable1 = array();
 | 
				
			||||||
 | 
					        $template1 = "{{_ 'hello'}}, {{_ 'my name is %s' 'Foo'}}! {{_ 'how are your %s kids and %s' '6' 'dog'}}?";
 | 
				
			||||||
 | 
					        $expected1 = 'bonjour, mon nom est Foo! comment sont les enfants de votre 6 et dog?';
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        //case 2
 | 
				
			||||||
 | 
					        $variable2 = array('gender' => 'female');
 | 
				
			||||||
 | 
					        $template2 = "Hello {{#when gender '===' 'male'}}sir{{else}}maam{{/when}}";
 | 
				
			||||||
 | 
					        $expected2 = 'Hello maam';
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        //case 3
 | 
				
			||||||
 | 
					        $variable3 = array('gender' => 'male');
 | 
				
			||||||
 | 
					        $template3 = "Hello {{#when gender '===' 'male'}}sir{{else}}maam{{/when}}";
 | 
				
			||||||
 | 
					        $expected3 = 'Hello sir';
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        //case 4
 | 
				
			||||||
 | 
					        $variable4 = array(
 | 
				
			||||||
 | 
					            'rows' => array(
 | 
				
			||||||
 | 
					                array(
 | 
				
			||||||
 | 
					                    'profile_name' => 'Jane Doe',
 | 
				
			||||||
 | 
					                    'profile_created' => '2014-04-04 00:00:00'
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
 | 
					                array(
 | 
				
			||||||
 | 
					                    'profile_name' => 'John Doe',
 | 
				
			||||||
 | 
					                    'profile_created' => '2015-01-21 00:00:00'
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					        $template4 = "{{#loop rows}}<li>{{value.profile_name}} - {{date value.profile_created 'M d'}}</li>{{/loop}}";
 | 
				
			||||||
 | 
					        $expected4 = '<li>Jane Doe - Apr 04</li><li>John Doe - Jan 21</li>';
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        //case 5
 | 
				
			||||||
 | 
					        $variable5 = $variable4;
 | 
				
			||||||
 | 
					        $variable5['me'] = 'Jack Doe';
 | 
				
			||||||
 | 
					        $variable5['admins'] = array('Jane Doe', 'John Doe');
 | 
				
			||||||
 | 
					        $template5 = "{{#in admins me}}<ul>".$template4."</ul>{{else}}No Access{{/in}}";
 | 
				
			||||||
 | 
					        $expected5 = 'No Access';
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        //case 6
 | 
				
			||||||
 | 
					        $variable6 = $variable5;
 | 
				
			||||||
 | 
					        $variable6['me'] = 'Jane Doe';
 | 
				
			||||||
 | 
					        $template6 = $template5;
 | 
				
			||||||
 | 
					        $expected6 = '<ul><li>Jane Doe - Apr 04</li><li>John Doe - Jan 21</li></ul>';
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        //case 7
 | 
				
			||||||
 | 
					        $variable7 = array('test' => 'Hello World');
 | 
				
			||||||
 | 
					        $template7 = '{{#nested1 test "test2"}}  '
 | 
				
			||||||
 | 
					            .'In 1: {{test4}} {{#nested1 ../test \'test3\'}} '
 | 
				
			||||||
 | 
					            .'In 2: {{test5}}{{#nested2}}  '
 | 
				
			||||||
 | 
					            .'In 3: {{test6}}  {{../../../test}}{{/nested2}}{{/nested1}}{{/nested1}}';
 | 
				
			||||||
 | 
					        $expected7 = '  In 1: Hello World  In 2: This is Test 5  In 3: This is Test 6  Hello World';
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        //LAST UP: the actual testing
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        $this->assertEquals($expected1, $engine->render($template1, $variable1));
 | 
				
			||||||
 | 
					        $this->assertEquals($expected2, $engine->render($template2, $variable2));
 | 
				
			||||||
 | 
					        $this->assertEquals($expected3, $engine->render($template3, $variable3));
 | 
				
			||||||
 | 
					        $this->assertEquals($expected4, $engine->render($template4, $variable4));
 | 
				
			||||||
 | 
					        $this->assertEquals($expected5, $engine->render($template5, $variable5));
 | 
				
			||||||
 | 
					        $this->assertEquals($expected6, $engine->render($template6, $variable6));
 | 
				
			||||||
 | 
					        $this->assertEquals($expected7, $engine->render($template7, $variable7));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public function testInvalidHelperMustacheStyle()
 | 
					    public function testInvalidHelperMustacheStyle()
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user