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)
43unset():
44string(14) "CLASS_NAME::offsetUnset"
45VAR_DUMP_OF_OFFSET
46Nested read:
47string(12) "CLASS_NAME::offsetGet"
48VAR_DUMP_OF_OFFSET
49
50Warning: Trying to access array offset on int in %s on line 62
51NULL
52Nested write:
53string(12) "CLASS_NAME::offsetGet"
54VAR_DUMP_OF_OFFSET
55
56Notice: Indirect modification of overloaded element of CLASS_NAME has no effect in %s on line 69
57Cannot use a scalar value as an array
58Nested Read-Write:
59string(12) "CLASS_NAME::offsetGet"
60VAR_DUMP_OF_OFFSET
61
62Notice: Indirect modification of overloaded element of CLASS_NAME has no effect in %s on line 76
63Cannot use a scalar value as an array
64Nested isset():
65string(15) "CLASS_NAME::offsetExists"
66VAR_DUMP_OF_OFFSET
67string(12) "CLASS_NAME::offsetGet"
68VAR_DUMP_OF_OFFSET
69bool(false)
70Nested empty():
71string(15) "CLASS_NAME::offsetExists"
72VAR_DUMP_OF_OFFSET
73string(12) "CLASS_NAME::offsetGet"
74VAR_DUMP_OF_OFFSET
75bool(true)
76Nested null coalesce:
77string(15) "CLASS_NAME::offsetExists"
78VAR_DUMP_OF_OFFSET
79string(12) "CLASS_NAME::offsetGet"
80VAR_DUMP_OF_OFFSET
81string(7) "default"
82Nested unset():
83string(12) "CLASS_NAME::offsetGet"
84VAR_DUMP_OF_OFFSET
85
86Notice: Indirect modification of overloaded element of CLASS_NAME has no effect in %s on line 102
87Cannot unset offset in a non-array variable
88
89OUTPUT;
90
91ob_start();
92foreach (['A', 'B'] as $class) {
93    foreach ($offsets as $dimension) {
94        $container = new $class();
95        $error = "(new $class())[" . zend_test_var_export($dimension) . '] has different outputs' . "\n";
96        ob_start();
97        var_dump($dimension);
98        $var_dump_output = ob_get_clean();
99
100        include $var_dim_filename;
101        $varOutput = ob_get_contents();
102        ob_clean();
103        $varOutput = str_replace(
104            [$var_dim_filename],
105            ['%s'],
106            $varOutput
107        );
108
109        $expected_output = str_replace(
110            ["VAR_DUMP_OF_OFFSET\n", "CLASS_NAME"],
111            [$var_dump_output, $class],
112            EXPECTED_OUTPUT
113        );
114
115        if ($varOutput !== $expected_output) {
116            file_put_contents(__DIR__ . DIRECTORY_SEPARATOR . "debug_ArrayAccess_container_{$failuresNb}.txt", $varOutput);
117            ++$failuresNb;
118            $failures[] = $error;
119        }
120        ++$testCasesTotal;
121    }
122}
123ob_end_clean();
124
125echo "Executed tests\n";
126if ($failures !== []) {
127    echo "Failures:\n" . implode($failures);
128}
129
130?>
131--EXPECT--
132Executed tests
133