Skip to content

Commit

Permalink
Add warnings when using the --skip-initial-test-suite option
Browse files Browse the repository at this point in the history
  • Loading branch information
duncan3dc committed Feb 17, 2020
1 parent 110e1a6 commit 91f92a0
Show file tree
Hide file tree
Showing 7 changed files with 64 additions and 9 deletions.
4 changes: 4 additions & 0 deletions src/Command/InfectionCommand.php
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,10 @@ private function startUp(): void

$coverageChecker = $this->container->getCoverageRequirementChecker();

if ($coverageChecker->hasSkipInitialTestSuiteWithoutCoverageOption()) {
throw CoverageDoesNotExistException::mustAlreadyExist();
}

if (!$coverageChecker->hasDebuggerOrCoverageOption()) {
throw CoverageDoesNotExistException::unableToGenerate();
}
Expand Down
9 changes: 9 additions & 0 deletions src/Console/ConsoleOutput.php
Original file line number Diff line number Diff line change
Expand Up @@ -129,4 +129,13 @@ public function logNotInControlOfExitCodes(): void
'It is your responsibility to disable xdebug/phpdbg unless needed.',
]);
}

public function logSkippingInitialTestSuite(): void
{
$this->io->warning([
'Skipping the initial test suite run can be very dangerous.' . PHP_EOL .
'It is your responsibility to ensure the test suite is in a passing state to begin.' . PHP_EOL .
'If this is not done then mutations may report as caught when they are not.',
]);
}
}
3 changes: 2 additions & 1 deletion src/Container.php
Original file line number Diff line number Diff line change
Expand Up @@ -297,7 +297,8 @@ public static function create(): self
$config = $container->getConfiguration();

return new CoverageRequirementChecker(
$config->getCoveragePath() !== '',
$config->shouldSkipCoverage(),
$config->shouldSkipInitialTestSuite(),
$config->getInitialTestsPhpOptions() ?? ''
);
},
Expand Down
1 change: 1 addition & 0 deletions src/Engine.php
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,7 @@ public function execute(int $threads): bool
private function runInitialTestSuite(): void
{
if ($this->config->shouldSkipInitialTestSuite()) {
$this->consoleOutput->logSkippingInitialTestSuite();
$this->assertCodeCoverageExists($this->config->getTestFramework());

return;
Expand Down
9 changes: 8 additions & 1 deletion src/Process/Coverage/CoverageRequirementChecker.php
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,13 @@
final class CoverageRequirementChecker
{
private $skipCoverage;
private $skipInitialTestSuite;
private $initialTestPhpOptions;

public function __construct(bool $skipCoverage, string $initialTestPhpOptions)
public function __construct(bool $skipCoverage, bool $skipInitialTestSuite, string $initialTestPhpOptions)
{
$this->skipCoverage = $skipCoverage;
$this->skipInitialTestSuite = $skipInitialTestSuite;
$this->initialTestPhpOptions = $initialTestPhpOptions;
}

Expand Down Expand Up @@ -80,4 +82,9 @@ private function isPcovIncludedInInitialTestPhpOptions(): bool
$this->initialTestPhpOptions
);
}

public function hasSkipInitialTestSuiteWithoutCoverageOption(): bool
{
return $this->skipInitialTestSuite && !$this->skipCoverage;
}
}
5 changes: 5 additions & 0 deletions src/TestFramework/Coverage/CoverageDoesNotExistException.php
Original file line number Diff line number Diff line change
Expand Up @@ -92,4 +92,9 @@ public static function unableToGenerate(): self
self::INFECTION_USAGE_SUGGESTION
);
}

public static function mustAlreadyExist(): self
{
return new self('When skipping the initial test suite run, existing code coverage must be provided using --coverage');
}
}
42 changes: 35 additions & 7 deletions tests/phpunit/Process/Coverage/CoverageRequirementCheckerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public function test_it_has_debugger_or_coverage_option_on_phpdbg(): void
$this->requireNoXdebug();
$this->requireNoPcov();

$coverageChecker = new CoverageRequirementChecker(false, '');
$coverageChecker = new CoverageRequirementChecker(false, false, '');

$this->assertTrue($coverageChecker->hasDebuggerOrCoverageOption());
}
Expand All @@ -66,7 +66,7 @@ public function test_it_has_debugger_or_coverage_option_on_pcov(): void
$this->requireNoXdebug();
$this->requirePcov();

$coverageChecker = new CoverageRequirementChecker(false, '');
$coverageChecker = new CoverageRequirementChecker(false, false, '');

$this->assertTrue($coverageChecker->hasDebuggerOrCoverageOption());
}
Expand All @@ -77,7 +77,7 @@ public function test_it_has_debugger_or_coverage_option_with_xdebug(): void
$this->requireNoPcov();
$this->requireXdebug();

$coverageChecker = new CoverageRequirementChecker(false, '');
$coverageChecker = new CoverageRequirementChecker(false, false, '');

$this->assertTrue($coverageChecker->hasDebuggerOrCoverageOption());
}
Expand All @@ -88,7 +88,7 @@ public function test_it_has_debug_or_coverage_option_when_provided_with_coverage
$this->requireNoXdebug();
$this->requireNoPcov();

$coverageChecker = new CoverageRequirementChecker(true, '');
$coverageChecker = new CoverageRequirementChecker(true, false, '');

$this->assertTrue($coverageChecker->hasDebuggerOrCoverageOption());
}
Expand All @@ -99,7 +99,7 @@ public function test_it_has_debug_or_coverage_option_when_provided_with_correct_
$this->requireNoXdebug();
$this->requireNoPcov();

$coverageChecker = new CoverageRequirementChecker(false, '-d zend_extension=xdebug.so');
$coverageChecker = new CoverageRequirementChecker(false, false, '-d zend_extension=xdebug.so');

$this->assertTrue($coverageChecker->hasDebuggerOrCoverageOption());
}
Expand All @@ -110,7 +110,7 @@ public function test_it_has_debug_or_coverage_option_when_provided_with_correct_
$this->requireNoXdebug();
$this->requireNoPcov();

$coverageChecker = new CoverageRequirementChecker(false, '-d extension=pcov.so');
$coverageChecker = new CoverageRequirementChecker(false, false, '-d extension=pcov.so');

$this->assertTrue($coverageChecker->hasDebuggerOrCoverageOption());
}
Expand All @@ -121,11 +121,39 @@ public function test_it_has_no_debug_or_coverage_option_when_provided_with_incor
$this->requireNoXdebug();
$this->requireNoPcov();

$coverageChecker = new CoverageRequirementChecker(false, '--help');
$coverageChecker = new CoverageRequirementChecker(false, false, '--help');

$this->assertFalse($coverageChecker->hasDebuggerOrCoverageOption());
}

public function test_it_has_skip_initial_test_suite_without_coverage(): void
{
$coverageChecker = new CoverageRequirementChecker(false, true, '');

$this->assertTrue($coverageChecker->hasSkipInitialTestSuiteWithoutCoverageOption());
}

public function test_it_has_skip_initial_test_suite_with_coverage(): void
{
$coverageChecker = new CoverageRequirementChecker(true, true, '');

$this->assertFalse($coverageChecker->hasSkipInitialTestSuiteWithoutCoverageOption());
}

public function test_it_doesnt_have_skip_initial_test_suite_without_coverage(): void
{
$coverageChecker = new CoverageRequirementChecker(false, false, '');

$this->assertFalse($coverageChecker->hasSkipInitialTestSuiteWithoutCoverageOption());
}

public function test_it_doesnt_have_skip_initial_test_suite_with_coverage(): void
{
$coverageChecker = new CoverageRequirementChecker(true, false, '');

$this->assertFalse($coverageChecker->hasSkipInitialTestSuiteWithoutCoverageOption());
}

private function requirePhpDbg(): void
{
if (PHP_SAPI !== 'phpdbg') {
Expand Down

0 comments on commit 91f92a0

Please sign in to comment.