BehaviorTest.php 2.41 KB
Newer Older
Alexander Makarov committed
1
<?php
Qiang Xue committed
2 3 4

namespace yiiunit\framework\base;

Alexander Makarov committed
5 6 7 8 9
use yii\base\Behavior;
use yii\base\Component;
use yiiunit\TestCase;

class BarClass extends Component
Alexander Makarov committed
10 11 12
{
}

Alexander Makarov committed
13
class FooClass extends Component
Qiang Xue committed
14 15 16
{
	public function behaviors()
	{
Alexander Makarov committed
17
		return [
Qiang Xue committed
18
			'foo' => __NAMESPACE__ . '\BarBehavior',
Alexander Makarov committed
19
		];
Qiang Xue committed
20 21 22
	}
}

Alexander Makarov committed
23
class BarBehavior extends Behavior
Alexander Makarov committed
24 25 26 27 28 29 30
{
	public $behaviorProperty = 'behavior property';

	public function behaviorMethod()
	{
		return 'behavior method';
	}
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46

	public function __call($name, $params)
	{
		if ($name == 'magicBehaviorMethod') {
			return 'Magic Behavior Method Result!';
		}
		return parent::__call($name, $params);
	}

	public function hasMethod($name)
	{
		if ($name == 'magicBehaviorMethod') {
			return true;
		}
		return parent::hasMethod($name);
	}
Alexander Makarov committed
47 48
}

49 50 51
/**
 * @group base
 */
Alexander Makarov committed
52
class BehaviorTest extends TestCase
Alexander Makarov committed
53
{
Qiang Xue committed
54 55 56 57 58 59
	protected function setUp()
	{
		parent::setUp();
		$this->mockApplication();
	}

Alexander Makarov committed
60 61
	public function testAttachAndAccessing()
	{
Qiang Xue committed
62
		$bar = new BarClass();
Alexander Makarov committed
63
		$behavior = new BarBehavior();
Qiang Xue committed
64
		$bar->attachBehavior('bar', $behavior);
Alexander Makarov committed
65
		$this->assertEquals('behavior property', $bar->behaviorProperty);
Qiang Xue committed
66
		$this->assertEquals('behavior method', $bar->behaviorMethod());
67 68
		$this->assertEquals('behavior property', $bar->getBehavior('bar')->behaviorProperty);
		$this->assertEquals('behavior method', $bar->getBehavior('bar')->behaviorMethod());
69

Alexander Makarov committed
70
		$behavior = new BarBehavior(['behaviorProperty' => 'reattached']);
71 72
		$bar->attachBehavior('bar', $behavior);
		$this->assertEquals('reattached', $bar->behaviorProperty);
Qiang Xue committed
73 74 75 76 77 78 79
	}

	public function testAutomaticAttach()
	{
		$foo = new FooClass();
		$this->assertEquals('behavior property', $foo->behaviorProperty);
		$this->assertEquals('behavior method', $foo->behaviorMethod());
Alexander Makarov committed
80
	}
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105

	public function testMagicMethods()
	{
		$bar = new BarClass();
		$behavior = new BarBehavior();

		$this->assertFalse($bar->hasMethod('magicBehaviorMethod'));
		$bar->attachBehavior('bar', $behavior);
		$this->assertFalse($bar->hasMethod('magicBehaviorMethod', false));
		$this->assertTrue($bar->hasMethod('magicBehaviorMethod'));

		$this->assertEquals('Magic Behavior Method Result!', $bar->magicBehaviorMethod());
	}

	public function testCallUnknownMethod()
	{
		$bar = new BarClass();
		$behavior = new BarBehavior();
		$this->setExpectedException('yii\base\UnknownMethodException');

		$this->assertFalse($bar->hasMethod('nomagicBehaviorMethod'));
		$bar->attachBehavior('bar', $behavior);
		$bar->nomagicBehaviorMethod();
	}

Alexander Makarov committed
106
}