clientScript->reset(); // reset CHtml ID counter CHtml::$count=0; Yii::app()->request->baseUrl=null; // reset so that it can be determined based on scriptUrl Yii::app()->request->scriptUrl='/bootstrap.php'; } public function tearDown() { // do not keep any garbage in global clientScript app component Yii::app()->clientScript->reset(); } /* HTML characters encode/decode tests */ public static function providerEncodeArray() { return array( array( array('lessThanExpression'=>'4 < 9'), array('lessThanExpression'=>'4 < 9') ), array( array(array('lessThanExpression'=>'4 < 9')), array(array('lessThanExpression'=>'4 < 9')) ), array( array(array('lessThanExpression'=>'4 < 9'), 'greaterThanExpression'=>'4 > 9'), array(array('lessThanExpression'=>'4 < 9'), 'greaterThanExpression'=>'4 > 9') ) ); } /** * @dataProvider providerEncodeArray * * @param type $data * @param type $assertion */ public function testEncodeArray($data, $assertion) { $this->assertEquals($assertion, CHtml::encodeArray($data)); } /* Javascript generator tests */ public static function providerAjax() { return array( array(array("url" => "index"), "jQuery.ajax({'url':'index','cache':false});"), array(array("url" => "index", "success" => "function() { this.alert(\"HI\"); }"), "jQuery.ajax({'url':'index','success':function() { this.alert(\"HI\"); },'cache':false});"), array(array("async" => true, "success" => "function() { this.alert(\"HI\"); }"), "jQuery.ajax({'async':true,'success':function() { this.alert(\"HI\"); },'url':location.href,'cache':false});"), array(array("update" =>"#my-div", "success" => "function() { this.alert(\"HI\"); }"), "jQuery.ajax({'success':function() { this.alert(\"HI\"); },'url':location.href,'cache':false});"), array(array("update" =>"#my-div"), "jQuery.ajax({'url':location.href,'cache':false,'success':function(html){jQuery(\"#my-div\").html(html)}});"), array(array("replace" =>"#my-div", "success" => "function() { this.alert(\"HI\"); }"), "jQuery.ajax({'success':function() { this.alert(\"HI\"); },'url':location.href,'cache':false});"), array(array("replace" =>"#my-div"), "jQuery.ajax({'url':location.href,'cache':false,'success':function(html){jQuery(\"#my-div\").replaceWith(html)}});") ); } /** * @dataProvider providerAjax * * @param type $options * @param type $assertion */ public function testAjax($options, $assertion) { $this->assertEquals($assertion, CHtml::ajax($options)); } /* DOM element generated from model attribute tests */ public static function providerActiveDOMElements() { return array( array(new CHtmlTestModel(array('attr1'=>true)), 'attr1', array(), ''), array(new CHtmlTestModel(array('attr1'=>false)), 'attr1', array(), '') ); } /** * @dataProvider providerActiveDOMElements * * @param string $action * @param string $method * @param array $htmlOptions * @param string $assertion */ public function testActiveCheckbox($model,$attribute,$htmlOptions, $assertion) { $this->assertEquals($assertion, CHtml::activeCheckBox($model,$attribute,$htmlOptions)); } /* Static DOM element generator tests */ public static function providerBeginForm() { return array( array("index", "get", array(), '
', CHtml::endForm()); } public function testActiveId() { $testModel=new CHtmlTestModel(); $this->assertEquals('CHtmlTestModel_attr1', CHtml::activeId($testModel, 'attr1')); $this->assertEquals('CHtmlTestModel_attr2', CHtml::activeId($testModel, 'attr2')); $this->assertEquals('CHtmlTestModel_attr3', CHtml::activeId($testModel, 'attr3')); $this->assertEquals('CHtmlTestModel_attr4', CHtml::activeId($testModel, 'attr4')); } public function testActiveName() { $testModel=new CHtmlTestModel(); $this->assertEquals('CHtmlTestModel[attr1]', CHtml::activeName($testModel, 'attr1')); $this->assertEquals('CHtmlTestModel[attr2]', CHtml::activeName($testModel, 'attr2')); $this->assertEquals('CHtmlTestModel[attr3]', CHtml::activeName($testModel, 'attr3')); $this->assertEquals('CHtmlTestModel[attr4]', CHtml::activeName($testModel, 'attr4')); } public static function providerGetIdByName() { return array( array('ContactForm[name]', 'ContactForm_name'), array('Order[name][first]', 'Order_name_first'), array('Order[name][last]', 'Order_name_last'), array('Recipe[photo][]', 'Recipe_photo'), array('Request title', 'Request_title'), ); } /** * @dataProvider providerGetIdByName * * @param string $text * @param string $assertion */ public function testGetIdByName($text, $assertion) { $this->assertEquals($assertion, CHtml::getIdByName($text)); } public function testResolveName() { $testModel=new CHtmlTestFormModel(); $attrName='stringAttr'; $this->assertEquals('CHtmlTestFormModel[stringAttr]', CHtml::resolveName($testModel, $attrName)); $this->assertEquals('stringAttr', $attrName); $attrName='arrayAttr[k1]'; $this->assertEquals('CHtmlTestFormModel[arrayAttr][k1]', CHtml::resolveName($testModel, $attrName)); $this->assertEquals('arrayAttr[k1]', $attrName); $attrName='arrayAttr[k3][k5]'; $this->assertEquals('CHtmlTestFormModel[arrayAttr][k3][k5]', CHtml::resolveName($testModel, $attrName)); $this->assertEquals('arrayAttr[k3][k5]', $attrName); $attrName='[k3][k4]arrayAttr'; $this->assertEquals('CHtmlTestFormModel[k3][k4][arrayAttr]', CHtml::resolveName($testModel, $attrName)); $this->assertEquals('arrayAttr', $attrName); $attrName='[k3]arrayAttr[k4]'; $this->assertEquals('CHtmlTestFormModel[k3][arrayAttr][k4]', CHtml::resolveName($testModel, $attrName)); $this->assertEquals('arrayAttr[k4]', $attrName); // next two asserts gives 100% code coverage of the CHtml::resolveName() method // otherwise penultimate line (last closing curly bracket) of the CHtml::resolveName() will not be unit tested $attrName='[k3'; $this->assertEquals('CHtmlTestFormModel[[k3]', CHtml::resolveName($testModel, $attrName)); $this->assertEquals('[k3', $attrName); } public function testResolveValue() { $testModel=new CHtmlTestFormModel(); $this->assertEquals('stringAttrValue', CHtml::resolveValue($testModel, 'stringAttr')); $this->assertEquals('v1', CHtml::resolveValue($testModel, 'arrayAttr[k1]')); $this->assertEquals('v2', CHtml::resolveValue($testModel, 'arrayAttr[k2]')); $this->assertEquals($testModel->arrayAttr['k3'], CHtml::resolveValue($testModel, 'arrayAttr[k3]')); $this->assertEquals('v4', CHtml::resolveValue($testModel, 'arrayAttr[k3][k4]')); $this->assertEquals('v5', CHtml::resolveValue($testModel, 'arrayAttr[k3][k5]')); $this->assertEquals('v6', CHtml::resolveValue($testModel, 'arrayAttr[k6]')); $this->assertNull(CHtml::resolveValue($testModel, 'arrayAttr[k7]')); $this->assertNull(CHtml::resolveValue($testModel, 'arrayAttr[k7][k8]')); $this->assertEquals($testModel->arrayAttr, CHtml::resolveValue($testModel, '[ignored-part]arrayAttr')); $this->assertEquals('v1', CHtml::resolveValue($testModel, '[ignored-part]arrayAttr[k1]')); $this->assertEquals('v4', CHtml::resolveValue($testModel, '[ignore-this]arrayAttr[k3][k4]')); } public function providerValue() { $result=array( // $model is array array(array('k1'=>'v1','k2'=>'v2','v3','v4'),'k1',null,'v1'), array(array('k1'=>'v1','k2'=>'v2','v3','v4'),'k2',null,'v2'), array(array('k1'=>'v1','k2'=>'v2','v3','v4'),'k3',null,null), array(array('k1'=>'v1','k2'=>'v2','v3','v4'),'k3','defaultValue','defaultValue'), array(array('k1'=>'v1','k2'=>'v2','v3','v4'),0,null,'v3'), array(array('k1'=>'v1','k2'=>'v2','v3','v4'),1,null,'v4'), array(array('k1'=>'v1','k2'=>'v2','v3','v4'),2,null,null), array(array('k1'=>'v1','k2'=>'v2','v3','v4'),2,'defaultValue','defaultValue'), // $model is stdClass array((object)array('k1'=>'v1','k2'=>'v2','v3','v4'),'k1',null,'v1'), array((object)array('k1'=>'v1','k2'=>'v2','v3','v4'),'k2',null,'v2'), array((object)array('k1'=>'v1','k2'=>'v2','v3','v4'),'k3',null,null), array((object)array('k1'=>'v1','k2'=>'v2','v3','v4'),'k3','defaultValue','defaultValue'), array((object)array('k1'=>'v1','k2'=>'v2','v3','v4'),0,null,null), array((object)array('k1'=>'v1','k2'=>'v2','v3','v4'),1,null,null), array((object)array('k1'=>'v1','k2'=>'v2','v3','v4'),2,null,null), array((object)array('k1'=>'v1','k2'=>'v2','v3','v4'),2,'defaultValue','defaultValue'), // static method array(array('k1'=>'v1','k2'=>'v2','v3','v4'),array('CHtmlTest','helperTestValue'),null,'v2'), array((object)array('k1'=>'v1','k2'=>'v2','v3','v4'),array('CHtmlTest','helperTestValue'),null,'v2'), // create_function is not supported by CHtml::value(), we're just testing this feature/property array(array('k1'=>'v1','k2'=>'v2','v3','v4'),create_function('$model','return $model["k2"];'),null,null), array((object)array('k1'=>'v1','k2'=>'v2','v3','v4'),create_function('$model','return $model->k2;'),null,null), // standard PHP functions should not be treated as callables array(array('array_filter'=>'array_filter','sort'=>'sort'),'sort',null,'sort'), array(array('array_filter'=>'array_filter','sort'=>'sort'),'array_map','defaultValue','defaultValue'), array((object)array('array_filter'=>'array_filter','sort'=>'sort'),'sort',null,'sort'), array((object)array('array_filter'=>'array_filter','sort'=>'sort'),'array_map','defaultValue','defaultValue'), // dot access, array array(array('k1'=>array('k2'=>array('k3'=>'v3')),array('v1','k4'=>'v4')),'k1.k2.k3',null,'v3'), array(array('k1'=>array('k2'=>array('k3'=>'v3')),array('v1','k4'=>'v4')),'0.0',null,'v1'), array(array('k1'=>array('k2'=>array('k3'=>'v3')),array('v1','k4'=>'v4')),'0.k4',null,'v4'), array(array('k1'=>array('k2'=>array('k3'=>'v3')),array('v1','k4'=>'v4')),'0.1',null,null), // dot access, object array((object)array('k1'=>array('k2'=>array('k3'=>'v3')),array('v1','k4'=>'v4')),'k1.k2.k3',null,'v3'), array((object)array('k1'=>array('k2'=>array('k3'=>'v3')),array('v1','k4'=>'v4')),'0.0',null,null), array((object)array('k1'=>array('k2'=>array('k3'=>'v3')),array('v1','k4'=>'v4')),'0.k4',null,null), array((object)array('k1'=>array('k2'=>array('k3'=>'v3')),array('v1','k4'=>'v4')),'0.1',null,null), // $attribute parameter is: // 1. null or empty string // 2. not "0" string, 0 integer or 0.0 double/float // 3. empty array doesn't make sense array(array('v1'),null,'defaultValue','defaultValue'), array(array('v1'),"",'defaultValue','defaultValue'), array(array('v1'),"0",'defaultValue','v1'), array(array('v1'),0,'defaultValue','v1'), array(array('v1'),0.0,'defaultValue','v1'), ); if(class_exists('Closure',false)) { // anonymous function $result=array_merge($result,require(dirname(__FILE__).'/CHtml/providerValue.php')); } return $result; } /** * @dataProvider providerValue * * @param array|stdClass $model * @param integer|double|string $attribute * @param mixed $defaultValue * @param string $assertion */ public function testValue($model, $attribute, $defaultValue, $assertion) { $this->assertEquals($assertion, CHtml::value($model, $attribute, $defaultValue)); } /** * Helper method for {@link testValue()} and {@link providerValue()} methods. */ public static function helperTestValue($model) { return is_array($model) ? $model['k2'] : $model->k2; } public static function providerPageStateField() { return array( array('testing-value', ''), array('another-testing&value', ''), ); } /** * @dataProvider providerPageStateField * * @param string $value * @param string $assertion */ public function testPageStateField($value, $assertion) { $this->assertEquals($assertion, CHtml::pageStateField($value)); } public static function providerEncodeDecode() { return array( array( 'testing & text
', '<p>testing & text</p>', ), ); } /** * @dataProvider providerEncodeDecode * * @param string $text * @param string $assertion */ public function testEncode($text, $assertion) { $this->assertEquals($assertion, CHtml::encode($text)); } /** * @dataProvider providerEncodeDecode * * @param string $assertion * @param string $text */ public function testDecode($assertion, $text) { $this->assertEquals($assertion, CHtml::decode($text)); } public static function providerRefresh() { return array( array( 10, 'http://yiiframework.com/', ''."\n", ), array( 15, array('site/index'), ''."\n", ), ); } /** * @dataProvider providerRefresh * * @param $seconds * @param $url * @param $assertion */ public function testRefresh($seconds, $url, $assertion) { // this adds element to the CClientScript::$metaTags CHtml::refresh($seconds, $url); // now render html head with registered meta tags $output=''; Yii::app()->clientScript->renderHead($output); // and test it now $this->assertEquals($assertion, $output); } public static function providerStatefulForm() { // we should keep in mind that CHtml::statefulForm() calls CHtml::beginForm() internally // so we can make expected assertion value more readable by using CHtml::beginForm() because // we are testing stateful feature of the CHtml::statefulForm(), not