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