public function testApiDestroy_BehavesAsIntended($container)
{
$manager = $this->getMock(RuntimeManager::class, [], [], '', false);
$manager->expects($this->once())->method('getRuntimes')->will($this->returnValue([]));
$manager->expects($this->once())->method('destroyRuntimes')->with([], Runtime::DESTROY_FORCE)->will($this->returnValue(null));
$core = $this->createCore();
$loop = $this->createLoop();
$model = $this->createModel($core, $container, ['getRuntimeManager']);
$model->expects($this->atLeastOnce())->method('getRuntimeManager')->will($this->returnValue($manager));
$model->setCore($core);
$model->setLoop($loop);
$this->setProtectedProperty($container, 'model', $model);
$events = [];
$addEvent = function ($name) use(&$events) {
$events[] = $name;
};
$awaitEvent = function ($name) use($container, $addEvent) {
$container->on($name, function () use($name, $addEvent) {
$addEvent($name);
});
};
$awaitEvent('beforeStop');
$awaitEvent('stop');
$awaitEvent('afterStop');
$awaitEvent('beforeDestroy');
$awaitEvent('destroy');
$awaitEvent('afterDestroy');
$container->once('start', function () use($container) {
$container->destroy()->then($this->expectCallableOnce());
});
$container->create();
$this->assertTrue($container->isDestroyed());
$this->assertSame(['beforeStop', 'stop', 'afterStop', 'beforeDestroy', 'destroy', 'afterDestroy'], $events);
unset($container);
unset($model);
unset($loop);
unset($core);
}