Skip to content

Commit 2d6a883

Browse files
authored
Unify structure for ext/random's engine tests (#9321)
* Remove user_xoshiro128plusplus.phpt This test does not exercise any of the code paths of the random extension and thus is no value-add. * Unify structure for ext/random's engine tests
1 parent b9f7123 commit 2d6a883

15 files changed

+203
-184
lines changed

ext/random/tests/02_engine/all_serialize_error.phpt

Lines changed: 17 additions & 11 deletions
Large diffs are not rendered by default.
Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,35 @@
11
--TEST--
2-
Random: Engine: serialize: native
2+
Random: Engine: Serialization of native engines must preserve the sequence
33
--FILE--
44
<?php
55

6+
use Random\Engine\Mt19937;
7+
use Random\Engine\PcgOneseq128XslRr64;
8+
use Random\Engine\Xoshiro256StarStar;
9+
610
$engines = [];
7-
$engines[] = new \Random\Engine\Mt19937(1234);
8-
$engines[] = new \Random\Engine\PcgOneseq128XslRr64(1234);
9-
$engines[] = new \Random\Engine\Xoshiro256StarStar(1234);
11+
$engines[] = new Mt19937(1234);
12+
$engines[] = new PcgOneseq128XslRr64(1234);
13+
$engines[] = new Xoshiro256StarStar(1234);
1014

1115
foreach ($engines as $engine) {
12-
for ($i = 0; $i < 1000; $i++) {
16+
for ($i = 0; $i < 10_000; $i++) {
1317
$engine->generate();
1418
}
19+
1520
$engine2 = unserialize(serialize($engine));
16-
for ($i = 0; $i < 5000; $i++) {
21+
22+
for ($i = 0; $i < 10_000; $i++) {
1723
if ($engine->generate() !== $engine2->generate()) {
1824
$className = $engine::class;
19-
die("failure class: {$className} i: {$i}");
25+
26+
die("failure: {$className} at {$i}");
2027
}
2128
}
2229
}
2330

2431
die('success');
32+
2533
?>
2634
--EXPECT--
2735
success
Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,54 @@
11
--TEST--
2-
Random: Engine: serialize: user
2+
Random: Engine: Serialization of user engines must preserve the sequence
33
--FILE--
44
<?php
55

6-
final class User64 implements \Random\Engine
6+
use Random\Engine;
7+
8+
final class User64 implements Engine
79
{
810
private int $count = 0;
911

1012
public function generate(): string
1113
{
12-
return \pack('P*', ++$this->count);
14+
return pack('P*', ++$this->count);
1315
}
1416
}
1517

16-
final class User32 implements \Random\Engine
18+
final class User32 implements Engine
1719
{
1820
private int $count = 0;
1921

2022
public function generate(): string
2123
{
22-
return \pack('V', ++$this->count);
24+
return pack('V', ++$this->count);
2325
}
2426
}
2527

2628
$engines = [];
27-
if (\PHP_INT_SIZE >= 8) {
28-
$engines[] = new \User64();
29+
if (PHP_INT_SIZE >= 8) {
30+
$engines[] = new User64();
2931
}
30-
$engines[] = new \User32();
32+
$engines[] = new User32();
3133

3234
foreach ($engines as $engine) {
33-
for ($i = 0; $i < 1000; $i++) {
35+
for ($i = 0; $i < 10_000; $i++) {
3436
$engine->generate();
3537
}
38+
3639
$engine2 = unserialize(serialize($engine));
37-
for ($i = 0; $i < 5000; $i++) {
40+
41+
for ($i = 0; $i < 10_000; $i++) {
3842
if ($engine->generate() !== $engine2->generate()) {
3943
$className = $engine::class;
40-
die("failure class: {$className} i: {$i}");
44+
45+
die("failure: {$className} at {$i}");
4146
}
4247
}
4348
}
4449

4550
die('success');
51+
4652
?>
4753
--EXPECT--
4854
success

ext/random/tests/02_engine/mt19937_error.phpt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
--TEST--
2-
Random: Engine: Mt19937: error pattern
2+
Random: Engine: Mt19937: Invalid $mode parameter values must be rejected
33
--FILE--
44
<?php
55

6+
use Random\Engine\Mt19937;
7+
68
try {
7-
new \Random\Engine\Mt19937(1234, 2);
8-
} catch (\ValueError $e) {
9+
new Mt19937(1234, 2);
10+
} catch (ValueError $e) {
911
echo $e->getMessage(), PHP_EOL;
1012
}
1113

ext/random/tests/02_engine/mt19937_serialize.phpt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
--TEST--
2-
Random: Engine: Mt19937: serialize
2+
Random: Engine: Mt19937: The serialization output must be stable
33
--FILE--
44
<?php
55

6-
echo serialize(new \Random\Engine\Mt19937(1234));
6+
use Random\Engine\Mt19937;
7+
8+
echo serialize(new Mt19937(1234));
79

810
?>
911
--EXPECT--
Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
--TEST--
2-
Random: Engine: Mt19937: value
2+
Random: Engine: Mt19937: For a reference seed a fixed reference value must be generated
33
--FILE--
44
<?php
55

6-
$engine = new \Random\Engine\Mt19937(1234);
6+
use Random\Engine\Mt19937;
77

8-
for ($i = 0; $i < 10000; $i++) {
8+
$engine = new Mt19937(1234);
9+
10+
for ($i = 0; $i < 10_000; $i++) {
911
$engine->generate();
1012
}
1113

12-
echo \bin2hex($engine->generate());
14+
var_dump(bin2hex($engine->generate()));
15+
1316
?>
1417
--EXPECT--
15-
60fe95d9
18+
string(8) "60fe95d9"

ext/random/tests/02_engine/pcgoneseq128xslrr64_jump_error.phpt

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,27 @@
11
--TEST--
2-
Random: Engine: PcgOneseq128XslRr64: Jump with negative $advance
2+
Random: Engine: PcgOneseq128XslRr64: Negative jumps must be rejected
33
--FILE--
44
<?php
55

6-
$engine = new \Random\Engine\PcgOneseq128XslRr64(1234);
7-
$referenceEngine = new \Random\Engine\PcgOneseq128XslRr64(1234);
6+
use Random\Engine\PcgOneseq128XslRr64;
7+
8+
$engine = new PcgOneseq128XslRr64(1234);
9+
$referenceEngine = new PcgOneseq128XslRr64(1234);
810

911
try {
1012
$engine->jump(-1);
1113
} catch (ValueError $e) {
1214
echo $e->getMessage(), PHP_EOL;
1315
}
1416

15-
if ($engine->generate() !== $referenceEngine->generate()) {
16-
die('failure: state changed');
17+
for ($i = 0; $i < 10_000; $i++) {
18+
if ($engine->generate() !== $referenceEngine->generate()) {
19+
die('failure: state changed');
20+
}
1721
}
1822

1923
die('success');
24+
2025
?>
2126
--EXPECT--
2227
Random\Engine\PcgOneseq128XslRr64::jump(): Argument #1 ($advance) must be greater than or equal to 0

ext/random/tests/02_engine/pcgoneseq128xslrr64_seed.phpt

Lines changed: 40 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,63 @@
11
--TEST--
2-
Random: Engine: PcgOneseq128XslRr64: seed
2+
Random: Engine: PcgOneseq128XslRr64: The seed parameter must work as expected
33
--FILE--
44
<?php declare(strict_types = 1);
55

6-
$engine = new \Random\Engine\PcgOneseq128XslRr64(\random_int(\PHP_INT_MIN, \PHP_INT_MAX));
7-
$engine = new \Random\Engine\PcgOneseq128XslRr64(\random_bytes(16));
6+
use Random\Engine\PcgOneseq128XslRr64;
87

8+
echo "Random integer seed", PHP_EOL;
9+
$engine = new PcgOneseq128XslRr64(random_int(PHP_INT_MIN, PHP_INT_MAX));
10+
echo PHP_EOL, PHP_EOL;
11+
12+
echo "Random string seed", PHP_EOL;
13+
$engine = new PcgOneseq128XslRr64(random_bytes(16));
14+
echo PHP_EOL, PHP_EOL;
15+
16+
echo "Invalid data type", PHP_EOL;
917
try {
10-
$engine = new Random\Engine\PcgOneseq128XslRr64(1.0);
11-
} catch (\Throwable $e) {
12-
echo $e->getMessage() . PHP_EOL;
18+
$engine = new PcgOneseq128XslRr64(1.0);
19+
} catch (TypeError $e) {
20+
echo $e->getMessage(), PHP_EOL;
1321
}
22+
echo PHP_EOL, PHP_EOL;
1423

24+
echo "Invalid string seed length", PHP_EOL;
1525
try {
16-
$engine = new Random\Engine\PcgOneseq128XslRr64('foobar');
17-
} catch (\Throwable $e) {
18-
echo $e->getMessage() . PHP_EOL;
26+
$engine = new PcgOneseq128XslRr64('foobar');
27+
} catch (ValueError $e) {
28+
echo $e->getMessage(), PHP_EOL;
1929
}
30+
echo PHP_EOL, PHP_EOL;
2031

21-
$engine = new \Random\Engine\PcgOneseq128XslRr64("\x01\x02\x03\x04\x05\x06\x07\x08\x01\x02\x03\x04\x05\x06\x07\x08");
32+
echo "Valid string seed", PHP_EOL;
33+
$engine = new PcgOneseq128XslRr64(str_repeat("\x01\x02\x03\x04\x05\x06\x07\x08", 2));
2234

23-
\var_dump($engine);
35+
var_dump($engine);
2436

2537
for ($i = 0; $i < 1000; $i++) {
2638
$engine->generate();
2739
}
28-
\var_dump(\bin2hex($engine->generate()));
40+
41+
var_dump(bin2hex($engine->generate()));
2942

3043
?>
31-
--EXPECTF--
44+
--EXPECT--
45+
Random integer seed
46+
47+
48+
Random string seed
49+
50+
51+
Invalid data type
3252
Random\Engine\PcgOneseq128XslRr64::__construct(): Argument #1 ($seed) must be of type string|int|null, float given
53+
54+
55+
Invalid string seed length
3356
Random\Engine\PcgOneseq128XslRr64::__construct(): Argument #1 ($seed) must be a 16 byte (128 bit) string
34-
object(Random\Engine\PcgOneseq128XslRr64)#%d (%d) {
57+
58+
59+
Valid string seed
60+
object(Random\Engine\PcgOneseq128XslRr64)#3 (1) {
3561
["__states"]=>
3662
array(2) {
3763
[0]=>

ext/random/tests/02_engine/pcgoneseq128xslrr64_serialize.phpt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
--TEST--
2-
Random: Engine: PcgOneseq128XslRr64: serialize
2+
Random: Engine: PcgOneseq128XslRr64: The serialization output must be stable
33
--FILE--
44
<?php
55

6-
echo serialize(new \Random\Engine\PcgOneseq128XslRr64(1234));
6+
use Random\Engine\PcgOneseq128XslRr64;
7+
8+
echo serialize(new PcgOneseq128XslRr64(1234));
79

810
?>
911
--EXPECT--
Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
11
--TEST--
2-
Random: Engine: PcgOneseq128XslRr64: value
2+
Random: Engine: PcgOneseq128XslRr64: For a reference seed a fixed reference value must be generated
33
--FILE--
44
<?php
55

6-
$engine = new \Random\Engine\PcgOneseq128XslRr64(1234);
6+
use Random\Engine\PcgOneseq128XslRr64;
77

8-
for ($i = 0; $i < 10000; $i++) {
8+
$engine = new PcgOneseq128XslRr64(1234);
9+
10+
for ($i = 0; $i < 10_000; $i++) {
911
$engine->generate();
1012
}
1113

1214
$engine->jump(1234567);
1315

14-
echo \bin2hex($engine->generate());
16+
var_dump(bin2hex($engine->generate()));
17+
1518
?>
1619
--EXPECT--
17-
b88e2a0f23720a1d
20+
string(16) "b88e2a0f23720a1d"
Lines changed: 21 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,44 @@
11
--TEST--
2-
Random: Engine: User: compatibility
2+
Random: Engine: Native engines can be wrapped without changing their sequence
33
--FILE--
44
<?php
55

6-
$native_engine = new \Random\Engine\Mt19937(1234);
7-
$user_engine = new class () implements \Random\Engine {
8-
public function __construct(private $engine = new \Random\Engine\Mt19937(1234))
9-
{
10-
}
11-
12-
public function generate(): string
13-
{
14-
return $this->engine->generate();
15-
}
16-
};
17-
18-
for ($i = 0; $i < 1000; $i++) {
19-
if ($native_engine->generate() !== $user_engine->generate()) {
20-
die('failure Mt19937');
21-
}
22-
}
6+
use Random\Engine;
7+
use Random\Engine\Mt19937;
8+
use Random\Engine\PcgOneseq128XslRr64;
9+
use Random\Engine\Xoshiro256StarStar;
2310

24-
$native_engine = new \Random\Engine\PcgOneseq128XslRr64(1234);
25-
$user_engine = new class () implements \Random\Engine {
26-
public function __construct(private $engine = new \Random\Engine\PcgOneseq128XslRr64(1234))
11+
class WrapperEngine implements Engine
12+
{
13+
public function __construct(private readonly Engine $engine)
2714
{
2815
}
2916

3017
public function generate(): string
3118
{
3219
return $this->engine->generate();
3320
}
34-
};
35-
36-
for ($i = 0; $i < 1000; $i++) {
37-
if ($native_engine->generate() !== $user_engine->generate()) {
38-
die('failure PcgOneseq128XslRr64');
39-
}
4021
}
4122

42-
$native_engine = new \Random\Engine\Xoshiro256StarStar(1234);
43-
$user_engine = new class () implements \Random\Engine {
44-
public function __construct(private $engine = new \Random\Engine\Xoshiro256StarStar(1234))
45-
{
46-
}
23+
$engines = [];
24+
$engines[] = new Mt19937(1234);
25+
$engines[] = new PcgOneseq128XslRr64(1234);
26+
$engines[] = new Xoshiro256StarStar(1234);
4727

48-
public function generate(): string
49-
{
50-
return $this->engine->generate();
51-
}
52-
};
28+
foreach ($engines as $engine) {
29+
$native_engine = clone $engine;
30+
$user_engine = new WrapperEngine(clone $engine);
5331

54-
for ($i = 0; $i < 1000; $i++) {
55-
if ($native_engine->generate() !== $user_engine->generate()) {
56-
die('failure Xoshiro256StarStar');
32+
for ($i = 0; $i < 10_000; $i++) {
33+
if ($native_engine->generate() !== $user_engine->generate()) {
34+
$className = $engine::class;
35+
die("failure: {$className} at {$i}");
36+
}
5737
}
5838
}
5939

6040
die('success');
41+
6142
?>
6243
--EXPECT--
6344
success

0 commit comments

Comments
 (0)