/**
* @covers DataSift\Storyplayer\PlayerLib\Action_LogItem::endAction
* @covers DataSift\Storyplayer\PlayerLib\Action_LogItem::closeAllOpenSubActions
* @covers DataSift\Storyplayer\PlayerLib\Action_LogItem::getStartTime
* @covers DataSift\Storyplayer\PlayerLib\Action_LogItem::getIsComplete
*/
public function testEndingAnActionEndsAllNestedActionsToo()
{
// ----------------------------------------------------------------
// setup your test
// the messages we are logging
$startMsg1 = "This is a test message";
$startMsg2 = "This is the nested test message";
// our DI container
$i = new Injectables();
// our mocked output object
$i->output = Mockery::mock("DataSift\\Storyplayer\\Output");
$i->output->shouldReceive('logPhaseActivity')->once()->with($startMsg1, null);
$i->output->shouldReceive('logPhaseActivity')->once()->with(' ' . $startMsg2, null);
// our real data formatter
$i->dataFormatter = new DataFormatter();
// our unit under test
$obj = new Action_LogItem($i, 1);
$obj->startAction($startMsg1);
// make sure the message started
$this->assertNotNull($obj->getStartTime());
// start our nested actions
$nestedObj1 = $obj->newNestedAction();
$nestedObj1->startAction($startMsg2);
$nestedObj2 = $obj->newNestedAction();
$this->assertTrue($nestedObj1 instanceof Action_LogItem);
$this->assertEquals(2, $nestedObj1->getNestLevel());
$this->assertTrue($nestedObj2 instanceof Action_LogItem);
$this->assertEquals(3, $nestedObj2->getNestLevel());
// ----------------------------------------------------------------
// perform the change
$obj->endAction();
// ----------------------------------------------------------------
// test the results
$this->assertTrue($nestedObj2->getIsComplete());
$this->assertTrue($nestedObj1->getIsComplete());
$this->assertTrue($obj->getIsComplete());
Mockery::close();
}