gron Thu, 15 Apr 2010 21:39:20 +0000
Revision: http://svn.php.net/viewvc?view=revision&revision=298062
Log:
Added traits test cases. No engine changes for now. [TRAITS]
#Getting accustomed to the infrastructure.
#Any comments are welcome, especially with regard to syntax and keywords.
Changed paths:
A php/php-src/trunk/Zend/tests/traits/
A php/php-src/trunk/Zend/tests/traits/bugs/
A php/php-src/trunk/Zend/tests/traits/bugs/abstract-methods01.phpt
A php/php-src/trunk/Zend/tests/traits/bugs/abstract-methods02.phpt
A php/php-src/trunk/Zend/tests/traits/bugs/abstract-methods03.phpt
A php/php-src/trunk/Zend/tests/traits/bugs/abstract-methods04.phpt
A php/php-src/trunk/Zend/tests/traits/bugs/alias-semantics.phpt
A php/php-src/trunk/Zend/tests/traits/bugs/case-sensitive.phpt
A php/php-src/trunk/Zend/tests/traits/bugs/interfaces.phpt
A php/php-src/trunk/Zend/tests/traits/bugs/missing-trait.phpt
A
php/php-src/trunk/Zend/tests/traits/bugs/overridding-conflicting-methods.phpt
A php/php-src/trunk/Zend/tests/traits/conflict001.phpt
A php/php-src/trunk/Zend/tests/traits/conflict002.phpt
A php/php-src/trunk/Zend/tests/traits/conflict003.phpt
A php/php-src/trunk/Zend/tests/traits/flattening001.phpt
A php/php-src/trunk/Zend/tests/traits/flattening002.phpt
A php/php-src/trunk/Zend/tests/traits/flattening003.phpt
A php/php-src/trunk/Zend/tests/traits/inheritance001.phpt
A php/php-src/trunk/Zend/tests/traits/inheritance002.phpt
A php/php-src/trunk/Zend/tests/traits/inheritance003.phpt
A php/php-src/trunk/Zend/tests/traits/language001.phpt
A php/php-src/trunk/Zend/tests/traits/language002.phpt
A php/php-src/trunk/Zend/tests/traits/language003.phpt
A php/php-src/trunk/Zend/tests/traits/language004.phpt
A php/php-src/trunk/Zend/tests/traits/language005.phpt
A php/php-src/trunk/Zend/tests/traits/language006.phpt
A php/php-src/trunk/Zend/tests/traits/language007.phpt
A php/php-src/trunk/Zend/tests/traits/language008a.phpt
A php/php-src/trunk/Zend/tests/traits/language008b.phpt
A php/php-src/trunk/Zend/tests/traits/language009.phpt
A php/php-src/trunk/Zend/tests/traits/language010.phpt
A php/php-src/trunk/Zend/tests/traits/language011.phpt
Added: php/php-src/trunk/Zend/tests/traits/bugs/abstract-methods01.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/traits/bugs/abstract-methods01.phpt (rev 0)
+++ php/php-src/trunk/Zend/tests/traits/bugs/abstract-methods01.phpt 2010-04-15 21:39:20 UTC (rev 298062)
@@ -0,0 +1,19 @@
+--TEST--
+Abstract Trait Methods should behave like common abstract methods.
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+trait THello {
+ public abstract function hello();
+}
+
+class TraitsTest {
+ use THello;
+}
+
+$test = new TraitsTest();
+$test->hello();
+?>
+--EXPECTF--
+Fatal error: Class %s contains %d abstract method and must therefore be declared abstract or implement the remaining methods (%s) in %s on line %d
\ No newline at end of file
Added: php/php-src/trunk/Zend/tests/traits/bugs/abstract-methods02.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/traits/bugs/abstract-methods02.phpt (rev 0)
+++ php/php-src/trunk/Zend/tests/traits/bugs/abstract-methods02.phpt 2010-04-15 21:39:20 UTC (rev 298062)
@@ -0,0 +1,26 @@
+--TEST--
+Abstract Trait Methods should behave like common abstract methods.
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+trait THello {
+ public abstract function hello();
+}
+
+trait THelloImpl {
+ public function hello() {
+ echo 'Hello';
+ }
+}
+
+class TraitsTest {
+ use THello;
+ use THelloImpl;
+}
+
+$test = new TraitsTest();
+$test->hello();
+?>
+--EXPECTF--
+Hello
\ No newline at end of file
Added: php/php-src/trunk/Zend/tests/traits/bugs/abstract-methods03.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/traits/bugs/abstract-methods03.phpt (rev 0)
+++ php/php-src/trunk/Zend/tests/traits/bugs/abstract-methods03.phpt 2010-04-15 21:39:20 UTC (rev 298062)
@@ -0,0 +1,22 @@
+--TEST--
+Abstract Trait Methods should behave like common abstract methods.
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+trait THello {
+ public abstract function hello();
+}
+
+class TraitsTest {
+ use THello;
+ public function hello() {
+ echo 'Hello';
+ }
+}
+
+$test = new TraitsTest();
+$test->hello();
+?>
+--EXPECTF--
+Hello
\ No newline at end of file
Added: php/php-src/trunk/Zend/tests/traits/bugs/abstract-methods04.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/traits/bugs/abstract-methods04.phpt (rev 0)
+++ php/php-src/trunk/Zend/tests/traits/bugs/abstract-methods04.phpt 2010-04-15 21:39:20 UTC (rev 298062)
@@ -0,0 +1,36 @@
+--TEST--
+Abstract Trait Methods should behave like common abstract methods and
+implementstion may be provided by other traits. Sorting order shouldn't influence result.
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+trait THello {
+ public abstract function hello();
+}
+
+trait THelloImpl {
+ public function hello() {
+ echo 'Hello';
+ }
+}
+
+class TraitsTest1 {
+ use THello;
+ use THelloImpl;
+}
+
+$test = new TraitsTest1();
+$test->hello();
+
+class TraitsTest2 {
+ use THelloImpl;
+ use THello;
+}
+
+$test = new TraitsTest2();
+$test->hello();
+
+?>
+--EXPECTF--
+HelloHello
\ No newline at end of file
Added: php/php-src/trunk/Zend/tests/traits/bugs/alias-semantics.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/traits/bugs/alias-semantics.phpt (rev 0)
+++ php/php-src/trunk/Zend/tests/traits/bugs/alias-semantics.phpt 2010-04-15 21:39:20 UTC (rev 298062)
@@ -0,0 +1,23 @@
+--TEST--
+Semantic of alias operation is to provide an additional identifier for the method body of the original method.
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+trait THello {
+ public function a() {
+ echo 'A';
+ }
+}
+
+class TraitsTest {
+ use THello { a as b; }
+}
+
+$test = new TraitsTest();
+$test->a();
+$test->b();
+
+?>
+--EXPECTF--
+AA
\ No newline at end of file
Added: php/php-src/trunk/Zend/tests/traits/bugs/case-sensitive.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/traits/bugs/case-sensitive.phpt (rev 0)
+++ php/php-src/trunk/Zend/tests/traits/bugs/case-sensitive.phpt 2010-04-15 21:39:20 UTC (rev 298062)
@@ -0,0 +1,25 @@
+--TEST--
+Check for problems with case sensitivity in compositions
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+trait A {
+ public function M1() {}
+ public function M2() {}
+}
+
+trait B {
+ public function M1() {}
+ public function M2() {}
+}
+
+class MyClass {
+ use A;
+ use B;
+}
+?>
+--EXPECTF--
+Warning: Trait method M1 has not been applied, because there are collisions with other trait methods on MyClass in %s on line %d
+
+Warning: Trait method M2 has not been applied, because there are collisions with other trait methods on MyClass in %s on line %d
\ No newline at end of file
Added: php/php-src/trunk/Zend/tests/traits/bugs/interfaces.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/traits/bugs/interfaces.phpt (rev 0)
+++ php/php-src/trunk/Zend/tests/traits/bugs/interfaces.phpt 2010-04-15 21:39:20 UTC (rev 298062)
@@ -0,0 +1,19 @@
+--TEST--
+Make sure trait does not implement an interface.
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+interface MyInterface {
+ public function a();
+}
+
+trait THello implements MyInterface {
+ public function a() {
+ echo 'A';
+ }
+}
+
+?>
+--EXPECTF--
+Fatal error: Cannot use 'MyInterface' as interface on 'THello' since it is a Trait in %s on line %d
\ No newline at end of file
Added: php/php-src/trunk/Zend/tests/traits/bugs/missing-trait.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/traits/bugs/missing-trait.phpt (rev 0)
+++ php/php-src/trunk/Zend/tests/traits/bugs/missing-trait.phpt 2010-04-15 21:39:20 UTC (rev 298062)
@@ -0,0 +1,15 @@
+--TEST--
+Check error message for missing traits
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+class TraitsTest {
+ use THello;
+}
+
+$test = new TraitsTest();
+
+?>
+--EXPECTF--
+Fatal error: Trait 'THello' not found in %s on line %d
\ No newline at end of file
Added: php/php-src/trunk/Zend/tests/traits/bugs/overridding-conflicting-methods.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/traits/bugs/overridding-conflicting-methods.phpt (rev 0)
+++ php/php-src/trunk/Zend/tests/traits/bugs/overridding-conflicting-methods.phpt 2010-04-15 21:39:20 UTC (rev 298062)
@@ -0,0 +1,31 @@
+--TEST--
+Overridding Conflicting Methods should not result in a notice/warning about collisions
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+trait THello1 {
+ public function hello() {
+ echo 'Hello';
+ }
+}
+
+trait THello2 {
+ public function hello() {
+ echo 'Hello';
+ }
+}
+
+class TraitsTest {
+ use THello1;
+ use THello2;
+ public function hello() {
+ echo 'Hello';
+ }
+}
+
+$test = new TraitsTest();
+$test->hello();
+?>
+--EXPECTF--
+Hello
\ No newline at end of file
Added: php/php-src/trunk/Zend/tests/traits/conflict001.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/traits/conflict001.phpt (rev 0)
+++ php/php-src/trunk/Zend/tests/traits/conflict001.phpt 2010-04-15 21:39:20 UTC (rev 298062)
@@ -0,0 +1,25 @@
+--TEST--
+Method conflict in traits
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+trait THello1 {
+ private function hello() {
+ echo 'Hello';
+ }
+}
+
+trait THello2 {
+ private function hello() {
+ echo 'Hello';
+ }
+}
+
+class TraitsTest {
+ use THello1;
+ use THello2;
+}
+?>
+--EXPECTF--
+Warning: Trait method hello has not been applied, because there are collisions with other trait methods on TraitsTest in %s on line %d
\ No newline at end of file
Added: php/php-src/trunk/Zend/tests/traits/conflict002.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/traits/conflict002.phpt (rev 0)
+++ php/php-src/trunk/Zend/tests/traits/conflict002.phpt 2010-04-15 21:39:20 UTC (rev 298062)
@@ -0,0 +1,32 @@
+--TEST--
+Overwridden methods do not cause a conflict.
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+trait HelloWorld {
+ public function sayHello() {
+ echo 'Hello World!';
+ }
+}
+
+trait HelloWorld2 {
+ public function sayHello() {
+ echo 'Hello World2!';
+ }
+}
+
+
+class TheWorldIsNotEnough {
+ use HelloWorld;
+ use HelloWorld2;
+ public function sayHello() {
+ echo 'Hello Universe!';
+ }
+}
+
+$o = new TheWorldIsNotEnough();
+$o->sayHello(); // echos Hello Universe!
+?>
+--EXPECTF--
+Hello Universe!
\ No newline at end of file
Added: php/php-src/trunk/Zend/tests/traits/conflict003.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/traits/conflict003.phpt (rev 0)
+++ php/php-src/trunk/Zend/tests/traits/conflict003.phpt 2010-04-15 21:39:20 UTC (rev 298062)
@@ -0,0 +1,33 @@
+--TEST--
+Two methods resulting in a conflict, should be reported both.
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+trait A {
+ public function smallTalk() {
+ echo 'a';
+ }
+ public function bigTalk() {
+ echo 'A';
+ }
+}
+
+trait B {
+ public function smallTalk() {
+ echo 'b';
+ }
+ public function bigTalk() {
+ echo 'B';
+ }
+}
+
+class Talker {
+ use A, B;
+}
+
+?>
+--EXPECTF--
+Warning: Trait method smallTalk has not been applied, because there are collisions with other trait methods on Talker in %s on line %d
+
+Warning: Trait method bigTalk has not been applied, because there are collisions with other trait methods on Talker in %s on line %d
\ No newline at end of file
Added: php/php-src/trunk/Zend/tests/traits/flattening001.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/traits/flattening001.phpt (rev 0)
+++ php/php-src/trunk/Zend/tests/traits/flattening001.phpt 2010-04-15 21:39:20 UTC (rev 298062)
@@ -0,0 +1,42 @@
+--TEST--
+Methods using object properties
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+trait T1 {
+ public function getText() {
+ return $this->text;
+ }
+}
+
+trait T2 {
+ public function setTextT2($val) {
+ $this->text = $val;
+ }
+}
+
+class TraitsTest {
+ use T1;
+ use T2;
+ private $text = 'test';
+ public function setText($val) {
+ $this->text = $val;
+ }
+}
+
+$o = new TraitsTest();
+var_dump($o->getText());
+
+$o->setText('foo');
+
+var_dump($o->getText());
+
+$o->setText('bar');
+
+var_dump($o->getText());
+?>
+--EXPECTF--
+string(4) "test"
+string(3) "foo"
+string(3) "bar"
\ No newline at end of file
Added: php/php-src/trunk/Zend/tests/traits/flattening002.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/traits/flattening002.phpt (rev 0)
+++ php/php-src/trunk/Zend/tests/traits/flattening002.phpt 2010-04-15 21:39:20 UTC (rev 298062)
@@ -0,0 +1,28 @@
+--TEST--
+parent:: works like in a method defined without traits.
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+class Base {
+ public function sayHello() {
+ echo 'Hello ';
+ }
+}
+
+trait SayWorld {
+ public function sayHello() {
+ parent::sayHello();
+ echo 'World!';
+ }
+}
+
+class MyHelloWorld extends Base {
+ use SayWorld;
+}
+
+$o = new MyHelloWorld();
+$o->sayHello();
+?>
+--EXPECTF--
+Hello World!
\ No newline at end of file
Added: php/php-src/trunk/Zend/tests/traits/flattening003.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/traits/flattening003.phpt (rev 0)
+++ php/php-src/trunk/Zend/tests/traits/flattening003.phpt 2010-04-15 21:39:20 UTC (rev 298062)
@@ -0,0 +1,32 @@
+--TEST--
+Traits are flattened recurivly.
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+trait Hello {
+ public function sayHello() {
+ echo 'Hello ';
+ }
+}
+
+trait World {
+ public function sayWorld() {
+ echo 'World!';
+ }
+}
+
+trait HelloWorld {
+ use Hello, World;
+}
+
+class MyHelloWorld {
+ use HelloWorld;
+}
+
+$o = new MyHelloWorld();
+$o->sayHello();
+$o->sayWorld();
+?>
+--EXPECTF--
+Hello World!
\ No newline at end of file
Added: php/php-src/trunk/Zend/tests/traits/inheritance001.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/traits/inheritance001.phpt (rev 0)
+++ php/php-src/trunk/Zend/tests/traits/inheritance001.phpt 2010-04-15 21:39:20 UTC (rev 298062)
@@ -0,0 +1,24 @@
+--TEST--
+Trait method overwridden by a method defined in the class.
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+trait HelloWorld {
+ public function sayHello() {
+ echo 'Hello World!';
+ }
+}
+
+class TheWorldIsNotEnough {
+ use HelloWorld;
+ public function sayHello() {
+ echo 'Hello Universe!';
+ }
+}
+
+$o = new TheWorldIsNotEnough();
+$o->sayHello(); // echos Hello Universe!
+?>
+--EXPECTF--
+Hello Universe!
\ No newline at end of file
Added: php/php-src/trunk/Zend/tests/traits/inheritance002.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/traits/inheritance002.phpt (rev 0)
+++ php/php-src/trunk/Zend/tests/traits/inheritance002.phpt 2010-04-15 21:39:20 UTC (rev 298062)
@@ -0,0 +1,27 @@
+--TEST--
+Trait method overriddes base class method
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+class Base {
+ public function sayHello() {
+ echo 'Hello ';
+ }
+}
+
+trait SayWorld {
+ public function sayHello() {
+ echo 'World!';
+ }
+}
+
+class MyHelloWorld extends Base {
+ use SayWorld;
+}
+
+$o = new MyHelloWorld();
+$o->sayHello();
+?>
+--EXPECTF--
+World!
\ No newline at end of file
Added: php/php-src/trunk/Zend/tests/traits/inheritance003.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/traits/inheritance003.phpt (rev 0)
+++ php/php-src/trunk/Zend/tests/traits/inheritance003.phpt 2010-04-15 21:39:20 UTC (rev 298062)
@@ -0,0 +1,38 @@
+--TEST--
+Trait method overriddes base class method and satisfies prototype
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+abstract class Base {
+ public abstract function sayHello(array $a);
+}
+
+class SubClass extends Base {
+ public function sayHello(array $a) {
+ echo "World!\n";
+ }
+}
+
+$s = new SubClass();
+$s->sayHello(array());
+
+
+trait SayWorld {
+ public function sayHello(Base $d) {
+ echo 'World!';
+ }
+}
+
+class MyHelloWorld extends Base {
+ use SayWorld;
+}
+
+$o = new MyHelloWorld();
+$o->sayHello(array());
+
+?>
+--EXPECTF--
+World!
+
+Fatal error: Declaration of MyHelloWorld::sayHello() must be compatible with that of Base::sayHello() in %s on line %d
Added: php/php-src/trunk/Zend/tests/traits/language001.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/traits/language001.phpt (rev 0)
+++ php/php-src/trunk/Zend/tests/traits/language001.phpt 2010-04-15 21:39:20 UTC (rev 298062)
@@ -0,0 +1,21 @@
+--TEST--
+Single Trait with simple trait method
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+trait THello {
+ public function hello() {
+ echo 'Hello';
+ }
+}
+
+class TraitsTest {
+ use THello;
+}
+
+$test = new TraitsTest();
+$test->hello();
+?>
+--EXPECTF--
+Hello
Added: php/php-src/trunk/Zend/tests/traits/language002.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/traits/language002.phpt (rev 0)
+++ php/php-src/trunk/Zend/tests/traits/language002.phpt 2010-04-15 21:39:20 UTC (rev 298062)
@@ -0,0 +1,32 @@
+--TEST--
+Use multiple traits.
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+trait Hello {
+ public function sayHello() {
+ echo 'Hello ';
+ }
+}
+
+trait World {
+ public function sayWorld() {
+ echo 'World';
+ }
+}
+
+class MyHelloWorld {
+ use Hello, World;
+ public function sayExclamationMark() {
+ echo '!';
+ }
+}
+
+$o = new MyHelloWorld();
+$o->sayHello();
+$o->sayWorld();
+$o->sayExclamationMark();
+?>
+--EXPECTF--
+Hello World!
\ No newline at end of file
Added: php/php-src/trunk/Zend/tests/traits/language003.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/traits/language003.phpt (rev 0)
+++ php/php-src/trunk/Zend/tests/traits/language003.phpt 2010-04-15 21:39:20 UTC (rev 298062)
@@ -0,0 +1,29 @@
+--TEST--
+Use instead to solve a conflict.
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+trait Hello {
+ public function saySomething() {
+ echo 'Hello';
+ }
+}
+
+trait World {
+ public function saySomething() {
+ echo 'World';
+ }
+}
+
+class MyHelloWorld {
+ use Hello, World {
+ Hello::saySomething instead World;
+ }
+}
+
+$o = new MyHelloWorld();
+$o->saySomething();
+?>
+--EXPECTF--
+Hello
\ No newline at end of file
Added: php/php-src/trunk/Zend/tests/traits/language004.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/traits/language004.phpt (rev 0)
+++ php/php-src/trunk/Zend/tests/traits/language004.phpt 2010-04-15 21:39:20 UTC (rev 298062)
@@ -0,0 +1,31 @@
+--TEST--
+Use instead to solve a conflict and as to access the method.
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+trait Hello {
+ public function saySomething() {
+ echo 'Hello';
+ }
+}
+
+trait World {
+ public function saySomething() {
+ echo ' World';
+ }
+}
+
+class MyHelloWorld {
+ use Hello, World {
+ Hello::saySomething instead World;
+ World::saySomething as sayWorld;
+ }
+}
+
+$o = new MyHelloWorld();
+$o->saySomething();
+$o->sayWorld();
+?>
+--EXPECTF--
+Hello World
\ No newline at end of file
Added: php/php-src/trunk/Zend/tests/traits/language005.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/traits/language005.phpt (rev 0)
+++ php/php-src/trunk/Zend/tests/traits/language005.phpt 2010-04-15 21:39:20 UTC (rev 298062)
@@ -0,0 +1,40 @@
+--TEST--
+Use instead to solve a conflict and as to access the method.
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+trait A {
+ public function smallTalk() {
+ echo 'a';
+ }
+ public function bigTalk() {
+ echo 'A';
+ }
+}
+
+trait B {
+ public function smallTalk() {
+ echo 'b';
+ }
+ public function bigTalk() {
+ echo 'B';
+ }
+}
+
+class Talker {
+ use A, B {
+ B::smallTalk instead A;
+ A::bigTalk instead B;
+ B::bigTalk as talk;
+ }
+}
+
+$t = new Talker;
+$t->smallTalk();
+$t->bigTalk();
+$t->talk();
+
+?>
+--EXPECTF--
+bAB
\ No newline at end of file
Added: php/php-src/trunk/Zend/tests/traits/language006.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/traits/language006.phpt (rev 0)
+++ php/php-src/trunk/Zend/tests/traits/language006.phpt 2010-04-15 21:39:20 UTC (rev 298062)
@@ -0,0 +1,31 @@
+--TEST--
+Express requirements of a trait by abstract methods.
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+trait Hello {
+ public function sayHelloWorld() {
+ echo 'Hello'.$this->getWorld();
+ }
+ abstract public function getWorld();
+ }
+
+class MyHelloWorld {
+ private $world;
+ use Hello;
+ public function getWorld() {
+ return $this->world;
+ }
+ public function setWorld($val) {
+ $this->world = $val;
+ }
+}
+
+$o = new MyHelloWorld();
+$o->setWorld(' World!');
+$o->sayHelloWorld();
+
+?>
+--EXPECTF--
+Hello World!
\ No newline at end of file
Added: php/php-src/trunk/Zend/tests/traits/language007.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/traits/language007.phpt (rev 0)
+++ php/php-src/trunk/Zend/tests/traits/language007.phpt 2010-04-15 21:39:20 UTC (rev 298062)
@@ -0,0 +1,30 @@
+--TEST--
+Traits can fulfill the requirements of abstract base classes.
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+abstract class Base {
+ abstract function sayWorld();
+}
+
+trait Hello {
+ public function sayHello() {
+ echo 'Hello';
+ }
+ public function sayWorld() {
+ echo ' World!';
+ }
+ }
+
+class MyHelloWorld extends Base {
+ use Hello;
+}
+
+$o = new MyHelloWorld();
+$o->sayHello();
+$o->sayWorld();
+
+?>
+--EXPECTF--
+Hello World!
\ No newline at end of file
Added: php/php-src/trunk/Zend/tests/traits/language008a.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/traits/language008a.phpt (rev 0)
+++ php/php-src/trunk/Zend/tests/traits/language008a.phpt 2010-04-15 21:39:20 UTC (rev 298062)
@@ -0,0 +1,23 @@
+--TEST--
+Visibility can be changed with the as aliasing construct as well.
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+trait HelloWorld {
+ public function sayHello() {
+ echo 'Hello World!';
+ }
+}
+
+class MyClass {
+ use HelloWorld { sayHello as protected; }
+}
+
+
+$o = new MyClass;
+$o->sayHello();
+
+?>
+--EXPECTF--
+Fatal error: Call to protected method MyClass::sayHello() from context '' in %s on line %d
\ No newline at end of file
Added: php/php-src/trunk/Zend/tests/traits/language008b.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/traits/language008b.phpt (rev 0)
+++ php/php-src/trunk/Zend/tests/traits/language008b.phpt 2010-04-15 21:39:20 UTC (rev 298062)
@@ -0,0 +1,30 @@
+--TEST--
+Visibility can be changed with the as aliasing construct as well.
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+trait HelloWorld {
+ public function sayHello() {
+ echo 'Hello World!';
+ }
+}
+
+class MyClass {
+ use HelloWorld { sayHello as private sayHelloWorld; }
+
+ public function callPrivateAlias() {
+ $this->sayHelloWorld();
+ }
+}
+
+$o = new MyClass();
+$o->sayHello();
+$o->callPrivateAlias();
+$o->sayHelloWorld();
+
+
+?>
+--EXPECTF--
+Hello World!Hello World!
+Fatal error: Call to private method MyClass::sayHelloWorld() from context '' in %s on line %d
\ No newline at end of file
Added: php/php-src/trunk/Zend/tests/traits/language009.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/traits/language009.phpt (rev 0)
+++ php/php-src/trunk/Zend/tests/traits/language009.phpt 2010-04-15 21:39:20 UTC (rev 298062)
@@ -0,0 +1,36 @@
+--TEST--
+In instead definitions all trait whose methods are meant to be hidden can be listed.
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+trait A {
+ public function foo() {
+ echo 'a';
+ }
+}
+
+trait B {
+ public function foo() {
+ echo 'b';
+ }
+}
+
+trait C {
+ public function foo() {
+ echo 'c';
+ }
+}
+
+class Foo {
+ use C, A, B {
+ B::foo instead A, C;
+ }
+}
+
+$t = new Foo;
+$t->foo();
+
+?>
+--EXPECTF--
+b
\ No newline at end of file
Added: php/php-src/trunk/Zend/tests/traits/language010.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/traits/language010.phpt (rev 0)
+++ php/php-src/trunk/Zend/tests/traits/language010.phpt 2010-04-15 21:39:20 UTC (rev 298062)
@@ -0,0 +1,32 @@
+--TEST--
+Aliasing leading to conflict should result in error message
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+trait Hello {
+ public function hello() {
+ echo 'Hello';
+ }
+}
+
+trait World {
+ public function world() {
+ echo ' World!';
+ }
+}
+
+
+class MyClass {
+ use Hello, World { hello as world; }
+}
+
+$o = new MyClass();
+$o->hello();
+$o->world();
+
+?>
+--EXPECTF--
+Warning: Trait method world has not been applied, because there are collisions with other trait methods on MyClass in %s on line %d
+Hello
+Fatal error: Call to undefined method MyClass::world() in %s on line %d
\ No newline at end of file
Added: php/php-src/trunk/Zend/tests/traits/language011.phpt
===================================================================
--- php/php-src/trunk/Zend/tests/traits/language011.phpt (rev 0)
+++ php/php-src/trunk/Zend/tests/traits/language011.phpt 2010-04-15 21:39:20 UTC (rev 298062)
@@ -0,0 +1,34 @@
+--TEST--
+Aliasing leading to conflict should result in error message
+--FILE--
+<?php
+error_reporting(E_ALL);
+
+trait Hello {
+ public function sayHello() {
+ echo 'Hello';
+ }
+}
+
+trait World {
+ public function sayHello() {
+ echo ' World!';
+ }
+}
+
+
+class MyClass {
+ use Hello, World { sayHello as sayWorld; }
+}
+
+$o = new MyClass();
+$o->sayHello();
+$o->sayWorld();
+
+?>
+--EXPECTF--
+Warning: Trait method sayWorld has not been applied, because there are collisions with other trait methods on MyClass in %s on line %d
+
+Warning: Trait method sayHello has not been applied, because there are collisions with other trait methods on MyClass in %s on line %d
+
+Fatal error: Call to undefined method MyClass::sayHello() in %s on line %d
\ No newline at end of file
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php