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->assertEquals(null, CHtml::resolveValue($testModel, 'arrayAttr[k7]'));
$this->assertEquals(null, 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 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(
'',
'<h1 class="header" attr='value'>Text header</h1>',
),
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 tag generation
// same true for CHtml::pageStateField - it is already tested in another method
return array(
array(
array('site/index'),
'post',
array(),
CHtml::form(array('site/index'), 'post', array())."\n".''.CHtml::pageStateField('').'
'
),
array(
'/some-static/url',
'get',
array('test-attr'=>'test-value'),
CHtml::form('/some-static/url', 'get', array('test-attr'=>'test-value'))."\n".''.CHtml::pageStateField('').'
'
),
);
}
/**
* @dataProvider providerStatefulForm
*
* @param string $action
* @param string $method
* @param array $htmlOptions
* @param string $assertion
*/
public function testStatefulForm($action, $method, $htmlOptions, $assertion)
{
$this->assertEquals($assertion, CHtml::statefulForm($action, $method, $htmlOptions));
}
public static function providerMailto()
{
return array(
array(
'Drop me a line! ;-)',
'admin@example.com',
array('class'=>'mail-to-admin'),
'Drop me a line! ;-) ',
),
array(
'Contact me',
'foo@bar.baz',
array(),
'Contact me ',
),
array(
'boss@acme.com',
'',
array(),
'boss@acme.com ',
),
);
}
/**
* @dataProvider providerMailto
*
* @param string $text
* @param string $email
* @param array $htmlOptions
* @param string $assertion
*/
public function testMailto($text, $email, $htmlOptions, $assertion)
{
$this->assertEquals($assertion, CHtml::mailto($text, $email, $htmlOptions));
}
public static function providerImage()
{
return array(
array('/images/logo.png', 'YiiSoft, LLC', array(), ' '),
array('/img/test.jpg', '', array('class'=>'test-img'), ' '),
);
}
/**
* @dataProvider providerImage
*
* @param string $src
* @param string $alt
* @param array $htmlOptions
* @param string $assertion
*/
public function testImage($src, $alt, $htmlOptions, $assertion)
{
$this->assertEquals($assertion, CHtml::image($src, $alt, $htmlOptions));
}
public function providerActiveLabel()
{
return array(
array(false, 'userName', array(), 'User Name '),
array(false, 'userName', array('for'=>'someTestingInput'), 'User Name '),
array(false, 'userName', array('label'=>'Custom Label'), 'Custom Label '),
array(false, 'userName', array('label'=>false), ''),
array(true, 'userName', array(), 'User Name '),
array(true, 'userName', array('for'=>'someTestingInput'), 'User Name '),
array(true, 'firstName', array('label'=>'Custom Label'), 'Custom Label '),
array(true, 'userName', array('label'=>false), ''),
);
}
/**
* @dataProvider providerActiveLabel
*
* @param boolean $validate
* @param string $attribute
* @param array $htmlOptions
* @param string $assertion
*/
public function testActiveLabel($validate, $attribute, $htmlOptions, $assertion)
{
$model=new CHtmlTestActiveModel();
if($validate)
$model->validate();
$this->assertEquals($assertion, CHtml::activeLabel($model, $attribute, $htmlOptions));
}
public function providerActiveLabelEx()
{
return array(
array(false, 'firstName', array(), 'First Name '),
array(false, 'firstName', array('for'=>'someTestingInput'), 'First Name '),
array(false, 'userName', array('label'=>'Custom Label'), 'Custom Label * '),
array(false, 'userName', array('label'=>false), ''),
array(true, 'userName', array(), 'User Name * '),
array(true, 'userName', array('for'=>'someTestingInput'), 'User Name * '),
array(true, 'firstName', array('label'=>'Custom Label'), 'Custom Label '),
array(true, 'firstName', array('label'=>false), ''),
);
}
/**
* @dataProvider providerActiveLabelEx
*
* @param boolean $addErrors
* @param string $attribute
* @param array $htmlOptions
* @param string $validate
*/
public function testActiveLabelEx($validate, $attribute, $htmlOptions, $assertion)
{
$model=new CHtmlTestActiveModel();
if($validate)
$model->validate();
$this->assertEquals($assertion, CHtml::activeLabelEx($model, $attribute, $htmlOptions));
}
public function providerActiveTextField()
{
return array(
array(false, 'userName', array('class'=>'user-name-field'),
' '),
array(true, 'userName', array('class'=>'user-name-field'),
' '),
array(false, 'firstName', array('class'=>'first-name-field'),
' '),
array(true, 'firstName', array('class'=>'first-name-field'),
' '),
);
}
/**
* @dataProvider providerActiveTextField
*
* @param boolean $validate
* @param string $attribute
* @param array $htmlOptions
* @param string $assertion
*/
public function testActiveTextField($validate, $attribute, $htmlOptions, $assertion)
{
$model=new CHtmlTestActiveModel();
if($validate)
$model->validate();
$this->assertEquals($assertion, CHtml::activeTextField($model, $attribute, $htmlOptions));
}
public function providerActiveUrlField()
{
return array(
array(false, 'userName', array('class'=>'test-class-attr'),
' '),
array(true, 'userName', array('another-attr'=>'another-attr-value', 'id'=>'changed-id'),
' '),
array(false, 'firstName', array(),
' '),
array(true, 'firstName', array('disabled'=>true, 'name'=>'changed-name'),
' '),
);
}
/**
* @dataProvider providerActiveUrlField
*
* @param boolean $validate
* @param string $attribute
* @param array $htmlOptions
* @param string $assertion
*/
public function testActiveUrlField($validate, $attribute, $htmlOptions, $assertion)
{
$model=new CHtmlTestActiveModel();
if($validate)
$model->validate();
$this->assertEquals($assertion, CHtml::activeUrlField($model, $attribute, $htmlOptions));
}
public function providerButton()
{
return array(
array('button1', array('name'=>null, 'class'=>'class1'), ' '),
array('button2', array('name'=>'custom-name', 'class'=>'class2'), ' '),
array('button3', array('type'=>'submit'), ' '),
array('button4', array('value'=>'button-value'), ' '),
array('button5', array(), ' '),
);
}
/**
* @dataProvider providerButton
*
* @param string $label
* @param array $htmlOptions
* @param string $assertion
*/
public function testButton($label, $htmlOptions, $assertion)
{
$this->assertEquals($assertion, CHtml::button($label, $htmlOptions));
}
public function providerHtmlButton()
{
return array(
array('button1', array('name'=>null, 'class'=>'class1'), 'button1 '),
array('button2', array('name'=>'custom-name', 'class'=>'class2'), 'button2 '),
array('button3', array('type'=>'submit'), 'button3 '),
array('button4', array('value'=>'button-value'), 'button4 '),
array('button5', array(), 'button5 '),
);
}
/**
* @dataProvider providerHtmlButton
*
* @param string $label
* @param array $htmlOptions
* @param string $assertion
*/
public function testHtmlButton($label, $htmlOptions, $assertion)
{
$this->assertEquals($assertion, CHtml::htmlButton($label, $htmlOptions));
}
public function providerSubmitButton()
{
return array(
array('submit', array(), ' '),
array('submit1', array('type'=>'button'), ' '),
);
}
/**
* @dataProvider providerSubmitButton
*
* @param string $label
* @param array $htmlOptions
* @param string $assertion
*/
public function testSubmitButton($label, $htmlOptions, $assertion)
{
$this->assertEquals($assertion, CHtml::submitButton($label, $htmlOptions));
}
public function providerResetButton()
{
return array(
array('reset', array(), ' '),
array('reset1', array('type'=>'button'), ' '),
);
}
/**
* @dataProvider providerResetButton
*
* @param string $label
* @param array $htmlOptions
* @param string $assertion
*/
public function testResetButton($label, $htmlOptions, $assertion)
{
$this->assertEquals($assertion, CHtml::resetButton($label, $htmlOptions));
}
public function providerImageButton()
{
return array(
array('/images/test-image.png', array('src'=>'ignored-src'), ' '),
array('/images/test-image.jpg', array('type'=>'button'), ' '),
array('/images/test-image.gif', array('value'=>'image'), ' '),
);
}
/**
* @dataProvider providerImageButton
*
* @param string $src
* @param array $htmlOptions
* @param string $assertion
*/
public function testImageButton($label, $htmlOptions, $assertion)
{
$this->assertEquals($assertion, CHtml::imageButton($label, $htmlOptions));
}
public function providerLinkButton()
{
return array(
array('submit', array(), 'submit ',
"$('body').on('click','#yt0',function(){jQuery.yii.submitForm(this,'',{});return false;});"),
array('link-button', array(), 'link-button ',
"$('body').on('click','#yt0',function(){jQuery.yii.submitForm(this,'',{});return false;});"),
array('link-button', array('href'=>'http://yiiframework.com/'), 'link-button ',
"$('body').on('click','#yt0',function(){jQuery.yii.submitForm(this,'http://yiiframework.com/',{});return false;});"),
);
}
/**
* @dataProvider providerLinkButton
*
* @param string $label
* @param array $htmlOptions
* @param string $assertion
* @param string $clientScriptOutput
*/
public function testLinkButton($label, $htmlOptions, $assertion, $clientScriptOutput)
{
$this->assertEquals($assertion, CHtml::linkButton($label, $htmlOptions));
$output='';
Yii::app()->getClientScript()->renderBodyEnd($output);
$this->assertTrue(mb_strpos($output, $clientScriptOutput)!==false);
}
public function testAjaxCallbacks()
{
$out=CHtml::ajax(array(
'success'=>'js:function() { /* callback */ }',
));
$this->assertTrue(mb_strpos($out,"'success':function() { /* callback */ }", null, Yii::app()->charset)!==false, "Unexpected JavaScript: ".$out);
$out=CHtml::ajax(array(
'success'=>'function() { /* callback */ }',
));
$this->assertTrue(mb_strpos($out,"'success':function() { /* callback */ }", null, Yii::app()->charset)!==false, "Unexpected JavaScript: ".$out);
$out=CHtml::ajax(array(
'success'=>new CJavaScriptExpression('function() { /* callback */ }'),
));
$this->assertTrue(mb_strpos($out,"'success':function() { /* callback */ }", null, Yii::app()->charset)!==false, "Unexpected JavaScript: ".$out);
}
}
/* Helper classes */
class CHtmlTestModel extends CModel
{
private static $_names=array();
/**
* @property mixed $attr1
*/
public $attr1;
/**
* @property mixed $attr2
*/
public $attr2;
/**
* @property mixed $attr3
*/
public $attr3;
/**
* @property mixed $attr4
*/
public $attr4;
public function __constructor(array $properties)
{
foreach($properties as $property=>$value)
{
if(!property_exists($this, $property))
{
throw new Exception("$property is not a property of this class, and I'm not allowing you to add it!");
}
$this->{$property} = $value;
}
}
/**
* Returns the list of attribute names.
* @return array list of attribute names. Defaults to all public properties of the class.
*/
public function attributeNames()
{
$className=get_class($this);
if(!isset(self::$_names[$className]))
{
$class=new ReflectionClass(get_class($this));
$names=array();
foreach($class->getProperties() as $property)
{
$name=$property->getName();
if($property->isPublic() && !$property->isStatic())
$names[]=$name;
}
return self::$_names[$className]=$names;
}
else
return self::$_names[$className];
}
}
class CHtmlTestFormModel extends CFormModel
{
public $stringAttr;
public $arrayAttr;
public function afterConstruct()
{
$this->stringAttr='stringAttrValue';
$this->arrayAttr=array(
'k1'=>'v1',
'k2'=>'v2',
'k3'=>array(
'k4'=>'v4',
'k5'=>'v5',
),
'k6'=>'v6',
);
}
}
class CHtmlTestActiveModel extends CFormModel
{
public $userName;
public $firstName;
public function rules()
{
return array(
array('userName', 'required'),
array('firstName', 'safe'),
);
}
}