public function testChannelModel_SendsAndReceivesDataCorrectlyThroughBroadcast_InThreesomeWithoutBuffer($data)
{
$this->simulate(function (SimulationInterface $sim) use($data) {
$loop = $sim->getLoop();
$sim->delayOnce('pass', 2, function () use($sim) {
$sim->done();
});
$master = $this->createModel($data['master'], $loop);
$slave1 = $this->createModel($data['slave1'], $loop);
$slave2 = $this->createModel($data['slave2'], $loop);
$master->on('start', function () use($master, $slave1, $slave2) {
$master->broadcast([self::MSG_2]);
$slave1->start();
$slave2->start();
});
$slave1->on('start', function () use($sim) {
$sim->emit('up');
});
$slave2->on('start', function () use($sim) {
$sim->emit('up');
});
$sim->delayOnce('up', 2, function () use($loop, $master) {
$loop->addTimer(0.25, function () use($master) {
$master->broadcast([self::MSG_3]);
});
});
$slave1->on('recv', function ($alias, $message) use($sim) {
$sim->expect('recv', [$alias, $message]);
$sim->emit('pass');
});
$slave2->on('recv', function ($alias, $message) use($sim) {
$sim->expect('recv', [$alias, $message]);
$sim->emit('pass');
});
$sim->onStart(function () use($master) {
$master->start();
});
$sim->onStop(function () use($master, $slave1, $slave2) {
$master->stop();
$slave1->stop();
$slave2->stop();
});
$master->broadcast([self::MSG_1]);
})->expect([['recv', [self::ALIAS_A, [self::MSG_3]]], ['recv', [self::ALIAS_A, [self::MSG_3]]]]);
}