Skip to content

Commit f7d426c

Browse files
authored
Unify structure for ext/random's randomizer tests (php#9410)
* Unify structure for ext/random's engine tests (2) This makes adjustments that were missed in 2d6a883. * Add `engines.inc` for ext/random tests * Unify structure for ext/random's randomizer tests
1 parent 94ee4f9 commit f7d426c

38 files changed

+965
-623
lines changed

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ $engines[] = new PcgOneseq128XslRr64(1234);
1313
$engines[] = new Xoshiro256StarStar(1234);
1414

1515
foreach ($engines as $engine) {
16+
echo $engine::class, PHP_EOL;
17+
1618
for ($i = 0; $i < 10_000; $i++) {
1719
$engine->generate();
1820
}
@@ -21,9 +23,7 @@ foreach ($engines as $engine) {
2123

2224
for ($i = 0; $i < 10_000; $i++) {
2325
if ($engine->generate() !== $engine2->generate()) {
24-
$className = $engine::class;
25-
26-
die("failure: {$className} at {$i}");
26+
die("failure: state differs at {$i}");
2727
}
2828
}
2929
}
@@ -32,4 +32,7 @@ die('success');
3232

3333
?>
3434
--EXPECT--
35+
Random\Engine\Mt19937
36+
Random\Engine\PcgOneseq128XslRr64
37+
Random\Engine\Xoshiro256StarStar
3538
success

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

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,11 @@ Random: Engine: Serialization of user engines must preserve the sequence
44
<?php
55

66
use Random\Engine;
7+
use Random\Engine\Test\TestShaEngine;
78

8-
final class User64 implements Engine
9-
{
10-
private int $count = 0;
11-
12-
public function generate(): string
13-
{
14-
return pack('P*', ++$this->count);
15-
}
16-
}
9+
require __DIR__ . "/../engines.inc";
1710

18-
final class User32 implements Engine
11+
final class CountingEngine32 implements Engine
1912
{
2013
private int $count = 0;
2114

@@ -26,12 +19,12 @@ final class User32 implements Engine
2619
}
2720

2821
$engines = [];
29-
if (PHP_INT_SIZE >= 8) {
30-
$engines[] = new User64();
31-
}
32-
$engines[] = new User32();
22+
$engines[] = new CountingEngine32();
23+
$engines[] = new TestShaEngine();
3324

3425
foreach ($engines as $engine) {
26+
echo $engine::class, PHP_EOL;
27+
3528
for ($i = 0; $i < 10_000; $i++) {
3629
$engine->generate();
3730
}
@@ -40,9 +33,7 @@ foreach ($engines as $engine) {
4033

4134
for ($i = 0; $i < 10_000; $i++) {
4235
if ($engine->generate() !== $engine2->generate()) {
43-
$className = $engine::class;
44-
45-
die("failure: {$className} at {$i}");
36+
die("failure: state differs at {$i}");
4637
}
4738
}
4839
}
@@ -51,4 +42,6 @@ die('success');
5142

5243
?>
5344
--EXPECT--
45+
CountingEngine32
46+
Random\Engine\Test\TestShaEngine
5447
success

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ try {
1616

1717
for ($i = 0; $i < 10_000; $i++) {
1818
if ($engine->generate() !== $referenceEngine->generate()) {
19-
die('failure: state changed');
19+
die("failure: state differs at {$i}");
2020
}
2121
}
2222

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

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,33 +6,25 @@ Random: Engine: Native engines can be wrapped without changing their sequence
66
use Random\Engine;
77
use Random\Engine\Mt19937;
88
use Random\Engine\PcgOneseq128XslRr64;
9+
use Random\Engine\Test\TestWrapperEngine;
910
use Random\Engine\Xoshiro256StarStar;
1011

11-
class WrapperEngine implements Engine
12-
{
13-
public function __construct(private readonly Engine $engine)
14-
{
15-
}
16-
17-
public function generate(): string
18-
{
19-
return $this->engine->generate();
20-
}
21-
}
12+
require __DIR__ . "/../engines.inc";
2213

2314
$engines = [];
2415
$engines[] = new Mt19937(1234);
2516
$engines[] = new PcgOneseq128XslRr64(1234);
2617
$engines[] = new Xoshiro256StarStar(1234);
2718

2819
foreach ($engines as $engine) {
20+
echo $engine::class, PHP_EOL;
21+
2922
$native_engine = clone $engine;
30-
$user_engine = new WrapperEngine(clone $engine);
23+
$user_engine = new TestWrapperEngine(clone $engine);
3124

3225
for ($i = 0; $i < 10_000; $i++) {
3326
if ($native_engine->generate() !== $user_engine->generate()) {
34-
$className = $engine::class;
35-
die("failure: {$className} at {$i}");
27+
die("failure: state differs at {$i}");
3628
}
3729
}
3830
}
@@ -41,4 +33,7 @@ die('success');
4133

4234
?>
4335
--EXPECT--
36+
Random\Engine\Mt19937
37+
Random\Engine\PcgOneseq128XslRr64
38+
Random\Engine\Xoshiro256StarStar
4439
success

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,33 +6,33 @@ Random: Engine: Xoshiro256StarStar: The seed parameter must work as expected
66
use Random\Engine\Xoshiro256StarStar;
77

88
echo "Random integer seed", PHP_EOL;
9-
$engine = new Xoshiro256StarStar(\random_int(\PHP_INT_MIN, \PHP_INT_MAX));
9+
$engine = new Xoshiro256StarStar(random_int(PHP_INT_MIN, PHP_INT_MAX));
1010
echo PHP_EOL, PHP_EOL;
1111

1212
echo "Random string seed", PHP_EOL;
13-
$engine = new Xoshiro256StarStar(\random_bytes(32));
13+
$engine = new Xoshiro256StarStar(random_bytes(32));
1414
echo PHP_EOL, PHP_EOL;
1515

1616
echo "Invalid data type", PHP_EOL;
1717
try {
1818
$engine = new Xoshiro256StarStar(1.0);
19-
} catch (\Throwable $e) {
19+
} catch (Throwable $e) {
2020
echo $e->getMessage(), PHP_EOL;
2121
}
2222
echo PHP_EOL, PHP_EOL;
2323

2424
echo "Invalid string seed length", PHP_EOL;
2525
try {
2626
$engine = new Xoshiro256StarStar('foobar');
27-
} catch (\Throwable $e) {
27+
} catch (Throwable $e) {
2828
echo $e->getMessage(), PHP_EOL;
2929
}
3030
echo PHP_EOL, PHP_EOL;
3131

3232
echo "Null seed", PHP_EOL;
3333
try {
34-
$engine = new Random\Engine\Xoshiro256StarStar(\str_repeat("\x00", 32));
35-
} catch (\Throwable $e) {
34+
$engine = new Xoshiro256StarStar(str_repeat("\x00", 32));
35+
} catch (Throwable $e) {
3636
echo $e->getMessage(), PHP_EOL;
3737
}
3838
echo PHP_EOL, PHP_EOL;

ext/random/tests/03_randomizer/basic.phpt

Lines changed: 0 additions & 81 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
--TEST--
2-
Random: Randomizer: pickArrayKeys
2+
Random: Randomizer: The Mt19937 engine and pickArrayKeys are consistent with array_rand()
33
--FILE--
44
<?php
55

6+
use Random\Engine\Mt19937;
7+
use Random\Randomizer;
8+
69
$map = ['foo' => 0, 'bar' => 1, 'baz' => 2];
710
$list = range(1, 10);
811

@@ -14,7 +17,7 @@ $mapPickTwoFunc = array_rand($map, 2);
1417
$listPickOneFunc = array_rand($list, 1);
1518
$listPickTwoFunc = array_rand($list, 2);
1619

17-
$randomizer = new \Random\Randomizer(new \Random\Engine\Mt19937(1234));
20+
$randomizer = new Randomizer(new Mt19937(1234));
1821

1922
[$mapPickOneMethod] = $randomizer->pickArrayKeys($map, 1);
2023
$mapPickTwoMethod = $randomizer->pickArrayKeys($map, 2);
@@ -24,25 +27,30 @@ $listPickTwoMethod = $randomizer->pickArrayKeys($list, 2);
2427

2528
if ($mapPickOneFunc !== $mapPickOneMethod) {
2629
var_dump($mapPickOneFunc, $mapPickOneMethod);
27-
die('failure mapPickOne');
30+
31+
die('failure: mapPickOne');
2832
}
2933

3034
if ($mapPickTwoFunc !== $mapPickTwoMethod) {
3135
var_dump($mapPickTwoFunc, $mapPickTwoMethod);
32-
die('failure mapPickTwo');
36+
37+
die('failure: mapPickTwo');
3338
}
3439

3540
if ($listPickOneFunc !== $listPickOneMethod) {
3641
var_dump($listPickOneFunc, $listPickOneMethod);
37-
die('failure listPickOne');
42+
43+
die('failure: listPickOne');
3844
}
3945

4046
if ($listPickTwoFunc !== $listPickTwoMethod) {
4147
var_dump($listPickTwoFunc, $listPickOneMethod);
42-
die('failure listPickTwo');
48+
49+
die('failure: listPickTwo');
4350
}
4451

4552
die('success');
53+
4654
?>
47-
--EXPECTF--
55+
--EXPECT--
4856
success

ext/random/tests/03_randomizer/compatibility_mt.phpt

Lines changed: 0 additions & 24 deletions
This file was deleted.
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
--TEST--
2+
Random: Randomizer: The Mt19937 engine is a drop-in replacement for mt_rand()
3+
--FILE--
4+
<?php
5+
6+
use Random\Randomizer;
7+
use Random\Engine\Mt19937;
8+
9+
echo "MT_RAND_PHP", PHP_EOL;
10+
11+
$randomizer = new Randomizer(new Mt19937(1234, MT_RAND_PHP));
12+
mt_srand(1234, MT_RAND_PHP);
13+
14+
for ($i = 0; $i < 10_000; $i++) {
15+
if ($randomizer->nextInt() !== mt_rand()) {
16+
die("failure: state differs at {$i} for nextInt()");
17+
}
18+
}
19+
20+
for ($i = 0; $i < 10_000; $i++) {
21+
if ($randomizer->getInt(0, $i) !== mt_rand(0, $i)) {
22+
die("failure: state differs at {$i} for getInt()");
23+
}
24+
}
25+
26+
echo "MT_RAND_MT19937", PHP_EOL;
27+
28+
$randomizer = new Randomizer(new Mt19937(1234, MT_RAND_MT19937));
29+
mt_srand(1234, MT_RAND_MT19937);
30+
31+
for ($i = 0; $i < 10_000; $i++) {
32+
if ($randomizer->nextInt() !== mt_rand()) {
33+
die("failure: state differs at {$i} for nextInt()");
34+
}
35+
}
36+
37+
for ($i = 0; $i < 10_000; $i++) {
38+
if ($randomizer->getInt(0, $i) !== mt_rand(0, $i)) {
39+
die("failure: state differs at {$i} for getInt()");
40+
}
41+
}
42+
43+
die('success');
44+
45+
?>
46+
--EXPECT--
47+
MT_RAND_PHP
48+
MT_RAND_MT19937
49+
success

0 commit comments

Comments
 (0)