<?php 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								namespace yiiunit\framework\base;
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								use yii\base\Model;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								use yiiunit\TestCase;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								use yiiunit\data\base\Speaker;
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								use yiiunit\data\base\Singer;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								use yiiunit\data\base\InvalidRulesModel;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								/**
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								 * @group base
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								 */
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								class ModelTest extends TestCase
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									protected function setUp()
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										parent::setUp();
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->mockApplication();
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									}
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									public function testGetAttributeLabel()
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$speaker = new Speaker();
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertEquals('First Name', $speaker->getAttributeLabel('firstName'));
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertEquals('This is the custom label', $speaker->getAttributeLabel('customLabel'));
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertEquals('Underscore Style', $speaker->getAttributeLabel('underscore_style'));
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									}
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									public function testGetAttributes()
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$speaker = new Speaker();
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$speaker->firstName = 'Qiang';
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$speaker->lastName = 'Xue';
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										$this->assertEquals([
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											'firstName' => 'Qiang',
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											'lastName' => 'Xue',
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											'customLabel' => null,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											'underscore_style' => null,
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										], $speaker->getAttributes());
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										$this->assertEquals([
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											'firstName' => 'Qiang',
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											'lastName' => 'Xue',
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										], $speaker->getAttributes(['firstName', 'lastName']));
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										$this->assertEquals([
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											'firstName' => 'Qiang',
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											'lastName' => 'Xue',
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										], $speaker->getAttributes(null, ['customLabel', 'underscore_style']));
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										$this->assertEquals([
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											'firstName' => 'Qiang',
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										], $speaker->getAttributes(['firstName', 'lastName'], ['lastName', 'customLabel', 'underscore_style']));
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									}
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									public function testSetAttributes()
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// by default mass assignment doesn't work at all
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$speaker = new Speaker();
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										$speaker->setAttributes(['firstName' => 'Qiang', 'underscore_style' => 'test']);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertNull($speaker->firstName);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertNull($speaker->underscore_style);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// in the test scenario
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$speaker = new Speaker();
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$speaker->setScenario('test');
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										$speaker->setAttributes(['firstName' => 'Qiang', 'underscore_style' => 'test']);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertNull($speaker->underscore_style);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertEquals('Qiang', $speaker->firstName);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										$speaker->setAttributes(['firstName' => 'Qiang', 'underscore_style' => 'test'], false);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertEquals('test', $speaker->underscore_style);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertEquals('Qiang', $speaker->firstName);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									}
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									public function testLoad()
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$singer = new Singer();
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertEquals('Singer', $singer->formName());
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										$post = ['firstName' => 'Qiang'];
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										Speaker::$formName = '';
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$model = new Speaker();
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$model->setScenario('test');
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertTrue($model->load($post));
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertEquals('Qiang', $model->firstName);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										Speaker::$formName = 'Speaker';
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$model = new Speaker();
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$model->setScenario('test');
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										$this->assertTrue($model->load(['Speaker' => $post]));
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										$this->assertEquals('Qiang', $model->firstName);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										Speaker::$formName = 'Speaker';
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$model = new Speaker();
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$model->setScenario('test');
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										$this->assertFalse($model->load(['Example' => []]));
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										$this->assertEquals('', $model->firstName);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									}
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									public function testActiveAttributes()
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// by default mass assignment doesn't work at all
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$speaker = new Speaker();
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertEmpty($speaker->activeAttributes());
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$speaker = new Speaker();
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$speaker->setScenario('test');
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										$this->assertEquals(['firstName', 'lastName', 'underscore_style'], $speaker->activeAttributes());
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									}
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									public function testIsAttributeSafe()
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// by default mass assignment doesn't work at all
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$speaker = new Speaker();
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertFalse($speaker->isAttributeSafe('firstName'));
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$speaker = new Speaker();
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$speaker->setScenario('test');
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertTrue($speaker->isAttributeSafe('firstName'));
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									}
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									public function testErrors()
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$speaker = new Speaker();
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertEmpty($speaker->getErrors());
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertEmpty($speaker->getErrors('firstName'));
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertEmpty($speaker->getFirstErrors());
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertFalse($speaker->hasErrors());
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertFalse($speaker->hasErrors('firstName'));
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$speaker->addError('firstName', 'Something is wrong!');
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										$this->assertEquals(['firstName' => ['Something is wrong!']], $speaker->getErrors());
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertEquals(['Something is wrong!'], $speaker->getErrors('firstName'));
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$speaker->addError('firstName', 'Totally wrong!');
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										$this->assertEquals(['firstName' => ['Something is wrong!', 'Totally wrong!']], $speaker->getErrors());
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertEquals(['Something is wrong!', 'Totally wrong!'], $speaker->getErrors('firstName'));
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertTrue($speaker->hasErrors());
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertTrue($speaker->hasErrors('firstName'));
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertFalse($speaker->hasErrors('lastName'));
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										$this->assertEquals(['Something is wrong!'], $speaker->getFirstErrors());
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertEquals('Something is wrong!', $speaker->getFirstError('firstName'));
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertNull($speaker->getFirstError('lastName'));
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$speaker->addError('lastName', 'Another one!');
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										$this->assertEquals([
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											'firstName' => [
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												'Something is wrong!',
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
												'Totally wrong!',
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
											],
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											'lastName' => ['Another one!'],
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										], $speaker->getErrors());
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$speaker->clearErrors('firstName');
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										$this->assertEquals([
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											'lastName' => ['Another one!'],
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										], $speaker->getErrors());
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$speaker->clearErrors();
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertEmpty($speaker->getErrors());
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertFalse($speaker->hasErrors());
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									}
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									public function testArraySyntax()
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$speaker = new Speaker();
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// get
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertNull($speaker['firstName']);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// isset
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertFalse(isset($speaker['firstName']));
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// set
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$speaker['firstName'] = 'Qiang';
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertEquals('Qiang', $speaker['firstName']);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertTrue(isset($speaker['firstName']));
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// iteration
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										$attributes = [];
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										foreach ($speaker as $key => $attribute) {
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											$attributes[$key] = $attribute;
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										}
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										$this->assertEquals([
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											'firstName' => 'Qiang',
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											'lastName' => null,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											'customLabel' => null,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											'underscore_style' => null,
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										], $attributes);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// unset
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										unset($speaker['firstName']);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										// exception isn't expected here
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertNull($speaker['firstName']);
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertFalse(isset($speaker['firstName']));
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									}
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									public function testDefaults()
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$singer = new Model();
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										$this->assertEquals([], $singer->rules());
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertEquals([], $singer->attributeLabels());
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									}
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									public function testDefaultScenarios()
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$singer = new Singer();
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										$this->assertEquals(['default' => ['lastName', 'underscore_style']], $singer->scenarios());
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$scenarios = [
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											'default' => ['id', 'name', 'description'],
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											'administration' => ['name', 'description', 'is_disabled'],
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										];
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$model = new ComplexModel1();
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertEquals($scenarios, $model->scenarios());
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$scenarios = [
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											'default' => ['id', 'name', 'description'],
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											'suddenlyUnexpectedScenario' => ['name', 'description'],
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											'administration' => ['id', 'name', 'description', 'is_disabled'],
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										];
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$model = new ComplexModel2();
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertEquals($scenarios, $model->scenarios());
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
									}
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									public function testIsAttributeRequired()
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$singer = new Singer();
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertFalse($singer->isAttributeRequired('firstName'));
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$this->assertTrue($singer->isAttributeRequired('lastName'));
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									}
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									public function testCreateValidators()
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
										$this->setExpectedException('yii\base\InvalidConfigException', 'Invalid validation rule: a rule must specify both attribute names and validator type.');
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$invalid = new InvalidRulesModel();
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										$invalid->createValidators();
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									}
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								}
 
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								class ComplexModel1 extends Model
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									public function rules()
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return [
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											[['id'], 'required', 'except' => 'administration'],
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											[['name', 'description'], 'filter', 'filter' => 'trim'],
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											[['is_disabled'], 'boolean', 'on' => 'administration'],
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										];
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									}
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								}
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								class ComplexModel2 extends Model
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									public function rules()
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									{
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										return [
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											[['id'], 'required', 'except' => 'suddenlyUnexpectedScenario'],
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											[['name', 'description'], 'filter', 'filter' => 'trim'],
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
											[['is_disabled'], 'boolean', 'on' => 'administration'],
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
										];
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
									}
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								}