Skip to content

Commit 95561c7

Browse files
committed
Unify structure for ext/random's randomizer tests
1 parent 00b1089 commit 95561c7

28 files changed

+767
-529
lines changed

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

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,10 @@ 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+
include __DIR__ . "/../engines.inc";
2213

2314
$engines = [];
2415
$engines[] = new Mt19937(1234);
@@ -29,7 +20,7 @@ foreach ($engines as $engine) {
2920
echo $engine::class, PHP_EOL;
3021

3122
$native_engine = clone $engine;
32-
$user_engine = new WrapperEngine(clone $engine);
23+
$user_engine = new TestWrapperEngine(clone $engine);
3324

3425
for ($i = 0; $i < 10_000; $i++) {
3526
if ($native_engine->generate() !== $user_engine->generate()) {

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

Lines changed: 0 additions & 81 deletions
This file was deleted.
Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,43 @@
11
--TEST--
2-
Random: Randomizer: Compatibility: Mt19937
2+
Random: Randomizer: The Mt19937 engine is a drop-in replacement for mt_rand()
33
--FILE--
44
<?php
55

6-
$randomizer = new \Random\Randomizer(new \Random\Engine\Mt19937(1234, \MT_RAND_PHP));
7-
\mt_srand(1234, \MT_RAND_PHP);
8-
for ($i = 0; $i < 1000; $i++) {
9-
if ($randomizer->nextInt() !== \mt_rand()) {
10-
die('failure');
6+
use Random\Randomizer;
7+
use Random\Engine\Mt19937;
8+
9+
$randomizer = new Randomizer(new Mt19937(1234, MT_RAND_PHP));
10+
mt_srand(1234, MT_RAND_PHP);
11+
12+
for ($i = 0; $i < 10_000; $i++) {
13+
if ($randomizer->nextInt() !== mt_rand()) {
14+
die("failure: nextInt for MT_RAND_PHP");
15+
}
16+
}
17+
18+
for ($i = 0; $i < 10_000; $i++) {
19+
if ($randomizer->getInt(0, $i) !== mt_rand(0, $i)) {
20+
die("failure: getInt for MT_RAND_PHP at {$i}");
1121
}
1222
}
1323

14-
$randomizer = new \Random\Randomizer(new \Random\Engine\Mt19937(1234, \MT_RAND_MT19937));
15-
\mt_srand(1234, \MT_RAND_MT19937);
16-
for ($i = 0; $i < 1000; $i++) {
17-
if ($randomizer->nextInt() !== \mt_rand()) {
18-
die('failure');
24+
$randomizer = new Randomizer(new Mt19937(1234, MT_RAND_MT19937));
25+
mt_srand(1234, MT_RAND_MT19937);
26+
27+
for ($i = 0; $i < 10_000; $i++) {
28+
if ($randomizer->nextInt() !== mt_rand()) {
29+
die("failure: nextInt for MT_RAND_MT19937");
30+
}
31+
}
32+
33+
for ($i = 0; $i < 10_000; $i++) {
34+
if ($randomizer->getInt(0, $i) !== mt_rand(0, $i)) {
35+
die("failure: getInt for MT_RAND_MT19937 at {$i}");
1936
}
2037
}
2138

2239
die('success');
40+
41+
?>
2342
--EXPECT--
2443
success
Lines changed: 22 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,80 +1,40 @@
11
--TEST--
2-
Random: Randomizer: Compatibility: user
2+
Random: Randomizer: Native engines can be wrapped without changing their sequence
33
--FILE--
44
<?php
55

6-
$native_randomizer = new \Random\Randomizer(new \Random\Engine\Mt19937(1234));
7-
$user_randomizer = new \Random\Randomizer(new class () implements \Random\Engine {
8-
public function __construct(private $engine = new \Random\Engine\Mt19937(1234))
9-
{
10-
}
6+
use Random\Engine;
7+
use Random\Engine\Mt19937;
8+
use Random\Engine\PcgOneseq128XslRr64;
9+
use Random\Engine\Test\TestWrapperEngine;
10+
use Random\Engine\Xoshiro256StarStar;
11+
use Random\Randomizer;
1112

12-
public function generate(): string
13-
{
14-
return $this->engine->generate();
15-
}
16-
});
17-
for ($i = 0; $i < 1000; $i++) {
18-
$native = $native_randomizer->nextInt();
19-
$user = $user_randomizer->nextInt();
20-
if ($native !== $user) {
21-
die("failure Mt19937 i: {$i} native: {$native} user: {$user}");
22-
}
23-
}
13+
include __DIR__ . "/../engines.inc";
2414

25-
try {
26-
$native_randomizer = new \Random\Randomizer(new \Random\Engine\PcgOneseq128XslRr64(1234));
27-
$user_randomizer = new \Random\Randomizer(new class () implements \Random\Engine {
28-
public function __construct(private $engine = new \Random\Engine\PcgOneseq128XslRr64(1234))
29-
{
30-
}
15+
$engines = [];
16+
$engines[] = new Mt19937(1234);
17+
$engines[] = new PcgOneseq128XslRr64(1234);
18+
$engines[] = new Xoshiro256StarStar(1234);
3119

32-
public function generate(): string
33-
{
34-
return $this->engine->generate();
35-
}
36-
});
37-
38-
for ($i = 0; $i < 1000; $i++) {
39-
$native = $native_randomizer->nextInt();
40-
$user = $user_randomizer->nextInt();
41-
if ($native !== $user) {
42-
die("failure PcgOneseq128XslRr64 i: {$i} native: {$native} user: {$user}");
43-
}
44-
}
45-
} catch (\Random\RandomException $e) {
46-
if ($e->getMessage() !== 'Generated value exceeds size of int') {
47-
throw $e;
48-
}
49-
}
20+
foreach ($engines as $engine) {
21+
$native_randomizer = new Randomizer(clone $engine);
22+
$user_randomizer = new Randomizer(new TestWrapperEngine(clone $engine));
5023

51-
try {
52-
$native_randomizer = new \Random\Randomizer(new \Random\Engine\Xoshiro256StarStar(1234));
53-
$user_randomizer = new \Random\Randomizer(new class () implements \Random\Engine {
54-
public function __construct(private $engine = new \Random\Engine\Xoshiro256StarStar(1234))
55-
{
56-
}
24+
for ($i = 0; $i < 10_000; $i++) {
25+
$native = $native_randomizer->getInt(0, $i);
26+
$user = $user_randomizer->getInt(0, $i);
5727

58-
public function generate(): string
59-
{
60-
return $this->engine->generate();
61-
}
62-
});
63-
64-
for ($i = 0; $i < 1000; $i++) {
65-
$native = $native_randomizer->nextInt();
66-
$user = $user_randomizer->nextInt();
6728
if ($native !== $user) {
68-
die("failure Xoshiro256StarStar i: {$i} native: {$native} user: {$user}");
29+
$className = $engine::class;
30+
31+
die("failure: {$className} at {$i} - native: {$native} user: {$user}");
6932
}
7033
}
71-
} catch (\Random\RandomException $e) {
72-
if ($e->getMessage() !== 'Generated value exceeds size of int') {
73-
throw $e;
74-
}
7534
}
7635

7736
die('success');
37+
7838
?>
7939
--EXPECT--
8040
success

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

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,47 @@
11
--TEST--
2-
Random: Randomizer: Disallow manually calling __construct
2+
Random: Randomizer: Calling __construct() fails due to readonly $engine property
33
--FILE--
44
<?php
55

6-
final class UserEngine implements \Random\Engine
7-
{
8-
public function generate(): string
9-
{
10-
return \random_byte(4); /* 32-bit */
11-
}
12-
}
6+
use Random\Engine;
7+
use Random\Engine\PcgOneseq128XslRr64;
8+
use Random\Engine\Test\TestShaEngine;
9+
use Random\Engine\Xoshiro256StarStar;
10+
use Random\Randomizer;
11+
12+
include __DIR__ . "/../engines.inc";
1313

1414
try {
15-
(new \Random\Randomizer())->__construct();
16-
} catch (\Error $e) {
17-
echo $e->getMessage() . PHP_EOL;
15+
(new Randomizer())->__construct();
16+
} catch (Error $e) {
17+
echo $e->getMessage(), PHP_EOL;
1818
}
1919

2020
try {
21-
$r = new \Random\Randomizer(new \Random\Engine\Xoshiro256StarStar());
22-
$r->__construct(new \Random\Engine\PcgOneseq128XslRr64());
23-
} catch (\Error $e) {
24-
echo $e->getMessage() . PHP_EOL;
21+
$randomizer = new Randomizer(new Xoshiro256StarStar());
22+
$randomizer->__construct(new PcgOneseq128XslRr64());
23+
} catch (Error $e) {
24+
echo $e->getMessage(), PHP_EOL;
2525
}
2626

2727
try {
28-
$r = new \Random\Randomizer(new \UserEngine());
29-
$r->__construct(new \UserEngine());
30-
} catch (\Error $e) {
31-
echo $e->getMessage() . PHP_EOL;
28+
$randomizer = new Randomizer(new TestShaEngine("1234"));
29+
$randomizer->__construct(new TestShaEngine("1234"));
30+
} catch (Error $e) {
31+
echo $e->getMessage(), PHP_EOL;
3232
}
3333

3434
try {
35-
$r = new \Random\Randomizer(new \Random\Engine\Xoshiro256StarStar());
36-
$r->__construct(new \UserEngine());
37-
} catch (\Error $e) {
35+
$randomizer = new Randomizer(new Xoshiro256StarStar());
36+
$randomizer->__construct(new TestShaEngine("1234"));
37+
} catch (Error $e) {
3838
echo $e->getMessage(), PHP_EOL;
3939
}
4040

41-
var_dump($r->engine::class);
41+
var_dump($randomizer->engine::class);
4242

4343
die('success');
44+
4445
?>
4546
--EXPECT--
4647
Cannot modify readonly property Random\Randomizer::$engine

0 commit comments

Comments
 (0)