1--TEST--
2ArrayAccess containers behaviour with offsets
3--FILE--
4<?php
5
6require_once __DIR__ . DIRECTORY_SEPARATOR . 'test_offset_helpers.inc';
7
8const EXPECTED_OUTPUT = <<<OUTPUT
9Read before write:
10string(12) "CLASS_NAME::offsetGet"
11VAR_DUMP_OF_OFFSET
12int(5)
13Write:
14string(12) "CLASS_NAME::offsetSet"
15VAR_DUMP_OF_OFFSET
16int(5)
17Read:
18string(12) "CLASS_NAME::offsetGet"
19VAR_DUMP_OF_OFFSET
20int(5)
21Read-Write:
22string(12) "CLASS_NAME::offsetGet"
23VAR_DUMP_OF_OFFSET
24string(12) "CLASS_NAME::offsetSet"
25VAR_DUMP_OF_OFFSET
26int(25)
27isset():
28string(15) "CLASS_NAME::offsetExists"
29VAR_DUMP_OF_OFFSET
30bool(true)
31empty():
32string(15) "CLASS_NAME::offsetExists"
33VAR_DUMP_OF_OFFSET
34string(12) "CLASS_NAME::offsetGet"
35VAR_DUMP_OF_OFFSET
36bool(false)
37null coalesce:
38string(15) "CLASS_NAME::offsetExists"
39VAR_DUMP_OF_OFFSET
40string(12) "CLASS_NAME::offsetGet"
41VAR_DUMP_OF_OFFSET
42int(5)
43Reference to dimension:
44string(12) "CLASS_NAME::offsetGet"
45VAR_DUMP_OF_OFFSET
46
47Notice: Indirect modification of overloaded element of CLASS_NAME has no effect in %s on line 55
48Value of reference:
49int(5)
50Value of container dimension after write to reference (should be int(100) if successful):
51string(12) "CLASS_NAME::offsetGet"
52VAR_DUMP_OF_OFFSET
53int(5)
54unset():
55string(14) "CLASS_NAME::offsetUnset"
56VAR_DUMP_OF_OFFSET
57Nested read:
58string(12) "CLASS_NAME::offsetGet"
59VAR_DUMP_OF_OFFSET
60
61Warning: Trying to access array offset on int in %s on line 74
62NULL
63Nested write:
64string(12) "CLASS_NAME::offsetGet"
65VAR_DUMP_OF_OFFSET
66
67Notice: Indirect modification of overloaded element of CLASS_NAME has no effect in %s on line 81
68Cannot use a scalar value as an array
69Nested Read-Write:
70string(12) "CLASS_NAME::offsetGet"
71VAR_DUMP_OF_OFFSET
72
73Notice: Indirect modification of overloaded element of CLASS_NAME has no effect in %s on line 88
74Cannot use a scalar value as an array
75Nested isset():
76string(15) "CLASS_NAME::offsetExists"
77VAR_DUMP_OF_OFFSET
78string(12) "CLASS_NAME::offsetGet"
79VAR_DUMP_OF_OFFSET
80bool(false)
81Nested empty():
82string(15) "CLASS_NAME::offsetExists"
83VAR_DUMP_OF_OFFSET
84string(12) "CLASS_NAME::offsetGet"
85VAR_DUMP_OF_OFFSET
86bool(true)
87Nested null coalesce:
88string(15) "CLASS_NAME::offsetExists"
89VAR_DUMP_OF_OFFSET
90string(12) "CLASS_NAME::offsetGet"
91VAR_DUMP_OF_OFFSET
92string(7) "default"
93Nested unset():
94string(12) "CLASS_NAME::offsetGet"
95VAR_DUMP_OF_OFFSET
96
97Notice: Indirect modification of overloaded element of CLASS_NAME has no effect in %s on line 114
98Cannot unset offset in a non-array variable
99
100OUTPUT;
101
102ob_start();
103foreach (['A', 'B'] as $class) {
104    foreach ($offsets as $dimension) {
105        $container = new $class();
106        $error = "(new $class())[" . zend_test_var_export($dimension) . '] has different outputs' . "\n";
107        ob_start();
108        var_dump($dimension);
109        $var_dump_output = ob_get_clean();
110
111        include $var_dim_filename;
112        $varOutput = ob_get_contents();
113        ob_clean();
114        $varOutput = str_replace(
115            [$var_dim_filename],
116            ['%s'],
117            $varOutput
118        );
119
120        $expected_output = str_replace(
121            ["VAR_DUMP_OF_OFFSET\n", "CLASS_NAME"],
122            [$var_dump_output, $class],
123            EXPECTED_OUTPUT
124        );
125
126        if ($varOutput !== $expected_output) {
127            file_put_contents(__DIR__ . DIRECTORY_SEPARATOR . "debug_ArrayAccess_container_{$failuresNb}.txt", $varOutput);
128            ++$failuresNb;
129            $failures[] = $error;
130        }
131        ++$testCasesTotal;
132    }
133    /* Using offsets as references */
134    foreach ($offsets as $offset) {
135        $dimension = &$offset;
136        $container = new $class();
137        $error = "(new $class())[&" . zend_test_var_export($dimension) . '] has different outputs' . "\n";
138        ob_start();
139        var_dump($dimension);
140        $var_dump_output = ob_get_clean();
141
142        include $var_dim_filename;
143        $varOutput = ob_get_contents();
144        ob_clean();
145        $varOutput = str_replace(
146            [$var_dim_filename],
147            ['%s'],
148            $varOutput
149        );
150
151        $expected_output = str_replace(
152            ["VAR_DUMP_OF_OFFSET\n", "CLASS_NAME"],
153            [$var_dump_output, $class],
154            EXPECTED_OUTPUT
155        );
156
157        if ($varOutput !== $expected_output) {
158            file_put_contents(__DIR__ . DIRECTORY_SEPARATOR . "debug_ArrayAccess_container_{$failuresNb}.txt", $varOutput);
159            ++$failuresNb;
160            $failures[] = $error;
161        }
162        ++$testCasesTotal;
163    }
164}
165ob_end_clean();
166
167echo "Executed tests\n";
168if ($failures !== []) {
169    echo "Failures:\n" . implode($failures);
170}
171
172?>
173--EXPECT--
174Executed tests
175