public function mockPipeCommands(array $pipelineConfig, Application $app, array $expectedFinalConfig = [], $expectAnyCalls = false) { $app->setConfig($expectedFinalConfig); $executionOrder = new \stdClass(); $executionOrder->order = []; $mockedCommands = []; foreach ($pipelineConfig as $command => $config) { preg_match('/^([\\w:]+)(.*)/', $command, $match); list($match, $commandName, $description) = $match; $expectedFinalConfig = array_merge($expectedFinalConfig, $this->stripOutSpecialParams($config)); $artifactKey = $commandName . '_artifact'; $artifactValue = $commandName . '_artifact_value'; $expectedFinalConfig[$artifactKey] = $artifactValue; if (!isset($mockedCommands[$commandName])) { $mockedCommands[$commandName] = [$this->mockCommand($app, $commandName), []]; } $mockCommand = $mockedCommands[$commandName][0]; $mockedCommands[$commandName][1][] = function () use($mockCommand, $artifactKey, $artifactValue, $commandName, &$executionOrder) { $mockCommand->set($artifactKey, $artifactValue); $executionOrder->order[] = $mockCommand->getName(); }; } // lets aggregate all the calls to doExecute for each command foreach ($mockedCommands as $mock) { list($mockCommand, $doExecuteCallbacks) = $mock; $mockCommand->expects($expectAnyCalls ? $this->any() : $this->exactly(count($doExecuteCallbacks)))->method('doExecute')->will($this->returnCallback(function () use($mockCommand, &$mockedCommands) { $callback = array_shift($mockedCommands[$mockCommand->getName()][1]); $callback(); })); $app->add($mockCommand); } return [$executionOrder, $expectedFinalConfig]; }