Skip to content

Commit d7efed7

Browse files
committed
ext/standard: Add some sscanf tests
This is in preparation for some major refactoring as the current error messages are non-sensical
1 parent e51ec16 commit d7efed7

File tree

4 files changed

+188
-0
lines changed

4 files changed

+188
-0
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
--TEST--
2+
sscanf(): with strings containing null bytes
3+
--FILE--
4+
<?php
5+
6+
$str = "Hello\0wonderful\0World!";
7+
$format = "%s\0%s\0%s";
8+
try {
9+
var_dump(sscanf($str, $format));
10+
} catch (Throwable $e) {
11+
echo $e::class, ': ', $e->getMessage(), PHP_EOL;
12+
}
13+
try {
14+
var_dump(sscanf($str, $format, $a, $b, $c));
15+
var_dump($a, $b, $c);
16+
} catch (Throwable $e) {
17+
echo $e::class, ': ', $e->getMessage(), PHP_EOL;
18+
}
19+
?>
20+
--EXPECT--
21+
array(1) {
22+
[0]=>
23+
string(5) "Hello"
24+
}
25+
ValueError: Variable is not assigned by any conversion specifiers
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
--TEST--
2+
sscanf(): format string XPG argument tests
3+
--FILE--
4+
<?php
5+
6+
7+
$formats = [
8+
'%1$s %2$s %1$s',
9+
'%1$s %*s %3$s',
10+
'%s %*s %3$s',
11+
];
12+
13+
$str = "Hello World";
14+
15+
foreach ($formats as $format) {
16+
echo "Using format string '$format':\n";
17+
try {
18+
var_dump(sscanf($str, $format));
19+
} catch (Throwable $e) {
20+
echo $e::class, ': ', $e->getMessage(), PHP_EOL;
21+
}
22+
try {
23+
var_dump(sscanf($str, $format, $a, $b, $c));
24+
var_dump($a, $b, $c);
25+
$a = $b = $c = null;
26+
} catch (Throwable $e) {
27+
echo $e::class, ': ', $e->getMessage(), PHP_EOL;
28+
}
29+
}
30+
?>
31+
--EXPECT--
32+
Using format string '%1$s %2$s %1$s':
33+
ValueError: Variable is assigned by multiple "%n$" conversion specifiers
34+
ValueError: Variable is assigned by multiple "%n$" conversion specifiers
35+
Using format string '%1$s %*s %3$s':
36+
array(3) {
37+
[0]=>
38+
string(5) "Hello"
39+
[1]=>
40+
NULL
41+
[2]=>
42+
NULL
43+
}
44+
ValueError: Variable is not assigned by any conversion specifiers
45+
Using format string '%s %*s %3$s':
46+
ValueError: cannot mix "%" and "%n$" conversion specifiers
47+
ValueError: cannot mix "%" and "%n$" conversion specifiers
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
--TEST--
2+
sscanf(): unterminated range [] specifier
3+
--FILE--
4+
<?php
5+
6+
function combinatorial_concat(string $base, array $patterns): array {
7+
$r = [$base];
8+
foreach ($patterns as $pattern) {
9+
$r = array_merge(
10+
...array_map(
11+
fn (string $str) => [$str, $str . $pattern],
12+
$r,
13+
)
14+
);
15+
}
16+
return $r;
17+
}
18+
19+
$modifiers = [
20+
'^',
21+
']',
22+
];
23+
24+
$formats = combinatorial_concat('%[', $modifiers);
25+
26+
$str = "Hello World";
27+
28+
foreach ($formats as $format) {
29+
echo "Using format string '$format':\n";
30+
try {
31+
sscanf($str, $format);
32+
} catch (Throwable $e) {
33+
echo $e::class, ': ', $e->getMessage(), PHP_EOL;
34+
}
35+
}
36+
?>
37+
--EXPECT--
38+
Using format string '%[':
39+
ValueError: Unmatched [ in format string
40+
Using format string '%[]':
41+
ValueError: Unmatched [ in format string
42+
Using format string '%[^':
43+
ValueError: Unmatched [ in format string
44+
Using format string '%[^]':
45+
ValueError: Unmatched [ in format string
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
--TEST--
2+
sscanf(): format string which is unterminated
3+
--FILE--
4+
<?php
5+
6+
function combinatorial_concat(string $base, array $patterns): array {
7+
$r = [$base];
8+
foreach ($patterns as $pattern) {
9+
$r = array_merge(
10+
...array_map(
11+
fn (string $str) => [$str, $str . $pattern],
12+
$r,
13+
)
14+
);
15+
}
16+
return $r;
17+
}
18+
19+
$modifiers = [
20+
'*',
21+
'1$', // XPG
22+
'2', // Width
23+
'L', // Size
24+
];
25+
26+
$formats = combinatorial_concat('%', $modifiers);
27+
28+
$str = "Hello World";
29+
30+
foreach ($formats as $format) {
31+
echo "Using format string '$format':\n";
32+
try {
33+
sscanf($str, $format);
34+
} catch (Throwable $e) {
35+
echo $e::class, ': ', $e->getMessage(), PHP_EOL;
36+
}
37+
}
38+
?>
39+
--EXPECT--
40+
Using format string '%':
41+
ValueError: Bad scan conversion character "
42+
Using format string '%L':
43+
ValueError: Bad scan conversion character "
44+
Using format string '%2':
45+
ValueError: Bad scan conversion character "
46+
Using format string '%2L':
47+
ValueError: Bad scan conversion character "
48+
Using format string '%1$':
49+
ValueError: Bad scan conversion character "
50+
Using format string '%1$L':
51+
ValueError: Bad scan conversion character "
52+
Using format string '%1$2':
53+
ValueError: Bad scan conversion character "
54+
Using format string '%1$2L':
55+
ValueError: Bad scan conversion character "
56+
Using format string '%*':
57+
ValueError: Bad scan conversion character "
58+
Using format string '%*L':
59+
ValueError: Bad scan conversion character "
60+
Using format string '%*2':
61+
ValueError: Bad scan conversion character "
62+
Using format string '%*2L':
63+
ValueError: Bad scan conversion character "
64+
Using format string '%*1$':
65+
ValueError: Bad scan conversion character "$"
66+
Using format string '%*1$L':
67+
ValueError: Bad scan conversion character "$"
68+
Using format string '%*1$2':
69+
ValueError: Bad scan conversion character "$"
70+
Using format string '%*1$2L':
71+
ValueError: Bad scan conversion character "$"

0 commit comments

Comments
 (0)