/** * @dataProvider recursionProvider */ public function testRecursion(array $from, array $to, $expected) { $mapDiffer = new MapDiffer(true); $listDiffer = new ListDiffer(); $diff = new Diff($mapDiffer->doDiff($from, $to)); foreach ($expected as $key => &$value) { if ($value === 'list' || $value === 'map') { $differ = $value === 'list' ? $listDiffer : $mapDiffer; $value = new Diff($differ->doDiff(array_key_exists($key, $from) ? $from[$key] : array(), array_key_exists($key, $to) ? $to[$key] : array()), $value === 'map'); } } $sorter = function ($a, $b) { $aa = serialize($a); $bb = serialize($b); if ($aa == $bb) { return 0; } else { return $aa > $bb ? -1 : 1; } }; uasort($expected, $sorter); $diff->uasort($sorter); $actual = $diff->getArrayCopy(); $this->assertEquals($expected, $actual); }