xref: /PHP-7.0/ext/spl/tests/iterator_041a.phpt (revision 610c7fbe)
1--TEST--
2SPL: iterator_to_array() and exceptions from destruct
3--FILE--
4<?php
5
6class MyArrayIterator extends ArrayIterator
7{
8	static protected $fail = 0;
9	public $state;
10
11	static function fail($state, $method)
12	{
13		if (self::$fail == $state)
14		{
15			throw new Exception("State $state: $method()");
16		}
17	}
18
19	function __construct()
20	{
21		$this->state = MyArrayIterator::$fail;
22		self::fail(0, __FUNCTION__);
23		parent::__construct(array(1, 2));
24		self::fail(1, __FUNCTION__);
25	}
26
27	function rewind()
28	{
29		self::fail(2, __FUNCTION__);
30		return parent::rewind();
31	}
32
33	function valid()
34	{
35		self::fail(3, __FUNCTION__);
36		return parent::valid();
37	}
38
39	function current()
40	{
41		self::fail(4, __FUNCTION__);
42		return parent::current();
43	}
44
45	function key()
46	{
47		self::fail(5, __FUNCTION__);
48		return parent::key();
49	}
50
51	function next()
52	{
53		self::fail(6, __FUNCTION__);
54		return parent::next();
55	}
56
57	function __destruct()
58	{
59		self::fail(7, __FUNCTION__);
60	}
61
62	static function test($func, $skip = null)
63	{
64		echo "===$func===\n";
65		self::$fail = 7;
66		while(self::$fail < 10)
67		{
68			try
69			{
70				var_dump($func(new MyArrayIterator()));
71				break;
72			}
73			catch (Exception $e)
74			{
75				echo $e->getMessage() . "\n";
76			}
77			if (isset($skip[self::$fail]))
78			{
79				self::$fail = $skip[self::$fail];
80			}
81			else
82			{
83				self::$fail++;
84			}
85		}
86	}
87}
88
89MyArrayIterator::test('iterator_to_array');
90MyArrayIterator::test('iterator_count', array(3 => 6));
91
92?>
93===DONE===
94<?php exit(0); ?>
95--EXPECT--
96===iterator_to_array===
97State 7: __destruct()
98array(2) {
99  [0]=>
100  int(1)
101  [1]=>
102  int(2)
103}
104===iterator_count===
105State 7: __destruct()
106int(2)
107===DONE===
108