Skip to content

implement sealing tests #3

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

Open
wants to merge 3 commits into
base: friends
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 0 additions & 8 deletions Zend/tests/friends/001.phpt

This file was deleted.

10 changes: 0 additions & 10 deletions Zend/tests/friends/002.phpt

This file was deleted.

11 changes: 0 additions & 11 deletions Zend/tests/friends/003.phpt

This file was deleted.

21 changes: 0 additions & 21 deletions Zend/tests/friends/004.phpt

This file was deleted.

26 changes: 0 additions & 26 deletions Zend/tests/friends/005.phpt

This file was deleted.

8 changes: 0 additions & 8 deletions Zend/tests/friends/006.phpt

This file was deleted.

10 changes: 0 additions & 10 deletions Zend/tests/friends/007.phpt

This file was deleted.

10 changes: 0 additions & 10 deletions Zend/tests/friends/008.phpt

This file was deleted.

26 changes: 0 additions & 26 deletions Zend/tests/friends/010.phpt

This file was deleted.

10 changes: 10 additions & 0 deletions Zend/tests/sealed/001.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
--TEST--
Circular Sealing
--FILE--
<?php

sealed class A permits A, B {}

?>
--EXPECTF--
Fatal error: Sealed class A may not permit inheritance for itself in %s/001.php on line %d
11 changes: 11 additions & 0 deletions Zend/tests/sealed/002.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
--TEST--
Circular Sealing Parent
--FILE--
<?php

sealed class A permits B {}

sealed class B extends A permits A {}
?>
--EXPECTF--
Fatal error: Sealed class B may not permit inheritance from its parent A in %s/002.php on line %d
13 changes: 13 additions & 0 deletions Zend/tests/sealed/003.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
--TEST--
Not permitted class
--FILE--
<?php
sealed class A permits B {}

class B extends A {} // ok

class C extends A {} // ko
?>
--EXPECTF--
Fatal error: Class C is not permitted to inherit from A in %s/003.php on line %d

45 changes: 45 additions & 0 deletions Zend/tests/sealed/004.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
--TEST--
Reflection
--FILE--
<?php
sealed class A permits B {}
class B extends A {}

interface C permits D {}
interface D extends C {}

trait E permits F {}
class F { use E; }

foreach ([A::class, B::class, C::class, D::class, E::class, F::class] as $class) {
$reflector = new ReflectionClass($class);

var_dump($reflector->isSealed());
var_dump($reflector->getPermittedClasses());
}
?>
--EXPECT--
bool(true)
array(1) {
[0]=>
string(1) "B"
}
bool(false)
array(0) {
}
bool(true)
array(1) {
[0]=>
string(1) "D"
}
bool(false)
array(0) {
}
bool(true)
array(1) {
[0]=>
string(1) "F"
}
bool(false)
array(0) {
}
39 changes: 39 additions & 0 deletions Zend/tests/sealed/005.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
--TEST--
Sealing Inheritance
--FILE--
<?php
sealed class A permits B, C {}

sealed class B extends A permits C {}

class C extends B {}

class D {}

foreach ([A::class, B::class, C::class, D::class] as $class) {
$reflector = new ReflectionClass($class);

var_dump($reflector->isSealed());
var_dump($reflector->getPermittedClasses());
}
?>
--EXPECT--
bool(true)
array(2) {
[0]=>
string(1) "B"
[1]=>
string(1) "C"
}
bool(true)
array(1) {
[0]=>
string(1) "C"
}
bool(false)
array(0) {
}
bool(false)
array(0) {
}

8 changes: 8 additions & 0 deletions Zend/tests/sealed/006.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
--TEST--
Circular Sealing Interface
--FILE--
<?php
sealed interface A permits A, B {}
?>
--EXPECTF--
Fatal error: Sealed interface A may not permit inheritance for itself in %s/001.php on line %d
10 changes: 10 additions & 0 deletions Zend/tests/sealed/007.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
--TEST--
Circular Friendship Parent Interface
--FILE--
<?php
sealed interface A permits B {}

sealed interface B extends A permits A {}
?>
--EXPECTF--
Fatal error: Sealed interface B may not permit inheritance from its parent A in %s/002.php on line %d
10 changes: 10 additions & 0 deletions Zend/tests/sealed/008.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
--TEST--
Not permitted class
--FILE--
<?php
sealed interface A permits B {}

final class C implements A {}
?>
--EXPECTF--
Fatal error: Class C cannot implement sealed interface A in %s/008.php on line %d
11 changes: 7 additions & 4 deletions Zend/tests/friends/009.phpt → Zend/tests/sealed/009.phpt
Original file line number Diff line number Diff line change
@@ -1,21 +1,24 @@
--TEST--
Friendship Interfaces
Sealing Interfaces
--FILE--
<?php
interface A for B {}
sealed interface A permits B {}

interface B extends A {}

foreach ([A::class, B::class] as $class) {
$reflector = new ReflectionClass($class);

var_dump($reflector->getFriendNames());

var_dump($reflector->isSealed());
var_dump($reflector->getPermittedClasses());
}
?>
--EXPECT--
bool(true)
array(1) {
[0]=>
string(1) "B"
}
bool(false)
array(0) {
}
38 changes: 38 additions & 0 deletions Zend/tests/sealed/010.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
--TEST--
Sealing Inheritance Interfaces
--FILE--
<?php
sealed interface A permits B, C {}

interface B extends A {}

sealed interface C extends A permits D {}

interface D extends B, C {}

foreach ([A::class, B::class, C::class, D::class] as $class) {
$reflector = new ReflectionClass($class);

var_dump($reflector->isSealed());
var_dump($reflector->getPermittedClasses());
}
?>
--EXPECT--
bool(true)
array(2) {
[0]=>
string(1) "B"
[1]=>
string(1) "C"
}
bool(false)
array(0) {
}
bool(true)
array(1) {
[0]=>
string(1) "D"
}
bool(false)
array(0) {
}
36 changes: 36 additions & 0 deletions Zend/tests/sealed/011.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
--TEST--
Happy path
--FILE--
<?php
// ok - permits C, D
sealed interface A permits C, D {}

// ok, permitted to implements A
class C implements A {}
// ok, permitted to implements A
class D implements A {}

// ok, permitted to extend A implicitly
interface E extends A {} // ok

// ok, permitted to extend C ( non sealed ), permitted to implement E ( non sealed ) and parent interface is sealed to C
// which we extend - permits G
sealed class F extends C implements E permits G {}

// ok, permitted to extend F
class G extends F {}

// ok - permits I
sealed trait H permits I {}

// ok, permitted to use H, permitted to extend G ( non sealed ) - permits J
sealed abstract class I extends G permits J {
use H;
}

final class J extends I {} // ok, permitted to extend I
?>
OK
--EXPECT--
OK

Loading