From f18856ceaffe531e45668f13ac926ad84b75a790 Mon Sep 17 00:00:00 2001 From: Sebastian Bergmann Date: Fri, 3 Feb 2023 20:30:41 +0100 Subject: [PATCH] Closes #5160 --- ChangeLog-9.6.md | 1 + src/Framework/Assert.php | 39 +++ .../Constraint/Object/ClassHasAttribute.php | 2 + .../Object/ClassHasStaticAttribute.php | 2 + .../Constraint/Object/ObjectHasAttribute.php | 2 + tests/unit/Framework/AssertTest.php | 305 ------------------ tests/unit/Framework/ConstraintTest.php | 181 ----------- 7 files changed, 46 insertions(+), 486 deletions(-) diff --git a/ChangeLog-9.6.md b/ChangeLog-9.6.md index ab7a2d54d43..e6e25004683 100644 --- a/ChangeLog-9.6.md +++ b/ChangeLog-9.6.md @@ -7,6 +7,7 @@ All notable changes of the PHPUnit 9.6 release series are documented in this fil ### Fixed * [#5073](https://github.com/sebastianbergmann/phpunit/issues/5073): `--no-extensions` CLI option only prevents extension PHARs from being loaded +* [#5160](https://github.com/sebastianbergmann/phpunit/issues/5160): PHPUnit 9.6 misses deprecations for assertions and constraints removed in PHPUnit 10 ## [9.6.0] - 2023-02-03 diff --git a/src/Framework/Assert.php b/src/Framework/Assert.php index 97321e35f54..a8e632329ce 100644 --- a/src/Framework/Assert.php +++ b/src/Framework/Assert.php @@ -1168,9 +1168,13 @@ public static function assertNan($actual, string $message = ''): void * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4601 */ public static function assertClassHasAttribute(string $attributeName, string $className, string $message = ''): void { + self::createWarning('assertClassHasAttribute() is deprecated and will be removed in PHPUnit 10.'); + if (!self::isValidClassAttributeName($attributeName)) { throw InvalidArgumentException::create(1, 'valid attribute name'); } @@ -1188,9 +1192,13 @@ public static function assertClassHasAttribute(string $attributeName, string $cl * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4601 */ public static function assertClassNotHasAttribute(string $attributeName, string $className, string $message = ''): void { + self::createWarning('assertClassNotHasAttribute() is deprecated and will be removed in PHPUnit 10.'); + if (!self::isValidClassAttributeName($attributeName)) { throw InvalidArgumentException::create(1, 'valid attribute name'); } @@ -1214,9 +1222,13 @@ public static function assertClassNotHasAttribute(string $attributeName, string * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4601 */ public static function assertClassHasStaticAttribute(string $attributeName, string $className, string $message = ''): void { + self::createWarning('assertClassHasStaticAttribute() is deprecated and will be removed in PHPUnit 10.'); + if (!self::isValidClassAttributeName($attributeName)) { throw InvalidArgumentException::create(1, 'valid attribute name'); } @@ -1238,9 +1250,13 @@ public static function assertClassHasStaticAttribute(string $attributeName, stri * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4601 */ public static function assertClassNotHasStaticAttribute(string $attributeName, string $className, string $message = ''): void { + self::createWarning('assertClassNotHasStaticAttribute() is deprecated and will be removed in PHPUnit 10.'); + if (!self::isValidClassAttributeName($attributeName)) { throw InvalidArgumentException::create(1, 'valid attribute name'); } @@ -1266,9 +1282,13 @@ public static function assertClassNotHasStaticAttribute(string $attributeName, s * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4601 */ public static function assertObjectHasAttribute(string $attributeName, $object, string $message = ''): void { + self::createWarning('assertObjectHasAttribute() is deprecated and will be removed in PHPUnit 10.'); + if (!self::isValidObjectAttributeName($attributeName)) { throw InvalidArgumentException::create(1, 'valid attribute name'); } @@ -1292,9 +1312,13 @@ public static function assertObjectHasAttribute(string $attributeName, $object, * @throws \SebastianBergmann\RecursionContext\InvalidArgumentException * @throws Exception * @throws ExpectationFailedException + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4601 */ public static function assertObjectNotHasAttribute(string $attributeName, $object, string $message = ''): void { + self::createWarning('assertObjectNotHasAttribute() is deprecated and will be removed in PHPUnit 10.'); + if (!self::isValidObjectAttributeName($attributeName)) { throw InvalidArgumentException::create(1, 'valid attribute name'); } @@ -2668,18 +2692,33 @@ public static function greaterThanOrEqual($value): LogicalOr ); } + /** + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4601 + */ public static function classHasAttribute(string $attributeName): ClassHasAttribute { + self::createWarning('classHasAttribute() is deprecated and will be removed in PHPUnit 10.'); + return new ClassHasAttribute($attributeName); } + /** + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4601 + */ public static function classHasStaticAttribute(string $attributeName): ClassHasStaticAttribute { + self::createWarning('classHasStaticAttribute() is deprecated and will be removed in PHPUnit 10.'); + return new ClassHasStaticAttribute($attributeName); } + /** + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4601 + */ public static function objectHasAttribute($attributeName): ObjectHasAttribute { + self::createWarning('objectHasAttribute() is deprecated and will be removed in PHPUnit 10.'); + return new ObjectHasAttribute($attributeName); } diff --git a/src/Framework/Constraint/Object/ClassHasAttribute.php b/src/Framework/Constraint/Object/ClassHasAttribute.php index 8df92712e66..a873ceaeeff 100644 --- a/src/Framework/Constraint/Object/ClassHasAttribute.php +++ b/src/Framework/Constraint/Object/ClassHasAttribute.php @@ -18,6 +18,8 @@ /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4601 */ class ClassHasAttribute extends Constraint { diff --git a/src/Framework/Constraint/Object/ClassHasStaticAttribute.php b/src/Framework/Constraint/Object/ClassHasStaticAttribute.php index c2c94109e72..538cbf08bc2 100644 --- a/src/Framework/Constraint/Object/ClassHasStaticAttribute.php +++ b/src/Framework/Constraint/Object/ClassHasStaticAttribute.php @@ -16,6 +16,8 @@ /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4601 */ final class ClassHasStaticAttribute extends ClassHasAttribute { diff --git a/src/Framework/Constraint/Object/ObjectHasAttribute.php b/src/Framework/Constraint/Object/ObjectHasAttribute.php index 5fbc0888c33..602cb05de23 100644 --- a/src/Framework/Constraint/Object/ObjectHasAttribute.php +++ b/src/Framework/Constraint/Object/ObjectHasAttribute.php @@ -13,6 +13,8 @@ /** * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit + * + * @deprecated https://github.com/sebastianbergmann/phpunit/issues/4601 */ final class ObjectHasAttribute extends ClassHasAttribute { diff --git a/tests/unit/Framework/AssertTest.php b/tests/unit/Framework/AssertTest.php index 5847f31e3a8..6c9f690af8f 100644 --- a/tests/unit/Framework/AssertTest.php +++ b/tests/unit/Framework/AssertTest.php @@ -34,7 +34,6 @@ use DateTimeZone; use PHPUnit\TestFixture\Author; use PHPUnit\TestFixture\Book; -use PHPUnit\TestFixture\ClassWithNonPublicAttributes; use PHPUnit\TestFixture\ClassWithToString; use PHPUnit\TestFixture\ObjectEquals\ValueObject; use PHPUnit\TestFixture\SampleArrayAccess; @@ -683,76 +682,6 @@ public function testAssertFileIsWritable(): void $this->assertFileIsWritable(__DIR__ . DIRECTORY_SEPARATOR . 'NotExisting'); } - public function testAssertObjectHasAttribute(): void - { - $o = new Author('Terry Pratchett'); - - $this->assertObjectHasAttribute('name', $o); - - $this->expectException(AssertionFailedError::class); - - $this->assertObjectHasAttribute('foo', $o); - } - - public function testAssertObjectHasAttributeNumericAttribute(): void - { - $object = new stdClass; - $object->{'2020'} = 'Tokyo'; - - $this->assertObjectHasAttribute('2020', $object); - - $this->expectException(AssertionFailedError::class); - - $this->assertObjectHasAttribute('2018', $object); - } - - public function testAssertObjectHasAttributeMultiByteAttribute(): void - { - $object = new stdClass; - $object->{'東京'} = 2020; - - $this->assertObjectHasAttribute('東京', $object); - - $this->expectException(AssertionFailedError::class); - - $this->assertObjectHasAttribute('長野', $object); - } - - public function testAssertObjectNotHasAttribute(): void - { - $o = new Author('Terry Pratchett'); - - $this->assertObjectNotHasAttribute('foo', $o); - - $this->expectException(AssertionFailedError::class); - - $this->assertObjectNotHasAttribute('name', $o); - } - - public function testAssertObjectNotHasAttributeNumericAttribute(): void - { - $object = new stdClass; - $object->{'2020'} = 'Tokyo'; - - $this->assertObjectNotHasAttribute('2018', $object); - - $this->expectException(AssertionFailedError::class); - - $this->assertObjectNotHasAttribute('2020', $object); - } - - public function testAssertObjectNotHasAttributeMultiByteAttribute(): void - { - $object = new stdClass; - $object->{'東京'} = 2020; - - $this->assertObjectNotHasAttribute('長野', $object); - - $this->expectException(AssertionFailedError::class); - - $this->assertObjectNotHasAttribute('東京', $object); - } - public function testAssertFinite(): void { $this->assertFinite(1); @@ -958,216 +887,6 @@ public function testLessThanOrEqual(): void $this->assertLessThanOrEqual(1, 2); } - public function testAssertClassHasAttributeThrowsExceptionIfAttributeNameIsNotValid(): void - { - $this->expectException(Exception::class); - - $this->assertClassHasAttribute('1', ClassWithNonPublicAttributes::class); - } - - public function testAssertClassHasAttributeThrowsExceptionIfClassDoesNotExist(): void - { - $this->expectException(Exception::class); - - $this->assertClassHasAttribute('attribute', ClassThatDoesNotExist::class); - } - - public function testAssertClassNotHasAttributeThrowsExceptionIfAttributeNameIsNotValid(): void - { - $this->expectException(Exception::class); - - $this->assertClassNotHasAttribute('1', ClassWithNonPublicAttributes::class); - } - - public function testAssertClassNotHasAttributeThrowsExceptionIfClassDoesNotExist(): void - { - $this->expectException(Exception::class); - - $this->assertClassNotHasAttribute('attribute', ClassThatDoesNotExist::class); - } - - public function testAssertClassHasStaticAttributeThrowsExceptionIfAttributeNameIsNotValid(): void - { - $this->expectException(Exception::class); - - $this->assertClassHasStaticAttribute('1', ClassWithNonPublicAttributes::class); - } - - public function testAssertClassHasStaticAttributeThrowsExceptionIfClassDoesNotExist(): void - { - $this->expectException(Exception::class); - - $this->assertClassHasStaticAttribute('attribute', ClassThatDoesNotExist::class); - } - - public function testAssertClassNotHasStaticAttributeThrowsExceptionIfAttributeNameIsNotValid(): void - { - $this->expectException(Exception::class); - - $this->assertClassNotHasStaticAttribute('1', ClassWithNonPublicAttributes::class); - } - - public function testAssertClassNotHasStaticAttributeThrowsExceptionIfClassDoesNotExist(): void - { - $this->expectException(Exception::class); - - $this->assertClassNotHasStaticAttribute('attribute', ClassThatDoesNotExist::class); - } - - public function testAssertObjectHasAttributeThrowsException2(): void - { - $this->expectException(Exception::class); - - $this->assertObjectHasAttribute('foo', null); - } - - public function testAssertObjectHasAttributeThrowsExceptionIfAttributeNameIsNotValid(): void - { - $this->expectException(Exception::class); - - $this->assertObjectHasAttribute('1', ClassWithNonPublicAttributes::class); - } - - public function testAssertObjectNotHasAttributeThrowsException2(): void - { - $this->expectException(Exception::class); - - $this->assertObjectNotHasAttribute('foo', null); - } - - public function testAssertObjectNotHasAttributeThrowsExceptionIfAttributeNameIsNotValid(): void - { - $this->expectException(Exception::class); - - $this->assertObjectNotHasAttribute('1', ClassWithNonPublicAttributes::class); - } - - public function testClassHasPublicAttribute(): void - { - $this->assertClassHasAttribute('publicAttribute', ClassWithNonPublicAttributes::class); - - $this->expectException(AssertionFailedError::class); - - $this->assertClassHasAttribute('attribute', ClassWithNonPublicAttributes::class); - } - - public function testClassNotHasPublicAttribute(): void - { - $this->assertClassNotHasAttribute('attribute', ClassWithNonPublicAttributes::class); - - $this->expectException(AssertionFailedError::class); - - $this->assertClassNotHasAttribute('publicAttribute', ClassWithNonPublicAttributes::class); - } - - public function testClassHasPublicStaticAttribute(): void - { - $this->assertClassHasStaticAttribute('publicStaticAttribute', ClassWithNonPublicAttributes::class); - - $this->expectException(AssertionFailedError::class); - - $this->assertClassHasStaticAttribute('attribute', ClassWithNonPublicAttributes::class); - } - - public function testClassNotHasPublicStaticAttribute(): void - { - $this->assertClassNotHasStaticAttribute('attribute', ClassWithNonPublicAttributes::class); - - $this->expectException(AssertionFailedError::class); - - $this->assertClassNotHasStaticAttribute('publicStaticAttribute', ClassWithNonPublicAttributes::class); - } - - public function testObjectHasPublicAttribute(): void - { - $obj = new ClassWithNonPublicAttributes; - - $this->assertObjectHasAttribute('publicAttribute', $obj); - - $this->expectException(AssertionFailedError::class); - - $this->assertObjectHasAttribute('attribute', $obj); - } - - public function testObjectNotHasPublicAttribute(): void - { - $obj = new ClassWithNonPublicAttributes; - - $this->assertObjectNotHasAttribute('attribute', $obj); - - $this->expectException(AssertionFailedError::class); - - $this->assertObjectNotHasAttribute('publicAttribute', $obj); - } - - public function testObjectHasOnTheFlyAttribute(): void - { - $obj = new stdClass; - $obj->foo = 'bar'; - - $this->assertObjectHasAttribute('foo', $obj); - - $this->expectException(AssertionFailedError::class); - - $this->assertObjectHasAttribute('bar', $obj); - } - - public function testObjectNotHasOnTheFlyAttribute(): void - { - $obj = new stdClass; - $obj->foo = 'bar'; - - $this->assertObjectNotHasAttribute('bar', $obj); - - $this->expectException(AssertionFailedError::class); - - $this->assertObjectNotHasAttribute('foo', $obj); - } - - public function testObjectHasProtectedAttribute(): void - { - $obj = new ClassWithNonPublicAttributes; - - $this->assertObjectHasAttribute('protectedAttribute', $obj); - - $this->expectException(AssertionFailedError::class); - - $this->assertObjectHasAttribute('attribute', $obj); - } - - public function testObjectNotHasProtectedAttribute(): void - { - $obj = new ClassWithNonPublicAttributes; - - $this->assertObjectNotHasAttribute('attribute', $obj); - - $this->expectException(AssertionFailedError::class); - - $this->assertObjectNotHasAttribute('protectedAttribute', $obj); - } - - public function testObjectHasPrivateAttribute(): void - { - $obj = new ClassWithNonPublicAttributes; - - $this->assertObjectHasAttribute('privateAttribute', $obj); - - $this->expectException(AssertionFailedError::class); - - $this->assertObjectHasAttribute('attribute', $obj); - } - - public function testObjectNotHasPrivateAttribute(): void - { - $obj = new ClassWithNonPublicAttributes; - - $this->assertObjectNotHasAttribute('attribute', $obj); - - $this->expectException(AssertionFailedError::class); - - $this->assertObjectNotHasAttribute('privateAttribute', $obj); - } - /** * @doesNotPerformAssertions */ @@ -1258,30 +977,6 @@ public function testAssertThatArrayHasKey(): void $this->assertThat(['foo' => 'bar'], $this->arrayHasKey('foo')); } - public function testAssertThatClassHasAttribute(): void - { - $this->assertThat( - new ClassWithNonPublicAttributes, - $this->classHasAttribute('publicAttribute') - ); - } - - public function testAssertThatClassHasStaticAttribute(): void - { - $this->assertThat( - new ClassWithNonPublicAttributes, - $this->classHasStaticAttribute('publicStaticAttribute') - ); - } - - public function testAssertThatObjectHasAttribute(): void - { - $this->assertThat( - new ClassWithNonPublicAttributes, - $this->objectHasAttribute('publicAttribute') - ); - } - public function testAssertThatEqualTo(): void { $this->assertThat('foo', $this->equalTo('foo')); diff --git a/tests/unit/Framework/ConstraintTest.php b/tests/unit/Framework/ConstraintTest.php index a54d2a35288..bdb48d5a000 100644 --- a/tests/unit/Framework/ConstraintTest.php +++ b/tests/unit/Framework/ConstraintTest.php @@ -15,7 +15,6 @@ use Countable; use PHPUnit\Framework\Constraint\Count; use PHPUnit\Framework\Constraint\SameSize; -use PHPUnit\TestFixture\ClassWithNonPublicAttributes; use PHPUnit\TestFixture\DummyException; use PHPUnit\TestFixture\TestIterator; use PHPUnit\Util\Filter; @@ -883,186 +882,6 @@ public function testConstraintNotLessThanOrEqual2(): void $this->fail(); } - public function testConstraintClassNotHasAttribute(): void - { - $constraint = Assert::logicalNot( - Assert::classHasAttribute('privateAttribute') - ); - - $this->assertTrue($constraint->evaluate(stdClass::class, '', true)); - $this->assertFalse($constraint->evaluate(ClassWithNonPublicAttributes::class, '', true)); - $this->assertEquals('does not have attribute "privateAttribute"', $constraint->toString()); - $this->assertCount(1, $constraint); - - try { - $constraint->evaluate(ClassWithNonPublicAttributes::class); - } catch (ExpectationFailedException $e) { - $this->assertEquals( - sprintf( - <<<'EOF' -Failed asserting that class "%s" does not have attribute "privateAttribute". - -EOF - , - ClassWithNonPublicAttributes::class - ), - TestFailure::exceptionToString($e) - ); - - return; - } - - $this->fail(); - } - - public function testConstraintClassNotHasAttribute2(): void - { - $constraint = Assert::logicalNot( - Assert::classHasAttribute('privateAttribute') - ); - - try { - $constraint->evaluate(ClassWithNonPublicAttributes::class, 'custom message'); - } catch (ExpectationFailedException $e) { - $this->assertEquals( - sprintf( - <<<'EOF' -custom message -Failed asserting that class "%s" does not have attribute "privateAttribute". - -EOF - , - ClassWithNonPublicAttributes::class - ), - TestFailure::exceptionToString($e) - ); - - return; - } - - $this->fail(); - } - - public function testConstraintClassNotHasStaticAttribute(): void - { - $constraint = Assert::logicalNot( - Assert::classHasStaticAttribute('privateStaticAttribute') - ); - - $this->assertTrue($constraint->evaluate(stdClass::class, '', true)); - $this->assertFalse($constraint->evaluate(ClassWithNonPublicAttributes::class, '', true)); - $this->assertEquals('does not have static attribute "privateStaticAttribute"', $constraint->toString()); - $this->assertCount(1, $constraint); - - try { - $constraint->evaluate(ClassWithNonPublicAttributes::class); - } catch (ExpectationFailedException $e) { - $this->assertEquals( - sprintf( - <<<'EOF' -Failed asserting that class "%s" does not have static attribute "privateStaticAttribute". - -EOF - , - ClassWithNonPublicAttributes::class - ), - TestFailure::exceptionToString($e) - ); - - return; - } - - $this->fail(); - } - - public function testConstraintClassNotHasStaticAttribute2(): void - { - $constraint = Assert::logicalNot( - Assert::classHasStaticAttribute('privateStaticAttribute') - ); - - try { - $constraint->evaluate(ClassWithNonPublicAttributes::class, 'custom message'); - } catch (ExpectationFailedException $e) { - $this->assertEquals( - sprintf( - <<<'EOF' -custom message -Failed asserting that class "%s" does not have static attribute "privateStaticAttribute". - -EOF - , - ClassWithNonPublicAttributes::class - ), - TestFailure::exceptionToString($e) - ); - - return; - } - - $this->fail(); - } - - public function testConstraintObjectNotHasAttribute(): void - { - $constraint = Assert::logicalNot( - Assert::objectHasAttribute('privateAttribute') - ); - - $this->assertTrue($constraint->evaluate(new stdClass, '', true)); - $this->assertFalse($constraint->evaluate(new ClassWithNonPublicAttributes, '', true)); - $this->assertEquals('does not have attribute "privateAttribute"', $constraint->toString()); - $this->assertCount(1, $constraint); - - try { - $constraint->evaluate(new ClassWithNonPublicAttributes); - } catch (ExpectationFailedException $e) { - $this->assertEquals( - sprintf( - <<<'EOF' -Failed asserting that object of class "%s" does not have attribute "privateAttribute". - -EOF - , - ClassWithNonPublicAttributes::class - ), - TestFailure::exceptionToString($e) - ); - - return; - } - - $this->fail(); - } - - public function testConstraintObjectNotHasAttribute2(): void - { - $constraint = Assert::logicalNot( - Assert::objectHasAttribute('privateAttribute') - ); - - try { - $constraint->evaluate(new ClassWithNonPublicAttributes, 'custom message'); - } catch (ExpectationFailedException $e) { - $this->assertEquals( - sprintf( - <<<'EOF' -custom message -Failed asserting that object of class "%s" does not have attribute "privateAttribute". - -EOF - , - ClassWithNonPublicAttributes::class - ), - TestFailure::exceptionToString($e) - ); - - return; - } - - $this->fail(); - } - /** * @testdox Constraint PCRE not match */