public function testCanGetAddedLeafNodesRecursively()
{
/*
Node trees
Base:
foobaz/
bar
Comp:
foobar
foobaz/
bar
foo
quux/
bork
*/
$comp_subtree_mock = M::mock('Gittern\\Entity\\GitObject\\Tree');
$comp_tree_node = M::mock('Gittern\\Entity\\GitObject\\Node\\TreeNode', array('getName' => 'foobaz', 'getTree' => $comp_subtree_mock));
$base_subtree_mock = M::mock('Gittern\\Entity\\GitObject\\Tree');
$base_tree_node = M::mock('Gittern\\Entity\\GitObject\\Node\\TreeNode', array('getName' => 'foobaz', 'getTree' => $base_subtree_mock));
$base_new_subtree_mock = M::mock('Gittern\\Entity\\GitObject\\Tree');
$base_new_tree_node = M::mock('Gittern\\Entity\\GitObject\\Node\\TreeNode', array('getName' => 'quux', 'getTree' => $base_new_subtree_mock));
$node1 = M::mock(array('getName' => 'foobar'));
$node2 = M::mock(array('getName' => 'foo'));
$node3 = M::mock(array('getName' => 'bar'));
$node4 = M::mock(array('getName' => 'bork'));
$this->base_tree_mock->shouldReceive('hasNodeNamed')->with('foobar')->andReturn(false)->once()->atLeast();
$this->base_tree_mock->shouldReceive('hasNodeNamed')->with('foobaz')->andReturn(true)->once()->atLeast();
$this->base_tree_mock->shouldReceive('hasNodeNamed')->with('quux')->andReturn(false)->once()->atLeast();
$this->base_tree_mock->shouldReceive('getNodeNamed')->with('foobaz')->andReturn($comp_tree_node);
$this->comp_tree_mock->shouldReceive('getNodes')->andReturn(array($node1, $base_tree_node, $base_new_tree_node));
$comp_subtree_mock->shouldReceive('hasNodeNamed')->with('foo')->andReturn(false)->once()->atLeast();
$comp_subtree_mock->shouldReceive('hasNodeNamed')->with('bar')->andReturn(true)->once()->atLeast();
$base_subtree_mock->shouldReceive('getNodes')->andReturn(array($node2, $node3));
$base_new_subtree_mock->shouldReceive('getNodes')->andReturn(array($node4));
$this->assertEquals(array('foobar' => $node1, 'foobaz/foo' => $node2, 'quux/bork' => $node4), $this->diff->getAddedLeafNodesRecursive());
}