text: <?php
  namespace Codeception\Test\Feature;
  
  use Codeception\Test\Descriptor;
  use Codeception\Test\Interfaces\StrictCoverage;
  
  trait CodeCoverage
  {
      /**
       * @return \PHPUnit\Framework\TestResult
       */
      abstract public function getTestResultObject();
  
      public function codeCoverageStart()
      {
          $codeCoverage = $this->getTestResultObject()->getCodeCoverage();
          if (!$codeCoverage) {
              return;
          }
          $codeCoverage->start(Descriptor::getTestSignature($this));
      }
  
      public function codeCoverageEnd($status, $time)
      {
          $codeCoverage = $this->getTestResultObject()->getCodeCoverage();
          if (!$codeCoverage) {
              return;
          }
  
          if ($this instanceof StrictCoverage) {
              $linesToBeCovered = $this->getLinesToBeCovered();
              $linesToBeUsed = $this->getLinesToBeUsed();
          } else {
              $linesToBeCovered = [];
              $linesToBeUsed = [];
          }
  
          try {
              $codeCoverage->stop(true, $linesToBeCovered, $linesToBeUsed);
          } catch (\PHP_CodeCoverage_Exception $cce) {
              if ($status === \Codeception\Test\Test::STATUS_OK) {
                  $this->getTestResultObject()->addError($this, $cce, $time);
              }
          }
      }
  }
  