.dev/tests/unit/tpl/tpl_driver_yf_bugs_test.Test.php

Summary

Maintainability
B
4 hrs
Test Coverage
<?php

require_once __DIR__ . '/tpl__setup.php';

class tpl_driver_yf_bugs_test extends tpl_abstract
{
    public static $_er = [];
    public static function setUpBeforeClass() : void
    {
        self::$_er = error_reporting();
        error_reporting(0);
    }
    public static function tearDownAfterClass() : void
    {
        error_reporting(self::$_er);
    }
    public function test_bug_01()
    {
        $this->assertEquals('#description ', self::_tpl('#description {execute(main,_show_block123123)}', ['description' => 'test']));
    }
    public function test_bug_02()
    {
        $this->assertEquals(' {} ', self::_tpl(' {} ', ['' => '']));
    }
    public function test_bug_03()
    {
        $a = ['quantity' => 10, 'active' => 1];
        $this->assertEquals(' ok ', self::_tpl('{if("quantity" gt 0)} ok {/if}', $a));
        $this->assertEquals(' ok ', self::_tpl('{if("active" ne 0)} ok {/if}', $a));
        $this->assertEquals(' ok ', self::_tpl('{if("quantity" gt "0" and "active" ne "0")} ok {/if}', $a));
        $this->assertEquals(' ok ', self::_tpl('{if(quantity gt 0 and active ne 0)} ok {/if}', $a));
        $this->assertEquals(' ok ', self::_tpl('{if("quantity" gt 0 and active ne 0)} ok {/if}', $a));
        $this->assertEquals(' ok ', self::_tpl('{if("quantity" gt 0 and "active" ne 0)} ok {/if}', $a));

        $a = ['quantity' => 10, 'active' => 0];
        $this->assertEquals('', self::_tpl('{if("quantity" gt 0 and "active" ne 0)} ok {/if}', $a));
        $a = ['quantity' => 0, 'active' => 0];
        $this->assertEquals('', self::_tpl('{if("quantity" gt 0 and "active" ne 0)} ok {/if}', $a));
    }
    public function test_bug_04()
    {
        conf('unit_test_conf_item1', '5');
        $this->assertEquals('5', conf('unit_test_conf_item1'));
        conf('unit_test_conf_item2', '6');
        $this->assertEquals('6', conf('unit_test_conf_item2'));
        module_conf('main', 'unit_var1', '4');
        $this->assertEquals('4', module_conf('main', 'unit_var1'));
        module_conf('main', 'unit_var2', '5');
        $this->assertEquals('5', module_conf('main', 'unit_var2'));

        $this->assertEquals(' ok ', self::_tpl('{if(conf.unit_test_conf_item1 eq "5" and conf.unit_test_conf_item2 eq "6")} ok {/if}'));
        $this->assertEquals(' ok ', self::_tpl('{if(conf.unit_test_conf_item1 eq 5 and conf.unit_test_conf_item2 eq 6)} ok {/if}'));
        $this->assertEquals(' ok ', self::_tpl('{if(conf.unit_test_conf_item1 eq 1 or conf.unit_test_conf_item2 eq 6)} ok {/if}'));
        $this->assertEquals(' ok ', self::_tpl('{if(conf.unit_test_conf_item1 ne 1 or conf.unit_test_conf_item2 ne 1)} ok {/if}'));

        $this->assertEquals(' ok ', self::_tpl('{if(conf.unit_test_conf_item2 eq "6" and module_conf.main.unit_var2 eq "5")} ok {/if}'));
        $this->assertEquals(' ok ', self::_tpl('{if(conf.unit_test_conf_item2 eq 6 and module_conf.main.unit_var2 eq 5)} ok {/if}'));
    }
    public function test_bug_05()
    {
        $this->assertEquals('.min', self::_tpl('{if_false(debug_mode)}.min{/if}', ['debug_mode' => 0]));

        $tpl_str = '{catch(min_ext)}{if_false(debug_mode)}.min{/if}{/catch}{min_ext}';
        $this->assertEquals('.min', self::_tpl($tpl_str, ['debug_mode' => 0]));
        $this->assertEquals('', self::_tpl($tpl_str, ['debug_mode' => 1]));
    }
    public function test_bug_06()
    {
        $tpl_str = '
            {catch(min_ext)}{if_false(debug_mode)}.min{/if}{/catch}
            {if(css_framework eq "bs2" or css_framework eq "")}
                <script src="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap{min_ext}.js"></script>
            {else}
                <script src="//netdna.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap{min_ext}.js"></script>
            {/if}
        ';
        $this->assertEquals('<script src="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.js"></script>', trim(self::_tpl($tpl_str, ['css_framework' => 'bs2', 'debug_mode' => 1])));
        $this->assertEquals('<script src="//netdna.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.js"></script>', trim(self::_tpl($tpl_str, ['css_framework' => 'bs3', 'debug_mode' => 1])));
        $this->assertEquals('<script src="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>', trim(self::_tpl($tpl_str, ['css_framework' => 'bs2', 'debug_mode' => 0])));
        $this->assertEquals('<script src="//netdna.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>', trim(self::_tpl($tpl_str, ['css_framework' => 'bs3', 'debug_mode' => 0])));
    }
    public function test_bug_07()
    {
        self::_tpl('Hello1', [], 'unittest_include1');
        self::_tpl('Hello2', [], 'unittest_include2');
        self::_tpl('Hello3', [], 'unittest_include3');
        $this->assertEquals('Hello1 Hello1 Hello1', self::_tpl('{include("unittest_include1")} {include("unittest_include1")} {include("unittest_include1")}'));
    }
    public function test_bug_08()
    {
        $this->assertEquals('', self::_tpl('{foreach(0)}</ul>{/foreach}'));
        $this->assertEquals('</ul>', self::_tpl('{foreach(1)}</ul>{/foreach}'));
        $this->assertEquals('</ul></ul>', self::_tpl('{foreach(2)}</ul>{/foreach}'));
        $this->assertEquals('</ul></ul></ul>', self::_tpl('{foreach(3)}</ul>{/foreach}'));
        $this->assertEquals('</ul></ul></ul>', self::_tpl('{foreach( 3 )}</ul>{/foreach}'));
        $this->assertEquals(str_repeat('</ul>', 100), self::_tpl('{foreach(100)}</ul>{/foreach}'));

        $this->assertEquals('', self::_tpl('{foreach(next_level_diff)}</ul>{/foreach}'));
        $this->assertEquals('', self::_tpl('{foreach(next_level_diff)}</ul>{/foreach}', ['next_level_diff' => 0]));
        $this->assertEquals('</ul>', self::_tpl('{foreach(next_level_diff)}</ul>{/foreach}', ['next_level_diff' => 1]));
        $this->assertEquals('</ul></ul>', self::_tpl('{foreach(next_level_diff)}</ul>{/foreach}', ['next_level_diff' => 2]));
        $this->assertEquals('</ul></ul></ul>', self::_tpl('{foreach("next_level_diff")}</ul>{/foreach}', ['next_level_diff' => 3]));
        $this->assertEquals('</ul></ul></ul>', self::_tpl('{foreach( "next_level_diff" )}</ul>{/foreach}', ['next_level_diff' => 3]));
        $this->assertEquals('</ul></ul></ul>', self::_tpl('{foreach(next_level_diff)}</ul>{/foreach}', ['next_level_diff' => 3]));
        $this->assertEquals(str_repeat('</ul>', 100), self::_tpl('{foreach(next_level_diff)}</ul>{/foreach}', ['next_level_diff' => 100]));
        $this->assertEquals('</ul></ul></ul>', self::_tpl('{foreach(data.next_level_diff)}</ul>{/foreach}', ['data' => ['next_level_diff' => 3]]));
    }
    public function test_bug_09()
    {
        $this->assertEquals('{foreach()}1{/foreach}', self::_tpl('{foreach()}1{/foreach}'));
        $this->assertEquals('', self::_tpl('{foreach(items)}1{/foreach}'));
        $this->assertEquals('', self::_tpl('{foreach(items)}1{/foreach}', ['items' => 0]));
        $this->assertEquals('', self::_tpl('{foreach(items)}1{/foreach}', ['items' => []]));
        $this->assertEquals('111', self::_tpl('{foreach(items)}1{/foreach}', ['items' => 3]));
        $this->assertEquals('111', self::_tpl('{foreach(items)}1{/foreach}', ['items' => [0, 1, 2]]));
        $this->assertEquals('111', self::_tpl('{foreach(items)}1{/foreach}', ['items' => [1, 2, 3]]));
        $this->assertEquals('111', self::_tpl('{foreach(items)}1{/foreach}', ['items' => range(1, 3)]));
        $this->assertEquals('111', self::_tpl('{foreach(items)}1{/foreach}', ['items' => [['k' => 'v'], ['k' => 'v'], ['k' => 'v']]]));

        $this->assertEquals('111,222', self::_tpl('{foreach(items)}1{/foreach},{foreach(items)}2{/foreach}', ['items' => range(1, 3)]));
        $this->assertEquals('111,222,333', self::_tpl('{foreach(items)}1{/foreach},{foreach(items)}2{/foreach},{foreach(items)}3{/foreach}', ['items' => range(1, 3)]));
        $this->assertEquals('1111,2222,3333', self::_tpl('{foreach(items)}1{/foreach},{foreach(items)}2{/foreach},{foreach(items)}3{/foreach}', ['items' => range(1, 4)]));
        $this->assertEquals('1111,2222,1111', self::_tpl('{foreach(items)}1{/foreach},{foreach(items)}2{/foreach},{foreach(items)}1{/foreach}', ['items' => range(1, 4)]));
    }
    public function test_bug_10()
    {
        $data = [
            ['k1' => 'v1'],
            ['k1' => 'v2'],
            ['k2' => 'v22'],
            ['k3' => 'v33'],
        ];
        $this->assertEquals(' 0=v1 _v1_  1=v2 _v2_  2=v22   3=v33  ', self::_tpl('{foreach(data)} {_key}={_val} {if(#.k1 ne "")}_{#.k1}_{/if} {/foreach}', ['data' => $data]));
    }
    public function test_bug_11()
    {
        $this->assertEquals('{form}', self::_tpl('{form}', []));
        $data = ['form' => form(['name' => 'val'])->text('name')];
        $this->assertNotEquals('{form}', self::_tpl('{form}', $data));
        $this->assertGreaterThan(100, strlen(self::_tpl('{form}', $data)));

        $data = new stdClass();
        $data->key1 = 'val1';
        $data->form = form()->text('name');

        //        $this->assertEquals('', self::_tpl('{data.form}', array()));
        $this->assertEquals('{data.form}', self::_tpl('{data.form}', []));
        $this->assertNotEquals('{data.form}', self::_tpl('{data.form}', ['data' => $data]));
        $this->assertGreaterThan(100, strlen(self::_tpl('{data.form}', ['data' => $data])));
    }
    public function test_bug_12()
    {
        $a = ['var1' => 10, 'var2' => 1];
        $this->assertEquals(' ok ', self::_tpl('{if("var1" gt "var2")} ok {else} ko {/if}', $a));
        $this->assertEquals(' ok ', self::_tpl('{if(var1 gt var2)} ok {else} ko {/if}', $a));
        $this->assertEquals(' ok ', self::_tpl('{if("var1" lt "var2")} ko {else} ok {/if}', $a));
        $this->assertEquals(' ok ', self::_tpl('{if(var1 lt var2)} ko {else} ok {/if}', $a));
        $a = ['var1' => '10', 'var2' => '1'];
        $this->assertEquals(' ok ', self::_tpl('{if("var1" gt "var2")} ok {else} ko {/if}', $a));
        $this->assertEquals(' ok ', self::_tpl('{if(var1 gt var2)} ok {else} ko {/if}', $a));
        $this->assertEquals(' ok ', self::_tpl('{if("var1" lt "var2")} ko {else} ok {/if}', $a));
        $this->assertEquals(' ok ', self::_tpl('{if(var1 lt var2)} ko {else} ok {/if}', $a));
        $a = ['var1' => '10000', 'var2' => '2300'];
        $this->assertEquals(' ok ', self::_tpl('{if("var1" gt "var2")} ok {else} ko {/if}', $a));
        $this->assertEquals(' ok ', self::_tpl('{if(var1 gt var2)} ok {else} ko {/if}', $a));
        $this->assertEquals(' ok ', self::_tpl('{if("var1" lt "var2")} ko {else} ok {/if}', $a));
        $this->assertEquals(' ok ', self::_tpl('{if(var1 lt var2)} ko {else} ok {/if}', $a));
        $a = ['var1' => '10000.00', 'var2' => '2300.00'];
        $this->assertEquals(' ok ', self::_tpl('{if("var1" gt "var2")} ok {else} ko {/if}', $a));
        $this->assertEquals(' ok ', self::_tpl('{if(var1 gt var2)} ok {else} ko {/if}', $a));
        $this->assertEquals(' ok ', self::_tpl('{if("var1" lt "var2")} ko {else} ok {/if}', $a));
        $this->assertEquals(' ok ', self::_tpl('{if(var1 lt var2)} ko {else} ok {/if}', $a));
    }
    public function test_bug_13()
    {
        $a = ['var1' => 10, 'var2' => 10];
        $this->assertEquals(' ok ', self::_tpl('{if(var3 eq "")} ok {else} ko {/if}', $a));
        $this->assertEquals(' ok ', self::_tpl('{if(var3 ne "")} ko {else} ok {/if}', $a));
        $this->assertEquals(' ok ', self::_tpl('{if(var1 eq var2)} ok {else} ko {/if}', $a));
        $this->assertEquals(' ok ', self::_tpl('{if(var1 ne "")} ok {else} ko {/if}', $a));
    }
    public function test_bug_14()
    {
        $this->assertFalse(defined('MY_NOT_EXISTING_CONST'));
        $this->assertEquals('GOOD', self::_tpl('{if(const.MY_NOT_EXISTING_CONST eq 0)}GOOD{else}BAD{/if}'));
        $this->assertEquals('GOOD', self::_tpl('{if_empty(const.MY_NOT_EXISTING_CONST)}GOOD{else}BAD{/if}'));
        $this->assertEquals('GOOD', self::_tpl('{if_not_isset(const.MY_NOT_EXISTING_CONST)}GOOD{else}BAD{/if}'));
    }
}