1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 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 106 107 108 109 110 111 112 113 114 115 116 117
|
<?php
namespace Illuminate\Tests\Support;
use Illuminate\Support\Traits\Macroable;
use PHPUnit\Framework\TestCase;
class SupportMacroableTest extends TestCase
{
private $macroable;
protected function setUp(): void
{
$this->macroable = $this->createObjectForTrait();
}
private function createObjectForTrait()
{
return new EmptyMacroable;
}
public function testRegisterMacro()
{
$macroable = $this->macroable;
$macroable::macro(__CLASS__, function () {
return 'Taylor';
});
$this->assertSame('Taylor', $macroable::{__CLASS__}());
}
public function testRegisterMacroAndCallWithoutStatic()
{
$macroable = $this->macroable;
$macroable::macro(__CLASS__, function () {
return 'Taylor';
});
$this->assertSame('Taylor', $macroable->{__CLASS__}());
}
public function testWhenCallingMacroClosureIsBoundToObject()
{
TestMacroable::macro('tryInstance', function () {
return $this->protectedVariable;
});
TestMacroable::macro('tryStatic', function () {
return static::getProtectedStatic();
});
$instance = new TestMacroable;
$result = $instance->tryInstance();
$this->assertSame('instance', $result);
$result = TestMacroable::tryStatic();
$this->assertSame('static', $result);
}
public function testClassBasedMacros()
{
TestMacroable::mixin(new TestMixin);
$instance = new TestMacroable;
$this->assertSame('instance-Adam', $instance->methodOne('Adam'));
}
public function testClassBasedMacrosNoReplace()
{
TestMacroable::macro('methodThree', function () {
return 'bar';
});
TestMacroable::mixin(new TestMixin, false);
$instance = new TestMacroable;
$this->assertSame('bar', $instance->methodThree());
TestMacroable::mixin(new TestMixin);
$this->assertSame('foo', $instance->methodThree());
}
}
class EmptyMacroable
{
use Macroable;
}
class TestMacroable
{
use Macroable;
protected $protectedVariable = 'instance';
protected static function getProtectedStatic()
{
return 'static';
}
}
class TestMixin
{
public function methodOne()
{
return function ($value) {
return $this->methodTwo($value);
};
}
protected function methodTwo()
{
return function ($value) {
return $this->protectedVariable.'-'.$value;
};
}
protected function methodThree()
{
return function () {
return 'foo';
};
}
}
|