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 118 119 120 121
|
<?php
namespace Illuminate\Tests\Console;
use Illuminate\Console\Command;
use Illuminate\Console\Signals;
use Illuminate\Tests\Console\Fixtures\FakeSignalsRegistry;
use PHPUnit\Framework\TestCase;
class CommandTrapTest extends TestCase
{
protected $registry;
protected $signals;
protected $state;
protected function setUp(): void
{
Signals::resolveAvailabilityUsing(fn () => true);
$this->registry = new FakeSignalsRegistry();
$this->state = null;
}
public function testTrapWhenAvailable()
{
$command = $this->createCommand();
$command->trap('my-signal', function () {
$this->state = 'taylorotwell';
});
$this->registry->handle('my-signal');
$this->assertSame('taylorotwell', $this->state);
}
public function testTrapWhenNotAvailable()
{
Signals::resolveAvailabilityUsing(fn () => false);
$command = $this->createCommand();
$command->trap('my-signal', function () {
$this->state = 'taylorotwell';
});
$this->registry->handle('my-signal');
$this->assertNull($this->state);
}
public function testUntrap()
{
$command = $this->createCommand();
$command->trap('my-signal', function () {
$this->state = 'taylorotwell';
});
$command->untrap();
$this->registry->handle('my-signal');
$this->assertNull($this->state);
}
public function testNestedTraps()
{
$a = $this->createCommand();
$a->trap('my-signal', fn () => $this->state .= '1');
$b = $this->createCommand();
$b->trap('my-signal', fn () => $this->state .= '2');
$c = $this->createCommand();
$c->trap('my-signal', fn () => $this->state .= '3');
$this->state = '';
$this->registry->handle('my-signal');
$this->assertSame('321', $this->state);
$c->untrap();
$this->state = '';
$this->registry->handle('my-signal');
$this->assertSame('21', $this->state);
$d = $this->createCommand();
$d->trap('my-signal', fn () => $this->state .= '3');
$this->state = '';
$this->registry->handle('my-signal');
$this->assertSame('321', $this->state);
$d->untrap();
$this->state = '';
$this->registry->handle('my-signal');
$this->assertSame('21', $this->state);
$b->untrap();
$this->state = '';
$this->registry->handle('my-signal');
$this->assertSame('1', $this->state);
$a->untrap();
$this->state = '';
$this->registry->handle('my-signal');
$this->assertSame('', $this->state);
}
protected function createCommand()
{
$command = new Command;
$registry = $this->registry;
(fn () => $this->signals = new Signals($registry))->call($command);
return $command;
}
}
|