parent
257cc2d796
commit
204908f6e9
29 changed files with 1455 additions and 19 deletions
@ -0,0 +1,6 @@ |
||||
--TEST-- |
||||
Strlen() function test |
||||
--FILE-- |
||||
<?php echo strlen("abcdef");?> |
||||
--EXPECT-- |
||||
6 |
||||
@ -0,0 +1,24 @@ |
||||
--TEST-- |
||||
Static variables in functions |
||||
--FILE-- |
||||
<?php |
||||
function blah() |
||||
{ |
||||
static $hey=0,$yo=0; |
||||
|
||||
echo "hey=".$hey++.", ",$yo--."\n"; |
||||
} |
||||
|
||||
function main() { |
||||
blah(); |
||||
blah(); |
||||
blah(); |
||||
if (isset($hey) || isset($yo)) { |
||||
echo "Local variables became global :(\n"; |
||||
} |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
hey=0, 0 |
||||
hey=1, -1 |
||||
hey=2, -2 |
||||
@ -0,0 +1,287 @@ |
||||
--TEST-- |
||||
General function test |
||||
--FILE-- |
||||
<?php |
||||
|
||||
function a() |
||||
{ |
||||
echo "hey\n"; |
||||
} |
||||
|
||||
function b($i) |
||||
{ |
||||
echo "$i\n"; |
||||
} |
||||
|
||||
function c($i, $j) |
||||
{ |
||||
echo "Counting from $i to $j\n"; |
||||
for ($k=$i; $k<=$j; $k++) { |
||||
echo "$k\n"; |
||||
} |
||||
} |
||||
|
||||
function factorial($n) |
||||
{ |
||||
if ($n==0 || $n==1) { |
||||
return 1; |
||||
} else { |
||||
return factorial($n-1)*$n; |
||||
} |
||||
} |
||||
|
||||
function factorial2($start, $n) |
||||
{ |
||||
if ($n<=$start) { |
||||
return $start; |
||||
} else { |
||||
return factorial2($start,$n-1)*$n; |
||||
} |
||||
} |
||||
|
||||
function call_fact() |
||||
{ |
||||
echo "(it should break at 5...)\n"; |
||||
for ($i=0; $i<=10; $i++) { |
||||
if ($i == 5) break; |
||||
$n=factorial($i); |
||||
echo "factorial($i) = $n\n"; |
||||
} |
||||
} |
||||
|
||||
function return4() { return 4; } |
||||
function return7() { return 7; } |
||||
|
||||
function andi($i, $j) |
||||
{ |
||||
for ($k=$i ; $k<=$j ; $k++) { |
||||
if ($k >5) continue; |
||||
echo "$k\n"; |
||||
} |
||||
} |
||||
|
||||
function main() { |
||||
a(); |
||||
b("blah"); |
||||
a(); |
||||
b("blah"); |
||||
c(7,14); |
||||
|
||||
a(); |
||||
|
||||
for ($k=0; $k<10; $k++) { |
||||
for ($i=0; $i<=10; $i++) { |
||||
$n=factorial($i); |
||||
echo "factorial($i) = $n\n"; |
||||
} |
||||
} |
||||
|
||||
|
||||
echo "and now, from a function...\n"; |
||||
|
||||
for ($k=0; $k<10; $k++) { |
||||
call_fact(); |
||||
} |
||||
|
||||
echo "------\n"; |
||||
$result = factorial(factorial(3)); |
||||
echo "$result\n"; |
||||
|
||||
$result = factorial2(return4(),return7()); |
||||
echo "$result\n"; |
||||
|
||||
andi (3,10); |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
hey |
||||
blah |
||||
hey |
||||
blah |
||||
Counting from 7 to 14 |
||||
7 |
||||
8 |
||||
9 |
||||
10 |
||||
11 |
||||
12 |
||||
13 |
||||
14 |
||||
hey |
||||
factorial(0) = 1 |
||||
factorial(1) = 1 |
||||
factorial(2) = 2 |
||||
factorial(3) = 6 |
||||
factorial(4) = 24 |
||||
factorial(5) = 120 |
||||
factorial(6) = 720 |
||||
factorial(7) = 5040 |
||||
factorial(8) = 40320 |
||||
factorial(9) = 362880 |
||||
factorial(10) = 3628800 |
||||
factorial(0) = 1 |
||||
factorial(1) = 1 |
||||
factorial(2) = 2 |
||||
factorial(3) = 6 |
||||
factorial(4) = 24 |
||||
factorial(5) = 120 |
||||
factorial(6) = 720 |
||||
factorial(7) = 5040 |
||||
factorial(8) = 40320 |
||||
factorial(9) = 362880 |
||||
factorial(10) = 3628800 |
||||
factorial(0) = 1 |
||||
factorial(1) = 1 |
||||
factorial(2) = 2 |
||||
factorial(3) = 6 |
||||
factorial(4) = 24 |
||||
factorial(5) = 120 |
||||
factorial(6) = 720 |
||||
factorial(7) = 5040 |
||||
factorial(8) = 40320 |
||||
factorial(9) = 362880 |
||||
factorial(10) = 3628800 |
||||
factorial(0) = 1 |
||||
factorial(1) = 1 |
||||
factorial(2) = 2 |
||||
factorial(3) = 6 |
||||
factorial(4) = 24 |
||||
factorial(5) = 120 |
||||
factorial(6) = 720 |
||||
factorial(7) = 5040 |
||||
factorial(8) = 40320 |
||||
factorial(9) = 362880 |
||||
factorial(10) = 3628800 |
||||
factorial(0) = 1 |
||||
factorial(1) = 1 |
||||
factorial(2) = 2 |
||||
factorial(3) = 6 |
||||
factorial(4) = 24 |
||||
factorial(5) = 120 |
||||
factorial(6) = 720 |
||||
factorial(7) = 5040 |
||||
factorial(8) = 40320 |
||||
factorial(9) = 362880 |
||||
factorial(10) = 3628800 |
||||
factorial(0) = 1 |
||||
factorial(1) = 1 |
||||
factorial(2) = 2 |
||||
factorial(3) = 6 |
||||
factorial(4) = 24 |
||||
factorial(5) = 120 |
||||
factorial(6) = 720 |
||||
factorial(7) = 5040 |
||||
factorial(8) = 40320 |
||||
factorial(9) = 362880 |
||||
factorial(10) = 3628800 |
||||
factorial(0) = 1 |
||||
factorial(1) = 1 |
||||
factorial(2) = 2 |
||||
factorial(3) = 6 |
||||
factorial(4) = 24 |
||||
factorial(5) = 120 |
||||
factorial(6) = 720 |
||||
factorial(7) = 5040 |
||||
factorial(8) = 40320 |
||||
factorial(9) = 362880 |
||||
factorial(10) = 3628800 |
||||
factorial(0) = 1 |
||||
factorial(1) = 1 |
||||
factorial(2) = 2 |
||||
factorial(3) = 6 |
||||
factorial(4) = 24 |
||||
factorial(5) = 120 |
||||
factorial(6) = 720 |
||||
factorial(7) = 5040 |
||||
factorial(8) = 40320 |
||||
factorial(9) = 362880 |
||||
factorial(10) = 3628800 |
||||
factorial(0) = 1 |
||||
factorial(1) = 1 |
||||
factorial(2) = 2 |
||||
factorial(3) = 6 |
||||
factorial(4) = 24 |
||||
factorial(5) = 120 |
||||
factorial(6) = 720 |
||||
factorial(7) = 5040 |
||||
factorial(8) = 40320 |
||||
factorial(9) = 362880 |
||||
factorial(10) = 3628800 |
||||
factorial(0) = 1 |
||||
factorial(1) = 1 |
||||
factorial(2) = 2 |
||||
factorial(3) = 6 |
||||
factorial(4) = 24 |
||||
factorial(5) = 120 |
||||
factorial(6) = 720 |
||||
factorial(7) = 5040 |
||||
factorial(8) = 40320 |
||||
factorial(9) = 362880 |
||||
factorial(10) = 3628800 |
||||
and now, from a function... |
||||
(it should break at 5...) |
||||
factorial(0) = 1 |
||||
factorial(1) = 1 |
||||
factorial(2) = 2 |
||||
factorial(3) = 6 |
||||
factorial(4) = 24 |
||||
(it should break at 5...) |
||||
factorial(0) = 1 |
||||
factorial(1) = 1 |
||||
factorial(2) = 2 |
||||
factorial(3) = 6 |
||||
factorial(4) = 24 |
||||
(it should break at 5...) |
||||
factorial(0) = 1 |
||||
factorial(1) = 1 |
||||
factorial(2) = 2 |
||||
factorial(3) = 6 |
||||
factorial(4) = 24 |
||||
(it should break at 5...) |
||||
factorial(0) = 1 |
||||
factorial(1) = 1 |
||||
factorial(2) = 2 |
||||
factorial(3) = 6 |
||||
factorial(4) = 24 |
||||
(it should break at 5...) |
||||
factorial(0) = 1 |
||||
factorial(1) = 1 |
||||
factorial(2) = 2 |
||||
factorial(3) = 6 |
||||
factorial(4) = 24 |
||||
(it should break at 5...) |
||||
factorial(0) = 1 |
||||
factorial(1) = 1 |
||||
factorial(2) = 2 |
||||
factorial(3) = 6 |
||||
factorial(4) = 24 |
||||
(it should break at 5...) |
||||
factorial(0) = 1 |
||||
factorial(1) = 1 |
||||
factorial(2) = 2 |
||||
factorial(3) = 6 |
||||
factorial(4) = 24 |
||||
(it should break at 5...) |
||||
factorial(0) = 1 |
||||
factorial(1) = 1 |
||||
factorial(2) = 2 |
||||
factorial(3) = 6 |
||||
factorial(4) = 24 |
||||
(it should break at 5...) |
||||
factorial(0) = 1 |
||||
factorial(1) = 1 |
||||
factorial(2) = 2 |
||||
factorial(3) = 6 |
||||
factorial(4) = 24 |
||||
(it should break at 5...) |
||||
factorial(0) = 1 |
||||
factorial(1) = 1 |
||||
factorial(2) = 2 |
||||
factorial(3) = 6 |
||||
factorial(4) = 24 |
||||
------ |
||||
720 |
||||
840 |
||||
3 |
||||
4 |
||||
5 |
||||
@ -0,0 +1,62 @@ |
||||
--TEST-- |
||||
General function test |
||||
--FILE-- |
||||
<?php |
||||
function print_something_multiple_times($something,$times) |
||||
{ |
||||
echo "----\nIn function, printing the string \"$something\" $times times\n"; |
||||
for ($i=0; $i<$times; $i++) { |
||||
echo "$i) $something\n"; |
||||
} |
||||
echo "Done with function...\n-----\n"; |
||||
} |
||||
|
||||
function some_other_function() |
||||
{ |
||||
echo "This is some other function, to ensure more than just one function works fine...\n"; |
||||
} |
||||
|
||||
function main() { |
||||
echo "Before function declaration...\n"; |
||||
echo "After function declaration...\n"; |
||||
|
||||
echo "Calling function for the first time...\n"; |
||||
print_something_multiple_times("This works!",10); |
||||
echo "Returned from function call...\n"; |
||||
|
||||
echo "Calling the function for the second time...\n"; |
||||
print_something_multiple_times("This like, really works and stuff...",3); |
||||
echo "Returned from function call...\n"; |
||||
|
||||
some_other_function(); |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
Before function declaration... |
||||
After function declaration... |
||||
Calling function for the first time... |
||||
---- |
||||
In function, printing the string "This works!" 10 times |
||||
0) This works! |
||||
1) This works! |
||||
2) This works! |
||||
3) This works! |
||||
4) This works! |
||||
5) This works! |
||||
6) This works! |
||||
7) This works! |
||||
8) This works! |
||||
9) This works! |
||||
Done with function... |
||||
----- |
||||
Returned from function call... |
||||
Calling the function for the second time... |
||||
---- |
||||
In function, printing the string "This like, really works and stuff..." 3 times |
||||
0) This like, really works and stuff... |
||||
1) This like, really works and stuff... |
||||
2) This like, really works and stuff... |
||||
Done with function... |
||||
----- |
||||
Returned from function call... |
||||
This is some other function, to ensure more than just one function works fine... |
||||
@ -0,0 +1,19 @@ |
||||
--TEST-- |
||||
Testing register_shutdown_function() |
||||
--SKIPIF-- |
||||
<?php die("skip");?> |
||||
--FILE-- |
||||
<?php |
||||
|
||||
function foo() |
||||
{ |
||||
print "foo"; |
||||
} |
||||
function main() { |
||||
register_shutdown_function("foo"); |
||||
print "foo() will be called on shutdown...\n"; |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
foo() will be called on shutdown... |
||||
foo |
||||
@ -0,0 +1,35 @@ |
||||
--TEST-- |
||||
Testing register_shutdown_function() with timeout. (Bug: #21513) |
||||
--SKIPIF-- |
||||
<?php die("skip");?> |
||||
<?php |
||||
if (PHP_OS_FAMILY === 'Windows' && version_compare(PHP_VERSION, '8.4', '<')) { |
||||
die("xfail fails on Windows Server 2022 and newer."); |
||||
} |
||||
if (getenv("SKIP_SLOW_TESTS")) die("skip slow test"); |
||||
?> |
||||
--FILE-- |
||||
<?php |
||||
|
||||
echo "Start\n"; |
||||
|
||||
function boo() |
||||
{ |
||||
echo "Shutdown\n"; |
||||
} |
||||
|
||||
register_shutdown_function("boo"); |
||||
|
||||
set_time_limit(1); |
||||
|
||||
/* infinite loop to simulate long processing */ |
||||
for (;;) {} |
||||
|
||||
echo "End\n"; |
||||
|
||||
?> |
||||
--EXPECTF-- |
||||
Start |
||||
|
||||
Fatal error: Maximum execution time of 1 second exceeded in %s on line %d |
||||
Shutdown |
||||
@ -0,0 +1,26 @@ |
||||
--TEST-- |
||||
Output buffering tests |
||||
--INI-- |
||||
output_buffering=0 |
||||
output_handler= |
||||
zlib.output_compression=0 |
||||
zlib.output_handler= |
||||
--FILE-- |
||||
<?php |
||||
ob_start(); |
||||
echo ob_get_level(); |
||||
echo 'A'; |
||||
ob_start(); |
||||
echo ob_get_level(); |
||||
echo 'B'; |
||||
$b = ob_get_contents(); |
||||
ob_end_clean(); |
||||
$a = ob_get_contents(); |
||||
ob_end_clean(); |
||||
|
||||
var_dump( $b ); // 2B |
||||
var_dump( $a ); // 1A |
||||
?> |
||||
--EXPECT-- |
||||
string(2) "2B" |
||||
string(2) "1A" |
||||
@ -0,0 +1,22 @@ |
||||
--TEST-- |
||||
INI functions test |
||||
--FILE-- |
||||
<?php |
||||
|
||||
$ini1 = ini_get('include_path'); |
||||
ini_set('include_path','ini_set_works'); |
||||
echo ini_get('include_path')."\n"; |
||||
ini_restore('include_path'); |
||||
$ini2 = ini_get('include_path'); |
||||
|
||||
if ($ini1 !== $ini2) { |
||||
echo "ini_restore() does not work.\n"; |
||||
} |
||||
else { |
||||
echo "ini_restore_works\n"; |
||||
} |
||||
|
||||
?> |
||||
--EXPECT-- |
||||
ini_set_works |
||||
ini_restore_works |
||||
@ -0,0 +1,16 @@ |
||||
--TEST-- |
||||
Test for buffering in core functions with implicit flush off |
||||
--INI-- |
||||
implicit_flush=0 |
||||
--FILE-- |
||||
<?php |
||||
$res = var_export("foo1"); |
||||
echo "\n"; |
||||
$res = var_export("foo2", TRUE); |
||||
echo "\n"; |
||||
echo $res."\n"; |
||||
?> |
||||
--EXPECT-- |
||||
'foo1' |
||||
|
||||
'foo2' |
||||
@ -0,0 +1,16 @@ |
||||
--TEST-- |
||||
Test for buffering in core functions with implicit flush on |
||||
--INI-- |
||||
implicit_flush=1 |
||||
--FILE-- |
||||
<?php |
||||
$res = var_export("foo1"); |
||||
echo "\n"; |
||||
$res = var_export("foo2", TRUE); |
||||
echo "\n"; |
||||
echo $res."\n"; |
||||
?> |
||||
--EXPECT-- |
||||
'foo1' |
||||
|
||||
'foo2' |
||||
@ -0,0 +1,78 @@ |
||||
--TEST-- |
||||
function with many parameters |
||||
--SKIPIF-- |
||||
<?php die("skip");?> |
||||
<?php |
||||
if (getenv("SKIP_SLOW_TESTS")) die("skip slow test"); |
||||
?> |
||||
--FILE-- |
||||
<?php |
||||
function test($a,$b) |
||||
{ |
||||
var_dump($a === $b); |
||||
test2($a,$b); |
||||
} |
||||
|
||||
function test2($a, $b) |
||||
{ |
||||
if ($a !== $b) { |
||||
var_dump("something went wrong: $a !== $b"); |
||||
} |
||||
} |
||||
|
||||
function main() { |
||||
// the stack size + some random constant |
||||
$boundary = 16*1024-16; |
||||
$limit = $boundary+42; |
||||
|
||||
// generate the function |
||||
$str = "<?php\nfunction x("; |
||||
|
||||
for($i=0; $i < $limit; ++$i) { |
||||
$str .= '$v'.dechex($i).($i===($limit-1) ? '' : ','); |
||||
} |
||||
|
||||
$str .= ') { |
||||
test($v42, \'42\'); |
||||
test(\'4000\', $v4000); |
||||
test2($v300, \'300\'); |
||||
test($v0, \'0\'); // first |
||||
test($v'.dechex($limit-1).", '".dechex($limit-1).'\'); // last |
||||
test($v'.dechex($boundary).", '".dechex($boundary).'\'); //boundary |
||||
test($v'.dechex($boundary+1).", '".dechex($boundary+1).'\'); //boundary+1 |
||||
test($v'.dechex($boundary-1).", '".dechex($boundary-1).'\'); //boundary-1 |
||||
}'; |
||||
|
||||
// generate the function call |
||||
$str .= "\n\nx("; |
||||
|
||||
for($i=0; $i< $limit; ++$i) { |
||||
$str .= "'".dechex($i)."'".($i===($limit-1) ? '' : ','); |
||||
} |
||||
|
||||
$str .= ");\n"; |
||||
|
||||
$filename = __DIR__.'/010-file.php'; |
||||
file_put_contents(__DIR__.'/010-file.php', $str); |
||||
unset($str); |
||||
|
||||
include($filename); |
||||
|
||||
echo "Done\n"; |
||||
} |
||||
|
||||
|
||||
?> |
||||
--CLEAN-- |
||||
<?php |
||||
@unlink(__DIR__.'/010-file.php'); |
||||
?> |
||||
--EXPECT-- |
||||
bool(true) |
||||
bool(true) |
||||
bool(true) |
||||
bool(true) |
||||
bool(true) |
||||
bool(true) |
||||
bool(true) |
||||
Done |
||||
@ -0,0 +1,9 @@ |
||||
--TEST-- |
||||
Test bitwise AND, OR, XOR, NOT and logical NOT in INI via error_reporting |
||||
--INI-- |
||||
error_reporting = E_ALL & E_NOTICE | E_PARSE ^ E_DEPRECATED & ~E_WARNING | !E_ERROR |
||||
--FILE-- |
||||
<?php |
||||
assert(ini_get('error_reporting') > 0); |
||||
?> |
||||
--EXPECT-- |
||||
@ -0,0 +1,12 @@ |
||||
--TEST-- |
||||
Bug #64523: XOR not parsed in INI |
||||
--SKIPIF-- |
||||
<?php die("skip");?> |
||||
--INI-- |
||||
error_reporting = E_ALL ^ E_NOTICE ^ E_WARNING ^ E_DEPRECATED |
||||
--FILE-- |
||||
<?php |
||||
echo ini_get('error_reporting'); |
||||
?> |
||||
--EXPECT-- |
||||
22517 |
||||
@ -0,0 +1,18 @@ |
||||
--TEST-- |
||||
ini_alter() check |
||||
--CREDITS-- |
||||
Sebastian Schürmann |
||||
sebs@php.net |
||||
Testfest 2009 Munich |
||||
--FILE-- |
||||
<?php |
||||
ini_alter('error_reporting', 1); |
||||
$var = ini_get('error_reporting'); |
||||
var_dump($var); |
||||
ini_alter('error_reporting', 0); |
||||
$var = ini_get('error_reporting'); |
||||
var_dump($var); |
||||
?> |
||||
--EXPECT-- |
||||
string(1) "1" |
||||
string(1) "0" |
||||
@ -0,0 +1,223 @@ |
||||
--TEST-- |
||||
String functions |
||||
--FILE-- |
||||
<?php |
||||
|
||||
echo "Testing strtok: "; |
||||
|
||||
$str = "testing 1/2\\3"; |
||||
$tok1 = strtok($str, " "); |
||||
$tok2 = strtok("/"); |
||||
$tok3 = strtok("\\"); |
||||
$tok4 = strtok("."); |
||||
if ($tok1 != "testing") { |
||||
echo("failed 1\n"); |
||||
} elseif ($tok2 != "1") { |
||||
echo("failed 2\n"); |
||||
} elseif ($tok3 != "2") { |
||||
echo("failed 3\n"); |
||||
} elseif ($tok4 != "3") { |
||||
echo("failed 4\n"); |
||||
} else { |
||||
echo("passed\n"); |
||||
} |
||||
|
||||
echo "Testing strstr: "; |
||||
$test = "This is a test"; |
||||
$found1 = strstr($test, chr(32)); |
||||
$found2 = strstr($test, "a "); |
||||
if ($found1 != " is a test") { |
||||
echo("failed 1\n"); |
||||
} elseif ($found2 != "a test") { |
||||
echo("failed 2\n"); |
||||
} else { |
||||
echo("passed\n"); |
||||
} |
||||
|
||||
echo "Testing strrchr: "; |
||||
$test = "fola fola blakken"; |
||||
$found1 = strrchr($test, "b"); |
||||
$found2 = strrchr($test, chr(102)); |
||||
if ($found1 != "blakken") { |
||||
echo("failed 1\n"); |
||||
} elseif ($found2 != "fola blakken") { |
||||
echo("failed 2\n"); |
||||
} |
||||
else { |
||||
echo("passed\n"); |
||||
} |
||||
|
||||
echo "Testing strtoupper: "; |
||||
$test = "abCdEfg"; |
||||
$upper = strtoupper($test); |
||||
if ($upper == "ABCDEFG") { |
||||
echo("passed\n"); |
||||
} else { |
||||
echo("failed!\n"); |
||||
} |
||||
|
||||
echo "Testing strtolower: "; |
||||
$test = "ABcDeFG"; |
||||
$lower = strtolower($test); |
||||
if ($lower == "abcdefg") { |
||||
echo("passed\n"); |
||||
} else { |
||||
echo("failed!\n"); |
||||
} |
||||
|
||||
echo "Testing substr: "; |
||||
$tests = $ok = 0; |
||||
$string = "string12345"; |
||||
$tests++; if (substr($string, 2, 10) == "ring12345") { $ok++; } |
||||
$tests++; if (substr($string, 4, 7) == "ng12345") { $ok++; } |
||||
$tests++; if (substr($string, 4) == "ng12345") { $ok++; } |
||||
$tests++; if (substr($string, 10, 2) == "5") { $ok++; } |
||||
$tests++; if (substr($string, 6, 0) == "") { $ok++; } |
||||
$tests++; if (substr($string, -2, 2) == "45") { $ok++; } |
||||
$tests++; if (substr($string, 1, -1) == "tring1234") { $ok++; } |
||||
$tests++; if (substr($string, -1, -2) == "") { $ok++; } |
||||
$tests++; if (substr($string, -3, -2) == "3") { $ok++; } |
||||
|
||||
if ($tests == $ok) { |
||||
echo("passed\n"); |
||||
} else { |
||||
echo("failed!\n"); |
||||
} |
||||
|
||||
$raw = ' !"#$%&\'()*+,-./0123456789:;<=>?' |
||||
. '@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_' |
||||
. '`abcdefghijklmnopqrstuvwxyz{|}~' |
||||
. ""; |
||||
|
||||
echo "Testing rawurlencode: "; |
||||
$encoded = rawurlencode($raw); |
||||
$correct = '%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F' |
||||
. '%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_' |
||||
. '%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~' |
||||
. ''; |
||||
if ($encoded == $correct) { |
||||
echo("passed\n"); |
||||
} else { |
||||
echo("failed!\n"); |
||||
} |
||||
|
||||
echo "Testing rawurldecode: "; |
||||
$decoded = rawurldecode($correct); |
||||
if ($decoded == $raw) { |
||||
echo("passed\n"); |
||||
} else { |
||||
echo("failed!\n"); |
||||
} |
||||
|
||||
echo "Testing urlencode: "; |
||||
$encoded = urlencode($raw); |
||||
$correct = '+%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F' |
||||
. '%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_' |
||||
. '%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E' |
||||
. ''; |
||||
if ($encoded == $correct) { |
||||
echo("passed\n"); |
||||
} else { |
||||
echo("failed!\n"); |
||||
} |
||||
|
||||
echo "Testing urldecode: "; |
||||
$decoded = urldecode($correct); |
||||
if ($decoded == $raw) { |
||||
echo("passed\n"); |
||||
} else { |
||||
echo("failed!\n"); |
||||
} |
||||
|
||||
echo "Testing quotemeta: "; |
||||
$raw = "a.\\+*?" . chr(91) . "^" . chr(93) . "b\$c"; |
||||
$quoted = quotemeta($raw); |
||||
if ($quoted == "a\\.\\\\\\+\\*\\?\\[\\^\\]b\\\$c") { |
||||
echo("passed\n"); |
||||
} else { |
||||
echo("failed!\n"); |
||||
} |
||||
|
||||
echo "Testing ufirst: "; |
||||
$str = "fahrvergnuegen"; |
||||
$uc = ucfirst($str); |
||||
if ($uc == "Fahrvergnuegen") { |
||||
echo("passed\n"); |
||||
} else { |
||||
echo("failed!\n"); |
||||
} |
||||
|
||||
echo "Testing strtr: "; |
||||
$str = "test abcdefgh"; |
||||
$tr = strtr($str, "def", "456"); |
||||
if ($tr == "t5st abc456gh") { |
||||
echo("passed\n"); |
||||
} else { |
||||
echo("failed!\n"); |
||||
} |
||||
|
||||
echo "Testing addslashes: "; |
||||
$str = "\"\\'"; |
||||
$as = addslashes($str); |
||||
if ($as == "\\\"\\\\\\'") { |
||||
echo("passed\n"); |
||||
} else { |
||||
echo("failed!\n"); |
||||
} |
||||
|
||||
echo "Testing stripslashes: "; |
||||
$str = "\$\\'"; |
||||
$ss = stripslashes($str); |
||||
if ($ss == "\$'") { |
||||
echo("passed\n"); |
||||
} else { |
||||
echo("failed!\n"); |
||||
} |
||||
|
||||
|
||||
echo "Testing uniqid(true): "; |
||||
$str = "prefix"; |
||||
$ui1 = uniqid($str, true); |
||||
$ui2 = uniqid($str, true); |
||||
|
||||
$len = 29; |
||||
|
||||
if (strlen($ui1) == strlen($ui2) && strlen($ui1) == $len && $ui1 != $ui2) { |
||||
echo("passed\n"); |
||||
} else { |
||||
echo("failed!\n"); |
||||
} |
||||
|
||||
echo "Testing uniqid(false): "; |
||||
$str = "prefix"; |
||||
$ui1 = uniqid($str); |
||||
usleep( 1 ); |
||||
$ui2 = uniqid($str); |
||||
|
||||
$len = strncasecmp(PHP_OS, 'CYGWIN', 6) ? 19 : 29; |
||||
|
||||
if (strlen($ui1) == strlen($ui2) && strlen($ui1) == $len && $ui1 != $ui2) { |
||||
echo("passed\n"); |
||||
} else { |
||||
echo("failed!\n"); |
||||
} |
||||
|
||||
?> |
||||
--EXPECT-- |
||||
Testing strtok: passed |
||||
Testing strstr: passed |
||||
Testing strrchr: passed |
||||
Testing strtoupper: passed |
||||
Testing strtolower: passed |
||||
Testing substr: passed |
||||
Testing rawurlencode: passed |
||||
Testing rawurldecode: passed |
||||
Testing urlencode: passed |
||||
Testing urldecode: passed |
||||
Testing quotemeta: passed |
||||
Testing ufirst: passed |
||||
Testing strtr: passed |
||||
Testing addslashes: passed |
||||
Testing stripslashes: passed |
||||
Testing uniqid(true): passed |
||||
Testing uniqid(false): passed |
||||
@ -0,0 +1,89 @@ |
||||
--TEST-- |
||||
Formatted print functions |
||||
--FILE-- |
||||
<?php |
||||
|
||||
$fp = fopen("php://stdout", "w"); |
||||
$x = fprintf($fp, "fprintf test 1:%.5s", "abcdefghij"); |
||||
echo "\n"; |
||||
var_dump($x); |
||||
|
||||
printf("printf test 1:%s\n", "simple string"); |
||||
printf("printf test 2:%d\n", 42); |
||||
printf("printf test 3:%f\n", 10.0/3); |
||||
printf("printf test 4:%.10f\n", 10.0/3); |
||||
printf("printf test 5:%-10.2f\n", 2.5); |
||||
printf("printf test 6:%-010.2f\n", 2.5); |
||||
printf("printf test 7:%010.2f\n", 2.5); |
||||
printf("printf test 8:<%20s>\n", "foo"); |
||||
printf("printf test 9:<%-20s>\n", "bar"); |
||||
printf("printf test 10: 123456789012345\n"); |
||||
printf("printf test 10:<%15s>\n", "hoyesterettsjustitiarius"); |
||||
printf("printf test 11: 123456789012345678901234567890\n"); |
||||
printf("printf test 11:<%30s>\n", "hoyesterettsjustitiarius"); |
||||
printf("printf test 12:%5.2f\n", -12.34); |
||||
printf("printf test 13:%5d\n", -12); |
||||
printf("printf test 14:%c\n", 64); |
||||
printf("printf test 15:%b\n", 170); |
||||
printf("printf test 16:%x\n", 170); |
||||
printf("printf test 17:%X\n", 170); |
||||
printf("printf test 18:%16b\n", 170); |
||||
printf("printf test 19:%16x\n", 170); |
||||
printf("printf test 20:%16X\n", 170); |
||||
printf("printf test 21:%016b\n", 170); |
||||
printf("printf test 22:%016x\n", 170); |
||||
printf("printf test 23:%016X\n", 170); |
||||
printf("printf test 24:%.5s\n", "abcdefghij"); |
||||
printf("printf test 25:%-2s\n", "gazonk"); |
||||
printf("printf test 26:%2\$d %1\$d\n", 1, 2); |
||||
printf("printf test 27:%3\$d %d %d\n", 1, 2, 3); |
||||
printf("printf test 28:%2\$02d %1\$2d\n", 1, 2); |
||||
printf("printf test 29:%2\$-2d %1\$2d\n", 1, 2); |
||||
//try { |
||||
// print("printf test 30:"); printf("%0\$s", 1); print("x\n"); |
||||
//} catch(\ValueError $e) { |
||||
// print('Error found: '.$e->getMessage()."\n"); |
||||
//} |
||||
printf("printf test 31:%.17g\n", INF); |
||||
printf("printf test 32:%.17g\n", -INF); |
||||
vprintf("vprintf test 1:%2\$-2d %1\$2d\n", array(1, 2)); |
||||
|
||||
|
||||
?> |
||||
--EXPECT-- |
||||
fprintf test 1:abcde |
||||
int(20) |
||||
printf test 1:simple string |
||||
printf test 2:42 |
||||
printf test 3:3.333333 |
||||
printf test 4:3.3333333333 |
||||
printf test 5:2.50 |
||||
printf test 6:2.50000000 |
||||
printf test 7:0000002.50 |
||||
printf test 8:< foo> |
||||
printf test 9:<bar > |
||||
printf test 10: 123456789012345 |
||||
printf test 10:<hoyesterettsjustitiarius> |
||||
printf test 11: 123456789012345678901234567890 |
||||
printf test 11:< hoyesterettsjustitiarius> |
||||
printf test 12:-12.34 |
||||
printf test 13: -12 |
||||
printf test 14:@ |
||||
printf test 15:10101010 |
||||
printf test 16:aa |
||||
printf test 17:AA |
||||
printf test 18: 10101010 |
||||
printf test 19: aa |
||||
printf test 20: AA |
||||
printf test 21:0000000010101010 |
||||
printf test 22:00000000000000aa |
||||
printf test 23:00000000000000AA |
||||
printf test 24:abcde |
||||
printf test 25:gazonk |
||||
printf test 26:2 1 |
||||
printf test 27:3 1 2 |
||||
printf test 28:02 1 |
||||
printf test 29:2 1 |
||||
printf test 31:INF |
||||
printf test 32:-INF |
||||
vprintf test 1:2 1 |
||||
@ -0,0 +1,17 @@ |
||||
--TEST-- |
||||
highlight_string() buffering |
||||
--INI-- |
||||
highlight.string=#DD0000 |
||||
highlight.comment=#FF9900 |
||||
highlight.keyword=#007700 |
||||
highlight.default=#0000BB |
||||
highlight.html=#000000 |
||||
--FILE-- |
||||
<?php |
||||
$var = highlight_string("<br /><?php echo \"foo\"; ?><br />"); |
||||
$var = highlight_string("<br /><?php echo \"bar\"; ?><br />", TRUE); |
||||
echo "\n[$var]\n"; |
||||
?> |
||||
--EXPECT-- |
||||
<pre><code style="color: #000000"><br /><span style="color: #0000BB"><?php </span><span style="color: #007700">echo </span><span style="color: #DD0000">"foo"</span><span style="color: #007700">; </span><span style="color: #0000BB">?></span><br /></code></pre> |
||||
[<pre><code style="color: #000000"><br /><span style="color: #0000BB"><?php </span><span style="color: #007700">echo </span><span style="color: #DD0000">"bar"</span><span style="color: #007700">; </span><span style="color: #0000BB">?></span><br /></code></pre>] |
||||
@ -0,0 +1,9 @@ |
||||
--TEST-- |
||||
testing the behavior of string offset chaining |
||||
--FILE-- |
||||
<?php |
||||
$string = "foobar"; |
||||
var_dump($string[0][0][0][0]); |
||||
?> |
||||
--EXPECT-- |
||||
string(1) "f" |
||||
@ -0,0 +1,80 @@ |
||||
--TEST-- |
||||
adding arrays |
||||
--FILE-- |
||||
<?php |
||||
|
||||
$a = array(1,2,3); |
||||
$b = array("str", "here"); |
||||
|
||||
$c = $a + $b; |
||||
var_dump($c); |
||||
|
||||
$a = array(1,2,3); |
||||
$b = array(1,2,4); |
||||
|
||||
$c = $a + $b; |
||||
var_dump($c); |
||||
|
||||
$a = array(); |
||||
$a["a"] = "aaa"; |
||||
$a[] = 2; |
||||
$a[] = 3; |
||||
|
||||
$b = array(); |
||||
$b[] = 1; |
||||
$b[] = 2; |
||||
$b["a"] = "bbbbbb"; |
||||
|
||||
$c = $a + $b; |
||||
var_dump($c); |
||||
|
||||
$a += $b; |
||||
var_dump($c); |
||||
|
||||
$a += $a; |
||||
var_dump($c); |
||||
|
||||
echo "Done\n"; |
||||
?> |
||||
--EXPECT-- |
||||
array(3) { |
||||
[0]=> |
||||
int(1) |
||||
[1]=> |
||||
int(2) |
||||
[2]=> |
||||
int(3) |
||||
} |
||||
array(3) { |
||||
[0]=> |
||||
int(1) |
||||
[1]=> |
||||
int(2) |
||||
[2]=> |
||||
int(3) |
||||
} |
||||
array(3) { |
||||
["a"]=> |
||||
string(3) "aaa" |
||||
[0]=> |
||||
int(2) |
||||
[1]=> |
||||
int(3) |
||||
} |
||||
array(3) { |
||||
["a"]=> |
||||
string(3) "aaa" |
||||
[0]=> |
||||
int(2) |
||||
[1]=> |
||||
int(3) |
||||
} |
||||
array(3) { |
||||
["a"]=> |
||||
string(3) "aaa" |
||||
[0]=> |
||||
int(2) |
||||
[1]=> |
||||
int(3) |
||||
} |
||||
Done |
||||
@ -0,0 +1,122 @@ |
||||
--TEST-- |
||||
Basic array unpacking |
||||
--SKIPIF-- |
||||
<?php die("skip");?> |
||||
--FILE-- |
||||
<?php |
||||
function getArr() { |
||||
return [4, 5]; |
||||
} |
||||
|
||||
function arrGen() { |
||||
for($i = 11; $i < 15; $i++) { |
||||
yield $i; |
||||
} |
||||
} |
||||
|
||||
function main() { |
||||
$array = [1, 2, 3]; |
||||
var_dump([...[]]); |
||||
var_dump([...[1, 2, 3]]); |
||||
var_dump([...$array]); |
||||
var_dump([...getArr()]); |
||||
var_dump([...arrGen()]); |
||||
var_dump([...new ArrayIterator(['a', 'b', 'c'])]); |
||||
|
||||
var_dump([0, ...$array, ...getArr(), 6, 7, 8, 9, 10, ...arrGen()]); |
||||
var_dump([0, ...$array, ...$array, 'end']); |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
array(0) { |
||||
} |
||||
array(3) { |
||||
[0]=> |
||||
int(1) |
||||
[1]=> |
||||
int(2) |
||||
[2]=> |
||||
int(3) |
||||
} |
||||
array(3) { |
||||
[0]=> |
||||
int(1) |
||||
[1]=> |
||||
int(2) |
||||
[2]=> |
||||
int(3) |
||||
} |
||||
array(2) { |
||||
[0]=> |
||||
int(4) |
||||
[1]=> |
||||
int(5) |
||||
} |
||||
array(4) { |
||||
[0]=> |
||||
int(11) |
||||
[1]=> |
||||
int(12) |
||||
[2]=> |
||||
int(13) |
||||
[3]=> |
||||
int(14) |
||||
} |
||||
array(3) { |
||||
[0]=> |
||||
string(1) "a" |
||||
[1]=> |
||||
string(1) "b" |
||||
[2]=> |
||||
string(1) "c" |
||||
} |
||||
array(15) { |
||||
[0]=> |
||||
int(0) |
||||
[1]=> |
||||
int(1) |
||||
[2]=> |
||||
int(2) |
||||
[3]=> |
||||
int(3) |
||||
[4]=> |
||||
int(4) |
||||
[5]=> |
||||
int(5) |
||||
[6]=> |
||||
int(6) |
||||
[7]=> |
||||
int(7) |
||||
[8]=> |
||||
int(8) |
||||
[9]=> |
||||
int(9) |
||||
[10]=> |
||||
int(10) |
||||
[11]=> |
||||
int(11) |
||||
[12]=> |
||||
int(12) |
||||
[13]=> |
||||
int(13) |
||||
[14]=> |
||||
int(14) |
||||
} |
||||
array(8) { |
||||
[0]=> |
||||
int(0) |
||||
[1]=> |
||||
int(1) |
||||
[2]=> |
||||
int(2) |
||||
[3]=> |
||||
int(3) |
||||
[4]=> |
||||
int(1) |
||||
[5]=> |
||||
int(2) |
||||
[6]=> |
||||
int(3) |
||||
[7]=> |
||||
string(3) "end" |
||||
} |
||||
@ -0,0 +1,23 @@ |
||||
--TEST-- |
||||
Stress test $x .= $x |
||||
--FILE-- |
||||
<?php |
||||
|
||||
/* |
||||
* Test case for a concat_function() change that broke a test outside of Zend |
||||
* |
||||
* @see https://github.com/php/php-src/commit/29397f8fd2b4bc8d95e18448ca2d27a62241a407 |
||||
**/ |
||||
|
||||
$result = 'f'; |
||||
|
||||
for ($i = 0; $i < 25; ++$i) { |
||||
$result .= $result; |
||||
} |
||||
|
||||
var_dump(strlen($result)); |
||||
echo "Done\n"; |
||||
?> |
||||
--EXPECT-- |
||||
int(33554432) |
||||
Done |
||||
@ -0,0 +1,40 @@ |
||||
--TEST-- |
||||
Concatenating many small strings should not slowdown allocations |
||||
--SKIPIF-- |
||||
<?php |
||||
//if (PHP_DEBUG) { die ("skip debug version is slow"); } |
||||
//if (getenv('SKIP_PERF_SENSITIVE')) die("skip performance sensitive test"); |
||||
?> |
||||
--FILE-- |
||||
<?php |
||||
|
||||
$time = microtime(TRUE); |
||||
|
||||
/* This might vary on Linux/Windows, so the worst case and also count in slow machines. */ |
||||
$t_max = 1.0; |
||||
|
||||
$datas = array_fill(0, 220000, [ |
||||
'000.000.000.000', |
||||
'000.255.255.255', |
||||
'保留地址', |
||||
'保留地址', |
||||
'保留地址', |
||||
'保留地址', |
||||
'保留地址', |
||||
'保留地址', |
||||
]); |
||||
|
||||
$time = microtime(TRUE); |
||||
$texts = ''; |
||||
foreach ($datas AS $data) |
||||
{ |
||||
$texts .= implode("\t", $data) . "\r\n"; |
||||
} |
||||
|
||||
$t = microtime(TRUE) - $time; |
||||
var_dump($t < $t_max); |
||||
echo "+++DONE+++\n"; |
||||
?> |
||||
--EXPECT-- |
||||
bool(true) |
||||
+++DONE+++ |
||||
@ -0,0 +1,21 @@ |
||||
--TEST-- |
||||
Creating recursive array on foreach using same variable |
||||
--INI-- |
||||
zend.enable_gc=1 |
||||
--SKIPIF-- |
||||
<?php die("skip");?> |
||||
--FILE-- |
||||
<?php |
||||
|
||||
error_reporting(E_ALL); |
||||
|
||||
foreach (($a = array('a' => array('a' => &$a))) as $a) { |
||||
var_dump($a); |
||||
} |
||||
|
||||
?> |
||||
--EXPECT-- |
||||
array(1) { |
||||
["a"]=> |
||||
*RECURSION* |
||||
} |
||||
@ -0,0 +1,73 @@ |
||||
--TEST-- |
||||
Iterator exceptions in foreach by value |
||||
--SKIPIF-- |
||||
<?php die("skip");?> |
||||
--FILE-- |
||||
<?php |
||||
class IT implements Iterator { |
||||
private $n = 0; |
||||
private $count = 0; |
||||
private $trap = null; |
||||
|
||||
function __construct($count, $trap = null) { |
||||
$this->count = $count; |
||||
$this->trap = $trap; |
||||
} |
||||
|
||||
function trap($trap) { |
||||
if ($trap === $this->trap) { |
||||
throw new Exception($trap); |
||||
} |
||||
} |
||||
|
||||
function rewind(): void {$this->trap(__FUNCTION__); $this->n = 0;} |
||||
function valid(): bool {$this->trap(__FUNCTION__); return $this->n < $this->count;} |
||||
function key(): mixed {$this->trap(__FUNCTION__); return $this->n;} |
||||
function current(): mixed {$this->trap(__FUNCTION__); return $this->n;} |
||||
function next(): void {$this->trap(__FUNCTION__); $this->n++;} |
||||
} |
||||
|
||||
foreach(['rewind', 'valid', 'key', 'current', 'next'] as $trap) { |
||||
$obj = new IT(3, $trap); |
||||
try { |
||||
// IS_CV |
||||
foreach ($obj as $key => $val) echo "$val\n"; |
||||
} catch (Exception $e) { |
||||
echo $e->getMessage() . "\n"; |
||||
} |
||||
unset($obj); |
||||
|
||||
try { |
||||
// IS_VAR |
||||
foreach (new IT(3, $trap) as $key => $val) echo "$val\n"; |
||||
} catch (Exception $e) { |
||||
echo $e->getMessage() . "\n"; |
||||
} |
||||
|
||||
try { |
||||
// IS_TMP_VAR |
||||
foreach ((object)new IT(2, $trap) as $key => $val) echo "$val\n"; |
||||
} catch (Exception $e) { |
||||
echo $e->getMessage() . "\n"; |
||||
} |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
rewind |
||||
rewind |
||||
rewind |
||||
valid |
||||
valid |
||||
valid |
||||
key |
||||
key |
||||
key |
||||
current |
||||
current |
||||
current |
||||
0 |
||||
next |
||||
0 |
||||
next |
||||
0 |
||||
next |
||||
@ -0,0 +1,22 @@ |
||||
--TEST-- |
||||
Nested foreach by reference on the same array |
||||
--FILE-- |
||||
<?php |
||||
$a = [1,2,3]; |
||||
foreach($a as &$x) { |
||||
foreach($a as &$y) { |
||||
echo "$x-$y\n"; |
||||
$y++; |
||||
} |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
1-1 |
||||
2-2 |
||||
2-3 |
||||
3-2 |
||||
3-3 |
||||
4-4 |
||||
5-3 |
||||
5-4 |
||||
5-5 |
||||
@ -0,0 +1,20 @@ |
||||
--TEST-- |
||||
Foreach by reference on constant |
||||
--FILE-- |
||||
<?php |
||||
for ($i = 0; $i < 3; $i++) { |
||||
foreach ([1,2,3] as &$val) { |
||||
echo "$val\n"; |
||||
} |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
1 |
||||
2 |
||||
3 |
||||
1 |
||||
2 |
||||
3 |
||||
1 |
||||
2 |
||||
3 |
||||
@ -0,0 +1,13 @@ |
||||
--TEST-- |
||||
Foreach by reference and inserting new element when we are already at the end |
||||
--FILE-- |
||||
<?php |
||||
$a = [1]; |
||||
foreach($a as &$v) { |
||||
echo "$v\n"; |
||||
$a[1]=2; |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
1 |
||||
2 |
||||
Loading…
Reference in new issue