Skip to content

Commit 646a15b

Browse files
IonBazansebastianbergmann
authored andcommitted
Deprecate invalid named arguments in data providers
1 parent d2f7eb2 commit 646a15b

File tree

3 files changed

+121
-0
lines changed

3 files changed

+121
-0
lines changed

src/Framework/TestCase.php

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818
use const PATHINFO_FILENAME;
1919
use const PHP_EOL;
2020
use const PHP_URL_PATH;
21+
use function array_is_list;
2122
use function array_keys;
23+
use function array_map;
2224
use function array_merge;
2325
use function array_values;
2426
use function assert;
@@ -56,6 +58,7 @@
5658
use DeepCopy\DeepCopy;
5759
use PHPUnit\Event;
5860
use PHPUnit\Event\NoPreviousThrowableException;
61+
use PHPUnit\Event\RuntimeException;
5962
use PHPUnit\Event\TestData\MoreThanOneDataSetFromDataProviderException;
6063
use PHPUnit\Framework\Constraint\Exception as ExceptionConstraint;
6164
use PHPUnit\Framework\Constraint\ExceptionCode;
@@ -91,7 +94,9 @@
9194
use PHPUnit\Util\Test as TestUtil;
9295
use ReflectionClass;
9396
use ReflectionException;
97+
use ReflectionMethod;
9498
use ReflectionObject;
99+
use ReflectionParameter;
95100
use SebastianBergmann\CodeCoverage\StaticAnalysisCacheNotConfiguredException;
96101
use SebastianBergmann\CodeCoverage\UnintentionallyCoveredCodeException;
97102
use SebastianBergmann\Comparator\Comparator;
@@ -1061,6 +1066,37 @@ final public function setData(int|string $dataName, array $data): void
10611066
{
10621067
$this->dataName = $dataName;
10631068
$this->data = $data;
1069+
1070+
if (array_is_list($data)) {
1071+
return;
1072+
}
1073+
1074+
try {
1075+
$reflector = new ReflectionMethod($this, $this->name);
1076+
$parameters = array_map(static fn (ReflectionParameter $parameter) => $parameter->name, $reflector->getParameters());
1077+
1078+
foreach (array_keys($data) as $parameter) {
1079+
if (is_string($parameter) && !in_array($parameter, $parameters, true)) {
1080+
Event\Facade::emitter()->testTriggeredPhpunitDeprecation(
1081+
$this->valueObjectForEvents(),
1082+
sprintf(
1083+
'Providing invalid named argument $%s for method %s::%s() is deprecated and will not be supported in PHPUnit 11.0.',
1084+
$parameter,
1085+
$this::class,
1086+
$this->name,
1087+
),
1088+
);
1089+
}
1090+
}
1091+
// @codeCoverageIgnoreStart
1092+
} catch (ReflectionException $e) {
1093+
throw new RuntimeException(
1094+
$e->getMessage(),
1095+
$e->getCode(),
1096+
$e,
1097+
);
1098+
}
1099+
// @codeCoverageIgnoreEnd
10641100
}
10651101

10661102
/**
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php declare(strict_types=1);
2+
/*
3+
* This file is part of PHPUnit.
4+
*
5+
* (c) Sebastian Bergmann <sebastian@phpunit.de>
6+
*
7+
* For the full copyright and license information, please view the LICENSE
8+
* file that was distributed with this source code.
9+
*/
10+
namespace PHPUnit\TestFixture\Event;
11+
12+
use PHPUnit\Framework\Attributes\DataProvider;
13+
use PHPUnit\Framework\TestCase;
14+
15+
final class InvalidParameterNameDataProviderTest extends TestCase
16+
{
17+
public static function values(): array
18+
{
19+
return [
20+
['value1' => true, 'value2' => true],
21+
['value3' => true, 'value4' => true],
22+
];
23+
}
24+
25+
#[DataProvider('values')]
26+
public function testSuccess(bool $value1, bool $value2): void
27+
{
28+
$this->assertTrue($value1);
29+
$this->assertTrue($value2);
30+
}
31+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
--TEST--
2+
The right events are emitted in the right order for a test that uses a data provider that is not static
3+
--FILE--
4+
<?php declare(strict_types=1);
5+
$traceFile = tempnam(sys_get_temp_dir(), __FILE__);
6+
7+
$_SERVER['argv'][] = '--do-not-cache-result';
8+
$_SERVER['argv'][] = '--no-configuration';
9+
$_SERVER['argv'][] = '--no-output';
10+
$_SERVER['argv'][] = '--log-events-text';
11+
$_SERVER['argv'][] = $traceFile;
12+
$_SERVER['argv'][] = __DIR__ . '/_files/InvalidParameterNameDataProviderTest.php';
13+
14+
require __DIR__ . '/../../bootstrap.php';
15+
16+
(new PHPUnit\TextUI\Application)->run($_SERVER['argv']);
17+
18+
print file_get_contents($traceFile);
19+
20+
unlink($traceFile);
21+
--EXPECTF--
22+
PHPUnit Started (PHPUnit %s using %s)
23+
Test Runner Configured
24+
Data Provider Method Called (PHPUnit\TestFixture\Event\InvalidParameterNameDataProviderTest::values for test method PHPUnit\TestFixture\Event\InvalidParameterNameDataProviderTest::testSuccess)
25+
Data Provider Method Finished for PHPUnit\TestFixture\Event\InvalidParameterNameDataProviderTest::testSuccess:
26+
- PHPUnit\TestFixture\Event\InvalidParameterNameDataProviderTest::values
27+
Test Triggered PHPUnit Deprecation (PHPUnit\TestFixture\Event\InvalidParameterNameDataProviderTest::testSuccess#1)
28+
Providing invalid named argument $value3 for method PHPUnit\TestFixture\Event\InvalidParameterNameDataProviderTest::testSuccess() is deprecated and will not be supported in PHPUnit 11.0.
29+
Test Triggered PHPUnit Deprecation (PHPUnit\TestFixture\Event\InvalidParameterNameDataProviderTest::testSuccess#1)
30+
Providing invalid named argument $value4 for method PHPUnit\TestFixture\Event\InvalidParameterNameDataProviderTest::testSuccess() is deprecated and will not be supported in PHPUnit 11.0.
31+
Test Suite Loaded (2 tests)
32+
Event Facade Sealed
33+
Test Runner Started
34+
Test Suite Sorted
35+
Test Runner Execution Started (2 tests)
36+
Test Suite Started (PHPUnit\TestFixture\Event\InvalidParameterNameDataProviderTest, 2 tests)
37+
Test Suite Started (PHPUnit\TestFixture\Event\InvalidParameterNameDataProviderTest::testSuccess, 2 tests)
38+
Test Preparation Started (PHPUnit\TestFixture\Event\InvalidParameterNameDataProviderTest::testSuccess#0)
39+
Test Prepared (PHPUnit\TestFixture\Event\InvalidParameterNameDataProviderTest::testSuccess#0)
40+
Assertion Succeeded (Constraint: is true, Value: true)
41+
Assertion Succeeded (Constraint: is true, Value: true)
42+
Test Passed (PHPUnit\TestFixture\Event\InvalidParameterNameDataProviderTest::testSuccess#0)
43+
Test Finished (PHPUnit\TestFixture\Event\InvalidParameterNameDataProviderTest::testSuccess#0)
44+
Test Preparation Started (PHPUnit\TestFixture\Event\InvalidParameterNameDataProviderTest::testSuccess#1)
45+
Test Prepared (PHPUnit\TestFixture\Event\InvalidParameterNameDataProviderTest::testSuccess#1)
46+
Assertion Succeeded (Constraint: is true, Value: true)
47+
Assertion Succeeded (Constraint: is true, Value: true)
48+
Test Passed (PHPUnit\TestFixture\Event\InvalidParameterNameDataProviderTest::testSuccess#1)
49+
Test Finished (PHPUnit\TestFixture\Event\InvalidParameterNameDataProviderTest::testSuccess#1)
50+
Test Suite Finished (PHPUnit\TestFixture\Event\InvalidParameterNameDataProviderTest::testSuccess, 2 tests)
51+
Test Suite Finished (PHPUnit\TestFixture\Event\InvalidParameterNameDataProviderTest, 2 tests)
52+
Test Runner Execution Finished
53+
Test Runner Finished
54+
PHPUnit Finished (Shell Exit Code: 0)

0 commit comments

Comments
 (0)