* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Behat\Behat\Output\Statistics; use Behat\Behat\Tester\Result\StepResult; use Behat\Testwork\Counter\Memory; use Behat\Testwork\Counter\Timer; use Behat\Testwork\Tester\Result\TestResult; use Behat\Testwork\Tester\Result\TestResults; /** * Collects and provided exercise statistics. * * @author Konstantin Kudryashov */ final class TotalStatistics implements Statistics { /** * @var Timer */ private $timer; /** * @var Memory */ private $memory; /** * @var array */ private $scenarioCounters = array(); /** * @var array */ private $stepCounters = array(); /** * @var ScenarioStat[] */ private $failedScenarioStats = array(); /** * @var ScenarioStat[] */ private $skippedScenarioStats = array(); /** * @var StepStat[] */ private $failedStepStats = array(); /** * @var StepStat[] */ private $pendingStepStats = array(); /** * @var HookStat[] */ private $failedHookStats = array(); /** * Initializes statistics. */ public function __construct() { $this->resetAllCounters(); $this->timer = new Timer(); $this->memory = new Memory(); } public function resetAllCounters() { $this->scenarioCounters = $this->stepCounters = array( TestResult::PASSED => 0, TestResult::FAILED => 0, StepResult::UNDEFINED => 0, TestResult::PENDING => 0, TestResult::SKIPPED => 0 ); } /** * Starts timer. */ public function startTimer() { $this->timer->start(); } /** * Stops timer. */ public function stopTimer() { $this->timer->stop(); } /** * Returns timer object. * * @return Timer */ public function getTimer() { return $this->timer; } /** * Returns memory usage object. * * @return Memory */ public function getMemory() { return $this->memory; } /** * Registers scenario stat. * * @param ScenarioStat $stat */ public function registerScenarioStat(ScenarioStat $stat) { if (TestResults::NO_TESTS === $stat->getResultCode()) { return; } $this->scenarioCounters[$stat->getResultCode()]++; if (TestResult::FAILED === $stat->getResultCode()) { $this->failedScenarioStats[] = $stat; } if (TestResult::SKIPPED === $stat->getResultCode()) { $this->skippedScenarioStats[] = $stat; } } /** * Registers step stat. * * @param StepStat $stat */ public function registerStepStat(StepStat $stat) { $this->stepCounters[$stat->getResultCode()]++; if (TestResult::FAILED === $stat->getResultCode()) { $this->failedStepStats[] = $stat; } if (TestResult::PENDING === $stat->getResultCode()) { $this->pendingStepStats[] = $stat; } } /** * Registers hook stat. * * @param HookStat $stat */ public function registerHookStat(HookStat $stat) { if ($stat->isSuccessful()) { return; } $this->failedHookStats[] = $stat; } /** * Returns counters for different scenario result codes. * * @return array[] */ public function getScenarioStatCounts() { return $this->scenarioCounters; } /** * Returns skipped scenario stats. * * @return ScenarioStat[] */ public function getSkippedScenarios() { return $this->skippedScenarioStats; } /** * Returns failed scenario stats. * * @return ScenarioStat[] */ public function getFailedScenarios() { return $this->failedScenarioStats; } /** * Returns counters for different step result codes. * * @return array[] */ public function getStepStatCounts() { return $this->stepCounters; } /** * Returns failed step stats. * * @return StepStat[] */ public function getFailedSteps() { return $this->failedStepStats; } /** * Returns pending step stats. * * @return StepStat[] */ public function getPendingSteps() { return $this->pendingStepStats; } /** * Returns failed hook stats. * * @return HookStat[] */ public function getFailedHookStats() { return $this->failedHookStats; } }