Skip to content

Commit c11f1e6

Browse files
markrogoyskisebastianbergmann
authored andcommitted
Fix assertObjectHasAttribute by making a distinction between class attributes and object attributes, as their rules for naming are different.
1 parent bdfd54b commit c11f1e6

File tree

2 files changed

+54
-27
lines changed

2 files changed

+54
-27
lines changed

src/Framework/Assert.php

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1252,7 +1252,7 @@ public static function assertNan($actual, string $message = ''): void
12521252
*/
12531253
public static function assertClassHasAttribute(string $attributeName, string $className, string $message = ''): void
12541254
{
1255-
if (!self::isValidAttributeName($attributeName)) {
1255+
if (!self::isValidClassAttributeName($attributeName)) {
12561256
throw InvalidArgumentHelper::factory(1, 'valid attribute name');
12571257
}
12581258

@@ -1271,7 +1271,7 @@ public static function assertClassHasAttribute(string $attributeName, string $cl
12711271
*/
12721272
public static function assertClassNotHasAttribute(string $attributeName, string $className, string $message = ''): void
12731273
{
1274-
if (!self::isValidAttributeName($attributeName)) {
1274+
if (!self::isValidClassAttributeName($attributeName)) {
12751275
throw InvalidArgumentHelper::factory(1, 'valid attribute name');
12761276
}
12771277

@@ -1296,7 +1296,7 @@ public static function assertClassNotHasAttribute(string $attributeName, string
12961296
*/
12971297
public static function assertClassHasStaticAttribute(string $attributeName, string $className, string $message = ''): void
12981298
{
1299-
if (!self::isValidAttributeName($attributeName)) {
1299+
if (!self::isValidClassAttributeName($attributeName)) {
13001300
throw InvalidArgumentHelper::factory(1, 'valid attribute name');
13011301
}
13021302

@@ -1319,7 +1319,7 @@ public static function assertClassHasStaticAttribute(string $attributeName, stri
13191319
*/
13201320
public static function assertClassNotHasStaticAttribute(string $attributeName, string $className, string $message = ''): void
13211321
{
1322-
if (!self::isValidAttributeName($attributeName)) {
1322+
if (!self::isValidClassAttributeName($attributeName)) {
13231323
throw InvalidArgumentHelper::factory(1, 'valid attribute name');
13241324
}
13251325

@@ -1346,7 +1346,7 @@ public static function assertClassNotHasStaticAttribute(string $attributeName, s
13461346
*/
13471347
public static function assertObjectHasAttribute(string $attributeName, $object, string $message = ''): void
13481348
{
1349-
if (!self::isValidAttributeName($attributeName)) {
1349+
if (!self::isValidObjectAttributeName($attributeName)) {
13501350
throw InvalidArgumentHelper::factory(1, 'valid attribute name');
13511351
}
13521352

@@ -1371,7 +1371,7 @@ public static function assertObjectHasAttribute(string $attributeName, $object,
13711371
*/
13721372
public static function assertObjectNotHasAttribute(string $attributeName, $object, string $message = ''): void
13731373
{
1374-
if (!self::isValidAttributeName($attributeName)) {
1374+
if (!self::isValidObjectAttributeName($attributeName)) {
13751375
throw InvalidArgumentHelper::factory(1, 'valid attribute name');
13761376
}
13771377

@@ -2717,7 +2717,7 @@ public static function fail(string $message = ''): void
27172717
*/
27182718
public static function readAttribute($classOrObject, string $attributeName)
27192719
{
2720-
if (!self::isValidAttributeName($attributeName)) {
2720+
if (!self::isValidClassAttributeName($attributeName)) {
27212721
throw InvalidArgumentHelper::factory(2, 'valid attribute name');
27222722
}
27232723

@@ -2763,7 +2763,7 @@ public static function getStaticAttribute(string $className, string $attributeNa
27632763
throw InvalidArgumentHelper::factory(1, 'class name');
27642764
}
27652765

2766-
if (!self::isValidAttributeName($attributeName)) {
2766+
if (!self::isValidClassAttributeName($attributeName)) {
27672767
throw InvalidArgumentHelper::factory(2, 'valid attribute name');
27682768
}
27692769

@@ -2803,7 +2803,7 @@ public static function getObjectAttribute($object, string $attributeName)
28032803
throw InvalidArgumentHelper::factory(1, 'object');
28042804
}
28052805

2806-
if (!self::isValidAttributeName($attributeName)) {
2806+
if (!self::isValidClassAttributeName($attributeName)) {
28072807
throw InvalidArgumentHelper::factory(2, 'valid attribute name');
28082808
}
28092809

@@ -2873,7 +2873,12 @@ public static function resetCount(): void
28732873
self::$count = 0;
28742874
}
28752875

2876-
private static function isValidAttributeName(string $attributeName): bool
2876+
private static function isValidObjectAttributeName(string $attributeName): bool
2877+
{
2878+
return \preg_match('/[^\x00-\x1f\x7f-\x9f]+/', $attributeName);
2879+
}
2880+
2881+
private static function isValidClassAttributeName(string $attributeName): bool
28772882
{
28782883
return \preg_match('/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/', $attributeName);
28792884
}

tests/unit/Framework/AssertTest.php

Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -968,28 +968,26 @@ public function testAssertObjectHasAttribute(): void
968968

969969
public function testAssertObjectHasAttributeNumericAttribute(): void
970970
{
971-
$object = (object) [
972-
'2016' => [
973-
'hostCity' => 'Rio',
974-
'games' => 'summer',
975-
],
976-
'2018' => [
977-
'hostCity' => 'Pyeongchang',
978-
'games' => 'winter',
979-
],
980-
'2020' => [
981-
'hostCity' => 'Tokyo',
982-
'games' => 'summer',
983-
],
984-
];
971+
$object = new \stdClass();
972+
$object->{'2020'} = 'Tokyo';
985973

986-
$this->assertObjectHasAttribute('2016', $object);
987-
$this->assertObjectHasAttribute('2018', $object);
988974
$this->assertObjectHasAttribute('2020', $object);
989975

990976
$this->expectException(AssertionFailedError::class);
991977

992-
$this->assertObjectHasAttribute('foo', $object);
978+
$this->assertObjectHasAttribute('2018', $object);
979+
}
980+
981+
public function testAssertObjectHasAttributeMultiByteAttribute(): void
982+
{
983+
$object = new \stdClass();
984+
$object->{'東京'} = 2020;
985+
986+
$this->assertObjectHasAttribute('東京', $object);
987+
988+
$this->expectException(AssertionFailedError::class);
989+
990+
$this->assertObjectHasAttribute('長野', $object);
993991
}
994992

995993
public function testAssertObjectNotHasAttribute(): void
@@ -1003,6 +1001,30 @@ public function testAssertObjectNotHasAttribute(): void
10031001
$this->assertObjectNotHasAttribute('name', $o);
10041002
}
10051003

1004+
public function testAssertObjectNotHasAttributeNumericAttribute(): void
1005+
{
1006+
$object = new \stdClass();
1007+
$object->{'2020'} = 'Tokyo';
1008+
1009+
$this->assertObjectNotHasAttribute('2018', $object);
1010+
1011+
$this->expectException(AssertionFailedError::class);
1012+
1013+
$this->assertObjectNotHasAttribute('2020', $object);
1014+
}
1015+
1016+
public function testAssertObjectNotHasAttributeMultiByteAttribute(): void
1017+
{
1018+
$object = new \stdClass();
1019+
$object->{'東京'} = 2020;
1020+
1021+
$this->assertObjectNotHasAttribute('長野', $object);
1022+
1023+
$this->expectException(AssertionFailedError::class);
1024+
1025+
$this->assertObjectNotHasAttribute('東京', $object);
1026+
}
1027+
10061028
public function testAssertFinite(): void
10071029
{
10081030
$this->assertFinite(1);

0 commit comments

Comments
 (0)