assertNotFalse($expected, 'Output expectation file could not be found');
// Make the test OS independent.
$expected = str_replace("\n", PHP_EOL, $expected);
$this->expectOutputString($expected);
$generator = new MarkdownDouble($ruleset);
$generator->generate();
}//end testDocs()
/**
* Data provider.
*
* @return array element at the wrong level' => [
'sniffs' => 'StandardWithDocs.Unsupported.ElementAtWrongLevel',
'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputEmpty.txt',
],
'Unsupported: one correct elm, one at wrong level' => [
'sniffs' => 'StandardWithDocs.Unsupported.OneElmAtWrongLevel',
'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputUnsupportedOneElmAtWrongLevel.md',
],
'Unsupported: superfluous code element' => [
'sniffs' => 'StandardWithDocs.Unsupported.SuperfluousCodeElement',
'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputUnsupportedSuperfluousCodeElement.md',
],
'Unsupported: unknown element' => [
'sniffs' => 'StandardWithDocs.Unsupported.UnknownElement',
'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputEmpty.txt',
],
'Invalid: code comparison mismatched code elms' => [
'sniffs' => 'StandardWithDocs.Invalid.CodeComparisonMismatchedCodeElms',
'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidCodeComparisonMismatchedCodeElms.md',
],
'Invalid: code comparison only has one code elm' => [
'sniffs' => 'StandardWithDocs.Invalid.CodeComparisonMissingCodeElm',
'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidCodeComparisonMissingCodeElm.md',
],
'Invalid: code elements have no content' => [
'sniffs' => 'StandardWithDocs.Invalid.CodeComparisonNoCode',
'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidCodeComparisonNoCode.md',
],
'Invalid: code comparison element has no content' => [
'sniffs' => 'StandardWithDocs.Invalid.CodeComparisonNoContent',
'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidCodeComparisonNoContent.md',
],
'Invalid: code comparison two code elms, one empty' => [
'sniffs' => 'StandardWithDocs.Invalid.CodeComparisonOneEmptyCodeElm',
'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidCodeComparisonOneEmptyCodeElm.md',
],
'Invalid: code comparison two empty code elms' => [
'sniffs' => 'StandardWithDocs.Invalid.CodeComparisonTwoEmptyCodeElms',
'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidCodeComparisonTwoEmptyCodeElms.md',
],
'Invalid: code title attributes are empty' => [
'sniffs' => 'StandardWithDocs.Invalid.CodeTitleEmpty',
'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidCodeTitleEmpty.md',
],
'Invalid: code title attributes missing' => [
'sniffs' => 'StandardWithDocs.Invalid.CodeTitleMissing',
'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidCodeTitleMissing.md',
],
'Invalid: documentation title attribute is empty' => [
'sniffs' => 'StandardWithDocs.Invalid.DocumentationTitleEmpty',
'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidDocumentationTitleEmpty.md',
],
'Invalid: documentation title attribute missing' => [
'sniffs' => 'StandardWithDocs.Invalid.DocumentationTitleMissing',
'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidDocumentationTitleMissing.md',
],
'Invalid: standard element has no content' => [
'sniffs' => 'StandardWithDocs.Invalid.StandardNoContent',
'pathToExpected' => __DIR__.'/Expectations/ExpectedOutputInvalidStandardNoContent.md',
],
];
}//end dataDocSpecifics()
/**
* Test the generated footer.
*
* @return void
*/
public function testFooter()
{
// Set up the ruleset.
$standard = __DIR__.'/OneDocTest.xml';
$config = new ConfigDouble(["--standard=$standard"]);
$ruleset = new Ruleset($config);
$regex = '`^\RDocumentation generated on [A-Z][a-z]{2}, [0-9]{2} [A-Z][a-z]{2} 20[0-9]{2} [0-2][0-9](?::[0-5][0-9]){2} [+-][0-9]{4}';
$regex .= ' by \[PHP_CodeSniffer [3-9]\.[0-9]+.[0-9]+\]\(https://github\.com/PHPCSStandards/PHP_CodeSniffer\)\R$`';
$generator = new MarkdownDouble($ruleset);
$footer = $generator->getRealFooter();
if (method_exists($this, 'assertMatchesRegularExpression') === true) {
$this->assertMatchesRegularExpression($regex, $footer);
} else {
// PHPUnit < 9.1.0.
$this->assertRegExp($regex, $footer);
}
}//end testFooter()
/**
* Safeguard that the footer logic doesn't permanently change the error level.
*
* @runInSeparateProcess
* @preserveGlobalState disabled
*
* @return void
*/
public function testFooterResetsErrorReportingToOriginalSetting()
{
$expected = error_reporting();
// Set up the ruleset.
$standard = __DIR__.'/OneDocTest.xml';
$config = new ConfigDouble(["--standard=$standard"]);
$ruleset = new Ruleset($config);
$generator = new MarkdownDouble($ruleset);
$generator->getRealFooter();
$this->assertSame($expected, error_reporting());
}//end testFooterResetsErrorReportingToOriginalSetting()
/**
* Safeguard that users won't see a PHP warning about the timezone not being set when calling date().
*
* The warning we don't want to see is:
* "date(): It is not safe to rely on the system's timezone settings. You are *required* to use
* the date.timezone setting or the date_default_timezone_set() function. In case you used any of
* those methods and you are still getting this warning, you most likely misspelled the timezone
* identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select
* your timezone."
*
* JRF: Based on my tests, the warning only occurs on PHP < 7.0, but never a bad thing to safeguard this
* on a wider range of PHP versions.
*
* Note: as of PHP 8.2, PHP no longer accepts an empty string as timezone and will use `UTC` instead,
* so the warning on calling date() in the code itself would not display anyway.
*
* @requires PHP < 8.2
*
* @doesNotPerformAssertions
*
* @return void
*/
public function testFooterDoesntThrowWarningOnMissingTimezone()
{
$originalIni = @ini_set('date.timezone', '');
// Set up the ruleset.
$standard = __DIR__.'/OneDocTest.xml';
$config = new ConfigDouble(["--standard=$standard"]);
$ruleset = new Ruleset($config);
$generator = new MarkdownDouble($ruleset);
$generator->getRealFooter();
// Reset the timezone to its original state.
ini_set('date.timezone', $originalIni);
}//end testFooterDoesntThrowWarningOnMissingTimezone()
/**
* Perfunctory test to verify that extenders which call deprecated methods will see a deprecation notice.
*
* Note: not all deprecated methods are tested as some need arguments.
*
* @param string $methodName Name of the deprecated method to test.
*
* @dataProvider dataCallingDeprecatedMethodThrowsDeprecationNotice
*
* @return void
*/
public function testCallingDeprecatedMethodThrowsDeprecationNotice($methodName)
{
$exceptionClass = 'PHPUnit\Framework\Error\Deprecated';
if (class_exists($exceptionClass) === false) {
$exceptionClass = 'PHPUnit_Framework_Error_Deprecated';
}
$regex = '`^The PHP_CodeSniffer\\\\Generators\\\\Markdown::%s\(\) method is deprecated\. Use "echo [^\s]+::%s\(\)" instead\.$`';
$regex = sprintf($regex, preg_quote($methodName, '`'), str_replace('print', 'getFormatted', $methodName));
if (method_exists($this, 'expectExceptionMessageMatches') === true) {
$this->expectException($exceptionClass);
$this->expectExceptionMessageMatches($regex);
} else if (method_exists($this, 'expectExceptionMessageRegExp') === true) {
// PHPUnit < 8.4.0.
$this->expectException($exceptionClass);
$this->expectExceptionMessageRegExp($regex);
} else {
// PHPUnit < 5.2.0.
$this->setExpectedExceptionRegExp($exceptionClass, $regex);
}
// Set up the ruleset.
$standard = __DIR__.'/OneDocTest.xml';
$config = new ConfigDouble(["--standard=$standard"]);
$ruleset = new Ruleset($config);
$generator = new MarkdownDouble($ruleset);
$generator->$methodName();
}//end testCallingDeprecatedMethodThrowsDeprecationNotice()
/**
* Data provider.
*
* @return array