From: andy wharmby Date: Sun, 14 Jun 2009 14:17:46 +0000 (+0000) Subject: New foreach tests. Tested on Windows, Linux and Linux 64 bit. X-Git-Tag: php-5.4.0alpha1~191^2~3328 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=525416a241af4f9a8ad0707c25c553a6fa23ed4d;p=php New foreach tests. Tested on Windows, Linux and Linux 64 bit. --- diff --git a/tests/lang/foreachLoopObjects.001.phpt b/tests/lang/foreachLoopObjects.001.phpt new file mode 100644 index 0000000000..fdb9f485e1 --- /dev/null +++ b/tests/lang/foreachLoopObjects.001.phpt @@ -0,0 +1,69 @@ +--TEST-- +Foreach loop on objects - basic loop with just value and key => value. +--FILE-- + $v) { + var_dump($k, $v); +} +echo "\nCheck key and value after the loop.\n"; +var_dump($k, $v); + + +echo "\n\nObject instantiated inside loop.\n"; +foreach (new C as $v) { + var_dump($v); +} +foreach (new C as $k => $v) { + var_dump($k, $v); +} +echo "\nCheck key and value after the loop.\n"; +var_dump($k, $v); +?> +--EXPECTF-- + + +Simple loop. +unicode(10) "Original a" +unicode(10) "Original b" +unicode(10) "Original c" +unicode(1) "a" +unicode(10) "Original a" +unicode(1) "b" +unicode(10) "Original b" +unicode(1) "c" +unicode(10) "Original c" + +Check key and value after the loop. +unicode(1) "c" +unicode(10) "Original c" + + +Object instantiated inside loop. +unicode(10) "Original a" +unicode(10) "Original b" +unicode(10) "Original c" +unicode(1) "a" +unicode(10) "Original a" +unicode(1) "b" +unicode(10) "Original b" +unicode(1) "c" +unicode(10) "Original c" + +Check key and value after the loop. +unicode(1) "c" +unicode(10) "Original c" \ No newline at end of file diff --git a/tests/lang/foreachLoopObjects.002.phpt b/tests/lang/foreachLoopObjects.002.phpt new file mode 100644 index 0000000000..d093d80035 --- /dev/null +++ b/tests/lang/foreachLoopObjects.002.phpt @@ -0,0 +1,587 @@ +--TEST-- +Foreach loop tests - visibility. +--FILE-- +&$v) { + var_dump($v); + $v="changed.$k"; + } + } + + static function doForEach($obj) { + echo "in C::doForEach\n"; + foreach ($obj as $k=>&$v) { + var_dump($v); + $v="changed.$k"; + } + } + + function doForEachOnThis() { + echo "in C::doForEachOnThis\n"; + foreach ($this as $k=>&$v) { + var_dump($v); + $v="changed.$k"; + } + } + +} + +class D extends C { + + private $f = "Original f"; + protected $g = "Original g"; + + static function doForEach($obj) { + echo "in D::doForEach\n"; + foreach ($obj as $k=>&$v) { + var_dump($v); + $v="changed.$k"; + } + } + + function doForEachOnThis() { + echo "in D::doForEachOnThis\n"; + foreach ($this as $k=>&$v) { + var_dump($v); + $v="changed.$k"; + } + } +} + +class E extends D { + public $a = "Overridden a"; + public $b = "Overridden b"; + public $c = "Overridden c"; + protected $d = "Overridden d"; + private $e = "Overridden e"; + + static function doForEach($obj) { + echo "in E::doForEach\n"; + foreach ($obj as $k=>&$v) { + var_dump($v); + $v="changed.$k"; + } + } + + function doForEachOnThis() { + echo "in E::doForEachOnThis\n"; + foreach ($this as $k=>&$v) { + var_dump($v); + $v="changed.$k"; + } + } +} + +echo "\n\nIterate over various generations from within overridden methods:\n"; +echo "\n--> Using instance of C:\n"; +$myC = new C; +$myC->doForEachOnThis(); +var_dump($myC); +echo "\n--> Using instance of D:\n"; +$myD = new D; +$myD->doForEachOnThis(); +var_dump($myD); +echo "\n--> Using instance of E:\n"; +$myE = new E; +$myE->doForEachOnThis(); +var_dump($myE); + +echo "\n\nIterate over various generations from within an inherited method:\n"; +echo "\n--> Using instance of C:\n"; +$myC = new C; +$myC->doForEachC(); +var_dump($myC); +echo "\n--> Using instance of D:\n"; +$myD = new D; +$myD->doForEachC(); +var_dump($myD); +echo "\n--> Using instance of E:\n"; +$myE = new E; +$myE->doForEachC(); +var_dump($myE); + +echo "\n\nIterate over various generations from within an overridden static method:\n"; +echo "\n--> Using instance of C:\n"; +$myC = new C; +C::doForEach($myC); +var_dump($myC); +$myC = new C; +D::doForEach($myC); +var_dump($myC); +$myC = new C; +E::doForEach($myC); +var_dump($myC); +echo "\n--> Using instance of D:\n"; +$myD = new D; +C::doForEach($myD); +var_dump($myD); +$myD = new D; +D::doForEach($myD); +var_dump($myD); +$myD = new D; +E::doForEach($myD); +var_dump($myD); +echo "\n--> Using instance of E:\n"; +$myE = new E; +C::doForEach($myE); +var_dump($myE); +$myE = new E; +D::doForEach($myE); +var_dump($myE); +$myE = new E; +E::doForEach($myE); +var_dump($myE); + + +echo "\n\nIterate over various generations from outside the object:\n"; +echo "\n--> Using instance of C:\n"; +$myC = new C; +foreach ($myC as $k=>&$v) { + var_dump($v); + $v="changed.$k"; +} +var_dump($myC); +echo "\n--> Using instance of D:\n"; +$myD = new D; +foreach ($myD as $k=>&$v) { + var_dump($v); + $v="changed.$k"; +} +var_dump($myD); +echo "\n--> Using instance of E:\n"; +$myE = new E; +foreach ($myE as $k=>&$v) { + var_dump($v); + $v="changed.$k"; +} +var_dump($myE); +?> +===DONE=== +--EXPECTF-- +Iterate over various generations from within overridden methods: + +--> Using instance of C: +in C::doForEachOnThis +unicode(10) "Original a" +unicode(10) "Original b" +unicode(10) "Original c" +unicode(10) "Original d" +unicode(10) "Original e" +object(C)#%d (5) { + [u"a"]=> + unicode(9) "changed.a" + [u"b"]=> + unicode(9) "changed.b" + [u"c"]=> + unicode(9) "changed.c" + [u"d":protected]=> + unicode(9) "changed.d" + [u"e":u"C":private]=> + unicode(9) "changed.e" +} + +--> Using instance of D: +in D::doForEachOnThis +unicode(10) "Original f" +unicode(10) "Original g" +unicode(10) "Original a" +unicode(10) "Original b" +unicode(10) "Original c" +unicode(10) "Original d" +object(D)#%d (7) { + [u"f":u"D":private]=> + unicode(9) "changed.f" + [u"g":protected]=> + unicode(9) "changed.g" + [u"a"]=> + unicode(9) "changed.a" + [u"b"]=> + unicode(9) "changed.b" + [u"c"]=> + unicode(9) "changed.c" + [u"d":protected]=> + unicode(9) "changed.d" + [u"e":u"C":private]=> + unicode(10) "Original e" +} + +--> Using instance of E: +in E::doForEachOnThis +unicode(12) "Overridden a" +unicode(12) "Overridden b" +unicode(12) "Overridden c" +unicode(12) "Overridden d" +unicode(12) "Overridden e" +unicode(10) "Original g" +object(E)#%d (8) { + [u"a"]=> + unicode(9) "changed.a" + [u"b"]=> + unicode(9) "changed.b" + [u"c"]=> + unicode(9) "changed.c" + [u"d":protected]=> + unicode(9) "changed.d" + [u"e":u"E":private]=> + unicode(9) "changed.e" + [u"f":u"D":private]=> + unicode(10) "Original f" + [u"g":protected]=> + unicode(9) "changed.g" + [u"e":u"C":private]=> + unicode(10) "Original e" +} + + +Iterate over various generations from within an inherited method: + +--> Using instance of C: +in C::doForEachC +unicode(10) "Original a" +unicode(10) "Original b" +unicode(10) "Original c" +unicode(10) "Original d" +unicode(10) "Original e" +object(C)#%d (5) { + [u"a"]=> + unicode(9) "changed.a" + [u"b"]=> + unicode(9) "changed.b" + [u"c"]=> + unicode(9) "changed.c" + [u"d":protected]=> + unicode(9) "changed.d" + [u"e":u"C":private]=> + unicode(9) "changed.e" +} + +--> Using instance of D: +in C::doForEachC +unicode(10) "Original g" +unicode(10) "Original a" +unicode(10) "Original b" +unicode(10) "Original c" +unicode(10) "Original d" +unicode(10) "Original e" +object(D)#%d (7) { + [u"f":u"D":private]=> + unicode(10) "Original f" + [u"g":protected]=> + unicode(9) "changed.g" + [u"a"]=> + unicode(9) "changed.a" + [u"b"]=> + unicode(9) "changed.b" + [u"c"]=> + unicode(9) "changed.c" + [u"d":protected]=> + unicode(9) "changed.d" + [u"e":u"C":private]=> + unicode(9) "changed.e" +} + +--> Using instance of E: +in C::doForEachC +unicode(12) "Overridden a" +unicode(12) "Overridden b" +unicode(12) "Overridden c" +unicode(12) "Overridden d" +unicode(10) "Original g" +unicode(10) "Original e" +object(E)#%d (8) { + [u"a"]=> + unicode(9) "changed.a" + [u"b"]=> + unicode(9) "changed.b" + [u"c"]=> + unicode(9) "changed.c" + [u"d":protected]=> + unicode(9) "changed.d" + [u"e":u"E":private]=> + unicode(12) "Overridden e" + [u"f":u"D":private]=> + unicode(10) "Original f" + [u"g":protected]=> + unicode(9) "changed.g" + [u"e":u"C":private]=> + unicode(9) "changed.e" +} + + +Iterate over various generations from within an overridden static method: + +--> Using instance of C: +in C::doForEach +unicode(10) "Original a" +unicode(10) "Original b" +unicode(10) "Original c" +unicode(10) "Original d" +unicode(10) "Original e" +object(C)#%d (5) { + [u"a"]=> + unicode(9) "changed.a" + [u"b"]=> + unicode(9) "changed.b" + [u"c"]=> + unicode(9) "changed.c" + [u"d":protected]=> + unicode(9) "changed.d" + [u"e":u"C":private]=> + unicode(9) "changed.e" +} +in D::doForEach +unicode(10) "Original a" +unicode(10) "Original b" +unicode(10) "Original c" +unicode(10) "Original d" +object(C)#%d (5) { + [u"a"]=> + unicode(9) "changed.a" + [u"b"]=> + unicode(9) "changed.b" + [u"c"]=> + unicode(9) "changed.c" + [u"d":protected]=> + unicode(9) "changed.d" + [u"e":u"C":private]=> + unicode(10) "Original e" +} +in E::doForEach +unicode(10) "Original a" +unicode(10) "Original b" +unicode(10) "Original c" +unicode(10) "Original d" +object(C)#%d (5) { + [u"a"]=> + unicode(9) "changed.a" + [u"b"]=> + unicode(9) "changed.b" + [u"c"]=> + unicode(9) "changed.c" + [u"d":protected]=> + unicode(9) "changed.d" + [u"e":u"C":private]=> + unicode(10) "Original e" +} + +--> Using instance of D: +in C::doForEach +unicode(10) "Original g" +unicode(10) "Original a" +unicode(10) "Original b" +unicode(10) "Original c" +unicode(10) "Original d" +unicode(10) "Original e" +object(D)#%d (7) { + [u"f":u"D":private]=> + unicode(10) "Original f" + [u"g":protected]=> + unicode(9) "changed.g" + [u"a"]=> + unicode(9) "changed.a" + [u"b"]=> + unicode(9) "changed.b" + [u"c"]=> + unicode(9) "changed.c" + [u"d":protected]=> + unicode(9) "changed.d" + [u"e":u"C":private]=> + unicode(9) "changed.e" +} +in D::doForEach +unicode(10) "Original f" +unicode(10) "Original g" +unicode(10) "Original a" +unicode(10) "Original b" +unicode(10) "Original c" +unicode(10) "Original d" +object(D)#%d (7) { + [u"f":u"D":private]=> + unicode(9) "changed.f" + [u"g":protected]=> + unicode(9) "changed.g" + [u"a"]=> + unicode(9) "changed.a" + [u"b"]=> + unicode(9) "changed.b" + [u"c"]=> + unicode(9) "changed.c" + [u"d":protected]=> + unicode(9) "changed.d" + [u"e":u"C":private]=> + unicode(10) "Original e" +} +in E::doForEach +unicode(10) "Original g" +unicode(10) "Original a" +unicode(10) "Original b" +unicode(10) "Original c" +unicode(10) "Original d" +object(D)#%d (7) { + [u"f":u"D":private]=> + unicode(10) "Original f" + [u"g":protected]=> + unicode(9) "changed.g" + [u"a"]=> + unicode(9) "changed.a" + [u"b"]=> + unicode(9) "changed.b" + [u"c"]=> + unicode(9) "changed.c" + [u"d":protected]=> + unicode(9) "changed.d" + [u"e":u"C":private]=> + unicode(10) "Original e" +} + +--> Using instance of E: +in C::doForEach +unicode(12) "Overridden a" +unicode(12) "Overridden b" +unicode(12) "Overridden c" +unicode(12) "Overridden d" +unicode(10) "Original g" +unicode(10) "Original e" +object(E)#%d (8) { + [u"a"]=> + unicode(9) "changed.a" + [u"b"]=> + unicode(9) "changed.b" + [u"c"]=> + unicode(9) "changed.c" + [u"d":protected]=> + unicode(9) "changed.d" + [u"e":u"E":private]=> + unicode(12) "Overridden e" + [u"f":u"D":private]=> + unicode(10) "Original f" + [u"g":protected]=> + unicode(9) "changed.g" + [u"e":u"C":private]=> + unicode(9) "changed.e" +} +in D::doForEach +unicode(12) "Overridden a" +unicode(12) "Overridden b" +unicode(12) "Overridden c" +unicode(12) "Overridden d" +unicode(10) "Original f" +unicode(10) "Original g" +object(E)#%d (8) { + [u"a"]=> + unicode(9) "changed.a" + [u"b"]=> + unicode(9) "changed.b" + [u"c"]=> + unicode(9) "changed.c" + [u"d":protected]=> + unicode(9) "changed.d" + [u"e":u"E":private]=> + unicode(12) "Overridden e" + [u"f":u"D":private]=> + unicode(9) "changed.f" + [u"g":protected]=> + unicode(9) "changed.g" + [u"e":u"C":private]=> + unicode(10) "Original e" +} +in E::doForEach +unicode(12) "Overridden a" +unicode(12) "Overridden b" +unicode(12) "Overridden c" +unicode(12) "Overridden d" +unicode(12) "Overridden e" +unicode(10) "Original g" +object(E)#%d (8) { + [u"a"]=> + unicode(9) "changed.a" + [u"b"]=> + unicode(9) "changed.b" + [u"c"]=> + unicode(9) "changed.c" + [u"d":protected]=> + unicode(9) "changed.d" + [u"e":u"E":private]=> + unicode(9) "changed.e" + [u"f":u"D":private]=> + unicode(10) "Original f" + [u"g":protected]=> + unicode(9) "changed.g" + [u"e":u"C":private]=> + unicode(10) "Original e" +} + + +Iterate over various generations from outside the object: + +--> Using instance of C: +unicode(10) "Original a" +unicode(10) "Original b" +unicode(10) "Original c" +object(C)#%d (5) { + [u"a"]=> + unicode(9) "changed.a" + [u"b"]=> + unicode(9) "changed.b" + [u"c"]=> + &unicode(9) "changed.c" + [u"d":protected]=> + unicode(10) "Original d" + [u"e":u"C":private]=> + unicode(10) "Original e" +} + +--> Using instance of D: +unicode(10) "Original a" +unicode(10) "Original b" +unicode(10) "Original c" +object(D)#%d (7) { + [u"f":u"D":private]=> + unicode(10) "Original f" + [u"g":protected]=> + unicode(10) "Original g" + [u"a"]=> + unicode(9) "changed.a" + [u"b"]=> + unicode(9) "changed.b" + [u"c"]=> + &unicode(9) "changed.c" + [u"d":protected]=> + unicode(10) "Original d" + [u"e":u"C":private]=> + unicode(10) "Original e" +} + +--> Using instance of E: +unicode(12) "Overridden a" +unicode(12) "Overridden b" +unicode(12) "Overridden c" +object(E)#%d (8) { + [u"a"]=> + unicode(9) "changed.a" + [u"b"]=> + unicode(9) "changed.b" + [u"c"]=> + &unicode(9) "changed.c" + [u"d":protected]=> + unicode(12) "Overridden d" + [u"e":u"E":private]=> + unicode(12) "Overridden e" + [u"f":u"D":private]=> + unicode(10) "Original f" + [u"g":protected]=> + unicode(10) "Original g" + [u"e":u"C":private]=> + unicode(10) "Original e" +} +===DONE=== \ No newline at end of file diff --git a/tests/lang/foreachLoopObjects.003.phpt b/tests/lang/foreachLoopObjects.003.phpt new file mode 100644 index 0000000000..6c3250766d --- /dev/null +++ b/tests/lang/foreachLoopObjects.003.phpt @@ -0,0 +1,250 @@ +--TEST-- +Foreach loop tests - modifying the object during the loop. +--FILE-- +$v) { + $obj->$k="changed.$k"; + var_dump($v); +} +var_dump($obj); + +echo "\nModifying the foreach \$value.\n"; +$obj = new C; +foreach ($obj as $k=>$v) { + $v="changed.$k"; +} +var_dump($obj); + + +echo "\nModifying the foreach &\$value.\n"; +$obj = new C; +foreach ($obj as $k=>&$v) { + $v="changed.$k"; +} +var_dump($obj); + +echo "\nAdding properties to an an object.\n"; +$obj = new C; +$counter=0; +foreach ($obj as $v) { + $newPropName = "new$counter"; + $obj->$newPropName = "Added property $counter"; + if ($counter++>10) { + echo "Loop detected\n"; + break; + } + var_dump($v); +} +var_dump($obj); + +echo "\nAdding properties to an an object, using &\$value.\n"; +$obj = new C; +$counter=0; +foreach ($obj as &$v) { + $newPropName = "new$counter"; + $obj->$newPropName = "Added property $counter"; + if ($counter++>10) { + echo "Loop detected\n"; + break; + } + var_dump($v); +} +var_dump($obj); + +echo "\nRemoving properties from an object.\n"; +$obj = new C; +foreach ($obj as $v) { + unset($obj->a); + unset($obj->b); + unset($obj->c); + var_dump($v); +} +var_dump($obj); + +echo "\nRemoving properties from an object, using &\$value.\n"; +$obj = new C; +foreach ($obj as &$v) { + unset($obj->a); + unset($obj->b); + unset($obj->c); + var_dump($v); +} +var_dump($obj); + +?> +===DONE=== +--EXPECTF-- +Directly changing object values. +unicode(10) "Original a" +unicode(10) "Original b" +unicode(10) "Original c" +object(C)#%d (5) { + [u"a"]=> + unicode(9) "changed.a" + [u"b"]=> + unicode(9) "changed.b" + [u"c"]=> + unicode(9) "changed.c" + [u"d":protected]=> + unicode(10) "Original d" + [u"e":u"C":private]=> + unicode(10) "Original e" +} + +Modifying the foreach $value. +object(C)#%d (5) { + [u"a"]=> + unicode(10) "Original a" + [u"b"]=> + unicode(10) "Original b" + [u"c"]=> + unicode(10) "Original c" + [u"d":protected]=> + unicode(10) "Original d" + [u"e":u"C":private]=> + unicode(10) "Original e" +} + +Modifying the foreach &$value. +object(C)#%d (5) { + [u"a"]=> + unicode(9) "changed.a" + [u"b"]=> + unicode(9) "changed.b" + [u"c"]=> + &unicode(9) "changed.c" + [u"d":protected]=> + unicode(10) "Original d" + [u"e":u"C":private]=> + unicode(10) "Original e" +} + +Adding properties to an an object. +unicode(10) "Original a" +unicode(10) "Original b" +unicode(10) "Original c" +unicode(16) "Added property 0" +unicode(16) "Added property 1" +unicode(16) "Added property 2" +unicode(16) "Added property 3" +unicode(16) "Added property 4" +unicode(16) "Added property 5" +unicode(16) "Added property 6" +unicode(16) "Added property 7" +Loop detected +object(C)#%d (17) { + [u"a"]=> + unicode(10) "Original a" + [u"b"]=> + unicode(10) "Original b" + [u"c"]=> + unicode(10) "Original c" + [u"d":protected]=> + unicode(10) "Original d" + [u"e":u"C":private]=> + unicode(10) "Original e" + [u"new0"]=> + unicode(16) "Added property 0" + [u"new1"]=> + unicode(16) "Added property 1" + [u"new2"]=> + unicode(16) "Added property 2" + [u"new3"]=> + unicode(16) "Added property 3" + [u"new4"]=> + unicode(16) "Added property 4" + [u"new5"]=> + unicode(16) "Added property 5" + [u"new6"]=> + unicode(16) "Added property 6" + [u"new7"]=> + unicode(16) "Added property 7" + [u"new8"]=> + unicode(16) "Added property 8" + [u"new9"]=> + unicode(16) "Added property 9" + [u"new10"]=> + unicode(17) "Added property 10" + [u"new11"]=> + unicode(17) "Added property 11" +} + +Adding properties to an an object, using &$value. +unicode(10) "Original a" +unicode(10) "Original b" +unicode(10) "Original c" +unicode(16) "Added property 0" +unicode(16) "Added property 1" +unicode(16) "Added property 2" +unicode(16) "Added property 3" +unicode(16) "Added property 4" +unicode(16) "Added property 5" +unicode(16) "Added property 6" +unicode(16) "Added property 7" +Loop detected +object(C)#%d (17) { + [u"a"]=> + unicode(10) "Original a" + [u"b"]=> + unicode(10) "Original b" + [u"c"]=> + unicode(10) "Original c" + [u"d":protected]=> + unicode(10) "Original d" + [u"e":u"C":private]=> + unicode(10) "Original e" + [u"new0"]=> + unicode(16) "Added property 0" + [u"new1"]=> + unicode(16) "Added property 1" + [u"new2"]=> + unicode(16) "Added property 2" + [u"new3"]=> + unicode(16) "Added property 3" + [u"new4"]=> + unicode(16) "Added property 4" + [u"new5"]=> + unicode(16) "Added property 5" + [u"new6"]=> + unicode(16) "Added property 6" + [u"new7"]=> + unicode(16) "Added property 7" + [u"new8"]=> + &unicode(16) "Added property 8" + [u"new9"]=> + unicode(16) "Added property 9" + [u"new10"]=> + unicode(17) "Added property 10" + [u"new11"]=> + unicode(17) "Added property 11" +} + +Removing properties from an object. +unicode(10) "Original a" +object(C)#%d (2) { + [u"d":protected]=> + unicode(10) "Original d" + [u"e":u"C":private]=> + unicode(10) "Original e" +} + +Removing properties from an object, using &$value. +unicode(10) "Original a" +object(C)#%d (2) { + [u"d":protected]=> + unicode(10) "Original d" + [u"e":u"C":private]=> + unicode(10) "Original e" +} +===DONE=== \ No newline at end of file diff --git a/tests/lang/foreachLoopObjects.004.phpt b/tests/lang/foreachLoopObjects.004.phpt new file mode 100644 index 0000000000..3ca5d60039 --- /dev/null +++ b/tests/lang/foreachLoopObjects.004.phpt @@ -0,0 +1,54 @@ +--TEST-- +Foreach loop tests - Removing the current element from an iterated object. +--FILE-- +b) { + unset($obj->b); + } + var_dump($v); + if (++$count>10) { + echo "Loop detected.\n"; + break; + } +} +var_dump($obj); + +?> +===DONE=== +--EXPECTF-- +Removing the current element from an iterated object. +unicode(10) "Original a" +unicode(10) "Original b" + +Notice: Undefined property: C::$b in %s on line %d +unicode(10) "Original c" + +Notice: Undefined property: C::$b in %s on line %d +unicode(10) "Original d" + +Notice: Undefined property: C::$b in %s on line %d +unicode(10) "Original e" +object(C)#%d (4) { + [u"a"]=> + unicode(10) "Original a" + [u"c"]=> + unicode(10) "Original c" + [u"d"]=> + unicode(10) "Original d" + [u"e"]=> + unicode(10) "Original e" +} +===DONE=== \ No newline at end of file diff --git a/tests/lang/foreachLoopObjects.005.phpt b/tests/lang/foreachLoopObjects.005.phpt new file mode 100644 index 0000000000..318d2de217 --- /dev/null +++ b/tests/lang/foreachLoopObjects.005.phpt @@ -0,0 +1,79 @@ +--TEST-- +Foreach loop tests - removing properties before and after the current property during the loop. +--FILE-- +a) { + unset($obj->c); + } + var_dump($v); + if (++$count>10) { + echo "Loop detected.\n"; + break; + } +} +var_dump($obj); + +echo "\nRemoving properties before the current element from an iterated object.\n"; +$obj = new C; +foreach ($obj as $v) { + if ($v==$obj->b) { + unset($obj->a); + } + var_dump($v); + if (++$count>10) { + echo "Loop detected.\n"; + break; + } +} +var_dump($obj); + + +?> +===DONE=== +--EXPECTF-- +Removing properties before the current element from an iterated object. +unicode(10) "Original a" +unicode(10) "Original b" +unicode(10) "Original d" +unicode(10) "Original e" +object(C)#%d (4) { + [u"a"]=> + unicode(10) "Original a" + [u"b"]=> + unicode(10) "Original b" + [u"d"]=> + unicode(10) "Original d" + [u"e"]=> + unicode(10) "Original e" +} + +Removing properties before the current element from an iterated object. +unicode(10) "Original a" +unicode(10) "Original b" +unicode(10) "Original c" +unicode(10) "Original d" +unicode(10) "Original e" +object(C)#%d (4) { + [u"b"]=> + unicode(10) "Original b" + [u"c"]=> + unicode(10) "Original c" + [u"d"]=> + unicode(10) "Original d" + [u"e"]=> + unicode(10) "Original e" +} +===DONE=== \ No newline at end of file diff --git a/tests/lang/foreachLoopObjects.006.phpt b/tests/lang/foreachLoopObjects.006.phpt new file mode 100644 index 0000000000..9eabc74ccf --- /dev/null +++ b/tests/lang/foreachLoopObjects.006.phpt @@ -0,0 +1,148 @@ +--TEST-- +Foreach loop tests - substituting the entire iterated entity during the loop. +--FILE-- +a = "new a"; +$obj2->b = "new b"; +$obj2->c = "new c"; +$obj2->d = "new d"; +$obj2->e = "new e"; +$obj2->f = "new f"; +$ref = &$obj; +$count=0; +foreach ($obj as $v) { + var_dump($v); + if ($v==$obj->b) { + $ref=$obj2; + } + if (++$count>10) { + echo "Loop detected.\n"; + break; + } +} +var_dump($obj); + +echo "\nSubstituting the iterated object for an array.\n"; +$obj = new C; +$a = array(1,2,3,4,5,6,7,8); +$ref = &$obj; +$count=0; +foreach ($obj as $v) { + var_dump($v); + if ($v==="Original b") { + $ref=$a; + } + if (++$count>10) { + echo "Loop detected.\n"; + break; + } +} +var_dump($obj); + +echo "\nSubstituting the iterated array for an object.\n"; +$a = array(1,2,3,4,5,6,7,8); +$obj = new C; +$ref = &$a; +$count=0; +foreach ($a as $v) { + var_dump($v); + if ($v===2) { + $ref=$obj; + } + if (++$count>10) { + echo "Loop detected.\n"; + break; + } +} +var_dump($obj); + +?> +===DONE=== +--EXPECTF-- +Substituting the iterated object for a different object. +unicode(10) "Original a" +unicode(10) "Original b" +unicode(5) "new a" +unicode(5) "new b" +unicode(5) "new c" +unicode(5) "new d" +unicode(5) "new e" +unicode(5) "new f" +object(stdClass)#%d (6) { + [u"a"]=> + unicode(5) "new a" + [u"b"]=> + unicode(5) "new b" + [u"c"]=> + unicode(5) "new c" + [u"d"]=> + unicode(5) "new d" + [u"e"]=> + unicode(5) "new e" + [u"f"]=> + unicode(5) "new f" +} + +Substituting the iterated object for an array. +unicode(10) "Original a" +unicode(10) "Original b" +int(1) +int(2) +int(3) +int(4) +int(5) +int(6) +int(7) +int(8) +array(8) { + [0]=> + int(1) + [1]=> + int(2) + [2]=> + int(3) + [3]=> + int(4) + [4]=> + int(5) + [5]=> + int(6) + [6]=> + int(7) + [7]=> + int(8) +} + +Substituting the iterated array for an object. +int(1) +int(2) +unicode(10) "Original a" +unicode(10) "Original b" +unicode(10) "Original c" +unicode(10) "Original d" +unicode(10) "Original e" +object(C)#1 (5) { + [u"a"]=> + unicode(10) "Original a" + [u"b"]=> + unicode(10) "Original b" + [u"c"]=> + unicode(10) "Original c" + [u"d"]=> + unicode(10) "Original d" + [u"e"]=> + unicode(10) "Original e" +} +===DONE=== \ No newline at end of file