--- /dev/null
+<?php
+
+/*
+ * This file is part of the Behat.
+ * (c) Konstantin Kudryashov <ever.zet@gmail.com>
+ *
+ * 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 <ever.zet@gmail.com>
+ */
+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;
+ }
+}