Skip to content

Commit a479ed7

Browse files
authored
Zend: Add tests for offsets and containers (#12723)
Add various tests showcasing the behavioural variations of different offset types used on various container types in all possible operations: - Read - Write - Read Write - Appending - Unsetting - Existence checks with isset()/empty/null coalesce operator - Behaviour of nesting dimensions (e.g. $container[$offset1][$offset2]) Add a test to ensure compile time and runtime behaviour is identical for offsets. Add an internal class that overloads the dimension object handlers to zend_test
1 parent 8128d17 commit a479ed7

18 files changed

+3033
-1
lines changed
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
--TEST--
2+
ArrayAccess containers behaviour with offsets
3+
--FILE--
4+
<?php
5+
6+
require_once __DIR__ . DIRECTORY_SEPARATOR . 'test_offset_helpers.inc';
7+
8+
const EXPECTED_OUTPUT = <<<OUTPUT
9+
Read before write:
10+
string(12) "CLASS_NAME::offsetGet"
11+
VAR_DUMP_OF_OFFSET
12+
int(5)
13+
Write:
14+
string(12) "CLASS_NAME::offsetSet"
15+
VAR_DUMP_OF_OFFSET
16+
int(5)
17+
Read:
18+
string(12) "CLASS_NAME::offsetGet"
19+
VAR_DUMP_OF_OFFSET
20+
int(5)
21+
Read-Write:
22+
string(12) "CLASS_NAME::offsetGet"
23+
VAR_DUMP_OF_OFFSET
24+
string(12) "CLASS_NAME::offsetSet"
25+
VAR_DUMP_OF_OFFSET
26+
int(25)
27+
isset():
28+
string(15) "CLASS_NAME::offsetExists"
29+
VAR_DUMP_OF_OFFSET
30+
bool(true)
31+
empty():
32+
string(15) "CLASS_NAME::offsetExists"
33+
VAR_DUMP_OF_OFFSET
34+
string(12) "CLASS_NAME::offsetGet"
35+
VAR_DUMP_OF_OFFSET
36+
bool(false)
37+
null coalesce:
38+
string(15) "CLASS_NAME::offsetExists"
39+
VAR_DUMP_OF_OFFSET
40+
string(12) "CLASS_NAME::offsetGet"
41+
VAR_DUMP_OF_OFFSET
42+
int(5)
43+
unset():
44+
string(14) "CLASS_NAME::offsetUnset"
45+
VAR_DUMP_OF_OFFSET
46+
Nested read:
47+
string(12) "CLASS_NAME::offsetGet"
48+
VAR_DUMP_OF_OFFSET
49+
50+
Warning: Trying to access array offset on int in %s on line 62
51+
NULL
52+
Nested write:
53+
string(12) "CLASS_NAME::offsetGet"
54+
VAR_DUMP_OF_OFFSET
55+
56+
Notice: Indirect modification of overloaded element of CLASS_NAME has no effect in %s on line 69
57+
Cannot use a scalar value as an array
58+
Nested Read-Write:
59+
string(12) "CLASS_NAME::offsetGet"
60+
VAR_DUMP_OF_OFFSET
61+
62+
Notice: Indirect modification of overloaded element of CLASS_NAME has no effect in %s on line 76
63+
Cannot use a scalar value as an array
64+
Nested isset():
65+
string(15) "CLASS_NAME::offsetExists"
66+
VAR_DUMP_OF_OFFSET
67+
string(12) "CLASS_NAME::offsetGet"
68+
VAR_DUMP_OF_OFFSET
69+
bool(false)
70+
Nested empty():
71+
string(15) "CLASS_NAME::offsetExists"
72+
VAR_DUMP_OF_OFFSET
73+
string(12) "CLASS_NAME::offsetGet"
74+
VAR_DUMP_OF_OFFSET
75+
bool(true)
76+
Nested null coalesce:
77+
string(15) "CLASS_NAME::offsetExists"
78+
VAR_DUMP_OF_OFFSET
79+
string(12) "CLASS_NAME::offsetGet"
80+
VAR_DUMP_OF_OFFSET
81+
string(7) "default"
82+
Nested unset():
83+
string(12) "CLASS_NAME::offsetGet"
84+
VAR_DUMP_OF_OFFSET
85+
86+
Notice: Indirect modification of overloaded element of CLASS_NAME has no effect in %s on line 102
87+
Cannot unset offset in a non-array variable
88+
89+
OUTPUT;
90+
91+
ob_start();
92+
foreach (['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+
}
123+
ob_end_clean();
124+
125+
echo "Executed tests\n";
126+
if ($failures !== []) {
127+
echo "Failures:\n" . implode($failures);
128+
}
129+
130+
?>
131+
--EXPECT--
132+
Executed tests

0 commit comments

Comments
 (0)