Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tests: allow the test suite to run on PHPUnit 8.x and 9.x #59

Merged
merged 9 commits into from
Dec 4, 2023
7 changes: 2 additions & 5 deletions .github/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,6 @@ Note: There may be an issue or PR open already. If so, please join the discussio

1. Fork/clone the repository.
2. Run `composer install`.
When installing on PHP >= 8.0, use `composer install --ignore-platform-req=php+`.
3. Create a new branch off the `master` branch to hold your patch.
If there is an open issue associated with your patch, including the issue number in the branch name is good practice.

Expand All @@ -152,10 +151,8 @@ To help you with this, a number of convenience scripts are available:
* `composer check-all` will run the `cs` + `test` checks in one go.
* `composer cs` will check for code style violations.
* `composer cbf` will run the autofixers for code style violations.
* `composer test` will run the unit tests (only works when on PHP < 8.1).
* `composer test-php8` will run the unit tests when you are working on PHP 8.1+.
Please note that using a `phpunit.xml` overload config file will not work with this script!
* `composer coverage` will run the unit tests with code coverage (only works when on PHP < 8.1).
* `composer test` will run the unit tests.
* `composer coverage` will run the unit tests with code coverage.
Note: you may want to use a custom `phpunit.xml` overload config file to tell PHPUnit where to place an HTML report.
Alternative run it like so: `composer coverage -- --coverage-html /path/to/report-dir/` to specify the location for the HTML report on the command line.
* `composer build` will build the phpcs.phar and phpcbf.phar files.
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/phpstan.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ jobs:
- name: Install PHP
uses: shivammathur/setup-php@v2
with:
php-version: '7.4'
php-version: 'latest'
coverage: none
tools: phpstan

Expand Down
19 changes: 1 addition & 18 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -131,37 +131,20 @@ jobs:
# Install dependencies and handle caching in one go.
# @link https://github.com/marketplace/actions/install-php-dependencies-with-composer
- name: Install Composer dependencies - normal
if: ${{ matrix.php < '8.0' }}
- name: Install Composer dependencies
uses: "ramsey/composer-install@v2"
with:
# Bust the cache at least once a month - output format: YYYY-MM.
custom-cache-suffix: $(date -u "+%Y-%m")

# For PHP 8.0+, we need to install with ignore platform reqs as PHPUnit 7 is still used.
- name: Install Composer dependencies - with ignore platform
if: ${{ matrix.php >= '8.0' }}
uses: "ramsey/composer-install@v2"
with:
composer-options: --ignore-platform-req=php+
custom-cache-suffix: $(date -u "+%Y-%m")

# Note: The code style check is run multiple times against every PHP version
# as it also acts as an integration test.
- name: 'PHPCS: set the path to PHP'
run: php bin/phpcs --config-set php_path php

- name: 'PHPUnit: run the tests'
if: ${{ matrix.php != '8.1' && matrix.php != '8.2' }}
run: vendor/bin/phpunit tests/AllTests.php

# We need to ignore the config file so that PHPUnit doesn't try to read it.
# The config file causes an error on PHP 8.1+ with PHPunit 7, but it's not needed here anyway
# as we can pass all required settings in the phpunit command.
- name: 'PHPUnit: run the tests on PHP > 8.0'
if: ${{ matrix.php == '8.1' || matrix.php == '8.2' }}
run: vendor/bin/phpunit tests/AllTests.php --no-configuration --bootstrap=tests/bootstrap.php --dont-report-useless-tests

- name: 'PHPCS: check code style without cache, no parallel'
if: ${{ matrix.custom_ini == false && matrix.php != '7.4' }}
run: php bin/phpcs --no-cache --parallel=1
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/CodeSniffer.conf
/phpcs.xml
/phpunit.xml
.phpunit.result.cache
.idea/*
/vendor/
composer.lock
Expand Down
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ The file documents changes to the PHP_CodeSniffer project.
- PSR2.Methods.FunctionCallSignature
- PSR2.Methods.FunctionClosingBrace
- Thanks to Atsushi Okui (@blue32a) for the patch
- Support for PHPUnit 8 and 9 to the test suite.
- Test suites for external standards which run via the PHPCS native test suite can now run on PHPUnit 4-9 (was 4-7).
- If any of these tests use the PHPUnit `setUp()`/`tearDown()` methods or overload the `setUp()` in the `AbstractSniffUnitTest` test case, they will need to be adjusted. See the [PR details for further information](https://github.com/PHPCSStandards/PHP_CodeSniffer/pull/59/commits/26384ebfcc0b1c1651b0e1e40c9b6c8c22881832).

### Changed
- Changes have been made to the way PHPCS handles invalid sniff properties being set in a custom ruleset
Expand Down
7 changes: 1 addition & 6 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
"ext-simplexml": "*"
},
"require-dev": {
"phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0"
"phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0"
},
"replace": {
"squizlabs/php_codesniffer": "> 2.0"
Expand All @@ -61,10 +61,6 @@
"Composer\\Config::disableProcessTimeout",
"@php ./vendor/phpunit/phpunit/phpunit tests/AllTests.php --no-coverage"
],
"test-php8": [
"Composer\\Config::disableProcessTimeout",
"@php ./vendor/phpunit/phpunit/phpunit tests/AllTests.php --no-configuration --bootstrap=tests/bootstrap.php --dont-report-useless-tests --no-coverage"
],
"coverage": [
"Composer\\Config::disableProcessTimeout",
"@php ./vendor/phpunit/phpunit/phpunit tests/AllTests.php -d max_execution_time=0"
Expand All @@ -82,7 +78,6 @@
"cs": "Check for code style violations.",
"cbf": "Fix code style violations.",
"test": "Run the unit tests without code coverage.",
"test-php8": "Run the unit tests without code coverage on PHP 8.1 or higher.",
"coverage": "Run the unit tests with code coverage.",
"build": "Create PHAR files for PHPCS and PHPCBF.",
"check-all": "Run all checks (phpcs, tests)."
Expand Down
12 changes: 11 additions & 1 deletion phpunit.xml.dist
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit beStrictAboutTestsThatDoNotTestAnything="false" bootstrap="tests/bootstrap.php">
<phpunit
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.2/phpunit.xsd"
backupGlobals="true"
beStrictAboutTestsThatDoNotTestAnything="false"
bootstrap="tests/bootstrap.php"
convertErrorsToExceptions="true"
convertWarningsToExceptions="true"
convertNoticesToExceptions="true"
convertDeprecationsToExceptions="true"
>
<testsuites>
<testsuite name="PHP_CodeSniffer Test Suite">
<file>tests/AllTests.php</file>
Expand Down
16 changes: 9 additions & 7 deletions src/Standards/Generic/Tests/Debug/ESLintUnitTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,31 +36,33 @@ class ESLintUnitTest extends AbstractSniffUnitTest
/**
* Sets up this unit test.
*
* @before
*
* @return void
*/
protected function setUp()
protected function setUpPrerequisites()
{
parent::setUp();
parent::setUpPrerequisites();

$cwd = getcwd();
file_put_contents($cwd.'/.eslintrc.json', self::ESLINT_CONFIG);

}//end setUp()
}//end setUpPrerequisites()


/**
* Remove artifact.
*
* @after
*
* @return void
*/
protected function tearDown()
protected function resetProperties()
{
parent::tearDown();

$cwd = getcwd();
unlink($cwd.'/.eslintrc.json');

}//end tearDown()
}//end resetProperties()


/**
Expand Down
2 changes: 1 addition & 1 deletion tests/AllTests.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
$phpunit7 = false;
if (class_exists('\PHPUnit\Runner\Version') === true) {
$version = \PHPUnit\Runner\Version::id();
if ($version[0] === '7') {
if (version_compare($version, '7.0', '>=') === true) {
$phpunit7 = true;
}
}
Expand Down
12 changes: 8 additions & 4 deletions tests/Core/AbstractMethodUnitTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,11 @@ abstract class AbstractMethodUnitTest extends TestCase
* The test case file for a unit test class has to be in the same directory
* directory and use the same file name as the test class, using the .inc extension.
*
* @beforeClass
*
* @return void
*/
public static function setUpBeforeClass()
public static function initializeFile()
{
$config = new Config();
$config->standards = ['PSR1'];
Expand All @@ -62,19 +64,21 @@ public static function setUpBeforeClass()
self::$phpcsFile = new DummyFile($contents, $ruleset, $config);
self::$phpcsFile->process();

}//end setUpBeforeClass()
}//end initializeFile()


/**
* Clean up after finished test.
*
* @afterClass
*
* @return void
*/
public static function tearDownAfterClass()
public static function resetFile()
{
self::$phpcsFile = null;

}//end tearDownAfterClass()
}//end resetFile()


/**
Expand Down
6 changes: 4 additions & 2 deletions tests/Core/Autoloader/DetermineLoadedClassTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,15 @@ class DetermineLoadedClassTest extends TestCase
/**
* Load the test files.
*
* @beforeClass
*
* @return void
*/
public static function setUpBeforeClass()
public static function includeFixture()
{
include __DIR__.'/TestFiles/Sub/C.inc';

}//end setUpBeforeClass()
}//end includeFixture()


/**
Expand Down
15 changes: 12 additions & 3 deletions tests/Core/File/GetClassPropertiesTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,22 @@ class GetClassPropertiesTest extends AbstractMethodUnitTest
*
* @dataProvider dataNotAClassException
*
* @expectedException PHP_CodeSniffer\Exceptions\RuntimeException
* @expectedExceptionMessage $stackPtr must be of type T_CLASS
*
* @return void
*/
public function testNotAClassException($testMarker, $tokenType)
{
$msg = '$stackPtr must be of type T_CLASS';
$exception = 'PHP_CodeSniffer\Exceptions\RuntimeException';

if (\method_exists($this, 'expectException') === true) {
// PHPUnit 5+.
$this->expectException($exception);
$this->expectExceptionMessage($msg);
} else {
// PHPUnit 4.
$this->setExpectedException($exception, $msg);
}

$target = $this->getTargetToken($testMarker, $tokenType);
self::$phpcsFile->getClassProperties($target);

Expand Down
39 changes: 32 additions & 7 deletions tests/Core/File/GetMemberPropertiesTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,10 @@ public function testGetMemberProperties($identifier, $expected)
$variable = $this->getTargetToken($identifier, T_VARIABLE);
$result = self::$phpcsFile->getMemberProperties($variable);

$this->assertArraySubset($expected, $result, true);
// Unset those indexes which are not being tested.
unset($result['type_token'], $result['type_end_token']);

$this->assertSame($expected, $result);

}//end testGetMemberProperties()

Expand Down Expand Up @@ -764,6 +767,7 @@ public function dataGetMemberProperties()
'scope' => 'public',
'scope_specified' => true,
'is_static' => false,
'is_readonly' => false,
'type' => 'Foo&Bar',
'nullable_type' => false,
],
Expand All @@ -774,6 +778,7 @@ public function dataGetMemberProperties()
'scope' => 'public',
'scope_specified' => true,
'is_static' => false,
'is_readonly' => false,
'type' => 'Foo&Bar&Baz',
'nullable_type' => false,
],
Expand All @@ -784,6 +789,7 @@ public function dataGetMemberProperties()
'scope' => 'public',
'scope_specified' => true,
'is_static' => false,
'is_readonly' => false,
'type' => 'int&string',
'nullable_type' => false,
],
Expand All @@ -794,6 +800,7 @@ public function dataGetMemberProperties()
'scope' => 'public',
'scope_specified' => true,
'is_static' => false,
'is_readonly' => false,
'type' => '?Foo&Bar',
'nullable_type' => true,
],
Expand All @@ -808,15 +815,24 @@ public function dataGetMemberProperties()
*
* @param string $identifier Comment which precedes the test case.
*
* @expectedException PHP_CodeSniffer\Exceptions\RuntimeException
* @expectedExceptionMessage $stackPtr is not a class member var
*
* @dataProvider dataNotClassProperty
*
* @return void
*/
public function testNotClassPropertyException($identifier)
{
$msg = '$stackPtr is not a class member var';
$exception = 'PHP_CodeSniffer\Exceptions\RuntimeException';

if (\method_exists($this, 'expectException') === true) {
// PHPUnit 5+.
$this->expectException($exception);
$this->expectExceptionMessage($msg);
} else {
// PHPUnit 4.
$this->setExpectedException($exception, $msg);
}

$variable = $this->getTargetToken($identifier, T_VARIABLE);
$result = self::$phpcsFile->getMemberProperties($variable);

Expand Down Expand Up @@ -848,13 +864,22 @@ public function dataNotClassProperty()
/**
* Test receiving an expected exception when a non variable is passed.
*
* @expectedException PHP_CodeSniffer\Exceptions\RuntimeException
* @expectedExceptionMessage $stackPtr must be of type T_VARIABLE
*
* @return void
*/
public function testNotAVariableException()
{
$msg = '$stackPtr must be of type T_VARIABLE';
$exception = 'PHP_CodeSniffer\Exceptions\RuntimeException';

if (\method_exists($this, 'expectException') === true) {
// PHPUnit 5+.
$this->expectException($exception);
$this->expectExceptionMessage($msg);
} else {
// PHPUnit 4.
$this->setExpectedException($exception, $msg);
}

$next = $this->getTargetToken('/* testNotAVariable */', T_RETURN);
$result = self::$phpcsFile->getMemberProperties($next);

Expand Down
Loading