xref: /PHP-7.4/ext/spl/tests/iterator_041b.phpt (revision ded3d984)
1--TEST--
2SPL: iterator_to_array() and exceptions from delayed 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 = 0;
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			try {
86				$e = null;
87			} catch (Exception $e) {
88			}
89		}
90	}
91}
92
93MyArrayIterator::test('iterator_to_array');
94MyArrayIterator::test('iterator_count', array(3 => 6));
95
96?>
97===DONE===
98<?php exit(0); ?>
99--EXPECT--
100===iterator_to_array===
101State 0: __construct()
102State 1: __construct()
103State 2: rewind()
104State 3: valid()
105State 4: current()
106State 5: key()
107State 6: next()
108State 7: __destruct()
109array(2) {
110  [0]=>
111  int(1)
112  [1]=>
113  int(2)
114}
115===iterator_count===
116State 0: __construct()
117State 1: __construct()
118State 2: rewind()
119State 3: valid()
120State 6: next()
121State 7: __destruct()
122int(2)
123===DONE===
124