]> granicus.if.org Git - php/commitdiff
Added some interface tests
authorMarcus Boerger <helly@php.net>
Wed, 12 Mar 2003 00:09:59 +0000 (00:09 +0000)
committerMarcus Boerger <helly@php.net>
Wed, 12 Mar 2003 00:09:59 +0000 (00:09 +0000)
tests/classes/interface_class.phpt [new file with mode: 0644]
tests/classes/interface_doubled.phpt [new file with mode: 0644]
tests/classes/interface_implemented.phpt [new file with mode: 0644]
tests/classes/interface_instantiate.phpt [new file with mode: 0644]
tests/classes/interface_member.phpt [new file with mode: 0644]
tests/classes/interface_method.phpt [new file with mode: 0644]
tests/classes/interface_method_final.phpt [new file with mode: 0644]
tests/classes/interface_method_private.phpt [new file with mode: 0644]
tests/classes/interface_must_be_implemented.phpt [new file with mode: 0644]

diff --git a/tests/classes/interface_class.phpt b/tests/classes/interface_class.phpt
new file mode 100644 (file)
index 0000000..bdfa76d
--- /dev/null
@@ -0,0 +1,14 @@
+--TEST--
+A class can only implement interfaces
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+class base {
+}
+       
+class derived implements base {
+}
+?>
+--EXPECTF--
+Fatal error: derived cannot implement base - it is not an interface in %s on line %d
diff --git a/tests/classes/interface_doubled.phpt b/tests/classes/interface_doubled.phpt
new file mode 100644 (file)
index 0000000..0a80097
--- /dev/null
@@ -0,0 +1,199 @@
+--TEST--
+An interface may both inherit and implement base interfaces
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+interface if_a {
+       abstract function f_a();
+}
+       
+interface if_b {
+       abstract function f_b();
+}
+
+interface if_c implements if_a, if_b {
+       abstract function f_c();
+}
+
+interface if_d extends if_a implements if_b {
+       abstract function f_d();
+}
+
+interface if_e {
+       abstract function f_d();
+}
+
+interface if_f extends if_e implements if_a, if_b, if_c, if_d, if_e {
+}
+
+class base {
+       function test($class) {
+               echo "is_a(" . class_name($this) . ", $class) ". (is_a($this, $class) ? "yes\n" : "no\n");
+       }
+}
+
+echo "class_a\n";
+
+class class_a extends base implements if_a {
+       function f_a() {}
+       function f_b() {}
+       function f_c() {}
+       function f_d() {}
+       function f_e() {}
+}
+
+$t = new class_a();
+echo $t->test('if_a');
+echo $t->test('if_b');
+echo $t->test('if_c');
+echo $t->test('if_d');
+echo $t->test('if_e');
+
+echo "class_b\n";
+
+class class_b extends base implements if_a, if_b {
+       function f_a() {}
+       function f_b() {}
+       function f_c() {}
+       function f_d() {}
+       function f_e() {}
+}
+
+$t = new class_b();
+echo $t->test('if_a');
+echo $t->test('if_b');
+echo $t->test('if_c');
+echo $t->test('if_d');
+echo $t->test('if_e');
+
+echo "class_c\n";
+
+class class_c extends base implements if_c {
+       function f_a() {}
+       function f_b() {}
+       function f_c() {}
+       function f_d() {}
+       function f_e() {}
+}
+
+$t = new class_c();
+echo $t->test('if_a');
+echo $t->test('if_b');
+echo $t->test('if_c');
+echo $t->test('if_d');
+echo $t->test('if_e');
+
+echo "class_d\n";
+
+class class_d extends base implements if_d{
+       function f_a() {}
+       function f_b() {}
+       function f_c() {}
+       function f_d() {}
+       function f_e() {}
+}
+
+$t = new class_d();
+echo $t->test('if_a');
+echo $t->test('if_b');
+echo $t->test('if_c');
+echo $t->test('if_d');
+echo $t->test('if_e');
+
+echo "class_e\n";
+
+class class_e extends base implements if_a, if_b, if_c, if_d {
+       function f_a() {}
+       function f_b() {}
+       function f_c() {}
+       function f_d() {}
+       function f_e() {}
+}
+
+$t = new class_e();
+echo $t->test('if_a');
+echo $t->test('if_b');
+echo $t->test('if_c');
+echo $t->test('if_d');
+echo $t->test('if_e');
+
+echo "class_f\n";
+
+class class_f extends base implements if_e {
+       function f_a() {}
+       function f_b() {}
+       function f_c() {}
+       function f_d() {}
+       function f_e() {}
+}
+
+$t = new class_f();
+echo $t->test('if_a');
+echo $t->test('if_b');
+echo $t->test('if_c');
+echo $t->test('if_d');
+echo $t->test('if_e');
+
+echo "class_g\n";
+
+class class_g extends base implements if_f {
+       function f_a() {}
+       function f_b() {}
+       function f_c() {}
+       function f_d() {}
+       function f_e() {}
+}
+
+$t = new class_g();
+echo $t->test('if_a');
+echo $t->test('if_b');
+echo $t->test('if_c');
+echo $t->test('if_d');
+echo $t->test('if_e');
+
+?>
+--EXPECTF--
+class_a
+is_a(class_a, if_a) yes
+is_a(class_a, if_b) no
+is_a(class_a, if_c) no
+is_a(class_a, if_d) no
+is_a(class_a, if_e) no
+class_b
+is_a(class_b, if_a) yes
+is_a(class_b, if_b) yes
+is_a(class_b, if_c) no
+is_a(class_b, if_d) no
+is_a(class_b, if_e) no
+class_c
+is_a(class_c, if_a) yes
+is_a(class_c, if_b) yes
+is_a(class_c, if_c) yes
+is_a(class_c, if_d) no
+is_a(class_c, if_e) no
+class_d
+is_a(class_d, if_a) yes
+is_a(class_d, if_b) yes
+is_a(class_d, if_c) no
+is_a(class_d, if_d) yes
+is_a(class_d, if_e) no
+class_e
+is_a(class_e, if_a) yes
+is_a(class_e, if_b) yes
+is_a(class_e, if_c) yes
+is_a(class_e, if_d) yes
+is_a(class_e, if_e) no
+class_f
+is_a(class_f, if_a) no
+is_a(class_f, if_b) no
+is_a(class_f, if_c) no
+is_a(class_f, if_d) no
+is_a(class_f, if_e) yes
+class_g
+is_a(class_g, if_a) yes
+is_a(class_g, if_b) yes
+is_a(class_g, if_c) yes
+is_a(class_g, if_d) yes
+is_a(class_g, if_e) yes
\ No newline at end of file
diff --git a/tests/classes/interface_implemented.phpt b/tests/classes/interface_implemented.phpt
new file mode 100644 (file)
index 0000000..9edef87
--- /dev/null
@@ -0,0 +1,103 @@
+--TEST--
+An interface is inherited
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+interface if_a {
+       abstract function f_a();
+}
+       
+interface if_b extends if_a {
+       abstract function f_b();
+}
+
+class base {
+       function _is_a($sub) {
+               echo 'is_a('.get_class($this).', '.$sub.') = '.(is_a($this, $sub) ? 'yes' : 'no')."\n";
+       }
+       function test() {
+               echo $this->_is_a('base');
+               echo $this->_is_a('derived_a');
+               echo $this->_is_a('derived_b');
+               echo $this->_is_a('derived_c');
+               echo $this->_is_a('derived_d');
+               echo $this->_is_a('if_a');
+               echo $this->_is_a('if_b');
+               echo "\n";
+       }
+}
+
+class derived_a extends base implements if_a {
+       function f_a() {}
+}
+
+class derived_b extends base implements if_a, if_b {
+       function f_a() {}
+       function f_b() {}
+}
+
+class derived_c extends derived_a implements if_b {
+       function f_b() {}
+}
+
+class derived_d extends derived_c {
+}
+
+$t = new base();
+$t->test();
+
+$t = new derived_a();
+$t->test();
+
+$t = new derived_b();
+$t->test();
+
+$t = new derived_c();
+$t->test();
+
+$t = new derived_d();
+$t->test();
+
+?>
+--EXPECTF--
+is_a(base, base) = yes
+is_a(base, derived_a) = no
+is_a(base, derived_b) = no
+is_a(base, derived_c) = no
+is_a(base, derived_d) = no
+is_a(base, if_a) = no
+is_a(base, if_b) = no
+
+is_a(derived_a, base) = yes
+is_a(derived_a, derived_a) = yes
+is_a(derived_a, derived_b) = no
+is_a(derived_a, derived_c) = no
+is_a(derived_a, derived_d) = no
+is_a(derived_a, if_a) = yes
+is_a(derived_a, if_b) = no
+
+is_a(derived_b, base) = yes
+is_a(derived_b, derived_a) = no
+is_a(derived_b, derived_b) = yes
+is_a(derived_b, derived_c) = no
+is_a(derived_b, derived_d) = no
+is_a(derived_b, if_a) = yes
+is_a(derived_b, if_b) = yes
+
+is_a(derived_c, base) = yes
+is_a(derived_c, derived_a) = yes
+is_a(derived_c, derived_b) = no
+is_a(derived_c, derived_c) = yes
+is_a(derived_c, derived_d) = no
+is_a(derived_c, if_a) = yes
+is_a(derived_c, if_b) = yes
+
+is_a(derived_d, base) = yes
+is_a(derived_d, derived_a) = yes
+is_a(derived_d, derived_b) = no
+is_a(derived_d, derived_c) = yes
+is_a(derived_d, derived_d) = yes
+is_a(derived_d, if_a) = yes
+is_a(derived_d, if_b) = yes
diff --git a/tests/classes/interface_instantiate.phpt b/tests/classes/interface_instantiate.phpt
new file mode 100644 (file)
index 0000000..c568bbe
--- /dev/null
@@ -0,0 +1,16 @@
+--TEST--
+An interface cannot be instantiated
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+interface if_a {
+       abstract function f_a();
+}
+       
+$t = new if_a();
+
+?>
+--EXPECTF--
+Fatal error: Cannot instantiate interface if_a in %s on line %d
diff --git a/tests/classes/interface_member.phpt b/tests/classes/interface_member.phpt
new file mode 100644 (file)
index 0000000..f47b758
--- /dev/null
@@ -0,0 +1,13 @@
+--TEST--
+An interface cannot have properties
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+interface if_a {
+       var $member;
+}
+?>
+--EXPECTF--
+Fatal error: Interfaces may not include member variables in %s on line %d
diff --git a/tests/classes/interface_method.phpt b/tests/classes/interface_method.phpt
new file mode 100644 (file)
index 0000000..08d3822
--- /dev/null
@@ -0,0 +1,15 @@
+--TEST--
+An interface method must be abstract
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+interface if_a {
+       function err() {};
+}
+
+?>
+--EXPECTF--
+
+Fatal error: Interface function if_a::err() cannot contain body %s on line %d
diff --git a/tests/classes/interface_method_final.phpt b/tests/classes/interface_method_final.phpt
new file mode 100644 (file)
index 0000000..6d06dcc
--- /dev/null
@@ -0,0 +1,15 @@
+--TEST--
+An interface method cannot be final
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+class if_a {
+       abstract final function err();
+}
+
+?>
+--EXPECTF--
+
+Fatal error: Cannot use the final modifier on an abstract class member in %s on line %d
diff --git a/tests/classes/interface_method_private.phpt b/tests/classes/interface_method_private.phpt
new file mode 100644 (file)
index 0000000..822e2b8
--- /dev/null
@@ -0,0 +1,15 @@
+--TEST--
+An interface method cannot be private
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+interface if_a {
+       abstract private function err();
+}
+
+?>
+--EXPECTF--
+
+Fatal error: Access type for interface method if_a::err() must be omitted or declared public in %s on line %d
diff --git a/tests/classes/interface_must_be_implemented.phpt b/tests/classes/interface_must_be_implemented.phpt
new file mode 100644 (file)
index 0000000..517a65b
--- /dev/null
@@ -0,0 +1,17 @@
+--TEST--
+An interface must be implemented
+--SKIPIF--
+<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+--FILE--
+<?php
+
+interface if_a {
+       abstract function f_a();
+}
+       
+class derived_a implements if_a {
+}
+
+?>
+--EXPECTF--
+Fatal error: Class derived_a contains abstract methods and must be declared abstract in %s on line %d