public function renderInOrder(array $expected, array $actual)
{
if (empty($expected)) {
return $this->reset . 'Expected events.' . PHP_EOL . $this->failStart . 'No events recorded.' . $this->reset;
}
$from = $this->renderEvents($expected);
$to = $this->renderEvents($actual);
$matcher = new DifferenceSequenceMatcher($from, $to);
$diff = array();
foreach ($matcher->getOpcodes() as $opcode) {
list($tag, $i1, $i2, $j1, $j2) = $opcode;
if ($tag === 'equal') {
foreach (array_slice($from, $i1, $i2 - $i1) as $event) {
$diff[] = ' ' . $this->pass . ' ' . $event;
}
} else {
if ($tag === 'replace' || $tag === 'delete') {
foreach (array_slice($from, $i1, $i2 - $i1) as $event) {
$diff[] = ' ' . $this->fail . ' ' . $this->removeStart . $event . $this->removeEnd;
}
}
if ($tag === 'replace' || $tag === 'insert') {
foreach (array_slice($to, $j1, $j2 - $j1) as $event) {
$diff[] = ' - ' . $this->addStart . $event . $this->addEnd;
}
}
}
}
$renderedExpected = array();
foreach ($from as $event) {
$renderedExpected[] = ' - ' . $event;
}
$renderedActual = array();
foreach ($to as $event) {
$renderedActual[] = ' - ' . $event;
}
return $this->reset . 'Expected events in order:' . PHP_EOL . implode(PHP_EOL, $renderedExpected) . PHP_EOL . 'Actual order:' . PHP_EOL . implode(PHP_EOL, $renderedActual) . PHP_EOL . 'Difference:' . PHP_EOL . implode(PHP_EOL, $diff);
}